00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #pragma once
00032
00033 #include <Dshow.h>
00034 #include <Initguid.h>
00035 #include <Qnetwork.h>
00036 #include "oggdllstuff.h"
00037 #include "OggDemuxSourcePin.h"
00038 #include "OggStreamMapper.h"
00039 #include <libOOOggSeek/AutoOggSeekTable.h>
00040 #include <libOOOgg/OggDataBuffer.h>
00041 #include "IFilterDataSource.h"
00042 #include "DataSourceFactory.h"
00043 #include "PropsAbout.h"
00044 #include <fstream>
00045 using namespace std;
00046
00047
00048 class OggStreamMapper;
00049
00050 class OGG_DEMUX_API OggDemuxSourceFilter
00051 : public CBaseFilter,
00052 public CAMThread,
00053 public IFileSourceFilter,
00054 public IOggCallback
00055 , public BasicSeekPassThrough
00056 , public ISpecifyPropertyPages
00057 , public IAMFilterMiscFlags
00058 , public IAMMediaContent
00059
00060 {
00061 public:
00062 friend class OggStream;
00063 static const unsigned long RAW_BUFFER_SIZE = 24;
00064
00065 DECLARE_IUNKNOWN
00066 STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv);
00067 static CUnknown * WINAPI CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr);
00068
00069 enum eThreadCommands {
00070 THREAD_EXIT = 0,
00071 THREAD_PAUSE = 1,
00072 THREAD_RUN = 2
00073 };
00074
00075 OggDemuxSourceFilter();
00076 OggDemuxSourceFilter(REFCLSID inFilterGUID);
00077 virtual ~OggDemuxSourceFilter(void);
00078
00079
00080 ULONG STDMETHODCALLTYPE GetMiscFlags(void);
00081
00082
00083
00084 virtual STDMETHODIMP GetCurFile(LPOLESTR* outFileName, AM_MEDIA_TYPE* outMediaType);
00085 virtual STDMETHODIMP Load(LPCOLESTR inFileName, const AM_MEDIA_TYPE* inMediaType);
00086
00087
00088 virtual int GetPinCount();
00089 virtual CBasePin* GetPin(int inPinNo);
00090
00091
00092 virtual bool acceptOggPage(OggPage* inOggPage);
00093
00094
00095 virtual STDMETHODIMP GetPages(CAUUID* outPropPages);
00096
00097
00098 STDMETHODIMP Run(REFERENCE_TIME tStart);
00099 STDMETHODIMP Pause(void);
00100 STDMETHODIMP Stop(void);
00101
00102
00103 virtual STDMETHODIMP GetDuration(LONGLONG* outDuration);
00104 virtual STDMETHODIMP GetCapabilities(DWORD* inCapabilities);
00105
00106 virtual STDMETHODIMP CheckCapabilities(DWORD *pCapabilities);
00107 virtual STDMETHODIMP IsFormatSupported(const GUID *pFormat);
00108 virtual STDMETHODIMP QueryPreferredFormat(GUID *pFormat);
00109 virtual STDMETHODIMP SetTimeFormat(const GUID *pFormat);
00110 virtual STDMETHODIMP GetTimeFormat( GUID *pFormat);
00111
00112 virtual STDMETHODIMP GetStopPosition(LONGLONG *pStop);
00113 virtual STDMETHODIMP GetCurrentPosition(LONGLONG *pCurrent);
00114 virtual STDMETHODIMP ConvertTimeFormat(LONGLONG *pTarget, const GUID *pTargetFormat, LONGLONG Source, const GUID *pSourceFormat);
00115 virtual STDMETHODIMP SetPositions(LONGLONG *pCurrent,DWORD dwCurrentFlags,LONGLONG *pStop,DWORD dwStopFlags);
00116 virtual STDMETHODIMP GetPositions(LONGLONG *pCurrent, LONGLONG *pStop);
00117 virtual STDMETHODIMP GetAvailable(LONGLONG *pEarliest, LONGLONG *pLatest);
00118 virtual STDMETHODIMP SetRate(double dRate);
00119 virtual STDMETHODIMP GetRate(double *dRate);
00120 virtual STDMETHODIMP GetPreroll(LONGLONG *pllPreroll);
00121 virtual STDMETHODIMP IsUsingTimeFormat(const GUID *pFormat);
00122
00123
00124 virtual STDMETHODIMP get_AuthorName(BSTR* outAuthorName);
00125 virtual STDMETHODIMP get_Title(BSTR* outTitle);
00126 virtual STDMETHODIMP get_Rating(BSTR* outRating);
00127 virtual STDMETHODIMP get_Description(BSTR* outDescription);
00128 virtual STDMETHODIMP get_Copyright(BSTR* outCopyright);
00129 virtual STDMETHODIMP get_BaseURL(BSTR* outBaseURL);
00130 virtual STDMETHODIMP get_LogoURL(BSTR* outLogoURL);
00131 virtual STDMETHODIMP get_LogoIconURL(BSTR* outLogoIconURL);
00132 virtual STDMETHODIMP get_WatermarkURL(BSTR* outWatermarkURL);
00133 virtual STDMETHODIMP get_MoreInfoURL(BSTR* outMoreInfoURL);
00134 virtual STDMETHODIMP get_MoreInfoBannerImage(BSTR* outMoreInfoBannerImage);
00135 virtual STDMETHODIMP get_MoreInfoBannerURL(BSTR* outMoreInfoBannerURL);
00136 virtual STDMETHODIMP get_MoreInfoText(BSTR* outMoreInfoText);
00137
00138
00139
00140
00141 virtual STDMETHODIMP GetTypeInfoCount( unsigned int FAR* pctinfo );
00142 virtual STDMETHODIMP GetIDsOfNames( REFIID riid,
00143 OLECHAR FAR* FAR* rgszNames,
00144 unsigned int cNames,
00145 LCID lcid,
00146 DISPID FAR* rgDispId );
00147 virtual STDMETHODIMP GetTypeInfo( unsigned int iTInfo,
00148 LCID lcid,
00149 ITypeInfo FAR* FAR* ppTInfo );
00150 virtual STDMETHODIMP Invoke( DISPID dispIdMember,
00151 REFIID riid,
00152 LCID lcid,
00153 WORD wFlags,
00154 DISPPARAMS FAR* pDispParams,
00155 VARIANT FAR* pVarResult,
00156 EXCEPINFO FAR* pExcepInfo,
00157 unsigned int FAR* puArgErr );
00158
00159
00160 CCritSec* theLock();
00161
00162 virtual DWORD ThreadProc(void);
00163
00164
00165 CCritSec* mStreamLock;
00166
00167 REFERENCE_TIME mSeekTimeBase;
00168
00169 protected:
00170
00171 void resetStream();
00172 void DeliverEOS();
00173 void DeliverBeginFlush();
00174 void DeliverEndFlush();
00175 void DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
00176
00177 virtual HRESULT DataProcessLoop();
00178 virtual HRESULT SetUpPins();
00179
00180
00181
00182 CCritSec* mSourceFileLock;
00183 CCritSec* mDemuxLock;
00184 AutoOggSeekTable* mSeekTable;
00185 wstring mFileName;
00186
00187 OggDataBuffer mOggBuffer;
00188
00189 bool mJustReset;
00190
00191 bool mSetIgnorePackets;
00192
00193
00194
00195
00196 IFilterDataSource* mDataSource;
00197
00198 OggStreamMapper* mStreamMapper;
00199
00200
00201 fstream debugLog;
00202
00203
00204 };