From 8f658214537c08e91616a3a283f940f759b65674 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Mon, 7 Dec 2009 16:32:37 -0800 Subject: Minor tweaks to the mp3 and aac software decoders, propagate duration to output format. --- media/libstagefright/codecs/aacdec/AACDecoder.cpp | 19 ++++++++++++------- media/libstagefright/codecs/mp3dec/MP3Decoder.cpp | 6 ++++++ media/libstagefright/include/AACDecoder.h | 2 +- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/media/libstagefright/codecs/aacdec/AACDecoder.cpp b/media/libstagefright/codecs/aacdec/AACDecoder.cpp index 03ac88d..5c77a3a 100644 --- a/media/libstagefright/codecs/aacdec/AACDecoder.cpp +++ b/media/libstagefright/codecs/aacdec/AACDecoder.cpp @@ -17,7 +17,7 @@ AACDecoder::AACDecoder(const sp &source) mBufferGroup(NULL), mConfig(new tPVMP4AudioDecoderExternal), mDecoderBuf(NULL), - mLastSeekTimeUs(0), + mAnchorTimeUs(0), mNumSamplesOutput(0), mInputBuffer(NULL) { } @@ -79,7 +79,7 @@ status_t AACDecoder::start(MetaData *params) { mSource->start(); - mLastSeekTimeUs = 0; + mAnchorTimeUs = 0; mNumSamplesOutput = 0; mStarted = true; @@ -112,13 +112,16 @@ sp AACDecoder::getFormat() { int32_t numChannels; int32_t sampleRate; + int64_t durationUs; CHECK(srcFormat->findInt32(kKeyChannelCount, &numChannels)); CHECK(srcFormat->findInt32(kKeySampleRate, &sampleRate)); + CHECK(srcFormat->findInt64(kKeyDuration, &durationUs)); sp meta = new MetaData; meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW); meta->setInt32(kKeyChannelCount, numChannels); meta->setInt32(kKeySampleRate, sampleRate); + meta->setInt64(kKeyDuration, durationUs); return meta; } @@ -150,11 +153,13 @@ status_t AACDecoder::read( return err; } - if (seekTimeUs >= 0) { - CHECK(mInputBuffer->meta_data()->findInt64( - kKeyTime, &mLastSeekTimeUs)); - + int64_t timeUs; + if (mInputBuffer->meta_data()->findInt64(kKeyTime, &timeUs)) { + mAnchorTimeUs = timeUs; mNumSamplesOutput = 0; + } else { + // We must have a new timestamp after seeking. + CHECK(seekTimeUs < 0); } } @@ -189,7 +194,7 @@ status_t AACDecoder::read( buffer->meta_data()->setInt64( kKeyTime, - mLastSeekTimeUs + mAnchorTimeUs + (mNumSamplesOutput * 1000000) / mConfig->samplingRate); mNumSamplesOutput += mConfig->frameLength; diff --git a/media/libstagefright/codecs/mp3dec/MP3Decoder.cpp b/media/libstagefright/codecs/mp3dec/MP3Decoder.cpp index 45e20dc..f9193c0 100644 --- a/media/libstagefright/codecs/mp3dec/MP3Decoder.cpp +++ b/media/libstagefright/codecs/mp3dec/MP3Decoder.cpp @@ -78,13 +78,16 @@ sp MP3Decoder::getFormat() { int32_t numChannels; int32_t sampleRate; + int64_t durationUs; CHECK(srcFormat->findInt32(kKeyChannelCount, &numChannels)); CHECK(srcFormat->findInt32(kKeySampleRate, &sampleRate)); + CHECK(srcFormat->findInt64(kKeyDuration, &durationUs)); sp meta = new MetaData; meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW); meta->setInt32(kKeyChannelCount, numChannels); meta->setInt32(kKeySampleRate, sampleRate); + meta->setInt64(kKeyDuration, durationUs); return meta; } @@ -120,6 +123,9 @@ status_t MP3Decoder::read( if (mInputBuffer->meta_data()->findInt64(kKeyTime, &timeUs)) { mAnchorTimeUs = timeUs; mNumSamplesOutput = 0; + } else { + // We must have a new timestamp after seeking. + CHECK(seekTimeUs < 0); } } diff --git a/media/libstagefright/include/AACDecoder.h b/media/libstagefright/include/AACDecoder.h index 303d854..f09addd 100644 --- a/media/libstagefright/include/AACDecoder.h +++ b/media/libstagefright/include/AACDecoder.h @@ -48,7 +48,7 @@ private: tPVMP4AudioDecoderExternal *mConfig; void *mDecoderBuf; - int64_t mLastSeekTimeUs; + int64_t mAnchorTimeUs; int64_t mNumSamplesOutput; MediaBuffer *mInputBuffer; -- cgit v1.1