1
0
mirror of https://github.com/mpv-player/mpv synced 2025-01-24 00:23:27 +00:00

player: add --cache-pause-initial option to start in buffering state

Reasons why you'd want this see manpage additions. Disabled by default,
because it would increase latency of live streams by default. (Or well,
at least it would be another problem when trying getting lower latency.)
This commit is contained in:
wm4 2018-01-03 21:48:42 +01:00 committed by Kevin Mitchell
parent 9c22108fec
commit f798bc3c25
4 changed files with 27 additions and 0 deletions

View File

@ -3865,6 +3865,20 @@ Cache
ends before that for some other reason (like file end), playback resumes
earlier.
``--cache-pause-initial=<yes|no>``
Enter "buffering" mode before starting playback (default: no). This can be
used to ensure playback starts smoothly, in exchange for waiting some time
to prefetch network data (as controlled by ``--cache-pause-wait``). For
example, some common behavior is that playback starts, but network caches
immediately underrun when trying to decode more data as playback progresses.
Another thing that can happen is that the network prefetching is so CPU
demanding (due to demuxing in the background) that playback drops frames
at first. In these cases, it helps enabling this option, and setting
``--cache-secs`` and ``--cache-pause-wait`` to roughly the same value.
This option also triggers when playback is restarted after seeking.
Network
-------

View File

@ -451,6 +451,7 @@ const m_option_t mp_opts[] = {
OPT_FLAG("demuxer-thread", demuxer_thread, 0),
OPT_FLAG("prefetch-playlist", prefetch_open, 0),
OPT_FLAG("cache-pause", cache_pausing, 0),
OPT_FLAG("cache-pause-initial", cache_pause_initial, 0),
OPT_FLOAT("cache-pause-wait", cache_pause_wait, M_OPT_MIN, .min = 0),
OPT_DOUBLE("mf-fps", mf_fps, 0),

View File

@ -263,6 +263,7 @@ typedef struct MPOpts {
char *sub_demuxer_name;
int cache_pausing;
int cache_pause_initial;
float cache_pause_wait;
struct image_writer_opts *screenshot_image_opts;

View File

@ -950,6 +950,17 @@ static void handle_playback_restart(struct MPContext *mpctx)
mpctx->video_status < STATUS_READY)
return;
if (opts->cache_pause_initial && (mpctx->video_status == STATUS_READY ||
mpctx->audio_status == STATUS_READY))
{
// Audio or video is restarting, and initial buffering is enabled. Make
// sure we actually restart them in paused mode, so no audio gets
// dropped and video technically doesn't start yet.
mpctx->paused_for_cache = true;
mpctx->cache_buffer = 0;
update_internal_pause_state(mpctx);
}
if (mpctx->video_status == STATUS_READY) {
mpctx->video_status = STATUS_PLAYING;
get_relative_time(mpctx);