static void do_query_stats (GstStatsTracer * self, GstPad * this_pad, GstPadStats * this_pad_stats, GstPad * that_pad, GstPadStats * that_pad_stats, GstQuery * qry, GstClockTime elapsed, gboolean res, gboolean is_post) { GstElement *this_elem = get_real_pad_parent (this_pad); GstElementStats *this_elem_stats = get_element_stats (self, this_elem); GstElement *that_elem = get_real_pad_parent (that_pad); GstElementStats *that_elem_stats = get_element_stats (self, that_elem); GstStructure *s; s = gst_structure_new ("query", "thread-id", G_TYPE_UINT, GPOINTER_TO_UINT (g_thread_self ()), "ts", G_TYPE_UINT64, elapsed, "pad-ix", G_TYPE_UINT, this_pad_stats->index, "elem-ix", G_TYPE_UINT, this_elem_stats->index, "peer-pad-ix", G_TYPE_UINT, that_pad_stats->index, "peer-elem-ix", G_TYPE_UINT, that_elem_stats->index, "name", G_TYPE_STRING, GST_QUERY_TYPE_NAME (qry), "structure", GST_TYPE_STRUCTURE, gst_query_get_structure (qry), NULL); if (is_post) { gst_structure_set (s, "res", G_TYPE_BOOLEAN, res, NULL); } gst_tracer_log_trace (s); }
static void do_buffer_stats (GstStatsTracer * self, GstPad * this_pad, GstPadStats * this_pad_stats, GstPad * that_pad, GstPadStats * that_pad_stats, GstBuffer * buf, GstClockTime elapsed) { GstElement *this_elem = get_real_pad_parent (this_pad); GstElementStats *this_elem_stats = get_element_stats (self, this_elem); GstElement *that_elem = get_real_pad_parent (that_pad); GstElementStats *that_elem_stats = get_element_stats (self, that_elem); /* TODO(ensonic): need a quark-table (shared with the tracer-front-ends?) */ gst_tracer_log_trace (gst_structure_new ("buffer", "thread-id", G_TYPE_UINT, GPOINTER_TO_UINT (g_thread_self ()), "ts", G_TYPE_UINT64, elapsed, "pad-ix", G_TYPE_UINT, this_pad_stats->index, "elem-ix", G_TYPE_UINT, this_elem_stats->index, "peer-pad-ix", G_TYPE_UINT, that_pad_stats->index, "peer-elem-ix", G_TYPE_UINT, that_elem_stats->index, "buffer-size", G_TYPE_UINT, gst_buffer_get_size (buf), "buffer-pts", G_TYPE_UINT64, GST_BUFFER_PTS (buf), "buffer-dts", G_TYPE_UINT64, GST_BUFFER_DTS (buf), "buffer-duration", G_TYPE_UINT64, GST_BUFFER_DURATION (buf), "buffer-flags", GST_TYPE_BUFFER_FLAGS, GST_BUFFER_FLAGS (buf), /* scheduling-jitter: for this we need the last_ts on the pad */ NULL)); }
static void do_pull_range_post (GstTracer * self, guint64 ts, GstPad * pad) { GstElement *parent = get_real_pad_parent (pad); calculate_latency (parent, pad, ts); }
static void do_push_buffer_pre (GstTracer * self, guint64 ts, GstPad * pad) { GstElement *parent = get_real_pad_parent (pad); send_latency_probe (parent, pad, ts); }
static void do_query_stats (GstStatsTracer * self, GstPad * this_pad, GstPadStats * this_pad_stats, GstPad * that_pad, GstPadStats * that_pad_stats, GstQuery * qry, GstClockTime elapsed, gboolean have_res, gboolean res) { GstElement *this_elem = get_real_pad_parent (this_pad); GstElementStats *this_elem_stats = get_element_stats (self, this_elem); GstElement *that_elem = get_real_pad_parent (that_pad); GstElementStats *that_elem_stats = get_element_stats (self, that_elem); gst_tracer_record_log (tr_query, (guint64) (guintptr) g_thread_self (), elapsed, this_pad_stats->index, this_elem_stats->index, that_pad_stats->index, that_elem_stats->index, GST_QUERY_TYPE_NAME (qry), gst_query_get_structure (qry), have_res, res); }
static GstPadStats * get_pad_stats (GstStatsTracer * self, GstPad * pad) { GstPadStats *stats; gboolean is_new = FALSE; if (!pad) { no_pad_stats.index = G_MAXUINT; return &no_pad_stats; } G_LOCK (_pad_stats); if (!(stats = g_object_get_qdata ((GObject *) pad, data_quark))) { stats = fill_pad_stats (self, pad); g_object_set_qdata_full ((GObject *) pad, data_quark, stats, free_pad_stats); is_new = TRUE; } G_UNLOCK (_pad_stats); if (G_UNLIKELY (stats->parent_ix == G_MAXUINT)) { GstElement *elem = get_real_pad_parent (pad); if (elem) { GstElementStats *elem_stats = get_element_stats (self, elem); stats->parent_ix = elem_stats->index; } } if (G_UNLIKELY (is_new)) { log_new_pad_stats (stats, pad); } return stats; }
static void do_push_buffer_post (GstTracer * self, guint64 ts, GstPad * pad) { GstPad *peer_pad = GST_PAD_PEER (pad); GstElement *parent = get_real_pad_parent (peer_pad); calculate_latency (parent, peer_pad, ts); }
static void do_pull_range_pre (GstTracer * self, guint64 ts, GstPad * pad) { GstPad *peer_pad = GST_PAD_PEER (pad); GstElement *parent = get_real_pad_parent (peer_pad); send_latency_probe (parent, peer_pad, ts); }
static void do_buffer_stats (GstStatsTracer * self, GstPad * this_pad, GstPadStats * this_pad_stats, GstPad * that_pad, GstPadStats * that_pad_stats, GstBuffer * buf, GstClockTime elapsed) { GstElement *this_elem = get_real_pad_parent (this_pad); GstElementStats *this_elem_stats = get_element_stats (self, this_elem); GstElement *that_elem = get_real_pad_parent (that_pad); GstElementStats *that_elem_stats = get_element_stats (self, that_elem); GstClockTime pts = GST_BUFFER_PTS (buf); GstClockTime dts = GST_BUFFER_DTS (buf); GstClockTime dur = GST_BUFFER_DURATION (buf); gst_tracer_record_log (tr_buffer, (guint64) (guintptr) g_thread_self (), elapsed, this_pad_stats->index, this_elem_stats->index, that_pad_stats->index, that_elem_stats->index, gst_buffer_get_size (buf), GST_CLOCK_TIME_IS_VALID (pts), pts, GST_CLOCK_TIME_IS_VALID (dts), dts, GST_CLOCK_TIME_IS_VALID (dur), dur, GST_BUFFER_FLAGS (buf)); }
static void do_push_event_pre (GstStatsTracer * self, guint64 ts, GstPad * pad, GstEvent * ev) { GstElement *elem = get_real_pad_parent (pad); GstElementStats *elem_stats = get_element_stats (self, elem); GstPadStats *pad_stats = get_pad_stats (self, pad); elem_stats->last_ts = ts; gst_tracer_record_log (tr_event, (guint64) (guintptr) g_thread_self (), ts, pad_stats->index, elem_stats->index, GST_EVENT_TYPE_NAME (ev)); }
static void do_push_event_pre (GstStatsTracer * self, guint64 ts, GstPad * pad, GstEvent * ev) { GstElement *elem = get_real_pad_parent (pad); GstElementStats *elem_stats = get_element_stats (self, elem); GstPadStats *pad_stats = get_pad_stats (self, pad); elem_stats->last_ts = ts; gst_tracer_log_trace (gst_structure_new ("event", "thread-id", G_TYPE_UINT, GPOINTER_TO_UINT (g_thread_self ()), "ts", G_TYPE_UINT64, ts, "pad-ix", G_TYPE_UINT, pad_stats->index, "elem-ix", G_TYPE_UINT, elem_stats->index, "name", G_TYPE_STRING, GST_EVENT_TYPE_NAME (ev), NULL)); }
static void do_push_event_pre (GstTracer * self, guint64 ts, GstPad * pad, GstEvent * ev) { GstPad *peer_pad = GST_PAD_PEER (pad); GstElement *parent = get_real_pad_parent (peer_pad); if (parent && (!GST_IS_BIN (parent)) && GST_OBJECT_FLAG_IS_SET (parent, GST_ELEMENT_FLAG_SINK)) { if (GST_EVENT_TYPE (ev) == GST_EVENT_CUSTOM_DOWNSTREAM) { const GstStructure *data = gst_event_get_structure (ev); if (gst_structure_get_name_id (data) == latency_probe_id) { /* store event and calculate latency when the buffer that follows * has been processed */ g_object_set_qdata ((GObject *) peer_pad, latency_probe_id, gst_event_ref (ev)); } } } }