00001 //=========================================================================== 00002 //Copyright (C) 2003, 2004 Zentaro Kavanagh 00003 // 00004 //Redistribution and use in source and binary forms, with or without 00005 //modification, are permitted provided that the following conditions 00006 //are met: 00007 // 00008 //- Redistributions of source code must retain the above copyright 00009 // notice, this list of conditions and the following disclaimer. 00010 // 00011 //- Redistributions in binary form must reproduce the above copyright 00012 // notice, this list of conditions and the following disclaimer in the 00013 // documentation and/or other materials provided with the distribution. 00014 // 00015 //- Neither the name of Zentaro Kavanagh nor the names of contributors 00016 // may be used to endorse or promote products derived from this software 00017 // without specific prior written permission. 00018 // 00019 //THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00020 //``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00021 //LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 00022 //PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ORGANISATION OR 00023 //CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00024 //EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00025 //PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00026 //PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00027 //LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00028 //NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00029 //SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00030 //=========================================================================== 00031 00032 #pragma once 00033 00034 #include "Theoradecoderdllstuff.h" 00035 #include "theoradecodeoutputpin.h" 00036 #include "theoradecodeinputpin.h" 00037 #include <math.h> 00038 //#include "DSStringer.h" 00039 #include "TheoraDecoder.h" 00040 #include <fstream> 00041 using namespace std; 00042 class TheoraDecodeFilter 00043 //: public CVideoTransformFilter 00044 : public CTransformFilter 00045 00046 { 00047 public: 00048 TheoraDecodeFilter(void); 00049 virtual ~TheoraDecodeFilter(void); 00050 00051 //COM Creator Function 00052 static CUnknown* WINAPI CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr); 00053 00054 //CTransfrom filter pure virtuals 00055 virtual HRESULT CheckInputType(const CMediaType* inMediaType); 00056 virtual HRESULT CheckTransform(const CMediaType* inInputMediaType, const CMediaType* inOutputMediaType); 00057 virtual HRESULT DecideBufferSize(IMemAllocator* inAllocator, ALLOCATOR_PROPERTIES* inPropertyRequest); 00058 virtual HRESULT GetMediaType(int inPosition, CMediaType* outOutputMediaType); 00059 virtual HRESULT Transform(IMediaSample* inInputSample, IMediaSample* outOutputSample); 00060 00061 //Overrides 00062 virtual HRESULT SetMediaType(PIN_DIRECTION inDirection, const CMediaType* inMediaType); 00063 virtual HRESULT NewSegment(REFERENCE_TIME inStart, REFERENCE_TIME inEnd, double inRate); 00064 //virtual BOOL ShouldSkipFrame(IMediaSample* inSample); 00065 virtual CBasePin* TheoraDecodeFilter::GetPin(int inPinNo); 00066 //Helpers 00067 sTheoraFormatBlock* getTheoraFormatBlock(); 00068 void setTheoraFormat(sTheoraFormatBlock* inFormatBlock); 00069 protected: 00070 virtual void ResetFrameCount(); 00071 void FillMediaType(CMediaType* outMediaType, unsigned long inSampleSize); 00072 bool FillVideoInfoHeader(VIDEOINFOHEADER* inFormatBuffer); 00073 bool SetSampleParams(IMediaSample* outMediaSample, unsigned long inDataSize, REFERENCE_TIME* inStartTime, REFERENCE_TIME* inEndTime, BOOL inIsSync); 00074 unsigned long mHeight; 00075 unsigned long mWidth; 00076 unsigned long mFrameSize; 00077 unsigned long mFrameCount; 00078 unsigned long mYOffset; 00079 unsigned long mXOffset; 00080 __int64 mFrameDuration; 00081 bool mBegun; 00082 TheoraDecoder* mTheoraDecoder; 00083 00084 00085 int TheoraDecoded (yuv_buffer* inYUVBuffer, IMediaSample* outSample, bool inIsKeyFrame); 00086 00087 00088 __int64 mSeekTimeBase; 00089 __int64 mLastSeenStartGranPos; 00090 //Format Block 00091 sTheoraFormatBlock* mTheoraFormatInfo; 00092 fstream debugLog; 00093 }; 00094 //--------------------------------------- 00095 //OLD IMPLOEMENTATION.... 00096 //--------------------------------------- 00098 //#include "Theoradecoderdllstuff.h" 00099 //#include "AbstractVideoDecodeFilter.h" 00100 // 00102 //struct sTheoraFormatBlock; 00103 //class TheoraDecodeInputPin; 00104 //class TheoraDecodeOutputPin; 00105 // 00107 //class TheoraDecodeFilter 00108 // //Base Classes 00109 // : public AbstractVideoDecodeFilter 00110 //{ 00111 //public: 00112 // //Friends 00113 // friend class TheoraDecodeInputPin; 00114 // friend class TheoraDecodeOutputPin; 00115 // 00116 // 00117 // 00118 // 00119 // //Constructors and Destructors 00120 // TheoraDecodeFilter(void); 00121 // virtual ~TheoraDecodeFilter(void); 00122 // 00123 // //COM Creator Function 00124 // static CUnknown* WINAPI CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr); 00125 // 00126 // //IMediaFilter OVerride - This lets us tell the graph we may not produce data in pause state so don't block. 00127 // virtual STDMETHODIMP GetState(DWORD dw, FILTER_STATE *pState); 00128 // 00129 // 00130 // 00131 // //VIRTUAL FUNCTIONS - AbstractAudioDecodeFilter 00132 // virtual bool ConstructPins(); 00133 // 00134 // //FIX::: Do we need these ? Aren't they all friends ?? 00135 // virtual sTheoraFormatBlock* getTheoraFormatBlock(); 00136 // virtual void setTheoraFormat(sTheoraFormatBlock* inFormatBlock); 00137 // 00138 //protected: 00139 // //Format Block 00140 // sTheoraFormatBlock* mTheoraFormatInfo; 00141 //};