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

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 _MP3FORMAT_H_
  36. #define _MP3FORMAT_H_
  37. #include "hxtypes.h"
  38. #include "audinfo.h"
  39. #include "mp3misc.h"
  40. class CMp3Queue;
  41. class CMp3Format : public CAudioInfoBase
  42. {
  43. public:
  44.     CMp3Format();
  45.     CMp3Format(CMp3Misc* pMis);
  46.     ~CMp3Format();
  47.     ///////////////////////////////////////////////////////////////////////////
  48.     // Function:    Init
  49.     // Purpose:     Inits the reformat for the specified audio type.
  50.     // Params:      pHeader is pointer to an MP3 header
  51.     //              ulSize is the size of pHeader
  52.     //
  53.     // Notes:       This must be called once per audio type.
  54.     // Return:      1 if successful 0 otherwise
  55.     // Author:      cts
  56.     ///////////////////////////////////////////////////////////////////////////
  57.     BOOL Init(UINT8 *pHeader,
  58.               UINT32 ulSize);
  59.     ///////////////////////////////////////////////////////////////////////////
  60.     // Function:    GetDataOffset
  61.     // Purpose:     Extract the frame size, header size, and main_data_begin
  62.     //              from an MP3 sync word.
  63.     //
  64.     // Params:      pHeader is a pointer to an MP3 sync word
  65.     //              dwSize is the size of the pHeader buffer
  66.     //              nFrameSize will store the size of the sync
  67.     //              nHeaderSize will store size of the sync word, CRC, and side
  68.     //              info nDataOffset will store main_data_begin.
  69.     //
  70.     // Return:      1 if successful, 0 otherwise (not enough data)
  71.     // Author:      cts
  72.     ///////////////////////////////////////////////////////////////////////////
  73.     BOOL GetDataOffset(UINT8 *pHeader,
  74.                        UINT32 dwSize,
  75.                        int &nFrameSize,
  76.                        int &nHeaderSize,
  77.                        int &nDataOffset);
  78.     ///////////////////////////////////////////////////////////////////////////
  79.     // Function:    ClearMainDataBegin
  80.     // Purpose:     Sets the main_data_begin bits of the mp3 frame to 0
  81.     //
  82.     // Params:      pHeader is a pointer to an mp3 frame
  83.     //
  84.     // Author:      cts
  85.     ///////////////////////////////////////////////////////////////////////////
  86.     void ClearMainDataBegin(UINT8 *pHeader);
  87.     
  88.     ///////////////////////////////////////////////////////////////////////////
  89.     // Function:    GetEncodeInfo
  90.     // Purpose:     Gets encode info on the mpeg audio stream
  91.     //
  92.     // Params:      pHeader is a pointer to an MPEG audio sync word
  93.     //              dwSize is the size of the pHeader buffer
  94.     //              ulBitRate will store the encoded bitrate of the stream
  95.     //              ulSampRate will store the encoded sample rate of the stream
  96.     //              nChannels will store the number of channels in the stream
  97.     //              nSamplesPerFrame will store the MPEG samples in each frame
  98.     //
  99.     // Return:      1 if successful, 0 otherwise (not enough data)
  100.     // Author:      cts
  101.     ///////////////////////////////////////////////////////////////////////////
  102.     BOOL GetEncodeInfo(UINT8 *pHeader,
  103.                        UINT32 dwSize,
  104.                        UINT32 &ulBitRate,
  105.                        UINT32 &ulSampRate,
  106.                        int &nChannels,
  107.                        int &nLayer,
  108.                        int &nSamplesPerFrame);
  109.     ///////////////////////////////////////////////////////////////////////////
  110.     // Function:    ReformatMP3Frame
  111.     // Purpose:     Reformat an MP3 frame by moving its sync word before its
  112.     //              main data.
  113.     //
  114.     // Params:      pFrame is a pointer to 2 consecutive MP3 sync words
  115.     //              dwBytes is the number of bytes in the buffer *ppFrame
  116.     //              dwPrevBytes is the size of any bytes before ppFrame.
  117.     //
  118.     // Return:      The size of the modified MP3 frame, or 0 for an error
  119.     //
  120.     // Note:        main_data_begin does not include any bytes in sync words or
  121.     //              side info, so no book keeping is necessary of the offsets.
  122.     //              Also, the caller must ensure that the main_data_begin bytes
  123.     //              are before pFrame.  The maximum value of main_data_begin is 512.
  124.     //              
  125.     // Author:      cts
  126.     ///////////////////////////////////////////////////////////////////////////
  127.     int ReformatMP3Frame(UINT8 **ppFrame,
  128.                          UINT32 dwBytes,
  129.                          UINT32 dwPrevBytes);
  130.     ///////////////////////////////////////////////////////////////////////////
  131.     // Function:    UnformatMP3Frame
  132.     // Purpose:     Unformats a formatted mp3 to its origonal form
  133.     //
  134.     // Params:      pQueue is a queue that buffers formatted frames until
  135.     //              the queue has enough data to unformat.
  136.     //              pDest is a pointer to the buffer to copy the
  137.     //              unformatted frame
  138.     //              ulTime will contain the time stamp of the unformatted frame
  139.     //
  140.     // Return:      The size of the unformatted MP3 frame, 0 if the queue
  141.     //              needs more data to finish the unformat.
  142.     //
  143.     // Author:      cts
  144.     ///////////////////////////////////////////////////////////////////////////
  145.     int UnformatMP3Frame(CMp3Queue* pQueue,
  146.                          UINT8* pDest,
  147.                          UINT32 &ulTime);
  148.     
  149.     ///////////////////////////////////////////////////////////////////////////
  150.     // Function:    CheckValidFrame
  151.     // Purpose:     Checks if pBuf points to a valid MPEG audio frame of the
  152.     //              type we have been decoding (passed to in Init_c).
  153.     // Params:      pBuf is a buffer of data
  154.     //              dwSize is the size of pBuf
  155.     // Returns:     Size of the frame, or 0 if it is not a frame
  156.     // Author:      cts
  157.     ///////////////////////////////////////////////////////////////////////////
  158.     int CheckValidFrame(UINT8 *pBuf,
  159.                         UINT32 dwSize);
  160.     ///////////////////////////////////////////////////////////////////////////
  161.     // Function:    ScanForSyncWord
  162.     // Purpose:     Looks for a sync word ensuring there is a full frame in pBuf
  163.     // Params:      pBuf is a buffer to scan for the sync word
  164.     //              lSize is the size of pBuf
  165.     //              nFrameSize will cotain the size of the frame associated with
  166.     //              the sync word.
  167.     // Returns:     The number of bytes scanned, or -1 for no sync word
  168.     // Author:      cts
  169.     ///////////////////////////////////////////////////////////////////////////
  170.     INT32 ScanForSyncWord(UINT8 *pBuf,
  171.                           INT32 lSize,
  172.                           int &nFrameSize);
  173.     ///////////////////////////////////////////////////////////////////////////
  174.     // Function:    CheckForHeaders
  175.     // Purpose:     Checks for one of the many headers, legit and bogus, people
  176.     //              put in mp3 streams.
  177.     // Params:      pBuf is a buffer of mp3 data
  178.     //              dwSize is the size of pBuf
  179.     //              lHeaderSize will cotain the size of the header.  -1 means
  180.     //              the rest of the stream is the header.
  181.     // Returns:     1 if it found a header, otherwise 0
  182.     // Author:      cts
  183.     ///////////////////////////////////////////////////////////////////////////
  184.     BOOL CheckForHeaders(UINT8 *pBuf,
  185.                          UINT32 dwSize,
  186.                          INT32 &lHeaderSize);
  187.     // Status Functions
  188.     eHeaderType     GetHeaderType();
  189.     INT16           GetSyncWord() {return 0xFF00 + m_ySyncWord;}
  190.     // Check syncword
  191.     BOOL            IsValidSyncWord(BYTE cSync);
  192.     void            SetTrustPackets(BOOL bTrust) { m_bTrustPackets = bTrust; }
  193.     // Functions to access the Id3 header values
  194.     UINT8*  GetId3Title(int &nLen);
  195.     UINT8*  GetId3Artist(int &nLen);
  196.     UINT8*  GetId3Album(int &nLen);
  197.     UINT8*  GetId3Genre(int &nLen);
  198.     int     GetMetaOffset();
  199.     int     GetMetaRepeat();
  200. private:
  201.     typedef BOOL (*GET_DATA_OFFSET)(UINT8 *,
  202.                                     UINT32,
  203.                                     int &,
  204.                                     int &,
  205.                                     int &,
  206.                                     int);
  207.     static BOOL GetDataOffsetMPEG1(UINT8 *pHeader,
  208.                                    UINT32 dwSize,
  209.                                    int &nFrameSize,
  210.                                    int &nHeaderSize,
  211.                                    int &nDataOffset,
  212.                                    int trustPackets);
  213.     static BOOL GetDataOffsetMPEG2(UINT8 *pHeader,
  214.                                    UINT32 dwSize,
  215.                                    int &nFrameSize,
  216.                                    int &nHeaderSize,
  217.                                    int &nDataOffset,
  218.                                    int trustPackets);
  219.     
  220.     CMp3Misc*   m_pMisc;
  221.     int         m_nLayer;       // Layer of MPEG Audio stream
  222.     BOOL        m_bMpeg25;      // Is this MPEG 2.5
  223.     BOOL        m_bTrustPackets;
  224.     GET_DATA_OFFSET m_pFnGetData;   // GetDataOffset Function
  225. };
  226. inline BOOL CMp3Format::IsValidSyncWord(BYTE cSync)
  227. {
  228.     // We check here everything except the
  229.     // least-significant bit (the redundancy bit)
  230.     return (cSync & 0xFE) == (m_ySyncWord & 0xFE);
  231. }
  232. #endif