mirror of https://git.ffmpeg.org/ffmpeg.git
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 <derek.buitenhuis@gmail.com> Reviewed-by: Michael Niedermayer <michael@niedermayer.cc> Signed-off-by: Ganesh Ajjanagadde <gajjanagadde@gmail.com>
This commit is contained in:
parent
9ac61e73d0
commit
1bed09a30e
|
@ -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, \
|
||||||
|
|
Loading…
Reference in New Issue