From 7c7ac2d84f8be60be3692e3cac2ddb6e1e889bd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 11 Sep 2024 08:40:42 +0300 Subject: [PATCH] mpegtsmux: Wait for data on all pads before deciding on a best pad unless timing out This makes sure that if upstream has different latencies that we're still outputting buffers with increasining timestamps across the different streams unless buffers are arriving after the latency deadline. Part-of: --- .../gst-plugins-bad/gst/mpegtsmux/gstbasetsmux.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/subprojects/gst-plugins-bad/gst/mpegtsmux/gstbasetsmux.c b/subprojects/gst-plugins-bad/gst/mpegtsmux/gstbasetsmux.c index 7e0b981cee..4d5fedeeee 100644 --- a/subprojects/gst-plugins-bad/gst/mpegtsmux/gstbasetsmux.c +++ b/subprojects/gst-plugins-bad/gst/mpegtsmux/gstbasetsmux.c @@ -2449,7 +2449,7 @@ beach: } static GstBaseTsMuxPad * -gst_base_ts_mux_find_best_pad (GstAggregator * aggregator) +gst_base_ts_mux_find_best_pad (GstAggregator * aggregator, gboolean timeout) { GstBaseTsMuxPad *best = NULL; GstClockTime best_ts = GST_CLOCK_TIME_NONE; @@ -2463,8 +2463,14 @@ gst_base_ts_mux_find_best_pad (GstAggregator * aggregator) GstBuffer *buffer; buffer = gst_aggregator_pad_peek_buffer (apad); - if (!buffer) + if (!buffer) { + if (!timeout && !GST_PAD_IS_EOS (apad)) { + gst_object_replace ((GstObject **) & best, NULL); + best_ts = GST_CLOCK_TIME_NONE; + break; + } continue; + } if (best_ts == GST_CLOCK_TIME_NONE) { best = tpad; best_ts = GST_BUFFER_DTS_OR_PTS (buffer); @@ -2518,7 +2524,7 @@ gst_base_ts_mux_aggregate (GstAggregator * agg, gboolean timeout) { GstBaseTsMux *mux = GST_BASE_TS_MUX (agg); GstFlowReturn ret = GST_FLOW_OK; - GstBaseTsMuxPad *best = gst_base_ts_mux_find_best_pad (agg); + GstBaseTsMuxPad *best = gst_base_ts_mux_find_best_pad (agg, timeout); GstCaps *caps; /* set caps on the srcpad if no caps were set yet */