summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2016-01-18 18:34:44 +0100
committerwm4 <wm4@nowhere>2016-01-18 18:43:55 +0100
commit46bcdb7039cdf146966075f268c68b0fcee5ebbf (patch)
treed2af1617afd4c4b2999500f29a6ad5730d371c12
parent5986861c9cbe33509b9a18ad048bbc0de7ba8dbe (diff)
downloadmpv-46bcdb7039cdf146966075f268c68b0fcee5ebbf.tar.bz2
mpv-46bcdb7039cdf146966075f268c68b0fcee5ebbf.tar.xz
demux: disable stream cache if no tracks are selected
Slightly helps with timeline stuff, like EDL. There is no need to keep network (or even just disk I/O) busy for all segments at the same time, because 1. the data won't be needed any time soon, and 2. will probably be discarded anyway if the stream is seeked when segment is resumed. Partially fixes #2692.
-rw-r--r--demux/demux.c8
-rw-r--r--player/loadfile.c5
2 files changed, 12 insertions, 1 deletions
diff --git a/demux/demux.c b/demux/demux.c
index 1991ad216b..e286bf0e32 100644
--- a/demux/demux.c
+++ b/demux/demux.c
@@ -558,11 +558,18 @@ static void execute_trackswitch(struct demux_internal *in)
{
in->tracks_switched = false;
+ bool any_selected = false;
+ for (int n = 0; n < in->num_streams; n++)
+ any_selected |= in->streams[n]->ds->selected;
+
pthread_mutex_unlock(&in->lock);
if (in->d_thread->desc->control)
in->d_thread->desc->control(in->d_thread, DEMUXER_CTRL_SWITCHED_TRACKS, 0);
+ stream_control(in->d_thread->stream, STREAM_CTRL_SET_READAHEAD,
+ &(int){any_selected});
+
pthread_mutex_lock(&in->lock);
if (in->start_refresh_seek)
@@ -1077,6 +1084,7 @@ static struct demuxer *open_given_type(struct mpv_global *global,
demux_init_cache(demuxer);
demux_changed(in->d_thread, DEMUX_EVENT_ALL);
demux_update(demuxer);
+ stream_control(demuxer->stream, STREAM_CTRL_SET_READAHEAD, &(int){false});
return demuxer;
}
diff --git a/player/loadfile.c b/player/loadfile.c
index 7a33fd7478..7d5a5f847d 100644
--- a/player/loadfile.c
+++ b/player/loadfile.c
@@ -312,7 +312,10 @@ bool timeline_switch_to_time(struct MPContext *mpctx, double pts)
if (mpctx->demuxer) {
demux_stop_thread(mpctx->demuxer);
- demux_flush(mpctx->demuxer);
+ for (int i = 0; i < demux_get_num_stream(mpctx->demuxer); i++) {
+ struct sh_stream *sh = demux_get_stream(mpctx->demuxer, i);
+ demuxer_select_track(mpctx->demuxer, sh, false);
+ }
}
mpctx->demuxer = n->source;