1
0
mirror of https://github.com/mpv-player/mpv synced 2024-12-20 22:02:59 +00:00
mpv/demux
wm4 05ae571241 demux: fix cached SEEK_FORWARD seeks into end of cached regions/EOF
Although seeking past the cached range will trigger a low level seek, a
seek into the region between cache end and last video key frame would
simply seek to the video key frame. This meant that you could get
"stuck" at the end of the file instead of terminating playback when
trying to seek past the end.

One change is that we fix this by _actually_ allowing SEEK_FORWARD to
seek past the last video keyframe in find_seek_target().

In that case, or otherwise seeking to cache buffer end, it could happen
that we set ds->reader_head=NULL if the seek target is after the current
packet. We allow this, because the end of the cached region is defined
by the existence of "any" packet, not necessarily a key frame. Seeking
there still makes sense, because we know that there is going to be more
packets (or EOF) that satisfy the seek target.

The problem is that just resuming demuxing with reader_head==NULL will
simply return any packets that come its way, even non-keyframe ones.
Some decoders will produce ugly soup in this case. (In practice, this
was not a problem, because seeking at the end of the cached region was
rare before this commit, and also some decoders like h264 will skip
broken frames by default anyway.)

So the other change of this commit is to enable key frame skipping.

As a nasty implementation detail, we use a separate flag, instead of
setting reader_head to the first key frame encounted (reader_head being
NULL can happen after a normal seek or on playback start, and then we
want to mirror the underlying demuxer behavior, for better or worse).

This change is relatively untested, so you get to keep the pieces for
yourself.
2017-10-23 20:55:11 +02:00
..
codec_tags.c demux_mkv: remove incorrect comment 2017-06-03 23:23:35 +02:00
codec_tags.h
cue.c cue: accept lower-case cue commands 2017-01-24 08:57:51 +01:00
cue.h
demux_cue.c demux: get rid of DEMUXER_CTRL_GET_TIME_LENGTH 2017-06-20 14:22:10 +02:00
demux_disc.c demux_disc: fix bluray subtitle language retrieval 2017-07-16 19:02:35 +02:00
demux_edl.c demux: get rid of DEMUXER_CTRL_GET_TIME_LENGTH 2017-06-20 14:22:10 +02:00
demux_lavf.c demux: drop redundant SEEK_BACKWARD flag 2017-10-23 19:05:39 +02:00
demux_libarchive.c demux, stream: add option to prevent opening referenced files 2016-12-04 23:15:31 +01:00
demux_mf.c build: switch preliminary LGPL mode from v3 to v2.1 2017-10-05 15:57:30 +02:00
demux_mkv_timeline.c demux: get rid of DEMUXER_CTRL_GET_TIME_LENGTH 2017-06-20 14:22:10 +02:00
demux_mkv.c demux: drop redundant SEEK_BACKWARD flag 2017-10-23 19:05:39 +02:00
demux_null.c demux_null: fix segfault with --cache enabled 2016-03-05 00:56:55 +01:00
demux_playlist.c stream: get rid of streamtype enum 2017-02-02 18:26:58 +01:00
demux_rar.c demux, stream: add option to prevent opening referenced files 2016-12-04 23:15:31 +01:00
demux_raw.c demux_raw: change license to LGPL 2017-06-24 13:56:53 +02:00
demux_timeline.c demux: drop redundant SEEK_BACKWARD flag 2017-10-23 19:05:39 +02:00
demux_tv.c demux_tv.c: add missing copyright header 2017-06-21 18:13:53 +02:00
demux.c demux: fix cached SEEK_FORWARD seeks into end of cached regions/EOF 2017-10-23 20:55:11 +02:00
demux.h demux: drop redundant SEEK_BACKWARD flag 2017-10-23 19:05:39 +02:00
ebml.c ebml, matroska.h: change license to LGPL 2017-04-21 13:34:10 +02:00
ebml.h ebml, matroska.h: change license to LGPL 2017-04-21 13:34:10 +02:00
matroska.h ebml, matroska.h: change license to LGPL 2017-04-21 13:34:10 +02:00
packet.c demux: fix crash with cue/ordered chapter files 2017-10-23 11:31:45 +02:00
packet.h demux/packet: change license to LGPL 2017-04-21 13:34:10 +02:00
stheader.h demux: improvements to previous commits 2017-10-20 22:30:59 +02:00
timeline.c ytdl_hook, edl: implement pseudo-DASH support 2017-02-04 22:34:38 +01:00
timeline.h ytdl_hook, edl: implement pseudo-DASH support 2017-02-04 22:34:38 +01:00