Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/GStreamer/gst-plugins-good.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/gst
diff options
context:
space:
mode:
authorVivia Nikolaidou <vivia@ahiru.eu>2020-08-10 20:20:53 +0300
committerVivia Nikolaidou <vivia@ahiru.eu>2020-08-10 20:36:51 +0300
commitc95cc6a015e1880dd3d74abcffc1b2c346e8f423 (patch)
treebda092ba22596c43f35931ee9bc3e294c7a70287 /gst
parent75f6ca8a11684757a4751edeae1964b24c9cbb6b (diff)
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: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/696>
Diffstat (limited to 'gst')
-rw-r--r--gst/flv/gstflvmux.c37
1 files changed, 30 insertions, 7 deletions
diff --git a/gst/flv/gstflvmux.c b/gst/flv/gstflvmux.c
index 564f9353e..71ecd7aeb 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) {