#ifndef WINE_DSHOW_BASEFILT_H #define WINE_DSHOW_BASEFILT_H /* * The following interfaces must be used as a part of aggregation. * The punkControl must not be NULL since all IUnknown methods are * implemented only for aggregation. */ /* * implements IBaseFilter (internal) * * a base class for implementing IBaseFilter. */ #include "complist.h" #include "mtype.h" typedef struct CBaseFilterHandlers CBaseFilterHandlers; typedef struct CBasePinHandlers CBasePinHandlers; typedef struct CBaseFilterImpl { /* IPersist - IMediaFilter - IBaseFilter */ ICOM_VFIELD(IBaseFilter); /* IUnknown fields */ IUnknown* punkControl; /* IBaseFilter fields */ const CBaseFilterHandlers* pHandlers; CRITICAL_SECTION csFilter; const CLSID* pclsidFilter; QUARTZ_CompList* pInPins; /* a list of IPin-s. */ QUARTZ_CompList* pOutPins; /* a list of IPin-s. */ IFilterGraph* pfg; DWORD cbNameGraph; WCHAR* pwszNameGraph; IReferenceClock* pClock; REFERENCE_TIME rtStart; FILTER_STATE fstate; } CBaseFilterImpl; struct CBaseFilterHandlers { HRESULT (*pOnActive)( CBaseFilterImpl* pImpl ); HRESULT (*pOnInactive)( CBaseFilterImpl* pImpl ); HRESULT (*pOnStop)( CBaseFilterImpl* pImpl ); }; HRESULT CBaseFilterImpl_InitIBaseFilter( CBaseFilterImpl* This, IUnknown* punkControl, const CLSID* pclsidFilter, LPCWSTR lpwszNameGraph, const CBaseFilterHandlers* pHandlers ); void CBaseFilterImpl_UninitIBaseFilter( CBaseFilterImpl* This ); HRESULT CBaseFilterImpl_MediaEventNotify( CBaseFilterImpl* This, long lEvent,LONG_PTR lParam1,LONG_PTR lParam2); /* * Implements IPin, IMemInputPin, and IQualityControl. (internal) * * a base class for implementing IPin. */ typedef struct OutputPinAsyncImpl OutputPinAsyncImpl; typedef struct CPinBaseImpl { /* IPin */ ICOM_VFIELD(IPin); /* IUnknown fields */ IUnknown* punkControl; /* IPin fields */ const CBasePinHandlers* pHandlers; DWORD cbIdLen; WCHAR* pwszId; BOOL bOutput; /* you can change AcceptTypes while pcsPin has been hold */ const AM_MEDIA_TYPE* pmtAcceptTypes; ULONG cAcceptTypes; CRITICAL_SECTION* pcsPin; CBaseFilterImpl* pFilter; IPin* pPinConnectedTo; IMemInputPin* pMemInputPinConnectedTo; AM_MEDIA_TYPE* pmtConn; OutputPinAsyncImpl* pAsyncOut; /* for asynchronous output */ } CPinBaseImpl; typedef struct CMemInputPinBaseImpl { /* IMemInputPin */ ICOM_VFIELD(IMemInputPin); /* IUnknown fields */ IUnknown* punkControl; /* IMemInputPin fields */ CPinBaseImpl* pPin; IMemAllocator* pAllocator; BOOL bReadonly; } CMemInputPinBaseImpl; typedef struct CQualityControlPassThruImpl { /* IQualityControl */ ICOM_VFIELD(IQualityControl); /* IUnknown fields */ IUnknown* punkControl; /* IQualityControl fields */ CPinBaseImpl* pPin; IQualityControl* pControl; } CQualityControlPassThruImpl; struct CBasePinHandlers { HRESULT (*pOnPreConnect)( CPinBaseImpl* pImpl, IPin* pPin ); HRESULT (*pOnPostConnect)( CPinBaseImpl* pImpl, IPin* pPin ); HRESULT (*pOnDisconnect)( CPinBaseImpl* pImpl ); HRESULT (*pCheckMediaType)( CPinBaseImpl* pImpl, const AM_MEDIA_TYPE* pmt ); HRESULT (*pQualityNotify)( CPinBaseImpl* pImpl, IBaseFilter* pFilter, Quality q ); HRESULT (*pReceive)( CPinBaseImpl* pImpl, IMediaSample* pSample ); HRESULT (*pReceiveCanBlock)( CPinBaseImpl* pImpl ); HRESULT (*pEndOfStream)( CPinBaseImpl* pImpl ); HRESULT (*pBeginFlush)( CPinBaseImpl* pImpl ); HRESULT (*pEndFlush)( CPinBaseImpl* pImpl ); HRESULT (*pNewSegment)( CPinBaseImpl* pImpl, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, double rate ); }; HRESULT CPinBaseImpl_InitIPin( CPinBaseImpl* This, IUnknown* punkControl, CRITICAL_SECTION* pcsPin, CBaseFilterImpl* pFilter, LPCWSTR pwszId, BOOL bOutput, const CBasePinHandlers* pHandlers ); void CPinBaseImpl_UninitIPin( CPinBaseImpl* This ); HRESULT CMemInputPinBaseImpl_InitIMemInputPin( CMemInputPinBaseImpl* This, IUnknown* punkControl, CPinBaseImpl* pPin ); void CMemInputPinBaseImpl_UninitIMemInputPin( CMemInputPinBaseImpl* This ); HRESULT CQualityControlPassThruImpl_InitIQualityControl( CQualityControlPassThruImpl* This, IUnknown* punkControl, CPinBaseImpl* pPin ); void CQualityControlPassThruImpl_UninitIQualityControl( CQualityControlPassThruImpl* This ); HRESULT CPinBaseImpl_SendSample( CPinBaseImpl* This, IMediaSample* pSample ); HRESULT CPinBaseImpl_SendReceiveCanBlock( CPinBaseImpl* This ); HRESULT CPinBaseImpl_SendEndOfStream( CPinBaseImpl* This ); HRESULT CPinBaseImpl_SendBeginFlush( CPinBaseImpl* This ); HRESULT CPinBaseImpl_SendEndFlush( CPinBaseImpl* This ); HRESULT CPinBaseImpl_SendNewSegment( CPinBaseImpl* This, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, double rate ); /*************************************************************************** * * handlers for output pins. * */ HRESULT OutputPinSync_Receive( CPinBaseImpl* pImpl, IMediaSample* pSample ); HRESULT OutputPinSync_ReceiveCanBlock( CPinBaseImpl* pImpl ); HRESULT OutputPinSync_EndOfStream( CPinBaseImpl* pImpl ); HRESULT OutputPinSync_BeginFlush( CPinBaseImpl* pImpl ); HRESULT OutputPinSync_EndFlush( CPinBaseImpl* pImpl ); HRESULT OutputPinSync_NewSegment( CPinBaseImpl* pImpl, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, double rate ); /*************************************************************************** * * handlers for output pins (async). * */ HRESULT OutputPinAsync_OnActive( CPinBaseImpl* pImpl ); HRESULT OutputPinAsync_OnInactive( CPinBaseImpl* pImpl ); HRESULT OutputPinAsync_Receive( CPinBaseImpl* pImpl, IMediaSample* pSample ); HRESULT OutputPinAsync_ReceiveCanBlock( CPinBaseImpl* pImpl ); HRESULT OutputPinAsync_EndOfStream( CPinBaseImpl* pImpl ); HRESULT OutputPinAsync_BeginFlush( CPinBaseImpl* pImpl ); HRESULT OutputPinAsync_EndFlush( CPinBaseImpl* pImpl ); HRESULT OutputPinAsync_NewSegment( CPinBaseImpl* pImpl, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, double rate ); #endif /* WINE_DSHOW_BASEFILT_H */