On 3/6/2017 12:19 AM, Rostislav Pehlivanov wrote: > The soxr resampler is slower and worse than the swr resampler, > hence drop the former. > > Signed-off-by: Rostislav Pehlivanov <atomnu...@gmail.com> > --- > Changelog | 1 + > MAINTAINERS | 1 - > configure | 5 +- > doc/resampler.texi | 53 ++++----------- > libswresample/Makefile | 1 - > libswresample/options.c | 7 -- > libswresample/resample.c | 2 +- > libswresample/soxr_resample.c | 130 > ------------------------------------ > libswresample/swresample.c | 18 +---- > libswresample/swresample.h | 7 -- > libswresample/swresample_internal.h | 9 +-- > 11 files changed, 21 insertions(+), 213 deletions(-) > delete mode 100644 libswresample/soxr_resample.c >
Crashes doing about anything with libswr, like for example "make fate-swr" [...] > diff --git a/libswresample/options.c b/libswresample/options.c > index 4abf5e0518..b450d28475 100644 > --- a/libswresample/options.c > +++ b/libswresample/options.c > @@ -91,13 +91,6 @@ static const AVOption options[]={ > /* duplicate option in order to work with avconv */ > {"resample_cutoff" , "set cutoff frequency ratio" , OFFSET(cutoff) > , AV_OPT_TYPE_DOUBLE,{.dbl=0. }, 0 , 1 , > PARAM }, > > -{"resampler" , "set resampling Engine" , OFFSET(engine) > , AV_OPT_TYPE_INT , {.i64=0 }, 0 , > SWR_ENGINE_NB-1, PARAM, "resampler"}, > -{"swr" , "select SW Resampler" , 0 > , AV_OPT_TYPE_CONST, {.i64=SWR_ENGINE_SWR }, INT_MIN, INT_MAX , > PARAM, "resampler"}, > -{"soxr" , "select SoX Resampler" , 0 > , AV_OPT_TYPE_CONST, {.i64=SWR_ENGINE_SOXR }, INT_MIN, INT_MAX , > PARAM, "resampler"}, > -{"precision" , "set soxr resampling precision (in bits)" > - , OFFSET(precision) > , AV_OPT_TYPE_DOUBLE,{.dbl=20.0 }, 15.0 , 33.0 , > PARAM }, > -{"cheby" , "enable soxr Chebyshev passband & higher-precision > irrational ratio approximation" > - , OFFSET(cheby) > , AV_OPT_TYPE_BOOL , {.i64=0 }, 0 , 1 , > PARAM }, Public options, need to be deprecated before removal. > diff --git a/libswresample/swresample.c b/libswresample/swresample.c > index dea61391ac..de46118d86 100644 > --- a/libswresample/swresample.c > +++ b/libswresample/swresample.c > @@ -133,7 +133,6 @@ static void clear_context(SwrContext *s){ > swri_audio_convert_free(&s->full_convert); > swri_rematrix_free(s); > > - s->delayed_samples_fixup = 0; > s->flushed = 0; > } > > @@ -188,16 +187,6 @@ av_cold int swr_init(struct SwrContext *s){ > s->out_ch_layout = 0; > } > > - switch(s->engine){ > -#if CONFIG_LIBSOXR > - case SWR_ENGINE_SOXR: s->resampler = &swri_soxr_resampler; break; > -#endif > - case SWR_ENGINE_SWR : s->resampler = &swri_resampler; break; > - default: > - av_log(s, AV_LOG_ERROR, "Requested resampling engine is > unavailable\n"); > - return AVERROR(EINVAL); > - } > - > if(!s->used_ch_count) > s->used_ch_count= s->in.ch_count; > > @@ -225,8 +214,7 @@ av_cold int swr_init(struct SwrContext *s){ > s->int_sample_fmt= AV_SAMPLE_FMT_S16P; > }else if( av_get_planar_sample_fmt(s-> in_sample_fmt) == > AV_SAMPLE_FMT_S32P > && av_get_planar_sample_fmt(s->out_sample_fmt) == > AV_SAMPLE_FMT_S32P > - && !s->rematrix > - && s->engine != SWR_ENGINE_SOXR){ > + && !s->rematrix){ > s->int_sample_fmt= AV_SAMPLE_FMT_S32P; > }else if(av_get_bytes_per_sample(s->in_sample_fmt) <= 4){ > s->int_sample_fmt= AV_SAMPLE_FMT_FLTP; > @@ -265,7 +253,7 @@ 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->exact_rational); s->resampler is NULL here after the chunk removed above. Most assuredly the source of the crashes. > if (!s->resample) { > av_log(s, AV_LOG_ERROR, "Failed to initialize resampler\n"); > return AVERROR(ENOMEM); > @@ -482,7 +470,7 @@ static int resample(SwrContext *s, AudioData *out_param, > int out_count, > AudioData in, out, tmp; > int ret_sum=0; > int border=0; > - int padless = ARCH_X86 && s->engine == SWR_ENGINE_SWR ? 7 : 0; > + int padless = ARCH_X86 && 7; ARCH_X86 ? 7 : 0; is more readable. > > av_assert1(s->in_buffer.ch_count == in_param->ch_count); > av_assert1(s->in_buffer.planar == in_param->planar); > diff --git a/libswresample/swresample.h b/libswresample/swresample.h > index a8db5c2490..f63e3aea85 100644 > --- a/libswresample/swresample.h > +++ b/libswresample/swresample.h > @@ -159,13 +159,6 @@ enum SwrDitherType { > SWR_DITHER_NB, ///< not part of API/ABI > }; > > -/** Resampling Engines */ > -enum SwrEngine { > - SWR_ENGINE_SWR, /**< SW Resampler */ > - SWR_ENGINE_SOXR, /**< SoX Resampler */ > - SWR_ENGINE_NB, ///< not part of API/ABI > -}; This is a public header, you can't remove this without a deprecation period. Keep the public facing enums and options, but remove all the internal changes introduced to accommodate soxr (struct Resampler and related function pointers, etc). Choosing SWR_ENGINE_SOXR should still give an error and bail out. > - > /** Resampling Filter Types */ > enum SwrFilterType { > SWR_FILTER_TYPE_CUBIC, /**< Cubic */ > diff --git a/libswresample/swresample_internal.h > b/libswresample/swresample_internal.h > index f2ea5a226d..7296d2b9fe 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, double kaiser_beta, double precision, > int cheby, int exact_rational); > + double cutoff, enum AVSampleFormat > format, enum SwrFilterType filter_type, double kaiser_beta, int > exact_rational); > 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); > @@ -89,9 +89,6 @@ struct Resampler { > get_out_samples_func get_out_samples; > }; > > -extern struct Resampler const swri_resampler; > -extern struct Resampler const swri_soxr_resampler; > - > struct SwrContext { > const AVClass *av_class; ///< AVClass used for > AVOption and av_log() > int log_level_offset; ///< logging level offset > @@ -112,7 +109,6 @@ struct SwrContext { > int matrix_encoding; /**< matrixed stereo > encoding */ > const int *channel_map; ///< channel index (or > -1 if muted channel) map > int used_ch_count; ///< number of used > input channels (mapped channel count if channel_map, otherwise in.ch_count) > - int engine; > > int user_in_ch_count; ///< User set input > channel count > int user_out_ch_count; ///< User set output > channel count > @@ -131,8 +127,6 @@ struct SwrContext { > 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 */ > 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 */ > > float min_compensation; ///< swr minimum below > which no compensation will happen > float min_hard_compensation; ///< swr minimum below > which no silence inject / sample drop will happen > @@ -160,7 +154,6 @@ struct SwrContext { > int64_t outpts; ///< output PTS > int64_t firstpts; ///< first PTS > int drop_output; ///< number of output > samples to drop > - double delayed_samples_fixup; ///< soxr 0.1.1: needed > to fixup delayed_samples after flush has been called. > > struct AudioConvert *in_convert; ///< input conversion > context > struct AudioConvert *out_convert; ///< output conversion > context > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel