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 | ff0c5c1929f37f2b8034cd7be8831d9a06e6a322 (patch) | |
| tree | 87a2a782edc9cfb8b79600c1bc4d4796accdd6a5 | |
| parent | 875d259c9572b06faaa6095a996e2a2c27a337af (diff) | |
| download | frameworks_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.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( |
