From 8b3affda87e45165bd7d968a8cad82fe700f60b7 Mon Sep 17 00:00:00 2001
From: Michael Niedermayer <michaelni@gmx.at>
Date: Sun, 24 Feb 2013 19:05:54 +0100
Subject: [PATCH] swr: support a seperate output sample bits.

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

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
---
 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 d70505c27ef..d0193dda461 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 f69e36eeaf9..f85f88fea5a 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 3f8090481bf..17b85d52634 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 {
-- 
GitLab