diff options
author | Andreas Huber <andih@google.com> | 2012-08-31 10:36:25 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2012-08-31 13:47:48 -0700 |
commit | f56afa4878694803a44d1b0e9a54762d1d5ab652 (patch) | |
tree | def3c51c4c88e7c416f9f4b42992de78b17fc630 /media/libstagefright/mpeg2ts/ESQueue.cpp | |
parent | dc91c885f267005e06f439a3bd592b3d8706bb50 (diff) | |
download | frameworks_av-f56afa4878694803a44d1b0e9a54762d1d5ab652.zip frameworks_av-f56afa4878694803a44d1b0e9a54762d1d5ab652.tar.gz frameworks_av-f56afa4878694803a44d1b0e9a54762d1d5ab652.tar.bz2 |
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
Diffstat (limited to 'media/libstagefright/mpeg2ts/ESQueue.cpp')
-rw-r--r-- | media/libstagefright/mpeg2ts/ESQueue.cpp | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/media/libstagefright/mpeg2ts/ESQueue.cpp b/media/libstagefright/mpeg2ts/ESQueue.cpp index 1cab077..e58e9bf 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<MetaData> ElementaryStreamQueue::getFormat() { @@ -289,6 +290,31 @@ status_t ElementaryStreamQueue::appendData( } sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnit() { + if ((mFlags & kFlag_AlignedData) && mMode == H264) { + if (mRangeInfos.empty()) { + return NULL; + } + + RangeInfo info = *mRangeInfos.begin(); + mRangeInfos.erase(mRangeInfos.begin()); + + sp<ABuffer> 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<ABuffer> ElementaryStreamQueue::dequeueAccessUnitH264() { const uint8_t *data = mBuffer->data(); - size_t size = mBuffer->size(); + size_t size = mBuffer->size(); Vector<NALPosition> nals; size_t totalSize = 0; |