tracer: split into tracer and tracerutils
[platform/upstream/gstreamer.git] / gst / gsttracerutils.h
1 /* GStreamer
2  * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
3  *
4  * gsttracerutils.h: tracing subsystem
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public
17  * License along with this library; if not, write to the
18  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
19  * Boston, MA 02110-1301, USA.
20  */
21
22
23 #ifndef __GST_TRACER_UTILS_H__
24 #define __GST_TRACER_UTILS_H__
25
26 #include <glib.h>
27 #include <glib-object.h>
28 #include <gst/gstconfig.h>
29 #include <gst/gstbin.h>
30
31 G_BEGIN_DECLS
32
33 #ifndef GST_DISABLE_GST_DEBUG
34
35 /* hook flags and ids */
36
37 typedef enum
38 {
39   GST_TRACER_HOOK_NONE      = 0,
40   GST_TRACER_HOOK_BUFFERS   = (1 << 0),
41   GST_TRACER_HOOK_EVENTS    = (1 << 1),
42   GST_TRACER_HOOK_MESSAGES  = (1 << 2),
43   GST_TRACER_HOOK_QUERIES   = (1 << 3),
44   GST_TRACER_HOOK_TOPOLOGY  = (1 << 4),
45   /*
46   GST_TRACER_HOOK_TIMER
47   */
48   GST_TRACER_HOOK_ALL       = (1 << 5) - 1
49 } GstTracerHook;
50
51 typedef enum
52 {
53   GST_TRACER_HOOK_ID_BUFFERS = 0,
54   GST_TRACER_HOOK_ID_EVENTS,
55   GST_TRACER_HOOK_ID_MESSAGES,
56   GST_TRACER_HOOK_ID_QUERIES,
57   GST_TRACER_HOOK_ID_TOPLOGY,
58   /*
59   GST_TRACER_HOOK_ID_TIMER
60   */
61   GST_TRACER_HOOK_ID_LAST
62 } GstTracerHookId;
63
64 typedef enum
65 {
66   GST_TRACER_MESSAGE_ID_PAD_PUSH_PRE = 0,
67   GST_TRACER_MESSAGE_ID_PAD_PUSH_POST,
68   GST_TRACER_MESSAGE_ID_PAD_PUSH_LIST_PRE,
69   GST_TRACER_MESSAGE_ID_PAD_PUSH_LIST_POST,
70   GST_TRACER_MESSAGE_ID_PAD_PULL_RANGE_PRE,
71   GST_TRACER_MESSAGE_ID_PAD_PULL_RANGE_POST,
72   GST_TRACER_MESSAGE_ID_PAD_PUSH_EVENT_PRE,
73   GST_TRACER_MESSAGE_ID_PAD_PUSH_EVENT_POST,
74   GST_TRACER_MESSAGE_ID_ELEMENT_POST_MESSAGE_PRE,
75   GST_TRACER_MESSAGE_ID_ELEMENT_POST_MESSAGE_POST,
76   GST_TRACER_MESSAGE_ID_ELEMENT_QUERY_PRE,
77   GST_TRACER_MESSAGE_ID_ELEMENT_QUERY_POST,
78   GST_TRACER_MESSAGE_ID_LAST
79 } GstTracerMessageId;
80
81 /* tracing hooks */
82
83 void _priv_gst_tracer_init (void);
84 void _priv_gst_tracer_deinit (void);
85
86 /* tracing modules */
87
88 gboolean gst_tracer_register (GstPlugin * plugin, const gchar * name, GType type);
89
90 /* tracing helpers */
91
92 void gst_tracer_dispatch (GstTracerHookId hid, GstTracerMessageId mid, ...);
93
94 /* tracing module helpers */
95
96 void gst_tracer_log_trace (GstStructure * s);
97
98 extern gboolean _priv_tracer_enabled;
99 extern GList *_priv_tracers[GST_TRACER_HOOK_ID_LAST];
100
101 #define GST_TRACER_IS_ENABLED(id) \
102   (_priv_tracer_enabled && (_priv_tracers[id] != NULL))
103
104 #define GST_TRACER_TS \
105   GST_CLOCK_DIFF (_priv_gst_info_start_time, gst_util_get_timestamp ())
106
107 /* tracing hooks */
108
109 #define GST_TRACER_PAD_PUSH_PRE(pad, buffer) G_STMT_START{ \
110   if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_BUFFERS)) { \
111     gst_tracer_dispatch (GST_TRACER_HOOK_ID_BUFFERS, \
112         GST_TRACER_MESSAGE_ID_PAD_PUSH_PRE, GST_TRACER_TS, \
113         pad, buffer); \
114   } \
115 }G_STMT_END
116
117 #define GST_TRACER_PAD_PUSH_POST(pad, res) G_STMT_START{ \
118   if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_BUFFERS)) { \
119     gst_tracer_dispatch (GST_TRACER_HOOK_ID_BUFFERS, \
120         GST_TRACER_MESSAGE_ID_PAD_PUSH_POST, GST_TRACER_TS, \
121         pad, res); \
122   } \
123 }G_STMT_END
124
125 #define GST_TRACER_PAD_PUSH_LIST_PRE(pad, list) G_STMT_START{ \
126   if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_BUFFERS)) { \
127     gst_tracer_dispatch (GST_TRACER_HOOK_ID_BUFFERS, \
128         GST_TRACER_MESSAGE_ID_PAD_PUSH_LIST_PRE, GST_TRACER_TS, \
129         pad, list); \
130   } \
131 }G_STMT_END
132
133 #define GST_TRACER_PAD_PUSH_LIST_POST(pad, res) G_STMT_START{ \
134   if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_BUFFERS)) { \
135     gst_tracer_dispatch (GST_TRACER_HOOK_ID_BUFFERS, \
136         GST_TRACER_MESSAGE_ID_PAD_PUSH_LIST_POST, GST_TRACER_TS, \
137         pad, res); \
138   } \
139 }G_STMT_END
140
141 #define GST_TRACER_PAD_PULL_RANGE_PRE(pad, offset, size) G_STMT_START{ \
142   if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_BUFFERS)) { \
143     gst_tracer_dispatch (GST_TRACER_HOOK_ID_BUFFERS, \
144         GST_TRACER_MESSAGE_ID_PAD_PULL_RANGE_PRE, GST_TRACER_TS, \
145         pad, offset, size); \
146   } \
147 }G_STMT_END
148
149 #define GST_TRACER_PAD_PULL_RANGE_POST(pad, buffer, res) G_STMT_START{ \
150   if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_BUFFERS)) { \
151     gst_tracer_dispatch (GST_TRACER_HOOK_ID_BUFFERS, \
152         GST_TRACER_MESSAGE_ID_PAD_PULL_RANGE_POST, GST_TRACER_TS, \
153         pad, buffer, res); \
154   } \
155 }G_STMT_END
156
157 #define GST_TRACER_PAD_PUSH_EVENT_PRE(pad, event) G_STMT_START{ \
158   if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_EVENTS)) { \
159     gst_tracer_dispatch (GST_TRACER_HOOK_ID_EVENTS, \
160         GST_TRACER_MESSAGE_ID_PAD_PUSH_EVENT_PRE, GST_TRACER_TS, \
161         pad, event); \
162   } \
163 }G_STMT_END
164
165 #define GST_TRACER_PAD_PUSH_EVENT_POST(pad, res) G_STMT_START{ \
166   if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_EVENTS)) { \
167     gst_tracer_dispatch (GST_TRACER_HOOK_ID_EVENTS, \
168         GST_TRACER_MESSAGE_ID_PAD_PUSH_EVENT_POST, GST_TRACER_TS, \
169         pad, res); \
170   } \
171 }G_STMT_END
172
173 #define GST_TRACER_ELEMENT_POST_MESSAGE_PRE(element, message) G_STMT_START{ \
174   if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_MESSAGES)) { \
175     gst_tracer_dispatch (GST_TRACER_HOOK_ID_MESSAGES, \
176         GST_TRACER_MESSAGE_ID_ELEMENT_POST_MESSAGE_PRE, GST_TRACER_TS, \
177         element, message); \
178   } \
179 }G_STMT_END
180
181 #define GST_TRACER_ELEMENT_POST_MESSAGE_POST(element, res) G_STMT_START{ \
182   if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_MESSAGES)) { \
183     gst_tracer_dispatch (GST_TRACER_HOOK_ID_MESSAGES, \
184         GST_TRACER_MESSAGE_ID_ELEMENT_POST_MESSAGE_POST, GST_TRACER_TS, \
185         element, res); \
186   } \
187 }G_STMT_END
188
189 #define GST_TRACER_ELEMENT_QUERY_PRE(element, query) G_STMT_START{ \
190   if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_QUERIES)) { \
191     gst_tracer_dispatch (GST_TRACER_HOOK_ID_QUERIES, \
192         GST_TRACER_MESSAGE_ID_ELEMENT_QUERY_PRE, GST_TRACER_TS, \
193         element, query); \
194   } \
195 }G_STMT_END
196
197 #define GST_TRACER_ELEMENT_QUERY_POST(element, res) G_STMT_START{ \
198   if (GST_TRACER_IS_ENABLED(GST_TRACER_HOOK_ID_QUERIES)) { \
199     gst_tracer_dispatch (GST_TRACER_HOOK_ID_QUERIES, \
200         GST_TRACER_MESSAGE_ID_ELEMENT_QUERY_POST, GST_TRACER_TS, \
201         element, res); \
202   } \
203 }G_STMT_END
204
205 #else /* !GST_DISABLE_GST_DEBUG */
206
207 #define GST_TRACER_PAD_PUSH_PRE(pad, buffer)
208 #define GST_TRACER_PAD_PUSH_POST(pad, res)
209 #define GST_TRACER_PAD_PUSH_LIST_PRE(pad, list)
210 #define GST_TRACER_PAD_PUSH_LIST_POST(pad, res)
211 #define GST_TRACER_PAD_PULL_RANGE_PRE(pad, offset, size)
212 #define GST_TRACER_PAD_PULL_RANGE_POST(pad, buffer, res)
213 #define GST_TRACER_PAD_PUSH_EVENT_PRE(pad, event)
214 #define GST_TRACER_PAD_PUSH_EVENT_POST(pad, res)
215 #define GST_TRACER_ELEMENT_POST_MESSAGE_PRE(element, message)
216 #define GST_TRACER_ELEMENT_POST_MESSAGE_POST(element, res)
217 #define GST_TRACER_ELEMENT_QUERY_PRE(element, query)
218 #define GST_TRACER_ELEMENT_QUERY_POST(element, res)
219
220 #endif /* GST_DISABLE_GST_DEBUG */
221
222 G_END_DECLS
223
224 #endif /* __GST_TRACER_UTILS_H__ */
225