//==========================================================================; // // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY // KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR // PURPOSE. // // Copyright (c) 1992 - 1998 Microsoft Corporation. All Rights Reserved. // //--------------------------------------------------------------------------; /******************************Module*Header*******************************\ * Module Name: MpgAudio.h * * Prototype Mpeg Audio codec * * \**************************************************************************/ #ifndef _INC_MPGAUDIO_H #define _INC_MPGAUDIO_H #include #include #include #include #include #include #include "decoder.h" class CMpegAudioCodec : public CTransformFilter { public: // // --- Com stuff --- // static CUnknown * WINAPI CreateInstance(LPUNKNOWN, HRESULT *); STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void ** ppv); DECLARE_IUNKNOWN; // // --- CTransform overrides --- // HRESULT Receive(IMediaSample *pSample); HRESULT CheckInputType(const CMediaType* mtIn); HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut); HRESULT DecideBufferSize(IMemAllocator * pAllocator, ALLOCATOR_PROPERTIES * pProperties); HRESULT StartStreaming(); HRESULT StopStreaming(); HRESULT SetMediaType(PIN_DIRECTION direction,const CMediaType *pmt); HRESULT GetMediaType(int iPosition, CMediaType *pMediaType); HRESULT EndOfStream(void); HRESULT EndFlush(void); CMpegAudioCodec(TCHAR *pName, LPUNKNOWN pUnk, HRESULT *pHr); ~CMpegAudioCodec(); private: // Serialize access to the output pin long m_FrameSize; // Frame input size (bytes) long m_FrameSizeOutput; // Frame output size (bytes) LPBYTE m_lpStart; LPBYTE m_lpCurr; LPBYTE m_lpEnd; BOOL m_bPayloadOnly; enum {MAX_FRAMES_PER_OUTPUT_SAMPLE = 4}; enum {AUDIO_BUFF_SIZE = (1024 * 8)}; DWORD m_dwCtrl; AudioCtrl m_AudioControl; CAudioDecoder *m_pAudioDecoder; CRefTime m_TimePerFrame; CRefTime m_TimeAtLastSyncPoint; CRefTime m_TimeSinceLastSyncPoint; int m_FreqDiv; int m_PrefChan; int m_Quality; int m_QuarterInt; int m_WordSize; BYTE m_Buffer[AUDIO_BUFF_SIZE]; void ProcessDiscontiuity(IMediaSample *pSample); void ProcessSyncPoint(IMediaSample *pSample, BYTE *pSrc); HRESULT DeliverSample(IMediaSample *pOutSample, CRefTime &TimeDecoded, int iSampleSize); void ResetAudioDecoder(); BOOL LookForSyncWord(); int Padding(); void GetNextPacketChunk(LPBYTE &lpPacket, long &LenLeftInBuffer, long &LenLeftInPacket); CRefTime m_tStop; MPEG1WAVEFORMAT m_Format; }; // ------------------------------------------------------------------------- // Helper functions that can be used by audio and video codecs. // ------------------------------------------------------------------------- // /******************************Public*Routine******************************\ * ByteSwap * * Converts dwX from little endian to big endian and vice-versa. * * \**************************************************************************/ __inline DWORD ByteSwap( DWORD dwX ) { #ifdef _X86_ _asm mov eax, dwX _asm bswap eax _asm mov dwX, eax return dwX; #else return _lrotl(((dwX & 0xFF00FF00) >> 8) | ((dwX & 0x00FF00FF) << 8), 16); #endif } LPBYTE SkipToPacketData(LPBYTE pSrc, long &LenLeftInPacket); int GetDecoderInteger(const TCHAR *pKey,int iDefault); #endif