pad-monitor: mark the peer pad as EOS too.
authorMathieu Duponchelle <mathieu.duponchelle@collabora.com>
Sun, 12 Oct 2014 14:13:51 +0000 (16:13 +0200)
committerMathieu Duponchelle <mathieu.duponchelle@opencreed.com>
Tue, 21 Oct 2014 18:13:51 +0000 (20:13 +0200)
When a sink pad gets EOS, its src pad monitor should also
be marked as EOS (helpful with issue concatenation).

validate/gst/validate/gst-validate-pad-monitor.c

index a239d7351e3896b2535c0d1413173ac899be8622..159efa8e6a0a80100c458ce558ffc11e1bd37f19 100644 (file)
@@ -121,18 +121,13 @@ typedef struct
   GstEvent *event;
 } SerializedEventData;
 
-
-static gboolean
-_find_master_report_on_pad (GstPad * pad, GstValidateReport * report)
+static GstPad *
+_get_actual_pad (GstPad *pad)
 {
-  GstValidatePadMonitor *pad_monitor;
-  GstValidateReport *prev_report;
   GstPad *tmp_pad;
-  gboolean result = FALSE;
 
   gst_object_ref (pad);
 
-
   /* We don't monitor ghost pads */
   while (GST_IS_GHOST_PAD (pad)) {
     tmp_pad = pad;
@@ -146,6 +141,18 @@ _find_master_report_on_pad (GstPad * pad, GstValidateReport * report)
     gst_object_unref (tmp_pad);
   }
 
+  return pad;
+}
+
+static gboolean
+_find_master_report_on_pad (GstPad * pad, GstValidateReport * report)
+{
+  GstValidatePadMonitor *pad_monitor;
+  GstValidateReport *prev_report;
+  gboolean result = FALSE;
+
+  pad = _get_actual_pad (pad);
+
   pad_monitor = g_object_get_data ((GObject *) pad, "validate-monitor");
 
   /* For some reason this pad isn't monitored */
@@ -1446,6 +1453,24 @@ gst_validate_pad_monitor_common_event_check (GstValidatePadMonitor *
   }
 }
 
+static void
+mark_pads_eos (GstValidatePadMonitor *pad_monitor)
+{
+  GstValidatePadMonitor *peer_monitor;
+  GstPad *peer = gst_pad_get_peer (pad_monitor->pad);
+  GstPad *real_peer;
+
+  pad_monitor->is_eos = TRUE;
+  if (peer) {
+    real_peer = _get_actual_pad (peer);
+    peer_monitor = g_object_get_data ((GObject *) real_peer, "validate-monitor");
+    if (peer_monitor)
+      peer_monitor->is_eos = TRUE;
+    gst_object_unref (peer);
+    gst_object_unref (real_peer);
+  }
+}
+
 static gboolean
 gst_validate_pad_monitor_downstream_event_check (GstValidatePadMonitor *
     pad_monitor, GstObject * parent, GstEvent * event,
@@ -1687,7 +1712,7 @@ gst_validate_pad_monitor_chain_func (GstPad * pad, GstObject * parent,
 
   pad_monitor->last_flow_return = ret;
   if (ret == GST_FLOW_EOS) {
-    pad_monitor->is_eos = ret;
+    mark_pads_eos (pad_monitor);
   }
   if (PAD_PARENT_IS_DEMUXER (pad_monitor))
     gst_validate_pad_monitor_check_aggregated_return (pad_monitor, ret);