1840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber/*
2840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber * Copyright (C) 2012 The Android Open Source Project
3840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber *
4840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber * you may not use this file except in compliance with the License.
6840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber * You may obtain a copy of the License at
7840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber *
8840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber *
10840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber * Unless required by applicable law or agreed to in writing, software
11840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber * See the License for the specific language governing permissions and
14840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber * limitations under the License.
15840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber */
16840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
17840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#ifndef PARSER_H_
18840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
19840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#define PARSER_H_
20840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
21840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#include <media/stagefright/foundation/AHandler.h>
2256997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen#include <media/stagefright/DataSource.h>
23840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#include <utils/Vector.h>
24840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
25840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Hubernamespace android {
26840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
27840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huberstruct ABuffer;
28840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
29cb1f88c684140ce0eb407049a78f889bc7d51be1Marco Nelissenstruct FragmentedMP4Parser : public AHandler {
30840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    struct Source : public RefBase {
31840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        Source() {}
32840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
33840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        virtual ssize_t readAt(off64_t offset, void *data, size_t size) = 0;
3456997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen        virtual bool isSeekable() = 0;
35840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
36840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        protected:
37840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        virtual ~Source() {}
38840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
39840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        private:
40840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        DISALLOW_EVIL_CONSTRUCTORS(Source);
41840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    };
42840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
43cb1f88c684140ce0eb407049a78f889bc7d51be1Marco Nelissen    FragmentedMP4Parser();
44840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
45840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    void start(const char *filename);
46840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    void start(const sp<Source> &source);
4756997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen    void start(sp<DataSource> &source);
48840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
4956997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen    sp<AMessage> getFormat(bool audio, bool synchronous = false);
5056997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen    status_t dequeueAccessUnit(bool audio, sp<ABuffer> *accessUnit, bool synchronous = false);
5156997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen    status_t seekTo(bool audio, int64_t timeUs);
5256997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen    bool isSeekable() const;
53840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
54840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
55840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
56840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huberprotected:
57cb1f88c684140ce0eb407049a78f889bc7d51be1Marco Nelissen    virtual ~FragmentedMP4Parser();
58840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
59840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huberprivate:
60840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    enum {
61840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        kWhatStart,
62840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        kWhatProceed,
63840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        kWhatReadMore,
64840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        kWhatGetFormat,
65840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        kWhatDequeueAccessUnit,
6656997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen        kWhatSeekTo,
67840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    };
68840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
69840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    struct TrackFragment;
70840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    struct DynamicTrackFragment;
71840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    struct StaticTrackFragment;
72840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
73840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    struct DispatchEntry {
74840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mType;
75840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mParentType;
76cb1f88c684140ce0eb407049a78f889bc7d51be1Marco Nelissen        status_t (FragmentedMP4Parser::*mHandler)(uint32_t, size_t, uint64_t);
77840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    };
78840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
79840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    struct Container {
80bd828233d3eda966bf7145108dde74616abd97fbAndreas Huber        uint64_t mOffset;
81840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint64_t mBytesRemaining;
82840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mType;
83840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        bool mExtendsToEOF;
84840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    };
85840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
86840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    struct SampleDescription {
87840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mType;
88840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint16_t mDataRefIndex;
89840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
90840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        sp<AMessage> mFormat;
91840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    };
92840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
93840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    struct SampleInfo {
94840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        off64_t mOffset;
95840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        size_t mSize;
96840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mPresentationTime;
97840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        size_t mSampleDescIndex;
98840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mFlags;
99840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    };
100840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
101840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    struct MediaDataInfo {
102840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        sp<ABuffer> mBuffer;
103840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        off64_t mOffset;
104840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    };
105840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
10656997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen    struct SidxEntry {
10756997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen        size_t mSize;
10856997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen        uint32_t mDurationUs;
10956997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen    };
11056997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen
111840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    struct TrackInfo {
112840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        enum Flags {
113840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            kTrackEnabled     = 0x01,
114840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            kTrackInMovie     = 0x02,
115840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            kTrackInPreview   = 0x04,
116840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        };
117840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
118840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mTrackID;
119840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mFlags;
120840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mDuration;  // This is the duration in terms of movie timescale!
12156997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen        uint64_t mSidxDuration; // usec, from sidx box, which can use a different timescale
122840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
123840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mMediaTimeScale;
124840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
125840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mMediaHandlerType;
126840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        Vector<SampleDescription> mSampleDescs;
127840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
128840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        // from track extends:
129840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mDefaultSampleDescriptionIndex;
130840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mDefaultSampleDuration;
131840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mDefaultSampleSize;
132840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mDefaultSampleFlags;
133840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
134840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mDecodingTime;
135840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
13656997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen        Vector<SidxEntry> mSidx;
137840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        sp<StaticTrackFragment> mStaticFragment;
138840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        List<sp<TrackFragment> > mFragments;
139840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    };
140840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
141840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    struct TrackFragmentHeaderInfo {
142840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        enum Flags {
143840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            kBaseDataOffsetPresent         = 0x01,
144840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            kSampleDescriptionIndexPresent = 0x02,
145840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            kDefaultSampleDurationPresent  = 0x08,
146840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            kDefaultSampleSizePresent      = 0x10,
147840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            kDefaultSampleFlagsPresent     = 0x20,
148840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            kDurationIsEmpty               = 0x10000,
149840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        };
150840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
151840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mTrackID;
152840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mFlags;
153840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint64_t mBaseDataOffset;
154840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mSampleDescriptionIndex;
155840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mDefaultSampleDuration;
156840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mDefaultSampleSize;
157840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mDefaultSampleFlags;
158840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
159840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint64_t mDataOffset;
160840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    };
161840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
162840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    static const DispatchEntry kDispatchTable[];
163840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
164840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    sp<Source> mSource;
165840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    off_t mBufferPos;
166840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    bool mSuspended;
16756997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen    bool mDoneWithMoov;
16856997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen    off_t mFirstMoofOffset; // used as the starting point for offsets calculated from the sidx box
169840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    sp<ABuffer> mBuffer;
170840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    Vector<Container> mStack;
171840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    KeyedVector<uint32_t, TrackInfo> mTracks;  // TrackInfo by trackID
172840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    Vector<MediaDataInfo> mMediaData;
173840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
174840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    uint32_t mCurrentTrackID;
175840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
176c7708555ea7511aea684e00a55fb5309281540ceAndreas Huber    status_t mFinalResult;
177c7708555ea7511aea684e00a55fb5309281540ceAndreas Huber
178840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    TrackFragmentHeaderInfo mTrackFragmentHeaderInfo;
179840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
180840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t onProceed();
181840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t onDequeueAccessUnit(size_t trackIndex, sp<ABuffer> *accessUnit);
18256997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen    status_t onSeekTo(bool wantAudio, int64_t position);
183840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
184bd828233d3eda966bf7145108dde74616abd97fbAndreas Huber    void enter(off64_t offset, uint32_t type, uint64_t size);
185840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
186840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    uint16_t readU16(size_t offset);
187840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    uint32_t readU32(size_t offset);
188840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    uint64_t readU64(size_t offset);
189840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    void skip(off_t distance);
190840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t need(size_t size);
191840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    bool fitsContainer(uint64_t size) const;
192840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
193840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseTrackHeader(
194840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
195840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
196840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseMediaHeader(
197840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
198840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
199840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseMediaHandler(
200840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
201840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
202840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseTrackExtends(
203840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
204840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
205840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseTrackFragmentHeader(
206840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
207840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
208840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseTrackFragmentRun(
209840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
210840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
211840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseVisualSampleEntry(
212840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
213840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
214840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseAudioSampleEntry(
215840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
216840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
217840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseSampleSizes(
218840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
219840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
220840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseCompactSampleSizes(
221840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
222840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
223840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseSampleToChunk(
224840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
225840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
226840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseChunkOffsets(
227840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
228840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
229840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseChunkOffsets64(
230840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
231840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
232840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseAVCCodecSpecificData(
233840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
234840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
235840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseESDSCodecSpecificData(
236840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
237840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
238840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseMediaData(
239840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
240840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
24156997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen    status_t parseSegmentIndex(
24256997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen            uint32_t type, size_t offset, uint64_t size);
24356997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen
244840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    TrackInfo *editTrack(uint32_t trackID, bool createIfNecessary = false);
245840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
246840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    ssize_t findTrack(bool wantAudio) const;
247840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
248840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t makeAccessUnit(
249840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            TrackInfo *info,
250840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            const SampleInfo &sample,
251840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            const MediaDataInfo &mdatInfo,
252840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            sp<ABuffer> *accessUnit);
253840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
254840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t getSample(
255840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            TrackInfo *info,
256840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            sp<TrackFragment> *fragment,
257840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            SampleInfo *sampleInfo);
258840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
259840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    static int CompareSampleLocation(
260840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        const SampleInfo &sample, const MediaDataInfo &mdatInfo);
261840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
262840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    void resumeIfNecessary();
263840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
264840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    void copyBuffer(
265840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            sp<ABuffer> *dst,
266840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            size_t offset, uint64_t size, size_t extra = 0) const;
267840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
268cb1f88c684140ce0eb407049a78f889bc7d51be1Marco Nelissen    DISALLOW_EVIL_CONSTRUCTORS(FragmentedMP4Parser);
269840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber};
270840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
271840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber}  // namespace android
272840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
273840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#endif  // PARSER_H_
274840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
275