mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-01 22:21:13 +00:00
5fd3c8a16c
Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/2771 This EOS branch exists so that if a seek with a stop is made, qtdemux stops accepting bytes from the sink after the entire requested playback range is demuxed, as otherwise we could keep download content that is not being used. This patch fixes two flaws that were present in that EOS check: 1) A comparison was made between track time and movie time without conversion. This made the check trigger early in files with edit lists. This patch fixes this by converting the track PTS to movie PTS (stream time) for the check. 2) To avoid sending a EOS prematurely when the segment stop is within a GOP and B-frames are present, the check for EOS should only be done for keyframes. I gather this was already the intention with the existing code, but because it used `stream->on_keyframe` instead of the local variable `keyframe` the old code was checking if the *previous* frame was a keyframe. It's interesting to note that these two flaws in the old code mask each other in most cases: the track PTS will have reached the movie end PTS, but EOS would only be sent if the previous frame was a keyframe. A simple case where they wouldn't mask each other, reproducing the bug, is a sequence of 3 frame GOPs with structure I-B-P. The following validateflow tests have been added to future-proof the fix: * validate.test.mp4.qtdemux_ibpibp_non_frag_pull.default * validate.test.mp4.qtdemux_ibpibp_non_frag_push.default Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5021> |
||
---|---|---|
.. | ||
appsrc | ||
aspectcropratio | ||
baseparse | ||
clock_sync | ||
dash | ||
decryptor | ||
flow | ||
flvdemux | ||
h264 | ||
h265parse | ||
interlace | ||
matroska | ||
mp4 | ||
mse | ||
nle | ||
playbin | ||
playbin3 | ||
rtp | ||
scaletempo | ||
uridecodebin |