From 34c649b864cb7fd21758a07f2bfbf0d124a0e09d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Michaj=C5=82ow?= Date: Sat, 11 Jul 2026 01:51:05 +0200 Subject: [PATCH] demux: allow demuxers to update still_image during demuxing Whether a DVD title's video track consists of sparse still images (a slideshow) is only observable from the packet timestamps after streaming started, and demux_disc wants to flip sh->still_image accordingly, so that the stream stops being read eagerly. --- demux/demux.c | 30 ++++++++++++++++++++++-------- demux/demux.h | 2 ++ 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/demux/demux.c b/demux/demux.c index 5d93b1d892..48c9da4f2c 100644 --- a/demux/demux.c +++ b/demux/demux.c @@ -891,15 +891,8 @@ static void wakeup_ds(struct demux_stream *ds) } } -static void update_stream_selection_state(struct demux_internal *in, - struct demux_stream *ds) +static void update_stream_eager_state(struct demux_internal *in) { - ds->eof = false; - ds->refreshing = false; - - // We still have to go over the whole stream list to update ds->eager for - // other streams too, because they depend on other stream's selections. - bool any_av_streams = false; bool any_streams = false; @@ -926,6 +919,27 @@ static void update_stream_selection_state(struct demux_internal *in, if (!any_streams) in->blocked = false; +} + +void demux_set_stream_still_image(demuxer_t *demuxer, struct sh_stream *sh, + bool still_image) +{ + struct demux_internal *in = demuxer->in; + mp_assert(demuxer == in->d_thread); + + mp_mutex_lock(&in->lock); + sh->still_image = still_image; + update_stream_eager_state(in); + mp_mutex_unlock(&in->lock); +} + +static void update_stream_selection_state(struct demux_internal *in, + struct demux_stream *ds) +{ + ds->eof = false; + ds->refreshing = false; + + update_stream_eager_state(in); ds_clear_reader_state(ds, true); diff --git a/demux/demux.h b/demux/demux.h index 0b81810d6f..efe2be43a8 100644 --- a/demux/demux.h +++ b/demux/demux.h @@ -329,6 +329,8 @@ void demux_set_wakeup_cb(struct demuxer *demuxer, void (*cb)(void *ctx), void *c void demux_start_prefetch(struct demuxer *demuxer); void demux_drive_nav(struct demuxer *demuxer); void demux_nav_refresh(struct demuxer *demuxer); +void demux_set_stream_still_image(struct demuxer *demuxer, + struct sh_stream *sh, bool still_image); bool demux_cancel_test(struct demuxer *demuxer); bool demux_read_interrupted(struct demuxer *demuxer);