[vlc-devel] [PATCH] ugly resampler, handle that output data isn't longer than input data
Rémi Denis-Courmont
remi at remlab.net
Mon Apr 21 11:46:26 CEST 2014
Le dimanche 20 avril 2014, 12:24:49 ileoo at videolan.org a écrit :
> + msg_Info( p_filter, "input samples %d length %d",
> p_in_buf->i_nb_samples, p_in_buf->i_length );
Too verbose. Also, wrong format string.
>
> - unsigned char *p_out = p_out_buf->p_buffer;
> - unsigned char *p_in = p_in_buf->p_buffer;
> + uint8_t *p_out = p_out_buf->p_buffer;
> + uint8_t *p_in = p_in_buf->p_buffer;
> unsigned int i_remainder = 0;
>
> - p_out_buf->i_nb_samples = i_out_nb;
> - p_out_buf->i_buffer = i_out_nb * framesize;
> + p_out_buf->i_nb_samples = 0;
> p_out_buf->i_pts = p_in_buf->i_pts;
> - p_out_buf->i_length = p_out_buf->i_nb_samples *
> - 1000000 / p_filter->fmt_out.audio.i_rate;
>
> - while( i_out_nb )
> + while( i_out_nb >= p_filter->fmt_in.audio.i_rate )
> {
> if( p_out != p_in )
> memcpy( p_out, p_in, framesize );
> p_out += framesize;
> - i_out_nb--;
> + i_out_nb -= p_filter->fmt_in.audio.i_rate;
> + p_out_buf->i_nb_samples++;
>
> i_remainder += p_filter->fmt_in.audio.i_rate;
> while( i_remainder >= p_filter->fmt_out.audio.i_rate )
> @@ -131,6 +130,10 @@ static block_t *DoWork( filter_t * p_filter, block_t *
> p_in_buf ) i_remainder -= p_filter->fmt_out.audio.i_rate;
> }
> }
> + p_out_buf->i_buffer = p_out_buf->i_nb_samples * framesize;
> + p_out_buf->i_length = p_out_buf->i_nb_samples *
> + CLOCK_FREQ / p_filter->fmt_out.audio.i_rate;
I think this is pretty much as wrong as the previous code. We should account
for rounding errors, e.g. using date_*(). This would require a special case
for discontinuities though.
> + msg_Info( p_filter, "output samples %d length %d",
> p_out_buf->i_nb_samples, p_out_buf->i_length );
Same as above.
>
> if( p_in_buf != p_out_buf )
> out:
--
Rémi Denis-Courmont
http://www.remlab.net/
More information about the vlc-devel
mailing list