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 <derek.buitenhuis@gmail.com> Reviewed-by: Michael Niedermayer <michael@niedermayer.cc> Signed-off-by: Ganesh Ajjanagadde <gajjanagadde@gmail.com>tags/n3.0
| @@ -220,7 +220,7 @@ select Kaiser windowed sinc | |||||
| @end table | @end table | ||||
| @item kaiser_beta | @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. | interval [2,16], default value is 9. | ||||
| @item output_sample_bits | @item output_sample_bits | ||||
| @@ -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" }, | { "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" , "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 }, | { "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} | {0} | ||||
| @@ -71,7 +71,7 @@ static double bessel(double x){ | |||||
| * @return 0 on success, negative on error | * @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, | 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; | int ph, i; | ||||
| double x, y, w, t; | double x, y, w, t; | ||||
| double *tab = av_malloc_array(tap_count+1, sizeof(*tab)); | 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, | 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 precision, int cheby) | ||||
| { | { | ||||
| double cutoff = cutoff0? cutoff0 : 0.97; | double cutoff = cutoff0? cutoff0 : 0.97; | ||||
| @@ -44,7 +44,7 @@ typedef struct ResampleContext { | |||||
| int phase_mask; | int phase_mask; | ||||
| int linear; | int linear; | ||||
| enum SwrFilterType filter_type; | enum SwrFilterType filter_type; | ||||
| int kaiser_beta; | |||||
| double kaiser_beta; | |||||
| double factor; | double factor; | ||||
| enum AVSampleFormat format; | enum AVSampleFormat format; | ||||
| int felem_size; | int felem_size; | ||||
| @@ -30,7 +30,7 @@ | |||||
| #include <soxr.h> | #include <soxr.h> | ||||
| static struct ResampleContext *create(struct ResampleContext *c, int out_rate, int in_rate, int filter_size, int phase_shift, int linear, | 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_error_t error; | ||||
| soxr_datatype_t type = | soxr_datatype_t type = | ||||
| @@ -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, | 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 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 (* 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); | 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 */ | 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 */ | 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 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) */ | 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 */ | int cheby; /**< soxr: if 1 then passband rolloff will be none (Chebyshev) & irrational ratio approximation precision will be higher */ | ||||
| @@ -30,7 +30,7 @@ | |||||
| #define LIBSWRESAMPLE_VERSION_MAJOR 2 | #define LIBSWRESAMPLE_VERSION_MAJOR 2 | ||||
| #define LIBSWRESAMPLE_VERSION_MINOR 0 | #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, \ | #define LIBSWRESAMPLE_VERSION_INT AV_VERSION_INT(LIBSWRESAMPLE_VERSION_MAJOR, \ | ||||
| LIBSWRESAMPLE_VERSION_MINOR, \ | LIBSWRESAMPLE_VERSION_MINOR, \ | ||||