summaryrefslogtreecommitdiffstats
path: root/audio/filter/af_lavrresample.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-06-04 20:08:12 +0200
committerwm4 <wm4@nowhere>2015-06-04 21:23:46 +0200
commitfd96bddca98b88e77d6047371b54d6065c4260c2 (patch)
tree62cfef07eae56a3a00234c333e3fca78260a907f /audio/filter/af_lavrresample.c
parent935997d4d68d7dc142a1b5c492be64a8e87b4763 (diff)
downloadmpv-fd96bddca98b88e77d6047371b54d6065c4260c2.tar.bz2
mpv-fd96bddca98b88e77d6047371b54d6065c4260c2.tar.xz
af_lavrresample: slightly better computation of total delay
On libavresample, don't ignore the buffered output data. On libswresample, don't round the total buffer size to the input samplerate.
Diffstat (limited to 'audio/filter/af_lavrresample.c')
-rw-r--r--audio/filter/af_lavrresample.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/audio/filter/af_lavrresample.c b/audio/filter/af_lavrresample.c
index fec3927671..869f5840ab 100644
--- a/audio/filter/af_lavrresample.c
+++ b/audio/filter/af_lavrresample.c
@@ -91,9 +91,10 @@ struct af_resample {
};
#if HAVE_LIBAVRESAMPLE
-static int get_delay(struct af_resample *s)
+static double get_delay(struct af_resample *s)
{
- return avresample_get_delay(s->avrctx);
+ return avresample_get_delay(s->avrctx) / (double)s->ctx.in_rate +
+ avresample_available(s->avrctx) / (double)s->ctx.out_rate;
}
static void drop_all_output(struct af_resample *s)
{
@@ -104,9 +105,10 @@ static int get_out_samples(struct af_resample *s, int in_samples)
return avresample_get_out_samples(s->avrctx, in_samples);
}
#else
-static int get_delay(struct af_resample *s)
+static double get_delay(struct af_resample *s)
{
- return swr_get_delay(s->avrctx, s->ctx.in_rate);
+ int64_t base = s->ctx.in_rate * (int64_t)s->ctx.out_rate;
+ return swr_get_delay(s->avrctx, base) / (double)base;
}
static void drop_all_output(struct af_resample *s)
{
@@ -419,8 +421,6 @@ static int filter(struct af_instance *af, struct mp_audio *in)
if (in)
mp_audio_copy_attributes(out, in);
- af->delay = get_delay(s) / (double)s->ctx.in_rate;
-
if (out->samples) {
out->samples = resample_frame(s->avrctx, out, in);
if (out->samples < 0)
@@ -450,6 +450,9 @@ static int filter(struct af_instance *af, struct mp_audio *in)
} else {
talloc_free(out);
}
+
+ af->delay = get_delay(s);
+
return 0;
error:
talloc_free(in);