From 6ebac1f794623e2b62d599f944fb91d42a7b1c3d Mon Sep 17 00:00:00 2001 From: sfan5 Date: Thu, 19 Nov 2020 15:12:04 +0100 Subject: player: allow vo to be switched at runtime --- player/command.c | 10 ++++++++++ player/core.h | 3 ++- player/loadfile.c | 17 +++++++++++------ 3 files changed, 23 insertions(+), 7 deletions(-) (limited to 'player') diff --git a/player/command.c b/player/command.c index 066e8be784..098a11d24f 100644 --- a/player/command.c +++ b/player/command.c @@ -6525,6 +6525,16 @@ void mp_option_change_callback(void *ctx, struct m_config_option *co, int flags, mpctx->ipc_ctx = mp_init_ipc(mpctx->clients, mpctx->global); } + if (opt_ptr == &opts->vo->video_driver_list) { + struct track *track = mpctx->current_track[0][STREAM_VIDEO]; + uninit_video_out(mpctx); + reinit_video_chain(mpctx); + if (track) + reselect_demux_stream(mpctx, track, true); + + mp_wakeup_core(mpctx); + } + if (flags & UPDATE_AUDIO) reload_audio_output(mpctx); diff --git a/player/core.h b/player/core.h index ec154dedd0..f2f0a15a00 100644 --- a/player/core.h +++ b/player/core.h @@ -547,7 +547,8 @@ void mp_set_playlist_entry(struct MPContext *mpctx, struct playlist_entry *e); void mp_play_files(struct MPContext *mpctx); void update_demuxer_properties(struct MPContext *mpctx); void print_track_list(struct MPContext *mpctx, const char *msg); -void reselect_demux_stream(struct MPContext *mpctx, struct track *track); +void reselect_demux_stream(struct MPContext *mpctx, struct track *track, + bool refresh_only); void prepare_playlist(struct MPContext *mpctx, struct playlist *pl); void autoload_external_files(struct MPContext *mpctx, struct mp_cancel *cancel); struct track *select_default_track(struct MPContext *mpctx, int order, diff --git a/player/loadfile.c b/player/loadfile.c index 0adc8e351d..058be92c83 100644 --- a/player/loadfile.c +++ b/player/loadfile.c @@ -362,7 +362,9 @@ void update_demuxer_properties(struct MPContext *mpctx) // Enables or disables the stream for the given track, according to // track->selected. -void reselect_demux_stream(struct MPContext *mpctx, struct track *track) +// With refresh_only=true, refreshes the stream if it's enabled. +void reselect_demux_stream(struct MPContext *mpctx, struct track *track, + bool refresh_only) { if (!track->stream) return; @@ -372,7 +374,10 @@ void reselect_demux_stream(struct MPContext *mpctx, struct track *track) if (track->type == STREAM_SUB) pts -= 10.0; } - demuxer_select_track(track->demuxer, track->stream, pts, track->selected); + if (refresh_only) + demuxer_refresh_track(track->demuxer, track->stream, pts); + else + demuxer_select_track(track->demuxer, track->stream, pts, track->selected); } static void enable_demux_thread(struct MPContext *mpctx, struct demuxer *demux) @@ -658,14 +663,14 @@ void mp_switch_track_n(struct MPContext *mpctx, int order, enum stream_type type if (current->remux_sink) close_recorder_and_error(mpctx); current->selected = false; - reselect_demux_stream(mpctx, current); + reselect_demux_stream(mpctx, current, false); } mpctx->current_track[order][type] = track; if (track) { track->selected = true; - reselect_demux_stream(mpctx, track); + reselect_demux_stream(mpctx, track, false); } if (type == STREAM_VIDEO && order == 0) { @@ -1341,7 +1346,7 @@ done: if (mpctx->playback_initialized) { for (int n = 0; n < mpctx->num_tracks; n++) - reselect_demux_stream(mpctx, mpctx->tracks[n]); + reselect_demux_stream(mpctx, mpctx->tracks[n], false); } mp_notify(mpctx, MPV_EVENT_TRACKS_CHANGED, NULL); @@ -1583,7 +1588,7 @@ static void play_current_file(struct MPContext *mpctx) } for (int n = 0; n < mpctx->num_tracks; n++) - reselect_demux_stream(mpctx, mpctx->tracks[n]); + reselect_demux_stream(mpctx, mpctx->tracks[n], false); update_demuxer_properties(mpctx); -- cgit v1.2.3