120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/*
220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2009 The Android Open Source Project
320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * you may not use this file except in compliance with the License.
620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * You may obtain a copy of the License at
720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Unless required by applicable law or agreed to in writing, software
1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * See the License for the specific language governing permissions and
1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * limitations under the License.
1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber */
1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#ifndef SAMPLE_TABLE_H_
1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define SAMPLE_TABLE_H_
2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <sys/types.h>
2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <stdint.h>
2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MediaErrors.h>
25693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber#include <utils/RefBase.h>
2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/threads.h>
2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass DataSource;
31c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huberstruct SampleIterator;
3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
33693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberclass SampleTable : public RefBase {
3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
35693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    SampleTable(const sp<DataSource> &source);
3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
37169c286ed166499c5099d2b336967e0bf3d25551Andreas Huber    bool isValid() const;
38169c286ed166499c5099d2b336967e0bf3d25551Andreas Huber
3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // type can be 'stco' or 'co64'.
4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    status_t setChunkOffsetParams(
41c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong            uint32_t type, off64_t data_offset, size_t data_size);
4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
43c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong    status_t setSampleToChunkParams(off64_t data_offset, size_t data_size);
4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // type can be 'stsz' or 'stz2'.
4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    status_t setSampleSizeParams(
47c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong            uint32_t type, off64_t data_offset, size_t data_size);
4820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
49c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong    status_t setTimeToSampleParams(off64_t data_offset, size_t data_size);
5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
514931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber    status_t setCompositionTimeToSampleParams(
524931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber            off64_t data_offset, size_t data_size);
534931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber
54c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong    status_t setSyncSampleParams(off64_t data_offset, size_t data_size);
5520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
5620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    ////////////////////////////////////////////////////////////////////////////
5720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t countChunkOffsets() const;
5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t countSamples() const;
6120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    status_t getMaxSampleSize(size_t *size);
6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
64c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber    status_t getMetaDataForSample(
65c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber            uint32_t sampleIndex,
66c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong            off64_t *offset,
67c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber            size_t *size,
684678a6dc5f09008481524949a9667af5a6190374Andreas Huber            uint32_t *compositionTime,
698bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber            bool *isSyncSample = NULL);
7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    enum {
72abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber        kFlagBefore,
73abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber        kFlagAfter,
74abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber        kFlagClosest
7520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    };
76abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber    status_t findSampleAtTime(
7720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            uint32_t req_time, uint32_t *sample_index, uint32_t flags);
7820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
79abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber    status_t findSyncSampleNear(
80abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber            uint32_t start_sample_index, uint32_t *sample_index,
81abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber            uint32_t flags);
82abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber
837e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber    status_t findThumbnailSample(uint32_t *sample_index);
847e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber
85693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberprotected:
86693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    ~SampleTable();
87693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
8820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate:
8989aa8fe4cb00d2f24260005b008602232d678684Andreas Huber    struct CompositionDeltaLookup;
9089aa8fe4cb00d2f24260005b008602232d678684Andreas Huber
91c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber    static const uint32_t kChunkOffsetType32;
92c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber    static const uint32_t kChunkOffsetType64;
93c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber    static const uint32_t kSampleSizeType32;
94c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber    static const uint32_t kSampleSizeTypeCompact;
95c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber
96693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    sp<DataSource> mDataSource;
9720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    Mutex mLock;
9820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
99c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong    off64_t mChunkOffsetOffset;
10020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t mChunkOffsetType;
10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t mNumChunkOffsets;
10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
103c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong    off64_t mSampleToChunkOffset;
10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t mNumSampleToChunkOffsets;
10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
106c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong    off64_t mSampleSizeOffset;
10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t mSampleSizeFieldSize;
10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t mDefaultSampleSize;
10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t mNumSampleSizes;
11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t mTimeToSampleCount;
11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t *mTimeToSample;
11320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1144678a6dc5f09008481524949a9667af5a6190374Andreas Huber    struct SampleTimeEntry {
1154678a6dc5f09008481524949a9667af5a6190374Andreas Huber        uint32_t mSampleIndex;
1164678a6dc5f09008481524949a9667af5a6190374Andreas Huber        uint32_t mCompositionTime;
1174678a6dc5f09008481524949a9667af5a6190374Andreas Huber    };
1184678a6dc5f09008481524949a9667af5a6190374Andreas Huber    SampleTimeEntry *mSampleTimeEntries;
1194678a6dc5f09008481524949a9667af5a6190374Andreas Huber
1204931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber    uint32_t *mCompositionTimeDeltaEntries;
1214931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber    size_t mNumCompositionTimeDeltaEntries;
12289aa8fe4cb00d2f24260005b008602232d678684Andreas Huber    CompositionDeltaLookup *mCompositionDeltaLookup;
1234931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber
124c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong    off64_t mSyncSampleOffset;
12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t mNumSyncSamples;
1268bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber    uint32_t *mSyncSamples;
1278bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber    size_t mLastSyncSampleIndex;
12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
129c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber    SampleIterator *mSampleIterator;
130c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber
131c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber    struct SampleToChunkEntry {
132c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber        uint32_t startChunk;
133c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber        uint32_t samplesPerChunk;
134c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber        uint32_t chunkDesc;
135c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber    };
136c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber    SampleToChunkEntry *mSampleToChunkEntries;
137c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber
138c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber    friend struct SampleIterator;
139c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber
140c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber    status_t getSampleSize_l(uint32_t sample_index, size_t *sample_size);
14189aa8fe4cb00d2f24260005b008602232d678684Andreas Huber    uint32_t getCompositionTimeOffset(uint32_t sampleIndex);
1424931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber
1434678a6dc5f09008481524949a9667af5a6190374Andreas Huber    static int CompareIncreasingTime(const void *, const void *);
1444678a6dc5f09008481524949a9667af5a6190374Andreas Huber
1454678a6dc5f09008481524949a9667af5a6190374Andreas Huber    void buildSampleEntriesTable();
1464678a6dc5f09008481524949a9667af5a6190374Andreas Huber
14720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    SampleTable(const SampleTable &);
14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    SampleTable &operator=(const SampleTable &);
14920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
15020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
15220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif  // SAMPLE_TABLE_H_
154