From 3d716515239e8486f36a0e4cf3c76870d08752e3 Mon Sep 17 00:00:00 2001 From: wm4 Date: Wed, 25 Oct 2017 15:25:25 +0200 Subject: 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). --- demux/demux.c | 23 +++++++++++++++-------- 1 file 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) -- cgit v1.2.3