summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/codecs/mp3dec
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
commitd2d947bc8717697e983062147b51b5a0e307b84f (patch)
tree8d376786ee396f8d5cda99652aed48f12e81d43e /media/libstagefright/codecs/mp3dec
parent5a48695ec3bd8845be8ab872144114ac24df629b (diff)
downloadframeworks_av-d2d947bc8717697e983062147b51b5a0e307b84f.zip
frameworks_av-d2d947bc8717697e983062147b51b5a0e307b84f.tar.gz
frameworks_av-d2d947bc8717697e983062147b51b5a0e307b84f.tar.bz2
Recover from a certain mp3 decoder error instead of signalling an error and thereby stopping decoding.
Diffstat (limited to 'media/libstagefright/codecs/mp3dec')
-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(