FragmentedMP4Parser.h revision c7708555ea7511aea684e00a55fb5309281540ce
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>
22840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#include <utils/Vector.h>
23840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
24840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Hubernamespace android {
25840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
26840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huberstruct ABuffer;
27840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
28840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huberstruct Parser : public AHandler {
29840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    struct Source : public RefBase {
30840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        Source() {}
31840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
32840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        virtual ssize_t readAt(off64_t offset, void *data, size_t size) = 0;
33840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
34840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        protected:
35840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        virtual ~Source() {}
36840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
37840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        private:
38840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        DISALLOW_EVIL_CONSTRUCTORS(Source);
39840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    };
40840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
41840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    Parser();
42840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
43840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    void start(const char *filename);
44840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    void start(const sp<Source> &source);
45840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
46840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    sp<AMessage> getFormat(bool audio);
47840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t dequeueAccessUnit(bool audio, sp<ABuffer> *accessUnit);
48840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
49840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
50840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
51840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huberprotected:
52840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    virtual ~Parser();
53840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
54840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huberprivate:
55840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    enum {
56840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        kWhatStart,
57840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        kWhatProceed,
58840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        kWhatReadMore,
59840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        kWhatGetFormat,
60840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        kWhatDequeueAccessUnit,
61840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    };
62840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
63840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    struct TrackFragment;
64840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    struct DynamicTrackFragment;
65840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    struct StaticTrackFragment;
66840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
67840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    struct DispatchEntry {
68840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mType;
69840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mParentType;
70840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        status_t (Parser::*mHandler)(uint32_t, size_t, uint64_t);
71840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    };
72840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
73840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    struct Container {
74840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint64_t mBytesRemaining;
75840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mType;
76840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        bool mExtendsToEOF;
77840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    };
78840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
79840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    struct SampleDescription {
80840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mType;
81840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint16_t mDataRefIndex;
82840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
83840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        sp<AMessage> mFormat;
84840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    };
85840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
86840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    struct SampleInfo {
87840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        off64_t mOffset;
88840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        size_t mSize;
89840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mPresentationTime;
90840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        size_t mSampleDescIndex;
91840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mFlags;
92840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    };
93840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
94840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    struct MediaDataInfo {
95840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        sp<ABuffer> mBuffer;
96840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        off64_t mOffset;
97840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    };
98840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
99840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    struct TrackInfo {
100840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        enum Flags {
101840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            kTrackEnabled     = 0x01,
102840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            kTrackInMovie     = 0x02,
103840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            kTrackInPreview   = 0x04,
104840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        };
105840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
106840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mTrackID;
107840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mFlags;
108840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mDuration;  // This is the duration in terms of movie timescale!
109840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
110840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mMediaTimeScale;
111840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
112840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mMediaHandlerType;
113840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        Vector<SampleDescription> mSampleDescs;
114840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
115840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        // from track extends:
116840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mDefaultSampleDescriptionIndex;
117840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mDefaultSampleDuration;
118840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mDefaultSampleSize;
119840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mDefaultSampleFlags;
120840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
121840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mDecodingTime;
122840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
123840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        sp<StaticTrackFragment> mStaticFragment;
124840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        List<sp<TrackFragment> > mFragments;
125840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    };
126840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
127840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    struct TrackFragmentHeaderInfo {
128840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        enum Flags {
129840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            kBaseDataOffsetPresent         = 0x01,
130840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            kSampleDescriptionIndexPresent = 0x02,
131840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            kDefaultSampleDurationPresent  = 0x08,
132840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            kDefaultSampleSizePresent      = 0x10,
133840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            kDefaultSampleFlagsPresent     = 0x20,
134840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            kDurationIsEmpty               = 0x10000,
135840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        };
136840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
137840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mTrackID;
138840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mFlags;
139840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint64_t mBaseDataOffset;
140840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mSampleDescriptionIndex;
141840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mDefaultSampleDuration;
142840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mDefaultSampleSize;
143840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint32_t mDefaultSampleFlags;
144840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
145840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        uint64_t mDataOffset;
146840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    };
147840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
148840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    static const DispatchEntry kDispatchTable[];
149840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
150840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    sp<Source> mSource;
151840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    off_t mBufferPos;
152840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    bool mSuspended;
153840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    sp<ABuffer> mBuffer;
154840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    Vector<Container> mStack;
155840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    KeyedVector<uint32_t, TrackInfo> mTracks;  // TrackInfo by trackID
156840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    Vector<MediaDataInfo> mMediaData;
157840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
158840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    uint32_t mCurrentTrackID;
159840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
160c7708555ea7511aea684e00a55fb5309281540ceAndreas Huber    status_t mFinalResult;
161c7708555ea7511aea684e00a55fb5309281540ceAndreas Huber
162840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    TrackFragmentHeaderInfo mTrackFragmentHeaderInfo;
163840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
164840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t onProceed();
165840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t onDequeueAccessUnit(size_t trackIndex, sp<ABuffer> *accessUnit);
166840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
167840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    void enter(uint32_t type, uint64_t size);
168840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
169840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    uint16_t readU16(size_t offset);
170840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    uint32_t readU32(size_t offset);
171840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    uint64_t readU64(size_t offset);
172840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    void skip(off_t distance);
173840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t need(size_t size);
174840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    bool fitsContainer(uint64_t size) const;
175840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
176840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseTrackHeader(
177840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
178840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
179840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseMediaHeader(
180840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
181840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
182840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseMediaHandler(
183840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
184840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
185840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseTrackExtends(
186840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
187840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
188840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseTrackFragmentHeader(
189840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
190840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
191840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseTrackFragmentRun(
192840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
193840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
194840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseVisualSampleEntry(
195840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
196840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
197840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseAudioSampleEntry(
198840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
199840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
200840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseSampleSizes(
201840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
202840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
203840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseCompactSampleSizes(
204840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
205840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
206840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseSampleToChunk(
207840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
208840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
209840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseChunkOffsets(
210840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
211840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
212840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseChunkOffsets64(
213840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
214840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
215840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseAVCCodecSpecificData(
216840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
217840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
218840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseESDSCodecSpecificData(
219840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
220840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
221840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t parseMediaData(
222840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            uint32_t type, size_t offset, uint64_t size);
223840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
224840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    TrackInfo *editTrack(uint32_t trackID, bool createIfNecessary = false);
225840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
226840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    ssize_t findTrack(bool wantAudio) const;
227840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
228840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t makeAccessUnit(
229840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            TrackInfo *info,
230840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            const SampleInfo &sample,
231840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            const MediaDataInfo &mdatInfo,
232840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            sp<ABuffer> *accessUnit);
233840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
234840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    status_t getSample(
235840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            TrackInfo *info,
236840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            sp<TrackFragment> *fragment,
237840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            SampleInfo *sampleInfo);
238840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
239840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    static int CompareSampleLocation(
240840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber        const SampleInfo &sample, const MediaDataInfo &mdatInfo);
241840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
242840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    void resumeIfNecessary();
243840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
244840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    void copyBuffer(
245840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            sp<ABuffer> *dst,
246840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            size_t offset, uint64_t size, size_t extra = 0) const;
247840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
248840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(Parser);
249840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber};
250840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
251840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber}  // namespace android
252840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
253840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#endif  // PARSER_H_
254840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
255