From 30b2611ed3102c53a8aa96c71acf5dadb69997c8 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Thu, 18 Aug 2016 11:52:11 +0200 Subject: swresample: Skip over dither steps if dithering scale is 0 Signed-off-by: Michael Niedermayer --- libswresample/dither.c | 5 +++++ libswresample/options.c | 2 +- libswresample/swresample.c | 2 ++ libswresample/swresample_internal.h | 1 + 4 files changed, 9 insertions(+), 1 deletion(-) (limited to 'libswresample') diff --git a/libswresample/dither.c b/libswresample/dither.c index 76f8ccf2c6..64068d35b6 100644 --- a/libswresample/dither.c +++ b/libswresample/dither.c @@ -102,6 +102,11 @@ av_cold int swri_dither_init(SwrContext *s, enum AVSampleFormat out_fmt, enum AV if (out_fmt == AV_SAMPLE_FMT_S32 && s->dither.output_sample_bits) scale *= 1<<(32-s->dither.output_sample_bits); + if (scale == 0) { + s->dither.method = 0; + return 0; + } + s->dither.ns_pos = 0; s->dither.noise_scale= scale; s->dither.ns_scale = scale; diff --git a/libswresample/options.c b/libswresample/options.c index 816ce47750..4abf5e0518 100644 --- a/libswresample/options.c +++ b/libswresample/options.c @@ -70,7 +70,7 @@ static const AVOption options[]={ {"dither_scale" , "set dither scale" , OFFSET(dither.scale ), AV_OPT_TYPE_FLOAT, {.dbl=1 }, 0 , INT_MAX , PARAM}, -{"dither_method" , "set dither method" , OFFSET(dither.method ), AV_OPT_TYPE_INT , {.i64=0 }, 0 , SWR_DITHER_NB-1, PARAM, "dither_method"}, +{"dither_method" , "set dither method" , OFFSET(user_dither_method),AV_OPT_TYPE_INT, {.i64=0 }, 0 , SWR_DITHER_NB-1, PARAM, "dither_method"}, {"rectangular" , "select rectangular dither" , 0 , AV_OPT_TYPE_CONST, {.i64=SWR_DITHER_RECTANGULAR}, INT_MIN, INT_MAX , PARAM, "dither_method"}, {"triangular" , "select triangular dither" , 0 , AV_OPT_TYPE_CONST, {.i64=SWR_DITHER_TRIANGULAR }, INT_MIN, INT_MAX , PARAM, "dither_method"}, {"triangular_hp" , "select triangular dither with high pass" , 0 , AV_OPT_TYPE_CONST, {.i64=SWR_DITHER_TRIANGULAR_HIGHPASS }, INT_MIN, INT_MAX, PARAM, "dither_method"}, diff --git a/libswresample/swresample.c b/libswresample/swresample.c index ade81efd2c..b8ad9486eb 100644 --- a/libswresample/swresample.c +++ b/libswresample/swresample.c @@ -176,6 +176,8 @@ av_cold int swr_init(struct SwrContext *s){ s->int_sample_fmt= s->user_int_sample_fmt; + s->dither.method = s->user_dither_method; + if(av_get_channel_layout_nb_channels(s-> in_ch_layout) > SWR_CH_MAX) { av_log(s, AV_LOG_WARNING, "Input channel layout 0x%"PRIx64" is invalid or unsupported.\n", s-> in_ch_layout); s->in_ch_layout = 0; diff --git a/libswresample/swresample_internal.h b/libswresample/swresample_internal.h index 3828b722cc..88dbc863da 100644 --- a/libswresample/swresample_internal.h +++ b/libswresample/swresample_internal.h @@ -120,6 +120,7 @@ struct SwrContext { int64_t user_in_ch_layout; ///< User set input channel layout int64_t user_out_ch_layout; ///< User set output channel layout enum AVSampleFormat user_int_sample_fmt; ///< User set internal sample format + int user_dither_method; ///< User set dither method struct DitherContext dither; -- cgit v1.2.3