diff --git a/demux/demux.c b/demux/demux.c index e4dda43cf0..348d665d49 100644 --- a/demux/demux.c +++ b/demux/demux.c @@ -3970,6 +3970,26 @@ void demuxer_select_track(struct demuxer *demuxer, struct sh_stream *stream, pthread_mutex_unlock(&in->lock); } +// Execute a refresh seek on the given stream. +// ref_pts has the same meaning as with demuxer_select_track() +void demuxer_refresh_track(struct demuxer *demuxer, struct sh_stream *stream, + double ref_pts) +{ + struct demux_internal *in = demuxer->in; + struct demux_stream *ds = stream->ds; + pthread_mutex_lock(&in->lock); + ref_pts = MP_ADD_PTS(ref_pts, -in->ts_offset); + if (ds->selected) { + MP_VERBOSE(in, "refresh track %d\n", stream->index); + update_stream_selection_state(in, ds); + if (in->back_demuxing) + ds->back_seek_pos = ref_pts; + if (!in->after_seek) + initiate_refresh_seek(in, ds, ref_pts); + } + pthread_mutex_unlock(&in->lock); +} + // This is for demuxer implementations only. demuxer_select_track() sets the // logical state, while this function returns the actual state (in case the // demuxer attempts to cache even unselected packets for track switching - this diff --git a/demux/demux.h b/demux/demux.h index f49e6e2a2f..80c9a80fc7 100644 --- a/demux/demux.h +++ b/demux/demux.h @@ -290,6 +290,8 @@ void demux_block_reading(struct demuxer *demuxer, bool block); void demuxer_select_track(struct demuxer *demuxer, struct sh_stream *stream, double ref_pts, bool selected); +void demuxer_refresh_track(struct demuxer *demuxer, struct sh_stream *stream, + double ref_pts); void demuxer_help(struct mp_log *log);