#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_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 */
