summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-02-24 13:19:04 -0800
committerAndreas Huber <andih@google.com>2010-02-24 13:19:04 -0800
commitff0c5c1929f37f2b8034cd7be8831d9a06e6a322 (patch)
tree87a2a782edc9cfb8b79600c1bc4d4796accdd6a5
parent875d259c9572b06faaa6095a996e2a2c27a337af (diff)
downloadframeworks_base-ff0c5c1929f37f2b8034cd7be8831d9a06e6a322.zip
frameworks_base-ff0c5c1929f37f2b8034cd7be8831d9a06e6a322.tar.gz
frameworks_base-ff0c5c1929f37f2b8034cd7be8831d9a06e6a322.tar.bz2
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(