From 19becc8ea911e74b5443420a8da411444f980725 Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 7 Nov 2019 16:05:27 +0100 Subject: stats, demux: log byte level stream seeks --- demux/demux.c | 7 +++++++ demux/demux.h | 1 + player/command.c | 1 + player/lua/stats.lua | 1 + stream/stream.c | 2 ++ stream/stream.h | 2 ++ 6 files changed, 14 insertions(+) diff --git a/demux/demux.c b/demux/demux.c index c6319281a0..40439b32a8 100644 --- a/demux/demux.c +++ b/demux/demux.c @@ -273,6 +273,7 @@ struct demux_internal { int64_t slave_unbuffered_read_bytes; // value repoted from demuxer impl. int64_t hack_unbuffered_read_bytes; // for demux_get_bytes_read_hack() int64_t cache_unbuffered_read_bytes; // for demux_reader_state.bytes_per_second + int64_t byte_level_seeks; // for demux_reader_state.byte_level_seeks }; struct timed_metadata { @@ -3978,14 +3979,19 @@ static void update_bytes_read(struct demux_internal *in) int64_t new = in->slave_unbuffered_read_bytes; in->slave_unbuffered_read_bytes = 0; + int64_t new_seeks = 0; + struct stream *stream = demuxer->stream; if (stream) { new += stream->total_unbuffered_read_bytes; stream->total_unbuffered_read_bytes = 0; + new_seeks += stream->total_stream_seeks; + stream->total_stream_seeks = 0; } in->cache_unbuffered_read_bytes += new; in->hack_unbuffered_read_bytes += new; + in->byte_level_seeks += new_seeks; } // must be called not locked @@ -4346,6 +4352,7 @@ void demux_get_reader_state(struct demuxer *demuxer, struct demux_reader_state * .low_level_seeks = in->low_level_seeks, .ts_last = in->demux_ts, .bytes_per_second = in->bytes_per_second, + .byte_level_seeks = in->byte_level_seeks, .file_cache_bytes = in->cache ? demux_cache_get_size(in->cache) : -1, }; bool any_packets = false; diff --git a/demux/demux.h b/demux/demux.h index 3e3abbc84f..235744c6f7 100644 --- a/demux/demux.h +++ b/demux/demux.h @@ -47,6 +47,7 @@ struct demux_reader_state { int64_t file_cache_bytes; double seeking; // current low level seek target, or NOPTS int low_level_seeks; // number of started low level seeks + uint64_t byte_level_seeks; // number of byte stream level seeks double ts_last; // approx. timestamp of demuxer position uint64_t bytes_per_second; // low level statistics // Positions that can be seeked to without incurring the latency of a low diff --git a/player/command.c b/player/command.c index ac49157aee..ff1e10bdfe 100644 --- a/player/command.c +++ b/player/command.c @@ -1548,6 +1548,7 @@ static int mp_property_demuxer_cache_state(void *ctx, struct m_property *prop, if (s.seeking != MP_NOPTS_VALUE) node_map_add_double(r, "debug-seeking", s.seeking); node_map_add_int64(r, "debug-low-level-seeks", s.low_level_seeks); + node_map_add_int64(r, "debug-byte-level-seeks", s.byte_level_seeks); if (s.ts_last != MP_NOPTS_VALUE) node_map_add_double(r, "debug-ts-last", s.ts_last); diff --git a/player/lua/stats.lua b/player/lua/stats.lua index 8df192db2a..a1cd566ab5 100644 --- a/player/lua/stats.lua +++ b/player/lua/stats.lua @@ -674,6 +674,7 @@ local function cache_stats() append(stats, fc, {prefix = "Disk cache:"}) append(stats, info["debug-low-level-seeks"], {prefix = "Media seeks:"}) + append(stats, info["debug-byte-level-seeks"], {prefix = "Stream seeks:"}) append(stats, "", {prefix=o.nl .. o.nl .. "Ranges:", nl="", indent=""}) diff --git a/stream/stream.c b/stream/stream.c index 31a4f8fb24..7fd6700cdd 100644 --- a/stream/stream.c +++ b/stream/stream.c @@ -634,6 +634,8 @@ static bool stream_seek_unbuffered(stream_t *s, int64_t newpos) MP_VERBOSE(s, "stream level seek from %" PRId64 " to %" PRId64 "\n", s->pos, newpos); + s->total_stream_seeks++; + if (newpos > s->pos && !s->seekable) { MP_ERR(s, "Cannot seek forward in this stream\n"); return false; diff --git a/stream/stream.h b/stream/stream.h index 8b36d137a7..4a38d28109 100644 --- a/stream/stream.h +++ b/stream/stream.h @@ -144,6 +144,8 @@ typedef struct stream { // Read statistic for fill_buffer calls. All bytes read by fill_buffer() are // added to this. The user can reset this as needed. uint64_t total_unbuffered_read_bytes; + // Seek statistics. The user can reset this as needed. + uint64_t total_stream_seeks; // Buffer size requested by user; s->buffer may have a different size int requested_buffer_size; -- cgit v1.2.3