summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/SampleIterator.cpp
diff options
context:
space:
mode:
authorDavid Williams <david.williams@sonymobile.com>2015-10-09 16:52:06 +0200
committerSteve Kondik <steve@cyngn.com>2015-12-07 18:45:16 -0800
commit3c51eb879f0fb925118d8ead8af8d511537caff8 (patch)
tree9af53d7135b7d81ab2b7de05cb486d571795bffb /media/libstagefright/SampleIterator.cpp
parent927e98324527b27ff5f6cd2ffe0c0de20bf9eed7 (diff)
downloadframeworks_av-3c51eb879f0fb925118d8ead8af8d511537caff8.zip
frameworks_av-3c51eb879f0fb925118d8ead8af8d511537caff8.tar.gz
frameworks_av-3c51eb879f0fb925118d8ead8af8d511537caff8.tar.bz2
Cached reading of stsz atom
The entire stsz atom needs to be checked, entry by entry, to determine the maximum size of a sample so that the proper buffer size can be allocated by the decoder. This change reads a block of entries at a time, cutting down the number of file reads and thus significantly increasing the performance of reading the entries. Change-Id: Ida39c2fe59bccb4440faeab1e71d8cf58682bcc3
Diffstat (limited to 'media/libstagefright/SampleIterator.cpp')
-rw-r--r--media/libstagefright/SampleIterator.cpp96
1 files changed, 61 insertions, 35 deletions
diff --git a/media/libstagefright/SampleIterator.cpp b/media/libstagefright/SampleIterator.cpp
index 032bbb9..6042a9a 100644
--- a/media/libstagefright/SampleIterator.cpp
+++ b/media/libstagefright/SampleIterator.cpp
@@ -30,6 +30,8 @@
namespace android {
+const uint32_t kMaxSampleCacheSize = 4096;
+
SampleIterator::SampleIterator(SampleTable *table)
: mTable(table),
mInitialized(false),
@@ -37,7 +39,12 @@ SampleIterator::SampleIterator(SampleTable *table)
mTTSSampleIndex(0),
mTTSSampleTime(0),
mTTSCount(0),
- mTTSDuration(0) {
+ mTTSDuration(0),
+ mSampleCache(NULL) {
+ reset();
+}
+
+SampleIterator::~SampleIterator() {
reset();
}
@@ -49,6 +56,10 @@ void SampleIterator::reset() {
mStopChunkSampleIndex = 0;
mSamplesPerChunk = 0;
mChunkDesc = 0;
+ delete[] mSampleCache;
+ mSampleCache = NULL;
+ mSampleCacheSize = 0;
+ mCurrentSampleCacheStartIndex = 0;
}
status_t SampleIterator::seekTo(uint32_t sampleIndex) {
@@ -235,58 +246,73 @@ status_t SampleIterator::getSampleSizeDirect(
return OK;
}
+ bool readNewSampleCache = false;
+
+ // Check if current sample is inside cache, otherwise read new cache
+ if (sampleIndex < mCurrentSampleCacheStartIndex ||
+ ((sampleIndex - mCurrentSampleCacheStartIndex) *
+ mTable->mSampleSizeFieldSize + 4) / 8 >= mSampleCacheSize) {
+ uint32_t prevCacheSize = mSampleCacheSize;
+ mSampleCacheSize = ((mTable->mNumSampleSizes - sampleIndex) *
+ mTable->mSampleSizeFieldSize + 4) / 8;
+ mSampleCacheSize = mSampleCacheSize > kMaxSampleCacheSize ?
+ kMaxSampleCacheSize : mSampleCacheSize;
+ mCurrentSampleCacheStartIndex = sampleIndex;
+ readNewSampleCache = true;
+ if (mSampleCacheSize != prevCacheSize) {
+ delete[] mSampleCache;
+ mSampleCache = new uint8_t[mSampleCacheSize];
+ }
+ }
+
+ if (mSampleCache == NULL) {
+ return ERROR_IO;
+ }
+
+ if (mTable->mSampleSizeFieldSize != 32 &&
+ mTable->mSampleSizeFieldSize != 16 &&
+ mTable->mSampleSizeFieldSize != 8 &&
+ mTable->mSampleSizeFieldSize != 4) {
+ return ERROR_IO;
+ }
+
+ if (readNewSampleCache) {
+ if (mTable->mDataSource->readAt(
+ mTable->mSampleSizeOffset + 12 +
+ mTable->mSampleSizeFieldSize * sampleIndex / 8,
+ mSampleCache,
+ mSampleCacheSize) < (int32_t) mSampleCacheSize) {
+ return ERROR_IO;
+ }
+ }
+
+ uint32_t cacheReadOffset = (sampleIndex - mCurrentSampleCacheStartIndex) *
+ mTable->mSampleSizeFieldSize / 8;
+
switch (mTable->mSampleSizeFieldSize) {
case 32:
{
- if (mTable->mDataSource->readAt(
- mTable->mSampleSizeOffset + 12 + 4 * sampleIndex,
- size, sizeof(*size)) < (ssize_t)sizeof(*size)) {
- return ERROR_IO;
- }
-
- *size = ntohl(*size);
+ *size = ntohl(*((size_t *) &(mSampleCache[cacheReadOffset])));
break;
}
case 16:
{
- uint16_t x;
- if (mTable->mDataSource->readAt(
- mTable->mSampleSizeOffset + 12 + 2 * sampleIndex,
- &x, sizeof(x)) < (ssize_t)sizeof(x)) {
- return ERROR_IO;
- }
-
- *size = ntohs(x);
+ *size = ntohs(*((uint16_t *) &(mSampleCache[cacheReadOffset])));
break;
}
case 8:
{
- uint8_t x;
- if (mTable->mDataSource->readAt(
- mTable->mSampleSizeOffset + 12 + sampleIndex,
- &x, sizeof(x)) < (ssize_t)sizeof(x)) {
- return ERROR_IO;
- }
-
- *size = x;
+ *size = mSampleCache[cacheReadOffset];
break;
}
default:
{
- CHECK_EQ(mTable->mSampleSizeFieldSize, 4);
-
- uint8_t x;
- if (mTable->mDataSource->readAt(
- mTable->mSampleSizeOffset + 12 + sampleIndex / 2,
- &x, sizeof(x)) < (ssize_t)sizeof(x)) {
- return ERROR_IO;
- }
-
- *size = (sampleIndex & 1) ? x & 0x0f : x >> 4;
- break;
+ *size = (sampleIndex - mCurrentSampleCacheStartIndex) & 0x01 ?
+ (mSampleCache[cacheReadOffset] & 0x0f) :
+ (mSampleCache[cacheReadOffset] & 0xf0) >> 4;
}
}