From 8bf59e735760af0b6a85747fd90bf8cf1e5388d7 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Fri, 6 Aug 2010 14:13:10 -0700 Subject: Support for communicating if a buffer read from the _extractor_ is a sync sample or not. Change-Id: Ie71506224d937cfff1fa1273bfac31c47db8845f related-to-bug: 2900534 --- media/libstagefright/SampleTable.cpp | 76 +++++++++++++++++++++--------------- 1 file changed, 45 insertions(+), 31 deletions(-) (limited to 'media/libstagefright/SampleTable.cpp') diff --git a/media/libstagefright/SampleTable.cpp b/media/libstagefright/SampleTable.cpp index 2e62f9f..27faf4f 100644 --- a/media/libstagefright/SampleTable.cpp +++ b/media/libstagefright/SampleTable.cpp @@ -55,6 +55,8 @@ SampleTable::SampleTable(const sp &source) mTimeToSample(NULL), mSyncSampleOffset(-1), mNumSyncSamples(0), + mSyncSamples(NULL), + mLastSyncSampleIndex(0), mSampleToChunkEntries(NULL) { mSampleIterator = new SampleIterator(this); } @@ -63,6 +65,9 @@ SampleTable::~SampleTable() { delete[] mSampleToChunkEntries; mSampleToChunkEntries = NULL; + delete[] mSyncSamples; + mSyncSamples = NULL; + delete[] mTimeToSample; mTimeToSample = NULL; @@ -278,6 +283,18 @@ status_t SampleTable::setSyncSampleParams(off_t data_offset, size_t data_size) { if (mNumSyncSamples < 2) { LOGW("Table of sync samples is empty or has only a single entry!"); } + + mSyncSamples = new uint32_t[mNumSyncSamples]; + size_t size = mNumSyncSamples * sizeof(uint32_t); + if (mDataSource->readAt(mSyncSampleOffset + 8, mSyncSamples, size) + != (ssize_t)size) { + return ERROR_IO; + } + + for (size_t i = 0; i < mNumSyncSamples; ++i) { + mSyncSamples[i] = ntohl(mSyncSamples[i]) - 1; + } + return OK; } @@ -394,14 +411,7 @@ status_t SampleTable::findSyncSampleNear( uint32_t left = 0; while (left < mNumSyncSamples) { - uint32_t x; - if (mDataSource->readAt( - mSyncSampleOffset + 8 + left * 4, &x, 4) != 4) { - return ERROR_IO; - } - - x = ntohl(x); - --x; + uint32_t x = mSyncSamples[left]; if (x >= start_sample_index) { break; @@ -421,14 +431,7 @@ status_t SampleTable::findSyncSampleNear( --x; if (left + 1 < mNumSyncSamples) { - uint32_t y; - if (mDataSource->readAt( - mSyncSampleOffset + 8 + (left + 1) * 4, &y, 4) != 4) { - return ERROR_IO; - } - - y = ntohl(y); - --y; + uint32_t y = mSyncSamples[left + 1]; // our sample lies between sync samples x and y. @@ -486,13 +489,7 @@ status_t SampleTable::findSyncSampleNear( return ERROR_OUT_OF_RANGE; } - if (mDataSource->readAt( - mSyncSampleOffset + 8 + (left + 1) * 4, &x, 4) != 4) { - return ERROR_IO; - } - - x = ntohl(x); - --x; + x = mSyncSamples[left + 1]; CHECK(x >= start_sample_index); } @@ -532,13 +529,7 @@ status_t SampleTable::findThumbnailSample(uint32_t *sample_index) { } for (size_t i = 0; i < numSamplesToScan; ++i) { - uint32_t x; - if (mDataSource->readAt( - mSyncSampleOffset + 8 + i * 4, &x, 4) != 4) { - return ERROR_IO; - } - x = ntohl(x); - --x; + uint32_t x = mSyncSamples[i]; // Now x is a sample index. size_t sampleSize; @@ -568,7 +559,8 @@ status_t SampleTable::getMetaDataForSample( uint32_t sampleIndex, off_t *offset, size_t *size, - uint32_t *decodingTime) { + uint32_t *decodingTime, + bool *isSyncSample) { Mutex::Autolock autoLock(mLock); status_t err; @@ -588,6 +580,28 @@ status_t SampleTable::getMetaDataForSample( *decodingTime = mSampleIterator->getSampleTime(); } + if (isSyncSample) { + *isSyncSample = false; + if (mSyncSampleOffset < 0) { + // Every sample is a sync sample. + *isSyncSample = true; + } else { + size_t i = (mLastSyncSampleIndex < mNumSyncSamples) + && (mSyncSamples[mLastSyncSampleIndex] <= sampleIndex) + ? mLastSyncSampleIndex : 0; + + while (i < mNumSyncSamples && mSyncSamples[i] < sampleIndex) { + ++i; + } + + if (i < mNumSyncSamples && mSyncSamples[i] == sampleIndex) { + *isSyncSample = true; + } + + mLastSyncSampleIndex = i; + } + } + return OK; } -- cgit v1.1