From 57bc23915ecc1d15c293d30463948b68885b3437 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Fri, 31 Aug 2012 10:36:25 -0700 Subject: [PATCH] Special mode for ESQueue that allows for earlier dequeuing of access units if it's know beforehand that each PES packet contains exactly one access unit. Currently this optimization is only supported for H.264 video. Change-Id: I0888027cc7e9850307484b11dba1191cf6bfac83 --- media/libstagefright/mpeg2ts/ESQueue.cpp | 32 +++++++++++++++++++++++++++++--- media/libstagefright/mpeg2ts/ESQueue.h | 8 +++++++- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/media/libstagefright/mpeg2ts/ESQueue.cpp b/media/libstagefright/mpeg2ts/ESQueue.cpp index 1cab077f30..e58e9bf6f2 100644 --- a/media/libstagefright/mpeg2ts/ESQueue.cpp +++ b/media/libstagefright/mpeg2ts/ESQueue.cpp @@ -33,8 +33,9 @@ namespace android { -ElementaryStreamQueue::ElementaryStreamQueue(Mode mode) - : mMode(mode) { +ElementaryStreamQueue::ElementaryStreamQueue(Mode mode, uint32_t flags) + : mMode(mode), + mFlags(flags) { } sp ElementaryStreamQueue::getFormat() { @@ -289,6 +290,31 @@ status_t ElementaryStreamQueue::appendData( } sp ElementaryStreamQueue::dequeueAccessUnit() { + if ((mFlags & kFlag_AlignedData) && mMode == H264) { + if (mRangeInfos.empty()) { + return NULL; + } + + RangeInfo info = *mRangeInfos.begin(); + mRangeInfos.erase(mRangeInfos.begin()); + + sp accessUnit = new ABuffer(info.mLength); + memcpy(accessUnit->data(), mBuffer->data(), info.mLength); + accessUnit->meta()->setInt64("timeUs", info.mTimestampUs); + + memmove(mBuffer->data(), + mBuffer->data() + info.mLength, + mBuffer->size() - info.mLength); + + mBuffer->setRange(0, mBuffer->size() - info.mLength); + + if (mFormat == NULL) { + mFormat = MakeAVCCodecSpecificData(accessUnit); + } + + return accessUnit; + } + switch (mMode) { case H264: return dequeueAccessUnitH264(); @@ -436,8 +462,8 @@ struct NALPosition { sp ElementaryStreamQueue::dequeueAccessUnitH264() { const uint8_t *data = mBuffer->data(); - size_t size = mBuffer->size(); + size_t size = mBuffer->size(); Vector nals; size_t totalSize = 0; diff --git a/media/libstagefright/mpeg2ts/ESQueue.h b/media/libstagefright/mpeg2ts/ESQueue.h index 4035ed3ad1..72aa2e70c8 100644 --- a/media/libstagefright/mpeg2ts/ESQueue.h +++ b/media/libstagefright/mpeg2ts/ESQueue.h @@ -36,7 +36,12 @@ struct ElementaryStreamQueue { MPEG_VIDEO, MPEG4_VIDEO, }; - ElementaryStreamQueue(Mode mode); + + enum Flags { + // Data appended to the queue is always at access unit boundaries. + kFlag_AlignedData = 1, + }; + ElementaryStreamQueue(Mode mode, uint32_t flags = 0); status_t appendData(const void *data, size_t size, int64_t timeUs); void clear(bool clearFormat); @@ -52,6 +57,7 @@ private: }; Mode mMode; + uint32_t mFlags; sp mBuffer; List mRangeInfos; -- 2.11.0