From: Stefan Sauer Date: Mon, 15 Sep 2014 11:15:17 +0000 (+0200) Subject: tracer: simplify hook api X-Git-Tag: 1.10.4~709 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1a3e218b894695c23f538c9552b5bee27a01b101;p=platform%2Fupstream%2Fgstreamer.git tracer: simplify hook api Instead of a single invoke() function and a 'mask', register to individual hooks. This avoids one level of indirection and allows us to remove the hook enums. The message enms are now renamed to hook enums. --- diff --git a/gst/gsttracer.c b/gst/gsttracer.c index fd95ba2..0d783a0 100644 --- a/gst/gsttracer.c +++ b/gst/gsttracer.c @@ -45,7 +45,6 @@ enum { PROP_0, PROP_PARAMS, - PROP_MASK, PROP_LAST }; @@ -59,7 +58,6 @@ static void gst_tracer_get_property (GObject * object, guint prop_id, struct _GstTracerPrivate { const gchar *params; - GstTracerHook mask; }; #define gst_tracer_parent_class parent_class @@ -77,10 +75,6 @@ gst_tracer_class_init (GstTracerClass * klass) g_param_spec_string ("params", "Params", "Extra configuration parameters", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS); - properties[PROP_MASK] = - g_param_spec_flags ("mask", "Mask", "Event mask", GST_TYPE_TRACER_HOOK, - GST_TRACER_HOOK_NONE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); - g_object_class_install_properties (gobject_class, PROP_LAST, properties); g_type_class_add_private (klass, sizeof (GstTracerPrivate)); } @@ -102,9 +96,6 @@ gst_tracer_set_property (GObject * object, guint prop_id, case PROP_PARAMS: self->priv->params = g_value_get_string (value); break; - case PROP_MASK: - self->priv->mask = g_value_get_flags (value); - break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -121,25 +112,12 @@ gst_tracer_get_property (GObject * object, guint prop_id, case PROP_PARAMS: g_value_set_string (value, self->priv->params); break; - case PROP_MASK: - g_value_set_flags (value, self->priv->mask); - break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } -void -gst_tracer_invoke (GstTracer * self, GstTracerMessageId mid, va_list var_args) -{ - GstTracerClass *klass = GST_TRACER_GET_CLASS (self); - - g_return_if_fail (klass->invoke); - - klass->invoke (self, mid, var_args); -} - /* tracing modules */ gboolean diff --git a/gst/gsttracer.h b/gst/gsttracer.h index 6c96a0f..3b5b580 100644 --- a/gst/gsttracer.h +++ b/gst/gsttracer.h @@ -53,24 +53,20 @@ struct _GstTracer { gpointer _gst_reserved[GST_PADDING]; }; -typedef void (*GstTracerInvokeFunction) (GstTracer * self, - GstTracerMessageId mid, va_list var_args); +typedef void (*GstTracerHookFunction) (GstTracer * self, va_list var_args); struct _GstTracerClass { GstObjectClass parent_class; - - /* plugin vmethods */ - GstTracerInvokeFunction invoke; - + /*< private >*/ gpointer _gst_reserved[GST_PADDING]; }; -void gst_tracer_invoke (GstTracer * self, GstTracerMessageId mid, - va_list var_args); - GType gst_tracer_get_type (void); +void gst_tracer_register_hook (GstTracer *tracer, GstTracerHookId id, + GstTracerHookFunction func); + G_END_DECLS #endif /* __GST_TRACER_H__ */ diff --git a/gst/gsttracerutils.c b/gst/gsttracerutils.c index 33678c2..ecd6b03 100644 --- a/gst/gsttracerutils.c +++ b/gst/gsttracerutils.c @@ -45,6 +45,12 @@ gboolean _priv_tracer_enabled = FALSE; /* TODO(ensonic): use array of GPtrArray* ? */ GList *_priv_tracers[GST_TRACER_HOOK_ID_LAST] = { NULL, }; +typedef struct +{ + GstTracer *tracer; + GstTracerHookFunction func; +} GstTracerHook; + /* Initialize the tracing system */ void _priv_gst_tracer_init (void) @@ -55,10 +61,8 @@ _priv_gst_tracer_init (void) GstRegistry *registry = gst_registry_get (); GstPluginFeature *feature; GstTracerFactory *factory; - GstTracerHook mask; - GstObject *tracer; gchar **t = g_strsplit_set (env, ";", 0); - gint i = 0, j; + gint i = 0; gchar *params; GST_INFO ("enabling tracers: '%s'", env); @@ -83,28 +87,9 @@ _priv_gst_tracer_init (void) GST_INFO_OBJECT (factory, "creating tracer: type-id=%u", (guint) factory->type); - tracer = g_object_new (factory->type, "params", params, NULL); - g_object_get (tracer, "mask", &mask, NULL); - - if (mask) { - /* add to lists according to mask */ - j = 0; - while (mask && (j < GST_TRACER_HOOK_ID_LAST)) { - if (mask & 1) { - _priv_tracers[j] = g_list_prepend (_priv_tracers[j], - gst_object_ref (tracer)); - GST_WARNING_OBJECT (tracer, "added tracer to hook %d", j); - } - mask >>= 1; - j++; - } - - _priv_tracer_enabled = TRUE; - } else { - GST_WARNING_OBJECT (tracer, - "tracer with zero mask won't have any effect"); - } - gst_object_unref (tracer); + /* tracers register them self to the hooks */ + gst_object_unref (g_object_new (factory->type, "params", params, + NULL)); } else { GST_WARNING_OBJECT (feature, "loading plugin containing feature %s failed!", t[i]); @@ -123,11 +108,14 @@ _priv_gst_tracer_deinit (void) { gint i; GList *node; + GstTracerHook *hook; /* shutdown tracers for final reports */ for (i = 0; i < GST_TRACER_HOOK_ID_LAST; i++) { for (node = _priv_tracers[i]; node; node = g_list_next (node)) { - gst_object_unref (node->data); + hook = (GstTracerHook *) node->data; + gst_object_unref (hook->tracer); + g_slice_free (GstTracerHook, hook); } g_list_free (_priv_tracers[i]); _priv_tracers[i] = NULL; @@ -136,14 +124,28 @@ _priv_gst_tracer_deinit (void) } void -gst_tracer_dispatch (GstTracerHookId hid, GstTracerMessageId mid, ...) +gst_tracer_register_hook (GstTracer * tracer, GstTracerHookId id, + GstTracerHookFunction func) +{ + GstTracerHook *hook = g_slice_new0 (GstTracerHook); + hook->tracer = gst_object_ref (tracer); + hook->func = func; + _priv_tracers[id] = g_list_prepend (_priv_tracers[id], hook); + GST_DEBUG_OBJECT (tracer, "added tracer to hook %d", id); + _priv_tracer_enabled = TRUE; +} + +void +gst_tracer_dispatch (GstTracerHookId id, ...) { va_list var_args; GList *node; + GstTracerHook *hook; - for (node = _priv_tracers[hid]; node; node = g_list_next (node)) { - va_start (var_args, mid); - gst_tracer_invoke (node->data, mid, var_args); + for (node = _priv_tracers[id]; node; node = g_list_next (node)) { + hook = (GstTracerHook *) node->data; + va_start (var_args, id); + hook->func (hook->tracer, var_args); va_end (var_args); } } diff --git a/gst/gsttracerutils.h b/gst/gsttracerutils.h index c3bd5f3..77fa2ab 100644 --- a/gst/gsttracerutils.h +++ b/gst/gsttracerutils.h @@ -32,52 +32,25 @@ G_BEGIN_DECLS #ifndef GST_DISABLE_GST_DEBUG -/* hook flags and ids */ +/* tracer hook message ids */ typedef enum { - GST_TRACER_HOOK_NONE = 0, - GST_TRACER_HOOK_BUFFERS = (1 << 0), - GST_TRACER_HOOK_EVENTS = (1 << 1), - GST_TRACER_HOOK_MESSAGES = (1 << 2), - GST_TRACER_HOOK_QUERIES = (1 << 3), - GST_TRACER_HOOK_TOPOLOGY = (1 << 4), - /* - GST_TRACER_HOOK_TIMER - */ - GST_TRACER_HOOK_ALL = (1 << 5) - 1 -} GstTracerHook; - -typedef enum -{ - GST_TRACER_HOOK_ID_BUFFERS = 0, - GST_TRACER_HOOK_ID_EVENTS, - GST_TRACER_HOOK_ID_MESSAGES, - GST_TRACER_HOOK_ID_QUERIES, - GST_TRACER_HOOK_ID_TOPLOGY, - /* - GST_TRACER_HOOK_ID_TIMER - */ + GST_TRACER_HOOK_ID_PAD_PUSH_PRE = 0, + GST_TRACER_HOOK_ID_PAD_PUSH_POST, + GST_TRACER_HOOK_ID_PAD_PUSH_LIST_PRE, + GST_TRACER_HOOK_ID_PAD_PUSH_LIST_POST, + GST_TRACER_HOOK_ID_PAD_PULL_RANGE_PRE, + GST_TRACER_HOOK_ID_PAD_PULL_RANGE_POST, + GST_TRACER_HOOK_ID_PAD_PUSH_EVENT_PRE, + GST_TRACER_HOOK_ID_PAD_PUSH_EVENT_POST, + GST_TRACER_HOOK_ID_ELEMENT_POST_MESSAGE_PRE, + GST_TRACER_HOOK_ID_ELEMENT_POST_MESSAGE_POST, + GST_TRACER_HOOK_ID_ELEMENT_QUERY_PRE, + GST_TRACER_HOOK_ID_ELEMENT_QUERY_POST, GST_TRACER_HOOK_ID_LAST } GstTracerHookId; -typedef enum -{ - GST_TRACER_MESSAGE_ID_PAD_PUSH_PRE = 0, - GST_TRACER_MESSAGE_ID_PAD_PUSH_POST, - GST_TRACER_MESSAGE_ID_PAD_PUSH_LIST_PRE, - GST_TRACER_MESSAGE_ID_PAD_PUSH_LIST_POST, - GST_TRACER_MESSAGE_ID_PAD_PULL_RANGE_PRE, - GST_TRACER_MESSAGE_ID_PAD_PULL_RANGE_POST, - GST_TRACER_MESSAGE_ID_PAD_PUSH_EVENT_PRE, - GST_TRACER_MESSAGE_ID_PAD_PUSH_EVENT_POST, - GST_TRACER_MESSAGE_ID_ELEMENT_POST_MESSAGE_PRE, - GST_TRACER_MESSAGE_ID_ELEMENT_POST_MESSAGE_POST, - GST_TRACER_MESSAGE_ID_ELEMENT_QUERY_PRE, - GST_TRACER_MESSAGE_ID_ELEMENT_QUERY_POST, - GST_TRACER_MESSAGE_ID_LAST -} GstTracerMessageId; - /* tracing hooks */ void _priv_gst_tracer_init (void); @@ -89,7 +62,7 @@ gboolean gst_tracer_register (GstPlugin * plugin, const gchar * name, GType type /* tracing helpers */ -void gst_tracer_dispatch (GstTracerHookId hid, GstTracerMessageId mid, ...); +void gst_tracer_dispatch (GstTracerHookId id, ...); /* tracing module helpers */ @@ -107,97 +80,97 @@ extern GList *_priv_tracers[GST_TRACER_HOOK_ID_LAST]; /* tracing hooks */ #define GST_TRACER_PAD_PUSH_PRE(pad, buffer) G_STMT_START{ \ - if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_BUFFERS)) { \ - gst_tracer_dispatch (GST_TRACER_HOOK_ID_BUFFERS, \ - GST_TRACER_MESSAGE_ID_PAD_PUSH_PRE, GST_TRACER_TS, \ + if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_PAD_PUSH_PRE)) { \ + gst_tracer_dispatch (GST_TRACER_HOOK_ID_PAD_PUSH_PRE, \ + GST_TRACER_TS, \ pad, buffer); \ } \ }G_STMT_END #define GST_TRACER_PAD_PUSH_POST(pad, res) G_STMT_START{ \ - if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_BUFFERS)) { \ - gst_tracer_dispatch (GST_TRACER_HOOK_ID_BUFFERS, \ - GST_TRACER_MESSAGE_ID_PAD_PUSH_POST, GST_TRACER_TS, \ + if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_PAD_PUSH_POST)) { \ + gst_tracer_dispatch (GST_TRACER_HOOK_ID_PAD_PUSH_POST, \ + GST_TRACER_TS, \ pad, res); \ } \ }G_STMT_END #define GST_TRACER_PAD_PUSH_LIST_PRE(pad, list) G_STMT_START{ \ - if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_BUFFERS)) { \ - gst_tracer_dispatch (GST_TRACER_HOOK_ID_BUFFERS, \ - GST_TRACER_MESSAGE_ID_PAD_PUSH_LIST_PRE, GST_TRACER_TS, \ + if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_PAD_PUSH_LIST_PRE)) { \ + gst_tracer_dispatch (GST_TRACER_HOOK_ID_PAD_PUSH_LIST_PRE, \ + GST_TRACER_TS, \ pad, list); \ } \ }G_STMT_END #define GST_TRACER_PAD_PUSH_LIST_POST(pad, res) G_STMT_START{ \ - if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_BUFFERS)) { \ - gst_tracer_dispatch (GST_TRACER_HOOK_ID_BUFFERS, \ - GST_TRACER_MESSAGE_ID_PAD_PUSH_LIST_POST, GST_TRACER_TS, \ + if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_PAD_PUSH_LIST_POST)) { \ + gst_tracer_dispatch (GST_TRACER_HOOK_ID_PAD_PUSH_LIST_POST, \ + GST_TRACER_TS, \ pad, res); \ } \ }G_STMT_END #define GST_TRACER_PAD_PULL_RANGE_PRE(pad, offset, size) G_STMT_START{ \ - if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_BUFFERS)) { \ - gst_tracer_dispatch (GST_TRACER_HOOK_ID_BUFFERS, \ - GST_TRACER_MESSAGE_ID_PAD_PULL_RANGE_PRE, GST_TRACER_TS, \ + if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_PAD_PULL_RANGE_PRE)) { \ + gst_tracer_dispatch (GST_TRACER_HOOK_ID_PAD_PULL_RANGE_PRE, \ + GST_TRACER_TS, \ pad, offset, size); \ } \ }G_STMT_END #define GST_TRACER_PAD_PULL_RANGE_POST(pad, buffer, res) G_STMT_START{ \ - if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_BUFFERS)) { \ - gst_tracer_dispatch (GST_TRACER_HOOK_ID_BUFFERS, \ - GST_TRACER_MESSAGE_ID_PAD_PULL_RANGE_POST, GST_TRACER_TS, \ + if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_PAD_PULL_RANGE_POST)) { \ + gst_tracer_dispatch (GST_TRACER_HOOK_ID_PAD_PULL_RANGE_POST, \ + GST_TRACER_TS, \ pad, buffer, res); \ } \ }G_STMT_END #define GST_TRACER_PAD_PUSH_EVENT_PRE(pad, event) G_STMT_START{ \ - if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_EVENTS)) { \ - gst_tracer_dispatch (GST_TRACER_HOOK_ID_EVENTS, \ - GST_TRACER_MESSAGE_ID_PAD_PUSH_EVENT_PRE, GST_TRACER_TS, \ + if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_PAD_PUSH_EVENT_PRE)) { \ + gst_tracer_dispatch (GST_TRACER_HOOK_ID_PAD_PUSH_EVENT_PRE, \ + GST_TRACER_TS, \ pad, event); \ } \ }G_STMT_END #define GST_TRACER_PAD_PUSH_EVENT_POST(pad, res) G_STMT_START{ \ - if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_EVENTS)) { \ - gst_tracer_dispatch (GST_TRACER_HOOK_ID_EVENTS, \ - GST_TRACER_MESSAGE_ID_PAD_PUSH_EVENT_POST, GST_TRACER_TS, \ + if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_PAD_PUSH_EVENT_POST)) { \ + gst_tracer_dispatch (GST_TRACER_HOOK_ID_PAD_PUSH_EVENT_POST, \ + GST_TRACER_TS, \ pad, res); \ } \ }G_STMT_END #define GST_TRACER_ELEMENT_POST_MESSAGE_PRE(element, message) G_STMT_START{ \ - if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_MESSAGES)) { \ - gst_tracer_dispatch (GST_TRACER_HOOK_ID_MESSAGES, \ - GST_TRACER_MESSAGE_ID_ELEMENT_POST_MESSAGE_PRE, GST_TRACER_TS, \ + if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_ELEMENT_POST_MESSAGE_PRE)) { \ + gst_tracer_dispatch (GST_TRACER_HOOK_ID_ELEMENT_POST_MESSAGE_PRE, \ + GST_TRACER_TS, \ element, message); \ } \ }G_STMT_END #define GST_TRACER_ELEMENT_POST_MESSAGE_POST(element, res) G_STMT_START{ \ - if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_MESSAGES)) { \ - gst_tracer_dispatch (GST_TRACER_HOOK_ID_MESSAGES, \ - GST_TRACER_MESSAGE_ID_ELEMENT_POST_MESSAGE_POST, GST_TRACER_TS, \ + if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_ELEMENT_POST_MESSAGE_POST)) { \ + gst_tracer_dispatch (GST_TRACER_HOOK_ID_ELEMENT_POST_MESSAGE_POST, \ + GST_TRACER_TS, \ element, res); \ } \ }G_STMT_END #define GST_TRACER_ELEMENT_QUERY_PRE(element, query) G_STMT_START{ \ - if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_QUERIES)) { \ - gst_tracer_dispatch (GST_TRACER_HOOK_ID_QUERIES, \ - GST_TRACER_MESSAGE_ID_ELEMENT_QUERY_PRE, GST_TRACER_TS, \ + if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_ELEMENT_QUERY_PRE)) { \ + gst_tracer_dispatch (GST_TRACER_HOOK_ID_ELEMENT_QUERY_PRE, \ + GST_TRACER_TS, \ element, query); \ } \ }G_STMT_END #define GST_TRACER_ELEMENT_QUERY_POST(element, res) G_STMT_START{ \ - if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_QUERIES)) { \ - gst_tracer_dispatch (GST_TRACER_HOOK_ID_QUERIES, \ - GST_TRACER_MESSAGE_ID_ELEMENT_QUERY_POST, GST_TRACER_TS, \ + if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_ELEMENT_QUERY_POST)) { \ + gst_tracer_dispatch (GST_TRACER_HOOK_ID_ELEMENT_QUERY_POST, \ + GST_TRACER_TS, \ element, res); \ } \ }G_STMT_END diff --git a/plugins/tracers/gstlatency.c b/plugins/tracers/gstlatency.c index aa1dfa6..715fc07 100644 --- a/plugins/tracers/gstlatency.c +++ b/plugins/tracers/gstlatency.c @@ -87,50 +87,6 @@ get_real_pad_parent (GstPad * pad) return GST_ELEMENT_CAST (parent); } -/* tracer class */ - -static void gst_latency_tracer_invoke (GstTracer * obj, GstTracerMessageId mid, - va_list var_args); - -static void -gst_latency_tracer_class_init (GstLatencyTracerClass * klass) -{ - GstTracerClass *gst_tracer_class = GST_TRACER_CLASS (klass); - - gst_tracer_class->invoke = gst_latency_tracer_invoke; - - latency_probe_id = g_quark_from_static_string ("latency_probe.id"); - latency_probe_pad = g_quark_from_static_string ("latency_probe.pad"); - latency_probe_ts = g_quark_from_static_string ("latency_probe.ts"); - - /* announce trace formats */ - /* *INDENT-OFF* */ - gst_tracer_log_trace (gst_structure_new ("latency.class", - "src", GST_TYPE_STRUCTURE, gst_structure_new ("scope", - "related-to", G_TYPE_STRING, "pad", /* TODO: use genum */ - NULL), - "sink", GST_TYPE_STRUCTURE, gst_structure_new ("scope", - "related-to", G_TYPE_STRING, "pad", /* TODO: use genum */ - NULL), - "time", GST_TYPE_STRUCTURE, gst_structure_new ("value", - "type", G_TYPE_GTYPE, G_TYPE_UINT64, - "description", G_TYPE_STRING, - "time it took for the buffer to go from src to sink ns", - "flags", G_TYPE_STRING, "aggregated", /* TODO: use gflags */ - "min", G_TYPE_UINT64, G_GUINT64_CONSTANT (0), - "max", G_TYPE_UINT64, G_MAXUINT64, - NULL), - NULL)); - /* *INDENT-ON* */ -} - -static void -gst_latency_tracer_init (GstLatencyTracer * self) -{ - g_object_set (self, "mask", GST_TRACER_HOOK_BUFFERS | GST_TRACER_HOOK_EVENTS, - NULL); -} - /* hooks */ static void @@ -172,24 +128,24 @@ send_latency_probe (GstLatencyTracer * self, GstElement * parent, GstPad * pad, } static void -do_push_buffer_pre (GstLatencyTracer * self, va_list var_args) +do_push_buffer_pre (GstTracer * self, va_list var_args) { guint64 ts = va_arg (var_args, guint64); GstPad *pad = va_arg (var_args, GstPad *); GstElement *parent = get_real_pad_parent (pad); - send_latency_probe (self, parent, pad, ts); + send_latency_probe ((GstLatencyTracer *) self, parent, pad, ts); } static void -do_pull_buffer_pre (GstLatencyTracer * self, va_list var_args) +do_pull_range_pre (GstTracer * self, va_list var_args) { guint64 ts = va_arg (var_args, guint64); GstPad *pad = va_arg (var_args, GstPad *); GstPad *peer_pad = GST_PAD_PEER (pad); GstElement *parent = get_real_pad_parent (peer_pad); - send_latency_probe (self, parent, peer_pad, ts); + send_latency_probe ((GstLatencyTracer *) self, parent, peer_pad, ts); } static void @@ -206,28 +162,28 @@ calculate_latency (GstLatencyTracer * self, GstElement * parent, GstPad * pad, } static void -do_push_buffer_post (GstLatencyTracer * self, va_list var_args) +do_push_buffer_post (GstTracer * self, va_list var_args) { guint64 ts = va_arg (var_args, guint64); GstPad *pad = va_arg (var_args, GstPad *); GstPad *peer_pad = GST_PAD_PEER (pad); GstElement *parent = get_real_pad_parent (peer_pad); - calculate_latency (self, parent, peer_pad, ts); + calculate_latency ((GstLatencyTracer *) self, parent, peer_pad, ts); } static void -do_pull_range_post (GstLatencyTracer * self, va_list var_args) +do_pull_range_post (GstTracer * self, va_list var_args) { guint64 ts = va_arg (var_args, guint64); GstPad *pad = va_arg (var_args, GstPad *); GstElement *parent = get_real_pad_parent (pad); - calculate_latency (self, parent, pad, ts); + calculate_latency ((GstLatencyTracer *) self, parent, pad, ts); } static void -do_push_event_pre (GstLatencyTracer * self, va_list var_args) +do_push_event_pre (GstTracer * self, va_list var_args) { G_GNUC_UNUSED guint64 ts = va_arg (var_args, guint64); GstPad *pad = va_arg (var_args, GstPad *); @@ -250,31 +206,59 @@ do_push_event_pre (GstLatencyTracer * self, va_list var_args) } } +/* tracer class */ + static void -gst_latency_tracer_invoke (GstTracer * obj, GstTracerMessageId mid, - va_list var_args) +gst_latency_tracer_class_init (GstLatencyTracerClass * klass) { - GstLatencyTracer *self = GST_LATENCY_TRACER_CAST (obj); - - switch (mid) { - case GST_TRACER_MESSAGE_ID_PAD_PUSH_PRE: - case GST_TRACER_MESSAGE_ID_PAD_PUSH_LIST_PRE: - do_push_buffer_pre (self, var_args); - break; - case GST_TRACER_MESSAGE_ID_PAD_PUSH_POST: - case GST_TRACER_MESSAGE_ID_PAD_PUSH_LIST_POST: - do_push_buffer_post (self, var_args); - break; - case GST_TRACER_MESSAGE_ID_PAD_PULL_RANGE_PRE: - do_pull_buffer_pre (self, var_args); - break; - case GST_TRACER_MESSAGE_ID_PAD_PULL_RANGE_POST: - do_pull_range_post (self, var_args); - break; - case GST_TRACER_MESSAGE_ID_PAD_PUSH_EVENT_PRE: - do_push_event_pre (self, var_args); - break; - default: - break; - } + latency_probe_id = g_quark_from_static_string ("latency_probe.id"); + latency_probe_pad = g_quark_from_static_string ("latency_probe.pad"); + latency_probe_ts = g_quark_from_static_string ("latency_probe.ts"); + + /* announce trace formats */ + /* *INDENT-OFF* */ + gst_tracer_log_trace (gst_structure_new ("latency.class", + "src", GST_TYPE_STRUCTURE, gst_structure_new ("scope", + "related-to", G_TYPE_STRING, "pad", /* TODO: use genum */ + NULL), + "sink", GST_TYPE_STRUCTURE, gst_structure_new ("scope", + "related-to", G_TYPE_STRING, "pad", /* TODO: use genum */ + NULL), + "time", GST_TYPE_STRUCTURE, gst_structure_new ("value", + "type", G_TYPE_GTYPE, G_TYPE_UINT64, + "description", G_TYPE_STRING, + "time it took for the buffer to go from src to sink ns", + "flags", G_TYPE_STRING, "aggregated", /* TODO: use gflags */ + "min", G_TYPE_UINT64, G_GUINT64_CONSTANT (0), + "max", G_TYPE_UINT64, G_MAXUINT64, + NULL), + NULL)); + /* *INDENT-ON* */ +} + +static void +gst_latency_tracer_init (GstLatencyTracer * self) +{ + GstTracer *tracer = GST_TRACER (self); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_PAD_PUSH_PRE, + do_push_buffer_pre); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_PAD_PUSH_LIST_PRE, + do_push_buffer_pre); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_PAD_PUSH_POST, + do_push_buffer_post); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_PAD_PUSH_LIST_POST, + do_push_buffer_post); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_PAD_PULL_RANGE_PRE, + do_pull_range_pre); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_PAD_PULL_RANGE_POST, + do_pull_range_post); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_PAD_PUSH_EVENT_PRE, + do_push_event_pre); + /* + - we should also replace GstTracerHookId with a 'detail' string like in + signals + - then we can attach to *all* hooks with 'null' as detail + gst_tracer_register_hook (self, gchar *detail, func); + gst_tracer_register_hook_id (self, GQuark detail, func); + */ } diff --git a/plugins/tracers/gstlog.c b/plugins/tracers/gstlog.c index 200e766..75e1c4b 100644 --- a/plugins/tracers/gstlog.c +++ b/plugins/tracers/gstlog.c @@ -52,95 +52,138 @@ GST_DEBUG_CATEGORY_STATIC (GST_CAT_QUERY); G_DEFINE_TYPE_WITH_CODE (GstLogTracer, gst_log_tracer, GST_TYPE_TRACER, _do_init); -static void gst_log_tracer_invoke (GstTracer * self, GstTracerMessageId mid, - va_list var_args); +static void +do_log (GstDebugCategory * cat, const char *format, va_list var_args) +{ + gst_debug_log_valist (cat, GST_LEVEL_TRACE, "", "", 0, NULL, + format, var_args); +} static void -gst_log_tracer_class_init (GstLogTracerClass * klass) +do_push_buffer_pre (GstTracer * self, va_list var_args) +{ + do_log (GST_CAT_BUFFER, + "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", buffer=%" GST_PTR_FORMAT, + var_args); +} + +static void +do_push_buffer_post (GstTracer * self, va_list var_args) { - GstTracerClass *gst_tracer_class = GST_TRACER_CLASS (klass); + do_log (GST_CAT_BUFFER, + "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", res=%d", var_args); +} - gst_tracer_class->invoke = gst_log_tracer_invoke; +static void +do_push_buffer_list_pre (GstTracer * self, va_list var_args) +{ + do_log (GST_CAT_BUFFER_LIST, + "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", list=%p", var_args); } static void -gst_log_tracer_init (GstLogTracer * self) +do_push_buffer_list_post (GstTracer * self, va_list var_args) { - g_object_set (self, "mask", GST_TRACER_HOOK_ALL, NULL); + do_log (GST_CAT_BUFFER_LIST, + "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", res=%d", var_args); } static void -gst_log_tracer_invoke (GstTracer * self, GstTracerMessageId mid, - va_list var_args) +do_pull_range_pre (GstTracer * self, va_list var_args) { - const gchar *fmt = NULL; - GstDebugCategory *cat = GST_CAT_DEFAULT; - guint64 ts = va_arg (var_args, guint64); - - /* TODO(ensonic): log to different categories depending on 'mid' - * GST_TRACER_HOOK_ID_QUERIES -> (static category) - * GST_TRACER_HOOK_ID_TOPLOGY -> ? - */ - switch (mid) { - case GST_TRACER_MESSAGE_ID_PAD_PUSH_PRE: - cat = GST_CAT_BUFFER; - fmt = "pad=%" GST_PTR_FORMAT ", buffer=%" GST_PTR_FORMAT; - break; - case GST_TRACER_MESSAGE_ID_PAD_PUSH_POST: - cat = GST_CAT_BUFFER; - fmt = "pad=%" GST_PTR_FORMAT ", res=%d"; - break; - case GST_TRACER_MESSAGE_ID_PAD_PUSH_LIST_PRE: - cat = GST_CAT_BUFFER_LIST; - fmt = "pad=%" GST_PTR_FORMAT ", list=%p"; - break; - case GST_TRACER_MESSAGE_ID_PAD_PUSH_LIST_POST: - cat = GST_CAT_BUFFER_LIST; - fmt = "pad=%" GST_PTR_FORMAT ", res=%d"; - break; - case GST_TRACER_MESSAGE_ID_PAD_PULL_RANGE_PRE: - cat = GST_CAT_BUFFER; - fmt = "pad=%" GST_PTR_FORMAT ", offset=%" G_GUINT64_FORMAT ", size=%u"; - break; - case GST_TRACER_MESSAGE_ID_PAD_PULL_RANGE_POST: - cat = GST_CAT_BUFFER; - fmt = "pad=%" GST_PTR_FORMAT ", buffer=%" GST_PTR_FORMAT ", res=%d"; - break; - case GST_TRACER_MESSAGE_ID_PAD_PUSH_EVENT_PRE: - cat = GST_CAT_EVENT; - fmt = "pad=%" GST_PTR_FORMAT ", event=%" GST_PTR_FORMAT; - break; - case GST_TRACER_MESSAGE_ID_PAD_PUSH_EVENT_POST: - cat = GST_CAT_EVENT; - fmt = "pad=%" GST_PTR_FORMAT ", res=%d"; - break; - case GST_TRACER_MESSAGE_ID_ELEMENT_POST_MESSAGE_PRE: - cat = GST_CAT_MESSAGE; - fmt = "element=%" GST_PTR_FORMAT ", message=%" GST_PTR_FORMAT; - break; - case GST_TRACER_MESSAGE_ID_ELEMENT_POST_MESSAGE_POST: - cat = GST_CAT_MESSAGE; - fmt = "element=%" GST_PTR_FORMAT ", res=%d"; - break; - case GST_TRACER_MESSAGE_ID_ELEMENT_QUERY_PRE: - cat = GST_CAT_QUERY; - fmt = "element=%" GST_PTR_FORMAT ", query=%" GST_PTR_FORMAT; - break; - case GST_TRACER_MESSAGE_ID_ELEMENT_QUERY_POST: - cat = GST_CAT_QUERY; - fmt = "element=%" GST_PTR_FORMAT ", res=%d"; - break; - default: - break; - } - if (fmt) { - gchar *str; - - __gst_vasprintf (&str, fmt, var_args); - GST_CAT_TRACE (cat, "[%d] %" GST_TIME_FORMAT ", %s", - mid, GST_TIME_ARGS (ts), str); - g_free (str); - } else { - GST_CAT_TRACE (cat, "[%d] %" GST_TIME_FORMAT, mid, GST_TIME_ARGS (ts)); - } + do_log (GST_CAT_BUFFER, + "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", offset=%" G_GUINT64_FORMAT + ", size=%u", var_args); +} + +static void +do_pull_range_post (GstTracer * self, va_list var_args) +{ + do_log (GST_CAT_BUFFER, + "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", buffer=%" GST_PTR_FORMAT + ", res=%d", var_args); +} + +static void +do_push_event_pre (GstTracer * self, va_list var_args) +{ + do_log (GST_CAT_EVENT, + "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", event=%" GST_PTR_FORMAT, + var_args); +} + +static void +do_push_event_post (GstTracer * self, va_list var_args) +{ + do_log (GST_CAT_EVENT, + "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", res=%d", var_args); +} + +static void +do_post_message_pre (GstTracer * self, va_list var_args) +{ + do_log (GST_CAT_EVENT, + "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", message=%" + GST_PTR_FORMAT, var_args); +} + +static void +do_post_message_post (GstTracer * self, va_list var_args) +{ + do_log (GST_CAT_EVENT, + "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", res=%d", var_args); +} + +static void +do_query_pre (GstTracer * self, va_list var_args) +{ + do_log (GST_CAT_QUERY, + "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", query=%" + GST_PTR_FORMAT, var_args); +} + +static void +do_query_post (GstTracer * self, va_list var_args) +{ + do_log (GST_CAT_QUERY, + "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", res=%d", var_args); +} + + +/* tracer class */ + +static void +gst_log_tracer_class_init (GstLogTracerClass * klass) +{ +} + +static void +gst_log_tracer_init (GstLogTracer * self) +{ + GstTracer *tracer = GST_TRACER (self); + + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_PAD_PUSH_PRE, + do_push_buffer_pre); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_PAD_PUSH_POST, + do_push_buffer_post); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_PAD_PUSH_LIST_PRE, + do_push_buffer_list_pre); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_PAD_PUSH_LIST_POST, + do_push_buffer_list_post); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_PAD_PULL_RANGE_PRE, + do_pull_range_pre); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_PAD_PULL_RANGE_POST, + do_pull_range_post); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_PAD_PUSH_EVENT_PRE, + do_push_event_pre); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_PAD_PUSH_EVENT_POST, + do_push_event_post); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_ELEMENT_POST_MESSAGE_PRE, + do_post_message_pre); + gst_tracer_register_hook (tracer, + GST_TRACER_HOOK_ID_ELEMENT_POST_MESSAGE_POST, do_post_message_post); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_ELEMENT_QUERY_PRE, + do_query_pre); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_ELEMENT_QUERY_POST, + do_query_post); } diff --git a/plugins/tracers/gstrusage.c b/plugins/tracers/gstrusage.c index 721af78..1764ef3 100644 --- a/plugins/tracers/gstrusage.c +++ b/plugins/tracers/gstrusage.c @@ -78,9 +78,6 @@ typedef struct static GstTraceValues *tvs_proc; -static void gst_rusage_tracer_invoke (GstTracer * self, GstTracerMessageId mid, - va_list var_args); - /* data helper */ static void @@ -166,91 +163,7 @@ free_thread_stats (gpointer data) } static void -gst_rusage_tracer_class_init (GstRUsageTracerClass * klass) -{ - GstTracerClass *gst_tracer_class = GST_TRACER_CLASS (klass); - - gst_tracer_class->invoke = gst_rusage_tracer_invoke; -} - -static void -gst_rusage_tracer_init (GstRUsageTracer * self) -{ - g_object_set (self, "mask", GST_TRACER_HOOK_ALL, NULL); - self->threads = g_hash_table_new_full (NULL, NULL, NULL, free_thread_stats); - - main_thread_id = g_thread_self (); - tvs_proc = make_trace_values (GST_SECOND); - if ((num_cpus = sysconf (_SC_NPROCESSORS_ONLN)) == -1) { - GST_WARNING_OBJECT (self, "failed to get number of cpus online"); - if ((num_cpus = sysconf (_SC_NPROCESSORS_CONF)) == -1) { - GST_WARNING_OBJECT (self, "failed to get number of cpus, assuming 1"); - num_cpus = 1; - } - } - - GST_DEBUG ("rusage: main thread=%p, num_cpus=%ld", main_thread_id, num_cpus); - - /* announce trace formats */ - /* *INDENT-OFF* */ - gst_tracer_log_trace (gst_structure_new ("thread-rusage.class", - "thread-id", GST_TYPE_STRUCTURE, gst_structure_new ("scope", - "related-to", G_TYPE_STRING, "thread", /* TODO: use genum */ - NULL), - "average-cpuload", GST_TYPE_STRUCTURE, gst_structure_new ("value", - "type", G_TYPE_GTYPE, G_TYPE_UINT, - "description", G_TYPE_STRING, "average cpu usage per thread in ‰", - "flags", G_TYPE_STRING, "aggregated", /* TODO: use gflags */ - "min", G_TYPE_UINT, 0, - "max", G_TYPE_UINT, 1000, - NULL), - "current-cpuload", GST_TYPE_STRUCTURE, gst_structure_new ("value", - "type", G_TYPE_GTYPE, G_TYPE_UINT, - "description", G_TYPE_STRING, "current cpu usage per thread in ‰", - "flags", G_TYPE_STRING, "windowed", /* TODO: use gflags */ - "min", G_TYPE_UINT, 0, - "max", G_TYPE_UINT, 1000, - NULL), - "time", GST_TYPE_STRUCTURE, gst_structure_new ("value", - "type", G_TYPE_GTYPE, G_TYPE_UINT64, - "description", G_TYPE_STRING, "time spent in thread in ns", - "flags", G_TYPE_STRING, "aggregated", /* TODO: use gflags */ - "min", G_TYPE_UINT64, G_GUINT64_CONSTANT (0), - "max", G_TYPE_UINT64, G_MAXUINT64, - NULL), - NULL)); - gst_tracer_log_trace (gst_structure_new ("proc-rusage.class", - "thread-id", GST_TYPE_STRUCTURE, gst_structure_new ("scope", - "related-to", G_TYPE_STRING, "process", /* TODO: use genum */ - NULL), - "average-cpuload", GST_TYPE_STRUCTURE, gst_structure_new ("value", - "type", G_TYPE_GTYPE, G_TYPE_UINT, - "description", G_TYPE_STRING, "average cpu usage per process in ‰", - "flags", G_TYPE_STRING, "aggregated", /* TODO: use gflags */ - "min", G_TYPE_UINT, 0, - "max", G_TYPE_UINT, 1000, - NULL), - "current-cpuload", GST_TYPE_STRUCTURE, gst_structure_new ("value", - "type", G_TYPE_GTYPE, G_TYPE_UINT, - "description", G_TYPE_STRING, "current cpu usage per process in ‰", - "flags", G_TYPE_STRING, "windowed", /* TODO: use gflags */ - "min", G_TYPE_UINT, 0, - "max", G_TYPE_UINT, 1000, - NULL), - "time", GST_TYPE_STRUCTURE, gst_structure_new ("value", - "type", G_TYPE_GTYPE, G_TYPE_UINT64, - "description", G_TYPE_STRING, "time spent in process in ns", - "flags", G_TYPE_STRING, "aggregated", /* TODO: use gflags */ - "min", G_TYPE_UINT64, G_GUINT64_CONSTANT (0), - "max", G_TYPE_UINT64, G_MAXUINT64, - NULL), - NULL)); - /* *INDENT-ON* */ -} - -static void -gst_rusage_tracer_invoke (GstTracer * obj, GstTracerMessageId mid, - va_list var_args) +do_stats (GstTracer * obj, va_list var_args) { GstRUsageTracer *self = GST_RUSAGE_TRACER_CAST (obj); guint64 ts = va_arg (var_args, guint64); @@ -360,3 +273,89 @@ gst_rusage_tracer_invoke (GstTracer * obj, GstTracerMessageId mid, NULL)); /* *INDENT-ON* */ } + +/* tracer class */ + +static void +gst_rusage_tracer_class_init (GstRUsageTracerClass * klass) +{ + /* announce trace formats */ + /* *INDENT-OFF* */ + gst_tracer_log_trace (gst_structure_new ("thread-rusage.class", + "thread-id", GST_TYPE_STRUCTURE, gst_structure_new ("scope", + "related-to", G_TYPE_STRING, "thread", /* TODO: use genum */ + NULL), + "average-cpuload", GST_TYPE_STRUCTURE, gst_structure_new ("value", + "type", G_TYPE_GTYPE, G_TYPE_UINT, + "description", G_TYPE_STRING, "average cpu usage per thread in ‰", + "flags", G_TYPE_STRING, "aggregated", /* TODO: use gflags */ + "min", G_TYPE_UINT, 0, + "max", G_TYPE_UINT, 1000, + NULL), + "current-cpuload", GST_TYPE_STRUCTURE, gst_structure_new ("value", + "type", G_TYPE_GTYPE, G_TYPE_UINT, + "description", G_TYPE_STRING, "current cpu usage per thread in ‰", + "flags", G_TYPE_STRING, "windowed", /* TODO: use gflags */ + "min", G_TYPE_UINT, 0, + "max", G_TYPE_UINT, 1000, + NULL), + "time", GST_TYPE_STRUCTURE, gst_structure_new ("value", + "type", G_TYPE_GTYPE, G_TYPE_UINT64, + "description", G_TYPE_STRING, "time spent in thread in ns", + "flags", G_TYPE_STRING, "aggregated", /* TODO: use gflags */ + "min", G_TYPE_UINT64, G_GUINT64_CONSTANT (0), + "max", G_TYPE_UINT64, G_MAXUINT64, + NULL), + NULL)); + gst_tracer_log_trace (gst_structure_new ("proc-rusage.class", + "thread-id", GST_TYPE_STRUCTURE, gst_structure_new ("scope", + "related-to", G_TYPE_STRING, "process", /* TODO: use genum */ + NULL), + "average-cpuload", GST_TYPE_STRUCTURE, gst_structure_new ("value", + "type", G_TYPE_GTYPE, G_TYPE_UINT, + "description", G_TYPE_STRING, "average cpu usage per process in ‰", + "flags", G_TYPE_STRING, "aggregated", /* TODO: use gflags */ + "min", G_TYPE_UINT, 0, + "max", G_TYPE_UINT, 1000, + NULL), + "current-cpuload", GST_TYPE_STRUCTURE, gst_structure_new ("value", + "type", G_TYPE_GTYPE, G_TYPE_UINT, + "description", G_TYPE_STRING, "current cpu usage per process in ‰", + "flags", G_TYPE_STRING, "windowed", /* TODO: use gflags */ + "min", G_TYPE_UINT, 0, + "max", G_TYPE_UINT, 1000, + NULL), + "time", GST_TYPE_STRUCTURE, gst_structure_new ("value", + "type", G_TYPE_GTYPE, G_TYPE_UINT64, + "description", G_TYPE_STRING, "time spent in process in ns", + "flags", G_TYPE_STRING, "aggregated", /* TODO: use gflags */ + "min", G_TYPE_UINT64, G_GUINT64_CONSTANT (0), + "max", G_TYPE_UINT64, G_MAXUINT64, + NULL), + NULL)); + /* *INDENT-ON* */ +} + +static void +gst_rusage_tracer_init (GstRUsageTracer * self) +{ + GstTracer *tracer = GST_TRACER (self); + gint i; + + for (i = 0; i < GST_TRACER_HOOK_ID_LAST; i++) { + gst_tracer_register_hook (tracer, i, do_stats); + } + + self->threads = g_hash_table_new_full (NULL, NULL, NULL, free_thread_stats); + + main_thread_id = g_thread_self (); + tvs_proc = make_trace_values (GST_SECOND); + if ((num_cpus = sysconf (_SC_NPROCESSORS_ONLN)) == -1) { + GST_WARNING_OBJECT (self, "failed to get number of cpus online"); + if ((num_cpus = sysconf (_SC_NPROCESSORS_CONF)) == -1) { + GST_WARNING_OBJECT (self, "failed to get number of cpus, assuming 1"); + num_cpus = 1; + } + } + GST_DEBUG ("rusage: main thread=%p, num_cpus=%ld", main_thread_id, num_cpus); +} diff --git a/plugins/tracers/gststats.c b/plugins/tracers/gststats.c index 972a352..8172057 100644 --- a/plugins/tracers/gststats.c +++ b/plugins/tracers/gststats.c @@ -336,106 +336,6 @@ do_element_stats (GstStatsTracer * self, GstPad * pad, GstClockTime elapsed1, #endif } -/* tracer class */ - -static void gst_stats_tracer_finalize (GObject * obj); -static void gst_stats_tracer_invoke (GstTracer * obj, GstTracerMessageId mid, - va_list var_args); - -static void -gst_stats_tracer_class_init (GstStatsTracerClass * klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GstTracerClass *gst_tracer_class = GST_TRACER_CLASS (klass); - - gobject_class->finalize = gst_stats_tracer_finalize; - - gst_tracer_class->invoke = gst_stats_tracer_invoke; -} - -static void -gst_stats_tracer_init (GstStatsTracer * self) -{ - g_object_set (self, "mask", - GST_TRACER_HOOK_BUFFERS | GST_TRACER_HOOK_EVENTS | - GST_TRACER_HOOK_MESSAGES | GST_TRACER_HOOK_QUERIES, NULL); - self->elements = g_ptr_array_new_with_free_func (free_element_stats); - self->pads = g_ptr_array_new_with_free_func (free_pad_stats); - - /* announce trace formats */ - /* *INDENT-OFF* */ - gst_tracer_log_trace (gst_structure_new ("buffer.class", - "pad-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope", - "related-to", G_TYPE_STRING, "pad", /* TODO: use genum */ - NULL), - "element-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope", - "related-to", G_TYPE_STRING, "element", /* TODO: use genum */ - NULL), - "peer-pad-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope", - "related-to", G_TYPE_STRING, "pad", /* TODO: use genum */ - NULL), - "peer-element-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope", - "related-to", G_TYPE_STRING, "element", /* TODO: use genum */ - NULL), - "buffer-size", GST_TYPE_STRUCTURE, gst_structure_new ("value", - "type", G_TYPE_GTYPE, G_TYPE_UINT, - "description", G_TYPE_STRING, "size of buffer in bytes", - "flags", G_TYPE_STRING, "", /* TODO: use gflags */ - "min", G_TYPE_UINT, 0, - "max", G_TYPE_UINT, G_MAXUINT, - NULL), - "buffer-ts", GST_TYPE_STRUCTURE, gst_structure_new ("value", - "type", G_TYPE_GTYPE, G_TYPE_UINT64, - "description", G_TYPE_STRING, "timestamp of the buffer in ns", - "flags", G_TYPE_STRING, "", /* TODO: use gflags */ - "min", G_TYPE_UINT64, G_GUINT64_CONSTANT (0), - "max", G_TYPE_UINT64, G_MAXUINT64, - NULL), - "buffer-duration", GST_TYPE_STRUCTURE, gst_structure_new ("value", - "type", G_TYPE_GTYPE, G_TYPE_UINT64, - "description", G_TYPE_STRING, "duration of the buffer in ns", - "flags", G_TYPE_STRING, "", /* TODO: use gflags */ - "min", G_TYPE_UINT64, G_GUINT64_CONSTANT (0), - "max", G_TYPE_UINT64, G_MAXUINT64, - NULL), - /* TODO(ensonic): "buffer-flags" */ - NULL)); - gst_tracer_log_trace (gst_structure_new ("event.class", - "pad-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope", - "related-to", G_TYPE_STRING, "pad", /* TODO: use genum */ - NULL), - "element-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope", - "related-to", G_TYPE_STRING, "element", /* TODO: use genum */ - NULL), - "name", GST_TYPE_STRUCTURE, gst_structure_new ("value", - "type", G_TYPE_GTYPE, G_TYPE_STRING, - "description", G_TYPE_STRING, "name of the event", - "flags", G_TYPE_STRING, "", /* TODO: use gflags */ - NULL), - NULL)); - gst_tracer_log_trace (gst_structure_new ("message.class", - "element-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope", - "related-to", G_TYPE_STRING, "element", /* TODO: use genum */ - NULL), - "name", GST_TYPE_STRUCTURE, gst_structure_new ("value", - "type", G_TYPE_GTYPE, G_TYPE_STRING, - "description", G_TYPE_STRING, "name of the message", - "flags", G_TYPE_STRING, "", /* TODO: use gflags */ - NULL), - NULL)); - gst_tracer_log_trace (gst_structure_new ("query.class", - "element-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope", - "related-to", G_TYPE_STRING, "element", /* TODO: use genum */ - NULL), - "name", GST_TYPE_STRUCTURE, gst_structure_new ("value", - "type", G_TYPE_GTYPE, G_TYPE_STRING, - "description", G_TYPE_STRING, "name of the query", - "flags", G_TYPE_STRING, "", /* TODO: use gflags */ - NULL), - NULL)); - /* *INDENT-ON* */ -} - /* hooks */ static void @@ -610,56 +510,117 @@ do_query_post (GstStatsTracer * self, va_list var_args) #endif } +/* tracer class */ + static void -gst_stats_tracer_invoke (GstTracer * obj, GstTracerMessageId mid, - va_list var_args) +gst_stats_tracer_class_init (GstStatsTracerClass * klass) { - GstStatsTracer *self = GST_STATS_TRACER_CAST (obj); - - switch (mid) { - case GST_TRACER_MESSAGE_ID_PAD_PUSH_PRE: - do_push_buffer_pre (self, var_args); - break; - case GST_TRACER_MESSAGE_ID_PAD_PUSH_POST: - do_push_buffer_post (self, var_args); - break; - case GST_TRACER_MESSAGE_ID_PAD_PUSH_LIST_PRE: - do_push_buffer_list_pre (self, var_args); - break; - case GST_TRACER_MESSAGE_ID_PAD_PUSH_LIST_POST: - do_push_buffer_list_post (self, var_args); - break; - case GST_TRACER_MESSAGE_ID_PAD_PULL_RANGE_PRE: - do_pull_range_pre (self, var_args); - break; - case GST_TRACER_MESSAGE_ID_PAD_PULL_RANGE_POST: - do_pull_range_post (self, var_args); - break; - case GST_TRACER_MESSAGE_ID_PAD_PUSH_EVENT_PRE: - do_push_event_pre (self, var_args); - break; - case GST_TRACER_MESSAGE_ID_PAD_PUSH_EVENT_POST: - do_push_event_post (self, var_args); - break; - case GST_TRACER_MESSAGE_ID_ELEMENT_POST_MESSAGE_PRE: - do_post_message_pre (self, var_args); - break; - case GST_TRACER_MESSAGE_ID_ELEMENT_POST_MESSAGE_POST: - do_post_message_post (self, var_args); - break; - case GST_TRACER_MESSAGE_ID_ELEMENT_QUERY_PRE: - do_query_pre (self, var_args); - break; - case GST_TRACER_MESSAGE_ID_ELEMENT_QUERY_POST: - do_query_post (self, var_args); - break; - default: - break; - } + /* announce trace formats */ + /* *INDENT-OFF* */ + gst_tracer_log_trace (gst_structure_new ("buffer.class", + "pad-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope", + "related-to", G_TYPE_STRING, "pad", /* TODO: use genum */ + NULL), + "element-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope", + "related-to", G_TYPE_STRING, "element", /* TODO: use genum */ + NULL), + "peer-pad-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope", + "related-to", G_TYPE_STRING, "pad", /* TODO: use genum */ + NULL), + "peer-element-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope", + "related-to", G_TYPE_STRING, "element", /* TODO: use genum */ + NULL), + "buffer-size", GST_TYPE_STRUCTURE, gst_structure_new ("value", + "type", G_TYPE_GTYPE, G_TYPE_UINT, + "description", G_TYPE_STRING, "size of buffer in bytes", + "flags", G_TYPE_STRING, "", /* TODO: use gflags */ + "min", G_TYPE_UINT, 0, + "max", G_TYPE_UINT, G_MAXUINT, + NULL), + "buffer-ts", GST_TYPE_STRUCTURE, gst_structure_new ("value", + "type", G_TYPE_GTYPE, G_TYPE_UINT64, + "description", G_TYPE_STRING, "timestamp of the buffer in ns", + "flags", G_TYPE_STRING, "", /* TODO: use gflags */ + "min", G_TYPE_UINT64, G_GUINT64_CONSTANT (0), + "max", G_TYPE_UINT64, G_MAXUINT64, + NULL), + "buffer-duration", GST_TYPE_STRUCTURE, gst_structure_new ("value", + "type", G_TYPE_GTYPE, G_TYPE_UINT64, + "description", G_TYPE_STRING, "duration of the buffer in ns", + "flags", G_TYPE_STRING, "", /* TODO: use gflags */ + "min", G_TYPE_UINT64, G_GUINT64_CONSTANT (0), + "max", G_TYPE_UINT64, G_MAXUINT64, + NULL), + /* TODO(ensonic): "buffer-flags" */ + NULL)); + gst_tracer_log_trace (gst_structure_new ("event.class", + "pad-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope", + "related-to", G_TYPE_STRING, "pad", /* TODO: use genum */ + NULL), + "element-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope", + "related-to", G_TYPE_STRING, "element", /* TODO: use genum */ + NULL), + "name", GST_TYPE_STRUCTURE, gst_structure_new ("value", + "type", G_TYPE_GTYPE, G_TYPE_STRING, + "description", G_TYPE_STRING, "name of the event", + "flags", G_TYPE_STRING, "", /* TODO: use gflags */ + NULL), + NULL)); + gst_tracer_log_trace (gst_structure_new ("message.class", + "element-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope", + "related-to", G_TYPE_STRING, "element", /* TODO: use genum */ + NULL), + "name", GST_TYPE_STRUCTURE, gst_structure_new ("value", + "type", G_TYPE_GTYPE, G_TYPE_STRING, + "description", G_TYPE_STRING, "name of the message", + "flags", G_TYPE_STRING, "", /* TODO: use gflags */ + NULL), + NULL)); + gst_tracer_log_trace (gst_structure_new ("query.class", + "element-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope", + "related-to", G_TYPE_STRING, "element", /* TODO: use genum */ + NULL), + "name", GST_TYPE_STRUCTURE, gst_structure_new ("value", + "type", G_TYPE_GTYPE, G_TYPE_STRING, + "description", G_TYPE_STRING, "name of the query", + "flags", G_TYPE_STRING, "", /* TODO: use gflags */ + NULL), + NULL)); + /* *INDENT-ON* */ } static void -gst_stats_tracer_finalize (GObject * obj) +gst_stats_tracer_init (GstStatsTracer * self) { - G_OBJECT_CLASS (parent_class)->finalize (obj); + GstTracer *tracer = GST_TRACER (self); + + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_PAD_PUSH_PRE, + (GstTracerHookFunction) do_push_buffer_pre); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_PAD_PUSH_POST, + (GstTracerHookFunction) do_push_buffer_post); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_PAD_PUSH_LIST_PRE, + (GstTracerHookFunction) do_push_buffer_list_pre); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_PAD_PUSH_LIST_POST, + (GstTracerHookFunction) do_push_buffer_list_post); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_PAD_PULL_RANGE_PRE, + (GstTracerHookFunction) do_pull_range_pre); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_PAD_PULL_RANGE_POST, + (GstTracerHookFunction) do_pull_range_post); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_PAD_PUSH_EVENT_PRE, + (GstTracerHookFunction) do_push_event_pre); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_PAD_PUSH_EVENT_POST, + (GstTracerHookFunction) do_push_event_post); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_ELEMENT_POST_MESSAGE_PRE, + (GstTracerHookFunction) do_post_message_pre); + gst_tracer_register_hook (tracer, + GST_TRACER_HOOK_ID_ELEMENT_POST_MESSAGE_POST, + (GstTracerHookFunction) do_post_message_post); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_ELEMENT_QUERY_PRE, + (GstTracerHookFunction) do_query_pre); + gst_tracer_register_hook (tracer, GST_TRACER_HOOK_ID_ELEMENT_QUERY_POST, + (GstTracerHookFunction) do_query_post); + + + self->elements = g_ptr_array_new_with_free_func (free_element_stats); + self->pads = g_ptr_array_new_with_free_func (free_pad_stats); }