summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-02-24 14:32:16 -0800
committerAndroid (Google) Code Review <android-gerrit@google.com>2010-02-24 14:32:16 -0800
commit62be8e17b07c1db834215a66d67db001b23405b7 (patch)
treec230d88b5265b3c3a0d5089f0ce29ed860c414e6
parente0e6a9c0fc4cda5ade07997d3ea4a53afb8762fd (diff)
parentff0c5c1929f37f2b8034cd7be8831d9a06e6a322 (diff)
downloadframeworks_base-62be8e17b07c1db834215a66d67db001b23405b7.zip
frameworks_base-62be8e17b07c1db834215a66d67db001b23405b7.tar.gz
frameworks_base-62be8e17b07c1db834215a66d67db001b23405b7.tar.bz2
Merge "Recover from a certain mp3 decoder error instead of signalling an error and thereby stopping decoding."
-rw-r--r--media/libstagefright/codecs/mp3dec/MP3Decoder.cpp23
1 files changed, 17 insertions, 6 deletions
diff --git a/media/libstagefright/codecs/mp3dec/MP3Decoder.cpp b/media/libstagefright/codecs/mp3dec/MP3Decoder.cpp
index f1f7194..6d6e408 100644
--- a/media/libstagefright/codecs/mp3dec/MP3Decoder.cpp
+++ b/media/libstagefright/codecs/mp3dec/MP3Decoder.cpp
@@ -160,14 +160,25 @@ status_t MP3Decoder::read(
mConfig->outputFrameSize = buffer->size() / sizeof(int16_t);
mConfig->pOutputBuffer = static_cast<int16_t *>(buffer->data());
- if (pvmp3_framedecoder(mConfig, mDecoderBuf) != NO_DECODING_ERROR) {
- buffer->release();
- buffer = NULL;
+ ERROR_CODE decoderErr;
+ if ((decoderErr = pvmp3_framedecoder(mConfig, mDecoderBuf))
+ != NO_DECODING_ERROR) {
+ LOGV("mp3 decoder returned error %d", decoderErr);
- mInputBuffer->release();
- mInputBuffer = NULL;
+ if (decoderErr != NO_ENOUGH_MAIN_DATA_ERROR) {
+ buffer->release();
+ buffer = NULL;
+
+ mInputBuffer->release();
+ mInputBuffer = NULL;
+
+ return UNKNOWN_ERROR;
+ }
- return UNKNOWN_ERROR;
+ // This is recoverable, just ignore the current frame and
+ // play silence instead.
+ memset(buffer->data(), 0, mConfig->outputFrameSize);
+ mConfig->inputBufferUsedLength = mInputBuffer->range_length();
}
buffer->set_range(