*/
uint8_t *p_buffer;
size_t i_buffer_out;
+ uint8_t *p_interleave_buf;
/*
* Video properties
p_sys->b_planar = false;
p_sys->p_buffer = NULL;
+ p_sys->p_interleave_buf = NULL;
p_sys->i_buffer_out = 0;
p_context = avcodec_alloc_context3(p_codec);
p_sys->b_variable = p_context->frame_size ? false : true;
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();
error:
free( p_enc->fmt_out.p_extra );
free( p_sys->p_buffer );
+ free( p_sys->p_interleave_buf );
free( p_sys );
return VLC_ENOMEM;
}
{
//How much we need to copy from new packet
const int leftover = leftover_samples * p_enc->fmt_in.audio.i_channels * p_sys->i_sample_bytes;
+
#if LIBAVUTIL_VERSION_CHECK( 51,27,2,46,100 )
const int align = 0;
#else
if( likely( p_aout_buf ) )
{
p_aout_buf->i_nb_samples -= leftover_samples;
+ memcpy( p_sys->p_buffer+buffer_delay, p_aout_buf->p_buffer, leftover );
// We need to deinterleave from p_aout_buf to p_buffer the leftover bytes
if( p_sys->b_planar )
- aout_Deinterleave( p_sys->p_buffer+buffer_delay, p_aout_buf->p_buffer,
- leftover_samples, p_enc->fmt_in.audio.i_channels, p_enc->fmt_in.i_codec );
+ aout_Deinterleave( p_sys->p_interleave_buf, p_sys->p_buffer,
+ p_sys->i_frame_size, p_enc->fmt_in.audio.i_channels, p_enc->fmt_in.i_codec );
else
memcpy( p_sys->p_buffer + buffer_delay, p_aout_buf->p_buffer, leftover);
buffer_delay += padding_size;
}
if( avcodec_fill_audio_frame( p_sys->frame, p_enc->fmt_in.audio.i_channels,
- p_sys->p_context->sample_fmt, p_sys->p_buffer,
+ p_sys->p_context->sample_fmt, p_sys->b_planar ? p_sys->p_interleave_buf : p_sys->p_buffer,
leftover + buffer_delay,
align) < 0 )
msg_Err( p_enc, "filling error on fillup" );
// that frame has more data than p_sys->i_frame_size most of the cases currently.
if( p_aout_buf->i_nb_samples > 0 )
{
- if( p_sys->b_planar )
- aout_Deinterleave( p_sys->p_buffer+buffer_delay, p_aout_buf->p_buffer,
- p_aout_buf->i_nb_samples, p_enc->fmt_in.audio.i_channels, p_enc->fmt_in.i_codec );
- else
- memcpy( p_sys->p_buffer + buffer_delay, p_aout_buf->p_buffer,
- p_aout_buf->i_nb_samples * p_sys->i_sample_bytes * p_enc->fmt_in.audio.i_channels);
- p_sys->i_samples_delay += p_aout_buf->i_nb_samples;
+ memcpy( p_sys->p_buffer + buffer_delay, p_aout_buf->p_buffer,
+ p_aout_buf->i_nb_samples * p_sys->i_sample_bytes * p_enc->fmt_in.audio.i_channels);
+ p_sys->i_samples_delay += p_aout_buf->i_nb_samples;
}
return p_chain;
av_free( p_sys->p_context );
+ free( p_sys->p_interleave_buf );
free( p_sys->p_buffer );
free( p_sys );