From af0b903afa0f9b7498ae62b0a3550d6dfab7a7ee Mon Sep 17 00:00:00 2001 From: wm4 Date: Tue, 8 Sep 2015 22:21:19 +0200 Subject: af_lavrresample: remove unnecessary indirections Not sure why struct af_resample_opts even exists. It seems useful to group the fields set by user options. But storing the current format conversion parameters doesn't seem very elegant, and having a separate instance in the "ctx" field isn't helpful either. --- audio/filter/af_lavrresample.c | 65 +++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 35 deletions(-) (limited to 'audio') diff --git a/audio/filter/af_lavrresample.c b/audio/filter/af_lavrresample.c index f4669af343..d651c10f4c 100644 --- a/audio/filter/af_lavrresample.c +++ b/audio/filter/af_lavrresample.c @@ -66,14 +66,6 @@ struct af_resample_opts { int linear; double cutoff; int normalize; - - int in_rate_af; // filter input sample rate - int in_rate; // actual rate (used by lavr), adjusted for playback speed - int in_format; - struct mp_chmap in_channels; - int out_rate; - int out_format; - struct mp_chmap out_channels; }; struct af_resample { @@ -85,19 +77,26 @@ struct af_resample { struct mp_audio pool_fmt; // format used to allocate frames for avrctx output struct mp_audio pre_out_fmt; // format before final conversion (S24) struct AVAudioResampleContext *avrctx_out; // for output channel reordering - struct af_resample_opts ctx; // opts in the context struct af_resample_opts opts; // opts requested by the user // At least libswresample keeps a pointer around for this: int reorder_in[MP_NUM_CHANNELS]; int reorder_out[MP_NUM_CHANNELS]; struct mp_audio_pool *reorder_buffer; + + int in_rate_af; // filter input sample rate + int in_rate; // actual rate (used by lavr), adjusted for playback speed + int in_format; + struct mp_chmap in_channels; + int out_rate; + int out_format; + struct mp_chmap out_channels; }; #if HAVE_LIBAVRESAMPLE static double get_delay(struct af_resample *s) { - return avresample_get_delay(s->avrctx) / (double)s->ctx.in_rate + - avresample_available(s->avrctx) / (double)s->ctx.out_rate; + return avresample_get_delay(s->avrctx) / (double)s->in_rate + + avresample_available(s->avrctx) / (double)s->out_rate; } static void drop_all_output(struct af_resample *s) { @@ -110,7 +109,7 @@ static int get_out_samples(struct af_resample *s, int in_samples) #else static double get_delay(struct af_resample *s) { - int64_t base = s->ctx.in_rate * (int64_t)s->ctx.out_rate; + int64_t base = s->in_rate * (int64_t)s->out_rate; return swr_get_delay(s->avrctx, base) / (double)base; } static void drop_all_output(struct af_resample *s) @@ -122,8 +121,8 @@ static int get_out_samples(struct af_resample *s, int in_samples) #if LIBSWRESAMPLE_VERSION_MAJOR > 1 || LIBSWRESAMPLE_VERSION_MINOR >= 2 return swr_get_out_samples(s->avrctx, in_samples); #else - return av_rescale_rnd(in_samples, s->ctx.out_rate, s->ctx.in_rate, AV_ROUND_UP) - + swr_get_delay(s->avrctx, s->ctx.out_rate); + return av_rescale_rnd(in_samples, s->out_rate, s->in_rate, AV_ROUND_UP) + + swr_get_delay(s->avrctx, s->out_rate); #endif } #endif @@ -216,23 +215,19 @@ static int configure_lavrr(struct af_instance *af, struct mp_audio *in, out_samplefmtp == AV_SAMPLE_FMT_NONE) goto error; - s->ctx.out_rate = out->rate; - s->ctx.in_rate_af = in->rate; - s->ctx.in_rate = rate_from_speed(in->rate, s->playback_speed); - s->ctx.out_format = out->format; - s->ctx.in_format = in->format; - s->ctx.out_channels= out->channels; - s->ctx.in_channels = in->channels; - s->ctx.filter_size = s->opts.filter_size; - s->ctx.phase_shift = s->opts.phase_shift; - s->ctx.linear = s->opts.linear; - s->ctx.cutoff = s->opts.cutoff; + s->out_rate = out->rate; + s->in_rate_af = in->rate; + s->in_rate = rate_from_speed(in->rate, s->playback_speed); + s->out_format = out->format; + s->in_format = in->format; + s->out_channels= out->channels; + s->in_channels = in->channels; - av_opt_set_int(s->avrctx, "filter_size", s->ctx.filter_size, 0); - av_opt_set_int(s->avrctx, "phase_shift", s->ctx.phase_shift, 0); - av_opt_set_int(s->avrctx, "linear_interp", s->ctx.linear, 0); + av_opt_set_int(s->avrctx, "filter_size", s->opts.filter_size, 0); + av_opt_set_int(s->avrctx, "phase_shift", s->opts.phase_shift, 0); + av_opt_set_int(s->avrctx, "linear_interp", s->opts.linear, 0); - av_opt_set_double(s->avrctx, "cutoff", s->ctx.cutoff, 0); + av_opt_set_double(s->avrctx, "cutoff", s->opts.cutoff, 0); #if HAVE_LIBSWRESAMPLE av_opt_set_double(s->avrctx, "rematrix_maxval", s->opts.normalize ? 1 : 1000, 0); @@ -304,8 +299,8 @@ static int configure_lavrr(struct af_instance *af, struct mp_audio *in, // Real conversion; output is input to avrctx_out. av_opt_set_int(s->avrctx, "in_channel_layout", in_ch_layout, 0); av_opt_set_int(s->avrctx, "out_channel_layout", out_ch_layout, 0); - av_opt_set_int(s->avrctx, "in_sample_rate", s->ctx.in_rate, 0); - av_opt_set_int(s->avrctx, "out_sample_rate", s->ctx.out_rate, 0); + av_opt_set_int(s->avrctx, "in_sample_rate", s->in_rate, 0); + av_opt_set_int(s->avrctx, "out_sample_rate", s->out_rate, 0); av_opt_set_int(s->avrctx, "in_sample_fmt", in_samplefmt, 0); av_opt_set_int(s->avrctx, "out_sample_fmt", out_samplefmtp, 0); @@ -319,8 +314,8 @@ static int configure_lavrr(struct af_instance *af, struct mp_audio *in, av_opt_set_int(s->avrctx_out, "out_channel_layout", fake_out_ch_layout, 0); av_opt_set_int(s->avrctx_out, "in_sample_fmt", out_samplefmtp, 0); av_opt_set_int(s->avrctx_out, "out_sample_fmt", out_samplefmt, 0); - av_opt_set_int(s->avrctx_out, "in_sample_rate", s->ctx.out_rate, 0); - av_opt_set_int(s->avrctx_out, "out_sample_rate", s->ctx.out_rate, 0); + av_opt_set_int(s->avrctx_out, "in_sample_rate", s->out_rate, 0); + av_opt_set_int(s->avrctx_out, "out_sample_rate", s->out_rate, 0); // API has weird requirements, quoting avresample.h: // * This function can only be called when the allocated context is not open. @@ -391,8 +386,8 @@ static int control(struct af_instance *af, int cmd, void *arg) return AF_OK; case AF_CONTROL_SET_PLAYBACK_SPEED_RESAMPLE: { s->playback_speed = *(double *)arg; - int new_rate = rate_from_speed(s->ctx.in_rate_af, s->playback_speed); - if (new_rate != s->ctx.in_rate && s->avrctx && af->fmt_out.format) { + int new_rate = rate_from_speed(s->in_rate_af, s->playback_speed); + if (new_rate != s->in_rate && s->avrctx && af->fmt_out.format) { // Before reconfiguring, drain the audio that is still buffered // in the resampler. af->filter_frame(af, NULL); -- cgit v1.2.3