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