mp3ff.h
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:13k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #ifndef _HXMP3FMT_H_
  36. #define _HXMP3FMT_H_
  37. #include "baseobj.h"
  38. ///////////////////////////////////////////////////////////////////////////////
  39. // Constants
  40. ///////////////////////////////////////////////////////////////////////////////
  41. #define MY_PLUGIN_VERSION       0
  42. #define MY_DESCRIPTION         "RealNetworks MP3 File Format Plugin"
  43. #define MY_COPYRIGHT           "(c) 1999-2000 RealNetworks, Inc. All rights reserved."
  44. #define MY_MORE_INFO_URL       "http://www.real.com"
  45. #define MY_FILE_MIME_TYPES     {"audio/rn-mpeg", "audio/mpeg", "audio/mpg", "audio/mp3", "audio/x-mpeg", "audio/x-mpg", "audio/x-mp3", NULL}
  46. #define MY_FILE_EXTENSIONS     {"mp3", "mp2", "mpa", "mp1", "mpga", "mpg", "mpeg", "mpv", "dat", NULL}
  47. #define MY_FILE_OPEN_NAMES     {"MPEG Audio Files (.mp3;.mp2;.mpa;.mp1;.mpga)", NULL}
  48. #define MY_STREAM_MIME_TYPE    "audio/X-MP3-draft-00"
  49. #define MY_RTP_MIME_TYPE       "audio/MPA"
  50. #define MY_LOCAL_MIME_TYPE     "audio/MPEG-ELEMENTARY"
  51. #define MAX_METADATA 2048
  52. #define MAX_GARBAGE_BYTES 262144
  53. enum { MY_FILE_HEADER_START = 0 };
  54. enum { MY_FILE_HEADER_LENGTH = 4096};
  55. enum { MY_STREAM_NO = 0 };
  56. enum { ID3HeaderLen = 128,
  57.        BytesBeforeID3Header = 1
  58.      };
  59. ///////////////////////////////////////////////////////////////////////////////
  60. // Typedefs
  61. ///////////////////////////////////////////////////////////////////////////////
  62. typedef enum
  63. {
  64.         Ready,
  65.         InitPending,
  66.         GetId3HeaderSeekPending,
  67.         GetId3HeaderReadPending,
  68.         GetFileHeaderSeekPending,
  69.         GetFileHeaderReadPending,
  70.         GetStreamHeaderSeekPending,
  71.         GetStreamHeaderReadPending,
  72.         GetPacketSeekPending,
  73.         GetPacketReadPending,
  74.         SeekSeekPending,
  75.         SeekToOffsetNoRead
  76. } MyState;
  77. typedef enum
  78. {
  79.     eHXUnknown,
  80.     eHXVideo,
  81.     eHXSystem,
  82.     eHXAudio
  83. } eStreamType;
  84. typedef enum
  85. {
  86.     eHXMPEG,
  87.     eHXAC3,
  88.     eHXLPCM,
  89.     eHXDTS
  90. } eAudioType;
  91. typedef enum
  92. {
  93.     eHXMPEG1,
  94.     eHXMPEG2
  95. } eVideoType;
  96. typedef struct
  97. {
  98.     eStreamType     eType;
  99.     eAudioType      eAudio;
  100.     eVideoType      eVideo;    
  101.     
  102.     ULONG32         ulStreamSize;
  103.     UINT32          ulBitRate;
  104.     double          dTimePerFrame;
  105.     
  106.     int             nPacketSize;
  107.     
  108.     UCHAR           cHeader;
  109.     int             nWidth;
  110.     int             nHeight;
  111. } tStreamInfo;
  112. // Stat codes
  113. enum
  114.     PICTURE_START_CODE  = 0x00000100,
  115.     USER_DATA_CODE      = 0x000001b2,
  116.     SEQ_START_CODE      = 0x000001b3,
  117.     SEQ_ERROR_CODE      = 0x000001b4,
  118.     EXT_DATA_START_CODE = 0x000001b5,
  119.     SEQUENCE_END_CODE   = 0x000001b7,
  120.     GROUP_START_CODE    = 0x000001b8,
  121.     ISO_END_CODE        = 0x000001b9,
  122.     PACK_HEADER         = 0x000001ba,
  123.     SYSTEM_HEADER       = 0x000001bb,
  124.     PRIVATE_STREAM_1    = 0x000001bd,
  125.     PADDING_PACKET      = 0x000001be,
  126.     PRIVATE_STREAM_2    = 0x000001bf,
  127.     VIDEO_PACKET        = 0x000001e0,
  128.     AUDIO_PACKET        = 0x000001c0,
  129.     NO_START_CODE       = 0xffffffff
  130. };        
  131. ///////////////////////////////////////////////////////////////////////////////
  132. //
  133. //  CRnMp3Fmt Class
  134. //
  135. //  This class inherits the interfaces required to create a File Format
  136. //  plug-in. The IHXFileFormatObject interface consists of routines specific
  137. //  to File Format plug-ins. The IHXFileResponse interface is needed because
  138. //  of the asynchronous nature of the RealMedia file system. All plug-ins
  139. //  also require the IHXPlugin interface to handle fundamental plug-in
  140. //  operations. Since we are using COM, this class also inherits COM's
  141. //  IUnknown interface to handle reference counting and interface query.
  142. //
  143. class CRnMp3Fmt : public IHXFileFormatObject,
  144.                   public IHXFileResponse,
  145.                   public IHXFileStatResponse,
  146. #if defined(MPA_FMT_DRAFT00)
  147.                   public IHXPacketFormat,
  148. #endif
  149.                   public IHXPlugin,
  150.                   public IHXThreadSafeMethods,
  151.                   public CHXBaseCountingObject
  152. {
  153. public:
  154.         CRnMp3Fmt();
  155.     ///////////////////////////////////////////////////////////////////////////
  156.     // IHXFileFormatObject Interface Methods               ref:  hxformt.h
  157.     STDMETHOD(GetFileFormatInfo)
  158.         (THIS_
  159.           REF(const char**) pFileMimeTypes,
  160.           REF(const char**) pFileExtensions,
  161.           REF(const char**) pFileOpenNames
  162.         );
  163.     STDMETHOD(InitFileFormat)
  164.         (THIS_
  165.           IHXRequest*        pRequest,
  166.           IHXFormatResponse* pFormatResponse,
  167.           IHXFileObject*     pFileObject
  168.         );
  169.     STDMETHOD(GetFileHeader  ) (THIS);
  170.     STDMETHOD(GetStreamHeader) (THIS_ UINT16 streamNo);
  171.     STDMETHOD(GetPacket      ) (THIS_ UINT16 streamNo);
  172.     STDMETHOD(Seek           ) (THIS_ UINT32 requestedTime);
  173.     STDMETHOD(Close          ) (THIS);
  174.     ///////////////////////////////////////////////////////////////////////////
  175.     // IHXFileResponse Interface Methods                   ref:  hxfiles.h
  176.     STDMETHOD(InitDone ) (THIS_ HX_RESULT status);
  177.     STDMETHOD(SeekDone ) (THIS_ HX_RESULT status);
  178.     STDMETHOD(ReadDone ) (THIS_ HX_RESULT status, IHXBuffer* pBuffer);
  179.     STDMETHOD(WriteDone) (THIS_ HX_RESULT status);
  180.     STDMETHOD(CloseDone) (THIS_ HX_RESULT status);
  181.     ///////////////////////////////////////////////////////////////////////////
  182.     // IHXFileStatResponse methods
  183.     STDMETHOD(StatDone)         (THIS_
  184.                 HX_RESULT status,
  185.                 UINT32 ulSize,
  186.                 UINT32 ulCreationTime,
  187.                 UINT32 ulAccessTime,
  188.                 UINT32 ulModificationTime,
  189.                 UINT32 ulMode);
  190. #if defined(MPA_FMT_DRAFT00)
  191.     ///////////////////////////////////////////////////////////////////////////
  192.     // IHXPacketFormat Interface Methods                   ref:  rmaformat.h
  193.     STDMETHOD(GetSupportedPacketFormats) (THIS_ REF(const char**) pFormats);
  194.     STDMETHOD(SetPacketFormat) (THIS_ const char* pFormat);
  195. #endif /* #if defined(MPA_FMT_DRAFT00) */
  196.     
  197.     ///////////////////////////////////////////////////////////////////////////
  198.     // IHXPlugin Interface Methods                         ref:  hxplugn.h
  199.     STDMETHOD(GetPluginInfo)
  200.         (THIS_ 
  201.           REF(int)         bLoadMultiple,
  202.           REF(const char*) pDescription,
  203.           REF(const char*) pCopyright,
  204.           REF(const char*) pMoreInfoURL,
  205.           REF(UINT32)      versionNumber
  206.         );
  207.     STDMETHOD(InitPlugin) (THIS_ IUnknown* pHXCore);
  208.     ///////////////////////////////////////////////////////////////////////////
  209.     // IHXThreadSafeMethods methods                        ref: hxengin.h
  210.     STDMETHOD_(UINT32,IsThreadSafe) (THIS);
  211.     ///////////////////////////////////////////////////////////////////////////
  212.     // IUnknown COM Interface Methods                          ref:  hxcom.h
  213.     STDMETHOD (QueryInterface ) (THIS_ REFIID ID, void** ppInterfaceObj);
  214.     STDMETHOD_(UINT32, AddRef ) (THIS);
  215.     STDMETHOD_(UINT32, Release) (THIS);
  216. private:
  217.     // Buffered Read
  218.     typedef struct
  219.     {
  220.         IHXBuffer  *pReadBuffer;
  221.         UCHAR       *pBuffer;
  222.         ULONG32     dwBytesRemaining;
  223.         ULONG32     dwBufferSize;
  224.         HX_RESULT   status;
  225.     } tReadBuffer;
  226.     enum
  227.     {
  228.         kReadSize = 2048
  229.     };
  230.     ///////////////////////////////////////////////////////////////////////////
  231.     // Private Class Variables
  232.     INT32                  m_RefCount;         // Object's reference count
  233.     IHXCommonClassFactory* m_pClassFactory;    // Creates common RMA classes
  234.     IHXFileObject*         m_pFileObj;         // Used for file I/O
  235.     IHXFormatResponse*     m_pStatus;          // Reports status to RMA core
  236.     IHXErrorMessages*      m_pError;           // Reports errors to system
  237.     IHXRegistry*           m_pRegistry;
  238.     IHXBuffer*             m_szPlayerReg;
  239.     MyState                m_State;            // State used for asynch. calls
  240.     UINT32                 m_ulNextPacketDeliveryTime; // Delivery time of next packet
  241.     UINT32                 m_ulFileSize;
  242.     UINT32                 m_ulMaxSampRate;    // Max pcm sample rate in this stream
  243.     UINT32                 m_ulMetaReadSize;   // A custom read size for meta data
  244.     UINT32                 m_ulNextMetaPos;    // Byte position of next meta data
  245.     UINT32                 m_ulMetaLength;     // Length of the meta packet
  246.     UINT32                 m_ulBytesRead;      // Number of bytes read from file
  247.     UINT32                 m_ulFileOffset;     // Offset for start of file to data
  248.     int                    m_nChannels;        // Number of channels in the stream
  249.     double                 m_dNextPts;         // decimal ms of the next packet
  250.     CIHXRingBuffer*        m_pFmtBuf;          // RingBuffer
  251.     IHXValues*             m_pMetaProps;
  252.     IUnknown*              m_pContext;
  253.     tReadBuffer            m_ReadBuf;
  254.     tRtpPacket             m_RtpPackets;
  255.     tStreamInfo            m_Info;
  256.     CMp3Format*            m_pMp3Fmt;
  257.     UINT32                 m_ulGarbageBytesRead;
  258.     HX_BITFIELD            m_bEOF;
  259.     HX_BITFIELD            m_bRtp;             // Are we using rtp protocol
  260.     HX_BITFIELD            m_bHasVbrHdr;       // Do we have a vbr header
  261.     HX_BITFIELD            m_bSkipVbrHdr;      // Don't rerformat vbr header
  262.     HX_BITFIELD            m_bStreaming;       // Are we in a packet loss enviorn
  263.     HX_BITFIELD            m_bMetaPacket;      // Does this frame contain meta data
  264.     HX_BITFIELD            m_bNeedPacket;      // Read did not finish inside GetPacket
  265.     HX_BITFIELD            m_bCheckBadData;    // If set, check the bad data for a frame
  266.     HX_BITFIELD            m_bLive;            // ShoutCast/IceCast stream
  267.     HX_BITFIELD            m_bLicensed;        // Is the user licensed to stream
  268.     HX_BITFIELD            m_bClosed;
  269.     HX_BITFIELD            m_bAcceptMetaInfo;
  270.     HX_BITFIELD            m_bAllMetaInfo;
  271.     HX_BITFIELD            m_bIsVBR;
  272.     HX_BITFIELD            m_bFirstMeta;       // Confirm our meta location is accurate
  273.     IHXBuffer*              (*m_pCreatePacketFunction) (IHXCommonClassFactory*, IHXBuffer*, UCHAR*, int );
  274.     ///////////////////////////////////////////////////////////////////////////
  275.     // Private Static Class Variables
  276.     static const char* const    zm_pDescription;
  277.     static const char* const    zm_pCopyright;
  278.     static const char* const    zm_pMoreInfoURL;
  279.     static const char* const    zm_pFileMimeTypes[];
  280.     static const char* const    zm_pFileExtensions[];
  281.     static const char* const    zm_pFileOpenNames[];
  282.     static const char* const    zm_pPacketFormats[];
  283.         ///////////////////////////////////////////////////////////////////////////
  284.     // Private Class Methods
  285.     ~CRnMp3Fmt();
  286.     
  287.     HX_RESULT   MyCreateFileHeaderObj_hr(HX_RESULT status, IHXBuffer* pDataRead);
  288.     void        MyCreateStreamHeaderObj_v(HX_RESULT status, IHXBuffer* pDataRead);
  289.     HX_RESULT   MyCreatePacketObj_hr(HX_RESULT status, tReadBuffer* pDataRead);
  290.     void        DiscardReadBuffers_v();
  291.     
  292.     UCHAR*      GetMP3Frame_p(tReadBuffer* pPacketData, int &nSyncSize);
  293.     UINT16      InitStream_n(IHXBuffer* pDataRead,
  294.                              tStreamInfo *pInfo,
  295.                              HX_RESULT &hr,
  296.                              char* pUpgrade=NULL,
  297.                              int nBufLen=0);
  298.     INT32       GetStartCode(UINT8 **ppBuffer, UINT32 &ulBytes);
  299.     UINT32      Get4Byte(UINT8* pBuf, UINT32 ulSize);
  300. #if defined(HELIX_FEATURE_MP3FF_ONDEMANDMETAINFO)
  301.     void        SetMetaInfo(IHXValues* pFileHeader, const char* pszProp);
  302. #endif /* #if defined(HELIX_FEATURE_MP3FF_ONDEMANDMETAINFO) */
  303.     PRIVATE_DESTRUCTORS_ARE_NOT_A_CRIME      // Avoids GCC compiler warning
  304. };
  305. #endif // _HXMP3FMT_H_