/* GStreamer
 * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
 *
 * gsttracerutils.h: tracing subsystem
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */


#ifndef __GST_TRACER_UTILS_H__
#define __GST_TRACER_UTILS_H__

#include <glib.h>
#include <glib-object.h>
#include <gst/gstconfig.h>
#include <gst/gstbin.h>

G_BEGIN_DECLS

#ifndef GST_DISABLE_GST_TRACER_HOOKS

/* tracing hooks */

void _priv_gst_tracing_init (void);
void _priv_gst_tracing_deinit (void);

/* tracer quarks */

/* These enums need to match the number and order
 * of strings declared in _quark_table, in gsttracerutils.c */
typedef enum /*< skip >*/
{
  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_PAD_QUERY_PRE ,
  GST_TRACER_QUARK_HOOK_PAD_QUERY_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_HOOK_ELEMENT_NEW,
  GST_TRACER_QUARK_HOOK_ELEMENT_ADD_PAD,
  GST_TRACER_QUARK_HOOK_ELEMENT_REMOVE_PAD,
  GST_TRACER_QUARK_HOOK_BIN_ADD_PRE,
  GST_TRACER_QUARK_HOOK_BIN_ADD_POST,
  GST_TRACER_QUARK_HOOK_BIN_REMOVE_PRE,
  GST_TRACER_QUARK_HOOK_BIN_REMOVE_POST,
  GST_TRACER_QUARK_HOOK_PAD_LINK_PRE,
  GST_TRACER_QUARK_HOOK_PAD_LINK_POST,
  GST_TRACER_QUARK_HOOK_PAD_UNLINK_PRE,
  GST_TRACER_QUARK_HOOK_PAD_UNLINK_POST,
  GST_TRACER_QUARK_HOOK_ELEMENT_CHANGE_STATE_PRE,
  GST_TRACER_QUARK_HOOK_ELEMENT_CHANGE_STATE_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 */

typedef struct {
  GObject *tracer;
  GCallback func;
} GstTracerHook;

extern gboolean _priv_tracer_enabled;
/* key are hook-id quarks, values are GstTracerHook */
extern GHashTable *_priv_tracers;

#define GST_TRACER_IS_ENABLED (_priv_tracer_enabled)

#define GST_TRACER_TS \
  GST_CLOCK_DIFF (_priv_gst_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

/**
 * GstTracerHookPadPushPre:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @pad: the pad
 * @buffer: the buffer
 *
 * Pre-hook for gst_pad_push() named "pad-push-pre".
 */
typedef void (*GstTracerHookPadPushPre) (GObject *self, GstClockTime ts,
    GstPad *pad, GstBuffer *buffer);
#define GST_TRACER_PAD_PUSH_PRE(pad, buffer) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PUSH_PRE), \
    GstTracerHookPadPushPre, (GST_TRACER_ARGS, pad, buffer)); \
}G_STMT_END

/**
 * GstTracerHookPadPushPost:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @pad: the pad
 * @res: the result of gst_pad_push()
 *
 * Post-hook for gst_pad_push() named "pad-push-post".
 */
typedef void (*GstTracerHookPadPushPost) (GObject * self, GstClockTime ts,
    GstPad *pad, GstFlowReturn res);
#define GST_TRACER_PAD_PUSH_POST(pad, res) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PUSH_POST), \
    GstTracerHookPadPushPost, (GST_TRACER_ARGS, pad, res)); \
}G_STMT_END

/**
 * GstTracerHookPadPushListPre:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @pad: the pad
 * @list: the buffer-list
 *
 * Pre-hook for gst_pad_push_list() named "pad-push-list-pre".
 */
typedef void (*GstTracerHookPadPushListPre) (GObject *self, GstClockTime ts,
    GstPad *pad, GstBufferList *list);
#define GST_TRACER_PAD_PUSH_LIST_PRE(pad, list) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PUSH_LIST_PRE), \
    GstTracerHookPadPushListPre, (GST_TRACER_ARGS, pad, list)); \
}G_STMT_END

/**
 * GstTracerHookPadPushListPost:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @pad: the pad
 * @res: the result of gst_pad_push_list()
 *
 * Post-hook for gst_pad_push_list() named "pad-push-list-post".
 */
typedef void (*GstTracerHookPadPushListPost) (GObject *self, GstClockTime ts,
    GstPad *pad,
    GstFlowReturn res);
#define GST_TRACER_PAD_PUSH_LIST_POST(pad, res) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PUSH_LIST_POST), \
    GstTracerHookPadPushListPost, (GST_TRACER_ARGS, pad, res)); \
}G_STMT_END

/**
 * GstTracerHookPadPullRangePre:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @pad: the pad
 * @offset: the stream offset
 * @size: the requested size
 *
 * Pre-hook for gst_pad_pull_range() named "pad-pull-range-pre".
 */
typedef void (*GstTracerHookPadPullRangePre) (GObject *self, GstClockTime ts,
    GstPad *pad, guint64 offset, guint size);
#define GST_TRACER_PAD_PULL_RANGE_PRE(pad, offset, size) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PULL_RANGE_PRE), \
    GstTracerHookPadPullRangePre, (GST_TRACER_ARGS, pad, offset, size)); \
}G_STMT_END

/**
 * GstTracerHookPadPullRangePost:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @pad: the pad
 * @buffer: the buffer
 * @res: the result of gst_pad_pull_range()
 *
 * Post-hook for gst_pad_pull_range() named "pad-pull-range-post".
 */
typedef void (*GstTracerHookPadPullRangePost) (GObject *self, GstClockTime ts,
    GstPad *pad, GstBuffer *buffer, GstFlowReturn res);
#define GST_TRACER_PAD_PULL_RANGE_POST(pad, buffer, res) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PULL_RANGE_POST), \
    GstTracerHookPadPullRangePost, (GST_TRACER_ARGS, pad, buffer, res)); \
}G_STMT_END

/**
 * GstTracerHookPadPushEventPre:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @pad: the pad
 * @event: the event
 *
 * Pre-hook for gst_pad_push_event() named "pad-push-event-pre".
 */
typedef void (*GstTracerHookPadPushEventPre) (GObject *self, GstClockTime ts,
    GstPad *pad, GstEvent *event);
#define GST_TRACER_PAD_PUSH_EVENT_PRE(pad, event) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PUSH_EVENT_PRE), \
    GstTracerHookPadPushEventPre, (GST_TRACER_ARGS, pad, event)); \
}G_STMT_END

/**
 * GstTracerHookPadPushEventPost:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @pad: the pad
 * @res: the result of gst_pad_push_event()
 *
 * Post-hook for gst_pad_push_event() named "pad-push-event-post".
 */
typedef void (*GstTracerHookPadPushEventPost) (GObject *self, GstClockTime ts,
    GstPad *pad, gboolean res);
#define GST_TRACER_PAD_PUSH_EVENT_POST(pad, res) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PUSH_EVENT_POST), \
    GstTracerHookPadPushEventPost, (GST_TRACER_ARGS, pad, res)); \
}G_STMT_END

/**
 * GstTracerHookPadQueryPre:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @pad: the pad
 * @query: the query
 *
 * Pre-hook for gst_pad_query() named "pad-query-pre".
 */
typedef void (*GstTracerHookPadQueryPre) (GObject *self, GstClockTime ts,
    GstPad *pad, GstQuery *query);
#define GST_TRACER_PAD_QUERY_PRE(pad, query) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_QUERY_PRE), \
    GstTracerHookPadQueryPre, (GST_TRACER_ARGS, pad, query)); \
}G_STMT_END

/**
 * GstTracerHookPadQueryPost:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @pad: the pad
 * @query: the query
 * @res: the result of gst_pad_query()
 *
 * Post-hook for gst_pad_query() named "pad-query-post".
 */
typedef void (*GstTracerHookPadQueryPost) (GObject *self, GstClockTime ts,
    GstPad *pad, GstQuery *query, gboolean res);
#define GST_TRACER_PAD_QUERY_POST(pad, query, res) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_QUERY_POST), \
    GstTracerHookPadQueryPost, (GST_TRACER_ARGS, pad, query, res)); \
}G_STMT_END

/**
 * GstTracerHookElementPostMessagePre:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @element: the element
 * @message: the message
 *
 * Pre-hook for gst_element_post_message() named "element-post-message-pre".
 */
typedef void (*GstTracerHookElementPostMessagePre) (GObject *self,
    GstClockTime ts, GstElement *element, GstMessage *message);
#define GST_TRACER_ELEMENT_POST_MESSAGE_PRE(element, message) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_POST_MESSAGE_PRE), \
    GstTracerHookElementPostMessagePre, (GST_TRACER_ARGS, element, message)); \
}G_STMT_END

/**
 * GstTracerHookElementPostMessagePost:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @element: the element
 * @res: the result of gst_element_post_message()
 *
 * Pre-hook for gst_element_post_message() named "element-post-message-post".
 */
typedef void (*GstTracerHookElementPostMessagePost) (GObject *self,
    GstClockTime ts, GstElement *element, gboolean res);
#define GST_TRACER_ELEMENT_POST_MESSAGE_POST(element, res) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_POST_MESSAGE_POST), \
    GstTracerHookElementPostMessagePost, (GST_TRACER_ARGS, element, res)); \
}G_STMT_END

/**
 * GstTracerHookElementQueryPre:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @element: the element
 * @query: the query
 *
 * Pre-hook for gst_element_query() named "element-query-pre".
 */
typedef void (*GstTracerHookElementQueryPre) (GObject *self, GstClockTime ts,
    GstElement *element, GstQuery *query);
#define GST_TRACER_ELEMENT_QUERY_PRE(element, query) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_QUERY_PRE), \
    GstTracerHookElementQueryPre, (GST_TRACER_ARGS, element, query)); \
}G_STMT_END

/**
 * GstTracerHookElementQueryPost:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @element: the element
 * @query: the query
 * @res: the result of gst_element_query()
 *
 * Post-hook for gst_element_query() named "element-query-post".
 */
typedef void (*GstTracerHookElementQueryPost) (GObject *self, GstClockTime ts,
    GstElement *element, GstQuery *query, gboolean res);
#define GST_TRACER_ELEMENT_QUERY_POST(element, query, res) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_QUERY_POST), \
    GstTracerHookElementQueryPost, (GST_TRACER_ARGS, element, query, res)); \
}G_STMT_END

/**
 * GstTracerHookElementNew:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @element: the element
 *
 * Hook for gst_element_new() named "element-new".
 */
typedef void (*GstTracerHookElementNew) (GObject *self, GstClockTime ts,
    GstElement *element);
#define GST_TRACER_ELEMENT_NEW(element) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_NEW), \
    GstTracerHookElementNew, (GST_TRACER_ARGS, element)); \
}G_STMT_END

/**
 * GstTracerHookElementAddPad:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @element: the element
 * @pad: the pad
 *
 * Hook for gst_element_add_pad() named "element-add-pad".
 */
typedef void (*GstTracerHookElementAddPad) (GObject *self, GstClockTime ts,
    GstElement *element, GstPad *pad);
#define GST_TRACER_ELEMENT_ADD_PAD(element, pad) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_ADD_PAD), \
    GstTracerHookElementAddPad, (GST_TRACER_ARGS, element, pad)); \
}G_STMT_END

/**
 * GstTracerHookElementRemovePad:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @element: the element
 * @pad: the pad
 *
 * Hook for gst_element_remove_pad() named "element-remove-pad".
 */
typedef void (*GstTracerHookElementRemovePad) (GObject *self, GstClockTime ts,
    GstElement *element, GstPad *pad);
#define GST_TRACER_ELEMENT_REMOVE_PAD(element, pad) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_REMOVE_PAD), \
    GstTracerHookElementRemovePad, (GST_TRACER_ARGS, element, pad)); \
}G_STMT_END

/**
 * GstTracerHookElementChangeStatePre:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @element: the element
 * @transition: the transition
 *
 * Pre-hook for gst_element_change_state() named "element-change-state-pre".
 */
typedef void (*GstTracerHookElementChangeStatePre) (GObject *self,
    GstClockTime ts, GstElement *element, GstStateChange transition);
#define GST_TRACER_ELEMENT_CHANGE_STATE_PRE(element, transition) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_CHANGE_STATE_PRE), \
    GstTracerHookElementChangeStatePre, (GST_TRACER_ARGS, element, transition)); \
}G_STMT_END

/**
 * GstTracerHookElementChangeStatePost:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @element: the element
 * @transition: the transition
 * @result: the result of gst_pad_push()
 *
 * Post-hook for gst_element_change_state() named "element-change-state-post".
 */
typedef void (*GstTracerHookElementChangeStatePost) (GObject *self,
    GstClockTime ts, GstElement *element, GstStateChange transition,
    GstStateChangeReturn result);
#define GST_TRACER_ELEMENT_CHANGE_STATE_POST(element, transition, result) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_CHANGE_STATE_POST), \
    GstTracerHookElementChangeStatePost, (GST_TRACER_ARGS, element, transition, result)); \
}G_STMT_END

/**
 * GstTracerHookBinAddPre:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @bin: the bin
 * @element: the element
 *
 * Pre-hook for gst_bin_add() named "bin-add-pre".
 */
typedef void (*GstTracerHookBinAddPre) (GObject *self, GstClockTime ts,
    GstBin *bin, GstElement *element);
#define GST_TRACER_BIN_ADD_PRE(bin, element) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_BIN_ADD_PRE), \
    GstTracerHookBinAddPre, (GST_TRACER_ARGS, bin, element)); \
}G_STMT_END

/**
 * GstTracerHookBinAddPost:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @bin: the bin
 * @element: the element
 * @result: the result of gst_bin_add()
 *
 * Post-hook for gst_bin_add() named "bin-add-post".
 */
typedef void (*GstTracerHookBinAddPost) (GObject *self, GstClockTime ts,
    GstBin *bin, GstElement *element, gboolean result);
#define GST_TRACER_BIN_ADD_POST(bin, element, result) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_BIN_ADD_POST), \
    GstTracerHookBinAddPost, (GST_TRACER_ARGS, bin, element, result)); \
}G_STMT_END

/**
 * GstTracerHookBinRemovePre:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @bin: the bin
 * @element: the element
 *
 * Pre-hook for gst_bin_remove() named "bin-remove-pre".
 */
typedef void (*GstTracerHookBinRemovePre) (GObject *self, GstClockTime ts,
    GstBin *bin, GstElement *element);
#define GST_TRACER_BIN_REMOVE_PRE(bin, element) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_BIN_REMOVE_PRE), \
    GstTracerHookBinRemovePre, (GST_TRACER_ARGS, bin, element)); \
}G_STMT_END

/**
 * GstTracerHookBinRemovePost:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @bin: the bin
 * @result: the result of gst_bin_remove()
 *
 * Post-hook for gst_bin_remove() named "bin-remove-post".
 */
typedef void (*GstTracerHookBinRemovePost) (GObject *self, GstClockTime ts,
    GstBin *bin, gboolean result);
#define GST_TRACER_BIN_REMOVE_POST(bin, result) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_BIN_REMOVE_POST), \
    GstTracerHookBinRemovePost, (GST_TRACER_ARGS, bin, result)); \
}G_STMT_END

/**
 * GstTracerHookPadLinkPre:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @srcpad: the srcpad
 * @sinkpad: the sinkpad
 *
 * Pre-hook for gst_pad_link() named "pad-link-pre".
 */
typedef void (*GstTracerHookPadLinkPre) (GObject *self, GstClockTime ts,
    GstPad *srcpad, GstPad *sinkpad);
#define GST_TRACER_PAD_LINK_PRE(srcpad, sinkpad) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_LINK_PRE), \
    GstTracerHookPadLinkPre, (GST_TRACER_ARGS, srcpad, sinkpad)); \
}G_STMT_END

/**
 * GstTracerHookPadLinkPost:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @srcpad: the srcpad
 * @sinkpad: the sinkpad
 * @result: the result of gst_pad_link()
 *
 * Post-hook for gst_pad_link() named "pad-link-post".
 */
typedef void (*GstTracerHookPadLinkPost) (GObject *self, GstClockTime ts,
    GstPad *srcpad, GstPad *sinkpad, GstPadLinkReturn result);
#define GST_TRACER_PAD_LINK_POST(srcpad, sinkpad, result) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_LINK_POST), \
    GstTracerHookPadLinkPost, (GST_TRACER_ARGS, srcpad, sinkpad, result)); \
}G_STMT_END

/**
 * GstTracerHookPadUnlinkPre:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @srcpad: the srcpad
 * @sinkpad: the sinkpad
 *
 * Pre-hook for gst_pad_unlink() named "pad-unlink-pre".
 */
typedef void (*GstTracerHookPadUnlinkPre) (GObject *self, GstClockTime ts,
    GstPad *srcpad, GstPad *sinkpad);
#define GST_TRACER_PAD_UNLINK_PRE(srcpad, sinkpad) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_UNLINK_PRE), \
    GstTracerHookPadUnlinkPre, (GST_TRACER_ARGS, srcpad, sinkpad)); \
}G_STMT_END

/**
 * GstTracerHookPadUnlinkPost:
 * @self: the tracer instance
 * @ts: the current timestamp
 * @srcpad: the srcpad
 * @sinkpad: the sinkpad
 * @result: the result of gst_pad_push()
 *
 * Post-hook for gst_pad_unlink() named "pad-unlink-post".
 */
typedef void (*GstTracerHookPadUnlinkPost) (GObject *self, GstClockTime ts,
    GstPad *srcpad, GstPad *sinkpad, gboolean result);
#define GST_TRACER_PAD_UNLINK_POST(srcpad, sinkpad, result) G_STMT_START{ \
  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_UNLINK_POST), \
    GstTracerHookPadUnlinkPost, (GST_TRACER_ARGS, srcpad, sinkpad, result)); \
}G_STMT_END

#else /* !GST_DISABLE_GST_TRACER_HOOKS */

#define GST_TRACER_PAD_PUSH_PRE(pad, buffer)
#define GST_TRACER_PAD_PUSH_POST(pad, res)
#define GST_TRACER_PAD_PUSH_LIST_PRE(pad, list)
#define GST_TRACER_PAD_PUSH_LIST_POST(pad, res)
#define GST_TRACER_PAD_PULL_RANGE_PRE(pad, offset, size)
#define GST_TRACER_PAD_PULL_RANGE_POST(pad, buffer, res)
#define GST_TRACER_PAD_PUSH_EVENT_PRE(pad, event)
#define GST_TRACER_PAD_PUSH_EVENT_POST(pad, res)
#define GST_TRACER_PAD_QUERY_PRE(pad, query)
#define GST_TRACER_PAD_QUERY_POST(pad, query, res)
#define GST_TRACER_ELEMENT_POST_MESSAGE_PRE(element, message)
#define GST_TRACER_ELEMENT_POST_MESSAGE_POST(element, res)
#define GST_TRACER_ELEMENT_QUERY_PRE(element, query)
#define GST_TRACER_ELEMENT_QUERY_POST(element, query, res)
#define GST_TRACER_ELEMENT_NEW(element)
#define GST_TRACER_ELEMENT_ADD_PAD(element, pad)
#define GST_TRACER_ELEMENT_REMOVE_PAD(element, pad)
#define GST_TRACER_ELEMENT_CHANGE_STATE_PRE(element, transition)
#define GST_TRACER_ELEMENT_CHANGE_STATE_POST(element, transition, res)
#define GST_TRACER_BIN_ADD_PRE(bin, element)
#define GST_TRACER_BIN_ADD_POST(bin, element, res)
#define GST_TRACER_BIN_REMOVE_PRE(bin, element)
#define GST_TRACER_BIN_REMOVE_POST(bin, res)
#define GST_TRACER_PAD_LINK_PRE(srcpad, sinkpad)
#define GST_TRACER_PAD_LINK_POST(srcpad, sinkpad, res)
#define GST_TRACER_PAD_UNLINK_PRE(srcpad, sinkpad)
#define GST_TRACER_PAD_UNLINK_POST(srcpad, sinkpad, res)

#endif /* GST_DISABLE_GST_TRACER_HOOKS */

G_END_DECLS

#endif /* __GST_TRACER_UTILS_H__ */

