stats->index = self->num_elements++;
stats->parent_ix = G_MAXUINT;
+ return stats;
+}
+static void
+log_new_element_stats (GstElementStats * stats, GstElement * element)
+{
log_trace (gst_structure_new ("new-element",
"ix", G_TYPE_UINT, stats->index,
+ "parent-ix", G_TYPE_UINT, stats->parent_ix,
"name", G_TYPE_STRING, GST_OBJECT_NAME (element),
"type", G_TYPE_STRING, G_OBJECT_TYPE_NAME (element),
"is-bin", G_TYPE_BOOLEAN, GST_IS_BIN (element), NULL));
-
- return stats;
}
static inline GstElementStats *
get_element_stats (GstStatsTracer * self, GstElement * element)
{
GstElementStats *stats;
+ gboolean is_new = FALSE;
if (!element) {
no_elem_stats.index = G_MAXUINT;
if (self->elements->len <= stats->index)
g_ptr_array_set_size (self->elements, stats->index + 1);
g_ptr_array_index (self->elements, stats->index) = stats;
+ is_new = TRUE;
}
G_UNLOCK (_stats);
if (G_UNLIKELY (stats->parent_ix == G_MAXUINT)) {
stats->parent_ix = parent_stats->index;
}
}
+ if (G_UNLIKELY (is_new)) {
+ log_new_element_stats (stats, element);
+ }
return stats;
}
g_slice_free (GstElementStats, data);
}
-static GstPadStats no_pad_stats = { 0, };
-
-static GstPadStats *
-fill_pad_stats (GstStatsTracer * self, GstPad * pad)
-{
- GstPadStats *stats = g_slice_new0 (GstPadStats);
-
- stats->index = self->num_pads++;
- stats->parent_ix = G_MAXUINT;
-
- log_trace (gst_structure_new ("new-pad",
- "ix", G_TYPE_UINT, stats->index,
- "name", G_TYPE_STRING, GST_OBJECT_NAME (pad),
- "type", G_TYPE_STRING, G_OBJECT_TYPE_NAME (pad),
- "is-ghostpad", G_TYPE_BOOLEAN, GST_IS_GHOST_PAD (pad),
- "pad-direction", GST_TYPE_PAD_DIRECTION, GST_PAD_DIRECTION (pad),
- "thread-id", G_TYPE_UINT, GPOINTER_TO_UINT (g_thread_self ()), NULL));
-
- return stats;
-}
-
/*
* Get the element/bin owning the pad.
*
return GST_ELEMENT_CAST (parent);
}
+static GstPadStats no_pad_stats = { 0, };
+
+static GstPadStats *
+fill_pad_stats (GstStatsTracer * self, GstPad * pad)
+{
+ GstPadStats *stats = g_slice_new0 (GstPadStats);
+
+ stats->index = self->num_pads++;
+ stats->parent_ix = G_MAXUINT;
+
+ return stats;
+}
+
+static void
+log_new_pad_stats (GstPadStats * stats, GstPad * pad)
+{
+ log_trace (gst_structure_new ("new-pad",
+ "ix", G_TYPE_UINT, stats->index,
+ "parent-ix", G_TYPE_UINT, stats->parent_ix,
+ "name", G_TYPE_STRING, GST_OBJECT_NAME (pad),
+ "type", G_TYPE_STRING, G_OBJECT_TYPE_NAME (pad),
+ "is-ghostpad", G_TYPE_BOOLEAN, GST_IS_GHOST_PAD (pad),
+ "pad-direction", GST_TYPE_PAD_DIRECTION, GST_PAD_DIRECTION (pad),
+ "thread-id", G_TYPE_UINT, GPOINTER_TO_UINT (g_thread_self ()), NULL));
+}
+
static GstPadStats *
get_pad_stats (GstStatsTracer * self, GstPad * pad)
{
GstPadStats *stats;
+ gboolean is_new = FALSE;
if (!pad) {
no_pad_stats.index = G_MAXUINT;
if (self->pads->len <= stats->index)
g_ptr_array_set_size (self->pads, stats->index + 1);
g_ptr_array_index (self->pads, stats->index) = stats;
+ is_new = TRUE;
}
G_UNLOCK (_stats);
if (G_UNLIKELY (stats->parent_ix == G_MAXUINT)) {
stats->parent_ix = elem_stats->index;
}
}
+ if (G_UNLIKELY (is_new)) {
+ log_new_pad_stats (stats, pad);
+ }
return stats;
}
{
guint64 ts = va_arg (var_args, guint64);
GstPad *pad = va_arg (var_args, GstPad *);
+ GstEvent *ev = va_arg (var_args, GstEvent *);
GstElement *elem = get_real_pad_parent (pad);
- GstPadStats *pad_stats = get_pad_stats (self, pad);
GstElementStats *elem_stats = get_element_stats (self, elem);
+ GstPadStats *pad_stats = get_pad_stats (self, pad);
elem_stats->last_ts = ts;
log_trace (gst_structure_new ("event",
"ts", G_TYPE_UINT64, ts,
"pad-ix", G_TYPE_UINT, pad_stats->index,
- "elem-ix", G_TYPE_UINT, elem_stats->index, NULL));
+ "elem-ix", G_TYPE_UINT, elem_stats->index,
+ "name", G_TYPE_STRING, GST_EVENT_TYPE_NAME (ev), NULL));
}
static void
{
guint64 ts = va_arg (var_args, guint64);
GstElement *elem = va_arg (var_args, GstElement *);
+ GstMessage *msg = va_arg (var_args, GstMessage *);
GstElementStats *stats = get_element_stats (self, elem);
stats->last_ts = ts;
log_trace (gst_structure_new ("message",
- "ts", G_TYPE_UINT64, ts, "elem-ix", G_TYPE_UINT, stats->index, NULL));
+ "ts", G_TYPE_UINT64, ts,
+ "elem-ix", G_TYPE_UINT, stats->index,
+ "name", G_TYPE_STRING, GST_MESSAGE_TYPE_NAME (msg), NULL));
}
static void
{
guint64 ts = va_arg (var_args, guint64);
GstElement *elem = va_arg (var_args, GstElement *);
+ GstQuery *qry = va_arg (var_args, GstQuery *);
GstElementStats *stats = get_element_stats (self, elem);
stats->last_ts = ts;
log_trace (gst_structure_new ("query",
- "ts", G_TYPE_UINT64, ts, "elem-ix", G_TYPE_UINT, stats->index, NULL));
+ "ts", G_TYPE_UINT64, ts,
+ "elem-ix", G_TYPE_UINT, stats->index,
+ "name", G_TYPE_STRING, GST_QUERY_TYPE_NAME (qry), NULL));
}
static void
new_pad_stats (GstStructure * s)
{
GstPadStats *stats;
- guint ix;
+ guint ix, parent_ix;
gchar *type, *name;
gboolean is_ghost_pad;
GstPadDirection dir;
gst_structure_get (s,
"ix", G_TYPE_UINT, &ix,
+ "parent-ix", G_TYPE_UINT, &parent_ix,
"name", G_TYPE_STRING, &name,
"type", G_TYPE_STRING, &type,
"is-ghostpad", G_TYPE_BOOLEAN, &is_ghost_pad,
stats->min_size = G_MAXUINT;
stats->first_ts = stats->last_ts = stats->next_ts = GST_CLOCK_TIME_NONE;
stats->thread_id = thread_id;
+ stats->parent_ix = parent_ix;
if (pads->len <= ix)
g_ptr_array_set_size (pads, ix + 1);
new_element_stats (GstStructure * s)
{
GstElementStats *stats;
- guint ix;
+ guint ix, parent_ix;
gchar *type, *name;
gboolean is_bin;
gst_structure_get (s,
"ix", G_TYPE_UINT, &ix,
+ "parent-ix", G_TYPE_UINT, &parent_ix,
"name", G_TYPE_STRING, &name,
"type", G_TYPE_STRING, &type, "is-bin", G_TYPE_BOOLEAN, &is_bin, NULL);
stats->type_name = type;
stats->is_bin = is_bin;
stats->first_ts = GST_CLOCK_TIME_NONE;
- stats->parent_ix = G_MAXUINT;
+ stats->parent_ix = parent_ix;
if (elements->len <= ix)
g_ptr_array_set_size (elements, ix + 1);
return;
}
if (!(elem_stats = get_element_stats (elem_ix))) {
- GST_WARNING ("no element stats found for ix=%u", elem_ix);
+ // e.g. reconfigure events are send over unparented pads
+ GST_INFO ("no element stats found for ix=%u", elem_ix);
return;
}
elem_stats->num_events++;