📄 inputpin.c
字号:
#include "inputpin.h"#include "../wine/winerror.h"#include <string.h>#include <stdio.h>#include <stdlib.h>static inline int unimplemented(const char* s, void* p){ Debug printf("%s(%p) called (UNIMPLEMENTED)", s, p); return E_NOTIMPL;}/*********** * EnumPins ***********/typedef struct{ IEnumPins_vt* vt; DECLARE_IUNKNOWN(); IPin* pin1; IPin* pin2; int counter; GUID interfaces[2];} CEnumPins;static long STDCALL CEnumPins_Next(IEnumPins* This, /* [in] */ unsigned long cMediaTypes, /* [size_is][out] */ IPin** ppMediaTypes, /* [out] */ unsigned long* pcFetched){ CEnumPins* pin = (CEnumPins*)This; Debug printf("CEnumPins_Next(%p) called\n", This); if (!ppMediaTypes) return E_INVALIDARG; if (!pcFetched && (cMediaTypes!=1)) return E_INVALIDARG; if (cMediaTypes<=0) return 0; //lcounter = ((CEnumPins*)This)->counter; //lpin1 = ((CEnumPins*)This)->pin1; //lpin2 = ((CEnumPins*)This)->pin2; if (((pin->counter == 2) && pin->pin2) || ((pin->counter == 1) && !pin->pin2)) { if (pcFetched) *pcFetched=0; return 1; } if (pcFetched) *pcFetched=1; if (pin->counter==0) { *ppMediaTypes = pin->pin1; pin->pin1->vt->AddRef((IUnknown*)pin->pin1); } else { *ppMediaTypes = pin->pin2; pin->pin2->vt->AddRef((IUnknown*)pin->pin2); } pin->counter++; if (cMediaTypes == 1) return 0; return 1;}static long STDCALL CEnumPins_Skip(IEnumPins* This, /* [in] */ unsigned long cMediaTypes){ Debug unimplemented("CEnumPins_Skip", This); return E_NOTIMPL;}static long STDCALL CEnumPins_Reset(IEnumPins* This){ Debug printf("CEnumPins_Reset(%p) called\n", This); ((CEnumPins*)This)->counter = 0; return 0;}static long STDCALL CEnumPins_Clone(IEnumPins* This, /* [out] */ IEnumPins** ppEnum){ Debug unimplemented("CEnumPins_Clone", This); return E_NOTIMPL;}static void CEnumPins_Destroy(CEnumPins* This){ free(This->vt); free(This);}IMPLEMENT_IUNKNOWN(CEnumPins)static CEnumPins* CEnumPinsCreate(IPin* p, IPin* pp){ CEnumPins* This = (CEnumPins*) malloc(sizeof(CEnumPins)); if (!This) return NULL; This->refcount = 1; This->pin1 = p; This->pin2 = pp; This->counter = 0; This->vt = (IEnumPins_vt*) malloc(sizeof(IEnumPins_vt)); if (!This->vt) { free(This); return NULL; } This->vt->QueryInterface = CEnumPins_QueryInterface; This->vt->AddRef = CEnumPins_AddRef; This->vt->Release = CEnumPins_Release; This->vt->Next = CEnumPins_Next; This->vt->Skip = CEnumPins_Skip; This->vt->Reset = CEnumPins_Reset; This->vt->Clone = CEnumPins_Clone; This->interfaces[0] = IID_IUnknown; This->interfaces[1] = IID_IEnumPins; return This;}/*********** * InputPin ***********/static long STDCALL CInputPin_Connect(IPin* This, /* [in] */ IPin* pReceivePin, /* [in] */ AM_MEDIA_TYPE* pmt){ Debug unimplemented("CInputPin_Connect", This); return E_NOTIMPL;}static long STDCALL CInputPin_ReceiveConnection(IPin* This, /* [in] */ IPin* pConnector, /* [in] */ const AM_MEDIA_TYPE *pmt){ Debug unimplemented("CInputPin_ReceiveConnection", This); return E_NOTIMPL;}static long STDCALL CInputPin_Disconnect(IPin* This){ Debug unimplemented("CInputPin_Disconnect", This); return E_NOTIMPL;}static long STDCALL CInputPin_ConnectedTo(IPin* This, /* [out] */ IPin** pPin){ Debug unimplemented("CInputPin_ConnectedTo", This); return E_NOTIMPL;}static long STDCALL CInputPin_ConnectionMediaType(IPin* This, /* [out] */ AM_MEDIA_TYPE *pmt){ Debug printf("CInputPin_ConnectionMediaType(%p) called\n", This); if (!pmt) return E_INVALIDARG; *pmt=((CInputPin*)This)->type; if (pmt->cbFormat > 0) { pmt->pbFormat=(char *)CoTaskMemAlloc(pmt->cbFormat); memcpy(pmt->pbFormat, ((CInputPin*)This)->type.pbFormat, pmt->cbFormat); } return 0;}static long STDCALL CInputPin_QueryPinInfo(IPin* This, /* [out] */ PIN_INFO *pInfo){ CBaseFilter* lparent=((CInputPin*)This)->parent; Debug printf("CInputPin_QueryPinInfo(%p) called\n", This); pInfo->dir = PINDIR_OUTPUT; pInfo->pFilter = (IBaseFilter*) lparent; lparent->vt->AddRef((IUnknown*)lparent); pInfo->achName[0] = 0; return 0;}static long STDCALL CInputPin_QueryDirection(IPin* This, /* [out] */ PIN_DIRECTION *pPinDir){ *pPinDir = PINDIR_OUTPUT; Debug printf("CInputPin_QueryDirection(%p) called\n", This); return 0;}static long STDCALL CInputPin_QueryId(IPin* This, /* [out] */ unsigned short* *Id){ Debug unimplemented("CInputPin_QueryId", This); return E_NOTIMPL;}static long STDCALL CInputPin_QueryAccept(IPin* This, /* [in] */ const AM_MEDIA_TYPE* pmt){ Debug unimplemented("CInputPin_QueryAccept", This); return E_NOTIMPL;}static long STDCALL CInputPin_EnumMediaTypes(IPin* This, /* [out] */ IEnumMediaTypes** ppEnum){ Debug unimplemented("CInputPin_EnumMediaTypes", This); return E_NOTIMPL;}static long STDCALL CInputPin_QueryInternalConnections(IPin* This, /* [out] */ IPin** apPin, /* [out][in] */ unsigned long *nPin){ Debug unimplemented("CInputPin_QueryInternalConnections", This); return E_NOTIMPL;}static long STDCALL CInputPin_EndOfStream(IPin * This){ Debug unimplemented("CInputPin_EndOfStream", This); return E_NOTIMPL;}static long STDCALL CInputPin_BeginFlush(IPin * This){ Debug unimplemented("CInputPin_BeginFlush", This); return E_NOTIMPL;}static long STDCALL CInputPin_EndFlush(IPin* This){ Debug unimplemented("CInputPin_EndFlush", This); return E_NOTIMPL;}static long STDCALL CInputPin_NewSegment(IPin* This, /* [in] */ REFERENCE_TIME tStart, /* [in] */ REFERENCE_TIME tStop, /* [in] */ double dRate){ Debug unimplemented("CInputPin_NewSegment", This); return E_NOTIMPL;}static void CInputPin_Destroy(CInputPin* This){ free(This->vt); free(This);}IMPLEMENT_IUNKNOWN(CInputPin)CInputPin* CInputPinCreate(CBaseFilter* p, const AM_MEDIA_TYPE* amt){ CInputPin* This = (CInputPin*) malloc(sizeof(CInputPin)); if (!This) return NULL; This->refcount = 1; This->parent = p; This->type = *amt; This->vt= (IPin_vt*) malloc(sizeof(IPin_vt)); if (!This->vt) { free(This); return NULL; } This->vt->QueryInterface = CInputPin_QueryInterface; This->vt->AddRef = CInputPin_AddRef; This->vt->Release = CInputPin_Release; This->vt->Connect = CInputPin_Connect; This->vt->ReceiveConnection = CInputPin_ReceiveConnection; This->vt->Disconnect = CInputPin_Disconnect; This->vt->ConnectedTo = CInputPin_ConnectedTo; This->vt->ConnectionMediaType = CInputPin_ConnectionMediaType; This->vt->QueryPinInfo = CInputPin_QueryPinInfo; This->vt->QueryDirection = CInputPin_QueryDirection; This->vt->QueryId = CInputPin_QueryId; This->vt->QueryAccept = CInputPin_QueryAccept; This->vt->EnumMediaTypes = CInputPin_EnumMediaTypes; This->vt->QueryInternalConnections = CInputPin_QueryInternalConnections; This->vt->EndOfStream = CInputPin_EndOfStream; This->vt->BeginFlush = CInputPin_BeginFlush; This->vt->EndFlush = CInputPin_EndFlush; This->vt->NewSegment = CInputPin_NewSegment; This->interfaces[0]=IID_IUnknown; return This;}/************* * BaseFilter *************/static long STDCALL CBaseFilter_GetClassID(IBaseFilter * This, /* [out] */ CLSID *pClassID){ Debug unimplemented("CBaseFilter_GetClassID", This); return E_NOTIMPL;}static long STDCALL CBaseFilter_Stop(IBaseFilter* This){ Debug unimplemented("CBaseFilter_Stop", This); return E_NOTIMPL;}static long STDCALL CBaseFilter_Pause(IBaseFilter* This){ Debug unimplemented("CBaseFilter_Pause", This); return E_NOTIMPL;}static long STDCALL CBaseFilter_Run(IBaseFilter* This, REFERENCE_TIME tStart){ Debug unimplemented("CBaseFilter_Run", This); return E_NOTIMPL;}static long STDCALL CBaseFilter_GetState(IBaseFilter* This, /* [in] */ unsigned long dwMilliSecsTimeout, // /* [out] */ FILTER_STATE *State) void* State){ Debug unimplemented("CBaseFilter_GetState", This); return E_NOTIMPL;}static long STDCALL CBaseFilter_SetSyncSource(IBaseFilter* This, /* [in] */ IReferenceClock *pClock){ Debug unimplemented("CBaseFilter_SetSyncSource", This); return E_NOTIMPL;}static long STDCALL CBaseFilter_GetSyncSource(IBaseFilter* This, /* [out] */ IReferenceClock **pClock){ Debug unimplemented("CBaseFilter_GetSyncSource", This); return E_NOTIMPL;}static long STDCALL CBaseFilter_EnumPins(IBaseFilter* This, /* [out] */ IEnumPins **ppEnum){ Debug printf("CBaseFilter_EnumPins(%p) called\n", This); *ppEnum = (IEnumPins*) CEnumPinsCreate(((CBaseFilter*)This)->pin, ((CBaseFilter*)This)->unused_pin); return 0;}static long STDCALL CBaseFilter_FindPin(IBaseFilter* This, /* [string][in] */ const unsigned short* Id, /* [out] */ IPin **ppPin){ Debug unimplemented("CBaseFilter_FindPin\n", This); return E_NOTIMPL;}static long STDCALL CBaseFilter_QueryFilterInfo(IBaseFilter* This, // /* [out] */ FILTER_INFO *pInfo) void* pInfo){ Debug unimplemented("CBaseFilter_QueryFilterInfo", This); return E_NOTIMPL;}static long STDCALL CBaseFilter_JoinFilterGraph(IBaseFilter* This, /* [in] */ IFilterGraph* pGraph, /* [string][in] */ const unsigned short* pName)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -