From f18186b5dced46a53a103a3f34fa65252e6e48b8 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Fri, 16 Dec 2022 15:03:12 +0100 Subject: [PATCH] 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: --- .../gst/mpegtsdemux/mpegtsbase.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/subprojects/gst-plugins-bad/gst/mpegtsdemux/mpegtsbase.c b/subprojects/gst-plugins-bad/gst/mpegtsdemux/mpegtsbase.c index d18475b3a0..f866c3176d 100644 --- a/subprojects/gst-plugins-bad/gst/mpegtsdemux/mpegtsbase.c +++ b/subprojects/gst-plugins-bad/gst/mpegtsdemux/mpegtsbase.c @@ -1518,15 +1518,19 @@ mpegts_base_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) return res; mpegts_base_flush (base, FALSE); - /* 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); + 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 */ + 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);