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 /*     -------------------------------------------------------------------       */
     20 /*                            MPEG-4 Mpeg4File Class                             */
     21 /*     -------------------------------------------------------------------       */
     22 /*********************************************************************************/
     23 /*
     24     The Mpeg4File Class is the class that will construct and maintain all the
     25     mecessary data structures to be able to render a valid MP4 file to disk.
     26     Format.
     27 */
     28 
     29 #ifndef IMPEG4FILE_H_INCLUDED
     30 #define IMPEG4FILE_H_INCLUDED
     31 
     32 #ifndef OSCL_BASE_H_INCLUDED
     33 #include "oscl_base.h"
     34 #endif
     35 
     36 #ifndef OSCL_MEM_H_INCLUDED
     37 #include "oscl_mem.h"
     38 #endif
     39 
     40 #ifndef OSCL_STRING_CONTAINERS_H_INCLUDED
     41 #include "oscl_string_containers.h"
     42 #endif
     43 
     44 //HEADER FILES REQD FOR MULTIPLE SAMPLE RETRIEVAL API
     45 #ifndef OSCL_MEDIA_DATA_H_INCLUDED
     46 #include "oscl_media_data.h"
     47 #endif
     48 #ifndef PV_GAU_H_INCLUDED
     49 #include "pv_gau.h"
     50 #endif
     51 
     52 #ifndef TEXTSAMPLEENTRY_H_INCLUDED
     53 #include "textsampleentry.h"
     54 #endif
     55 #ifndef FONTRECORD_H_INCLUDED
     56 #include "fontrecord.h"
     57 #endif
     58 
     59 #ifndef ATOMDEFS_H_INCLUDED
     60 #include "atomdefs.h"
     61 #endif
     62 
     63 #ifndef PV_MP4FFPARSER_CONFIG_H_INCLUDED
     64 #include "pv_mp4ffparser_config.h"
     65 #endif
     66 
     67 /* CPM Related Header Files */
     68 #ifndef CPM_H_INCLUDED
     69 #include "cpm.h"
     70 #endif
     71 #include "pv_id3_parcom_types.h"
     72 
     73 class OsclFileHandle;
     74 class PvmiDataStreamObserver;
     75 class AVCSampleEntry;
     76 /*------------- Interface of Class Mpeg4 File ----------------*/
     77 class IMpeg4File : public ISucceedFail
     78 {
     79     public:
     80         virtual ~IMpeg4File() {} // So the Mpeg4File destructor gets called when delete the interface
     81 
     82         // MEDIA DATA APIS
     83 
     84         /* Returns media samples for the requested tracks
     85            id:  The track ID of the track from which the method is to retrieve the samples.
     86            buf: A pointer to the buffer into which to place the sample.
     87            size:    The size of the data buffer
     88            index:   An output parameter which is the index of the sample entry to which the returned sample refers.
     89            return:  The size in bytes of the data placed into the provided buffer.  If the buffer is not large enough, the return value is the negative of the size that is needed.
     90         */
     91         virtual int32 getNextMediaSample(uint32 id, uint8 *buf, uint32 &size, uint32 &index, uint32 &SampleOffset) = 0;
     92 
     93         virtual int32 getMediaSample(uint32 id, uint32 sampleNumber, uint8 *buf, int32 &size, uint32 &index, uint32 &SampleOffset) = 0;
     94 
     95         virtual int32 getOffsetByTime(uint32 id, uint32 ts, int32* sampleFileOffset, uint32 jitterbuffersize) = 0;
     96 
     97         virtual int32 updateFileSize(uint32 filesize) = 0;
     98 
     99         virtual MP4_ERROR_CODE getKeyMediaSampleNumAt(uint32 aTrackId,
    100                 uint32 aKeySampleNum,
    101                 GAU    *pgau) = 0;
    102         virtual int32 getPrevKeyMediaSample(uint32 inputtimestamp,
    103                                             uint32 &aKeySampleNum,
    104                                             uint32 id,
    105                                             uint32 *n,
    106                                             GAU    *pgau) = 0;
    107         virtual int32 getNextKeyMediaSample(uint32 inputtimestamp,
    108                                             uint32 &aKeySampleNum,
    109                                             uint32 id,
    110                                             uint32 *n,
    111                                             GAU    *pgau) = 0;
    112 
    113         /* Returns the timestamp for the previously returned media samples from the requested track
    114            id:  The track ID of the track from which the method is to retrieve the sample timestamp.
    115            return:  The timestamp of the most recently return media sample in the "media timescale"
    116         */
    117         virtual uint32 getMediaTimestampForCurrentSample(uint32 id) = 0;
    118 
    119 
    120         // META DATA APIS
    121 
    122         // From PVUserDataAtom 'pvmm'
    123         virtual OSCL_wString& getPVVersion(MP4FFParserOriginalCharEnc &charType) = 0;       // return _version string
    124         virtual OSCL_wHeapString<OsclMemAllocator> getCreationDate(MP4FFParserOriginalCharEnc &charType) = 0;   // return _creationDate string
    125 
    126         // from 'ftyp' atom
    127         virtual uint32 getCompatibiltyMajorBrand() = 0;
    128         virtual uint32 getCompatibiltyMajorBrandVersion() = 0;
    129         virtual Oscl_Vector<uint32, OsclMemAllocator> *getCompatibiltyList() = 0;
    130 
    131         // From Movie
    132         virtual int32 getNumTracks() = 0;
    133         virtual int32 getTrackIDList(uint32 *ids, int size) = 0;
    134         virtual uint32 getTrackWholeIDList(uint32 *ids) = 0;
    135 
    136         // From MovieHeader
    137         virtual uint64 getMovieDuration() const = 0;
    138         virtual uint32 getMovieTimescale() const = 0;
    139 
    140 
    141         // From TrackHeader
    142         virtual uint64 getTrackDuration(uint32 id) = 0; // in movie timescale
    143 
    144         // From TrackReference
    145         // Returns the track ID of the track on which this track depends
    146         virtual uint32 trackDependsOn(uint32 id) = 0;
    147 
    148         // From MediaHeader
    149         virtual uint64 getTrackMediaDuration(uint32 id) = 0;
    150         virtual uint32 getTrackMediaTimescale(uint32 id) = 0;
    151         virtual uint16 getTrackLangCode(uint32 id) = 0;
    152 
    153         // From Handler
    154         // Returns the 4CC of the track media type (i.e. 'vide' for video)
    155         virtual uint32 getTrackMediaType(uint32 id) = 0;
    156 
    157         // From SampleDescription
    158         // Returns the number of sample entries stored in the sample description
    159         virtual int32 getTrackNumSampleEntries(uint32 id) = 0;
    160 
    161         // From DecoderConfigDescriptor
    162         virtual void getTrackMIMEType(uint32 id, OSCL_String& aMimeType) = 0; // Based on OTI and string tables
    163 
    164         virtual int32  getTrackMaxBufferSizeDB(uint32 id) = 0;
    165         virtual int32  getTrackAverageBitrate(uint32 id) = 0;
    166 
    167         virtual uint8 *getTrackDecoderSpecificInfoContent(uint32 id) = 0;
    168         virtual uint32 getTrackDecoderSpecificInfoSize(uint32 id) = 0;
    169         virtual DecoderSpecificInfo *getTrackDecoderSpecificInfoAtSDI(uint32 trackID, uint32 index) = 0;
    170 
    171         virtual uint32 getTimestampForSampleNumber(uint32 id, uint32 sampleNumber) = 0;
    172         virtual int32 getSampleSizeAt(uint32 id, int32 sampleNum) = 0;
    173 
    174         //From PASP atom
    175         virtual uint32 getHspacing(uint32 id) = 0;
    176         virtual uint32 getVspacing(uint32 id) = 0;
    177 
    178 
    179 
    180         // MPEG4 header retrieval methods
    181         virtual int32 getFileType() const = 0;
    182         virtual int32 getScalability() const = 0;
    183 
    184         virtual int32 getTimestampForRandomAccessPoints(uint32 id, uint32 *num, uint32 *tsBuf, uint32* numBuf, uint32* offsetBuf = NULL) = 0;
    185         virtual int32 getTimestampForRandomAccessPointsBeforeAfter(uint32 id, uint32 ts, uint32 *tsBuf, uint32* numBuf,
    186                 uint32 &numsamplestoget,
    187                 uint32 howManyKeySamples = 1) = 0;
    188 
    189         // Static method to read in an MP4 file from disk and return the IMpeg4File interface
    190         OSCL_IMPORT_REF static IMpeg4File *readMP4File(OSCL_wString& aFilename,
    191                 PVMFCPMPluginAccessInterfaceFactory* aCPMAccessFactory,
    192                 OsclFileHandle* aHandle = NULL,
    193                 uint32 aParsingMode = 0,
    194                 Oscl_FileServer* aFileServSession = NULL);
    195 
    196         OSCL_IMPORT_REF static void DestroyMP4FileObject(IMpeg4File* aMP4FileObject);
    197 
    198         virtual bool CreateDataStreamSessionForExternalDownload(OSCL_wString& aFilename,
    199                 PVMFCPMPluginAccessInterfaceFactory* aCPMAccessFactory,
    200                 OsclFileHandle* aHandle = NULL,
    201                 Oscl_FileServer* aFileServSession = NULL) = 0;
    202 
    203         virtual void DestroyDataStreamForExternalDownload() = 0;
    204 
    205         virtual void resetPlayback() = 0;
    206         virtual uint32 resetPlayback(uint32 time, uint16 numTracks, uint32 *trackList, bool bResetToIFrame = true) = 0;
    207         virtual int32 queryRepositionTime(uint32 time,
    208                                           uint16 numTracks,
    209                                           uint32 *trackList,
    210                                           bool bResetToIFrame = true,
    211                                           bool bBeforeRequestedTime = true) = 0;
    212 
    213         virtual int32 querySyncFrameBeforeTime(uint32 time, uint16 numTracks, uint32 *trackList) = 0;
    214 
    215         virtual int32 getNextBundledAccessUnits(const uint32 id,
    216                                                 uint32 *n,
    217                                                 GAU    *pgau) = 0;
    218 
    219         virtual int32 peekNextBundledAccessUnits(const uint32 id,
    220                 uint32 *n,
    221                 MediaMetaInfo *mInfo) = 0;
    222 
    223         virtual uint32 getSampleCountInTrack(uint32 id) = 0;
    224 
    225         virtual uint32 getAssetInfoClassificationEntity(int32 index = 0) const = 0;
    226         virtual uint16 getAssetInfoClassificationTable(int32 index = 0) const = 0;
    227         virtual uint16 getAssetInfoClassificationLangCode(int32 index = 0) const = 0;
    228         virtual OSCL_wString& getAssetInfoClassificationNotice(MP4FFParserOriginalCharEnc &charType, int32 index = 0) const = 0;
    229         virtual uint16 getAssetInfoNumKeyWords(int32 index = 0) const = 0;
    230         virtual uint16 getAssetInfoKeyWordLangCode(int32 index = 0) const = 0;
    231         virtual OSCL_wString& getAssetInfoKeyWord(int32 atomIndex, int32 keyWordIndex) const = 0;
    232         virtual int32 getNumAssetInfoClassificationAtoms() = 0;
    233         virtual int32 getNumAssetInfoKeyWordAtoms() = 0;
    234         virtual int32 getNumAssetInfoLocationAtoms() = 0;
    235 
    236         virtual PvmfAssetInfo3GPPLocationStruct *getAssetInfoLocationStruct(int32 index = 0) const = 0;
    237         virtual uint8 getAssetInfoAlbumTrackNumber(int32 index = 0) = 0;
    238 
    239         //id3
    240         virtual PVID3Version GetID3Version() const = 0;
    241         virtual void GetID3MetaData(PvmiKvpSharedPtrVector &id3Frames) = 0;
    242 
    243         virtual bool IsTFRAPresentForAllTrack(uint32 numTracks, uint32 *trackList) = 0;
    244         virtual uint32 getNumKeyFrames(uint32 trackid) = 0;
    245 
    246         virtual int16 getLayer(uint32 trackid) = 0;
    247         virtual uint16 getAlternateGroup(uint32 trackid) = 0;
    248 
    249         virtual int32 getVideoFrameHeight(uint32 trackid) = 0;
    250         virtual int32 getVideoFrameWidth(uint32 trackid) = 0;
    251 
    252         virtual int32 getTextTrackWidth(uint32 trackid) = 0;
    253         virtual int32 getTextTrackHeight(uint32 trackid) = 0;
    254         virtual int32 getTextTrackXOffset(uint32 trackid) = 0;
    255         virtual int32 getTextTrackYOffset(uint32 trackid) = 0;
    256         virtual SampleEntry *getTextSampleEntryAt(uint32 trackid, uint32 index) = 0;
    257 
    258 
    259         OSCL_IMPORT_REF static int32 IsXXXable(OSCL_wString& filename,
    260                                                int32 &metaDataSize,
    261                                                int32  &oMoovBeforeMdat,
    262                                                uint32 *pMajorBrand,
    263                                                uint32 *pCompatibleBrands,
    264                                                Oscl_FileServer* fileServSession = NULL);
    265 
    266 
    267         OSCL_IMPORT_REF static int32 IsXXXable(Oscl_File* fileRef,
    268                                                int32 &metaDataSize,
    269                                                int32  &oMoovBeforeMdat,
    270                                                uint32 *pMajorBrand,
    271                                                uint32 *pCompatibleBrands);
    272 
    273         virtual bool IsMobileMP4() = 0;
    274 
    275         virtual int32 getNumAMRFramesPerSample(uint32 trackID) = 0;
    276 
    277         virtual uint8 parseBufferAndGetNumAMRFrames(uint8* buffer, uint32 size) = 0;
    278 
    279         virtual uint32 getNumAVCSampleEntries(uint32 trackID) = 0;
    280 
    281         virtual AVCSampleEntry* getAVCSampleEntry(uint32 trackID, uint32 index = 0) = 0;
    282 
    283         virtual uint32 getAVCNALLengthSize(uint32 trackID, uint32 index = 0) = 0;
    284 
    285         /*
    286          * @param Oscl_File* filePtr - File pointer to the MP4/3GP
    287          * file. Please note that the file open and close are handled by the
    288          * caller.
    289          *
    290          * @param uint32 fileSize - Size of the downloaded file, thus far.
    291          *
    292          *
    293          * @param bool& oIsProgressiveDownloadable - Set to true if the clip is
    294          * is progressive dowmloadable.
    295          *
    296          * @param uint32& metaDataSize - If the clip is progressive
    297          * downloadable then this API also returns the meta data size. Player
    298          * needs to wait for the file to grow past the metaDataSize before
    299          * starting playback.This param is valid only if oIsProgressiveDownloadable
    300          * is set to TRUE.
    301          *
    302          * @return MP4_ERROR_CODE - EVERYTHING_FINE, if a conclusion is reached
    303          * either way on whether a clip is progressive downloadable or not.
    304          * INSUFFICIENT_DATA, if more calls to this API are needed to reach a
    305          * decision
    306          * Any other return value indicates error.
    307          */
    308         OSCL_IMPORT_REF static MP4_ERROR_CODE IsProgressiveDownloadable(Oscl_File* filePtr,
    309                 uint32  fileSize,
    310                 bool& oIsProgressiveDownloadable,
    311                 uint32& metaDataSize);
    312 
    313         /*
    314          * @param aCPMAccessFactory aCPMAccessFactory - Pointer to the datastream
    315          * factory.
    316          *
    317          * @param bool& oIsProgressiveDownloadable - Set to true if the clip is
    318          * is progressive dowmloadable.
    319          *
    320          * @param uint32& metaDataSize - If the clip is progressive
    321          * downloadable then this API also returns the meta data size. Player
    322          * needs to wait for the file to grow past the metaDataSize before
    323          * starting playback.This param is valid only if oIsProgressiveDownloadable
    324          * is set to TRUE.
    325          *
    326          * @return MP4_ERROR_CODE - EVERYTHING_FINE, if a conclusion is reached
    327          * either way on whether a clip is progressive downloadable or not.
    328          * INSUFFICIENT_DATA, if more calls to this API are needed to reach a
    329          * decision
    330          * Any other return value indicates error.
    331          */
    332         OSCL_IMPORT_REF static MP4_ERROR_CODE GetMetaDataSize(PVMFCPMPluginAccessInterfaceFactory* aCPMAccessFactory,
    333                 bool& oIsProgressiveDownloadable,
    334                 uint32& metaDataSize);
    335 
    336 
    337         /*
    338          * This API return the timestamp of a sample that is closest to the given
    339          * fileSize.
    340          *
    341          * @param trackID
    342          *
    343          * @param fileSize
    344          *
    345          * @param uint32& timeStamp
    346          *
    347          * @return EVERYTHING_FINE - In case a valid sample and corresponding time
    348          * stamp was located.
    349          * INSUFFICIENT_DATA in case the very first sample location is past the fileSize
    350          * NOT_SUPPORTED - in case "parsingMode" is set to 1, in "readMP4File"
    351          * call
    352          * Any other return value indicates ERROR.
    353          *
    354          */
    355 
    356         MP4_ERROR_CODE virtual getMaxTrackTimeStamp(uint32 trackID,
    357                 uint32 fileSize,
    358                 uint32& timeStamp) = 0;
    359 
    360         /*
    361          * This API returns the closest sample number, prior to the required timestamp
    362          * The timestamp is assumed to be in media time scale, hence no timescale
    363          * conversions are performed internally.Closest frame number is returned in
    364          * the argument "sampleNumber", and it is offset by "sampleOffset".
    365          *
    366          * @param trackID
    367          *
    368          * @param frameNumber
    369          *
    370          * @param timeStamp
    371          *
    372          * @param frameOffset
    373          *
    374          * @return MP4_ERROR_CODE
    375          * In case the frameNumber closest to timestamp plus frameOffset falls
    376          * beyond the track boundary, frameNumber is set to total number of samples
    377          * per track and the return code is "END_OF_TRACK".In other error scenarios
    378          * (like invalid timestamps, some missing atoms etc) frameNumber is set to
    379          * zero, and return code is "READ_FAILED". In case of normal operation,
    380          * return code is "EVERYTHING_FINE"
    381          */
    382         virtual MP4_ERROR_CODE getSampleNumberClosestToTimeStamp(uint32 trackID,
    383                 uint32 &sampleNumber,
    384                 uint32 timeStamp,
    385                 uint32 sampleOffset = 0) = 0;
    386 
    387         /*
    388          * This API returns the size of the "odkm" header if present at the
    389          * track level. If the "odkm" header were not present at the
    390          * track level, this API would return ZERO. Please note that
    391          * the "odkm" is only present for OMA2 protected content.
    392          */
    393         virtual uint32 getTrackLevelOMA2DRMInfoSize(uint32 trackID) = 0;
    394         /*
    395          * This API returns a buffer containing the "odkm" header if present at the
    396          * track level. If the "odkm" header were not present at the
    397          * track level, this API would return NULL. The memory buffer
    398          * returned is owned by the file parser lib. Please note that
    399          * the "odkm" is only present for OMA2 protected content.
    400          */
    401         virtual uint8* getTrackLevelOMA2DRMInfo(uint32 trackID) = 0;
    402 
    403         /*
    404          * This API is used to set a callback request on the datastream interface.
    405          */
    406         virtual MP4_ERROR_CODE RequestReadCapacityNotification(PvmiDataStreamObserver& aObserver,
    407                 uint32 aFileOffset,
    408                 OsclAny* aContextData = NULL) = 0;
    409 
    410         /*
    411          * This API is used to cancel the callback request on the datastream interface.
    412          */
    413         virtual MP4_ERROR_CODE CancelNotificationSync() = 0;
    414 
    415         /*
    416          * This API is used to get the current file size from the datastream interface.
    417          */
    418         virtual MP4_ERROR_CODE GetCurrentFileSize(uint32& aFileSize) = 0;
    419 
    420         virtual int32 getTrackTSStartOffset(uint32& aTSOffset, uint32 aTrackID) = 0;
    421 
    422         // ITunes Specific functions
    423 
    424         virtual OSCL_wHeapString<OsclMemAllocator> getITunesTool() const = 0;
    425         virtual OSCL_wHeapString<OsclMemAllocator> getITunesEncodedBy() const = 0;
    426         virtual OSCL_wHeapString<OsclMemAllocator> getITunesWriter() const = 0;
    427         virtual OSCL_wHeapString<OsclMemAllocator> getITunesGroupData() const = 0;
    428         virtual uint16 getITunesThisTrackNo() const = 0;
    429         virtual PvmfApicStruct* getITunesImageData() const = 0;
    430         virtual uint16 getITunesTotalTracks() const = 0;
    431         virtual bool IsITunesCompilationPart() const = 0;
    432         virtual bool IsITunesContentRating() const = 0;
    433         virtual uint16 getITunesBeatsPerMinute() const = 0;
    434         virtual uint16 getITunesThisDiskNo() const = 0;
    435         virtual uint16 getITunesTotalDisks() const = 0;
    436         virtual OSCL_wHeapString<OsclMemAllocator> getITunesNormalizationData() const = 0;
    437         virtual OSCL_wHeapString<OsclMemAllocator> getITunesCDIdentifierData(uint8 aCDdatanumIndex) = 0;
    438         virtual OSCL_wHeapString<OsclMemAllocator> getITunesCDTrackNumberData() const = 0;
    439         virtual OSCL_wHeapString<OsclMemAllocator> getITunesCDDB1Data() const = 0;
    440         virtual OSCL_wHeapString<OsclMemAllocator> getITunesLyrics() const = 0;
    441         virtual uint8 getITunesTotalCDIdentifierData() const = 0;
    442         virtual bool IsMovieFragmentsPresent() const = 0;
    443         //Returns the Subtitle of individual track
    444         virtual OSCL_wHeapString<OsclMemAllocator> getITunesTrackSubTitle() const = 0;
    445 
    446         // Reposition Related Video Track present API
    447         virtual void ResetVideoTrackPresentFlag() = 0;
    448 
    449         //APIs to return the no. of titles and their metadata values respectively.
    450         virtual uint32 getNumTitle() = 0;
    451         virtual PVMFStatus getTitle(uint32 index, OSCL_wString& aVal, uint16& aLangCode, MP4FFParserOriginalCharEnc& aCharEncType) = 0;
    452 
    453         //APIs to return the no. of authors and their metadata values respectively.
    454         virtual uint32 getNumAuthor() = 0;
    455         virtual PVMFStatus getAuthor(uint32 index, OSCL_wString& aVal, uint16& aLangCode, MP4FFParserOriginalCharEnc& aCharEncType) = 0;
    456 
    457         //APIs to return the no. of albums and their metadata values respectively.
    458         virtual uint32 getNumAlbum() = 0;
    459         virtual PVMFStatus getAlbum(uint32 index, OSCL_wString& aVal, uint16& aLangCode, MP4FFParserOriginalCharEnc& aCharEncType) = 0;
    460 
    461         //APIs to return the no. of artist and their metadata values respectively.
    462         virtual uint32 getNumArtist() = 0;
    463         virtual PVMFStatus getArtist(uint32 index, OSCL_wString& aVal, uint16& aLangCode, MP4FFParserOriginalCharEnc& aCharEncType) = 0;
    464 
    465         //APIs to return the no. of genre and their metadata values respectively.
    466         virtual uint32 getNumGenre() = 0;
    467         virtual PVMFStatus getGenre(uint32 index, OSCL_wString& aVal, uint16& aLangCode, MP4FFParserOriginalCharEnc& aCharEncType) = 0;
    468         virtual uint16 getITunesGnreID() const = 0;
    469 
    470         //APIs to return the no. of year and their metadata values respectively.
    471         virtual uint32 getNumYear() = 0;
    472         virtual PVMFStatus getYear(uint32 index, uint32& aVal) = 0;
    473 
    474         //APIs to return the no. of copyright and their metadata values respectively.
    475         virtual uint32 getNumCopyright() = 0;
    476         virtual PVMFStatus getCopyright(uint32 index, OSCL_wString& aVal, uint16& aLangCode, MP4FFParserOriginalCharEnc& aCharEncType) = 0;
    477 
    478         //APIs to return the no. of comment and their metadata values respectively.
    479         virtual uint32 getNumComment() = 0;
    480         virtual PVMFStatus getComment(uint32 index, OSCL_wString& aVal, uint16& aLangCode, MP4FFParserOriginalCharEnc& aCharEncType) = 0;
    481 
    482         //APIs to return the no. of description and their metadata values respectively.
    483         virtual uint32 getNumDescription() = 0;
    484         virtual PVMFStatus getDescription(uint32 index, OSCL_wString& aVal, uint16& aLangCode, MP4FFParserOriginalCharEnc& aCharEncType) = 0;
    485 
    486         //APIs to return the no. of rating and their metadata values respectively.
    487         virtual uint32 getNumRating() = 0;
    488         virtual PVMFStatus getRating(uint32 index, OSCL_wString& aVal, uint16& aLangCode, MP4FFParserOriginalCharEnc& aCharEncType) = 0;
    489 
    490 
    491 };
    492 
    493 #endif // IMPEG4FILE_H_INCLUDED
    494