- if (parent && (!GST_IS_BIN (parent)) &&
- GST_OBJECT_FLAG_IS_SET (parent, GST_ELEMENT_FLAG_SOURCE)) {
- GstEvent *latency_probe = gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM,
- gst_structure_new_id (latency_probe_id,
- latency_probe_pad, GST_TYPE_PAD, pad,
- latency_probe_ts, G_TYPE_UINT64, ts,
- NULL));
- gst_pad_push_event (pad, latency_probe);
+ guint64 src_ts;
+ const gchar *element_name;
+ const GValue *value;
+
+ element_name = GST_ELEMENT_NAME (element);
+
+ /* TODO filtering */
+
+ value = gst_structure_id_get_value (data, latency_probe_ts);
+ src_ts = g_value_get_uint64 (value);
+
+ gst_tracer_record_log (tr_element_latency, element_name,
+ GST_CLOCK_DIFF (src_ts, sink_ts), sink_ts);
+}
+
+static void
+send_latency_probe (GstLatencyTracer * self, GstElement * parent, GstPad * pad,
+ guint64 ts)
+{
+ GstPad *peer_pad = GST_PAD_PEER (pad);
+
+ /* allow for non-parented pads to send latency probes as used in e.g.
+ * rtspsrc for TCP connections */
+ if (peer_pad && (!parent || (!GST_IS_BIN (parent)))) {
+ gchar *pad_name;
+ GstEvent *latency_probe;
+
+ if (self->flags & GST_LATENCY_TRACER_FLAG_PIPELINE &&
+ GST_OBJECT_FLAG_IS_SET (parent, GST_ELEMENT_FLAG_SOURCE)) {
+ pad_name = g_strdup_printf ("%s_%s", GST_DEBUG_PAD_NAME (pad));
+
+ GST_DEBUG ("%s: Sending latency event", pad_name);
+
+ latency_probe = gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM,
+ gst_structure_new_id (latency_probe_id,
+ latency_probe_pad, G_TYPE_STRING, pad_name,
+ latency_probe_ts, G_TYPE_UINT64, ts, NULL));
+ g_free (pad_name);
+ gst_pad_push_event (pad, latency_probe);
+ }
+
+ if (self->flags & GST_LATENCY_TRACER_FLAG_ELEMENT) {
+ GST_DEBUG ("%s_%s: Sending sub-latency event", GST_DEBUG_PAD_NAME (pad));
+
+ pad_name = g_strdup_printf ("%s_%s", GST_DEBUG_PAD_NAME (peer_pad));
+ latency_probe = gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM,
+ gst_structure_new_id (sub_latency_probe_id,
+ latency_probe_pad, G_TYPE_STRING, pad_name,
+ latency_probe_ts, G_TYPE_UINT64, ts, NULL));
+ gst_pad_push_event (pad, latency_probe);
+ g_free (pad_name);
+ }