MPEG4Extractor.h revision 49ce671c4efa4c5d038351ca441e34c5afa5241f
151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*
251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (C) 2009 The Android Open Source Project
351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Licensed under the Apache License, Version 2.0 (the "License");
551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * you may not use this file except in compliance with the License.
651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You may obtain a copy of the License at
751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *      http://www.apache.org/licenses/LICENSE-2.0
951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Unless required by applicable law or agreed to in writing, software
1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * distributed under the License is distributed on an "AS IS" BASIS,
1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * See the License for the specific language governing permissions and
1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * limitations under the License.
1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#ifndef MPEG4_EXTRACTOR_H_
1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#define MPEG4_EXTRACTOR_H_
2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include <arpa/inet.h>
2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include <media/DataSource.h>
2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include <media/MediaExtractor.h>
2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include <media/stagefright/foundation/AString.h>
2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include <utils/List.h>
2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include <utils/Vector.h>
2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include <utils/String8.h>
2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskinamespace android {
3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskistruct AMessage;
3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiclass DataSource;
3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiclass SampleTable;
3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiclass String8;
3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskinamespace heif {
3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiclass ItemTable;
3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski}
3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiusing heif::ItemTable;
3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskistruct SidxEntry {
4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    size_t mSize;
4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    uint32_t mDurationUs;
4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski};
4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskistruct Trex {
4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    uint32_t track_ID;
4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    uint32_t default_sample_description_index;
4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    uint32_t default_sample_duration;
4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    uint32_t default_sample_size;
5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    uint32_t default_sample_flags;
5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski};
5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiclass MPEG4Extractor : public MediaExtractor {
5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic:
5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // Extractor assumes ownership of "source".
5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    explicit MPEG4Extractor(const sp<DataSource> &source, const char *mime = NULL);
5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    virtual size_t countTracks();
5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    virtual sp<MediaSource> getTrack(size_t index);
6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    virtual sp<MetaData> getTrackMetaData(size_t index, uint32_t flags);
6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
62    virtual sp<MetaData> getMetaData();
63    virtual uint32_t flags() const;
64    virtual const char * name() { return "MPEG4Extractor"; }
65    virtual void release();
66
67    // for DRM
68    virtual char* getDrmTrackInfo(size_t trackID, int *len);
69
70protected:
71    virtual ~MPEG4Extractor();
72
73private:
74
75    struct PsshInfo {
76        uint8_t uuid[16];
77        uint32_t datalen;
78        uint8_t *data;
79    };
80    struct Track {
81        Track *next;
82        sp<MetaData> meta;
83        uint32_t timescale;
84        sp<SampleTable> sampleTable;
85        bool includes_expensive_metadata;
86        bool skipTrack;
87        bool has_elst;
88        int64_t elst_media_time;
89        uint64_t elst_segment_duration;
90    };
91
92    Vector<SidxEntry> mSidxEntries;
93    off64_t mMoofOffset;
94    bool mMoofFound;
95    bool mMdatFound;
96
97    Vector<PsshInfo> mPssh;
98
99    Vector<Trex> mTrex;
100
101    sp<DataSource> mDataSource;
102    status_t mInitCheck;
103    uint32_t mHeaderTimescale;
104    bool mIsQT;
105    bool mIsHeif;
106    bool mHasMoovBox;
107    bool mPreferHeif;
108
109    Track *mFirstTrack, *mLastTrack;
110
111    sp<MetaData> mFileMetaData;
112
113    Vector<uint32_t> mPath;
114    String8 mLastCommentMean;
115    String8 mLastCommentName;
116    String8 mLastCommentData;
117
118    KeyedVector<uint32_t, AString> mMetaKeyMap;
119
120    status_t readMetaData();
121    status_t parseChunk(off64_t *offset, int depth);
122    status_t parseITunesMetaData(off64_t offset, size_t size);
123    status_t parseColorInfo(off64_t offset, size_t size);
124    status_t parse3GPPMetaData(off64_t offset, size_t size, int depth);
125    void parseID3v2MetaData(off64_t offset);
126    status_t parseQTMetaKey(off64_t data_offset, size_t data_size);
127    status_t parseQTMetaVal(int32_t keyId, off64_t data_offset, size_t data_size);
128
129    status_t updateAudioTrackInfoFromESDS_MPEG4Audio(
130            const void *esds_data, size_t esds_size);
131
132    static status_t verifyTrack(Track *track);
133
134    struct SINF {
135        SINF *next;
136        uint16_t trackID;
137        uint8_t IPMPDescriptorID;
138        ssize_t len;
139        char *IPMPData;
140    };
141
142    SINF *mFirstSINF;
143
144    bool mIsDrm;
145    sp<ItemTable> mItemTable;
146
147    status_t parseDrmSINF(off64_t *offset, off64_t data_offset);
148
149    status_t parseTrackHeader(off64_t data_offset, off64_t data_size);
150
151    status_t parseSegmentIndex(off64_t data_offset, size_t data_size);
152
153    Track *findTrackByMimePrefix(const char *mimePrefix);
154
155    status_t parseAC3SampleEntry(off64_t offset);
156    status_t parseAC3SpecificBox(off64_t offset, uint16_t sampleRate);
157
158    MPEG4Extractor(const MPEG4Extractor &);
159    MPEG4Extractor &operator=(const MPEG4Extractor &);
160};
161
162bool SniffMPEG4(
163        const sp<DataSource> &source, String8 *mimeType, float *confidence,
164        sp<AMessage> *);
165
166}  // namespace android
167
168#endif  // MPEG4_EXTRACTOR_H_
169