[FFmpeg-cvslog] swr: generate more dither noise to improve quality.

Michael Niedermayer git at videolan.org
Wed Apr 11 14:30:12 CEST 2012


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Wed Apr 11 13:26:32 2012 +0200| [1fc4ff2205cdad4fbb7225f0f32cb7e32edc1eec] | committer: Michael Niedermayer

swr: generate more dither noise to improve quality.

Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=1fc4ff2205cdad4fbb7225f0f32cb7e32edc1eec
---

 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 e7f61cb..715a446 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; ch<s->dither.ch_count; ch++)
                     swri_get_dither(s->dither.ch[ch], s->dither.count, 12345678913579<<ch, s->out_sample_fmt, s->int_sample_fmt, s->dither_method);
             av_assert0(s->dither.ch_count == preout->ch_count);
 
-            for(ch=0; ch<preout->ch_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; ch<preout->ch_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 114ca83..68b5130 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



More information about the ffmpeg-cvslog mailing list