mpegts: Always clear packetizer on DISCONT push mode

If a discontinuity is detected in push mode, we need to clear the cached section
observations since they might have potentially changed.

This was only done properly when operating with TIME segments (dvb, udp,
adaptive demuxers, ...) but not with BYTE segments (such as with custom app/fd
sources).

We still don't want to flush out the PCR observations, since this might be
needed for seeking in push-based BYTE sources.

Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1650

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3600>
This commit is contained in:
Edward Hervey 2022-12-16 15:03:12 +01:00 committed by Tim-Philipp Müller
parent 551580482d
commit f9c2df6f9a

View file

@ -1523,16 +1523,20 @@ mpegts_base_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
return res;
mpegts_base_flush (base, FALSE);
if (base->mode == BASE_MODE_PUSHING) {
if (base->segment.format == GST_FORMAT_TIME) {
/* In the case of discontinuities in push-mode with TIME segment
* we want to drop all previous observations (hard:TRUE) from
* the packetizer */
if (base->mode == BASE_MODE_PUSHING
&& base->segment.format == GST_FORMAT_TIME) {
mpegts_packetizer_flush (base->packetizer, TRUE);
}
/* In all cases, we clear observations when we get a discontinuity in
* push-mode to re-check if the sections (PAT/PMT) changed or not */
mpegts_packetizer_clear (base->packetizer);
} else
} else {
mpegts_packetizer_flush (base->packetizer, FALSE);
}
}
mpegts_packetizer_push (base->packetizer, buf);