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
\r
default: release #dev\r
\r
-release:: \r
+release::\r
CXXFLAGS= $(CXXFLAGS_REL)\r
release:: vompclient.exe\r
\r
\r
vompclient.exe: $(OBJECTS) vompwin.res\r
link $(LDFLAGS) /OUT:"vompclient.exe" $(LIBS) $(OBJECTS) vompwin.res\r
- \r
+\r
\r
\r
$(OBJECTS): $*.cc\r
$(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
DsAllocator::DsAllocator() {
- CAutoLock locked(&objCritSec);
surfallocnotify=NULL;
refcount=1;
}
DsAllocator::~DsAllocator() {
- CAutoLock locked(&objCritSec);
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)
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;
}
#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();
protected:
vector<IDirect3DSurface9* > surfaces;
- CCritSec objCritSec;
+ //CCritSec objCritSec;
IVMRSurfaceAllocatorNotify9* surfallocnotify;
void CleanupSurfaces();
LONG refcount;
/*
- 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
#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
-/*
- 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
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
}\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
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
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
\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
\r
return S_OK;\r
}\r
+\r
/*
- 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