MPEG4Extractor.h revision 75226177f20a176d50e3e53bbb34067cb49112c3
16061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka/* 26061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka * Copyright (C) 2009 The Android Open Source Project 36061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka * 46061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka * Licensed under the Apache License, Version 2.0 (the "License"); 56061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka * you may not use this file except in compliance with the License. 66061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka * You may obtain a copy of the License at 76061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka * 86061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka * http://www.apache.org/licenses/LICENSE-2.0 96061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka * 106061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka * Unless required by applicable law or agreed to in writing, software 116061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka * distributed under the License is distributed on an "AS IS" BASIS, 126061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka * See the License for the specific language governing permissions and 146061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka * limitations under the License. 156061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka */ 166061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 176061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka#ifndef MPEG4_EXTRACTOR_H_ 186061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 196061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka#define MPEG4_EXTRACTOR_H_ 206061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 216061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka#include <arpa/inet.h> 226061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 236061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka#include <media/stagefright/DataSource.h> 246061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka#include <media/stagefright/MediaExtractor.h> 256061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka#include <media/stagefright/Utils.h> 266061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka#include <utils/List.h> 276061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka#include <utils/Vector.h> 286061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka#include <utils/String8.h> 29366f57fb4efd0ddf5d48cd232cd88d3777517ea2Seigo Nonaka 306061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonakanamespace android { 316061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonakastruct AMessage; 326061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonakaclass DataSource; 336061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonakaclass SampleTable; 346061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonakaclass String8; 356061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonakanamespace heif { 366061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonakaclass ItemTable; 376061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka} 386061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonakausing heif::ItemTable; 396061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 406061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonakastruct SidxEntry { 416061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka size_t mSize; 426061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka uint32_t mDurationUs; 436061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka}; 446061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 456061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonakastruct Trex { 466061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka uint32_t track_ID; 476061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka uint32_t default_sample_description_index; 486061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka uint32_t default_sample_duration; 496061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka uint32_t default_sample_size; 506061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka uint32_t default_sample_flags; 516061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka}; 526061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 536061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonakaclass MPEG4Extractor : public MediaExtractor { 546061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonakapublic: 556061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka // Extractor assumes ownership of "source". 566061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka explicit MPEG4Extractor(const sp<DataSource> &source); 576061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 586061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka virtual size_t countTracks(); 596061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka virtual sp<MediaSource> getTrack(size_t index); 606061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka virtual sp<MetaData> getTrackMetaData(size_t index, uint32_t flags); 616061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 626061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka virtual sp<MetaData> getMetaData(); 636061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka virtual uint32_t flags() const; 646061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka virtual const char * name() { return "MPEG4Extractor"; } 656061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka virtual void release(); 666061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 676061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka // for DRM 686061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka virtual char* getDrmTrackInfo(size_t trackID, int *len); 697719a6444ba7013a9cc815e475136b3cdc82e50dSeigo Nonaka 707719a6444ba7013a9cc815e475136b3cdc82e50dSeigo Nonakaprotected: 716061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka virtual ~MPEG4Extractor(); 726061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 736061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka virtual void populateMetrics(); 746061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 756061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonakaprivate: 766061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 776061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka struct PsshInfo { 78366f57fb4efd0ddf5d48cd232cd88d3777517ea2Seigo Nonaka uint8_t uuid[16]; 79366f57fb4efd0ddf5d48cd232cd88d3777517ea2Seigo Nonaka uint32_t datalen; 806061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka uint8_t *data; 816061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka }; 826061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka struct Track { 836061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka Track *next; 846061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka sp<MetaData> meta; 856061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka uint32_t timescale; 866061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka sp<SampleTable> sampleTable; 876061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka bool includes_expensive_metadata; 886061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka bool skipTrack; 896061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka bool has_elst; 906061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka int64_t elst_media_time; 916061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka uint64_t elst_segment_duration; 926061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka }; 936061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 946061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka Vector<SidxEntry> mSidxEntries; 956061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka off64_t mMoofOffset; 966061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka bool mMoofFound; 976061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka bool mMdatFound; 986061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 996061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka Vector<PsshInfo> mPssh; 1006061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 1016061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka Vector<Trex> mTrex; 1026061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 1036061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka sp<DataSource> mDataSource; 1046061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka status_t mInitCheck; 1056061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka uint32_t mHeaderTimescale; 1066061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka bool mIsQT; 1076061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka bool mIsHEIF; 1086061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 1096061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka Track *mFirstTrack, *mLastTrack; 1106061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 1116061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka sp<MetaData> mFileMetaData; 1126061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 1136061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka Vector<uint32_t> mPath; 1146061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka String8 mLastCommentMean; 1156061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka String8 mLastCommentName; 1166061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka String8 mLastCommentData; 1176061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 1186061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka KeyedVector<uint32_t, AString> mMetaKeyMap; 1196061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 1206061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka status_t readMetaData(); 1216061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka status_t parseChunk(off64_t *offset, int depth); 1226061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka status_t parseITunesMetaData(off64_t offset, size_t size); 1236061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka status_t parseColorInfo(off64_t offset, size_t size); 1246061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka status_t parse3GPPMetaData(off64_t offset, size_t size, int depth); 1256061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka void parseID3v2MetaData(off64_t offset); 1266061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka status_t parseQTMetaKey(off64_t data_offset, size_t data_size); 1276061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka status_t parseQTMetaVal(int32_t keyId, off64_t data_offset, size_t data_size); 1286061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 1296061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka status_t updateAudioTrackInfoFromESDS_MPEG4Audio( 1306061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka const void *esds_data, size_t esds_size); 1316061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 1326061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka static status_t verifyTrack(Track *track); 1336061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 1346061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka struct SINF { 1356061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka SINF *next; 1366061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka uint16_t trackID; 1376061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka uint8_t IPMPDescriptorID; 1386061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka ssize_t len; 1396061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka char *IPMPData; 1406061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka }; 1416061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 1426061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka SINF *mFirstSINF; 1436061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 1446061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka bool mIsDrm; 1456061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka sp<ItemTable> mItemTable; 1466061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 1476061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka status_t parseDrmSINF(off64_t *offset, off64_t data_offset); 1486061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 1496061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka status_t parseTrackHeader(off64_t data_offset, off64_t data_size); 1506061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 1516061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka status_t parseSegmentIndex(off64_t data_offset, size_t data_size); 1526061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 1536061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka Track *findTrackByMimePrefix(const char *mimePrefix); 1546061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 1556061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka status_t parseAC3SampleEntry(off64_t offset); 1566061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka status_t parseAC3SpecificBox(off64_t offset, uint16_t sampleRate); 1576061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 1586061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka MPEG4Extractor(const MPEG4Extractor &); 1596061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka MPEG4Extractor &operator=(const MPEG4Extractor &); 1606061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka}; 1616061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 1626061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonakabool SniffMPEG4( 1636061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka const sp<DataSource> &source, String8 *mimeType, float *confidence, 1646061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka sp<AMessage> *); 1656061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 1666061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka} // namespace android 1676061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka 1686061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka#endif // MPEG4_EXTRACTOR_H_ 1696061d322ddf97f8169f9d7c598856b53a4ea83cfSeigo Nonaka