summaryrefslogtreecommitdiffstats
path: root/demux
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 /demux
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).
Diffstat (limited to 'demux')
-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)