[vlc-devel] commit: Fixed avcodec audio decoder after API behavior change. ( Laurent Aimar )

git version control git at videolan.org
Thu Oct 8 22:32:21 CEST 2009


vlc | branch: 1.0-bugfix | Laurent Aimar <fenrir at videolan.org> | Thu Oct  8 21:12:01 2009 +0200| [29372c90602c8fb11be11f11381d6fd4df1696b7] | committer: Laurent Aimar 

Fixed avcodec audio decoder after API behavior change.

It fixes at least WMAP decoding.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=29372c90602c8fb11be11f11381d6fd4df1696b7
---

 modules/codec/avcodec/audio.c |   60 ++++++++++++++++++++++-------------------
 1 files changed, 32 insertions(+), 28 deletions(-)

diff --git a/modules/codec/avcodec/audio.c b/modules/codec/avcodec/audio.c
index ae640e3..7e552d4 100644
--- a/modules/codec/avcodec/audio.c
+++ b/modules/codec/avcodec/audio.c
@@ -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 );
 
-#if LIBAVCODEC_VERSION_INT >= ((52<<16)+(0<<8)+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 );
+    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 );
 #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 )




More information about the vlc-devel mailing list