summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--demux/demux.c3
-rw-r--r--demux/demux.h1
-rw-r--r--player/osd.c21
-rw-r--r--player/playloop.c14
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) {