MPEG4Extractor.h revision 3d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0
1/* 2 * Copyright (C) 2009 The Android Open Source Project 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 express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef MPEG4_EXTRACTOR_H_ 18 19#define MPEG4_EXTRACTOR_H_ 20 21#include <arpa/inet.h> 22 23#include <media/DataSourceBase.h> 24#include <media/MediaExtractor.h> 25#include <media/stagefright/MetaDataBase.h> 26#include <media/stagefright/foundation/AString.h> 27#include <utils/List.h> 28#include <utils/Vector.h> 29#include <utils/String8.h> 30 31namespace android { 32struct AMessage; 33class DataSourceBase; 34struct CachedRangedDataSource; 35class SampleTable; 36class String8; 37namespace heif { 38class ItemTable; 39} 40using heif::ItemTable; 41 42struct SidxEntry { 43 size_t mSize; 44 uint32_t mDurationUs; 45}; 46 47struct Trex { 48 uint32_t track_ID; 49 uint32_t default_sample_description_index; 50 uint32_t default_sample_duration; 51 uint32_t default_sample_size; 52 uint32_t default_sample_flags; 53}; 54 55class MPEG4Extractor : public MediaExtractor { 56public: 57 explicit MPEG4Extractor(DataSourceBase *source, const char *mime = NULL); 58 59 virtual size_t countTracks(); 60 virtual MediaTrack *getTrack(size_t index); 61 virtual status_t getTrackMetaData(MetaDataBase& meta, size_t index, uint32_t flags); 62 63 virtual status_t getMetaData(MetaDataBase& meta); 64 virtual uint32_t flags() const; 65 virtual const char * name() { return "MPEG4Extractor"; } 66 67protected: 68 virtual ~MPEG4Extractor(); 69 70private: 71 72 struct PsshInfo { 73 uint8_t uuid[16]; 74 uint32_t datalen; 75 uint8_t *data; 76 }; 77 struct Track { 78 Track *next; 79 MetaDataBase meta; 80 uint32_t timescale; 81 sp<SampleTable> sampleTable; 82 bool includes_expensive_metadata; 83 bool skipTrack; 84 bool has_elst; 85 int64_t elst_media_time; 86 uint64_t elst_segment_duration; 87 }; 88 89 Vector<SidxEntry> mSidxEntries; 90 off64_t mMoofOffset; 91 bool mMoofFound; 92 bool mMdatFound; 93 94 Vector<PsshInfo> mPssh; 95 96 Vector<Trex> mTrex; 97 98 DataSourceBase *mDataSource; 99 CachedRangedDataSource *mCachedSource; 100 status_t mInitCheck; 101 uint32_t mHeaderTimescale; 102 bool mIsQT; 103 bool mIsHeif; 104 bool mHasMoovBox; 105 bool mPreferHeif; 106 107 Track *mFirstTrack, *mLastTrack; 108 109 MetaDataBase mFileMetaData; 110 111 Vector<uint32_t> mPath; 112 String8 mLastCommentMean; 113 String8 mLastCommentName; 114 String8 mLastCommentData; 115 116 KeyedVector<uint32_t, AString> mMetaKeyMap; 117 118 status_t readMetaData(); 119 status_t parseChunk(off64_t *offset, int depth); 120 status_t parseITunesMetaData(off64_t offset, size_t size); 121 status_t parseColorInfo(off64_t offset, size_t size); 122 status_t parse3GPPMetaData(off64_t offset, size_t size, int depth); 123 void parseID3v2MetaData(off64_t offset); 124 status_t parseQTMetaKey(off64_t data_offset, size_t data_size); 125 status_t parseQTMetaVal(int32_t keyId, off64_t data_offset, size_t data_size); 126 127 status_t updateAudioTrackInfoFromESDS_MPEG4Audio( 128 const void *esds_data, size_t esds_size); 129 130 static status_t verifyTrack(Track *track); 131 132 sp<ItemTable> mItemTable; 133 134 status_t parseTrackHeader(off64_t data_offset, off64_t data_size); 135 136 status_t parseSegmentIndex(off64_t data_offset, size_t data_size); 137 138 Track *findTrackByMimePrefix(const char *mimePrefix); 139 140 status_t parseAC3SampleEntry(off64_t offset); 141 status_t parseAC3SpecificBox(off64_t offset, uint16_t sampleRate); 142 143 MPEG4Extractor(const MPEG4Extractor &); 144 MPEG4Extractor &operator=(const MPEG4Extractor &); 145}; 146 147bool SniffMPEG4( 148 DataSourceBase *source, String8 *mimeType, float *confidence, 149 sp<AMessage> *); 150 151} // namespace android 152 153#endif // MPEG4_EXTRACTOR_H_ 154