vlc | branch: master | Ilkka Ollakka <il...@videolan.org> | Sat Dec 29 15:16:54 
2012 +0200| [b4f6e77d1e156e7424f73858bab37a511658760c] | committer: Ilkka 
Ollakka

avcodec: deinterleave samples if input format for codec is planar

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

 modules/codec/avcodec/encoder.c |   40 +++++++++++++++++++++++++++++++--------
 1 file changed, 32 insertions(+), 8 deletions(-)

diff --git a/modules/codec/avcodec/encoder.c b/modules/codec/avcodec/encoder.c
index acf9f28b..79f9951 100644
--- a/modules/codec/avcodec/encoder.c
+++ b/modules/codec/avcodec/encoder.c
@@ -1046,7 +1046,16 @@ static block_t *EncodeAudio( encoder_t *p_enc, block_t 
*p_aout_buf )
 
         //Copy samples from new packet to buffer to get frame size
         if( likely( leftover ) )
-            memcpy( 
p_sys->p_buffer+(p_sys->i_samples_delay*p_sys->i_sample_bytes), 
p_aout_buf->p_buffer, 
leftover*p_sys->i_sample_bytes*p_enc->fmt_in.audio.i_channels);
+        {
+            if( av_sample_fmt_is_planar( p_sys->p_context->sample_fmt ) )
+                aout_Deinterleave( 
p_sys->p_buffer+(p_sys->i_samples_delay*p_sys->i_sample_bytes*p_enc->fmt_in.audio.i_channels
 ),
+                                  p_aout_buf->p_buffer, leftover, 
p_enc->fmt_in.audio.i_channels, p_enc->fmt_in.i_codec );
+            else
+                memcpy( 
p_sys->p_buffer+(p_sys->i_samples_delay*p_sys->i_sample_bytes),
+                        p_aout_buf->p_buffer,
+                        leftover * p_sys->i_sample_bytes * 
p_enc->fmt_in.audio.i_channels
+                       );
+        }
 
         if( avcodec_fill_audio_frame( frame, p_enc->fmt_in.audio.i_channels,
                               p_sys->p_context->sample_fmt,
@@ -1130,12 +1139,24 @@ static block_t *EncodeAudio( encoder_t *p_enc, block_t 
*p_aout_buf )
         frame->nb_samples = p_sys->i_frame_size;
         frame->format     = p_sys->p_context->sample_fmt;
 
-        if( avcodec_fill_audio_frame( frame, p_enc->fmt_in.audio.i_channels,
-                              p_sys->p_context->sample_fmt,
-                              p_aout_buf->p_buffer+i_data_offset,
-                              p_sys->i_frame_size * p_sys->i_sample_bytes * 
p_enc->fmt_in.audio.i_channels,
-                              0) < 0 )
-                msg_Err( p_enc, "filling error on encode" );
+        if( av_sample_fmt_is_planar( p_sys->p_context->sample_fmt ) )
+        {
+            aout_Deinterleave( p_sys->p_buffer, 
p_aout_buf->p_buffer+i_data_offset,
+                              p_sys->i_frame_size, 
p_enc->fmt_in.audio.i_channels, p_enc->fmt_in.i_codec );
+            if( avcodec_fill_audio_frame( frame, 
p_enc->fmt_in.audio.i_channels,
+                                    p_sys->p_context->sample_fmt,
+                                    p_sys->p_buffer,
+                                    p_sys->i_frame_size * 
p_sys->i_sample_bytes * p_enc->fmt_in.audio.i_channels,
+                                    0) < 0 )
+                 msg_Err( p_enc, "filling error on encode" );
+        } else {
+            if( avcodec_fill_audio_frame( frame, 
p_enc->fmt_in.audio.i_channels,
+                                    p_sys->p_context->sample_fmt,
+                                    p_aout_buf->p_buffer+i_data_offset,
+                                    p_sys->i_frame_size * 
p_sys->i_sample_bytes * p_enc->fmt_in.audio.i_channels,
+                                    0) < 0 )
+                 msg_Err( p_enc, "filling error on encode" );
+        }
 
         i_samples_left -= p_sys->i_frame_size;
         i_data_offset += p_sys->i_frame_size * p_sys->i_sample_bytes * 
p_enc->fmt_in.audio.i_channels;
@@ -1181,7 +1202,10 @@ static block_t *EncodeAudio( encoder_t *p_enc, block_t 
*p_aout_buf )
     // that frame has more data than p_sys->i_frame_size most of the cases 
currently.
     if( i_samples_left > 0 )
     {
-        memcpy( p_sys->p_buffer, p_aout_buf->p_buffer+i_data_offset , 
i_samples_left*p_sys->i_sample_bytes*p_enc->fmt_in.audio.i_channels);
+        if( av_sample_fmt_is_planar( p_sys->p_context->sample_fmt ) )
+            aout_Deinterleave( p_sys->p_buffer, 
p_aout_buf->p_buffer+i_data_offset, i_samples_left, 
p_enc->fmt_in.audio.i_channels, p_enc->fmt_in.i_codec );
+        else
+            memcpy( p_sys->p_buffer, p_aout_buf->p_buffer+i_data_offset , 
i_samples_left*p_sys->i_sample_bytes*p_enc->fmt_in.audio.i_channels);
         p_sys->i_samples_delay = i_samples_left;
     }
 

_______________________________________________
vlc-commits mailing list
vlc-commits@videolan.org
http://mailman.videolan.org/listinfo/vlc-commits

Reply via email to