1
0
mirror of https://github.com/mpv-player/mpv synced 2025-04-01 23:00:41 +00:00
mpv/demux
wm4 976ee96e45 demux: don't loop over all packets to find forward buffered size on seek
The size of all forward buffered packets is used to control maximum
buffering.

Until now, this size was incrementally adjusted, but had to be
recomputed on seeks within the cache. Doing this was actually pretty
expensive. It iterates over a linked list of separate memory allocations
(which are probably spread all over the heap due to the allocation
behavior), and the demux_packet_estimate_total_size() call touches a lot
of further memory locations. I guess this affects the cache rather
negatively. In an unscientific test, the recompute_buffers() function
(which contained this loop) was responsible for roughly half of the time
seeking took.

Replace this with a way that computes the buffered size between 2
packets in constant times. The demux_packet.cum_pos field contains the
summed sizes of all previous packets, so subtracting cum_pos between two
packets yields the size of all packets in between. We can do this
because we never remove packets from the middle of the queue. We only
add packets to the end, or remove packets at the beginning.

The tail_cum_pos field is needed because we don't store the end position
of a packet, so the last packet's position would be unknown. We could
recompute the "estimated" packet size, or store the estimated size in
the packet struct, but I just didn't like this.

This also removes the cached fw_bytes fields. It's slightly nicer to
just recompute them when needed. Maintaining them incrementally was
annoying. total_size stays though, since recomputing it isn't that cheap
(would need to loop over all ranges every time).

I'm always using uint64_t for sizes. This is certainly needed (a stream
could easily burn through more than 4GB of data, even if much less of
that is cached). The actual cached amount should always fit into size_t,
so it's casted to size_t for printfs (yes, I hate the way you specify
stdint.h types in printfs, the less I have to use that crap, the
better).
2019-09-19 20:37:05 +02:00
..
codec_tags.c codec_tags: fix wrong buffer size 2019-07-03 17:47:24 +03:00
codec_tags.h Relicense some non-MPlayer source files to LGPL 2.1 or later 2016-01-19 18:36:06 +01:00
cue.c demux: support cue sheets longer than 100 minutes 2019-04-01 23:39:08 +02:00
cue.h Relicense some non-MPlayer source files to LGPL 2.1 or later 2016-01-19 18:36:06 +01:00
demux_cue.c demux_edl, cue, mkv: slightly nicer file format indication 2019-09-19 20:37:04 +02:00
demux_edl.c demux_edl: fix assertion failure on exit in obscure ytdl cases 2019-09-19 20:37:04 +02:00
demux_lavf.c demux_lavf: implement bad hack for backward playback of wav 2019-09-19 20:37:04 +02:00
demux_libarchive.c demux: change hack for closing subtitle files early 2019-09-19 20:37:04 +02:00
demux_mf.c demux: return packets directly from demuxer instead of using sh_stream 2019-09-19 20:37:04 +02:00
demux_mkv_timeline.c demux_edl, cue, mkv: slightly nicer file format indication 2019-09-19 20:37:04 +02:00
demux_mkv.c demux_mkv: don't set keyframe flag for timestamp-less audio frames 2019-09-19 20:37:05 +02:00
demux_null.c demux_null: mark as seekable 2018-01-06 14:42:22 -08:00
demux_playlist.c demux: change hack for closing subtitle files early 2019-09-19 20:37:04 +02:00
demux_raw.c demux_raw: fix operation with demuxer cache and backward playback 2019-09-19 20:37:04 +02:00
demux_timeline.c demux_timeline: add heuristic to fix shifted seeks with separate audio 2019-09-19 20:37:04 +02:00
demux.c demux: don't loop over all packets to find forward buffered size on seek 2019-09-19 20:37:05 +02:00
demux.h Implement backwards playback 2019-09-19 20:37:04 +02:00
ebml.c demux_mkv: adjust log verbosity levels 2018-04-29 02:21:32 +03:00
ebml.h demux_mkv: rewrite packet reading to avoid 1 memcpy() 2017-11-05 18:13:34 +01:00
matroska.h ebml, matroska.h: change license to LGPL 2017-04-21 13:34:10 +02:00
packet.c Implement backwards playback 2019-09-19 20:37:04 +02:00
packet.h demux: don't loop over all packets to find forward buffered size on seek 2019-09-19 20:37:05 +02:00
stheader.h demux, demux_mkv: fix seeking in cache with large codec delay 2019-09-19 20:37:04 +02:00
timeline.c demux_edl, cue, mkv: slightly nicer file format indication 2019-09-19 20:37:04 +02:00
timeline.h demux_edl, cue, mkv: slightly nicer file format indication 2019-09-19 20:37:04 +02:00