OSDN Git Service

Ignore corrupt aac audio frames and substitute silence.
authorAndreas Huber <andih@google.com>
Mon, 12 Apr 2010 16:57:05 +0000 (09:57 -0700)
committerAndreas Huber <andih@google.com>
Mon, 12 Apr 2010 16:57:05 +0000 (09:57 -0700)
Change-Id: I544f98a5c00d912061db7921fc4518435209b168
related-to-bug: 2575976

media/libstagefright/codecs/aacdec/AACDecoder.cpp

index 2ed8ef1..ae23691 100644 (file)
@@ -203,25 +203,32 @@ status_t AACDecoder::read(
 
     Int decoderErr = PVMP4AudioDecodeFrame(mConfig, mDecoderBuf);
 
+    size_t numOutBytes =
+        mConfig->frameLength * sizeof(int16_t) * mConfig->desiredChannels;
+
     if (decoderErr != MP4AUDEC_SUCCESS) {
-        LOGE("AAC decoder returned error %d", decoderErr);
+        LOGW("AAC decoder returned error %d, substituting silence", decoderErr);
 
-        buffer->release();
-        buffer = NULL;
+        memset(buffer->data(), 0, numOutBytes);
 
-        return ERROR_MALFORMED;
+        // Discard input buffer.
+        mInputBuffer->release();
+        mInputBuffer = NULL;
+
+        // fall through
     }
 
-    buffer->set_range(
-            0, mConfig->frameLength * sizeof(int16_t) * mConfig->desiredChannels);
+    buffer->set_range(0, numOutBytes);
 
-    mInputBuffer->set_range(
-            mInputBuffer->range_offset() + mConfig->inputBufferUsedLength,
-            mInputBuffer->range_length() - mConfig->inputBufferUsedLength);
+    if (mInputBuffer != NULL) {
+        mInputBuffer->set_range(
+                mInputBuffer->range_offset() + mConfig->inputBufferUsedLength,
+                mInputBuffer->range_length() - mConfig->inputBufferUsedLength);
 
-    if (mInputBuffer->range_length() == 0) {
-        mInputBuffer->release();
-        mInputBuffer = NULL;
+        if (mInputBuffer->range_length() == 0) {
+            mInputBuffer->release();
+            mInputBuffer = NULL;
+        }
     }
 
     buffer->meta_data()->setInt64(