summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2017-10-25 15:25:25 +0200
committerwm4 <wm4@nowhere>2017-10-25 16:39:33 +0200
commit3d716515239e8486f36a0e4cf3c76870d08752e3 (patch)
tree46cb4c441baac7c3028372f8d16dc672e1f7a09d
parent56d9dafbbb1a5051a40968dec297e018d04a950f (diff)
downloadmpv-3d716515239e8486f36a0e4cf3c76870d08752e3.tar.bz2
mpv-3d716515239e8486f36a0e4cf3c76870d08752e3.tar.xz
demux: fix tracking of forward/backward cache size
Which parts of the queue are considered forward or backward cache depends on ds->reader_header. The packet at ds->reader_head, as well as all packets following it (via the ->next field) are considered forward. The fw_packs/fw_bytes/bw_bytes must be updated accordingly. This broke in demux_add_packet(), when ds->reader_head was _not_ set on the first packet (or before). This could happen since commit 05ae571241a, which can require skipping packets (so they immediately end up in the backbuffer).
-rw-r--r--demux/demux.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/demux/demux.c b/demux/demux.c
index 39828627fc..737ee68f23 100644
--- a/demux/demux.c
+++ b/demux/demux.c
@@ -619,8 +619,21 @@ void demux_add_packet(struct sh_stream *stream, demux_packet_t *dp)
dp->stream = stream->index;
dp->next = NULL;
- ds->fw_packs++;
- ds->fw_bytes += demux_packet_estimate_total_size(dp);
+ // (keep in mind that even if the reader went out of data, the queue is not
+ // necessarily empty due to the backbuffer)
+ if (!ds->reader_head && (!ds->skip_to_keyframe || dp->keyframe)) {
+ ds->reader_head = dp;
+ ds->skip_to_keyframe = false;
+ }
+
+ size_t bytes = demux_packet_estimate_total_size(dp);
+ if (ds->reader_head) {
+ ds->fw_packs++;
+ ds->fw_bytes += bytes;
+ } else {
+ ds->bw_bytes += bytes;
+ }
+
if (ds->queue_tail) {
// next packet in stream
ds->queue_tail->next = dp;
@@ -629,12 +642,6 @@ void demux_add_packet(struct sh_stream *stream, demux_packet_t *dp)
// first packet in stream
ds->queue_head = ds->queue_tail = dp;
}
- // (keep in mind that even if the reader went out of data, the queue is not
- // necessarily empty due to the backbuffer)
- if (!ds->reader_head && (!ds->skip_to_keyframe || dp->keyframe)) {
- ds->reader_head = dp;
- ds->skip_to_keyframe = false;
- }
// (In theory it'd be more efficient to make this incremental.)
if (ds->back_pts == MP_NOPTS_VALUE && dp->keyframe)