[vlc-commits] avcodec: store leftover-samples in interleaved format

Ilkka Ollakka git at videolan.org
Thu May 23 22:58:18 CEST 2013


vlc/vlc-2.0 | branch: master | Ilkka Ollakka <ileoo at videolan.org> | Thu May 23 23:54:24 2013 +0300| [1e88bae7322f0a78f80c38bff1ade198725a3e16] | committer: Ilkka Ollakka

avcodec: store leftover-samples in interleaved format

Doesn't break deinterleave and Fixes #8615 and #8570 for 2.0

(cherry-picked by hand from af3f8759a874eeda1af2ccd50d61028809bd3161)

> http://git.videolan.org/gitweb.cgi/vlc/vlc-2.0.git/?a=commit;h=1e88bae7322f0a78f80c38bff1ade198725a3e16
---

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

diff --git a/modules/codec/avcodec/encoder.c b/modules/codec/avcodec/encoder.c
index 1d89008..854cd5d 100644
--- a/modules/codec/avcodec/encoder.c
+++ b/modules/codec/avcodec/encoder.c
@@ -105,6 +105,7 @@ struct encoder_sys_t
      */
     char *p_buffer;
     uint8_t *p_buffer_out;
+    uint8_t *p_interleave_buffer;
     size_t i_buffer_out;
 
     /*
@@ -343,6 +344,7 @@ int OpenEncoder( vlc_object_t *p_this )
 
     p_sys->p_buffer = NULL;
     p_sys->p_buffer_out = NULL;
+    p_sys->p_interleave_buffer = NULL;
     p_sys->i_buffer_out = 0;
 
 #if LIBAVCODEC_VERSION_MAJOR < 54
@@ -519,6 +521,7 @@ int OpenEncoder( vlc_object_t *p_this )
 
         p_sys->p_buffer_out = NULL;
 
+
         p_enc->fmt_in.i_codec = VLC_CODEC_I420;
         p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec;
         GetFfmpegChroma( &p_context->pix_fmt, p_enc->fmt_in.video );
@@ -890,6 +893,13 @@ int OpenEncoder( vlc_object_t *p_this )
         {
             goto error;
         }
+        if( av_sample_fmt_is_planar( p_sys->p_context->sample_fmt ) )
+        {
+            p_sys->p_interleave_buffer = malloc( p_sys->i_buffer_out );
+            if( p_sys->p_interleave_buffer == NULL )
+                goto error;
+        }
+
     }
 
     msg_Dbg( p_enc, "found encoder %s", psz_namecodec );
@@ -899,6 +909,7 @@ error:
     free( p_enc->fmt_out.p_extra );
     free( p_sys->p_buffer );
     free( p_sys->p_buffer_out );
+    free( p_sys->p_interleave_buffer );
     free( p_sys );
     return VLC_ENOMEM;
 }
@@ -1145,16 +1156,23 @@ static block_t *EncodeAudio( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
                          p_sys->i_sample_bytes;
 
             if( av_sample_fmt_is_planar( p_sys->p_context->sample_fmt ) )
-                Deinterleave( &p_sys->p_buffer[i_delay_size * p_sys->i_sample_bytes],
-                        p_buffer, p_sys->i_frame_size - i_delay_size, p_enc->fmt_in.audio.i_channels, p_enc->fmt_in.i_codec );
+            {
+                memcpy( p_sys->p_buffer + i_delay_size * p_sys->i_sample_bytes,
+                        p_buffer, i_size );
+                Deinterleave( p_sys->p_interleave_buffer, p_sys->p_buffer,
+                        p_sys->i_frame_size, p_enc->fmt_in.audio.i_channels, p_enc->fmt_in.i_codec );
+                p_samples = p_sys->p_interleave_buffer;
+            }
             else
+            {
                 memcpy( p_sys->p_buffer + i_delay_size * p_sys->i_sample_bytes,
                         p_buffer, i_size );
+                p_samples = p_sys->p_buffer;
+            }
             p_buffer -= i_delay_size * p_sys->i_sample_bytes;
             i_samples += i_samples_delay;
             i_samples_delay = 0;
 
-            p_samples = p_sys->p_buffer;
         }
         else
         {
@@ -1198,13 +1216,8 @@ static block_t *EncodeAudio( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
     /* Backup the remaining raw samples */
     if( i_samples )
     {
-        if( av_sample_fmt_is_planar( p_sys->p_context->sample_fmt ) )
-            Deinterleave( &p_sys->p_buffer[i_samples_delay * p_sys->i_sample_bytes],
-                    p_buffer, i_samples, p_enc->fmt_in.audio.i_channels, p_enc->fmt_in.i_codec );
-        else
-            memcpy( &p_sys->p_buffer[i_samples_delay * p_sys->i_sample_bytes],
-                    p_buffer,
-                    i_samples * p_sys->i_sample_bytes );
+        memcpy( &p_sys->p_buffer[i_samples_delay * p_sys->i_sample_bytes],
+                    p_buffer, i_samples * p_sys->i_sample_bytes );
     }
 
     return p_chain;
@@ -1224,6 +1237,7 @@ void CloseEncoder( vlc_object_t *p_this )
     av_free( p_sys->p_context );
 
     free( p_sys->p_buffer );
+    free( p_sys->p_interleave_buffer );
     free( p_sys->p_buffer_out );
 
     free( p_sys );



More information about the vlc-commits mailing list