[FFmpeg-cvslog] swr: support a seperate output sample bits.

Michael Niedermayer git at videolan.org
Sun Feb 24 20:37:28 CET 2013


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Sun Feb 24 19:05:54 2013 +0100| [8b3affda87e45165bd7d968a8cad82fe700f60b7] | committer: Michael Niedermayer

swr: support a seperate output sample bits.

This avoids user apps having to mangle dither scale. for pcm24

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

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

 libswresample/dither.c              |    3 +++
 libswresample/swresample.c          |    1 +
 libswresample/swresample_internal.h |    1 +
 3 files changed, 5 insertions(+)

diff --git a/libswresample/dither.c b/libswresample/dither.c
index d70505c..d0193dd 100644
--- a/libswresample/dither.c
+++ b/libswresample/dither.c
@@ -94,6 +94,9 @@ int swri_dither_init(SwrContext *s, enum AVSampleFormat out_fmt, enum AVSampleFo
 
     scale *= s->dither.scale;
 
+    if (out_fmt == AV_SAMPLE_FMT_S32 && s->dither.output_sample_bits)
+        scale *= 1<<(32-s->dither.output_sample_bits);
+
     s->dither.ns_pos = 0;
     s->dither.noise_scale=   scale;
     s->dither.ns_scale   =   scale;
diff --git a/libswresample/swresample.c b/libswresample/swresample.c
index f69e36e..f85f88f 100644
--- a/libswresample/swresample.c
+++ b/libswresample/swresample.c
@@ -127,6 +127,7 @@ static const AVOption options[]={
 
 { "kaiser_beta"         , "set swr Kaiser Window Beta"  , OFFSET(kaiser_beta)    , AV_OPT_TYPE_INT  , {.i64=9                     }, 2      , 16        , PARAM },
 
+{ "output_sample_bits"   , ""  , OFFSET(dither.output_sample_bits)               , AV_OPT_TYPE_INT  , {.i64=0                     }, 0      , 64        , 0 },
 {0}
 };
 
diff --git a/libswresample/swresample_internal.h b/libswresample/swresample_internal.h
index 3f80904..17b85d5 100644
--- a/libswresample/swresample_internal.h
+++ b/libswresample/swresample_internal.h
@@ -63,6 +63,7 @@ struct DitherContext {
     float ns_errors[SWR_CH_MAX][2*NS_TAPS];
     AudioData noise;                                ///< noise used for dithering
     AudioData temp;                                 ///< temporary storage when writing into the input buffer isnt possible
+    int output_sample_bits;                         ///< the number of used output bits, needed to scale dither correctly
 };
 
 struct SwrContext {



More information about the ffmpeg-cvslog mailing list