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
00034
00035 #include "FLACdecoderdllstuff.h"
00036
00037
00038 #include "FLACPushDecoder.h"
00039 #include "IOggDecoder.h"
00040 #include <libOOOgg/OggPacket.h>
00041 #include <libOOOgg/StampedOggPacket.h>
00042
00043
00044
00045 #include <fstream>
00046
00047 using namespace std;
00048
00049
00050 class FLACDecodeInputPin
00051
00052 : public AbstractTransformInputPin
00053 , public IOggDecoder
00054 {
00055 public:
00056
00057 DECLARE_IUNKNOWN
00058 STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv);
00059
00060
00061 FLACDecodeInputPin(AbstractTransformFilter* inFilter, CCritSec* inFilterLock, AbstractTransformOutputPin* inOutputPin, vector<CMediaType*> inAcceptableMediaTypes);
00062 virtual ~FLACDecodeInputPin(void);
00063
00064 virtual HRESULT SetMediaType(const CMediaType* inMediaType);
00065 virtual HRESULT CheckMediaType(const CMediaType *inMediaType);
00066
00067 virtual STDMETHODIMP BeginFlush();
00068 virtual STDMETHODIMP EndFlush();
00069 virtual STDMETHODIMP EndOfStream(void);
00070 virtual STDMETHODIMP NewSegment(REFERENCE_TIME inStartTime, REFERENCE_TIME inStopTime, double inRate);
00071
00072 virtual STDMETHODIMP GetAllocatorRequirements(ALLOCATOR_PROPERTIES *outRequestedProps);
00073
00074 virtual STDMETHODIMP FLACDecodeInputPin::Receive(IMediaSample* inSample);
00075
00076
00077 virtual LOOG_INT64 convertGranuleToTime(LOOG_INT64 inGranule);
00078 virtual LOOG_INT64 mustSeekBefore(LOOG_INT64 inGranule);
00079 virtual IOggDecoder::eAcceptHeaderResult showHeaderPacket(OggPacket* inCodecHeaderPacket);
00080 virtual string getCodecShortName();
00081 virtual string getCodecIdentString();
00082
00083 protected:
00084
00085 static const unsigned long DECODED_BUFFER_SIZE = 1<<20;
00086
00087 static const unsigned long FLAC_NUM_BUFFERS = 75;
00088 static const unsigned long FLAC_BUFFER_SIZE = 65536;
00089
00090
00091 virtual bool ConstructCodec();
00092 virtual void DestroyCodec();
00093 virtual HRESULT TransformData(unsigned char* inBuf, long inNumBytes);
00094
00095
00096 bool mGotMetaData;
00097 FLACPushDecoder mFLACDecoder;
00098 CCritSec* mCodecLock;
00099 unsigned long mUptoFrame;
00100
00101 OggPacket* mMetadataPacket;
00102
00103 enum eFLACType {
00104 FT_UNKNOWN,
00105 FT_CLASSIC,
00106 FT_OGG_FLAC_1,
00107 };
00108
00109 eFLACType mFLACType;
00110
00111 enum eFLACSetupState {
00112 VSS_SEEN_NOTHING,
00113 VSS_SEEN_BOS,
00114 VSS_SEEN_COMMENT,
00115 VSS_ALL_HEADERS_SEEN,
00116 VSS_ERROR
00117 };
00118
00119 eFLACSetupState mSetupState;
00120
00121 unsigned long mDecodedByteCount;
00122 unsigned char* mDecodedBuffer;
00123
00124 __int64 mRateNumerator;
00125 static const __int64 RATE_DENOMINATOR = 65536;
00126
00127
00128
00129
00130
00131
00132
00133 };