diff options
author | Andreas Huber <andih@google.com> | 2010-12-15 14:55:29 -0800 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2010-12-15 14:55:29 -0800 |
commit | ebf90ac7a82c9a0fa5c02702ccba36bc5082240f (patch) | |
tree | ead320bd7a7a003dbe2e740d6bf12bcde9e5b741 /media | |
parent | 1108306b369ad64c75c097fe6d4eb1e7ea669ab2 (diff) | |
parent | 9c5d62a5be43904081575a943fe04d3cfcc2dda8 (diff) | |
download | frameworks_base-ebf90ac7a82c9a0fa5c02702ccba36bc5082240f.zip frameworks_base-ebf90ac7a82c9a0fa5c02702ccba36bc5082240f.tar.gz frameworks_base-ebf90ac7a82c9a0fa5c02702ccba36bc5082240f.tar.bz2 |
Merge "Proper recovery of timestamp information in the transport stream parser."
Diffstat (limited to 'media')
-rw-r--r-- | media/libstagefright/codecs/aacdec/AACDecoder.cpp | 6 | ||||
-rw-r--r-- | media/libstagefright/mpeg2ts/ESQueue.cpp | 78 | ||||
-rw-r--r-- | media/libstagefright/mpeg2ts/ESQueue.h | 11 |
3 files changed, 80 insertions, 15 deletions
diff --git a/media/libstagefright/codecs/aacdec/AACDecoder.cpp b/media/libstagefright/codecs/aacdec/AACDecoder.cpp index 2171a67..208431c 100644 --- a/media/libstagefright/codecs/aacdec/AACDecoder.cpp +++ b/media/libstagefright/codecs/aacdec/AACDecoder.cpp @@ -21,8 +21,8 @@ #include "pvmp4audiodecoder_api.h" +#include <media/stagefright/foundation/ADebug.h> #include <media/stagefright/MediaBufferGroup.h> -#include <media/stagefright/MediaDebug.h> #include <media/stagefright/MediaDefs.h> #include <media/stagefright/MetaData.h> @@ -84,7 +84,7 @@ status_t AACDecoder::initCheck() { sp<MetaData> meta = mSource->getFormat(); if (meta->findData(kKeyESDS, &type, &data, &size)) { ESDS esds((const char *)data, size); - CHECK_EQ(esds.InitCheck(), OK); + CHECK_EQ(esds.InitCheck(), (status_t)OK); const void *codec_specific_data; size_t codec_specific_data_size; @@ -197,7 +197,7 @@ status_t AACDecoder::read( } MediaBuffer *buffer; - CHECK_EQ(mBufferGroup->acquire_buffer(&buffer), OK); + CHECK_EQ(mBufferGroup->acquire_buffer(&buffer), (status_t)OK); mConfig->pInputBuffer = (UChar *)mInputBuffer->data() + mInputBuffer->range_offset(); diff --git a/media/libstagefright/mpeg2ts/ESQueue.cpp b/media/libstagefright/mpeg2ts/ESQueue.cpp index 1fb7c39..4b4490d 100644 --- a/media/libstagefright/mpeg2ts/ESQueue.cpp +++ b/media/libstagefright/mpeg2ts/ESQueue.cpp @@ -45,7 +45,7 @@ void ElementaryStreamQueue::clear() { mBuffer->setRange(0, 0); } - mTimestamps.clear(); + mRangeInfos.clear(); mFormat.clear(); } @@ -171,7 +171,17 @@ status_t ElementaryStreamQueue::appendData( memcpy(mBuffer->data() + mBuffer->size(), data, size); mBuffer->setRange(0, mBuffer->size() + size); - mTimestamps.push_back(timeUs); + RangeInfo info; + info.mLength = size; + info.mTimestampUs = timeUs; + mRangeInfos.push_back(info); + +#if 0 + if (mMode == AAC) { + LOGI("size = %d, timeUs = %.2f secs", size, timeUs / 1E6); + hexdump(data, size); + } +#endif return OK; } @@ -186,6 +196,7 @@ sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnit() { } sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitAAC() { + Vector<size_t> ranges; Vector<size_t> frameOffsets; Vector<size_t> frameSizes; size_t auSize = 0; @@ -239,6 +250,7 @@ sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitAAC() { size_t headerSize = protection_absent ? 7 : 9; + ranges.push(aac_frame_length); frameOffsets.push(offset + headerSize); frameSizes.push(aac_frame_length - headerSize); auSize += aac_frame_length - headerSize; @@ -250,11 +262,23 @@ sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitAAC() { return NULL; } + int64_t timeUs = -1; + + for (size_t i = 0; i < ranges.size(); ++i) { + int64_t tmpUs = fetchTimestamp(ranges.itemAt(i)); + + if (i == 0) { + timeUs = tmpUs; + } + } + sp<ABuffer> accessUnit = new ABuffer(auSize); size_t dstOffset = 0; for (size_t i = 0; i < frameOffsets.size(); ++i) { + size_t frameOffset = frameOffsets.itemAt(i); + memcpy(accessUnit->data() + dstOffset, - mBuffer->data() + frameOffsets.itemAt(i), + mBuffer->data() + frameOffset, frameSizes.itemAt(i)); dstOffset += frameSizes.itemAt(i); @@ -264,15 +288,48 @@ sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitAAC() { mBuffer->size() - offset); mBuffer->setRange(0, mBuffer->size() - offset); - CHECK_GT(mTimestamps.size(), 0u); - int64_t timeUs = *mTimestamps.begin(); - mTimestamps.erase(mTimestamps.begin()); - - accessUnit->meta()->setInt64("time", timeUs); + if (timeUs >= 0) { + accessUnit->meta()->setInt64("time", timeUs); + } else { + LOGW("no time for AAC access unit"); + } return accessUnit; } +int64_t ElementaryStreamQueue::fetchTimestamp(size_t size) { + int64_t timeUs = -1; + bool first = true; + + while (size > 0) { + CHECK(!mRangeInfos.empty()); + + RangeInfo *info = &*mRangeInfos.begin(); + + if (first) { + timeUs = info->mTimestampUs; + first = false; + } + + if (info->mLength > size) { + info->mLength -= size; + + if (first) { + info->mTimestampUs = -1; + } + + size = 0; + } else { + size -= info->mLength; + + mRangeInfos.erase(mRangeInfos.begin()); + info = NULL; + } + } + + return timeUs; +} + // static sp<MetaData> ElementaryStreamQueue::MakeAACCodecSpecificData( unsigned profile, unsigned sampling_freq_index, @@ -410,9 +467,8 @@ sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitH264() { mBuffer->setRange(0, mBuffer->size() - nextScan); - CHECK_GT(mTimestamps.size(), 0u); - int64_t timeUs = *mTimestamps.begin(); - mTimestamps.erase(mTimestamps.begin()); + int64_t timeUs = fetchTimestamp(nextScan); + CHECK_GE(timeUs, 0ll); accessUnit->meta()->setInt64("time", timeUs); diff --git a/media/libstagefright/mpeg2ts/ESQueue.h b/media/libstagefright/mpeg2ts/ESQueue.h index 9eaf834..adce153 100644 --- a/media/libstagefright/mpeg2ts/ESQueue.h +++ b/media/libstagefright/mpeg2ts/ESQueue.h @@ -42,16 +42,25 @@ struct ElementaryStreamQueue { sp<MetaData> getFormat(); private: + struct RangeInfo { + int64_t mTimestampUs; + size_t mLength; + }; + Mode mMode; sp<ABuffer> mBuffer; - List<int64_t> mTimestamps; + List<RangeInfo> mRangeInfos; sp<MetaData> mFormat; sp<ABuffer> dequeueAccessUnitH264(); sp<ABuffer> dequeueAccessUnitAAC(); + // 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); + static sp<MetaData> MakeAACCodecSpecificData( unsigned profile, unsigned sampling_freq_index, unsigned channel_configuration); |