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:{
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;
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);