From 1bed09a30ef95cc85513688f3b3c18c3fd332fd8 Mon Sep 17 00:00:00 2001 From: Ganesh Ajjanagadde Date: Sat, 7 Nov 2015 10:16:27 -0500 Subject: [PATCH] swresample: allow double precision beta value for the Kaiser window Kaiser windows inherently don't require beta to be an integer. This was an arbitrary restriction. Moreover, soxr does not require it, and in fact often estimates beta to a non-integral value. Thus, this patch allows greater flexibility for swresample clients. Micro version is updated. Reviewed-by: Derek Buitenhuis Reviewed-by: Michael Niedermayer Signed-off-by: Ganesh Ajjanagadde --- doc/resampler.texi | 2 +- libswresample/options.c | 2 +- libswresample/resample.c | 4 ++-- libswresample/resample.h | 2 +- libswresample/soxr_resample.c | 2 +- libswresample/swresample_internal.h | 4 ++-- libswresample/version.h | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/resampler.texi b/doc/resampler.texi index 155230fa6f..cb7d536cfb 100644 --- a/doc/resampler.texi +++ b/doc/resampler.texi @@ -220,7 +220,7 @@ select Kaiser windowed sinc @end table @item kaiser_beta -For swr only, set Kaiser window beta value. Must be an integer in the +For swr only, set Kaiser window beta value. Must be a double float value in the interval [2,16], default value is 9. @item output_sample_bits diff --git a/libswresample/options.c b/libswresample/options.c index 2bf8ab1dce..654102a302 100644 --- a/libswresample/options.c +++ b/libswresample/options.c @@ -120,7 +120,7 @@ static const AVOption options[]={ { "blackman_nuttall", "select Blackman Nuttall windowed sinc", 0 , AV_OPT_TYPE_CONST, { .i64 = SWR_FILTER_TYPE_BLACKMAN_NUTTALL }, INT_MIN, INT_MAX, PARAM, "filter_type" }, { "kaiser" , "select Kaiser windowed sinc" , 0 , AV_OPT_TYPE_CONST, { .i64 = SWR_FILTER_TYPE_KAISER }, INT_MIN, INT_MAX, PARAM, "filter_type" }, -{ "kaiser_beta" , "set swr Kaiser window beta" , OFFSET(kaiser_beta) , AV_OPT_TYPE_INT , {.i64=9 }, 2 , 16 , PARAM }, +{ "kaiser_beta" , "set swr Kaiser window beta" , OFFSET(kaiser_beta) , AV_OPT_TYPE_DOUBLE , {.dbl=9 }, 2 , 16 , PARAM }, { "output_sample_bits" , "set swr number of output sample bits", OFFSET(dither.output_sample_bits), AV_OPT_TYPE_INT , {.i64=0 }, 0 , 64 , PARAM }, {0} diff --git a/libswresample/resample.c b/libswresample/resample.c index 6f2ca982ea..82f004c802 100644 --- a/libswresample/resample.c +++ b/libswresample/resample.c @@ -71,7 +71,7 @@ static double bessel(double x){ * @return 0 on success, negative on error */ static int build_filter(ResampleContext *c, void *filter, double factor, int tap_count, int alloc, int phase_count, int scale, - int filter_type, int kaiser_beta){ + int filter_type, double kaiser_beta){ int ph, i; double x, y, w, t; double *tab = av_malloc_array(tap_count+1, sizeof(*tab)); @@ -212,7 +212,7 @@ static int build_filter(ResampleContext *c, void *filter, double factor, int tap } static ResampleContext *resample_init(ResampleContext *c, int out_rate, int in_rate, int filter_size, int phase_shift, int linear, - double cutoff0, enum AVSampleFormat format, enum SwrFilterType filter_type, int kaiser_beta, + double cutoff0, enum AVSampleFormat format, enum SwrFilterType filter_type, double kaiser_beta, double precision, int cheby) { double cutoff = cutoff0? cutoff0 : 0.97; diff --git a/libswresample/resample.h b/libswresample/resample.h index 99a89b7945..a126b11635 100644 --- a/libswresample/resample.h +++ b/libswresample/resample.h @@ -44,7 +44,7 @@ typedef struct ResampleContext { int phase_mask; int linear; enum SwrFilterType filter_type; - int kaiser_beta; + double kaiser_beta; double factor; enum AVSampleFormat format; int felem_size; diff --git a/libswresample/soxr_resample.c b/libswresample/soxr_resample.c index 535e9cee07..807f508405 100644 --- a/libswresample/soxr_resample.c +++ b/libswresample/soxr_resample.c @@ -30,7 +30,7 @@ #include static struct ResampleContext *create(struct ResampleContext *c, int out_rate, int in_rate, int filter_size, int phase_shift, int linear, - double cutoff, enum AVSampleFormat format, enum SwrFilterType filter_type, int kaiser_beta, double precision, int cheby){ + double cutoff, enum AVSampleFormat format, enum SwrFilterType filter_type, double kaiser_beta, double precision, int cheby){ soxr_error_t error; soxr_datatype_t type = diff --git a/libswresample/swresample_internal.h b/libswresample/swresample_internal.h index bf0cec7979..5c46ddaf38 100644 --- a/libswresample/swresample_internal.h +++ b/libswresample/swresample_internal.h @@ -69,7 +69,7 @@ struct DitherContext { }; typedef struct ResampleContext * (* resample_init_func)(struct ResampleContext *c, int out_rate, int in_rate, int filter_size, int phase_shift, int linear, - double cutoff, enum AVSampleFormat format, enum SwrFilterType filter_type, int kaiser_beta, double precision, int cheby); + double cutoff, enum AVSampleFormat format, enum SwrFilterType filter_type, double kaiser_beta, double precision, int cheby); typedef void (* resample_free_func)(struct ResampleContext **c); typedef int (* multiple_resample_func)(struct ResampleContext *c, AudioData *dst, int dst_size, AudioData *src, int src_size, int *consumed); typedef int (* resample_flush_func)(struct SwrContext *c); @@ -128,7 +128,7 @@ struct SwrContext { int linear_interp; /**< if 1 then the resampling FIR filter will be linearly interpolated */ double cutoff; /**< resampling cutoff frequency (swr: 6dB point; soxr: 0dB point). 1.0 corresponds to half the output sample rate */ int filter_type; /**< swr resampling filter type */ - int kaiser_beta; /**< swr beta value for Kaiser window (only applicable if filter_type == AV_FILTER_TYPE_KAISER) */ + double kaiser_beta; /**< swr beta value for Kaiser window (only applicable if filter_type == AV_FILTER_TYPE_KAISER) */ double precision; /**< soxr resampling precision (in bits) */ int cheby; /**< soxr: if 1 then passband rolloff will be none (Chebyshev) & irrational ratio approximation precision will be higher */ diff --git a/libswresample/version.h b/libswresample/version.h index 12b32826db..8f6ecb418a 100644 --- a/libswresample/version.h +++ b/libswresample/version.h @@ -30,7 +30,7 @@ #define LIBSWRESAMPLE_VERSION_MAJOR 2 #define LIBSWRESAMPLE_VERSION_MINOR 0 -#define LIBSWRESAMPLE_VERSION_MICRO 100 +#define LIBSWRESAMPLE_VERSION_MICRO 101 #define LIBSWRESAMPLE_VERSION_INT AV_VERSION_INT(LIBSWRESAMPLE_VERSION_MAJOR, \ LIBSWRESAMPLE_VERSION_MINOR, \