From 10fbd305c87b04b14f811d1eab820a3f3fdc1a3f Mon Sep 17 00:00:00 2001 From: sfan5 Date: Thu, 19 Nov 2020 15:07:53 +0100 Subject: demux: add function to refresh a track without (de-)selecting it --- demux/demux.c | 20 ++++++++++++++++++++ demux/demux.h | 2 ++ 2 files changed, 22 insertions(+) (limited to 'demux') 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); -- cgit v1.2.3