Home | History | Annotate | Download | only in include
      1 /* ------------------------------------------------------------------
      2  * Copyright (C) 1998-2009 PacketVideo
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
     13  * express or implied.
     14  * See the License for the specific language governing permissions
     15  * and limitations under the License.
     16  * -------------------------------------------------------------------
     17  */
     18 
     19 // -*- c++ -*-
     20 // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
     21 
     22 //                       M P 3   P A R S E R
     23 
     24 // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
     25 
     26 
     27 /**
     28  *  @file mp3parser.h
     29  *  @brief This include file contains the definitions for the actual MP3
     30  *  file parser.
     31  */
     32 
     33 #ifndef MP3PARSER_H_INCLUDED
     34 #define MP3PARSER_H_INCLUDED
     35 
     36 
     37 //----------------------------------------------------------------------
     38 // Include Files
     39 //----------------------------------------------------------------------
     40 #ifndef OSCL_BASE_H_INCLUDED
     41 #include "oscl_base.h"
     42 #endif
     43 #ifndef OSCL_FILE_IO_H_INCLUDED
     44 #include "oscl_file_io.h"
     45 #endif
     46 #ifndef OSCL_MEDIA_DATA_H
     47 #include "oscl_media_data.h"
     48 #endif
     49 #ifndef PVFILE_H_INCLUDED
     50 #include "pvfile.h"
     51 #endif
     52 #ifndef IMP3FF_H_INCLUDED
     53 #include "imp3ff.h"
     54 #endif
     55 #ifndef PV_GAU_H_
     56 #include "pv_gau.h"
     57 #endif
     58 #ifndef PV_ID3_PARCOM_H_INCLUDED
     59 #include "pv_id3_parcom.h"
     60 #endif
     61 #ifndef MP3_UTILS_H_INCLUDED
     62 #include "mp3utils.h"
     63 #endif
     64 #ifndef __MEDIA_CLOCK_CONVERTER_H
     65 #include "media_clock_converter.h"
     66 #endif
     67 #ifndef PVLOGGER_H_INCLUDED
     68 #include "pvlogger.h"
     69 #endif
     70 
     71 //----------------------------------------------------------------------
     72 // Global Type Declarations
     73 //----------------------------------------------------------------------
     74 
     75 //----------------------------------------------------------------------
     76 // Global Constant Declarations
     77 //----------------------------------------------------------------------
     78 
     79 
     80 //----------------------------------------------------------------------
     81 // Global Data Declarations
     82 //----------------------------------------------------------------------
     83 
     84 
     85 //======================================================================
     86 //  CLASS DEFINITIONS and FUNCTION DECLARATIONS
     87 //======================================================================
     88 
     89 #define MIN_RANDOM_FRAMES_TO_SCAN 4
     90 #define MIN_RANDOM_LOCATION_TO_SCAN 30
     91 
     92 #define STR_VBRI_HEADER_IDENTIFIER "VBRI"
     93 #define STR_XING_HEADER_IDENTIFIER "Xing"
     94 #define STR_INFO_HEADER_IDENTIFIER "Info"
     95 
     96 #define VBR_HEADER_SIZE 0x04
     97 #define VBRI_HEADER_OFFSET 0x0024
     98 
     99 #define DEFAULT_NUM_FRAMES_TO_SCAN 20
    100 #define ID3_V1_TAG_SIZE 128
    101 
    102 #define MAX_TOC_ENTRY_COUNT 200
    103 
    104 typedef struct mp3Header_tag
    105 {
    106     int32 SamplingRate;
    107     int32 BitRate;
    108     int32 FrameLengthInBytes;
    109     int32 FrameSizeUnComp;
    110     int32 NumberOfChannels;
    111 } MP3ConfigInfoType;
    112 
    113 typedef struct mp3HeaderInfo_tag
    114 {
    115     int32 frameVer;
    116     int32 layerID;
    117     int32 crcFollows;
    118     int32 brIndex;
    119     int32 srIndex;
    120     int32 prvBit;
    121     int32 padBit;
    122     int32 chMode;
    123     int32 modeExtn;
    124     int32 frameSize;
    125 } MP3HeaderType;
    126 
    127 // XING Header for VBR Support
    128 // A XING Header may be present in the ancilary data field of
    129 // the first frame of an mp3 bitsream
    130 // The Xing header (optionally) contains:
    131 //    frames   the total number of frames in the audio bitstream
    132 //    bytes    total number of bytes in the bitstream
    133 //    toc      table of contents
    134 // TOC (Table Of Contents) gives seek points for random access
    135 // the ith entry determines the seek point for i-percent duration
    136 // Seek point in bytes = (toc[i]/256.0)*total_bitstream_bytes
    137 // e.g. half seek point = (toc[50]/256.0)*total_bitstream_bytes
    138 typedef struct xingHeader_tag
    139 {
    140     int32 hId;            // from MPG Header (0=Mpeg2, 1=MPEG1)
    141     int32 sampRate;       // determined from header
    142     int32 flags;          // from Xing Header data
    143     int32 frames;         // total bitstream frames from xing header
    144     int32 bytes;          // total bitstream bytes from Xing header
    145     int32 vbr_scale;      // encoded VBR scale from Xing header data
    146     int32 TOC[100];       // pointer to TOC[100], maybe NULL
    147 } XINGHeaderType;
    148 // End of XING VBR Header Support
    149 
    150 typedef struct vbriHeader_tag
    151 {
    152     int32 hId;
    153     int32 vId;
    154     int32 delay;
    155     int32 bytes;
    156     int32 frames;
    157     int32 entriesTOC;
    158     int32 scale;
    159     int32 sTableEntry;
    160     int32 fTableEntry;
    161     int32 *TOC;
    162     int32 sampleRate;
    163 } VBRIHeaderType;
    164 
    165 
    166 typedef enum VBRType
    167 {
    168     EXINGType,
    169     EVBRIType,
    170     ECBRType,
    171     EVBRType,  // to take care of case where there is no xing or VBRI hdr present
    172     EINVALIDType
    173 }   MP3FileType;
    174 
    175 
    176 /**
    177  *  @brief The MP3Parser Class is the class that parses the
    178  *  MP3 file.
    179  */
    180 
    181 class MP3Parser
    182 {
    183 
    184     public:
    185         /**
    186         * @brief Constructor.
    187         *
    188         * @param Filehandle
    189         * @returns None
    190         */
    191         MP3Parser(PVFile* aFileHandle = NULL);
    192 
    193         /**
    194         * @brief Destructor.
    195         *
    196         * @param None
    197         * @returns None
    198         */
    199         ~MP3Parser();
    200 
    201         /**
    202         * @brief Parses the MetaData (beginning or end) and positions
    203         * the file pointer at the first audio frame.
    204         *
    205         * @param fpUsed Pointer to file
    206         * @param enableCRC, CRC check flag
    207         * @returns error type.
    208         */
    209         MP3ErrorType    ParseMP3File(PVFile * fpUsed, bool enableCRC);
    210 
    211         /**
    212         * @brief Checks the file is valid mp3 clip or not
    213         *
    214         * @param fpUsed Pointer to file
    215         * @param filename Name of file
    216         * @returns error type.
    217         */
    218         MP3ErrorType IsMp3File(MP3_FF_FILE* aFile, uint32 aInitSearchFileSize);
    219 
    220         /**
    221         * @brief Sets the file size to the parser
    222         *
    223         * @param aFileSize
    224         * @returns error type.
    225         */
    226         MP3ErrorType SetFileSize(const uint32 aFileSize);
    227 
    228         /**
    229         * @brief Attempts to read in the number of MP3 frames specified by n.
    230         * It formats and stores the data read in the GAU structure.
    231         *
    232         * @param n Pointer to the number of frames to read
    233         * @param pgau Pointer to data read
    234         * @returns Number of bytes read
    235         */
    236         int32   GetNextBundledAccessUnits(uint32 *n, GAU *pgau, MP3ErrorType &err);
    237 
    238         /**
    239         * @brief Peeks into the next MP3 frames specified by n.
    240         * It formats and stores the data read in the MediaMetaInfo structure.
    241         *
    242         * @param n Pointer to the number of frames to check
    243         * @param mInfo Pointer to info read
    244         * @returns Number of bytes read
    245         */
    246         int32   PeekNextBundledAccessUnits(uint32 *n, MediaMetaInfo *mInfo);
    247 
    248         /**
    249         * @brief Reads the next frame from the file
    250         *
    251         * @param buf Buffer to read the frame data into
    252         * @param size Size of the buffer
    253         * @param framesize Size of the frame data if the read is successful
    254         * @param timestamp Timestamp for the frame if the read is successful
    255         * @returns Result of operation: true=success; false=fail
    256         */
    257         MP3ErrorType  GetNextMediaSample(uint8 *buf, uint32 bufsize, uint32& framesize, uint32& timestamp);
    258 
    259         /**
    260         * @brief Returns the timestamp of the frame
    261         *
    262         * @param number of the frame to retrieve the timestamp of
    263         * @returns Timestamp
    264         */
    265         uint32  GetTimestampForSample(int32 frameNumber) const;
    266         uint32  GetTimestampForCurrentSample() const;
    267 
    268         /**
    269         * @brief Moves the file pointer to the specified timestamp
    270         *
    271         * @param timestamp Time to seek to
    272         * @returns Timestamp seeked to
    273         */
    274         uint32  SeekToTimestamp(uint32 timestamp);
    275 
    276         /**
    277         * @brief Queries the seek point timestamp corresponding to the specified timestamp
    278         *
    279         * @param timestamp Time to seek to
    280         * @param frameNumber Number of frame associated with the seek
    281         * @returns Timestamp closest to the specified timestamp. If timestamp is past end of clip, timestamp is 0.
    282         */
    283         uint32 SeekPointFromTimestamp(uint32 &timestamp);
    284 
    285         /**
    286         * @brief Queries the offset corressponding to the given timestamp
    287         *
    288         * @param timestamp Time to seek to
    289         * @param frameNumber Number of frame associated with the seek
    290         * @returns offset
    291         */
    292         uint32 GetFileOffsetForAutoResume(uint32 &timestamp);
    293 
    294         /**
    295         * @brief Reads the MP3 header. This contains audio settings
    296         * necessary to configure the device.
    297         *
    298         * @param pMP3COnfig Data structure that will contain the header
    299         * @returns True if successful; False otherwise
    300         */
    301         bool GetMP3FileHeader(MP3ConfigInfoType * pMP3COnfig);
    302 
    303         /**
    304         * @brief Retreives and returns channel mode for the current
    305         * of mp3 file
    306         *
    307         * @param
    308         * @returns
    309         */
    310         uint32 GetChannelMode() const;
    311 
    312         /**
    313         * @brief Returns the content of decoder specific info.
    314         *
    315         * @param None
    316         * @returns Decoder specific info
    317         */
    318         uint8 const * GetDecoderSpecificInfoContent() const;
    319 
    320         /**
    321         * @brief Returns the size of decoder specific info.
    322         *
    323         * @param None
    324         * @returns Decoder specific info size
    325         */
    326         uint32  GetDecoderSpecificInfoSize();
    327 
    328         /**
    329         * @brief Returns the number of frames in the clip.
    330         *
    331         * @param None
    332         * @returns Number of frames
    333         */
    334         uint32  GetSampleCountInFile();
    335 
    336         /**
    337         * @brief Returns the maximum decode buffer size used.
    338         *
    339         * @param None
    340         * @returns Buffer size
    341         */
    342         uint32  GetMaximumDecodeBufferSize();
    343 
    344         /**
    345         * @brief Returns the size of the file.
    346         *
    347         * @param None
    348         * @returns File size
    349         */
    350         uint32  GetFileSize();
    351 
    352         /**
    353         * @brief Returns the duration of the file.
    354         *
    355         * @param None
    356         * @returns Clip duration
    357         */
    358         uint32  GetDuration(bool aMetadataDuration = false);
    359 
    360         /**
    361         * @brief Returns the approximate duration of downloaded data.
    362         *
    363         * @param aFileSize, aNPTInMS
    364         * @returns aNPTInMS
    365         */
    366         int32 ConvertSizeToTime(uint32 aFileSize, uint32& aNPTInMS);
    367 
    368         /**
    369         * @brief outputs the size of id3v2 tags
    370         *
    371         * @param aSize, carries the tag size
    372         * @returns success if meta data is parsed, failure otherwise
    373         */
    374         MP3ErrorType GetMetadataSize(uint32 &aSize);
    375 
    376         /**
    377         * @brief Retrieves minimum bytes required for getting the config info
    378         *
    379         * @param
    380         * @returns byte size of firstframe and id3 tags.
    381         */
    382         uint32 GetMinBytesRequired(bool aNextBytes = false);
    383 
    384         /**
    385         * @brief Copies the metadata to the structure specified.
    386         *
    387         * @param None
    388         * @returns Always 0.
    389         */
    390         uint32  GetMetaData(PvmiKvpSharedPtrVector &pMetaData)
    391         {
    392             iId3TagParser.GetID3Frames(iId3Frames);
    393             pMetaData = iId3Frames;
    394             return 0;
    395         }
    396         uint32 GetMetaData(const OSCL_String& pFrameType, PvmiKvpSharedPtrVector &pMetaData)
    397         {
    398             iId3TagParser.GetID3Frame(pFrameType, pMetaData);
    399             return 0;
    400         }
    401         bool IsID3Frame(const OSCL_String& pFrameType)
    402         {
    403             return iId3TagParser.IsID3FrameAvailable(pFrameType);
    404         }
    405 
    406         MP3ErrorType ScanMP3File(PVFile * fpUsed, uint32 aFramesToScan);
    407     private:
    408         MP3ErrorType ScanMP3File(PVFile* fpUsed);
    409         MP3ErrorType GetDurationFromVBRIHeader(uint32 &aDuration);
    410         MP3ErrorType GetDurationFromRandomScan(uint32 &aDuration);
    411         MP3ErrorType ComputeDurationFromNRandomFrames(PVFile * fpUsed, int32 aNumFrames = MIN_RANDOM_FRAMES_TO_SCAN, int32 aNumRandomLoc = MIN_RANDOM_LOCATION_TO_SCAN);
    412         void GetDurationFromCompleteScan(uint32 &aClipDuration);
    413 
    414         MP3ErrorType EstimateDurationFromExternalFileSize(uint32 &aClipDuration);
    415 
    416         uint32 GetDurationFromMetadata();
    417 
    418         MP3ErrorType FillTOCTable(uint32 aFilePos, uint32 aTimeStampToFrame);
    419 
    420         //duration related values
    421         uint32 iClipDurationInMsec;
    422         uint32 iClipDurationFromEstimation;
    423         uint32 iClipDurationComputed;
    424         uint32 iClipDurationFromVBRIHeader;
    425         uint32 iClipDurationFromRandomScan;
    426         uint32 iClipDurationFromMetadata;
    427         bool iDurationScanComplete;
    428         uint32 iTimestamp;
    429         int32 iAvgBitrateInbpsFromRandomScan;
    430         int32 iAvgBitrateInbps;
    431         int32 iAvgBitrateInbpsFromCompleteScan;
    432 
    433 
    434     protected:
    435         uint32 iLocalFileSize;
    436         uint32 iFileSizeFromExternalSource;
    437         uint32 iInitSearchFileSize;
    438         bool iLocalFileSizeSet;
    439         PVFile * fp;
    440         MediaClockConverter iClockConverter;
    441         bool iFirstScan;
    442         uint32 iLastScanPosition;
    443         bool iScanEnable;
    444 
    445     private:
    446         MP3ErrorType IsValidFrame(uint8 * pBuffer, uint32 offset, uint32 seekPoint, PVFile* aFile = NULL);
    447         MP3ErrorType IsValidFrameHeader(uint8 * mp3FrameHeader, bool &bCRCPresent, uint32 offset, uint32 seekPoint, PVFile* aFile = NULL);
    448         bool  IsValidFrameCRC(uint8 *pFrame, int32 size, uint32 crcValue);
    449 
    450         bool GetMP3Header(uint32 &fh, MP3HeaderType &hi);
    451         bool DecodeMP3Header(MP3HeaderType &aHeaderInfoType, MP3ConfigInfoType &aConfigInfoType, bool aComputeAvgBitrate);
    452         bool DecodeXINGHeader(uint8 *XingBuffer, XINGHeaderType &mp3XingHI, MP3HeaderType &hi);
    453         bool DecodeVBRIHeader(uint8 * VbriBuffer, VBRIHeaderType &vbriHDI, MP3HeaderType &hi);
    454         MP3ErrorType mp3FindSync(uint32 seekPoint, uint32 &syncOffset, PVFile* aFile);
    455         uint16 CalcCRC16(uint8* pBuffer, uint32 dwBitSize);
    456         MP3ErrorType mp3VerifyCRC(MP3HeaderType mp3HdrInfo, MP3ConfigInfoType mp3CI);
    457 
    458 
    459         /* scan file related */
    460         uint32 iScannedFrameCount;
    461         /* toc related */
    462         int32* iTOC;
    463         uint32 iTOCFilledCount;
    464         uint32 iTimestampPrev;
    465         uint32 iScanTimestamp;
    466         uint32 iBinWidth;
    467 
    468         uint32 iSamplingRate;
    469         uint32 iSamplesPerFrame;
    470 
    471         int32 CalculateBufferSizeForHeader(uint8 *VbriHead);
    472         int32 iCurrFrameNumber;
    473         int32 iNumberOfFrames;
    474 
    475         bool bVBRFile;
    476         uint8 ConfigData[4];
    477         uint32 ConfigSize;
    478         uint32 StartOffset;
    479         uint8 * pSyncBuffer;
    480         uint32 iMaxSyncBufferSize;
    481 
    482         MP3ConfigInfoType  iMP3ConfigInfo;
    483         MP3HeaderType      iMP3HeaderInfo;
    484         XINGHeaderType     iXingHeader;
    485         PVID3ParCom    iId3TagParser;
    486         VBRIHeaderType iVbriHeader;
    487         bool iEnableCrcCalc;
    488         MP3FileType mp3Type;
    489         uint32 iTagSize;
    490         PvmiKvpSharedPtrVector iId3Frames;
    491 };
    492 
    493 #endif // #ifdef MP3PARSER_H_INCLUDED
    494