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: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7500>
This commit is contained in:
Sebastian Dröge 2024-09-11 08:40:42 +03:00 committed by GStreamer Marge Bot
parent 256a941d3a
commit cd5d03811d

View file

@ -2453,7 +2453,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;
@ -2467,8 +2467,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);
@ -2522,7 +2528,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 */