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 TRACK_FRAGMENT_H_
18
19#define TRACK_FRAGMENT_H_
20
21#include "include/FragmentedMP4Parser.h"
22
23namespace android {
24
25struct FragmentedMP4Parser::TrackFragment : public RefBase {
26    TrackFragment() {}
27
28    virtual status_t getSample(SampleInfo *info) = 0;
29    virtual void advance() = 0;
30
31    virtual status_t signalCompletion() = 0;
32    virtual bool complete() const = 0;
33
34protected:
35    virtual ~TrackFragment() {}
36
37private:
38    DISALLOW_EVIL_CONSTRUCTORS(TrackFragment);
39};
40
41struct FragmentedMP4Parser::DynamicTrackFragment : public FragmentedMP4Parser::TrackFragment {
42    DynamicTrackFragment();
43
44    virtual status_t getSample(SampleInfo *info);
45    virtual void advance();
46
47    void addSample(
48            off64_t dataOffset, size_t sampleSize,
49            uint32_t presentationTime,
50            size_t sampleDescIndex,
51            uint32_t flags);
52
53    // No more samples will be added to this fragment.
54    virtual status_t signalCompletion();
55
56    virtual bool complete() const;
57
58protected:
59    virtual ~DynamicTrackFragment();
60
61private:
62    bool mComplete;
63    size_t mSampleIndex;
64    Vector<SampleInfo> mSamples;
65
66    DISALLOW_EVIL_CONSTRUCTORS(DynamicTrackFragment);
67};
68
69struct FragmentedMP4Parser::StaticTrackFragment : public FragmentedMP4Parser::TrackFragment {
70    StaticTrackFragment();
71
72    virtual status_t getSample(SampleInfo *info);
73    virtual void advance();
74
75    virtual status_t signalCompletion();
76    virtual bool complete() const;
77
78    status_t parseSampleSizes(
79            FragmentedMP4Parser *parser, uint32_t type, size_t offset, uint64_t size);
80
81    status_t parseCompactSampleSizes(
82            FragmentedMP4Parser *parser, uint32_t type, size_t offset, uint64_t size);
83
84    status_t parseSampleToChunk(
85            FragmentedMP4Parser *parser, uint32_t type, size_t offset, uint64_t size);
86
87    status_t parseChunkOffsets(
88            FragmentedMP4Parser *parser, uint32_t type, size_t offset, uint64_t size);
89
90    status_t parseChunkOffsets64(
91            FragmentedMP4Parser *parser, uint32_t type, size_t offset, uint64_t size);
92
93protected:
94    virtual ~StaticTrackFragment();
95
96private:
97    size_t mSampleIndex;
98    size_t mSampleCount;
99    uint32_t mChunkIndex;
100
101    SampleInfo mSampleInfo;
102
103    sp<ABuffer> mSampleSizes;
104    sp<ABuffer> mCompactSampleSizes;
105
106    sp<ABuffer> mSampleToChunk;
107    ssize_t mSampleToChunkIndex;
108    size_t mSampleToChunkRemaining;
109
110    sp<ABuffer> mChunkOffsets;
111    sp<ABuffer> mChunkOffsets64;
112    uint32_t mPrevChunkIndex;
113    uint64_t mNextSampleOffset;
114
115    void updateSampleInfo();
116
117    DISALLOW_EVIL_CONSTRUCTORS(StaticTrackFragment);
118};
119
120}  // namespace android
121
122#endif  // TRACK_FRAGMENT_H_
123