Fixed avcodec audio decoder after API behavior change.
authorLaurent Aimar <fenrir@videolan.org>
Thu, 8 Oct 2009 19:12:01 +0000 (21:12 +0200)
committerLaurent Aimar <fenrir@videolan.org>
Thu, 8 Oct 2009 19:56:22 +0000 (21:56 +0200)
It fixes at least WMAP decoding.

modules/codec/avcodec/audio.c

index b7cd918..2f353b1 100644 (file)
@@ -306,45 +306,49 @@ aout_buffer_t * DecodeAudio ( decoder_t *p_dec, block_t **pp_block )
         return NULL;
     }
 
-    i_output = __MAX( p_block->i_buffer, p_sys->i_output_max );
-    if( i_output > p_sys->i_output_max )
-    {
-        /* Grow output buffer if necessary (eg. for PCM data) */
-        p_sys->p_output = av_realloc( p_sys->p_output, i_output );
-    }
-
     *pp_block = p_block = block_Realloc( p_block, 0, p_block->i_buffer + FF_INPUT_BUFFER_PADDING_SIZE );
     if( !p_block )
         return NULL;
     p_block->i_buffer -= FF_INPUT_BUFFER_PADDING_SIZE;
     memset( &p_block->p_buffer[p_block->i_buffer], 0, FF_INPUT_BUFFER_PADDING_SIZE );
 
+    do
+    {
+        i_output = __MAX( p_block->i_buffer, p_sys->i_output_max );
+        if( i_output > p_sys->i_output_max )
+        {
+            /* Grow output buffer if necessary (eg. for PCM data) */
+            p_sys->p_output = av_realloc( p_sys->p_output, i_output );
+        }
+
 #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT( 52, 0, 0 )
-    i_used = avcodec_decode_audio2( p_sys->p_context,
-                                   (int16_t*)p_sys->p_output, &i_output,
-                                   p_block->p_buffer, p_block->i_buffer );
+        i_used = avcodec_decode_audio2( p_sys->p_context,
+                                       (int16_t*)p_sys->p_output, &i_output,
+                                       p_block->p_buffer, p_block->i_buffer );
 #else
-    i_used = avcodec_decode_audio( p_sys->p_context,
-                                   (int16_t*)p_sys->p_output, &i_output,
-                                   p_block->p_buffer, p_block->i_buffer );
+        i_used = avcodec_decode_audio( p_sys->p_context,
+                                       (int16_t*)p_sys->p_output, &i_output,
+                                       p_block->p_buffer, p_block->i_buffer );
 #endif
 
-    if( i_used < 0 || i_output < 0 )
-    {
-        if( i_used < 0 )
-            msg_Warn( p_dec, "cannot decode one frame (%zu bytes)",
-                      p_block->i_buffer );
+        if( i_used < 0 || i_output < 0 )
+        {
+            if( i_used < 0 )
+                msg_Warn( p_dec, "cannot decode one frame (%zu bytes)",
+                          p_block->i_buffer );
 
-        block_Release( p_block );
-        return NULL;
-    }
-    else if( (size_t)i_used > p_block->i_buffer )
-    {
-        i_used = p_block->i_buffer;
-    }
+            block_Release( p_block );
+            return NULL;
+        }
+        else if( (size_t)i_used > p_block->i_buffer )
+        {
+            i_used = p_block->i_buffer;
+        }
+
+        p_block->i_buffer -= i_used;
+        p_block->p_buffer += i_used;
 
-    p_block->i_buffer -= i_used;
-    p_block->p_buffer += i_used;
+    } while( p_block->i_buffer > 0 && i_output <= 0 );
 
     if( p_sys->p_context->channels <= 0 || p_sys->p_context->channels > 8 ||
         p_sys->p_context->sample_rate <= 0 )