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
00032 #pragma once
00033 #include "speexdecoderdllstuff.h"
00034 #include "IOggDecoder.h"
00035 #include "AbstractTransformInputPin.h"
00036 #include "SpeexDecodeInputPin.h"
00037
00038 #include "SpeexDecodeFilter.h"
00039
00040 extern "C" {
00041
00042 #include "fish_cdecl.h"
00043 }
00044
00045 class SpeexDecodeOutputPin;
00046
00047 class SpeexDecodeInputPin
00048 : public AbstractTransformInputPin
00049 , public IOggDecoder
00050 {
00051 public:
00052 DECLARE_IUNKNOWN
00053 STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv);
00054 SpeexDecodeInputPin(AbstractTransformFilter* inFilter, CCritSec* inFilterLock, AbstractTransformOutputPin* inOutputPin, vector<CMediaType*> inAcceptableMediaTypes);
00055 virtual ~SpeexDecodeInputPin(void);
00056
00057 static int __cdecl SpeexDecoded (FishSound* inFishSound, float** inPCM, long inFrames, void* inThisPointer);
00058
00059
00060 virtual HRESULT SetMediaType(const CMediaType* inMediaType);
00061 virtual HRESULT CheckMediaType(const CMediaType *inMediaType);
00062 virtual STDMETHODIMP NewSegment(REFERENCE_TIME inStartTime, REFERENCE_TIME inStopTime, double inRate);
00063 virtual STDMETHODIMP EndFlush();
00064
00065 virtual STDMETHODIMP GetAllocatorRequirements(ALLOCATOR_PROPERTIES *outRequestedProps);
00066
00067 virtual STDMETHODIMP Receive(IMediaSample* inSample);
00068
00069
00070 virtual LOOG_INT64 convertGranuleToTime(LOOG_INT64 inGranule);
00071 virtual LOOG_INT64 mustSeekBefore(LOOG_INT64 inGranule);
00072 virtual IOggDecoder::eAcceptHeaderResult showHeaderPacket(OggPacket* inCodecHeaderPacket);
00073 virtual string getCodecShortName();
00074 virtual string getCodecIdentString();
00075
00076
00077 protected:
00078 static const unsigned long DECODED_BUFFER_SIZE = 1<<20;
00079 static const unsigned long SPEEX_IDENT_HEADER_SIZE = 80;
00080 static const unsigned long SPEEX_NUM_BUFFERS = 75;
00081 static const unsigned long SPEEX_BUFFER_SIZE = 65536;
00082
00083
00084 virtual bool ConstructCodec();
00085 virtual void DestroyCodec();
00086 virtual HRESULT TransformData(unsigned char* inBuf, long inNumBytes);
00087
00088 FishSound* mFishSound;
00089 FishSoundInfo mFishInfo;
00090
00091 int mNumChannels;
00092 int mFrameSize;
00093 int mSampleRate;
00094 unsigned int mUptoFrame;
00095
00096 bool mBegun;
00097
00098 unsigned char* mDecodedBuffer;
00099
00100 unsigned long mDecodedByteCount;
00101
00102 enum eSpeexSetupState {
00103 VSS_SEEN_NOTHING,
00104 VSS_SEEN_BOS,
00105 VSS_SEEN_COMMENT,
00106 VSS_ALL_HEADERS_SEEN,
00107 VSS_ERROR
00108 };
00109
00110 eSpeexSetupState mSetupState;
00111
00112 __int64 mRateNumerator;
00113 static const __int64 RATE_DENOMINATOR = 65536;
00114
00115
00116
00117 };