summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2018-02-02 17:45:01 +0100
committerKevin Mitchell <kevmitch@gmail.com>2018-02-03 05:01:33 -0800
commit07c54d8c5ca0388cd9466438c09d380e32c13183 (patch)
tree33b72ccfc3d7baabb2b7e921649945e0ef796d98
parent42125844f99704e73da762b62a09c92e5fb772c6 (diff)
downloadmpv-07c54d8c5ca0388cd9466438c09d380e32c13183.tar.bz2
mpv-07c54d8c5ca0388cd9466438c09d380e32c13183.tar.xz
loadfile: make --lavfi-complex runtime changes more flexible
Setting lavfi-complex at runtime will now forcefully reselect the tracks as needed, even if it was a "proper" track selection via --aid or --vid. Before this commit, it just failed and complained that the VO/AO was already "used". Requested.
-rw-r--r--player/loadfile.c45
1 files changed, 27 insertions, 18 deletions
diff --git a/player/loadfile.c b/player/loadfile.c
index b4b8610c31..4a12436fbd 100644
--- a/player/loadfile.c
+++ b/player/loadfile.c
@@ -1003,6 +1003,16 @@ static void cleanup_deassociated_complex_filters(struct MPContext *mpctx)
}
}
+static void kill_outputs(struct MPContext *mpctx, struct track *track)
+{
+ if (track->vo_c || track->ao_c) {
+ MP_VERBOSE(mpctx, "deselecting track %d for lavfi-complex option\n",
+ track->user_tid);
+ mp_switch_track(mpctx, track->type, NULL, 0);
+ }
+ assert(!(track->vo_c || track->ao_c));
+}
+
// >0: changed, 0: no change, -1: error
static int reinit_complex_filters(struct MPContext *mpctx, bool force_uninit)
{
@@ -1042,30 +1052,30 @@ static int reinit_complex_filters(struct MPContext *mpctx, bool force_uninit)
struct mp_pin *pad = mp_filter_get_named_pin(mpctx->lavfi, "vo");
if (pad && mp_pin_get_dir(pad) == MP_PIN_OUT) {
- if (mpctx->vo_chain) {
- MP_ERR(mpctx, "Pad vo tries to connect to already used VO.\n");
- goto done;
- } else {
+ if (mpctx->vo_chain && mpctx->vo_chain->track)
+ kill_outputs(mpctx, mpctx->vo_chain->track);
+ if (!mpctx->vo_chain) {
reinit_video_chain_src(mpctx, NULL);
if (!mpctx->vo_chain)
goto done;
}
struct vo_chain *vo_c = mpctx->vo_chain;
+ assert(!vo_c->track);
vo_c->filter_src = pad;
mp_pin_connect(vo_c->filter->f->pins[0], vo_c->filter_src);
}
pad = mp_filter_get_named_pin(mpctx->lavfi, "ao");
if (pad && mp_pin_get_dir(pad) == MP_PIN_OUT) {
- if (mpctx->ao_chain) {
- MP_ERR(mpctx, "Pad ao tries to connect to already used AO.\n");
- goto done;
- } else {
+ if (mpctx->ao_chain && mpctx->ao_chain->track)
+ kill_outputs(mpctx, mpctx->ao_chain->track);
+ if (!mpctx->ao_chain) {
reinit_audio_chain_src(mpctx, NULL);
if (!mpctx->ao_chain)
goto done;
}
struct ao_chain *ao_c = mpctx->ao_chain;
+ assert(!ao_c->track);
ao_c->filter_src = pad;
mp_pin_connect(ao_c->filter->f->pins[0], ao_c->filter_src);
}
@@ -1090,19 +1100,18 @@ static int reinit_complex_filters(struct MPContext *mpctx, bool force_uninit)
assert(!mp_pin_is_connected(pad));
assert(!track->sink);
- if (track->vo_c || track->ao_c) {
- MP_ERR(mpctx, "Pad %s tries to connect to already selected track.\n",
- label);
- goto done;
- }
+
+ kill_outputs(mpctx, track);
+
track->sink = pad;
track->selected = true;
- assert(!track->dec);
- if (track->type == STREAM_VIDEO && !init_video_decoder(mpctx, track))
- goto done;
- if (track->type == STREAM_AUDIO && !init_audio_decoder(mpctx, track))
- goto done;
+ if (!track->dec) {
+ if (track->type == STREAM_VIDEO && !init_video_decoder(mpctx, track))
+ goto done;
+ if (track->type == STREAM_AUDIO && !init_audio_decoder(mpctx, track))
+ goto done;
+ }
mp_pin_connect(track->sink, track->dec->f->pins[0]);
}