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#define LOG_TAG "SampleTable" 18c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber//#define LOG_NDEBUG 0 1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Log.h> 2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2189e69da4d86348409994c9dafbbb2634ccd7c196Andreas Huber#include "include/SampleTable.h" 22c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber#include "include/SampleIterator.h" 2389e69da4d86348409994c9dafbbb2634ccd7c196Andreas Huber 2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <arpa/inet.h> 2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2689aa8fe4cb00d2f24260005b008602232d678684Andreas Huber#include <media/stagefright/foundation/ADebug.h> 2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/DataSource.h> 2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/Utils.h> 2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 32c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber// static 33c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huberconst uint32_t SampleTable::kChunkOffsetType32 = FOURCC('s', 't', 'c', 'o'); 34c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber// static 35c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huberconst uint32_t SampleTable::kChunkOffsetType64 = FOURCC('c', 'o', '6', '4'); 36c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber// static 37c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huberconst uint32_t SampleTable::kSampleSizeType32 = FOURCC('s', 't', 's', 'z'); 38c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber// static 39c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huberconst uint32_t SampleTable::kSampleSizeTypeCompact = FOURCC('s', 't', 'z', '2'); 40c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber 41c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber//////////////////////////////////////////////////////////////////////////////// 4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4389aa8fe4cb00d2f24260005b008602232d678684Andreas Huberstruct SampleTable::CompositionDeltaLookup { 4489aa8fe4cb00d2f24260005b008602232d678684Andreas Huber CompositionDeltaLookup(); 4589aa8fe4cb00d2f24260005b008602232d678684Andreas Huber 4689aa8fe4cb00d2f24260005b008602232d678684Andreas Huber void setEntries( 4789aa8fe4cb00d2f24260005b008602232d678684Andreas Huber const uint32_t *deltaEntries, size_t numDeltaEntries); 4889aa8fe4cb00d2f24260005b008602232d678684Andreas Huber 4989aa8fe4cb00d2f24260005b008602232d678684Andreas Huber uint32_t getCompositionTimeOffset(uint32_t sampleIndex); 5089aa8fe4cb00d2f24260005b008602232d678684Andreas Huber 5189aa8fe4cb00d2f24260005b008602232d678684Andreas Huberprivate: 5289aa8fe4cb00d2f24260005b008602232d678684Andreas Huber Mutex mLock; 5389aa8fe4cb00d2f24260005b008602232d678684Andreas Huber 5489aa8fe4cb00d2f24260005b008602232d678684Andreas Huber const uint32_t *mDeltaEntries; 5589aa8fe4cb00d2f24260005b008602232d678684Andreas Huber size_t mNumDeltaEntries; 5689aa8fe4cb00d2f24260005b008602232d678684Andreas Huber 5789aa8fe4cb00d2f24260005b008602232d678684Andreas Huber size_t mCurrentDeltaEntry; 5889aa8fe4cb00d2f24260005b008602232d678684Andreas Huber size_t mCurrentEntrySampleIndex; 5989aa8fe4cb00d2f24260005b008602232d678684Andreas Huber 6089aa8fe4cb00d2f24260005b008602232d678684Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(CompositionDeltaLookup); 6189aa8fe4cb00d2f24260005b008602232d678684Andreas Huber}; 6289aa8fe4cb00d2f24260005b008602232d678684Andreas Huber 6389aa8fe4cb00d2f24260005b008602232d678684Andreas HuberSampleTable::CompositionDeltaLookup::CompositionDeltaLookup() 6489aa8fe4cb00d2f24260005b008602232d678684Andreas Huber : mDeltaEntries(NULL), 6589aa8fe4cb00d2f24260005b008602232d678684Andreas Huber mNumDeltaEntries(0), 6689aa8fe4cb00d2f24260005b008602232d678684Andreas Huber mCurrentDeltaEntry(0), 6789aa8fe4cb00d2f24260005b008602232d678684Andreas Huber mCurrentEntrySampleIndex(0) { 6889aa8fe4cb00d2f24260005b008602232d678684Andreas Huber} 6989aa8fe4cb00d2f24260005b008602232d678684Andreas Huber 7089aa8fe4cb00d2f24260005b008602232d678684Andreas Hubervoid SampleTable::CompositionDeltaLookup::setEntries( 7189aa8fe4cb00d2f24260005b008602232d678684Andreas Huber const uint32_t *deltaEntries, size_t numDeltaEntries) { 7289aa8fe4cb00d2f24260005b008602232d678684Andreas Huber Mutex::Autolock autolock(mLock); 7389aa8fe4cb00d2f24260005b008602232d678684Andreas Huber 7489aa8fe4cb00d2f24260005b008602232d678684Andreas Huber mDeltaEntries = deltaEntries; 7589aa8fe4cb00d2f24260005b008602232d678684Andreas Huber mNumDeltaEntries = numDeltaEntries; 7689aa8fe4cb00d2f24260005b008602232d678684Andreas Huber mCurrentDeltaEntry = 0; 7789aa8fe4cb00d2f24260005b008602232d678684Andreas Huber mCurrentEntrySampleIndex = 0; 7889aa8fe4cb00d2f24260005b008602232d678684Andreas Huber} 7989aa8fe4cb00d2f24260005b008602232d678684Andreas Huber 8089aa8fe4cb00d2f24260005b008602232d678684Andreas Huberuint32_t SampleTable::CompositionDeltaLookup::getCompositionTimeOffset( 8189aa8fe4cb00d2f24260005b008602232d678684Andreas Huber uint32_t sampleIndex) { 8289aa8fe4cb00d2f24260005b008602232d678684Andreas Huber Mutex::Autolock autolock(mLock); 8389aa8fe4cb00d2f24260005b008602232d678684Andreas Huber 8489aa8fe4cb00d2f24260005b008602232d678684Andreas Huber if (mDeltaEntries == NULL) { 8589aa8fe4cb00d2f24260005b008602232d678684Andreas Huber return 0; 8689aa8fe4cb00d2f24260005b008602232d678684Andreas Huber } 8789aa8fe4cb00d2f24260005b008602232d678684Andreas Huber 8889aa8fe4cb00d2f24260005b008602232d678684Andreas Huber if (sampleIndex < mCurrentEntrySampleIndex) { 8989aa8fe4cb00d2f24260005b008602232d678684Andreas Huber mCurrentDeltaEntry = 0; 9089aa8fe4cb00d2f24260005b008602232d678684Andreas Huber mCurrentEntrySampleIndex = 0; 9189aa8fe4cb00d2f24260005b008602232d678684Andreas Huber } 9289aa8fe4cb00d2f24260005b008602232d678684Andreas Huber 9389aa8fe4cb00d2f24260005b008602232d678684Andreas Huber while (mCurrentDeltaEntry < mNumDeltaEntries) { 9489aa8fe4cb00d2f24260005b008602232d678684Andreas Huber uint32_t sampleCount = mDeltaEntries[2 * mCurrentDeltaEntry]; 9589aa8fe4cb00d2f24260005b008602232d678684Andreas Huber if (sampleIndex < mCurrentEntrySampleIndex + sampleCount) { 9689aa8fe4cb00d2f24260005b008602232d678684Andreas Huber return mDeltaEntries[2 * mCurrentDeltaEntry + 1]; 9789aa8fe4cb00d2f24260005b008602232d678684Andreas Huber } 9889aa8fe4cb00d2f24260005b008602232d678684Andreas Huber 9989aa8fe4cb00d2f24260005b008602232d678684Andreas Huber mCurrentEntrySampleIndex += sampleCount; 10089aa8fe4cb00d2f24260005b008602232d678684Andreas Huber ++mCurrentDeltaEntry; 10189aa8fe4cb00d2f24260005b008602232d678684Andreas Huber } 10289aa8fe4cb00d2f24260005b008602232d678684Andreas Huber 10389aa8fe4cb00d2f24260005b008602232d678684Andreas Huber return 0; 10489aa8fe4cb00d2f24260005b008602232d678684Andreas Huber} 10589aa8fe4cb00d2f24260005b008602232d678684Andreas Huber 10689aa8fe4cb00d2f24260005b008602232d678684Andreas Huber//////////////////////////////////////////////////////////////////////////////// 10789aa8fe4cb00d2f24260005b008602232d678684Andreas Huber 108693d271e62a3726689ff68f4505ba49228eb94b2Andreas HuberSampleTable::SampleTable(const sp<DataSource> &source) 10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber : mDataSource(source), 11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mChunkOffsetOffset(-1), 11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mChunkOffsetType(0), 11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mNumChunkOffsets(0), 11320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mSampleToChunkOffset(-1), 11420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mNumSampleToChunkOffsets(0), 11520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mSampleSizeOffset(-1), 11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mSampleSizeFieldSize(0), 11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mDefaultSampleSize(0), 11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mNumSampleSizes(0), 11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mTimeToSampleCount(0), 12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mTimeToSample(NULL), 1214678a6dc5f09008481524949a9667af5a6190374Andreas Huber mSampleTimeEntries(NULL), 1224931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber mCompositionTimeDeltaEntries(NULL), 1234931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber mNumCompositionTimeDeltaEntries(0), 12489aa8fe4cb00d2f24260005b008602232d678684Andreas Huber mCompositionDeltaLookup(new CompositionDeltaLookup), 12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mSyncSampleOffset(-1), 126c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber mNumSyncSamples(0), 1278bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber mSyncSamples(NULL), 1288bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber mLastSyncSampleIndex(0), 129c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber mSampleToChunkEntries(NULL) { 130c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber mSampleIterator = new SampleIterator(this); 13120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 13320111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberSampleTable::~SampleTable() { 134c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber delete[] mSampleToChunkEntries; 135c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber mSampleToChunkEntries = NULL; 136c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber 1378bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber delete[] mSyncSamples; 1388bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber mSyncSamples = NULL; 1398bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber 14089aa8fe4cb00d2f24260005b008602232d678684Andreas Huber delete mCompositionDeltaLookup; 14189aa8fe4cb00d2f24260005b008602232d678684Andreas Huber mCompositionDeltaLookup = NULL; 14289aa8fe4cb00d2f24260005b008602232d678684Andreas Huber 1434931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber delete[] mCompositionTimeDeltaEntries; 1444931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber mCompositionTimeDeltaEntries = NULL; 1454931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber 1464678a6dc5f09008481524949a9667af5a6190374Andreas Huber delete[] mSampleTimeEntries; 1474678a6dc5f09008481524949a9667af5a6190374Andreas Huber mSampleTimeEntries = NULL; 1484678a6dc5f09008481524949a9667af5a6190374Andreas Huber 14920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber delete[] mTimeToSample; 15020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mTimeToSample = NULL; 151c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber 152c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber delete mSampleIterator; 153c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber mSampleIterator = NULL; 15420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 156169c286ed166499c5099d2b336967e0bf3d25551Andreas Huberbool SampleTable::isValid() const { 157169c286ed166499c5099d2b336967e0bf3d25551Andreas Huber return mChunkOffsetOffset >= 0 158169c286ed166499c5099d2b336967e0bf3d25551Andreas Huber && mSampleToChunkOffset >= 0 159169c286ed166499c5099d2b336967e0bf3d25551Andreas Huber && mSampleSizeOffset >= 0 160169c286ed166499c5099d2b336967e0bf3d25551Andreas Huber && mTimeToSample != NULL; 161169c286ed166499c5099d2b336967e0bf3d25551Andreas Huber} 162169c286ed166499c5099d2b336967e0bf3d25551Andreas Huber 16320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t SampleTable::setChunkOffsetParams( 164c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong uint32_t type, off64_t data_offset, size_t data_size) { 16520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (mChunkOffsetOffset >= 0) { 16620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_MALFORMED; 16720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 16820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1690c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber CHECK(type == kChunkOffsetType32 || type == kChunkOffsetType64); 17020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 17120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mChunkOffsetOffset = data_offset; 17220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mChunkOffsetType = type; 17320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 17420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (data_size < 8) { 17520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_MALFORMED; 17620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 17720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 17820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint8_t header[8]; 17934769bc913e9f6bb138e666d94a9d685bf3da217Andreas Huber if (mDataSource->readAt( 18020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data_offset, header, sizeof(header)) < (ssize_t)sizeof(header)) { 18120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_IO; 18220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 18320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 18420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (U32_AT(header) != 0) { 18520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // Expected version = 0, flags = 0. 18620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_MALFORMED; 18720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 18820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 18920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mNumChunkOffsets = U32_AT(&header[4]); 19020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 19120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (mChunkOffsetType == kChunkOffsetType32) { 19220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (data_size < 8 + mNumChunkOffsets * 4) { 19320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_MALFORMED; 19420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 19520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } else { 19620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (data_size < 8 + mNumChunkOffsets * 8) { 19720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_MALFORMED; 19820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 19920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 20020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 20120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 20220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 20320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 20420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t SampleTable::setSampleToChunkParams( 205c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong off64_t data_offset, size_t data_size) { 20620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (mSampleToChunkOffset >= 0) { 20720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_MALFORMED; 20820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 20920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mSampleToChunkOffset = data_offset; 21120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (data_size < 8) { 21320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_MALFORMED; 21420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 21520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint8_t header[8]; 21734769bc913e9f6bb138e666d94a9d685bf3da217Andreas Huber if (mDataSource->readAt( 21820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data_offset, header, sizeof(header)) < (ssize_t)sizeof(header)) { 21920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_IO; 22020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 22120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 22220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (U32_AT(header) != 0) { 22320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // Expected version = 0, flags = 0. 22420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_MALFORMED; 22520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 22620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 22720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mNumSampleToChunkOffsets = U32_AT(&header[4]); 22820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 22920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (data_size < 8 + mNumSampleToChunkOffsets * 12) { 23020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_MALFORMED; 23120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 23220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 233c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber mSampleToChunkEntries = 234c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber new SampleToChunkEntry[mNumSampleToChunkOffsets]; 235c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber 236c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber for (uint32_t i = 0; i < mNumSampleToChunkOffsets; ++i) { 237c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber uint8_t buffer[12]; 238c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber if (mDataSource->readAt( 239c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber mSampleToChunkOffset + 8 + i * 12, buffer, sizeof(buffer)) 240c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber != (ssize_t)sizeof(buffer)) { 241c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber return ERROR_IO; 242c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber } 243c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber 244c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber CHECK(U32_AT(buffer) >= 1); // chunk index is 1 based in the spec. 245c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber 246c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber // We want the chunk index to be 0-based. 247c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber mSampleToChunkEntries[i].startChunk = U32_AT(buffer) - 1; 248c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber mSampleToChunkEntries[i].samplesPerChunk = U32_AT(&buffer[4]); 249c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber mSampleToChunkEntries[i].chunkDesc = U32_AT(&buffer[8]); 250c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber } 251c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber 25220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 25320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 25420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 25520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t SampleTable::setSampleSizeParams( 256c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong uint32_t type, off64_t data_offset, size_t data_size) { 25720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (mSampleSizeOffset >= 0) { 25820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_MALFORMED; 25920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 26020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2610c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber CHECK(type == kSampleSizeType32 || type == kSampleSizeTypeCompact); 26220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 26320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mSampleSizeOffset = data_offset; 26420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 26520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (data_size < 12) { 26620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_MALFORMED; 26720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 26820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 26920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint8_t header[12]; 27034769bc913e9f6bb138e666d94a9d685bf3da217Andreas Huber if (mDataSource->readAt( 27120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data_offset, header, sizeof(header)) < (ssize_t)sizeof(header)) { 27220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_IO; 27320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 27420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 27520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (U32_AT(header) != 0) { 27620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // Expected version = 0, flags = 0. 27720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_MALFORMED; 27820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 27920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 28020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mDefaultSampleSize = U32_AT(&header[4]); 28120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mNumSampleSizes = U32_AT(&header[8]); 28220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 28320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (type == kSampleSizeType32) { 28420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mSampleSizeFieldSize = 32; 28520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 28620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (mDefaultSampleSize != 0) { 28720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 28820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 28920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 29020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (data_size < 12 + mNumSampleSizes * 4) { 29120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_MALFORMED; 29220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 29320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } else { 29420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if ((mDefaultSampleSize & 0xffffff00) != 0) { 29520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // The high 24 bits are reserved and must be 0. 29620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_MALFORMED; 29720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 29820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2999f753df58a70f20db220af31cb202bbd21b30f36Andreas Huber mSampleSizeFieldSize = mDefaultSampleSize & 0xff; 30020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mDefaultSampleSize = 0; 30120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 30220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (mSampleSizeFieldSize != 4 && mSampleSizeFieldSize != 8 30320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber && mSampleSizeFieldSize != 16) { 30420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_MALFORMED; 30520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 30620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 30720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (data_size < 12 + (mNumSampleSizes * mSampleSizeFieldSize + 4) / 8) { 30820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_MALFORMED; 30920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 31020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 31120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 31220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 31320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 31420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 31520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t SampleTable::setTimeToSampleParams( 316c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong off64_t data_offset, size_t data_size) { 31720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (mTimeToSample != NULL || data_size < 8) { 31820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_MALFORMED; 31920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 32020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 32120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint8_t header[8]; 32234769bc913e9f6bb138e666d94a9d685bf3da217Andreas Huber if (mDataSource->readAt( 32320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data_offset, header, sizeof(header)) < (ssize_t)sizeof(header)) { 32420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_IO; 32520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 32620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 32720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (U32_AT(header) != 0) { 32820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // Expected version = 0, flags = 0. 32920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_MALFORMED; 33020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 33120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 33220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mTimeToSampleCount = U32_AT(&header[4]); 333edd4a76eb4747bd19ed122df46fa46b452c12a0dRobert Shih uint64_t allocSize = mTimeToSampleCount * 2 * sizeof(uint32_t); 334edd4a76eb4747bd19ed122df46fa46b452c12a0dRobert Shih if (allocSize > SIZE_MAX) { 335edd4a76eb4747bd19ed122df46fa46b452c12a0dRobert Shih return ERROR_OUT_OF_RANGE; 336edd4a76eb4747bd19ed122df46fa46b452c12a0dRobert Shih } 33720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mTimeToSample = new uint32_t[mTimeToSampleCount * 2]; 33820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 33920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber size_t size = sizeof(uint32_t) * mTimeToSampleCount * 2; 34034769bc913e9f6bb138e666d94a9d685bf3da217Andreas Huber if (mDataSource->readAt( 34120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data_offset + 8, mTimeToSample, size) < (ssize_t)size) { 34220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_IO; 34320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 34420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 34520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber for (uint32_t i = 0; i < mTimeToSampleCount * 2; ++i) { 34620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mTimeToSample[i] = ntohl(mTimeToSample[i]); 34720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 34820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 34920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 35020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 35120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3524931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huberstatus_t SampleTable::setCompositionTimeToSampleParams( 3534931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber off64_t data_offset, size_t data_size) { 354df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("There are reordered frames present."); 3554931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber 3564931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber if (mCompositionTimeDeltaEntries != NULL || data_size < 8) { 3574931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber return ERROR_MALFORMED; 3584931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber } 3594931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber 3604931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber uint8_t header[8]; 3614931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber if (mDataSource->readAt( 3624931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber data_offset, header, sizeof(header)) 3634931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber < (ssize_t)sizeof(header)) { 3644931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber return ERROR_IO; 3654931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber } 3664931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber 3674931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber if (U32_AT(header) != 0) { 3684931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber // Expected version = 0, flags = 0. 3694931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber return ERROR_MALFORMED; 3704931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber } 3714931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber 3724931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber size_t numEntries = U32_AT(&header[4]); 3734931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber 3744931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber if (data_size != (numEntries + 1) * 8) { 3754931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber return ERROR_MALFORMED; 3764931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber } 3774931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber 3784931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber mNumCompositionTimeDeltaEntries = numEntries; 379edd4a76eb4747bd19ed122df46fa46b452c12a0dRobert Shih uint64_t allocSize = numEntries * 2 * sizeof(uint32_t); 380edd4a76eb4747bd19ed122df46fa46b452c12a0dRobert Shih if (allocSize > SIZE_MAX) { 381edd4a76eb4747bd19ed122df46fa46b452c12a0dRobert Shih return ERROR_OUT_OF_RANGE; 382edd4a76eb4747bd19ed122df46fa46b452c12a0dRobert Shih } 383edd4a76eb4747bd19ed122df46fa46b452c12a0dRobert Shih 3844931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber mCompositionTimeDeltaEntries = new uint32_t[2 * numEntries]; 3854931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber 3864931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber if (mDataSource->readAt( 3874931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber data_offset + 8, mCompositionTimeDeltaEntries, numEntries * 8) 3884931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber < (ssize_t)numEntries * 8) { 3894931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber delete[] mCompositionTimeDeltaEntries; 3904931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber mCompositionTimeDeltaEntries = NULL; 3914931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber 3924931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber return ERROR_IO; 3934931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber } 3944931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber 3954931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber for (size_t i = 0; i < 2 * numEntries; ++i) { 3964931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber mCompositionTimeDeltaEntries[i] = ntohl(mCompositionTimeDeltaEntries[i]); 3974931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber } 3984931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber 39989aa8fe4cb00d2f24260005b008602232d678684Andreas Huber mCompositionDeltaLookup->setEntries( 40089aa8fe4cb00d2f24260005b008602232d678684Andreas Huber mCompositionTimeDeltaEntries, mNumCompositionTimeDeltaEntries); 40189aa8fe4cb00d2f24260005b008602232d678684Andreas Huber 4024931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber return OK; 4034931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber} 4044931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber 405c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dongstatus_t SampleTable::setSyncSampleParams(off64_t data_offset, size_t data_size) { 40620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (mSyncSampleOffset >= 0 || data_size < 8) { 40720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_MALFORMED; 40820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 40920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 41020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mSyncSampleOffset = data_offset; 41120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 41220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint8_t header[8]; 41334769bc913e9f6bb138e666d94a9d685bf3da217Andreas Huber if (mDataSource->readAt( 41420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber data_offset, header, sizeof(header)) < (ssize_t)sizeof(header)) { 41520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_IO; 41620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 41720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 41820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (U32_AT(header) != 0) { 41920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // Expected version = 0, flags = 0. 42020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_MALFORMED; 42120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 42220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 42320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mNumSyncSamples = U32_AT(&header[4]); 42420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 42520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (mNumSyncSamples < 2) { 4263856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Table of sync samples is empty or has only a single entry!"); 42720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 4288bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber 429edd4a76eb4747bd19ed122df46fa46b452c12a0dRobert Shih uint64_t allocSize = mNumSyncSamples * sizeof(uint32_t); 430edd4a76eb4747bd19ed122df46fa46b452c12a0dRobert Shih if (allocSize > SIZE_MAX) { 431edd4a76eb4747bd19ed122df46fa46b452c12a0dRobert Shih return ERROR_OUT_OF_RANGE; 432edd4a76eb4747bd19ed122df46fa46b452c12a0dRobert Shih } 433edd4a76eb4747bd19ed122df46fa46b452c12a0dRobert Shih 4348bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber mSyncSamples = new uint32_t[mNumSyncSamples]; 4358bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber size_t size = mNumSyncSamples * sizeof(uint32_t); 4368bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber if (mDataSource->readAt(mSyncSampleOffset + 8, mSyncSamples, size) 4378bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber != (ssize_t)size) { 4388bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber return ERROR_IO; 4398bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber } 4408bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber 4418bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber for (size_t i = 0; i < mNumSyncSamples; ++i) { 4428bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber mSyncSamples[i] = ntohl(mSyncSamples[i]) - 1; 4438bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber } 4448bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber 44520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 44620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 44720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 44820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberuint32_t SampleTable::countChunkOffsets() const { 44920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return mNumChunkOffsets; 45020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 45120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 45220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberuint32_t SampleTable::countSamples() const { 45320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return mNumSampleSizes; 45420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 45520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 45620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t SampleTable::getMaxSampleSize(size_t *max_size) { 45720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Mutex::Autolock autoLock(mLock); 45820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 45920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *max_size = 0; 46020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 46120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber for (uint32_t i = 0; i < mNumSampleSizes; ++i) { 46220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber size_t sample_size; 463c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber status_t err = getSampleSize_l(i, &sample_size); 464da76c64dee7d95c967e2841302300cfb081e67b2Andreas Huber 46520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (err != OK) { 46620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 46720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 46820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 46920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (sample_size > *max_size) { 47020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *max_size = sample_size; 47120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 47220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 47320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 47420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 47520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 47620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 477da76c64dee7d95c967e2841302300cfb081e67b2Andreas Huberuint32_t abs_difference(uint32_t time1, uint32_t time2) { 478da76c64dee7d95c967e2841302300cfb081e67b2Andreas Huber return time1 > time2 ? time1 - time2 : time2 - time1; 479da76c64dee7d95c967e2841302300cfb081e67b2Andreas Huber} 480da76c64dee7d95c967e2841302300cfb081e67b2Andreas Huber 4814678a6dc5f09008481524949a9667af5a6190374Andreas Huber// static 4824678a6dc5f09008481524949a9667af5a6190374Andreas Huberint SampleTable::CompareIncreasingTime(const void *_a, const void *_b) { 4834678a6dc5f09008481524949a9667af5a6190374Andreas Huber const SampleTimeEntry *a = (const SampleTimeEntry *)_a; 4844678a6dc5f09008481524949a9667af5a6190374Andreas Huber const SampleTimeEntry *b = (const SampleTimeEntry *)_b; 4854931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber 4864678a6dc5f09008481524949a9667af5a6190374Andreas Huber if (a->mCompositionTime < b->mCompositionTime) { 4874678a6dc5f09008481524949a9667af5a6190374Andreas Huber return -1; 4884678a6dc5f09008481524949a9667af5a6190374Andreas Huber } else if (a->mCompositionTime > b->mCompositionTime) { 4894678a6dc5f09008481524949a9667af5a6190374Andreas Huber return 1; 4904678a6dc5f09008481524949a9667af5a6190374Andreas Huber } 491abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber 4924678a6dc5f09008481524949a9667af5a6190374Andreas Huber return 0; 4934678a6dc5f09008481524949a9667af5a6190374Andreas Huber} 4944678a6dc5f09008481524949a9667af5a6190374Andreas Huber 4954678a6dc5f09008481524949a9667af5a6190374Andreas Hubervoid SampleTable::buildSampleEntriesTable() { 49620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Mutex::Autolock autoLock(mLock); 49720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4984678a6dc5f09008481524949a9667af5a6190374Andreas Huber if (mSampleTimeEntries != NULL) { 4994678a6dc5f09008481524949a9667af5a6190374Andreas Huber return; 5004678a6dc5f09008481524949a9667af5a6190374Andreas Huber } 5014678a6dc5f09008481524949a9667af5a6190374Andreas Huber 5024678a6dc5f09008481524949a9667af5a6190374Andreas Huber mSampleTimeEntries = new SampleTimeEntry[mNumSampleSizes]; 5034678a6dc5f09008481524949a9667af5a6190374Andreas Huber 5044678a6dc5f09008481524949a9667af5a6190374Andreas Huber uint32_t sampleIndex = 0; 5054678a6dc5f09008481524949a9667af5a6190374Andreas Huber uint32_t sampleTime = 0; 5064678a6dc5f09008481524949a9667af5a6190374Andreas Huber 50720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber for (uint32_t i = 0; i < mTimeToSampleCount; ++i) { 50820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t n = mTimeToSample[2 * i]; 50920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t delta = mTimeToSample[2 * i + 1]; 51020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5114678a6dc5f09008481524949a9667af5a6190374Andreas Huber for (uint32_t j = 0; j < n; ++j) { 51265a2670e84f44f6cdd80d625a7248fc65319ab8cAndreas Huber if (sampleIndex < mNumSampleSizes) { 51365a2670e84f44f6cdd80d625a7248fc65319ab8cAndreas Huber // Technically this should always be the case if the file 51465a2670e84f44f6cdd80d625a7248fc65319ab8cAndreas Huber // is well-formed, but you know... there's (gasp) malformed 51565a2670e84f44f6cdd80d625a7248fc65319ab8cAndreas Huber // content out there. 51620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 51765a2670e84f44f6cdd80d625a7248fc65319ab8cAndreas Huber mSampleTimeEntries[sampleIndex].mSampleIndex = sampleIndex; 518abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber 51989aa8fe4cb00d2f24260005b008602232d678684Andreas Huber uint32_t compTimeDelta = 52089aa8fe4cb00d2f24260005b008602232d678684Andreas Huber mCompositionDeltaLookup->getCompositionTimeOffset( 52189aa8fe4cb00d2f24260005b008602232d678684Andreas Huber sampleIndex); 52289aa8fe4cb00d2f24260005b008602232d678684Andreas Huber 52365a2670e84f44f6cdd80d625a7248fc65319ab8cAndreas Huber mSampleTimeEntries[sampleIndex].mCompositionTime = 52489aa8fe4cb00d2f24260005b008602232d678684Andreas Huber sampleTime + compTimeDelta; 52565a2670e84f44f6cdd80d625a7248fc65319ab8cAndreas Huber } 5264678a6dc5f09008481524949a9667af5a6190374Andreas Huber 5274678a6dc5f09008481524949a9667af5a6190374Andreas Huber ++sampleIndex; 5284678a6dc5f09008481524949a9667af5a6190374Andreas Huber sampleTime += delta; 5294678a6dc5f09008481524949a9667af5a6190374Andreas Huber } 5304678a6dc5f09008481524949a9667af5a6190374Andreas Huber } 5314678a6dc5f09008481524949a9667af5a6190374Andreas Huber 5324678a6dc5f09008481524949a9667af5a6190374Andreas Huber qsort(mSampleTimeEntries, mNumSampleSizes, sizeof(SampleTimeEntry), 5334678a6dc5f09008481524949a9667af5a6190374Andreas Huber CompareIncreasingTime); 5344678a6dc5f09008481524949a9667af5a6190374Andreas Huber} 5354678a6dc5f09008481524949a9667af5a6190374Andreas Huber 5364678a6dc5f09008481524949a9667af5a6190374Andreas Huberstatus_t SampleTable::findSampleAtTime( 537599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar uint64_t req_time, uint64_t scale_num, uint64_t scale_den, 538599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar uint32_t *sample_index, uint32_t flags) { 5394678a6dc5f09008481524949a9667af5a6190374Andreas Huber buildSampleEntriesTable(); 5404678a6dc5f09008481524949a9667af5a6190374Andreas Huber 5414678a6dc5f09008481524949a9667af5a6190374Andreas Huber uint32_t left = 0; 542225d5b20409fd400bfa4ed5e9bc1d5babb498471Lajos Molnar uint32_t right_plus_one = mNumSampleSizes; 543225d5b20409fd400bfa4ed5e9bc1d5babb498471Lajos Molnar while (left < right_plus_one) { 544225d5b20409fd400bfa4ed5e9bc1d5babb498471Lajos Molnar uint32_t center = left + (right_plus_one - left) / 2; 545599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar uint64_t centerTime = 546599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar getSampleTime(center, scale_num, scale_den); 5474678a6dc5f09008481524949a9667af5a6190374Andreas Huber 5484678a6dc5f09008481524949a9667af5a6190374Andreas Huber if (req_time < centerTime) { 549225d5b20409fd400bfa4ed5e9bc1d5babb498471Lajos Molnar right_plus_one = center; 5504678a6dc5f09008481524949a9667af5a6190374Andreas Huber } else if (req_time > centerTime) { 5514678a6dc5f09008481524949a9667af5a6190374Andreas Huber left = center + 1; 5524678a6dc5f09008481524949a9667af5a6190374Andreas Huber } else { 553599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar *sample_index = mSampleTimeEntries[center].mSampleIndex; 554599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar return OK; 5554678a6dc5f09008481524949a9667af5a6190374Andreas Huber } 5564678a6dc5f09008481524949a9667af5a6190374Andreas Huber } 5574678a6dc5f09008481524949a9667af5a6190374Andreas Huber 558599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar uint32_t closestIndex = left; 559599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar 560599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar if (closestIndex == mNumSampleSizes) { 561a488c7daf91357611fcdbff7a32e5a73ec630070Andreas Huber if (flags == kFlagAfter) { 562a488c7daf91357611fcdbff7a32e5a73ec630070Andreas Huber return ERROR_OUT_OF_RANGE; 563a488c7daf91357611fcdbff7a32e5a73ec630070Andreas Huber } 564599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar flags = kFlagBefore; 565599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar } else if (closestIndex == 0) { 566599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar if (flags == kFlagBefore) { 567599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar // normally we should return out of range, but that is 568599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar // treated as end-of-stream. instead return first sample 569599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar // 570599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar // return ERROR_OUT_OF_RANGE; 571599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar } 572599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar flags = kFlagAfter; 5734678a6dc5f09008481524949a9667af5a6190374Andreas Huber } 5744678a6dc5f09008481524949a9667af5a6190374Andreas Huber 5754678a6dc5f09008481524949a9667af5a6190374Andreas Huber switch (flags) { 5764678a6dc5f09008481524949a9667af5a6190374Andreas Huber case kFlagBefore: 5774678a6dc5f09008481524949a9667af5a6190374Andreas Huber { 578599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar --closestIndex; 5794678a6dc5f09008481524949a9667af5a6190374Andreas Huber break; 5804678a6dc5f09008481524949a9667af5a6190374Andreas Huber } 58120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5824678a6dc5f09008481524949a9667af5a6190374Andreas Huber case kFlagAfter: 5834678a6dc5f09008481524949a9667af5a6190374Andreas Huber { 584599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar // nothing to do 5854678a6dc5f09008481524949a9667af5a6190374Andreas Huber break; 58620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 58720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5884678a6dc5f09008481524949a9667af5a6190374Andreas Huber default: 5894678a6dc5f09008481524949a9667af5a6190374Andreas Huber { 5904678a6dc5f09008481524949a9667af5a6190374Andreas Huber CHECK(flags == kFlagClosest); 591599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar // pick closest based on timestamp. use abs_difference for safety 592599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar if (abs_difference( 593599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar getSampleTime(closestIndex, scale_num, scale_den), req_time) > 594599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar abs_difference( 595599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar req_time, getSampleTime(closestIndex - 1, scale_num, scale_den))) { 596599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar --closestIndex; 5974678a6dc5f09008481524949a9667af5a6190374Andreas Huber } 5984678a6dc5f09008481524949a9667af5a6190374Andreas Huber break; 5994678a6dc5f09008481524949a9667af5a6190374Andreas Huber } 60020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 60120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 6024678a6dc5f09008481524949a9667af5a6190374Andreas Huber *sample_index = mSampleTimeEntries[closestIndex].mSampleIndex; 6034678a6dc5f09008481524949a9667af5a6190374Andreas Huber return OK; 60420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 60520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 606abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huberstatus_t SampleTable::findSyncSampleNear( 607abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber uint32_t start_sample_index, uint32_t *sample_index, uint32_t flags) { 608abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber Mutex::Autolock autoLock(mLock); 609abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber 61020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *sample_index = 0; 61120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 61220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (mSyncSampleOffset < 0) { 61320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // All samples are sync-samples. 61420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *sample_index = start_sample_index; 61520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 61620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 61720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 618abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber if (mNumSyncSamples == 0) { 619abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber *sample_index = 0; 620abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber return OK; 621abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber } 622da76c64dee7d95c967e2841302300cfb081e67b2Andreas Huber 623abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber uint32_t left = 0; 624225d5b20409fd400bfa4ed5e9bc1d5babb498471Lajos Molnar uint32_t right_plus_one = mNumSyncSamples; 625225d5b20409fd400bfa4ed5e9bc1d5babb498471Lajos Molnar while (left < right_plus_one) { 626225d5b20409fd400bfa4ed5e9bc1d5babb498471Lajos Molnar uint32_t center = left + (right_plus_one - left) / 2; 6278f76ebf90d0391a4baa8a921ed6e291dfc7891daAndreas Huber uint32_t x = mSyncSamples[center]; 62820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 6298f76ebf90d0391a4baa8a921ed6e291dfc7891daAndreas Huber if (start_sample_index < x) { 630225d5b20409fd400bfa4ed5e9bc1d5babb498471Lajos Molnar right_plus_one = center; 6318f76ebf90d0391a4baa8a921ed6e291dfc7891daAndreas Huber } else if (start_sample_index > x) { 6328f76ebf90d0391a4baa8a921ed6e291dfc7891daAndreas Huber left = center + 1; 6338f76ebf90d0391a4baa8a921ed6e291dfc7891daAndreas Huber } else { 634599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar *sample_index = x; 635599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar return OK; 63620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 637f53263a7d580fb550dbc6c8d4f104119beb82ad7James Dong } 638599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar 6398d0dd8b46163ec7b42e2051c441ae2bf96dd9aecHong Teng if (left == mNumSyncSamples) { 6408d0dd8b46163ec7b42e2051c441ae2bf96dd9aecHong Teng if (flags == kFlagAfter) { 64129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("tried to find a sync frame after the last one: %d", left); 6428d0dd8b46163ec7b42e2051c441ae2bf96dd9aecHong Teng return ERROR_OUT_OF_RANGE; 6438d0dd8b46163ec7b42e2051c441ae2bf96dd9aecHong Teng } 644599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar flags = kFlagBefore; 6458d0dd8b46163ec7b42e2051c441ae2bf96dd9aecHong Teng } 646599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar else if (left == 0) { 647599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar if (flags == kFlagBefore) { 648599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar ALOGE("tried to find a sync frame before the first one: %d", left); 649abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber 650599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar // normally we should return out of range, but that is 651599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar // treated as end-of-stream. instead seek to first sync 652599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar // 653599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar // return ERROR_OUT_OF_RANGE; 654abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber } 655599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar flags = kFlagAfter; 656abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber } 657abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber 658599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar // Now ssi[left - 1] <(=) start_sample_index <= ssi[left] 659abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber switch (flags) { 660abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber case kFlagBefore: 661abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber { 662599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar --left; 663abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber break; 664abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber } 665abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber case kFlagAfter: 666abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber { 667599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar // nothing to do 668abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber break; 669abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber } 670abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber default: 671599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar { 672599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar // this route is not used, but implement it nonetheless 673599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar CHECK(flags == kFlagClosest); 674599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar 675599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar status_t err = mSampleIterator->seekTo(start_sample_index); 676599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar if (err != OK) { 677599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar return err; 678599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar } 679599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar uint32_t sample_time = mSampleIterator->getSampleTime(); 680599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar 681599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar err = mSampleIterator->seekTo(mSyncSamples[left]); 682599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar if (err != OK) { 683599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar return err; 684599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar } 685599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar uint32_t upper_time = mSampleIterator->getSampleTime(); 686599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar 687599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar err = mSampleIterator->seekTo(mSyncSamples[left - 1]); 688599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar if (err != OK) { 689599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar return err; 690599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar } 691599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar uint32_t lower_time = mSampleIterator->getSampleTime(); 692599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar 693599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar // use abs_difference for safety 694599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar if (abs_difference(upper_time, sample_time) > 695599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar abs_difference(sample_time, lower_time)) { 696599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar --left; 697599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar } 698abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber break; 699599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar } 70020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 70120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 702599950efbb03b1672561d4cf2272504b879525e8Lajos Molnar *sample_index = mSyncSamples[left]; 70320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 70420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 70520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 7067e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huberstatus_t SampleTable::findThumbnailSample(uint32_t *sample_index) { 707c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber Mutex::Autolock autoLock(mLock); 708c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber 7097e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber if (mSyncSampleOffset < 0) { 7107e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber // All samples are sync-samples. 7117e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber *sample_index = 0; 7127e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber return OK; 7137e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber } 7147e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber 7157e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber uint32_t bestSampleIndex = 0; 7167e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber size_t maxSampleSize = 0; 7177e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber 7187e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber static const size_t kMaxNumSyncSamplesToScan = 20; 7197e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber 7207e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber // Consider the first kMaxNumSyncSamplesToScan sync samples and 7217e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber // pick the one with the largest (compressed) size as the thumbnail. 7227e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber 7237e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber size_t numSamplesToScan = mNumSyncSamples; 7247e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber if (numSamplesToScan > kMaxNumSyncSamplesToScan) { 7257e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber numSamplesToScan = kMaxNumSyncSamplesToScan; 7267e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber } 7277e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber 7287e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber for (size_t i = 0; i < numSamplesToScan; ++i) { 7298bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber uint32_t x = mSyncSamples[i]; 7307e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber 7317e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber // Now x is a sample index. 7327e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber size_t sampleSize; 733c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber status_t err = getSampleSize_l(x, &sampleSize); 7347e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber if (err != OK) { 7357e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber return err; 7367e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber } 7377e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber 7387e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber if (i == 0 || sampleSize > maxSampleSize) { 7397e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber bestSampleIndex = x; 7407e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber maxSampleSize = sampleSize; 7417e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber } 7427e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber } 7437e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber 7447e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber *sample_index = bestSampleIndex; 7457e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber 7467e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber return OK; 7477e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber} 7487e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber 749c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huberstatus_t SampleTable::getSampleSize_l( 750c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber uint32_t sampleIndex, size_t *sampleSize) { 751c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber return mSampleIterator->getSampleSizeDirect( 752c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber sampleIndex, sampleSize); 753c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber} 754c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber 755c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huberstatus_t SampleTable::getMetaDataForSample( 756c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber uint32_t sampleIndex, 757c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong off64_t *offset, 758c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber size_t *size, 7594678a6dc5f09008481524949a9667af5a6190374Andreas Huber uint32_t *compositionTime, 760170056540e9ce65261b45efd15f67e72e2df1bedRobert Shih bool *isSyncSample, 761170056540e9ce65261b45efd15f67e72e2df1bedRobert Shih uint32_t *sampleDuration) { 762c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber Mutex::Autolock autoLock(mLock); 763c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber 764c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber status_t err; 765c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber if ((err = mSampleIterator->seekTo(sampleIndex)) != OK) { 766c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber return err; 767c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber } 768c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber 769c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber if (offset) { 770c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber *offset = mSampleIterator->getSampleOffset(); 771c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber } 772c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber 773c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber if (size) { 774c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber *size = mSampleIterator->getSampleSize(); 775c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber } 776c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber 7774678a6dc5f09008481524949a9667af5a6190374Andreas Huber if (compositionTime) { 7784678a6dc5f09008481524949a9667af5a6190374Andreas Huber *compositionTime = mSampleIterator->getSampleTime(); 779c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber } 780c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber 7818bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber if (isSyncSample) { 7828bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber *isSyncSample = false; 7838bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber if (mSyncSampleOffset < 0) { 7848bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber // Every sample is a sync sample. 7858bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber *isSyncSample = true; 7868bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber } else { 7878bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber size_t i = (mLastSyncSampleIndex < mNumSyncSamples) 7888bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber && (mSyncSamples[mLastSyncSampleIndex] <= sampleIndex) 7898bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber ? mLastSyncSampleIndex : 0; 7908bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber 7918bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber while (i < mNumSyncSamples && mSyncSamples[i] < sampleIndex) { 7928bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber ++i; 7938bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber } 7948bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber 7958bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber if (i < mNumSyncSamples && mSyncSamples[i] == sampleIndex) { 7968bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber *isSyncSample = true; 7978bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber } 7988bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber 7998bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber mLastSyncSampleIndex = i; 8008bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber } 8018bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber } 8028bf59e735760af0b6a85747fd90bf8cf1e5388d7Andreas Huber 803170056540e9ce65261b45efd15f67e72e2df1bedRobert Shih if (sampleDuration) { 804170056540e9ce65261b45efd15f67e72e2df1bedRobert Shih *sampleDuration = mSampleIterator->getSampleDuration(); 805170056540e9ce65261b45efd15f67e72e2df1bedRobert Shih } 806170056540e9ce65261b45efd15f67e72e2df1bedRobert Shih 807c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber return OK; 808c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber} 809c57b67905c2128ddadfeca96785ee1f593b6605aAndreas Huber 81089aa8fe4cb00d2f24260005b008602232d678684Andreas Huberuint32_t SampleTable::getCompositionTimeOffset(uint32_t sampleIndex) { 81189aa8fe4cb00d2f24260005b008602232d678684Andreas Huber return mCompositionDeltaLookup->getCompositionTimeOffset(sampleIndex); 8124931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber} 8134931bb5259d10c1fa01e7405fb7aaef58a8ffb22Andreas Huber 81420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 81520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 816