diff options
author | Andreas Huber <andih@google.com> | 2010-02-24 13:19:04 -0800 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2010-02-24 13:19:04 -0800 |
commit | d2d947bc8717697e983062147b51b5a0e307b84f (patch) | |
tree | 8d376786ee396f8d5cda99652aed48f12e81d43e | |
parent | 5a48695ec3bd8845be8ab872144114ac24df629b (diff) | |
download | frameworks_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.
-rw-r--r-- | media/libstagefright/codecs/mp3dec/MP3Decoder.cpp | 23 |
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( |