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