[FFmpeg-cvslog] swresample: allow double precision beta value for the Kaiser window

Ganesh Ajjanagadde git at videolan.org
Mon Nov 9 03:14:37 CET 2015


ffmpeg | branch: master | Ganesh Ajjanagadde <gajjanagadde at gmail.com> | Sat Nov  7 10:16:27 2015 -0500| [1bed09a30ef95cc85513688f3b3c18c3fd332fd8] | committer: Ganesh Ajjanagadde

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 at gmail.com>
Reviewed-by: Michael Niedermayer <michael at niedermayer.cc>
Signed-off-by: Ganesh Ajjanagadde <gajjanagadde at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=1bed09a30ef95cc85513688f3b3c18c3fd332fd8
---

 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 155230f..cb7d536 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 2bf8ab1..654102a 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 6f2ca98..82f004c 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 99a89b7..a126b11 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 535e9ce..807f508 100644
--- a/libswresample/soxr_resample.c
+++ b/libswresample/soxr_resample.c
@@ -30,7 +30,7 @@
 #include <soxr.h>
 
 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 bf0cec7..5c46dda 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 12b3282..8f6ecb4 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, \



More information about the ffmpeg-cvslog mailing list