mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-16 13:04:18 +00:00
inputselector: Only try to push the first EOS received
Subsequent EOS will push on the source pad that already received EOS and that will make the event function return FALSE. It needs only to push the first one and only return TRUE for the subsequent ones.
This commit is contained in:
parent
a0f2e9ec2a
commit
88a898080a
2 changed files with 27 additions and 13 deletions
|
@ -521,7 +521,16 @@ gst_selector_pad_event (GstPad * pad, GstObject * parent, GstEvent * event)
|
|||
GST_INPUT_SELECTOR_BROADCAST (sel);
|
||||
}
|
||||
|
||||
if (sel->eos_sent) {
|
||||
gst_event_unref (event);
|
||||
event = NULL;
|
||||
} else {
|
||||
/* prevent any further EOS event being pushed */
|
||||
sel->eos_sent = TRUE;
|
||||
}
|
||||
|
||||
selpad->eos_sent = TRUE;
|
||||
|
||||
GST_DEBUG_OBJECT (pad, "received EOS");
|
||||
break;
|
||||
case GST_EVENT_GAP:{
|
||||
|
@ -550,19 +559,21 @@ gst_selector_pad_event (GstPad * pad, GstObject * parent, GstEvent * event)
|
|||
GST_INPUT_SELECTOR_UNLOCK (sel);
|
||||
if (new_tags)
|
||||
g_object_notify (G_OBJECT (selpad), "tags");
|
||||
if (forward) {
|
||||
GST_DEBUG_OBJECT (pad, "forwarding event");
|
||||
res = gst_pad_push_event (sel->srcpad, event);
|
||||
} else {
|
||||
/* If we aren't forwarding the event because the pad is not the
|
||||
* active_sinkpad, then set the flag on the pad
|
||||
* that says a segment needs sending if/when that pad is activated.
|
||||
* For all other cases, we send the event immediately, which makes
|
||||
* sparse streams and other segment updates work correctly downstream.
|
||||
*/
|
||||
if (GST_EVENT_IS_STICKY (event))
|
||||
selpad->events_pending = TRUE;
|
||||
gst_event_unref (event);
|
||||
if (event) {
|
||||
if (forward) {
|
||||
GST_DEBUG_OBJECT (pad, "forwarding event");
|
||||
res = gst_pad_push_event (sel->srcpad, event);
|
||||
} else {
|
||||
/* If we aren't forwarding the event because the pad is not the
|
||||
* active_sinkpad, then set the flag on the pad
|
||||
* that says a segment needs sending if/when that pad is activated.
|
||||
* For all other cases, we send the event immediately, which makes
|
||||
* sparse streams and other segment updates work correctly downstream.
|
||||
*/
|
||||
if (GST_EVENT_IS_STICKY (event))
|
||||
selpad->events_pending = TRUE;
|
||||
gst_event_unref (event);
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
|
@ -1635,6 +1646,8 @@ gst_input_selector_reset (GstInputSelector * sel)
|
|||
gst_object_unref (sel->active_sinkpad);
|
||||
sel->active_sinkpad = NULL;
|
||||
}
|
||||
sel->eos_sent = FALSE;
|
||||
|
||||
/* reset each of our sinkpads state */
|
||||
for (walk = GST_ELEMENT_CAST (sel)->sinkpads; walk; walk = g_list_next (walk)) {
|
||||
GstSelectorPad *selpad = GST_SELECTOR_PAD_CAST (walk->data);
|
||||
|
|
|
@ -77,6 +77,7 @@ struct _GstInputSelector {
|
|||
GMutex lock;
|
||||
GCond cond;
|
||||
gboolean eos;
|
||||
gboolean eos_sent;
|
||||
gboolean flushing;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue