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 TRACK_FRAGMENT_H_ 18840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 19840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#define TRACK_FRAGMENT_H_ 20840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 21cb1f88c684140ce0eb407049a78f889bc7d51be1Marco Nelissen#include "include/FragmentedMP4Parser.h" 22840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 23840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Hubernamespace android { 24840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 25cb1f88c684140ce0eb407049a78f889bc7d51be1Marco Nelissenstruct FragmentedMP4Parser::TrackFragment : public RefBase { 26840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber TrackFragment() {} 27840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 28840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber virtual status_t getSample(SampleInfo *info) = 0; 29840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber virtual void advance() = 0; 30840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 31840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber virtual status_t signalCompletion() = 0; 32840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber virtual bool complete() const = 0; 33840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 34840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huberprotected: 35840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber virtual ~TrackFragment() {} 36840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 37840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huberprivate: 38840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(TrackFragment); 39840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber}; 40840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 41cb1f88c684140ce0eb407049a78f889bc7d51be1Marco Nelissenstruct FragmentedMP4Parser::DynamicTrackFragment : public FragmentedMP4Parser::TrackFragment { 42840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber DynamicTrackFragment(); 43840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 44840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber virtual status_t getSample(SampleInfo *info); 45840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber virtual void advance(); 46840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 47840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber void addSample( 48840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber off64_t dataOffset, size_t sampleSize, 49840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber uint32_t presentationTime, 50840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber size_t sampleDescIndex, 51840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber uint32_t flags); 52840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 53840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber // No more samples will be added to this fragment. 54840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber virtual status_t signalCompletion(); 55840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 56840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber virtual bool complete() const; 57840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 58840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huberprotected: 59840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber virtual ~DynamicTrackFragment(); 60840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 61840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huberprivate: 62840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber bool mComplete; 63840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber size_t mSampleIndex; 64840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber Vector<SampleInfo> mSamples; 65840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 66840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(DynamicTrackFragment); 67840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber}; 68840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 69cb1f88c684140ce0eb407049a78f889bc7d51be1Marco Nelissenstruct FragmentedMP4Parser::StaticTrackFragment : public FragmentedMP4Parser::TrackFragment { 70840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber StaticTrackFragment(); 71840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 72840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber virtual status_t getSample(SampleInfo *info); 73840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber virtual void advance(); 74840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 75840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber virtual status_t signalCompletion(); 76840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber virtual bool complete() const; 77840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 78840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber status_t parseSampleSizes( 79cb1f88c684140ce0eb407049a78f889bc7d51be1Marco Nelissen FragmentedMP4Parser *parser, uint32_t type, size_t offset, uint64_t size); 80840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 81840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber status_t parseCompactSampleSizes( 82cb1f88c684140ce0eb407049a78f889bc7d51be1Marco Nelissen FragmentedMP4Parser *parser, uint32_t type, size_t offset, uint64_t size); 83840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 84840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber status_t parseSampleToChunk( 85cb1f88c684140ce0eb407049a78f889bc7d51be1Marco Nelissen FragmentedMP4Parser *parser, uint32_t type, size_t offset, uint64_t size); 86840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 87840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber status_t parseChunkOffsets( 88cb1f88c684140ce0eb407049a78f889bc7d51be1Marco Nelissen FragmentedMP4Parser *parser, uint32_t type, size_t offset, uint64_t size); 89840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 90840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber status_t parseChunkOffsets64( 91cb1f88c684140ce0eb407049a78f889bc7d51be1Marco Nelissen FragmentedMP4Parser *parser, uint32_t type, size_t offset, uint64_t size); 92840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 93840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huberprotected: 94840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber virtual ~StaticTrackFragment(); 95840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 96840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huberprivate: 97840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber size_t mSampleIndex; 98840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber size_t mSampleCount; 99b9787142c5f5f8f47e7e35409f4f2ef7112ab72eAndreas Huber uint32_t mChunkIndex; 100840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 101840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber SampleInfo mSampleInfo; 102840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 103840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber sp<ABuffer> mSampleSizes; 104840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber sp<ABuffer> mCompactSampleSizes; 105840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 106840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber sp<ABuffer> mSampleToChunk; 107840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber ssize_t mSampleToChunkIndex; 108840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber size_t mSampleToChunkRemaining; 109840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 110840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber sp<ABuffer> mChunkOffsets; 111840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber sp<ABuffer> mChunkOffsets64; 112840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber uint32_t mPrevChunkIndex; 113840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber uint64_t mNextSampleOffset; 114840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 115840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber void updateSampleInfo(); 116840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 117840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(StaticTrackFragment); 118840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber}; 119840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 120840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber} // namespace android 121840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 122840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#endif // TRACK_FRAGMENT_H_ 123