diff options
-rw-r--r-- | demux/demux.c | 3 | ||||
-rw-r--r-- | demux/demux.h | 1 | ||||
-rw-r--r-- | player/osd.c | 21 | ||||
-rw-r--r-- | player/playloop.c | 14 |
4 files changed, 27 insertions, 12 deletions
diff --git a/demux/demux.c b/demux/demux.c index c62c0754b8..94b230a6dc 100644 --- a/demux/demux.c +++ b/demux/demux.c @@ -1176,6 +1176,7 @@ static int cached_demux_control(struct demux_internal *in, int cmd, void *arg) .eof = in->last_eof, .idle = in->idle, .ts_range = {MP_NOPTS_VALUE, MP_NOPTS_VALUE}, + .ts_duration = -1, }; for (int n = 0; n < in->d_user->num_streams; n++) { struct demux_stream *ds = in->d_user->streams[n]->ds; @@ -1186,6 +1187,8 @@ static int cached_demux_control(struct demux_internal *in, int cmd, void *arg) } } r->idle = (r->idle && !r->underrun) || r->eof; + if (r->ts_range[0] != MP_NOPTS_VALUE && r->ts_range[1] != MP_NOPTS_VALUE) + r->ts_duration = r->ts_range[1] - r->ts_range[0]; return DEMUXER_CTRL_OK; } } diff --git a/demux/demux.h b/demux/demux.h index d0f70c6f57..20e6b8a15e 100644 --- a/demux/demux.h +++ b/demux/demux.h @@ -60,6 +60,7 @@ enum demux_ctrl { struct demux_ctrl_reader_state { bool eof, underrun, idle; double ts_range[2]; // start, end + double ts_duration; }; struct demux_ctrl_stream_ctrl { diff --git a/player/osd.c b/player/osd.c index b7fb841485..08bf28dd85 100644 --- a/player/osd.c +++ b/player/osd.c @@ -37,6 +37,7 @@ #include "osdep/timer.h" #include "demux/demux.h" +#include "stream/stream.h" #include "sub/osd.h" #include "video/out/vo.h" @@ -232,9 +233,23 @@ static void print_status(struct MPContext *mpctx) } } - float cache = mp_get_cache_percent(mpctx); - if (cache >= 0) - saddf(&line, " Cache: %.2f%%", cache); + if (mpctx->demuxer) { + int64_t fill = -1; + demux_stream_control(mpctx->demuxer, STREAM_CTRL_GET_CACHE_FILL, &fill); + if (fill >= 0) { + saddf(&line, " Cache: "); + + struct demux_ctrl_reader_state s = {.ts_duration = -1}; + demux_control(mpctx->demuxer, DEMUXER_CTRL_GET_READER_STATE, &s); + + if (s.ts_duration < 0) { + saddf(&line, "???"); + } else { + saddf(&line, "%2ds", (int)s.ts_duration); + } + saddf(&line, "+%lldKB", (long long)(fill / 1024)); + } + } if (opts->term_osd_bar) { saddf(&line, "\n"); diff --git a/player/playloop.c b/player/playloop.c index 89af8fa55b..319e4a89f1 100644 --- a/player/playloop.c +++ b/player/playloop.c @@ -521,18 +521,14 @@ static void handle_pause_on_low_cache(struct MPContext *mpctx) if (!mpctx->demuxer) return; - struct demux_ctrl_reader_state s = - {.idle = true, .ts_range = {MP_NOPTS_VALUE, MP_NOPTS_VALUE}}; - demux_control(mpctx->demuxer, DEMUXER_CTRL_GET_READER_STATE, &s); - int idle = -1; demux_stream_control(mpctx->demuxer, STREAM_CTRL_GET_CACHE_IDLE, &idle); - double range = -1; - if (s.ts_range[0] != MP_NOPTS_VALUE && s.ts_range[1] != MP_NOPTS_VALUE) - range = s.ts_range[1] - s.ts_range[0]; - if (range < 0) - range = 1e20; // unknown/broken timestamps; disable + struct demux_ctrl_reader_state s = {.idle = true, .ts_duration = -1}; + demux_control(mpctx->demuxer, DEMUXER_CTRL_GET_READER_STATE, &s); + + // disable on unknown/broken timestamps + double range = s.ts_duration >= 0 ? s.ts_duration : 1e20; if (mpctx->restart_complete && idle != -1) { if (mpctx->paused && mpctx->paused_for_cache) { |