• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/stagefright/DataSource.h>
24 #include <media/stagefright/MediaExtractor.h>
25 #include <media/stagefright/Utils.h>
26 #include <utils/List.h>
27 #include <utils/Vector.h>
28 #include <utils/String8.h>
29 
30 namespace android {
31 
32 struct AMessage;
33 class DataSource;
34 class SampleTable;
35 class String8;
36 
37 struct SidxEntry {
38     size_t mSize;
39     uint32_t mDurationUs;
40 };
41 
42 struct Trex {
43     uint32_t track_ID;
44     uint32_t default_sample_description_index;
45     uint32_t default_sample_duration;
46     uint32_t default_sample_size;
47     uint32_t default_sample_flags;
48 };
49 
50 class MPEG4Extractor : public MediaExtractor {
51 public:
52     // Extractor assumes ownership of "source".
53     explicit MPEG4Extractor(const sp<DataSource> &source);
54 
55     virtual size_t countTracks();
56     virtual sp<IMediaSource> getTrack(size_t index);
57     virtual sp<MetaData> getTrackMetaData(size_t index, uint32_t flags);
58 
59     virtual sp<MetaData> getMetaData();
60     virtual uint32_t flags() const;
name()61     virtual const char * name() { return "MPEG4Extractor"; }
62 
63     // for DRM
64     virtual char* getDrmTrackInfo(size_t trackID, int *len);
65 
66 protected:
67     virtual ~MPEG4Extractor();
68 
69     virtual void populateMetrics();
70 
71 private:
72 
73     struct PsshInfo {
74         uint8_t uuid[16];
75         uint32_t datalen;
76         uint8_t *data;
77     };
78     struct Track {
79         Track *next;
80         sp<MetaData> meta;
81         uint32_t timescale;
82         sp<SampleTable> sampleTable;
83         bool includes_expensive_metadata;
84         bool skipTrack;
85     };
86 
87     Vector<SidxEntry> mSidxEntries;
88     off64_t mMoofOffset;
89     bool mMoofFound;
90     bool mMdatFound;
91 
92     Vector<PsshInfo> mPssh;
93 
94     Vector<Trex> mTrex;
95 
96     sp<DataSource> mDataSource;
97     status_t mInitCheck;
98     uint32_t mHeaderTimescale;
99     bool mIsQT;
100 
101     Track *mFirstTrack, *mLastTrack;
102 
103     sp<MetaData> mFileMetaData;
104 
105     Vector<uint32_t> mPath;
106     String8 mLastCommentMean;
107     String8 mLastCommentName;
108     String8 mLastCommentData;
109 
110     KeyedVector<uint32_t, AString> mMetaKeyMap;
111 
112     status_t readMetaData();
113     status_t parseChunk(off64_t *offset, int depth);
114     status_t parseITunesMetaData(off64_t offset, size_t size);
115     status_t parseColorInfo(off64_t offset, size_t size);
116     status_t parse3GPPMetaData(off64_t offset, size_t size, int depth);
117     void parseID3v2MetaData(off64_t offset);
118     status_t parseQTMetaKey(off64_t data_offset, size_t data_size);
119     status_t parseQTMetaVal(int32_t keyId, off64_t data_offset, size_t data_size);
120 
121     status_t updateAudioTrackInfoFromESDS_MPEG4Audio(
122             const void *esds_data, size_t esds_size);
123 
124     static status_t verifyTrack(Track *track);
125 
126     struct SINF {
127         SINF *next;
128         uint16_t trackID;
129         uint8_t IPMPDescriptorID;
130         ssize_t len;
131         char *IPMPData;
132     };
133 
134     SINF *mFirstSINF;
135 
136     bool mIsDrm;
137     status_t parseDrmSINF(off64_t *offset, off64_t data_offset);
138 
139     status_t parseTrackHeader(off64_t data_offset, off64_t data_size);
140 
141     status_t parseSegmentIndex(off64_t data_offset, size_t data_size);
142 
143     Track *findTrackByMimePrefix(const char *mimePrefix);
144 
145     status_t parseAC3SampleEntry(off64_t offset);
146     status_t parseAC3SpecificBox(off64_t offset, uint16_t sampleRate);
147 
148     MPEG4Extractor(const MPEG4Extractor &);
149     MPEG4Extractor &operator=(const MPEG4Extractor &);
150 };
151 
152 bool SniffMPEG4(
153         const sp<DataSource> &source, String8 *mimeType, float *confidence,
154         sp<AMessage> *);
155 
156 }  // namespace android
157 
158 #endif  // MPEG4_EXTRACTOR_H_
159