From 1fc4ff2205cdad4fbb7225f0f32cb7e32edc1eec Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Wed, 11 Apr 2012 13:26:32 +0200 Subject: [PATCH] swr: generate more dither noise to improve quality. Signed-off-by: Michael Niedermayer --- libswresample/swresample.c | 12 ++++++++---- libswresample/swresample_internal.h | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/libswresample/swresample.c b/libswresample/swresample.c index e7f61cb8ee..715a446456 100644 --- a/libswresample/swresample.c +++ b/libswresample/swresample.c @@ -519,18 +519,22 @@ static int swr_convert_internal(struct SwrContext *s, AudioData *out, int out_co if(preout != out && out_count){ if(s->dither_method){ int ch; + int dither_count= FFMAX(out_count, 1<<16); av_assert0(preout != in); - if((ret=realloc_audio(&s->dither, out_count))<0) + if((ret=realloc_audio(&s->dither, dither_count))<0) return ret; if(ret) for(ch=0; chdither.ch_count; ch++) swri_get_dither(s->dither.ch[ch], s->dither.count, 12345678913579<out_sample_fmt, s->int_sample_fmt, s->dither_method); av_assert0(s->dither.ch_count == preout->ch_count); - for(ch=0; chch_count; ch++){ - swri_sum2(s->int_sample_fmt, preout->ch[ch], preout->ch[ch], s->dither.ch[ch], 1, 1, out_count); - } + if(s->dither_pos + out_count > s->dither.count) + s->dither_pos = 0; + for(ch=0; chch_count; ch++) + swri_sum2(s->int_sample_fmt, preout->ch[ch], preout->ch[ch], s->dither.ch[ch] + s->dither.bps * s->dither_pos, 1, 1, out_count); + + s->dither_pos += out_count; } //FIXME packed doesnt need more than 1 chan here! swri_audio_convert(s->out_convert, out, preout, out_count); diff --git a/libswresample/swresample_internal.h b/libswresample/swresample_internal.h index 114ca83c24..68b51305bc 100644 --- a/libswresample/swresample_internal.h +++ b/libswresample/swresample_internal.h @@ -50,6 +50,7 @@ struct SwrContext { const int *channel_map; ///< channel index (or -1 if muted channel) map int used_ch_count; ///< number of used input channels (mapped channel count if channel_map, otherwise in.ch_count) enum SwrDitherType dither_method; + int dither_pos; int int_bps; ///< internal bytes per sample int resample_first; ///< 1 if resampling must come first, 0 if rematrixing