summaryrefslogtreecommitdiffstats
path: root/filters/f_autoconvert.c
diff options
context:
space:
mode:
Diffstat (limited to 'filters/f_autoconvert.c')
-rw-r--r--filters/f_autoconvert.c42
1 files changed, 36 insertions, 6 deletions
diff --git a/filters/f_autoconvert.c b/filters/f_autoconvert.c
index ee72474f09..78b716623e 100644
--- a/filters/f_autoconvert.c
+++ b/filters/f_autoconvert.c
@@ -45,6 +45,9 @@ struct priv {
double audio_speed;
bool resampling_forced;
+ bool format_change_blocked;
+ bool format_change_cont;
+
struct mp_autoconvert public;
};
@@ -283,17 +286,30 @@ static void handle_audio_frame(struct mp_filter *f)
struct mp_chmap chmap = {0};
mp_aframe_get_chmap(aframe, &chmap);
- if (afmt == p->in_afmt && srate == p->in_srate &&
- mp_chmap_equals(&chmap, &p->in_chmap) &&
- (!p->resampling_forced || p->sub.filter) &&
- !p->force_update)
- {
+ bool format_change = afmt != p->in_afmt ||
+ srate != p->in_srate ||
+ !mp_chmap_equals(&chmap, &p->in_chmap) ||
+ p->force_update;
+
+ if (!format_change && (!p->resampling_forced || p->sub.filter))
goto cont;
- }
if (!mp_subfilter_drain_destroy(&p->sub))
return;
+ if (format_change && p->public.on_audio_format_change) {
+ if (p->format_change_blocked)
+ return;
+
+ if (!p->format_change_cont) {
+ p->format_change_blocked = true;
+ p->public.
+ on_audio_format_change(p->public.on_audio_format_change_opaque);
+ return;
+ }
+ p->format_change_cont = false;
+ }
+
p->in_afmt = afmt;
p->in_srate = srate;
p->in_chmap = chmap;
@@ -373,6 +389,17 @@ static void process(struct mp_filter *f)
mp_subfilter_continue(&p->sub);
}
+void mp_autoconvert_format_change_continue(struct mp_autoconvert *c)
+{
+ struct priv *p = c->f->priv;
+
+ if (p->format_change_blocked) {
+ p->format_change_cont = true;
+ p->format_change_blocked = false;
+ mp_filter_wakeup(c->f);
+ }
+}
+
static bool command(struct mp_filter *f, struct mp_filter_command *cmd)
{
struct priv *p = f->priv;
@@ -394,6 +421,9 @@ static void reset(struct mp_filter *f)
struct priv *p = f->priv;
mp_subfilter_reset(&p->sub);
+
+ p->format_change_cont = false;
+ p->format_change_blocked = false;
}
static void destroy(struct mp_filter *f)