00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #pragma once
00023
00024 #include "..\..\..\DSUtil\DSUtil.h"
00025
00026 template<class TStream>
00027 class CBaseSource
00028 : public CSource
00029 , public IFileSourceFilter
00030 , public IAMFilterMiscFlags
00031 {
00032 protected:
00033 CStringW m_fn;
00034
00035 public:
00036 CBaseSource(TCHAR* name, LPUNKNOWN lpunk, HRESULT* phr, const CLSID& clsid)
00037 : CSource(name, lpunk, clsid)
00038 {
00039 if(phr) *phr = S_OK;
00040 }
00041
00042 DECLARE_IUNKNOWN;
00043 STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv)
00044 {
00045 CheckPointer(ppv, E_POINTER);
00046
00047 return
00048 QI(IFileSourceFilter)
00049 QI(IAMFilterMiscFlags)
00050 __super::NonDelegatingQueryInterface(riid, ppv);
00051 }
00052
00053
00054
00055 STDMETHODIMP Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt)
00056 {
00057
00058 if(GetPinCount() > 0)
00059 return VFW_E_ALREADY_CONNECTED;
00060
00061 HRESULT hr = S_OK;
00062 if(!(new TStream(pszFileName, this, &hr)))
00063 return E_OUTOFMEMORY;
00064
00065 if(FAILED(hr))
00066 return hr;
00067
00068 m_fn = pszFileName;
00069
00070 return S_OK;
00071 }
00072
00073 STDMETHODIMP GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt)
00074 {
00075 if(!ppszFileName) return E_POINTER;
00076
00077 if(!(*ppszFileName = (LPOLESTR)CoTaskMemAlloc((m_fn.GetLength()+1)*sizeof(WCHAR))))
00078 return E_OUTOFMEMORY;
00079
00080 wcscpy(*ppszFileName, m_fn);
00081
00082 return S_OK;
00083 }
00084
00085
00086
00087 STDMETHODIMP_(ULONG) GetMiscFlags()
00088 {
00089 return AM_FILTER_MISC_FLAGS_IS_SOURCE;
00090 }
00091 };
00092
00093 class CBaseStream
00094 : public CSourceStream
00095 , public CSourceSeeking
00096 {
00097 protected:
00098 CCritSec m_cSharedState;
00099
00100 REFERENCE_TIME m_AvgTimePerFrame;
00101 REFERENCE_TIME m_rtSampleTime, m_rtPosition;
00102
00103 BOOL m_bDiscontinuity, m_bFlushing;
00104
00105 HRESULT OnThreadStartPlay();
00106 HRESULT OnThreadCreate();
00107
00108 private:
00109 void UpdateFromSeek();
00110 STDMETHODIMP SetRate(double dRate);
00111
00112 HRESULT ChangeStart();
00113 HRESULT ChangeStop();
00114 HRESULT ChangeRate() {return S_OK;}
00115
00116 public:
00117 CBaseStream(TCHAR* name, CSource* pParent, HRESULT* phr);
00118 virtual ~CBaseStream();
00119
00120 STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
00121
00122 HRESULT FillBuffer(IMediaSample* pSample);
00123
00124 virtual HRESULT FillBuffer(IMediaSample* pSample, int nFrame, BYTE* pOut, long& len ) = 0;
00125
00126 STDMETHODIMP Notify(IBaseFilter* pSender, Quality q);
00127 };