diff loader/dshow/inputpin.c @ 168:bdc4a8fc04d8

Initial revision
author arpi_esp
date Tue, 20 Mar 2001 00:05:27 +0000
parents
children da26060c81ef
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/loader/dshow/inputpin.c	Tue Mar 20 00:05:27 2001 +0000
@@ -0,0 +1,667 @@
+#include "inputpin.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#define E_NOTIMPL 0x80004001
+GUID CInputPin::interfaces[]=
+{
+ IID_IUnknown,
+};
+IMPLEMENT_IUNKNOWN(CInputPin) 
+
+GUID CRemotePin::interfaces[]=
+{ 
+ IID_IUnknown,
+};
+IMPLEMENT_IUNKNOWN(CRemotePin)
+ 
+GUID CRemotePin2::interfaces[]=
+{
+ IID_IUnknown,
+}; 
+IMPLEMENT_IUNKNOWN(CRemotePin2)
+ 
+GUID CBaseFilter::interfaces[]=
+{
+ IID_IUnknown,
+ IID_IBaseFilter,
+};
+IMPLEMENT_IUNKNOWN(CBaseFilter)
+
+GUID CBaseFilter2::interfaces[]=
+{
+ IID_IUnknown,
+ IID_IBaseFilter,
+ {0x76c61a30, 0xebe1, 0x11cf, {0x89, 0xf9, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xcb}}, 
+ {0xaae7e4e2, 0x6388, 0x11d1, {0x8d, 0x93, 0x00, 0x60, 0x97, 0xc9, 0xa2, 0xb2}}, 
+ {0x02ef04dd, 0x7580, 0x11d1, {0xbe, 0xce, 0x00, 0xc0, 0x4f, 0xb6, 0xe9, 0x37}}, 
+};
+IMPLEMENT_IUNKNOWN(CBaseFilter2)
+
+class CEnumPins: public IEnumPins
+{
+    IPin* pin1;
+    IPin* pin2;
+    int counter;
+    static GUID interfaces[];
+    DECLARE_IUNKNOWN(CEnumPins)
+public:
+    CEnumPins(IPin*, IPin* =0);
+    ~CEnumPins(){delete vt;}
+    static long STDCALL Next ( 
+        IEnumPins * This,
+        /* [in] */ unsigned long cMediaTypes,
+        /* [size_is][out] */ IPin **ppMediaTypes,
+        /* [out] */ unsigned long *pcFetched);
+    
+    static long STDCALL Skip ( 
+        IEnumPins * This,
+        /* [in] */ unsigned long cMediaTypes);
+    
+    static long STDCALL Reset ( 
+        IEnumPins * This);
+    
+    static long STDCALL Clone ( 
+        IEnumPins * This,
+        /* [out] */ IEnumPins **ppEnum);
+
+};
+GUID CEnumPins::interfaces[]=
+{
+    IID_IUnknown,
+    IID_IEnumPins,
+};
+IMPLEMENT_IUNKNOWN(CEnumPins)
+
+CEnumPins::CEnumPins(IPin* p, IPin* pp): pin1(p), pin2(pp), counter(0), refcount(1)
+{
+    vt=new IEnumPins_vt;
+    vt->QueryInterface = QueryInterface;
+    vt->AddRef = AddRef;
+    vt->Release = Release;
+    vt->Next = Next; 
+    vt->Skip = Skip; 
+    vt->Reset = Reset;
+    vt->Clone = Clone; 
+}
+
+long STDCALL CEnumPins::Next ( 
+    IEnumPins * This,
+    /* [in] */ unsigned long cMediaTypes,
+    /* [size_is][out] */ IPin **ppMediaTypes,
+    /* [out] */ unsigned long *pcFetched)
+{
+    IPin* pin1=((CEnumPins*)This)->pin1;
+    IPin* pin2=((CEnumPins*)This)->pin2;
+    Debug printf("CEnumPins::Next() called\n");
+    if(!ppMediaTypes)return 0x80004003;
+    if(!pcFetched && (cMediaTypes!=1))return 0x80004003;
+    if(cMediaTypes<=0)return 0;
+    int& counter=((CEnumPins*)This)->counter;
+    if(((counter==2) && pin2) || ((counter==1) && !pin2))
+    {
+	if(pcFetched)*pcFetched=0;
+	return 1;
+    }
+    
+    if(pcFetched)*pcFetched=1;
+    if(counter==0)
+    {
+	*ppMediaTypes=pin1;
+	pin1->vt->AddRef((IUnknown*)pin1);
+    }
+    else
+    {
+	*ppMediaTypes=pin2;
+	pin2->vt->AddRef((IUnknown*)pin2);
+    }
+    counter++;
+    if(cMediaTypes==1)return 0;
+    return 1;
+}
+
+long STDCALL CEnumPins::Skip ( 
+    IEnumPins * This,
+    /* [in] */ unsigned long cMediaTypes)
+{
+    Debug printf("CEnumPins::Skip() called\n");
+    return E_NOTIMPL;
+}
+
+long STDCALL CEnumPins::Reset ( 
+    IEnumPins * This)
+{
+    Debug printf("CEnumPins::Reset() called\n");
+    ((CEnumPins*)This)->counter=0;
+    return 0;
+}
+
+long STDCALL CEnumPins::Clone ( 
+    IEnumPins * This,
+    /* [out] */ IEnumPins **ppEnum)
+{
+    Debug printf("CEnumPins::Clone() called\n");
+    return E_NOTIMPL;
+}
+ 
+CInputPin::CInputPin(CBaseFilter* p, const AM_MEDIA_TYPE& vh)
+     : refcount(1), type(vh), parent(p)
+{
+    vt=new IPin_vt;
+    vt->QueryInterface = QueryInterface;
+    vt->AddRef = AddRef;
+    vt->Release = Release;
+    vt->Connect = Connect;
+    vt->ReceiveConnection = ReceiveConnection;
+    vt->Disconnect=Disconnect;
+    vt->ConnectedTo = ConnectedTo;
+    vt->ConnectionMediaType = ConnectionMediaType;
+    vt->QueryPinInfo = QueryPinInfo;
+    vt->QueryDirection = QueryDirection;
+    vt->QueryId = QueryId;
+    vt->QueryAccept = QueryAccept;
+    vt->EnumMediaTypes = EnumMediaTypes;
+    vt->QueryInternalConnections = QueryInternalConnections;
+    vt->EndOfStream = EndOfStream;
+    vt->BeginFlush = BeginFlush;
+    vt->EndFlush = EndFlush;
+    vt->NewSegment = NewSegment;
+}
+
+long STDCALL CInputPin::Connect ( 
+    IPin * This,
+    /* [in] */ IPin *pReceivePin,
+    /* [in] */ AM_MEDIA_TYPE *pmt)
+{
+    Debug printf("CInputPin::Connect() called\n");
+    return E_NOTIMPL;
+}
+
+long STDCALL CInputPin::ReceiveConnection ( 
+    IPin * This,
+    /* [in] */ IPin *pConnector,
+    /* [in] */ const AM_MEDIA_TYPE *pmt)
+{
+    Debug printf("CInputPin::ReceiveConnection() called\n");
+    return E_NOTIMPL;
+}
+	    
+long STDCALL CInputPin::Disconnect ( 
+    IPin * This)
+{
+    Debug printf("CInputPin::Disconnect() called\n");
+    return E_NOTIMPL;
+}
+
+
+long STDCALL CInputPin::ConnectedTo ( 
+    IPin * This,
+    /* [out] */ IPin **pPin)
+{
+    Debug printf("CInputPin::ConnectedTo() called\n");
+    return E_NOTIMPL;
+}
+
+
+long STDCALL CInputPin::ConnectionMediaType ( 
+    IPin * This,
+    /* [out] */ AM_MEDIA_TYPE *pmt)
+{
+    Debug printf("CInputPin::ConnectionMediaType() called\n");
+    if(!pmt)return 0x80004003;
+    *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;
+}
+
+long STDCALL CInputPin::QueryPinInfo ( 
+    IPin * This,
+    /* [out] */ PIN_INFO *pInfo)
+{
+    Debug printf("CInputPin::QueryPinInfo() called\n");
+    pInfo->dir=PINDIR_OUTPUT;
+    CBaseFilter* parent=((CInputPin*)This)->parent;
+    pInfo->pFilter=parent;
+    parent->vt->AddRef((IUnknown*)parent);
+    pInfo->achName[0]=0;
+    return 0;
+}
+
+
+long STDCALL CInputPin::QueryDirection ( 
+    IPin * This,
+    /* [out] */ PIN_DIRECTION *pPinDir)
+{
+    *pPinDir=PINDIR_OUTPUT;
+    Debug printf("CInputPin::QueryDirection() called\n");
+    return 0;
+}
+
+
+long STDCALL CInputPin::QueryId ( 
+    IPin * This,
+    /* [out] */ unsigned short* *Id)
+{
+    Debug printf("CInputPin::QueryId() called\n");
+    return E_NOTIMPL;
+}
+
+
+long STDCALL CInputPin::QueryAccept ( 
+    IPin * This,
+    /* [in] */ const AM_MEDIA_TYPE *pmt)
+{
+    Debug printf("CInputPin::QueryAccept() called\n");
+    return E_NOTIMPL;
+}
+
+
+long STDCALL CInputPin::EnumMediaTypes ( 
+    IPin * This,
+    /* [out] */ IEnumMediaTypes **ppEnum)
+{
+    Debug printf("CInputPin::EnumMediaTypes() called\n");
+    return E_NOTIMPL;
+}
+
+
+long STDCALL CInputPin::QueryInternalConnections ( 
+    IPin * This,
+    /* [out] */ IPin **apPin,
+    /* [out][in] */ unsigned long *nPin)
+{
+    Debug printf("CInputPin::QueryInternalConnections() called\n");
+    return E_NOTIMPL;
+}
+
+long STDCALL CInputPin::EndOfStream ( 
+    IPin * This)
+{
+    Debug printf("CInputPin::EndOfStream() called\n");
+    return E_NOTIMPL;
+}
+    
+    
+long STDCALL CInputPin::BeginFlush ( 
+IPin * This)
+{
+    Debug printf("CInputPin::BeginFlush() called\n");
+    return E_NOTIMPL;
+}
+
+
+long STDCALL CInputPin::EndFlush ( 
+    IPin * This)
+{
+    Debug printf("CInputPin::EndFlush() called\n");
+    return E_NOTIMPL;
+}
+
+long STDCALL CInputPin::NewSegment ( 
+    IPin * This,
+    /* [in] */ REFERENCE_TIME tStart,
+    /* [in] */ REFERENCE_TIME tStop,
+    /* [in] */ double dRate)
+{
+    Debug printf("CInputPin::NewSegment() called\n");
+    return E_NOTIMPL;
+}
+
+
+
+
+
+
+CBaseFilter::CBaseFilter(const AM_MEDIA_TYPE& type, CBaseFilter2* parent)
+    : refcount(1)
+{
+    pin=new CInputPin(this, type);
+    unused_pin=new CRemotePin(this, parent->GetPin());
+    vt=new IBaseFilter_vt;
+    vt->QueryInterface = QueryInterface;
+    vt->AddRef = AddRef;
+    vt->Release = Release;
+    vt->GetClassID = GetClassID;
+    vt->Stop = Stop;
+    vt->Pause = Pause;
+    vt->Run = Run;
+    vt->GetState = GetState; 
+    vt->SetSyncSource = SetSyncSource;
+    vt->GetSyncSource = GetSyncSource;
+    vt->EnumPins = EnumPins;
+    vt->FindPin = FindPin;
+    vt->QueryFilterInfo = QueryFilterInfo;
+    vt->JoinFilterGraph = JoinFilterGraph;
+    vt->QueryVendorInfo = QueryVendorInfo;
+}
+
+long STDCALL CBaseFilter::GetClassID ( 
+        IBaseFilter * This,
+        /* [out] */ CLSID *pClassID)
+{
+    Debug printf("CBaseFilter::GetClassID() called\n");
+    return E_NOTIMPL;
+}    
+
+long STDCALL CBaseFilter::Stop ( 
+        IBaseFilter * This)
+{
+    Debug printf("CBaseFilter::Stop() called\n");
+    return E_NOTIMPL;
+}    
+
+    
+long STDCALL CBaseFilter::Pause ( 
+        IBaseFilter * This)
+{
+    Debug printf("CBaseFilter::Pause() called\n");
+    return E_NOTIMPL;
+}    
+    
+long STDCALL CBaseFilter::Run ( 
+        IBaseFilter * This,
+        REFERENCE_TIME tStart)
+{
+    Debug printf("CBaseFilter::Run() called\n");
+    return E_NOTIMPL;
+}    
+
+    
+long STDCALL CBaseFilter::GetState ( 
+        IBaseFilter * This,
+        /* [in] */ unsigned long dwMilliSecsTimeout,
+//        /* [out] */ FILTER_STATE *State)
+    	void* State)
+{
+    Debug printf("CBaseFilter::GetState() called\n");
+    return E_NOTIMPL;
+}    
+
+    
+long STDCALL CBaseFilter::SetSyncSource ( 
+        IBaseFilter * This,
+        /* [in] */ IReferenceClock *pClock)
+{
+    Debug printf("CBaseFilter::SetSyncSource() called\n");
+    return E_NOTIMPL;
+}    
+
+    
+long STDCALL CBaseFilter::GetSyncSource ( 
+        IBaseFilter * This,
+        /* [out] */ IReferenceClock **pClock)
+{
+    Debug printf("CBaseFilter::GetSyncSource() called\n");
+    return E_NOTIMPL;
+}    
+
+    
+long STDCALL CBaseFilter::EnumPins ( 
+        IBaseFilter * This,
+        /* [out] */ IEnumPins **ppEnum)
+{
+    Debug printf("CBaseFilter::EnumPins() called\n");
+    *ppEnum=new CEnumPins(((CBaseFilter*)This)->pin, ((CBaseFilter*)This)->unused_pin);
+    return 0;
+}    
+
+    
+long STDCALL CBaseFilter::FindPin ( 
+        IBaseFilter * This,
+        /* [string][in] */ const unsigned short* Id,
+        /* [out] */ IPin **ppPin)
+{
+    Debug printf("CBaseFilter::FindPin() called\n");
+    return E_NOTIMPL;
+}    
+
+    
+long STDCALL CBaseFilter::QueryFilterInfo ( 
+        IBaseFilter * This,
+//        /* [out] */ FILTER_INFO *pInfo)
+	void* pInfo)
+{
+    Debug printf("CBaseFilter::QueryFilterInfo() called\n");
+    return E_NOTIMPL;
+}    
+
+    
+long STDCALL CBaseFilter::JoinFilterGraph ( 
+        IBaseFilter * This,
+        /* [in] */ IFilterGraph *pGraph,
+        /* [string][in] */ const unsigned short* pName)
+{
+    Debug printf("CBaseFilter::JoinFilterGraph() called\n");
+    return E_NOTIMPL;
+}    
+
+    
+long STDCALL CBaseFilter::QueryVendorInfo ( 
+        IBaseFilter * This,
+        /* [string][out] */ unsigned short* *pVendorInfo)
+{
+    Debug printf("CBaseFilter::QueryVendorInfo() called\n");
+    return E_NOTIMPL;
+}    
+
+
+CBaseFilter2::CBaseFilter2() : refcount(1)
+{
+    pin=new CRemotePin2(this);
+    vt=new IBaseFilter_vt;
+    memset(vt, 0, sizeof (IBaseFilter_vt));
+    vt->QueryInterface = QueryInterface;
+    vt->AddRef = AddRef;
+    vt->Release = Release;
+    vt->GetClassID = GetClassID;
+    vt->Stop = Stop;
+    vt->Pause = Pause;
+    vt->Run = Run;
+    vt->GetState = GetState; 
+    vt->SetSyncSource = SetSyncSource;
+    vt->GetSyncSource = GetSyncSource;
+    vt->EnumPins = EnumPins;
+    vt->FindPin = FindPin;
+    vt->QueryFilterInfo = QueryFilterInfo;
+    vt->JoinFilterGraph = JoinFilterGraph;
+    vt->QueryVendorInfo = QueryVendorInfo;
+}
+CRemotePin2::CRemotePin2(CBaseFilter2* p):parent(p),
+    refcount(1)
+{
+    vt=new IPin_vt;
+    memset(vt, 0, sizeof (IPin_vt));
+    vt->QueryInterface = QueryInterface;
+    vt->AddRef = AddRef;
+    vt->Release = Release;
+    vt->QueryPinInfo=QueryPinInfo;
+}
+CRemotePin::CRemotePin(CBaseFilter* pt, IPin* rpin): parent(pt), remote_pin(rpin),
+    refcount(1)
+{
+    vt=new IPin_vt;
+    memset(vt, 0, sizeof (IPin_vt));
+    vt->QueryInterface = QueryInterface;
+    vt->AddRef = AddRef;
+    vt->Release = Release;
+    vt->QueryDirection = QueryDirection;
+    vt->ConnectedTo = ConnectedTo;
+    vt->ConnectionMediaType = ConnectionMediaType;
+    vt->QueryPinInfo = QueryPinInfo;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+long STDCALL CBaseFilter2::GetClassID ( 
+        IBaseFilter * This,
+        /* [out] */ CLSID *pClassID)
+{
+    Debug printf("CBaseFilter2::GetClassID() called\n");
+    return E_NOTIMPL;
+}    
+
+long STDCALL CBaseFilter2::Stop ( 
+        IBaseFilter * This)
+{
+    Debug printf("CBaseFilter2::Stop() called\n");
+    return E_NOTIMPL;
+}    
+
+    
+long STDCALL CBaseFilter2::Pause ( 
+        IBaseFilter * This)
+{
+    Debug printf("CBaseFilter2::Pause() called\n");
+    return E_NOTIMPL;
+}    
+    
+long STDCALL CBaseFilter2::Run ( 
+        IBaseFilter * This,
+        REFERENCE_TIME tStart)
+{
+    Debug printf("CBaseFilter2::Run() called\n");
+    return E_NOTIMPL;
+}    
+
+    
+long STDCALL CBaseFilter2::GetState ( 
+        IBaseFilter * This,
+        /* [in] */ unsigned long dwMilliSecsTimeout,
+//        /* [out] */ FILTER_STATE *State)
+    	void* State)
+{
+    Debug printf("CBaseFilter2::GetState() called\n");
+    return E_NOTIMPL;
+}    
+
+    
+long STDCALL CBaseFilter2::SetSyncSource ( 
+        IBaseFilter * This,
+        /* [in] */ IReferenceClock *pClock)
+{
+    Debug printf("CBaseFilter2::SetSyncSource() called\n");
+    return E_NOTIMPL;
+}    
+
+    
+long STDCALL CBaseFilter2::GetSyncSource ( 
+        IBaseFilter * This,
+        /* [out] */ IReferenceClock **pClock)
+{
+    Debug printf("CBaseFilter2::GetSyncSource() called\n");
+    return E_NOTIMPL;
+}    
+
+    
+long STDCALL CBaseFilter2::EnumPins ( 
+        IBaseFilter * This,
+        /* [out] */ IEnumPins **ppEnum)
+{
+    Debug printf("CBaseFilter2::EnumPins() called\n");
+    *ppEnum=new CEnumPins(((CBaseFilter2*)This)->pin);
+    return 0;
+}    
+
+    
+long STDCALL CBaseFilter2::FindPin ( 
+        IBaseFilter * This,
+        /* [string][in] */ const unsigned short* Id,
+        /* [out] */ IPin **ppPin)
+{
+    Debug printf("CBaseFilter2::FindPin() called\n");
+    return E_NOTIMPL;
+}    
+
+    
+long STDCALL CBaseFilter2::QueryFilterInfo ( 
+        IBaseFilter * This,
+//        /* [out] */ FILTER_INFO *pInfo)
+	void* pInfo)
+{
+    Debug printf("CBaseFilter2::QueryFilterInfo() called\n");
+    return E_NOTIMPL;
+}    
+
+    
+long STDCALL CBaseFilter2::JoinFilterGraph ( 
+        IBaseFilter * This,
+        /* [in] */ IFilterGraph *pGraph,
+        /* [string][in] */ const unsigned short* pName)
+{
+    Debug printf("CBaseFilter2::JoinFilterGraph() called\n");
+    return E_NOTIMPL;
+}    
+
+    
+long STDCALL CBaseFilter2::QueryVendorInfo ( 
+        IBaseFilter * This,
+        /* [string][out] */ unsigned short* *pVendorInfo)
+{
+    Debug printf("CBaseFilter2::QueryVendorInfo() called\n");
+    return E_NOTIMPL;
+}    
+
+long STDCALL CRemotePin::ConnectionMediaType ( 
+    IPin * This,
+    /* [out] */ AM_MEDIA_TYPE *pmt)
+{
+    Debug printf("CRemotePin::ConnectionMediaType() called\n");
+    return E_NOTIMPL;
+}
+
+long STDCALL CRemotePin::QueryPinInfo ( 
+    IPin * This,
+    /* [out] */ PIN_INFO *pInfo)
+{
+    Debug printf("CRemotePin::QueryPinInfo() called\n");
+    pInfo->dir=PINDIR_INPUT;
+    CBaseFilter* parent=((CRemotePin*)This)->parent;
+    pInfo->pFilter=parent;
+    parent->vt->AddRef((IUnknown*)parent);
+    pInfo->achName[0]=0;
+    return 0;
+}
+    long STDCALL CRemotePin2::QueryPinInfo ( 
+        IPin * This,
+        /* [out] */ PIN_INFO *pInfo)
+    {
+	Debug printf("CRemotePin2::QueryPinInfo called\n");
+	CBaseFilter2* parent=((CRemotePin2*)This)->parent;	
+	pInfo->pFilter=(IBaseFilter*)parent;
+	parent->vt->AddRef((IUnknown*)parent);
+	pInfo->dir=PINDIR_OUTPUT;
+	pInfo->achName[0]=0;
+	return 0;	
+    }
+    long STDCALL CRemotePin::ConnectedTo ( 
+        IPin * This,
+        /* [out] */ IPin **pPin)
+    {
+    	Debug printf("CRemotePin::ConnectedTo called\n");
+	if(!pPin)return 0x80004003;
+	*pPin=((CRemotePin*)This)->remote_pin;
+	(*pPin)->vt->AddRef((IUnknown*)(*pPin));
+	return 0;
+    }
+    long STDCALL CRemotePin::QueryDirection (
+        IPin * This,
+        /* [out] */ PIN_DIRECTION *pPinDir)
+    {
+	Debug printf("CRemotePin::QueryDirection called\n");
+	if(!pPinDir)return 0x80004003;
+	*pPinDir=PINDIR_INPUT;
+	return 0;
+    }