swr: support a seperate output sample bits.
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 24 Feb 2013 18:05:54 +0000 (19:05 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 24 Feb 2013 19:31:56 +0000 (20:31 +0100)
This avoids user apps having to mangle dither scale. for pcm24

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libswresample/dither.c
libswresample/swresample.c
libswresample/swresample_internal.h

index d70505c..d0193dd 100644 (file)
@@ -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;
index f69e36e..f85f88f 100644 (file)
@@ -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}
 };
 
index 3f80904..17b85d5 100644 (file)
@@ -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 {