From c95cc6a015e1880dd3d74abcffc1b2c346e8f423 Mon Sep 17 00:00:00 2001 From: Vivia Nikolaidou Date: Mon, 10 Aug 2020 20:20:53 +0300 Subject: [PATCH] flvmux: Return NEED_DATA when we drop a buffer When we are dropping a buffer in find_best_pad (e.g. waiting for a keyframe, or skipping backwards timestamp), return GST_AGGREGATOR_FLOW_NEED_DATA to make sure we have enough data at the next run. Otherwise, a stream that accidentally fell behind (e.g. relinking race, or just waiting for a keyframe) will never get the opportunity to catch up to the other one, because the other one will always keep advancing. Part-of: --- gst/flv/gstflvmux.c | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/gst/flv/gstflvmux.c b/gst/flv/gstflvmux.c index 564f935..71ecd7a 100644 --- a/gst/flv/gstflvmux.c +++ b/gst/flv/gstflvmux.c @@ -1850,7 +1850,8 @@ gst_flv_mux_rewrite_header (GstFlvMux * mux) /* Returns NULL, or a reference to the pad with the * buffer with lowest running time */ static GstFlvMuxPad * -gst_flv_mux_find_best_pad (GstAggregator * aggregator, GstClockTime * ts) +gst_flv_mux_find_best_pad (GstAggregator * aggregator, GstClockTime * ts, + gboolean timeout) { GstFlvMuxPad *best = NULL; GstBuffer *buffer; @@ -1871,8 +1872,16 @@ gst_flv_mux_find_best_pad (GstAggregator * aggregator, GstClockTime * ts) gint64 t = GST_CLOCK_TIME_NONE; buffer = gst_aggregator_pad_peek_buffer (apad); - if (!buffer) - continue; + if (!buffer) { + if (timeout || GST_PAD_IS_EOS (apad)) { + continue; + } else { + if (best) + gst_object_replace ((GstObject **) & best, NULL); + best_ts = GST_CLOCK_TIME_NONE; + break; + } + } if (fpad->drop_deltas) { if (mux->skip_backwards_streams @@ -1881,7 +1890,14 @@ gst_flv_mux_find_best_pad (GstAggregator * aggregator, GstClockTime * ts) "Dropped buffer %" GST_PTR_FORMAT " until keyframe", buffer); gst_buffer_unref (buffer); gst_aggregator_pad_drop_buffer (apad); - continue; + if (timeout) { + continue; + } else { + if (best) + gst_object_replace ((GstObject **) & best, NULL); + best_ts = GST_CLOCK_TIME_NONE; + break; + } } else { /* drop-deltas is set and the buffer isn't delta, drop flag */ fpad->drop_deltas = FALSE; @@ -1902,7 +1918,14 @@ gst_flv_mux_find_best_pad (GstAggregator * aggregator, GstClockTime * ts) gst_aggregator_pad_drop_buffer (apad); /* Look for non-delta buffer */ fpad->drop_deltas = TRUE; - continue; + if (timeout) { + continue; + } else { + if (best) + gst_object_replace ((GstObject **) & best, NULL); + best_ts = GST_CLOCK_TIME_NONE; + break; + } } } @@ -1958,7 +1981,7 @@ gst_flv_mux_aggregate (GstAggregator * aggregator, gboolean timeout) return GST_FLOW_ERROR; } - best = gst_flv_mux_find_best_pad (aggregator, &ts); + best = gst_flv_mux_find_best_pad (aggregator, &ts, timeout); if (!best) { if (!gst_flv_mux_are_all_pads_eos (mux)) return GST_AGGREGATOR_FLOW_NEED_DATA; @@ -1981,7 +2004,7 @@ gst_flv_mux_aggregate (GstAggregator * aggregator, gboolean timeout) mux->first_timestamp = 0; } } else { - best = gst_flv_mux_find_best_pad (aggregator, &ts); + best = gst_flv_mux_find_best_pad (aggregator, &ts, timeout); } if (mux->new_tags && mux->streamable) { -- 2.7.4