]> git.vomp.tv Git - vompclient-marten.git/commitdiff
Windows port updates
authorChris Tallon <chris@vomp.tv>
Fri, 24 Nov 2006 17:07:22 +0000 (17:07 +0000)
committerChris Tallon <chris@vomp.tv>
Fri, 24 Nov 2006 17:07:22 +0000 (17:07 +0000)
Makefile.nmake
dsallocator.cc
dsallocator.h
dssourcefilter.cc
dssourcefilter.h
dssourcepin.cc
dssourcepin.h

index fad45739fe3d3f0fa6d960e928a5922e8e879ca5..c7cd27e5dc9d4afa3a781e0845070c6e24b2d131 100644 (file)
@@ -1,12 +1,12 @@
 CXXFLAGS_DEV = -g -O0 -Wall -Woverloaded-virtual -Wshadow -Werror -DDEV -D_GNU_SOURCE $(INCLUDES)\r
-CXXFLAGS_REL = /I"$(DXSDK_DIR)\Include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "NEW_DEMUXER"  /nologo /EHsc /MD /GS   /W3  /c   /TP \r
+CXXFLAGS_REL = /I"$(DXSDK_DIR)\Include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "NEW_DEMUXER"  /nologo /EHsc /MD /GS   /W3  /c   /TP\r
 LDFLAGS =  /INCREMENTAL:NO /NOLOGO /NODEFAULTLIB  /SUBSYSTEM:WINDOWS /OPT:REF /OPT:ICF /LIBPATH:"$(DXSDK_DIR)\Lib\x86"\r
 \r
 \r
 \r
 \r
-LIBS = Msvcrt.lib Ws2_32.lib shlwapi.lib d3d9.lib d3dx9.lib Iphlpapi.lib strmbase.lib Strmiids.lib winmm.lib MSVCPRT.lib atls.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib \r
-CROSSLIBS = \r
+LIBS = Msvcrt.lib Ws2_32.lib shlwapi.lib d3d9.lib d3dx9.lib Iphlpapi.lib Strmiids.lib winmm.lib MSVCPRT.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib\r
+CROSSLIBS =\r
 \r
 !include "objects.mk"\r
 \r
@@ -19,7 +19,7 @@ OBJECTS = $(OBJECTS1) $(OBJECTSWIN)
 \r
 default: release  #dev\r
 \r
-release:: \r
+release::\r
 CXXFLAGS= $(CXXFLAGS_REL)\r
 release:: vompclient.exe\r
 \r
@@ -27,7 +27,7 @@ release:: vompclient.exe
 \r
 vompclient.exe: $(OBJECTS) vompwin.res\r
         link $(LDFLAGS) /OUT:"vompclient.exe" $(LIBS) $(OBJECTS) vompwin.res\r
-       \r
+\r
 \r
 \r
 $(OBJECTS): $*.cc\r
@@ -37,7 +37,7 @@ vompwin.res:vompwin.rc
         $(RC) /fo"vompwin.res" "vompwin.rc"\r
 \r
 clean:\r
-       del  *.o \r
+       del  *.o\r
        del vompclient.exe\r
-       del fonts\*.o \r
+       del fonts\*.o\r
 \r
index 713d280bdfd558bdaaa69de9194ed8c9c29e668f..37faf2db6d50abe0df3f82f49b173c3ba0a0dbd7 100644 (file)
@@ -22,7 +22,6 @@
 
 
 DsAllocator::DsAllocator() {
-       CAutoLock locked(&objCritSec);
        surfallocnotify=NULL;
        refcount=1;
        
@@ -31,7 +30,6 @@ DsAllocator::DsAllocator() {
 }
 
 DsAllocator::~DsAllocator() {
-       CAutoLock locked(&objCritSec);
        CleanupSurfaces();
 
 }
@@ -44,28 +42,32 @@ void DsAllocator::CleanupSurfaces() {
 }
 
 HRESULT STDMETHODCALLTYPE DsAllocator::InitializeDevice(DWORD_PTR userid,VMR9AllocationInfo* allocinf,DWORD*numbuf){
-       CAutoLock locked(&objCritSec);
        if (!surfallocnotify) return S_FALSE;
+       Lock();
        CleanupSurfaces();
 
        surfaces.resize(*numbuf);
-       return surfallocnotify->AllocateSurfaceHelper(allocinf,numbuf,&surfaces.at(0));
+       HRESULT hres= surfallocnotify->AllocateSurfaceHelper(allocinf,numbuf,&surfaces.at(0));
+       Unlock();
+       return hres;
 }
 
 void DsAllocator::LostDevice() {
-       CAutoLock locked(&objCritSec);
        if (!surfallocnotify) return ;
+       Lock();
        CleanupSurfaces();
        IDirect3DDevice9 *d3ddev;
        d3ddev=((OsdWin*)Osd::getInstance())->getD3dDev();
        HMONITOR hmon=((OsdWin*)Osd::getInstance())->getD3d()->GetAdapterMonitor(D3DADAPTER_DEFAULT);
        surfallocnotify->ChangeD3DDevice(d3ddev,hmon);
+       Unlock();
 
 }
 
 HRESULT STDMETHODCALLTYPE DsAllocator::TerminateDevice(DWORD_PTR userid){
-       CAutoLock locked(&objCritSec);
+       Lock();
        CleanupSurfaces();
+       Unlock();
        return S_OK; //Do nothing
 }
 HRESULT STDMETHODCALLTYPE DsAllocator::GetSurface(DWORD_PTR userid,DWORD surfindex,DWORD surfflags, IDirect3DSurface9** surf)
@@ -73,19 +75,22 @@ HRESULT STDMETHODCALLTYPE DsAllocator::GetSurface(DWORD_PTR userid,DWORD surfind
        if (surfindex>=surfaces.size()) return E_FAIL;
        if (surf==NULL) return E_POINTER;
 
-       CAutoLock locked(&objCritSec);
+       Lock();
        surfaces[surfindex]->AddRef();
        *surf=surfaces[surfindex];
+       Unlock();
        return S_OK;
 }
 HRESULT STDMETHODCALLTYPE DsAllocator::AdviseNotify(IVMRSurfaceAllocatorNotify9* allnoty){
-       CAutoLock locked(&objCritSec);
+       Lock();
        surfallocnotify=allnoty;
        IDirect3DDevice9 *d3ddev;
        //OK lets set the direct3d object from the osd
        d3ddev=((OsdWin*)Osd::getInstance())->getD3dDev();
        HMONITOR hmon=((OsdWin*)Osd::getInstance())->getD3d()->GetAdapterMonitor(D3DADAPTER_DEFAULT);
-       return surfallocnotify->SetD3DDevice(d3ddev,hmon);
+       HRESULT hres=surfallocnotify->SetD3DDevice(d3ddev,hmon);
+       Unlock();
+       return hres;
 }
 
 
index 52b08cbdf2e04a9602e3e0a071d73aa6a35ddacd..05ed4da771efa50ab04b5e24b6d30ba72fa3d8fd 100644 (file)
 #include <vector>
 using namespace std;
 #include <winsock2.h>
-#include <streams.h>
+
 #include <d3d9.h>
+#include <dshow.h> 
 #include <vmr9.h>
+#include "mutex.h"
 
 
 
 
-class DsAllocator: public IVMRSurfaceAllocator9, IVMRImagePresenter9 {
+class DsAllocator: public IVMRSurfaceAllocator9, IVMRImagePresenter9,Mutex {
 public:
        DsAllocator();
        virtual ~DsAllocator();
@@ -55,7 +57,7 @@ public:
 protected:
        
        vector<IDirect3DSurface9* > surfaces;
-       CCritSec objCritSec;
+       //CCritSec objCritSec;
        IVMRSurfaceAllocatorNotify9* surfallocnotify;
        void CleanupSurfaces();
        LONG refcount;
index c779dfdb663aa4e9b1bda457246daf5a24b21c3f..8689b8c844d381ff97805d87dabc2754885c489c 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright 2004-2005 Chris Tallon
+    Copyright 2004-2006 Marten Richter
 
     This file is part of VOMP.
 
 */
 #include "dssourcefilter.h"
 
-DsSourceFilter::DsSourceFilter():CBaseFilter("Vomp Source Filter",NULL,&crit_sec,_uuidof(this))
+#define AUDIOPIN_NAME L"Audio"
+#define VIDEOPIN_NAME L"Video"
+
+class DsSFEnumPins: public IEnumPins {
+public:
+       DsSFEnumPins(DsSourcePin* audio,DsSourcePin* video,DsSourceFilter *filt,ULONG pos=0);
+       virtual ~DsSFEnumPins();
+       virtual HRESULT STDMETHODCALLTYPE Next(ULONG numpin,IPin **pins,ULONG *fetched);\r
+       virtual HRESULT STDMETHODCALLTYPE Skip(ULONG numpin);\r
+       virtual HRESULT STDMETHODCALLTYPE Reset();\r
+       virtual HRESULT STDMETHODCALLTYPE Clone(IEnumPins **enuma);\r
+       virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID id,void ** object);
+       virtual ULONG STDMETHODCALLTYPE AddRef();\r
+    virtual ULONG STDMETHODCALLTYPE Release();\r
+protected:\r
+       DsSourcePin* audiopin;\r
+       DsSourcePin* videopin;\r
+       DsSourceFilter *filter;\r
+       ULONG curpos;
+       volatile long refs;\r
+};\r
+\r
+DsSFEnumPins::DsSFEnumPins(DsSourcePin* audio,DsSourcePin* video,DsSourceFilter *filt,ULONG pos){\r
+       audiopin=audio;\r
+       videopin=video;\r
+       curpos=pos;\r
+       filter=filt;\r
+       filt->AddRef();\r
+}\r
+\r
+DsSFEnumPins::~DsSFEnumPins(){
+       filter->Release();
+}
+\r
+HRESULT STDMETHODCALLTYPE DsSFEnumPins::Next(ULONG numpin,IPin **pins,ULONG *fetched) {\r
+       int i;\r
+       if (fetched==NULL) return E_POINTER;\r
+       if (pins==NULL) return E_POINTER;\r
+       *fetched=0;\r
+\r
+       for (i=0;(i<numpin)&& (curpos<2);i++) {\r
+               switch (curpos) {\r
+               case 0: audiopin->AddRef();  pins[i]=(IPin*)audiopin;break;\r
+               case 1: videopin->AddRef(); pins[i]=(IPin*)videopin;break;\r
+               };\r
+               (*fetched)++;\r
+               curpos++;\r
+       }\r
+       if ((*fetched)!=numpin) return S_FALSE;\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE DsSFEnumPins::Skip(ULONG numpin){\r
+       curpos+=numpin;\r
+       if (curpos>2) return S_FALSE;\r
+       return S_OK;\r
+}\r
+HRESULT STDMETHODCALLTYPE DsSFEnumPins::Reset(){\r
+       curpos=0;\r
+       return S_OK;\r
+}\r
+HRESULT STDMETHODCALLTYPE DsSFEnumPins::Clone(IEnumPins **enuma){\r
+       if (enuma==NULL) return E_POINTER;\r
+       *enuma=new DsSFEnumPins(audiopin,videopin,filter,curpos);\r
+       (*enuma)->AddRef();\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE  DsSFEnumPins::QueryInterface(REFIID id,void ** object){
+       if (object==NULL) return E_POINTER;
+       if (id==IID_IUnknown ||id == IID_IEnumPins) {
+               *object=(IUnknown*)this;
+               ((IUnknown*)object)->AddRef();
+               return NOERROR;
+       } else {
+               *object=NULL;
+               return E_NOINTERFACE;
+       }
+}
+
+
+\r
+ULONG STDMETHODCALLTYPE DsSFEnumPins::AddRef(){\r
+       InterlockedIncrement(&refs);\r
+       long tempref=refs;\r
+       if (tempref>1) return tempref;\r
+       else return 1;\r
+}\r
+\r
+ULONG STDMETHODCALLTYPE DsSFEnumPins::Release(){\r
+       long tempref=InterlockedDecrement(&refs);\r
+       \r
+       if (tempref==0) {\r
+               refs++;\r
+               delete this;\r
+               return NULL;\r
+       } else {\r
+               if (tempref>1) return tempref;\r
+               else return 1;\r
+       }\r
+}\r
+\r
+\r
+\r
+
+
+
+
+DsSourceFilter::DsSourceFilter()
 {
-  //add audio pin
-  HRESULT res;
-  audiopin=new DsSourcePin(this,&crit_sec,&res,L"Vomp Audio Out",true);
-  videopin=new DsSourcePin(this,&crit_sec,&res,L"Vomp Video Out",false);
+       //add audio pin
+       HRESULT res;
+       audiopin=new DsSourcePin(this,&res,L"Vomp Audio Out",true);
+       videopin=new DsSourcePin(this,&res,L"Vomp Video Out",false);
+       filtergraph=NULL;
+       clock=NULL;
+       mystate=State_Stopped;
+       laststart=0;
+       refs=0;
+       InitializeCriticalSection(&filterlock);
 
 }
 
 DsSourceFilter::~DsSourceFilter()
 {
-  if (audiopin) delete audiopin;
-  if (videopin) delete videopin;
+       if (audiopin) delete audiopin;
+       if (videopin) delete videopin;
+       if (clock) {
+               clock->Release();
+               clock=NULL;
+       }
+       DeleteCriticalSection(&filterlock);
+       
+}
+
+HRESULT STDMETHODCALLTYPE  DsSourceFilter::GetClassID(CLSID *clsid){
+       if (clsid==NULL) return E_POINTER;
+       *clsid=_uuidof(this);
+       return S_OK;
+}
+
+HRESULT STDMETHODCALLTYPE DsSourceFilter::QueryInterface(REFIID id,void ** object){
+       if (object==NULL) return E_POINTER;
+       if (id==IID_IUnknown) {
+               *object=(IUnknown*)this;
+               ((IUnknown*)object)->AddRef();
+               return NOERROR;
+       } else if (id==IID_IBaseFilter) {
+               *object=(IBaseFilter*)this;
+               ((IBaseFilter*)object)->AddRef();
+               return NOERROR;
+       } else if (id==IID_IMediaFilter) {
+               *object=(IMediaFilter*)this;
+               ((IMediaFilter*)object)->AddRef();
+               return NOERROR;
+       }else {
+               *object=NULL;
+               return E_NOINTERFACE;
+       }
+}
+
+ULONG STDMETHODCALLTYPE DsSourceFilter::AddRef(){\r
+       InterlockedIncrement(&refs);\r
+       long tempref=refs;\r
+       if (tempref>1) return tempref;\r
+       else return 1;\r
+}\r
+ULONG STDMETHODCALLTYPE DsSourceFilter::Release(){\r
+       long tempref=InterlockedDecrement(&refs);\r
+       \r
+       if (tempref==0) {\r
+               //refs++;\r
+               delete this;\r
+               return NULL;\r
+       } else {\r
+               if (tempref>1) return tempref;\r
+               else return 1;\r
+       }\r
 }
 
+/*IBaseFilter*/
+HRESULT STDMETHODCALLTYPE DsSourceFilter::EnumPins(IEnumPins **enumar){
+       if (enumar==NULL) return E_POINTER;
+       *enumar=new DsSFEnumPins(audiopin,videopin, this);
+       (*enumar)->AddRef();
+       return S_OK;
+}
+
+HRESULT STDMETHODCALLTYPE DsSourceFilter::FindPin(LPCWSTR iden,IPin **pin){\r
+       if (pin==NULL) return E_POINTER;\r
+\r
+       if (wcscmp(AUDIOPIN_NAME,iden)==NULL) {\r
+               *pin=(IPin*)audiopin;\r
+               (*pin)->AddRef();\r
+               return S_OK;\r
+       }\r
+       if (wcscmp(VIDEOPIN_NAME,iden)==NULL) {\r
+               *pin=(IPin*)videopin;\r
+               (*pin)->AddRef();\r
+               return S_OK;\r
+       }\r
+\r
+       *pin=NULL;\r
+    return VFW_E_NOT_FOUND;\r
+}\r
+HRESULT STDMETHODCALLTYPE DsSourceFilter::QueryFilterInfo(FILTER_INFO *info){\r
+       if (info==NULL) return E_POINTER;\r
+       wcsncpy(info->achName,L"VompWinFilter", sizeof(info->achName)/sizeof(WCHAR));\r
+       info->pGraph=filtergraph;\r
+       if (info->pGraph!=NULL) info->pGraph->AddRef();\r
+       return NOERROR;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE DsSourceFilter::JoinFilterGraph(IFilterGraph *graph,LPCWSTR name){\r
+       //Should we lock\r
+       EnterCriticalSection(&filterlock);\r
+       filtergraph=graph;\r
+       filtergraph->AddRef();\r
+       //We ignore the name\r
+       LeaveCriticalSection(&filterlock);\r
+       \r
+       return S_OK;\r
+}\r
+HRESULT STDMETHODCALLTYPE DsSourceFilter::QueryVendorInfo(LPWSTR *vendinf) {\r
+       return E_NOTIMPL;\r
+}\r
+
+
+/*IMediaFilter*/
+HRESULT STDMETHODCALLTYPE DsSourceFilter::GetState(DWORD timeout,FILTER_STATE *state){\r
+       if (state==NULL) return E_POINTER;\r
+       *state=mystate;\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE DsSourceFilter::SetSyncSource(IReferenceClock *uhr){\r
+       EnterCriticalSection(&filterlock);\r
+       if (clock!=NULL) {\r
+               clock->Release();\r
+       }\r
+       if (uhr!=NULL) {\r
+               uhr->AddRef();\r
+       }\r
+       clock=uhr;\r
+       LeaveCriticalSection(&filterlock);\r
+       \r
+       return S_OK;\r
+}\r
+HRESULT STDMETHODCALLTYPE DsSourceFilter::GetSyncSource(IReferenceClock **uhr){\r
+       if (uhr==NULL) return E_POINTER;\r
+       EnterCriticalSection(&filterlock);\r
+       if (clock!=NULL) clock->AddRef();\r
+       *uhr=clock;\r
+       LeaveCriticalSection(&filterlock);\r
+       \r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE DsSourceFilter::Stop(){\r
+       EnterCriticalSection(&filterlock);\r
+       HRESULT aphres=S_OK;\r
+       HRESULT vphres=S_OK;\r
+       \r
+       if (audiopin->IsConnected()){\r
+               aphres=audiopin->Inactive();\r
+       }\r
+       if (videopin->IsConnected()){\r
+               vphres=videopin->Inactive();\r
+       }\r
+               \r
+       mystate=State_Stopped;\r
+       LeaveCriticalSection(&filterlock);\r
+       if (aphres!=S_OK) return aphres;\r
+       if (vphres!=S_OK) return vphres;\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE DsSourceFilter::Pause(){\r
+       EnterCriticalSection(&filterlock);\r
+       HRESULT aphres;\r
+       HRESULT vphres;\r
+       \r
+       if (audiopin->IsConnected()){\r
+               aphres=audiopin->Active();\r
+               if (aphres!=S_OK) {\r
+                       LeaveCriticalSection(&filterlock);\r
+                       return aphres;\r
+               }\r
+       }\r
+       if (videopin->IsConnected()){\r
+               vphres=videopin->Active();\r
+               if (vphres!=S_OK) {\r
+                       LeaveCriticalSection(&filterlock);\r
+                       return vphres;\r
+               }\r
+       }\r
+               \r
+       mystate=State_Paused;\r
+       LeaveCriticalSection(&filterlock);\r
+       \r
+\r
+       return S_OK;\r
+}\r
+HRESULT STDMETHODCALLTYPE DsSourceFilter::Run(REFERENCE_TIME start){\r
+       \r
+       HRESULT aphres;\r
+       HRESULT vphres;\r
+       EnterCriticalSection(&filterlock);\r
+\r
+       if (mystate==State_Stopped) {\r
+               HRESULT phres=Pause();\r
+               if (phres!=S_OK) return phres;\r
+       }\r
+       \r
+       laststart=start;\r
+       \r
+\r
+       if (audiopin->IsConnected()){\r
+               aphres=audiopin->Run(start);\r
+               if (aphres!=S_OK) {\r
+                       LeaveCriticalSection(&filterlock);\r
+                       return aphres;\r
+               }\r
+       }\r
+       \r
+       if (videopin->IsConnected()){\r
+               vphres=videopin->Run(start);\r
+               if (vphres!=S_OK) {\r
+                       LeaveCriticalSection(&filterlock);\r
+                       return vphres;\r
+               }\r
+       }\r
+               \r
+       mystate=State_Running;\r
+       LeaveCriticalSection(&filterlock);\r
+       \r
+\r
+       return S_OK;\r
+}\r
+
+
+
 int DsSourceFilter::GetPinCount()
 {
-  return 2; //audio and video
+       return 2; //audio and video
 }
 
-CBasePin *DsSourceFilter::GetPin(int n){
-  switch (n) {
-  case 0:
-    return audiopin;
-  case 1:
-    return videopin;
-  default:
-    return 0;
-  };
-}
+
 
 int DsSourceFilter::getCurrentAudioMediaSample(IMediaSample** ms)
 {
-  if (!audiopin || !IsActive()) {
-    return 0;
-  }
-  if (audiopin->GetDeliveryBuffer(ms,NULL,NULL,0)!=S_OK) {
-    return 0;
-  }
-  return 1;
+       if (!audiopin || !IsActive()) {
+               return 0;
+       }
+       if (audiopin->getCurrentMediaSample(ms)!=S_OK) {
+               return 0;
+       }
+       return 1;
 }
 
 int DsSourceFilter::getCurrentVideoMediaSample(IMediaSample** ms)
 {
-  if (!videopin || !IsActive()) {
-    return 0;
-  }
-  if (videopin->GetDeliveryBuffer(ms,NULL,NULL,0)!=S_OK) {
-    return 0;
-  }
-  return 1;
+       if (!videopin || !IsActive()) {
+               return 0;
+       }
+       if (videopin->getCurrentMediaSample(ms)!=S_OK) {
+               return 0;
+       }
+       return 1;
 }
 
 int DsSourceFilter::DeliverAudioMediaSample(IMediaSample* ms)
 {
-  if (!audiopin || !IsActive()) {
-    ms->Release();
-    return 0;
-  }
-  if (audiopin->Deliver(ms)!=S_OK) {
-    ms->Release();
-    return 0;
-  }
-  ms->Release();
-  return 1;
+       if (!audiopin || !IsActive()) {
+               ms->Release();
+               return 0;
+       }
+       if (audiopin->deliver(ms)!=S_OK) {
+               ms->Release();
+               return 0;
+       }
+       ms->Release();
+       return 1;
 
 }
 
 int DsSourceFilter::DeliverVideoMediaSample(IMediaSample* ms)
 {
-  if (!videopin || !IsActive()) {
-    ms->Release();
-    return 0;
-  }
-  if (videopin->Deliver(ms)!=S_OK) {
-    ms->Release();
-    return 0;
-  }
-  ms->Release();
-  return 1;
+       if (!videopin || !IsActive()) {
+               ms->Release();
+               return 0;
+       }
+       if (videopin->deliver(ms)!=S_OK) {
+               ms->Release();
+               return 0;
+       }
+       ms->Release();
+       return 1;
 
 }
+\r
index c23c9959c65abe9fded57104f54dae9fc14b0b5c..3535db04384ca0db00a0a60b53894b6ae0ef77a5 100644 (file)
 #define DSSOURCEFILTER_H
 
 
+#include "mutex.h"
 #include "dssourcepin.h"
 
+
 [uuid("EB87AB22-7A95-49c3-8CCE-2F6D61A87009")]
-class DsSourceFilter: public CBaseFilter {
+class DsSourceFilter: public IBaseFilter {
+friend class DsSourcePin; 
 public:
        DsSourceFilter();
        ~DsSourceFilter();
-       CCritSec* GetLock(){return &crit_sec;};
        virtual int GetPinCount();
-       virtual CBasePin *GetPin(int n);
        int getCurrentAudioMediaSample(IMediaSample** ms);
        int DeliverAudioMediaSample(IMediaSample* ms);
        int getCurrentVideoMediaSample(IMediaSample** ms);
        int DeliverVideoMediaSample(IMediaSample* ms);
-       REFERENCE_TIME getStartOffset(){return m_tStart;};
+       REFERENCE_TIME getStartOffset(){return laststart;};
+       BOOL IsActive() {EnterCriticalSection(&filterlock);
+       FILTER_STATE tempstate=mystate;LeaveCriticalSection(&filterlock); 
+       return (tempstate==State_Running) || (tempstate==State_Paused);};
+
+/* IUnknown */
+       virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID id,void ** object);
+       virtual ULONG STDMETHODCALLTYPE AddRef();\r
+    virtual ULONG STDMETHODCALLTYPE Release();
+/*IPersist*/
+       virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *clsid);\r
+
+/*IBaseFilter*/
+       virtual HRESULT STDMETHODCALLTYPE EnumPins(IEnumPins **enumar);
+       virtual HRESULT STDMETHODCALLTYPE FindPin(LPCWSTR iden,IPin **pin);\r
+       virtual HRESULT STDMETHODCALLTYPE QueryFilterInfo(FILTER_INFO *info);\r
+       virtual HRESULT STDMETHODCALLTYPE JoinFilterGraph(IFilterGraph *graph,LPCWSTR name);\r
+       virtual HRESULT STDMETHODCALLTYPE QueryVendorInfo(LPWSTR *vendinf);\r
+/*IMediaFilter*/
+       virtual HRESULT STDMETHODCALLTYPE GetState(DWORD timeout,FILTER_STATE *state);\r
+       virtual HRESULT STDMETHODCALLTYPE SetSyncSource(IReferenceClock *uhr);\r
+       virtual HRESULT STDMETHODCALLTYPE GetSyncSource(IReferenceClock **uhr);\r
+       virtual HRESULT STDMETHODCALLTYPE Stop();\r
+       virtual HRESULT STDMETHODCALLTYPE Pause();\r
+       virtual HRESULT STDMETHODCALLTYPE Run(REFERENCE_TIME start);\r
+\r
+       DsSourcePin *GetAudioPin() {return audiopin;};\r
+       DsSourcePin *GetVideoPin() {return videopin;};\r
+
+
 protected:
-       CCritSec crit_sec;
        DsSourcePin *audiopin;
        DsSourcePin *videopin;
+       IFilterGraph* filtergraph;
+       IReferenceClock* clock;
+       FILTER_STATE mystate;
+       REFERENCE_TIME laststart;
+       CRITICAL_SECTION filterlock;
+
+       volatile long refs;
 
 
 };
 
-#endif
+#endif\r
index fab2c86ece2b572bf1d8eb184e6fea7e2c0f421e..88319a465b8af8278d42b3be6bbebbd6fbc2d451 100644 (file)
-/*
-    Copyright 2004-2005 Chris Tallon
-
-    This file is part of VOMP.
-
-    VOMP is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    VOMP is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with VOMP; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-*/
-#include "dssourcepin.h"
-#include "dssourcefilter.h"
-#include <Dvdmedia.h>
-#include <mmreg.h>
-
-DsSourcePin::DsSourcePin(DsSourceFilter *pFilter,
-                                                CCritSec *pLock,HRESULT *phr,LPCWSTR pName,bool audio):
-CBaseOutputPin(NAME("dssourcepin"),pFilter,pLock,phr,pName)
-{
-       isaudiopin=audio;
-       m_pFilter=pFilter;
-
+/*\r
+    Copyright 2004-2005 Chris Tallon\r
+\r
+    This file is part of VOMP.\r
+\r
+    VOMP is free software; you can redistribute it and/or modify\r
+    it under the terms of the GNU General Public License as published by\r
+    the Free Software Foundation; either version 2 of the License, or\r
+    (at your option) any later version.\r
+\r
+    VOMP is distributed in the hope that it will be useful,\r
+    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+    GNU General Public License for more details.\r
+\r
+    You should have received a copy of the GNU General Public License\r
+    along with VOMP; if not, write to the Free Software\r
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+*/\r
+#include "dssourcepin.h"\r
+#include "dssourcefilter.h"\r
+#include <Dvdmedia.h>\r
+#include <mmreg.h>\r
+\r
+\r
+class DsSFEnumMediaTypes: public IEnumMediaTypes {
+public:
+       DsSFEnumMediaTypes(DsSourcePin* papa,ULONG pos=0);
+       virtual ~DsSFEnumMediaTypes();
+       virtual HRESULT STDMETHODCALLTYPE Next(ULONG nummedia,  AM_MEDIA_TYPE **pins,ULONG *fetched);\r
+       virtual HRESULT STDMETHODCALLTYPE Skip(ULONG numpin);\r
+       virtual HRESULT STDMETHODCALLTYPE Reset();\r
+       virtual HRESULT STDMETHODCALLTYPE Clone(IEnumMediaTypes **enuma);\r
+       virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID id,void ** object);
+       virtual ULONG STDMETHODCALLTYPE AddRef();\r
+    virtual ULONG STDMETHODCALLTYPE Release();\r
+protected:\r
+       DsSourcePin* parent;\r
+       ULONG curpos;
+       volatile long refs;\r
+};\r
+\r
+DsSFEnumMediaTypes::DsSFEnumMediaTypes(DsSourcePin* papa,ULONG pos){\r
+       parent=papa;\r
+       curpos=pos;\r
+       parent->AddRef();\r
+       refs=0;\r
+}\r
+\r
+DsSFEnumMediaTypes::~DsSFEnumMediaTypes(){
+       parent->Release();
+}
+\r
+HRESULT STDMETHODCALLTYPE DsSFEnumMediaTypes::Next(ULONG numpin,  AM_MEDIA_TYPE **pins,ULONG *fetched) {\r
+       int i;\r
+       if (fetched==NULL) return E_POINTER;\r
+       if (pins==NULL) return E_POINTER;\r
+       *fetched=0;\r
+\r
+       for (i=0;(i<numpin);i++) {\r
+               if (parent->GetMediaType(curpos+i,pins[i])!=S_OK) return S_FALSE;\r
+               curpos++;\r
+               (*fetched)++;\r
+       }\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE   DsSFEnumMediaTypes::Skip(ULONG numpin){\r
+       curpos+=numpin;\r
+       if (curpos>1) return S_FALSE;\r
+       return S_OK;\r
+}\r
+HRESULT STDMETHODCALLTYPE DsSFEnumMediaTypes::Reset(){\r
+       curpos=0;\r
+       return S_OK;\r
+}\r
+HRESULT STDMETHODCALLTYPE DsSFEnumMediaTypes::Clone(IEnumMediaTypes **enuma){\r
+       if (enuma==NULL) return E_POINTER;\r
+       *enuma=new DsSFEnumMediaTypes(parent,curpos);\r
+       (*enuma)->AddRef();\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE  DsSFEnumMediaTypes::QueryInterface(REFIID id,void ** object){
+       if (object==NULL) return E_POINTER;
+       if (id==IID_IUnknown ||id == IID_IEnumMediaTypes) {
+               *object=(IUnknown*)this;
+               ((IUnknown*)object)->AddRef();
+               return NOERROR;
+       } else {
+               *object=NULL;
+               return E_NOINTERFACE;
+       }
 }
 
-DsSourcePin::~DsSourcePin()
-{
-       
 
+\r
+ULONG STDMETHODCALLTYPE DsSFEnumMediaTypes::AddRef(){\r
+       InterlockedIncrement(&refs);\r
+       long tempref=refs;\r
+       if (tempref>1) return tempref;\r
+       else return 1;\r
+}\r
+\r
+ULONG STDMETHODCALLTYPE DsSFEnumMediaTypes::Release(){\r
+       long tempref=InterlockedDecrement(&refs);\r
+       \r
+       if (tempref==0) {\r
+               refs++;\r
+               delete this;\r
+               return NULL;\r
+       } else {\r
+               if (tempref>1) return tempref;\r
+               else return 1;\r
+       }\r
+}\r
+\r
+\r
+void CopyMType(AM_MEDIA_TYPE* dest,const AM_MEDIA_TYPE*source) {\r
+       memcpy(dest,source,sizeof(AM_MEDIA_TYPE));\r
+       if (source->pbFormat!=NULL) {\r
+               dest->pbFormat=(BYTE*)CoTaskMemAlloc(dest->cbFormat);\r
+               memcpy(dest->pbFormat,source->pbFormat,dest->cbFormat);\r
+       }\r
+}\r
+void ReleaseMType(AM_MEDIA_TYPE* free) {\r
+       if (free->cbFormat!=NULL) CoTaskMemFree(free->pbFormat);\r
+       free->pbFormat=NULL;\r
+}\r
+\r
+DsSourcePin::DsSourcePin(DsSourceFilter *pFilter,\r
+                                                HRESULT *phr,LPCWSTR pName,bool audio)\r
+{\r
+       isaudiopin=audio;\r
+       m_pFilter=pFilter;\r
+       connected=NULL;\r
+       connectedinput=NULL;\r
+       allocator=NULL;\r
+\r
+       \r
+\r
+}\r
+\r
+DsSourcePin::~DsSourcePin()\r
+{\r
+       \r
+\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE DsSourcePin::QueryInterface(REFIID id,void ** object){
+       if (object==NULL) return E_POINTER;
+       if (id==IID_IUnknown) {
+               *object=(IUnknown*)this;
+               ((IUnknown*)object)->AddRef();
+               return NOERROR;
+       } else if (id==IID_IPin) {
+               *object=(IPin*)this;
+               ((IPin*)object)->AddRef();
+               return NOERROR;
+       } else {
+               *object=NULL;
+               return E_NOINTERFACE;
+       }
 }
 
-HRESULT DsSourcePin::GetMediaType(int iPosition, CMediaType *pmt)\r
+ULONG STDMETHODCALLTYPE DsSourcePin::AddRef(){\r
+       return m_pFilter->AddRef();\r
+\r
+}\r
+ULONG STDMETHODCALLTYPE DsSourcePin::Release(){\r
+       return m_pFilter->Release();\r
+}\r
+\r
+\r
+/*IPin*/\r
+HRESULT STDMETHODCALLTYPE DsSourcePin::Connect(IPin *pinempf,const AM_MEDIA_TYPE *mtype) {\r
+       if (pinempf==NULL) return E_POINTER;\r
+       EnterCriticalSection(&m_pFilter->filterlock);\r
+       \r
+       if (connected!=NULL) {LeaveCriticalSection(&m_pFilter->filterlock);return VFW_E_ALREADY_CONNECTED;}\r
+       if (m_pFilter->mystate!=State_Stopped) {LeaveCriticalSection(&m_pFilter->filterlock);return VFW_E_NOT_STOPPED;}\r
+\r
+       \r
+       bool gotmt=false;\r
+\r
+       if (mtype!=NULL) {\r
+               if (CheckMediaType(mtype)==S_OK){\r
+                       if (pinempf->ReceiveConnection((IPin*)this,mtype)==S_OK) {\r
+                               CopyMType(&medtype,mtype);\r
+                               LeaveCriticalSection(&m_pFilter->filterlock);\r
+                       } else {\r
+                               LeaveCriticalSection(&m_pFilter->filterlock);\r
+                               CoTaskMemFree(mtype->pbFormat);\r
+                               return VFW_E_TYPE_NOT_ACCEPTED;\r
+                       }\r
+\r
+               } else {\r
+                       LeaveCriticalSection(&m_pFilter->filterlock);\r
+                       CoTaskMemFree(mtype->pbFormat);\r
+                       return VFW_E_TYPE_NOT_ACCEPTED;\r
+               }\r
+               CoTaskMemFree(mtype->pbFormat);\r
+       }else {\r
+               IEnumMediaTypes * emt;\r
+               EnumMediaTypes(&emt);\r
+               AM_MEDIA_TYPE emtype_np;\r
+               AM_MEDIA_TYPE  * emtype;\r
+               emtype=&emtype_np;\r
+               ULONG fetched=0;\r
+               while (emt->Next(1,&emtype,&fetched)==S_OK) {\r
+                       if (CheckMediaType(emtype)==S_OK){\r
+                               if (pinempf->ReceiveConnection((IPin*)this,emtype)==S_OK) {\r
+                                       \r
+                                       CopyMType(&medtype,emtype);\r
+                                       CoTaskMemFree(emtype->pbFormat);\r
+                                       gotmt=true;\r
+                                       break;\r
+                               }\r
+                               \r
+                       }\r
+                       CoTaskMemFree(emtype->pbFormat);\r
+               }\r
+               emt->Release();\r
+               if (gotmt==false) {\r
+                       pinempf->EnumMediaTypes(&emt);\r
+                       while (emt->Next(1,&emtype,&fetched)==S_OK) {\r
+                               if (CheckMediaType(emtype)==S_OK){\r
+                                       if (pinempf->ReceiveConnection((IPin*)this,emtype)==S_OK) {\r
+                                               connected=pinempf;\r
+                                               CopyMType(&medtype,emtype);\r
+                                               CoTaskMemFree(emtype->pbFormat);\r
+                                               gotmt=true;\r
+                                               break;\r
+                                       }\r
+                                       \r
+                               }\r
+                               CoTaskMemFree(emtype->pbFormat);\r
+                       }\r
+                       emt->Release();\r
+                       if (gotmt==false) {\r
+                               LeaveCriticalSection(&m_pFilter->filterlock);\r
+                               return VFW_E_NO_ACCEPTABLE_TYPES;\r
+                       }\r
+               }\r
+       }\r
+\r
+       if (pinempf->QueryInterface(IID_IMemInputPin,(void**)&connectedinput)!=S_OK) {\r
+               LeaveCriticalSection(&m_pFilter->filterlock);\r
+               connectedinput->Release();\r
+               connectedinput=NULL;\r
+               return VFW_E_NO_TRANSPORT;\r
+       }\r
+       ALLOCATOR_PROPERTIES eigenall;\r
+       ZeroMemory(&eigenall,sizeof(eigenall));\r
+       connectedinput->GetAllocatorRequirements(&eigenall);\r
+       if (eigenall.cbAlign==0) eigenall.cbAlign=1;\r
+       connectedinput->GetAllocator(&allocator);\r
+       if (DecideBufferSize(allocator,&eigenall)==S_OK) {\r
+               if (connectedinput->NotifyAllocator(allocator,FALSE)==S_OK){\r
+                       connected=pinempf;\r
+                       LeaveCriticalSection(&m_pFilter->filterlock);\r
+                       return S_OK;\r
+               }\r
+       } \r
+       if (allocator!=NULL) allocator->Release();\r
+       allocator=NULL;\r
+\r
+       if (CoCreateInstance(CLSID_MemoryAllocator,0,CLSCTX_INPROC_SERVER,\r
+               IID_IMemAllocator,(void **)allocator)==S_OK) {\r
+                       if (DecideBufferSize(allocator,&eigenall)==S_OK) {\r
+                               if (connectedinput->NotifyAllocator(allocator,FALSE)==S_OK){\r
+                                       connected=pinempf;\r
+                                       LeaveCriticalSection(&m_pFilter->filterlock);\r
+                               return S_OK;\r
+                       }\r
+               }\r
+       }\r
+       if (allocator!=NULL) allocator->Release();\r
+       allocator=NULL;\r
+       LeaveCriticalSection(&m_pFilter->filterlock);\r
+       return VFW_E_NO_TRANSPORT;\r
+       \r
+\r
+       \r
+\r
+}\r
+HRESULT STDMETHODCALLTYPE DsSourcePin::ReceiveConnection(IPin *connect,\r
+                                                                                                                const AM_MEDIA_TYPE *mtype){\r
+                return VFW_E_TYPE_NOT_ACCEPTED; //We have only output pins\r
+}\r
+ HRESULT STDMETHODCALLTYPE DsSourcePin::Disconnect() {\r
+        EnterCriticalSection(&m_pFilter->filterlock);\r
+        if (connected!=NULL) {\r
+                if (m_pFilter->mystate!=State_Stopped) {LeaveCriticalSection(&m_pFilter->filterlock);return VFW_E_NOT_STOPPED;}\r
+                /*TODO: Decommit allocator*/\r
+                allocator->Decommit();\r
+                allocator->Release();\r
+                allocator=NULL;\r
+                ReleaseMType(&medtype);\r
+                connectedinput->Release();\r
+                connectedinput=NULL;\r
+                connected->Release();\r
+                connected=NULL;\r
+                LeaveCriticalSection(&m_pFilter->filterlock);\r
+                return S_OK;\r
+        }\r
+        LeaveCriticalSection(&m_pFilter->filterlock);\r
+        return S_FALSE;\r
+ }\r
+\r
+ HRESULT STDMETHODCALLTYPE DsSourcePin::ConnectedTo(IPin **pin){\r
+        if (pin==NULL) return E_POINTER;\r
+        IPin* pinn=connected;\r
+        *pin=pinn;\r
+        if (connected!=NULL) {\r
+                pinn->AddRef();\r
+                return S_OK;\r
+        } else {\r
+                return VFW_E_NOT_CONNECTED;\r
+        }\r
+ }\r
+ HRESULT STDMETHODCALLTYPE  DsSourcePin::ConnectionMediaType(AM_MEDIA_TYPE *mtype){\r
+        if (mtype==NULL) return E_POINTER;\r
+        if (connected!=NULL){\r
+               CopyMType(mtype,&medtype);\r
+               return S_OK;\r
+        } else {\r
+                ZeroMemory(mtype,sizeof(mtype));\r
+                return VFW_E_NOT_CONNECTED;\r
+        }\r
+ }\r
+ HRESULT STDMETHODCALLTYPE DsSourcePin::QueryPinInfo(PIN_INFO *info){\r
+        if (info==NULL) return E_POINTER;\r
+        info->dir=PINDIR_OUTPUT;\r
+        info->pFilter=(IBaseFilter*)m_pFilter;\r
+        if (isaudiopin) wcscpy(info->achName,L"Audio");\r
+        else wcscpy(info->achName,L"Video");\r
+        return S_OK;\r
+ }\r
+\r
+ HRESULT STDMETHODCALLTYPE  DsSourcePin::QueryDirection(PIN_DIRECTION *dir){\r
+        if (dir==NULL) return E_POINTER;\r
+        *dir=PINDIR_OUTPUT;\r
+        return S_OK;\r
+ }\r
+ HRESULT STDMETHODCALLTYPE DsSourcePin::QueryId(LPWSTR *id){\r
+        if (id==NULL) return E_POINTER;\r
+        *id=(LPWSTR)CoTaskMemAlloc(12);\r
+        if (*id==NULL) return E_OUTOFMEMORY;\r
+        \r
+\r
+        if (isaudiopin) wcscpy(*id,L"Audio");\r
+         else  wcscpy(*id, L"Video");\r
+         return S_OK;\r
+ }\r
+ HRESULT STDMETHODCALLTYPE  DsSourcePin::QueryAccept(const AM_MEDIA_TYPE *mtype) {\r
+        if (mtype==NULL) return S_FALSE;\r
+        if (CheckMediaType(mtype)==S_OK) return S_OK;\r
+        else return S_FALSE;\r
+ }\r
+ HRESULT STDMETHODCALLTYPE DsSourcePin::EnumMediaTypes(IEnumMediaTypes **enuma){\r
+if (enuma==NULL) return E_POINTER;
+       *enuma=new DsSFEnumMediaTypes( this);
+       (*enuma)->AddRef();
+       return S_OK;
+}\r
+\r
+HRESULT STDMETHODCALLTYPE DsSourcePin::QueryInternalConnections(IPin **pin,ULONG *numpin){\r
+       return E_NOTIMPL;\r
+}\r
+HRESULT STDMETHODCALLTYPE DsSourcePin::EndOfStream(){\r
+       return E_UNEXPECTED; //we are a output pin!\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE DsSourcePin::NewSegment(REFERENCE_TIME start,REFERENCE_TIME stop,double rate){\r
+       return E_UNEXPECTED;//we are a output pin!\r
+}\r
+\r
+HRESULT DsSourcePin::getCurrentMediaSample(IMediaSample**ms){\r
+       if (allocator!=NULL) return allocator->GetBuffer(ms,NULL,NULL,0);\r
+       else return E_NOINTERFACE;\r
+}\r
+\r
+HRESULT DsSourcePin::deliver(IMediaSample * ms){\r
+       //EnterCriticalSection(&m_pFilter->filterlock);\r
+       HRESULT hres;\r
+       if (connectedinput!=NULL)hres= connectedinput->Receive(ms);\r
+       else hres= VFW_E_NOT_CONNECTED;\r
+       //LeaveCriticalSection(&m_pFilter->filterlock);\r
+       return hres;\r
+\r
+}\r
+\r
+HRESULT DsSourcePin::GetMediaType(int iPosition, AM_MEDIA_TYPE *pmt)\r
 {\r
        HRESULT hr;\r
-       ASSERT(pmt);\r
-       pmt->InitMediaType();\r
+       \r
        if (isaudiopin){\r
                if (iPosition==0) {\r
-                       pmt->SetType(&MEDIATYPE_Audio);\r
+                       ZeroMemory(pmt,sizeof(*pmt));\r
+                       pmt->lSampleSize = 1;\r
+                       pmt->bFixedSizeSamples = TRUE;\r
+                       pmt->majortype=MEDIATYPE_Audio;\r
                        MPEG1WAVEFORMAT wfe;\r
                        ZeroMemory(&wfe,sizeof(wfe));\r
                        wfe.wfx.cbSize=22;\r
@@ -59,10 +415,12 @@ HRESULT DsSourcePin::GetMediaType(int iPosition, CMediaType *pmt)
                        wfe.fwHeadModeExt=1;\r
                        wfe.wHeadEmphasis=1;\r
                        wfe.fwHeadFlags=ACM_MPEG_ID_MPEG1 |ACM_MPEG_ORIGINALHOME | ACM_MPEG_PROTECTIONBIT;\r
-                       pmt->SetSubtype(&MEDIASUBTYPE_MPEG2_AUDIO);\r
-                       pmt->SetFormatType(&FORMAT_WaveFormatEx);\r
-                       pmt->SetFormat((BYTE*)&wfe,sizeof(wfe));\r
-                       pmt->SetSampleSize(0);\r
+                       pmt->subtype=MEDIASUBTYPE_MPEG2_AUDIO;\r
+                       pmt->formattype=FORMAT_WaveFormatEx;\r
+                       pmt->cbFormat=sizeof(wfe);\r
+                       pmt->pbFormat=(BYTE*)CoTaskMemAlloc(sizeof(wfe));\r
+                       memcpy(pmt->pbFormat,&wfe,sizeof(wfe));\r
+                       pmt->lSampleSize=0;\r
                        hr=S_OK;\r
 \r
                \r
@@ -71,10 +429,13 @@ HRESULT DsSourcePin::GetMediaType(int iPosition, CMediaType *pmt)
                }\r
        } else {\r
                if (iPosition == 0) {\r
-                       pmt->SetType(&MEDIATYPE_Video);\r
+                       ZeroMemory(pmt,sizeof(*pmt));\r
+                       pmt->lSampleSize = 1;\r
+                       pmt->bFixedSizeSamples = TRUE;\r
+                       pmt->majortype=MEDIATYPE_Video;\r
                        hr=S_OK;\r
-                       pmt->SetSubtype(&MEDIASUBTYPE_MPEG2_VIDEO);\r
-            pmt->SetFormatType(&FORMAT_MPEG2Video);\r
+                       pmt->subtype=MEDIASUBTYPE_MPEG2_VIDEO;\r
+            pmt->formattype=FORMAT_MPEG2Video;\r
 \r
             MPEG2VIDEOINFO hdr;\r
             ZeroMemory(&hdr,sizeof(hdr));\r
@@ -83,7 +444,10 @@ HRESULT DsSourcePin::GetMediaType(int iPosition, CMediaType *pmt)
             hdr.hdr.bmiHeader.biSize = sizeof(hdr.hdr.bmiHeader);\r
             hdr.hdr.bmiHeader.biWidth = 720;\r
             hdr.hdr.bmiHeader.biHeight = 568;\r
-            pmt->SetFormat((BYTE*)&hdr,sizeof(hdr));\r
+                       pmt->cbFormat=sizeof(hdr);\r
+                       pmt->pbFormat=(BYTE*)CoTaskMemAlloc(sizeof(hdr));\r
+                       memcpy(pmt->pbFormat,&hdr,sizeof(hdr));\r
+            \r
                } else {\r
                        hr=VFW_S_NO_MORE_ITEMS;\r
                }\r
@@ -91,11 +455,26 @@ HRESULT DsSourcePin::GetMediaType(int iPosition, CMediaType *pmt)
        return hr ;\r
 }\r
 \r
+HRESULT DsSourcePin::Inactive() {\r
+       if (allocator!=NULL) return allocator->Decommit();\r
+       return VFW_E_NO_ALLOCATOR;\r
+}\r
+\r
+HRESULT DsSourcePin::Active() {\r
+       if (allocator!=NULL) return allocator->Commit();\r
+       return VFW_E_NO_ALLOCATOR;\r
+}\r
+\r
+
+HRESULT DsSourcePin::Run(REFERENCE_TIME reftime){\r
+       return NOERROR;\r
+}\r
+\r
 // No description\r
-HRESULT DsSourcePin::CheckMediaType(const CMediaType *pmt)\r
+HRESULT DsSourcePin::CheckMediaType(const AM_MEDIA_TYPE *pmt)\r
 {\r
     HRESULT res;\r
-    ASSERT (pmt);\r
+    \r
     if (isaudiopin) {\r
         bool subtype=false;\r
 #if 0 /* For future demands ac3 */\r
@@ -120,9 +499,9 @@ HRESULT DsSourcePin::CheckMediaType(const CMediaType *pmt)
 \r
 HRESULT DsSourcePin::DecideBufferSize(IMemAllocator *pa,ALLOCATOR_PROPERTIES *all_pp){\r
        HRESULT hr;\r
-    CAutoLock al(m_pFilter->GetLock());\r
-    CheckPointer(pa, E_POINTER);\r
-    CheckPointer(all_pp, E_POINTER);\r
+   \r
+    if (pa==NULL)return E_POINTER;\r
+    if (all_pp==NULL) return E_POINTER;\r
        if (isaudiopin) {\r
                if (all_pp->cBuffers*all_pp->cbBuffer < 300*64*1024)\r
                {\r
@@ -152,3 +531,4 @@ HRESULT DsSourcePin::DecideBufferSize(IMemAllocator *pa,ALLOCATOR_PROPERTIES *al
 \r
     return S_OK;\r
 }\r
+\r
index 4fe80d34e05de35a800f4188ff6fce9f063b4fa2..2871592d199566aa86be303e46d4ceed02db2a0b 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright 2004-2005 Chris Tallon
+    Copyright 2004-2006 Marten Richter
 
     This file is part of VOMP.
 
 #ifndef DSPINFILTER_H
 #define DSPINFILTER_H
 
-#include <streams.h>
+#include <winsock2.h>
+
+#include <dshow.h> 
+
+
 
 class DsSourceFilter;
 
 [uuid("17F931AB-9A87-4c65-B99E-84F5BC5F7B09")]
-class DsSourcePin: public CBaseOutputPin {
+class DsSourcePin: public IPin {
+
 public:
-  DsSourcePin(DsSourceFilter *pFilter,
-             CCritSec *pLock,HRESULT *phr,LPCWSTR pName,bool audio);
-  ~DsSourcePin();
+       DsSourcePin(DsSourceFilter *pFilter,HRESULT *phr,LPCWSTR pName,bool audio);
+       ~DsSourcePin();
+       BOOL IsConnected() {return (connected!=NULL);};
+       HRESULT getCurrentMediaSample(IMediaSample**ms);
+       HRESULT deliver(IMediaSample * ms);
+    
+       virtual  HRESULT DecideBufferSize(IMemAllocator *pa,ALLOCATOR_PROPERTIES *all_pp);
+
+       HRESULT Inactive();
+       HRESULT Active();
+       HRESULT Run(REFERENCE_TIME reftime);
+       /*IPin*/
+
+       virtual HRESULT STDMETHODCALLTYPE Connect(IPin *pinempf,const AM_MEDIA_TYPE *mtype);\r
+       virtual HRESULT STDMETHODCALLTYPE ReceiveConnection(IPin *connect,const AM_MEDIA_TYPE *mtype);\r
+       virtual HRESULT STDMETHODCALLTYPE Disconnect();\r
+       virtual HRESULT STDMETHODCALLTYPE ConnectedTo(IPin **pin);\r
+       virtual HRESULT STDMETHODCALLTYPE  ConnectionMediaType(AM_MEDIA_TYPE *mtype);\r
+       virtual HRESULT STDMETHODCALLTYPE QueryPinInfo(PIN_INFO *info);\r
+       virtual HRESULT STDMETHODCALLTYPE  QueryDirection(PIN_DIRECTION *dir);\r
+       virtual HRESULT STDMETHODCALLTYPE QueryId(LPWSTR *id);\r
+       virtual HRESULT STDMETHODCALLTYPE  QueryAccept(const AM_MEDIA_TYPE *mtype);\r
+       virtual HRESULT STDMETHODCALLTYPE EnumMediaTypes(IEnumMediaTypes **enuma);\r
+       virtual HRESULT STDMETHODCALLTYPE QueryInternalConnections(IPin **pin,ULONG *numpin);\r
+       virtual HRESULT STDMETHODCALLTYPE EndOfStream();\r
+       virtual HRESULT STDMETHODCALLTYPE NewSegment(REFERENCE_TIME start,REFERENCE_TIME stop,double rate);\r
+       /* IUnknown */
+       virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID id,void ** object);
+       virtual ULONG STDMETHODCALLTYPE AddRef();\r
+    virtual ULONG STDMETHODCALLTYPE Release();
+       virtual HRESULT STDMETHODCALLTYPE BeginFlush(){return E_UNEXPECTED;};
+       virtual HRESULT STDMETHODCALLTYPE EndFlush(){return E_UNEXPECTED;};
+       virtual HRESULT GetMediaType(int iPosition, AM_MEDIA_TYPE *pmt);
+
+
 
-  virtual  HRESULT DecideBufferSize(IMemAllocator *pa,ALLOCATOR_PROPERTIES *all_pp);
 protected:
-  virtual  HRESULT CheckMediaType(const CMediaType *pmt);
-  virtual HRESULT GetMediaType(int iPosition, CMediaType *pmt);
-  bool isaudiopin;
-  DsSourceFilter *m_pFilter;
+       virtual  HRESULT CheckMediaType(const AM_MEDIA_TYPE *pmt);\r
+
+       bool isaudiopin;
+       DsSourceFilter *m_pFilter;      
+       IPin* connected;
+       IMemInputPin* connectedinput;
+       AM_MEDIA_TYPE medtype;
+       IMemAllocator* allocator;
 
+       
 
 
 };
 
 
 
-#endif
\ No newline at end of file
+#endif\r