mirror of
https://github.com/mpv-player/mpv
synced 2025-04-11 04:01:31 +00:00
player: allow vo to be switched at runtime
This commit is contained in:
parent
10fbd305c8
commit
6ebac1f794
@ -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);
|
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)
|
if (flags & UPDATE_AUDIO)
|
||||||
reload_audio_output(mpctx);
|
reload_audio_output(mpctx);
|
||||||
|
|
||||||
|
@ -547,7 +547,8 @@ void mp_set_playlist_entry(struct MPContext *mpctx, struct playlist_entry *e);
|
|||||||
void mp_play_files(struct MPContext *mpctx);
|
void mp_play_files(struct MPContext *mpctx);
|
||||||
void update_demuxer_properties(struct MPContext *mpctx);
|
void update_demuxer_properties(struct MPContext *mpctx);
|
||||||
void print_track_list(struct MPContext *mpctx, const char *msg);
|
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 prepare_playlist(struct MPContext *mpctx, struct playlist *pl);
|
||||||
void autoload_external_files(struct MPContext *mpctx, struct mp_cancel *cancel);
|
void autoload_external_files(struct MPContext *mpctx, struct mp_cancel *cancel);
|
||||||
struct track *select_default_track(struct MPContext *mpctx, int order,
|
struct track *select_default_track(struct MPContext *mpctx, int order,
|
||||||
|
@ -362,7 +362,9 @@ void update_demuxer_properties(struct MPContext *mpctx)
|
|||||||
|
|
||||||
// Enables or disables the stream for the given track, according to
|
// Enables or disables the stream for the given track, according to
|
||||||
// track->selected.
|
// 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)
|
if (!track->stream)
|
||||||
return;
|
return;
|
||||||
@ -372,7 +374,10 @@ void reselect_demux_stream(struct MPContext *mpctx, struct track *track)
|
|||||||
if (track->type == STREAM_SUB)
|
if (track->type == STREAM_SUB)
|
||||||
pts -= 10.0;
|
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)
|
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)
|
if (current->remux_sink)
|
||||||
close_recorder_and_error(mpctx);
|
close_recorder_and_error(mpctx);
|
||||||
current->selected = false;
|
current->selected = false;
|
||||||
reselect_demux_stream(mpctx, current);
|
reselect_demux_stream(mpctx, current, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
mpctx->current_track[order][type] = track;
|
mpctx->current_track[order][type] = track;
|
||||||
|
|
||||||
if (track) {
|
if (track) {
|
||||||
track->selected = true;
|
track->selected = true;
|
||||||
reselect_demux_stream(mpctx, track);
|
reselect_demux_stream(mpctx, track, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type == STREAM_VIDEO && order == 0) {
|
if (type == STREAM_VIDEO && order == 0) {
|
||||||
@ -1341,7 +1346,7 @@ done:
|
|||||||
|
|
||||||
if (mpctx->playback_initialized) {
|
if (mpctx->playback_initialized) {
|
||||||
for (int n = 0; n < mpctx->num_tracks; n++)
|
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);
|
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++)
|
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);
|
update_demuxer_properties(mpctx);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user