summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--audio/filter/af_lavrresample.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/audio/filter/af_lavrresample.c b/audio/filter/af_lavrresample.c
index b73f0d8d0e..11af645910 100644
--- a/audio/filter/af_lavrresample.c
+++ b/audio/filter/af_lavrresample.c
@@ -91,6 +91,8 @@ struct af_resample {
int out_rate;
int out_format;
struct mp_chmap out_channels;
+
+ double missing_samples; // fractional samples not yet output
};
#if HAVE_LIBAVRESAMPLE
@@ -224,6 +226,8 @@ static int configure_lavrr(struct af_instance *af, struct mp_audio *in,
s->out_channels= out->channels;
s->in_channels = in->channels;
+ s->missing_samples = 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);
@@ -519,10 +523,12 @@ static int filter(struct af_instance *af, struct mp_audio *in)
if (!need_reinit && s->avrctx) {
double speed_factor = s->playback_speed * s->in_rate_af / s->in_rate;
int in_samples = in ? in->samples : 0;
- int wanted_samples = lrint(in_samples / speed_factor);
+ double wanted_samples = in_samples / speed_factor + s->missing_samples;
+ int wanted_samples_i = lrint(wanted_samples);
+ s->missing_samples = wanted_samples - wanted_samples_i;
if (avresample_set_compensation(s->avrctx,
- (wanted_samples - in_samples) * s->out_rate / s->in_rate,
- wanted_samples * s->out_rate / s->in_rate) < 0)
+ (wanted_samples_i - in_samples) * s->out_rate / s->in_rate,
+ wanted_samples_i * s->out_rate / s->in_rate) < 0)
need_reinit = true;
}