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