[FFmpeg-devel] [PATCH] swresample/resample: add force_comp argument
Muhammad Faiz
mfcc64 at gmail.com
Sun Nov 20 10:56:28 EET 2016
this allow to use phase_count_compensation on init (rather than
rebuild on swr_set_compensation) when options suggest that
soft compensation is enabled
Signed-off-by: Muhammad Faiz <mfcc64 at gmail.com>
---
libswresample/resample.c | 4 +++-
libswresample/soxr_resample.c | 2 +-
libswresample/swresample.c | 5 ++++-
libswresample/swresample_internal.h | 3 ++-
4 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/libswresample/resample.c b/libswresample/resample.c
index 8635bf1..c07a7d7 100644
--- a/libswresample/resample.c
+++ b/libswresample/resample.c
@@ -302,7 +302,7 @@ fail:
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, double kaiser_beta,
- double precision, int cheby, int exact_rational)
+ double precision, int cheby, int exact_rational, int force_comp)
{
double cutoff = cutoff0? cutoff0 : 0.97;
double factor= FFMIN(out_rate * cutoff / in_rate, 1.0);
@@ -316,6 +316,8 @@ static ResampleContext *resample_init(ResampleContext *c, int out_rate, int in_r
if (phase_count_exact <= phase_count) {
phase_count_compensation = phase_count_exact * (phase_count / phase_count_exact);
phase_count = phase_count_exact;
+ if (force_comp)
+ phase_count = phase_count_compensation;
}
}
diff --git a/libswresample/soxr_resample.c b/libswresample/soxr_resample.c
index b9c6735..b451b96 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, double kaiser_beta, double precision, int cheby, int exact_rational){
+ double cutoff, enum AVSampleFormat format, enum SwrFilterType filter_type, double kaiser_beta, double precision, int cheby, int exact_rational, int force_comp){
soxr_error_t error;
soxr_datatype_t type =
diff --git a/libswresample/swresample.c b/libswresample/swresample.c
index 0ef4dea..0bc7683 100644
--- a/libswresample/swresample.c
+++ b/libswresample/swresample.c
@@ -265,7 +265,10 @@ av_cold int swr_init(struct SwrContext *s){
}
if (s->out_sample_rate!=s->in_sample_rate || (s->flags & SWR_FLAG_RESAMPLE)){
- s->resample = s->resampler->init(s->resample, s->out_sample_rate, s->in_sample_rate, s->filter_size, s->phase_shift, s->linear_interp, s->cutoff, s->int_sample_fmt, s->filter_type, s->kaiser_beta, s->precision, s->cheby, s->exact_rational);
+ s->resample = s->resampler->init(s->resample, s->out_sample_rate, s->in_sample_rate, s->filter_size,
+ s->phase_shift, s->linear_interp, s->cutoff, s->int_sample_fmt, s->filter_type,
+ s->kaiser_beta, s->precision, s->cheby, s->exact_rational,
+ s->min_compensation < FLT_MAX && s->soft_compensation_duration && s->max_soft_compensation);
if (!s->resample) {
av_log(s, AV_LOG_ERROR, "Failed to initialize resampler\n");
return AVERROR(ENOMEM);
diff --git a/libswresample/swresample_internal.h b/libswresample/swresample_internal.h
index f2ea5a2..f00439e 100644
--- a/libswresample/swresample_internal.h
+++ b/libswresample/swresample_internal.h
@@ -69,7 +69,8 @@ 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, double kaiser_beta, double precision, int cheby, int exact_rational);
+ double cutoff, enum AVSampleFormat format, enum SwrFilterType filter_type, double kaiser_beta, double precision, int cheby,
+ int exact_rational, int force_comp);
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);
--
2.5.0
More information about the ffmpeg-devel
mailing list