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