diff options
author | Robert Shih <robertshih@google.com> | 2014-09-16 01:12:02 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-09-16 01:12:02 +0000 |
commit | 9299a6873a4b909357e031361055a888843619da (patch) | |
tree | ac4f1f9598dee0c4720a9288755ee699f43f15c8 | |
parent | db8556baf10baefd286f7654c822fd0b648e71ef (diff) | |
parent | 666c96d37203fd91ec319b8b499442696f70fd53 (diff) | |
download | frameworks_av-9299a6873a4b909357e031361055a888843619da.zip frameworks_av-9299a6873a4b909357e031361055a888843619da.tar.gz frameworks_av-9299a6873a4b909357e031361055a888843619da.tar.bz2 |
Merge "ESQueue: do not merge aac packets" into lmp-dev
-rw-r--r-- | media/libstagefright/mpeg2ts/ESQueue.cpp | 46 | ||||
-rw-r--r-- | media/libstagefright/mpeg2ts/ESQueue.h | 1 |
2 files changed, 46 insertions, 1 deletions
diff --git a/media/libstagefright/mpeg2ts/ESQueue.cpp b/media/libstagefright/mpeg2ts/ESQueue.cpp index 3c8f03e..ef1cd3d 100644 --- a/media/libstagefright/mpeg2ts/ESQueue.cpp +++ b/media/libstagefright/mpeg2ts/ESQueue.cpp @@ -604,6 +604,8 @@ sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitAAC() { // having to interpolate. // The final AAC frame may well extend into the next RangeInfo but // that's ok. + // TODO: the logic commented above is skipped because codec cannot take + // arbitrary sized input buffers; size_t offset = 0; while (offset < info.mLength) { if (offset + 7 > mBuffer->size()) { @@ -668,9 +670,12 @@ sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitAAC() { size_t headerSize = protection_absent ? 7 : 9; offset += aac_frame_length; + // TODO: move back to concatenation when codec can support arbitrary input buffers. + // For now only queue a single buffer + break; } - int64_t timeUs = fetchTimestamp(offset); + int64_t timeUs = fetchTimestampAAC(offset); sp<ABuffer> accessUnit = new ABuffer(offset); memcpy(accessUnit->data(), mBuffer->data(), offset); @@ -717,6 +722,45 @@ int64_t ElementaryStreamQueue::fetchTimestamp(size_t size) { return timeUs; } +// TODO: avoid interpolating timestamps once codec supports arbitrary sized input buffers +int64_t ElementaryStreamQueue::fetchTimestampAAC(size_t size) { + int64_t timeUs = -1; + bool first = true; + + size_t samplesize = size; + while (size > 0) { + CHECK(!mRangeInfos.empty()); + + RangeInfo *info = &*mRangeInfos.begin(); + + if (first) { + timeUs = info->mTimestampUs; + first = false; + } + + if (info->mLength > size) { + int32_t sampleRate; + CHECK(mFormat->findInt32(kKeySampleRate, &sampleRate)); + info->mLength -= size; + size_t numSamples = 1024 * size / samplesize; + info->mTimestampUs += numSamples * 1000000ll / sampleRate; + size = 0; + } else { + size -= info->mLength; + + mRangeInfos.erase(mRangeInfos.begin()); + info = NULL; + } + + } + + if (timeUs == 0ll) { + ALOGV("Returning 0 timestamp"); + } + + return timeUs; +} + struct NALPosition { size_t nalOffset; size_t nalSize; diff --git a/media/libstagefright/mpeg2ts/ESQueue.h b/media/libstagefright/mpeg2ts/ESQueue.h index a2cca77..7c81ff0 100644 --- a/media/libstagefright/mpeg2ts/ESQueue.h +++ b/media/libstagefright/mpeg2ts/ESQueue.h @@ -77,6 +77,7 @@ private: // consume a logical (compressed) access unit of size "size", // returns its timestamp in us (or -1 if no time information). int64_t fetchTimestamp(size_t size); + int64_t fetchTimestampAAC(size_t size); DISALLOW_EVIL_CONSTRUCTORS(ElementaryStreamQueue); }; |