⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 outputpin.c

📁 linux下的MPEG1
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "../wine/winerror.h"#include "../wine/windef.h"#include "outputpin.h"#include <stdio.h>#include <string.h>#include <stdlib.h>/*    An object beyond interface IEnumMediaTypes.    Returned by COutputPin through call IPin::EnumMediaTypes().*/static inline int output_unimplemented(const char* s, void* p){    Debug printf("%s(%p) called (UNIMPLEMENTED)", s, p);    return E_NOTIMPL;}typedef struct CEnumMediaTypes{    IEnumMediaTypes_vt* vt;    DECLARE_IUNKNOWN();    AM_MEDIA_TYPE type;    GUID interfaces[2];} CEnumMediaTypes;struct _COutputMemPin{    IMemInputPin_vt* vt;    DECLARE_IUNKNOWN();    char** frame_pointer;    long* frame_size_pointer;    MemAllocator* pAllocator;    COutputPin* parent;};static HRESULT STDCALL CEnumMediaTypes_Next(IEnumMediaTypes * This,					    /* [in] */ ULONG cMediaTypes,					    /* [size_is][out] */ AM_MEDIA_TYPE **ppMediaTypes,					    /* [out] */ ULONG *pcFetched){    AM_MEDIA_TYPE* type = &((CEnumMediaTypes*)This)->type;    Debug printf("CEnumMediaTypes::Next(%p) called\n", This);    if (!ppMediaTypes)	return E_INVALIDARG;    if (!pcFetched && (cMediaTypes!=1))	return E_INVALIDARG;    if (cMediaTypes <= 0)	return 0;    if (pcFetched)	*pcFetched=1;    ppMediaTypes[0] = (AM_MEDIA_TYPE *)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));    // copy structures - C can handle this...    **ppMediaTypes = *type;    if (ppMediaTypes[0]->pbFormat)    {	ppMediaTypes[0]->pbFormat=(char *)CoTaskMemAlloc(ppMediaTypes[0]->cbFormat);	memcpy(ppMediaTypes[0]->pbFormat, type->pbFormat, ppMediaTypes[0]->cbFormat);    }    if (cMediaTypes == 1)	return 0;    return 1;}/* I expect that these methods are unused. */static HRESULT STDCALL CEnumMediaTypes_Skip(IEnumMediaTypes * This,					    /* [in] */ ULONG cMediaTypes){    return output_unimplemented("CEnumMediaTypes::Skip", This);}static HRESULT STDCALL CEnumMediaTypes_Reset(IEnumMediaTypes * This){    Debug printf("CEnumMediaTypes::Reset(%p) called\n", This);    return 0;}static HRESULT STDCALL CEnumMediaTypes_Clone(IEnumMediaTypes * This,				      /* [out] */ IEnumMediaTypes **ppEnum){    Debug printf("CEnumMediaTypes::Clone(%p) called\n", This);    return E_NOTIMPL;}static void CEnumMediaTypes_Destroy(CEnumMediaTypes* This){    free(This->vt);    free(This);}// IPin->IUnknown methodsIMPLEMENT_IUNKNOWN(CEnumMediaTypes)static CEnumMediaTypes* CEnumMediaTypesCreate(const AM_MEDIA_TYPE* amt){    CEnumMediaTypes *This = (CEnumMediaTypes*) malloc(sizeof(CEnumMediaTypes)) ;    if (!This)        return NULL;    This->vt = (IEnumMediaTypes_vt*) malloc(sizeof(IEnumMediaTypes_vt));    if (!This->vt)    {	free(This);	return NULL;    }    This->refcount = 1;    This->type = *amt;    This->vt->QueryInterface = CEnumMediaTypes_QueryInterface;    This->vt->AddRef = CEnumMediaTypes_AddRef;    This->vt->Release = CEnumMediaTypes_Release;    This->vt->Next = CEnumMediaTypes_Next;    This->vt->Skip = CEnumMediaTypes_Skip;    This->vt->Reset = CEnumMediaTypes_Reset;    This->vt->Clone = CEnumMediaTypes_Clone;    This->interfaces[0] = IID_IUnknown;    This->interfaces[1] = IID_IEnumMediaTypes;    return This;}/************* * COutputPin *************/static HRESULT STDCALL COutputPin_QueryInterface(IUnknown* This, const GUID* iid, void** ppv){    COutputPin* p = (COutputPin*) This;    Debug printf("COutputPin_QueryInterface(%p) called\n", This);    if (!ppv)	return E_INVALIDARG;    if (memcmp(iid, &IID_IUnknown, 16) == 0)    {	*ppv = p;	p->vt->AddRef(This);        return 0;    }    if (memcmp(iid, &IID_IMemInputPin, 16) == 0)    {	*ppv = p->mempin;	p->mempin->vt->AddRef((IUnknown*)*ppv);	return 0;    }    Debug printf("Unknown interface : %08x-%04x-%04x-%02x%02x-"		 "%02x%02x%02x%02x%02x%02x\n",		 iid->f1,  iid->f2,  iid->f3,		 (unsigned char)iid->f4[1], (unsigned char)iid->f4[0],		 (unsigned char)iid->f4[2], (unsigned char)iid->f4[3],		 (unsigned char)iid->f4[4], (unsigned char)iid->f4[5],		 (unsigned char)iid->f4[6], (unsigned char)iid->f4[7]);    return E_NOINTERFACE;}// IPin methodsstatic HRESULT STDCALL COutputPin_Connect(IPin * This,				    /* [in] */ IPin *pReceivePin,				    /* [in] */ /* const */ AM_MEDIA_TYPE *pmt){    Debug printf("COutputPin_Connect() called\n");/*    *pmt=((COutputPin*)This)->type;    if(pmt->cbFormat>0)    {	pmt->pbFormat=CoTaskMemAlloc(pmt->cbFormat);	memcpy(pmt->pbFormat, ((COutputPin*)This)->type.pbFormat, pmt->cbFormat);    }*/    //return E_NOTIMPL;    return 0;// XXXXXXXXXXXXX CHECKME XXXXXXXXXXXXXXX    // if I put return 0; here, it crashes}static HRESULT STDCALL COutputPin_ReceiveConnection(IPin * This,						    /* [in] */ IPin *pConnector,						    /* [in] */ const AM_MEDIA_TYPE *pmt){    Debug printf("COutputPin_ReceiveConnection(%p) called\n", This);    ((COutputPin*)This)->remote = pConnector;    return 0;}static HRESULT STDCALL COutputPin_Disconnect(IPin * This){    Debug printf("COutputPin_Disconnect(%p) called\n", This);    return 1;}static HRESULT STDCALL COutputPin_ConnectedTo(IPin * This,					/* [out] */ IPin **pPin){    Debug printf("COutputPin_ConnectedTo(%p) called\n", This);    if (!pPin)	return E_INVALIDARG;    *pPin = ((COutputPin*)This)->remote;    return 0;}static HRESULT STDCALL COutputPin_ConnectionMediaType(IPin * This,						      /* [out] */ AM_MEDIA_TYPE *pmt){    Debug printf("CInputPin::ConnectionMediaType() called\n");    if (!pmt)	return E_INVALIDARG;    *pmt = ((COutputPin*)This)->type;    if (pmt->cbFormat>0)    {	pmt->pbFormat=(char *)CoTaskMemAlloc(pmt->cbFormat);	memcpy(pmt->pbFormat, ((COutputPin*)This)->type.pbFormat, pmt->cbFormat);    }    return 0;}static HRESULT STDCALL COutputPin_QueryPinInfo(IPin * This,					       /* [out] */ PIN_INFO *pInfo){    return output_unimplemented("COutputPin_QueryPinInfo", This);}static HRESULT STDCALL COutputPin_QueryDirection(IPin * This,					   /* [out] */ PIN_DIRECTION *pPinDir){    Debug printf("COutputPin_QueryDirection(%p) called\n", This);    if (!pPinDir)	return E_INVALIDARG;    *pPinDir = PINDIR_INPUT;    return 0;}static HRESULT STDCALL COutputPin_QueryId(IPin * This,					  /* [out] */ LPWSTR *Id){    return output_unimplemented("COutputPin_QueryId", This);}static HRESULT STDCALL COutputPin_QueryAccept(IPin * This,					      /* [in] */ const AM_MEDIA_TYPE *pmt){    return output_unimplemented("COutputPin_QueryAccept", This);}static HRESULT STDCALL COutputPin_EnumMediaTypes(IPin * This,					   /* [out] */ IEnumMediaTypes **ppEnum){    Debug printf("COutputPin_EnumMediaTypes() called\n");    if (!ppEnum)	return E_INVALIDARG;    *ppEnum = (IEnumMediaTypes*) CEnumMediaTypesCreate(&((COutputPin*)This)->type);    return 0;}static HRESULT STDCALL COutputPin_QueryInternalConnections(IPin * This,						     /* [out] */ IPin **apPin,						     /* [out][in] */ ULONG *nPin){    return output_unimplemented("COutputPin_QueryInternalConnections", This);}static HRESULT STDCALL COutputPin_EndOfStream(IPin * This){    return output_unimplemented("COutputPin_EndOfStream", This);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -