tracing: rename the global api to gst_tracing
[platform/upstream/gstreamer.git] / gst / gsttracerutils.h
index c3bd5f3..dedba2a 100644 (file)
@@ -32,174 +32,159 @@ G_BEGIN_DECLS
 
 #ifndef GST_DISABLE_GST_DEBUG
 
-/* hook flags and 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_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);
-void _priv_gst_tracer_deinit (void);
+void _priv_gst_tracing_init (void);
+void _priv_gst_tracing_deinit (void);
 
 /* tracing modules */
 
 gboolean gst_tracer_register (GstPlugin * plugin, const gchar * name, GType type);
 
-/* tracing helpers */
+/* tracer quarks */
 
-void gst_tracer_dispatch (GstTracerHookId hid, GstTracerMessageId mid, ...);
+/* These enums need to match the number and order
+ * of strings declared in _quark_table, in gsttracerutils.c */
+typedef enum _GstTracerQuarkId
+{
+  GST_TRACER_QUARK_HOOK_PAD_PUSH_PRE = 0,
+  GST_TRACER_QUARK_HOOK_PAD_PUSH_POST,
+  GST_TRACER_QUARK_HOOK_PAD_PUSH_LIST_PRE,
+  GST_TRACER_QUARK_HOOK_PAD_PUSH_LIST_POST,
+  GST_TRACER_QUARK_HOOK_PAD_PULL_RANGE_PRE,
+  GST_TRACER_QUARK_HOOK_PAD_PULL_RANGE_POST,
+  GST_TRACER_QUARK_HOOK_PAD_PUSH_EVENT_PRE ,
+  GST_TRACER_QUARK_HOOK_PAD_PUSH_EVENT_POST,
+  GST_TRACER_QUARK_HOOK_ELEMENT_POST_MESSAGE_PRE,
+  GST_TRACER_QUARK_HOOK_ELEMENT_POST_MESSAGE_POST,
+  GST_TRACER_QUARK_HOOK_ELEMENT_QUERY_PRE,
+  GST_TRACER_QUARK_HOOK_ELEMENT_QUERY_POST,
+  GST_TRACER_QUARK_MAX
+} GstTracerQuarkId;
+
+extern GQuark _priv_gst_tracer_quark_table[GST_TRACER_QUARK_MAX];
+
+#define GST_TRACER_QUARK(q) _priv_gst_tracer_quark_table[GST_TRACER_QUARK_##q]
 
 /* tracing module helpers */
 
-void gst_tracer_log_trace (GstStructure * s);
+typedef struct {
+  GObject *tracer;
+  GCallback func;
+} GstTracerHook;
 
 extern gboolean _priv_tracer_enabled;
-extern GList *_priv_tracers[GST_TRACER_HOOK_ID_LAST];
+/* key are hook-id quarks, values are GstTracerHook */
+extern GHashTable *_priv_tracers; 
 
-#define GST_TRACER_IS_ENABLED(id) \
-  (_priv_tracer_enabled && (_priv_tracers[id] != NULL))
+#define GST_TRACER_IS_ENABLED (_priv_tracer_enabled)
 
 #define GST_TRACER_TS \
   GST_CLOCK_DIFF (_priv_gst_info_start_time, gst_util_get_timestamp ())
 
 /* tracing hooks */
 
+#define GST_TRACER_ARGS h->tracer, ts
+#define GST_TRACER_DISPATCH(key,type,args) G_STMT_START{ \
+  if (GST_TRACER_IS_ENABLED) {                                         \
+    GstClockTime ts = GST_TRACER_TS;                                   \
+    GList *__l, *__n;                                                  \
+    GstTracerHook *h;                                                  \
+    __l = g_hash_table_lookup (_priv_tracers, GINT_TO_POINTER (key));  \
+    for (__n = __l; __n; __n = g_list_next (__n)) {                    \
+      h = (GstTracerHook *) __n->data;                                 \
+      ((type)(h->func)) args;                                          \
+    }                                                                  \
+    __l = g_hash_table_lookup (_priv_tracers, NULL);                   \
+    for (__n = __l; __n; __n = g_list_next (__n)) {                    \
+      h = (GstTracerHook *) __n->data;                                 \
+      ((type)(h->func)) args;                                          \
+    }                                                                  \
+  }                                                                    \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadPushPre) (GObject *, GstClockTime, GstPad *, 
+    GstBuffer *);
 #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, \
-        pad, buffer); \
-  } \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PUSH_PRE), \
+    GstTracerHookPadPushPre, (GST_TRACER_ARGS, pad, buffer)); \
 }G_STMT_END
 
+typedef void (*GstTracerHookPadPushPost) (GObject *, GstClockTime, GstPad *, 
+    GstFlowReturn);
 #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, \
-        pad, res); \
-  } \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PUSH_POST), \
+    GstTracerHookPadPushPost, (GST_TRACER_ARGS, pad, res)); \
 }G_STMT_END
 
+typedef void (*GstTracerHookPadPushListPre) (GObject *, GstClockTime, GstPad *, 
+    GstBufferList *);
 #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, \
-        pad, list); \
-  } \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PUSH_LIST_PRE), \
+    GstTracerHookPadPushListPre, (GST_TRACER_ARGS, pad, list)); \
 }G_STMT_END
 
+typedef void (*GstTracerHookPadPushListPost) (GObject *, GstClockTime, GstPad *, 
+    GstFlowReturn);
 #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, \
-        pad, res); \
-  } \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PUSH_LIST_POST), \
+    GstTracerHookPadPushListPost, (GST_TRACER_ARGS, pad, res)); \
 }G_STMT_END
 
+typedef void (*GstTracerHookPadPullRangePre) (GObject *, GstClockTime, GstPad *, 
+    guint64, guint);
 #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, \
-        pad, offset, size); \
-  } \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PULL_RANGE_PRE), \
+    GstTracerHookPadPullRangePre, (GST_TRACER_ARGS, pad, offset, size)); \
 }G_STMT_END
 
+typedef void (*GstTracerHookPadPullRangePost) (GObject *, GstClockTime,
+    GstPad *, GstBuffer *, GstFlowReturn);
 #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, \
-        pad, buffer, res); \
-  } \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PULL_RANGE_POST), \
+    GstTracerHookPadPullRangePost, (GST_TRACER_ARGS, pad, buffer, res)); \
 }G_STMT_END
 
+typedef void (*GstTracerHookPadPushEventPre) (GObject *, GstClockTime, GstPad *, 
+    GstEvent *);
 #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, \
-        pad, event); \
-  } \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PUSH_EVENT_PRE), \
+    GstTracerHookPadPushEventPre, (GST_TRACER_ARGS, pad, event)); \
 }G_STMT_END
 
+typedef void (*GstTracerHookPadPushEventPost) (GObject *, GstClockTime, 
+    GstPad *, gboolean);
 #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, \
-        pad, res); \
-  } \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PUSH_EVENT_POST), \
+    GstTracerHookPadPushEventPost, (GST_TRACER_ARGS, pad, res)); \
 }G_STMT_END
 
+typedef void (*GstTracerHookElementPostMessagePre) (GObject *, GstClockTime,
+    GstElement *, GstMessage *);
 #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, \
-        element, message); \
-  } \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_POST_MESSAGE_PRE), \
+    GstTracerHookElementPostMessagePre, (GST_TRACER_ARGS, element, message)); \
 }G_STMT_END
 
+typedef void (*GstTracerHookElementPostMessagePost) (GObject *, GstClockTime,
+    GstElement *, gboolean);
 #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, \
-        element, res); \
-  } \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_POST_MESSAGE_POST), \
+    GstTracerHookElementPostMessagePost, (GST_TRACER_ARGS, element, res)); \
 }G_STMT_END
 
+typedef void (*GstTracerHookElementQueryPre) (GObject *, GstClockTime,
+    GstElement *, GstQuery *);
 #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, \
-        element, query); \
-  } \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_QUERY_PRE), \
+    GstTracerHookElementQueryPre, (GST_TRACER_ARGS, element, query)); \
 }G_STMT_END
 
+typedef void (*GstTracerHookElementQueryPost) (GObject *, GstClockTime,
+    GstElement *, gboolean);
 #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, \
-        element, res); \
-  } \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_QUERY_POST), \
+    GstTracerHookElementQueryPost, (GST_TRACER_ARGS, element, res)); \
 }G_STMT_END
 
 #else /* !GST_DISABLE_GST_DEBUG */