summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsfan5 <sfan5@live.de>2020-11-19 15:07:53 +0100
committersfan5 <sfan5@live.de>2020-11-27 17:28:59 +0100
commit10fbd305c87b04b14f811d1eab820a3f3fdc1a3f (patch)
treee0025975781e26936d44fcabfdaee44bc78f59a4
parent4d80314c5c8838cf04bc53b75a123d281f8d30a3 (diff)
downloadmpv-10fbd305c87b04b14f811d1eab820a3f3fdc1a3f.tar.bz2
mpv-10fbd305c87b04b14f811d1eab820a3f3fdc1a3f.tar.xz
demux: add function to refresh a track without (de-)selecting it
-rw-r--r--demux/demux.c20
-rw-r--r--demux/demux.h2
2 files changed, 22 insertions, 0 deletions
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);