summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-09-08 22:21:19 +0200
committerwm4 <wm4@nowhere>2015-09-08 22:21:19 +0200
commitaf0b903afa0f9b7498ae62b0a3550d6dfab7a7ee (patch)
treeb8ae422dc19c5d424a92c0f0cbf9a9a502d52028
parent4eae4a5da77f127f381119a1e54351b7812deed4 (diff)
downloadmpv-af0b903afa0f9b7498ae62b0a3550d6dfab7a7ee.tar.bz2
mpv-af0b903afa0f9b7498ae62b0a3550d6dfab7a7ee.tar.xz
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.
-rw-r--r--audio/filter/af_lavrresample.c65
1 files changed, 30 insertions, 35 deletions
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);