[vlc-devel] [PATCH 2/2] avcodec: initialize buffers when first frame comes in

Ilkka Ollakka ileoo at videolan.org
Fri Sep 20 10:33:17 CEST 2013


---
 modules/codec/avcodec/encoder.c | 37 ++++++++++++++++++++++++-------------
 1 file changed, 24 insertions(+), 13 deletions(-)

diff --git a/modules/codec/avcodec/encoder.c b/modules/codec/avcodec/encoder.c
index 977c2ba..b318340 100644
--- a/modules/codec/avcodec/encoder.c
+++ b/modules/codec/avcodec/encoder.c
@@ -873,24 +873,12 @@ int OpenEncoder( vlc_object_t *p_this )
         p_sys->i_frame_size = p_context->frame_size > 1 ?
                                     p_context->frame_size :
                                     FF_MIN_BUFFER_SIZE;
-        p_sys->p_buffer = malloc( p_sys->i_frame_size * p_sys->i_sample_bytes * p_enc->fmt_in.audio.i_channels);
-        if ( unlikely( p_sys->p_buffer == NULL ) )
-        {
-            goto error;
-        }
         p_enc->fmt_out.audio.i_blockalign = p_context->block_align;
         p_enc->fmt_out.audio.i_bitspersample = aout_BitsPerSample( p_enc->fmt_out.i_codec );
         //b_variable tells if we can feed any size frames to encoder
         p_sys->b_variable = p_context->frame_size ? false : true;
+        p_sys->i_buffer_out = 0;
 
-        p_sys->i_buffer_out = p_sys->i_frame_size * p_sys->i_sample_bytes * p_enc->fmt_in.audio.i_channels;
-
-        if( p_sys->b_planar )
-        {
-            p_sys->p_interleave_buf = malloc( p_sys->i_buffer_out );
-            if( unlikely( p_sys->p_interleave_buf == NULL ) )
-                goto error;
-        }
     }
 
     p_sys->frame = avcodec_alloc_frame();
@@ -1122,6 +1110,29 @@ static block_t *EncodeAudio( encoder_t *p_enc, block_t *p_aout_buf )
     int got_packet,i_out;
     size_t buffer_delay = 0, i_samples_left = 0;
 
+    /* Take buffers only when first frame arrives, as for example
+     * faad sometimes has channels count only at this point*/
+    if( unlikely( p_sys->i_buffer_out == 0 ) )
+    {
+        p_sys->i_buffer_out = p_sys->i_frame_size * p_sys->i_sample_bytes * p_enc->fmt_in.audio.i_channels;
+        p_sys->p_buffer = malloc( p_sys->i_buffer_out );
+        if ( unlikely( p_sys->p_buffer == NULL ) )
+        {
+            p_sys->i_buffer_out = 0;
+            return NULL;
+        }
+
+        if( p_sys->b_planar )
+        {
+            p_sys->p_interleave_buf = malloc( p_sys->i_buffer_out );
+            if( unlikely( p_sys->p_interleave_buf == NULL ) )
+            {
+                p_sys->i_buffer_out = 0;
+                return NULL;
+            }
+        }
+    }
+
     //i_bytes_left is amount of bytes we get
     i_samples_left = p_aout_buf ? p_aout_buf->i_nb_samples : 0;
     buffer_delay = p_sys->i_samples_delay * p_sys->i_sample_bytes * p_enc->fmt_in.audio.i_channels;
-- 
1.8.1.4




More information about the vlc-devel mailing list