FragmentedMP4Parser.h revision cb1f88c684140ce0eb407049a78f889bc7d51be1
1/* 2 * Copyright (C) 2012 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 PARSER_H_ 18 19#define PARSER_H_ 20 21#include <media/stagefright/foundation/AHandler.h> 22#include <utils/Vector.h> 23 24namespace android { 25 26struct ABuffer; 27 28struct FragmentedMP4Parser : public AHandler { 29 struct Source : public RefBase { 30 Source() {} 31 32 virtual ssize_t readAt(off64_t offset, void *data, size_t size) = 0; 33 34 protected: 35 virtual ~Source() {} 36 37 private: 38 DISALLOW_EVIL_CONSTRUCTORS(Source); 39 }; 40 41 FragmentedMP4Parser(); 42 43 void start(const char *filename); 44 void start(const sp<Source> &source); 45 46 sp<AMessage> getFormat(bool audio); 47 status_t dequeueAccessUnit(bool audio, sp<ABuffer> *accessUnit); 48 49 virtual void onMessageReceived(const sp<AMessage> &msg); 50 51protected: 52 virtual ~FragmentedMP4Parser(); 53 54private: 55 enum { 56 kWhatStart, 57 kWhatProceed, 58 kWhatReadMore, 59 kWhatGetFormat, 60 kWhatDequeueAccessUnit, 61 }; 62 63 struct TrackFragment; 64 struct DynamicTrackFragment; 65 struct StaticTrackFragment; 66 67 struct DispatchEntry { 68 uint32_t mType; 69 uint32_t mParentType; 70 status_t (FragmentedMP4Parser::*mHandler)(uint32_t, size_t, uint64_t); 71 }; 72 73 struct Container { 74 uint64_t mOffset; 75 uint64_t mBytesRemaining; 76 uint32_t mType; 77 bool mExtendsToEOF; 78 }; 79 80 struct SampleDescription { 81 uint32_t mType; 82 uint16_t mDataRefIndex; 83 84 sp<AMessage> mFormat; 85 }; 86 87 struct SampleInfo { 88 off64_t mOffset; 89 size_t mSize; 90 uint32_t mPresentationTime; 91 size_t mSampleDescIndex; 92 uint32_t mFlags; 93 }; 94 95 struct MediaDataInfo { 96 sp<ABuffer> mBuffer; 97 off64_t mOffset; 98 }; 99 100 struct TrackInfo { 101 enum Flags { 102 kTrackEnabled = 0x01, 103 kTrackInMovie = 0x02, 104 kTrackInPreview = 0x04, 105 }; 106 107 uint32_t mTrackID; 108 uint32_t mFlags; 109 uint32_t mDuration; // This is the duration in terms of movie timescale! 110 111 uint32_t mMediaTimeScale; 112 113 uint32_t mMediaHandlerType; 114 Vector<SampleDescription> mSampleDescs; 115 116 // from track extends: 117 uint32_t mDefaultSampleDescriptionIndex; 118 uint32_t mDefaultSampleDuration; 119 uint32_t mDefaultSampleSize; 120 uint32_t mDefaultSampleFlags; 121 122 uint32_t mDecodingTime; 123 124 sp<StaticTrackFragment> mStaticFragment; 125 List<sp<TrackFragment> > mFragments; 126 }; 127 128 struct TrackFragmentHeaderInfo { 129 enum Flags { 130 kBaseDataOffsetPresent = 0x01, 131 kSampleDescriptionIndexPresent = 0x02, 132 kDefaultSampleDurationPresent = 0x08, 133 kDefaultSampleSizePresent = 0x10, 134 kDefaultSampleFlagsPresent = 0x20, 135 kDurationIsEmpty = 0x10000, 136 }; 137 138 uint32_t mTrackID; 139 uint32_t mFlags; 140 uint64_t mBaseDataOffset; 141 uint32_t mSampleDescriptionIndex; 142 uint32_t mDefaultSampleDuration; 143 uint32_t mDefaultSampleSize; 144 uint32_t mDefaultSampleFlags; 145 146 uint64_t mDataOffset; 147 }; 148 149 static const DispatchEntry kDispatchTable[]; 150 151 sp<Source> mSource; 152 off_t mBufferPos; 153 bool mSuspended; 154 sp<ABuffer> mBuffer; 155 Vector<Container> mStack; 156 KeyedVector<uint32_t, TrackInfo> mTracks; // TrackInfo by trackID 157 Vector<MediaDataInfo> mMediaData; 158 159 uint32_t mCurrentTrackID; 160 161 status_t mFinalResult; 162 163 TrackFragmentHeaderInfo mTrackFragmentHeaderInfo; 164 165 status_t onProceed(); 166 status_t onDequeueAccessUnit(size_t trackIndex, sp<ABuffer> *accessUnit); 167 168 void enter(off64_t offset, uint32_t type, uint64_t size); 169 170 uint16_t readU16(size_t offset); 171 uint32_t readU32(size_t offset); 172 uint64_t readU64(size_t offset); 173 void skip(off_t distance); 174 status_t need(size_t size); 175 bool fitsContainer(uint64_t size) const; 176 177 status_t parseTrackHeader( 178 uint32_t type, size_t offset, uint64_t size); 179 180 status_t parseMediaHeader( 181 uint32_t type, size_t offset, uint64_t size); 182 183 status_t parseMediaHandler( 184 uint32_t type, size_t offset, uint64_t size); 185 186 status_t parseTrackExtends( 187 uint32_t type, size_t offset, uint64_t size); 188 189 status_t parseTrackFragmentHeader( 190 uint32_t type, size_t offset, uint64_t size); 191 192 status_t parseTrackFragmentRun( 193 uint32_t type, size_t offset, uint64_t size); 194 195 status_t parseVisualSampleEntry( 196 uint32_t type, size_t offset, uint64_t size); 197 198 status_t parseAudioSampleEntry( 199 uint32_t type, size_t offset, uint64_t size); 200 201 status_t parseSampleSizes( 202 uint32_t type, size_t offset, uint64_t size); 203 204 status_t parseCompactSampleSizes( 205 uint32_t type, size_t offset, uint64_t size); 206 207 status_t parseSampleToChunk( 208 uint32_t type, size_t offset, uint64_t size); 209 210 status_t parseChunkOffsets( 211 uint32_t type, size_t offset, uint64_t size); 212 213 status_t parseChunkOffsets64( 214 uint32_t type, size_t offset, uint64_t size); 215 216 status_t parseAVCCodecSpecificData( 217 uint32_t type, size_t offset, uint64_t size); 218 219 status_t parseESDSCodecSpecificData( 220 uint32_t type, size_t offset, uint64_t size); 221 222 status_t parseMediaData( 223 uint32_t type, size_t offset, uint64_t size); 224 225 TrackInfo *editTrack(uint32_t trackID, bool createIfNecessary = false); 226 227 ssize_t findTrack(bool wantAudio) const; 228 229 status_t makeAccessUnit( 230 TrackInfo *info, 231 const SampleInfo &sample, 232 const MediaDataInfo &mdatInfo, 233 sp<ABuffer> *accessUnit); 234 235 status_t getSample( 236 TrackInfo *info, 237 sp<TrackFragment> *fragment, 238 SampleInfo *sampleInfo); 239 240 static int CompareSampleLocation( 241 const SampleInfo &sample, const MediaDataInfo &mdatInfo); 242 243 void resumeIfNecessary(); 244 245 void copyBuffer( 246 sp<ABuffer> *dst, 247 size_t offset, uint64_t size, size_t extra = 0) const; 248 249 DISALLOW_EVIL_CONSTRUCTORS(FragmentedMP4Parser); 250}; 251 252} // namespace android 253 254#endif // PARSER_H_ 255 256