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