harness: Take ownership of floating references (pads, elements) passed to the harness
[platform/upstream/gstreamer.git] / plugins / tracers / gstlog.c
1 /* GStreamer
2  * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
3  *
4  * gstlog.c: tracing module that logs events
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  * SECTION:element-logtracer
23  * @short_description: log hook event
24  *
25  * A tracing module that logs all data from all hooks.
26  */
27
28 #ifdef HAVE_CONFIG_H
29 #  include "config.h"
30 #endif
31
32 #include "gstlog.h"
33
34 GST_DEBUG_CATEGORY_STATIC (gst_log_debug);
35 #define GST_CAT_DEFAULT gst_log_debug
36 GST_DEBUG_CATEGORY_STATIC (GST_CAT_BIN);
37 GST_DEBUG_CATEGORY_STATIC (GST_CAT_BUFFER);
38 GST_DEBUG_CATEGORY_STATIC (GST_CAT_BUFFER_LIST);
39 GST_DEBUG_CATEGORY_STATIC (GST_CAT_EVENT);
40 GST_DEBUG_CATEGORY_STATIC (GST_CAT_MESSAGE);
41 GST_DEBUG_CATEGORY_STATIC (GST_CAT_QUERY);
42 GST_DEBUG_CATEGORY_STATIC (GST_CAT_STATES);
43 GST_DEBUG_CATEGORY_STATIC (GST_CAT_PADS);
44 GST_DEBUG_CATEGORY_STATIC (GST_CAT_ELEMENT_PADS);
45 GST_DEBUG_CATEGORY_STATIC (GST_CAT_ELEMENT_FACTORY);
46
47 #define _do_init \
48     GST_DEBUG_CATEGORY_INIT (gst_log_debug, "log", 0, "log tracer"); \
49     GST_DEBUG_CATEGORY_GET (GST_CAT_BUFFER, "GST_BUFFER"); \
50     GST_DEBUG_CATEGORY_GET (GST_CAT_BUFFER_LIST, "GST_BUFFER_LIST"); \
51     GST_DEBUG_CATEGORY_GET (GST_CAT_EVENT, "GST_EVENT"); \
52     GST_DEBUG_CATEGORY_GET (GST_CAT_MESSAGE, "GST_MESSAGE"); \
53     GST_DEBUG_CATEGORY_GET (GST_CAT_STATES, "GST_STATES"); \
54     GST_DEBUG_CATEGORY_GET (GST_CAT_PADS, "GST_PADS"); \
55     GST_DEBUG_CATEGORY_GET (GST_CAT_ELEMENT_PADS, "GST_ELEMENT_PADS"); \
56     GST_DEBUG_CATEGORY_GET (GST_CAT_ELEMENT_FACTORY, "GST_ELEMENT_FACTORY"); \
57     GST_DEBUG_CATEGORY_GET (GST_CAT_QUERY, "query"); \
58     GST_DEBUG_CATEGORY_GET (GST_CAT_BIN, "bin");
59 #define gst_log_tracer_parent_class parent_class
60 G_DEFINE_TYPE_WITH_CODE (GstLogTracer, gst_log_tracer, GST_TYPE_TRACER,
61     _do_init);
62
63 static void
64 do_log (GstDebugCategory * cat, const char *func, GObject * obj,
65     const char *fmt, ...)
66 {
67   va_list var_args;
68
69   va_start (var_args, fmt);
70   gst_debug_log_valist (cat, GST_LEVEL_TRACE, "", func, 0, obj, fmt, var_args);
71   va_end (var_args);
72 }
73
74 static void
75 do_push_buffer_pre (GstTracer * self, guint64 ts, GstPad * pad,
76     GstBuffer * buffer)
77 {
78   do_log (GST_CAT_BUFFER, GST_FUNCTION, (GObject *) pad,
79       "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", buffer=%" GST_PTR_FORMAT,
80       GST_TIME_ARGS (ts), pad, buffer);
81 }
82
83 static void
84 do_push_buffer_post (GstTracer * self, guint64 ts, GstPad * pad,
85     GstFlowReturn res)
86 {
87   do_log (GST_CAT_BUFFER, GST_FUNCTION, (GObject *) pad,
88       "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", res=%d",
89       GST_TIME_ARGS (ts), pad, res);
90 }
91
92 static void
93 do_push_buffer_list_pre (GstTracer * self, guint64 ts, GstPad * pad,
94     GstBufferList * list)
95 {
96   do_log (GST_CAT_BUFFER_LIST, GST_FUNCTION, (GObject *) pad,
97       "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", list=%p",
98       GST_TIME_ARGS (ts), pad, list);
99 }
100
101 static void
102 do_push_buffer_list_post (GstTracer * self, guint64 ts, GstPad * pad,
103     GstFlowReturn res)
104 {
105   do_log (GST_CAT_BUFFER_LIST, GST_FUNCTION, (GObject *) pad,
106       "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", res=%d",
107       GST_TIME_ARGS (ts), pad, res);
108 }
109
110 static void
111 do_pull_range_pre (GstTracer * self, guint64 ts, GstPad * pad, guint64 offset,
112     guint size)
113 {
114   do_log (GST_CAT_BUFFER, GST_FUNCTION, (GObject *) pad,
115       "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", offset=%" G_GUINT64_FORMAT
116       ", size=%u", GST_TIME_ARGS (ts), pad, offset, size);
117 }
118
119 static void
120 do_pull_range_post (GstTracer * self, guint64 ts, GstPad * pad,
121     GstBuffer * buffer, GstFlowReturn res)
122 {
123   do_log (GST_CAT_BUFFER, GST_FUNCTION, (GObject *) pad,
124       "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", buffer=%" GST_PTR_FORMAT
125       ", res=%d", GST_TIME_ARGS (ts), pad, buffer, res);
126 }
127
128 static void
129 do_push_event_pre (GstTracer * self, guint64 ts, GstPad * pad, GstEvent * event)
130 {
131   do_log (GST_CAT_EVENT, GST_FUNCTION, (GObject *) pad,
132       "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", event=%" GST_PTR_FORMAT,
133       GST_TIME_ARGS (ts), pad, event);
134 }
135
136 static void
137 do_push_event_post (GstTracer * self, guint64 ts, GstPad * pad, gboolean res)
138 {
139   do_log (GST_CAT_EVENT, GST_FUNCTION, (GObject *) pad,
140       "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", res=%d",
141       GST_TIME_ARGS (ts), pad, res);
142 }
143
144 static void
145 do_pad_query_pre (GstTracer * self, guint64 ts, GstPad * pad, GstQuery * query)
146 {
147   do_log (GST_CAT_QUERY, GST_FUNCTION, (GObject *) pad,
148       "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", query=%"
149       GST_PTR_FORMAT, GST_TIME_ARGS (ts), pad, query);
150 }
151
152 static void
153 do_pad_query_post (GstTracer * self, guint64 ts, GstPad * pad, GstQuery * query,
154     gboolean res)
155 {
156   do_log (GST_CAT_QUERY, GST_FUNCTION, (GObject *) pad,
157       "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", query=%" GST_PTR_FORMAT
158       ", res=%d", GST_TIME_ARGS (ts), pad, query, res);
159 }
160
161 static void
162 do_post_message_pre (GstTracer * self, guint64 ts, GstElement * elem,
163     GstMessage * msg)
164 {
165   do_log (GST_CAT_MESSAGE, GST_FUNCTION, (GObject *) elem,
166       "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", message=%"
167       GST_PTR_FORMAT, GST_TIME_ARGS (ts), elem, msg);
168 }
169
170 static void
171 do_post_message_post (GstTracer * self, guint64 ts, GstElement * elem,
172     gboolean res)
173 {
174   do_log (GST_CAT_MESSAGE, GST_FUNCTION, (GObject *) elem,
175       "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", res=%d",
176       GST_TIME_ARGS (ts), elem, res);
177 }
178
179 static void
180 do_element_query_pre (GstTracer * self, guint64 ts, GstElement * elem,
181     GstQuery * query)
182 {
183   do_log (GST_CAT_QUERY, GST_FUNCTION, (GObject *) elem,
184       "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", query=%"
185       GST_PTR_FORMAT, GST_TIME_ARGS (ts), elem, query);
186 }
187
188 static void
189 do_element_query_post (GstTracer * self, guint64 ts, GstElement * elem,
190     GstQuery * query, gboolean res)
191 {
192   do_log (GST_CAT_QUERY, GST_FUNCTION, (GObject *) elem,
193       "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", query=%"
194       GST_PTR_FORMAT ", res=%d", GST_TIME_ARGS (ts), elem, query, res);
195 }
196
197 static void
198 do_element_new (GstTracer * self, guint64 ts, GstElement * elem)
199 {
200   do_log (GST_CAT_ELEMENT_FACTORY, GST_FUNCTION, (GObject *) elem,
201       "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT,
202       GST_TIME_ARGS (ts), elem);
203 }
204
205 static void
206 do_element_add_pad (GstTracer * self, guint64 ts, GstElement * elem,
207     GstPad * pad)
208 {
209   do_log (GST_CAT_ELEMENT_PADS, GST_FUNCTION, (GObject *) elem,
210       "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", pad=%" GST_PTR_FORMAT,
211       GST_TIME_ARGS (ts), elem, pad);
212 }
213
214 static void
215 do_element_remove_pad (GstTracer * self, guint64 ts, GstElement * elem,
216     GstPad * pad)
217 {
218   do_log (GST_CAT_ELEMENT_PADS, GST_FUNCTION, (GObject *) elem,
219       "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", pad=%" GST_PTR_FORMAT,
220       GST_TIME_ARGS (ts), elem, pad);
221 }
222
223 static void
224 do_element_change_state_pre (GstTracer * self, guint64 ts, GstElement * elem,
225     GstStateChange change)
226 {
227   do_log (GST_CAT_STATES, GST_FUNCTION, (GObject *) elem,
228       "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", change=%d",
229       GST_TIME_ARGS (ts), elem, (gint) change);
230 }
231
232 static void
233 do_element_change_state_post (GstTracer * self, guint64 ts, GstElement * elem,
234     GstStateChange change, GstStateChangeReturn res)
235 {
236   do_log (GST_CAT_STATES, GST_FUNCTION, (GObject *) elem,
237       "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", change=%d, res=%d",
238       GST_TIME_ARGS (ts), elem, (gint) change, (gint) res);
239 }
240
241 static void
242 do_bin_add_pre (GstTracer * self, guint64 ts, GstBin * bin, GstElement * elem)
243 {
244   do_log (GST_CAT_BIN, GST_FUNCTION, (GObject *) bin,
245       "%" GST_TIME_FORMAT ", bin=%" GST_PTR_FORMAT ", element=%" GST_PTR_FORMAT,
246       GST_TIME_ARGS (ts), bin, elem);
247 }
248
249 static void
250 do_bin_add_post (GstTracer * self, guint64 ts, GstBin * bin, GstElement * elem,
251     gboolean res)
252 {
253   do_log (GST_CAT_BIN, GST_FUNCTION, (GObject *) bin,
254       "%" GST_TIME_FORMAT ", bin=%" GST_PTR_FORMAT ", element=%" GST_PTR_FORMAT
255       ", res=%d", GST_TIME_ARGS (ts), bin, elem, res);
256 }
257
258 static void
259 do_bin_remove_pre (GstTracer * self, guint64 ts, GstBin * bin,
260     GstElement * elem)
261 {
262   do_log (GST_CAT_BIN, GST_FUNCTION, (GObject *) bin,
263       "%" GST_TIME_FORMAT ", bin=%" GST_PTR_FORMAT ", element=%" GST_PTR_FORMAT,
264       GST_TIME_ARGS (ts), bin, elem);
265 }
266
267 static void
268 do_bin_remove_post (GstTracer * self, guint64 ts, GstBin * bin, gboolean res)
269 {
270   do_log (GST_CAT_BIN, GST_FUNCTION, (GObject *) bin,
271       "%" GST_TIME_FORMAT ", bin=%" GST_PTR_FORMAT ", res=%d",
272       GST_TIME_ARGS (ts), bin, res);
273 }
274
275 static void
276 do_pad_link_pre (GstTracer * self, guint64 ts, GstPad * src, GstPad * sink)
277 {
278   do_log (GST_CAT_PADS, GST_FUNCTION, (GObject *) src,
279       "%" GST_TIME_FORMAT ", src=%" GST_PTR_FORMAT ", sink=%" GST_PTR_FORMAT,
280       GST_TIME_ARGS (ts), src, sink);
281 }
282
283 static void
284 do_pad_link_post (GstTracer * self, guint64 ts, GstPad * src, GstPad * sink,
285     GstPadLinkReturn res)
286 {
287   do_log (GST_CAT_PADS, GST_FUNCTION, (GObject *) src,
288       "%" GST_TIME_FORMAT ", src=%" GST_PTR_FORMAT ", sink=%" GST_PTR_FORMAT
289       ", res=%d", GST_TIME_ARGS (ts), src, sink, (gint) res);
290 }
291
292 static void
293 do_pad_unlink_pre (GstTracer * self, guint64 ts, GstPad * src,
294     GstElement * sink)
295 {
296   do_log (GST_CAT_PADS, GST_FUNCTION, (GObject *) src,
297       "%" GST_TIME_FORMAT ", src=%" GST_PTR_FORMAT ", sink=%" GST_PTR_FORMAT,
298       GST_TIME_ARGS (ts), src, sink);
299 }
300
301 static void
302 do_pad_unlink_post (GstTracer * self, guint64 ts, GstPad * src,
303     GstElement * sink, gboolean res)
304 {
305   do_log (GST_CAT_PADS, GST_FUNCTION, (GObject *) src,
306       "%" GST_TIME_FORMAT ", src=%" GST_PTR_FORMAT ", sink=%" GST_PTR_FORMAT
307       ", res=%d", GST_TIME_ARGS (ts), src, sink, (gint) res);
308 }
309
310 /* tracer class */
311
312 static void
313 gst_log_tracer_class_init (GstLogTracerClass * klass)
314 {
315 }
316
317 static void
318 gst_log_tracer_init (GstLogTracer * self)
319 {
320   GstTracer *tracer = GST_TRACER (self);
321
322   gst_tracing_register_hook (tracer, "pad-push-pre",
323       G_CALLBACK (do_push_buffer_pre));
324   gst_tracing_register_hook (tracer, "pad-push-post",
325       G_CALLBACK (do_push_buffer_post));
326   gst_tracing_register_hook (tracer, "pad-push-list-pre",
327       G_CALLBACK (do_push_buffer_list_pre));
328   gst_tracing_register_hook (tracer, "pad-push-list-post",
329       G_CALLBACK (do_push_buffer_list_post));
330   gst_tracing_register_hook (tracer, "pad-pull-range-pre",
331       G_CALLBACK (do_pull_range_pre));
332   gst_tracing_register_hook (tracer, "pad-pull-range-post",
333       G_CALLBACK (do_pull_range_post));
334   gst_tracing_register_hook (tracer, "pad-push-event-pre",
335       G_CALLBACK (do_push_event_pre));
336   gst_tracing_register_hook (tracer, "pad-push-event-post",
337       G_CALLBACK (do_push_event_post));
338   gst_tracing_register_hook (tracer, "pad-query-pre",
339       G_CALLBACK (do_pad_query_pre));
340   gst_tracing_register_hook (tracer, "pad-query-post",
341       G_CALLBACK (do_pad_query_post));
342   gst_tracing_register_hook (tracer, "element-post-message-pre",
343       G_CALLBACK (do_post_message_pre));
344   gst_tracing_register_hook (tracer, "element-post-message-post",
345       G_CALLBACK (do_post_message_post));
346   gst_tracing_register_hook (tracer, "element-query-pre",
347       G_CALLBACK (do_element_query_pre));
348   gst_tracing_register_hook (tracer, "element-query-post",
349       G_CALLBACK (do_element_query_post));
350   gst_tracing_register_hook (tracer, "element-new",
351       G_CALLBACK (do_element_new));
352   gst_tracing_register_hook (tracer, "element-add-pad",
353       G_CALLBACK (do_element_add_pad));
354   gst_tracing_register_hook (tracer, "element-remove-pad",
355       G_CALLBACK (do_element_remove_pad));
356   gst_tracing_register_hook (tracer, "element-change-state-pre",
357       G_CALLBACK (do_element_change_state_pre));
358   gst_tracing_register_hook (tracer, "element-change-state-post",
359       G_CALLBACK (do_element_change_state_post));
360   gst_tracing_register_hook (tracer, "bin-add-pre",
361       G_CALLBACK (do_bin_add_pre));
362   gst_tracing_register_hook (tracer, "bin-add-post",
363       G_CALLBACK (do_bin_add_post));
364   gst_tracing_register_hook (tracer, "bin-remove-pre",
365       G_CALLBACK (do_bin_remove_pre));
366   gst_tracing_register_hook (tracer, "bin-remove-post",
367       G_CALLBACK (do_bin_remove_post));
368   gst_tracing_register_hook (tracer, "pad-link-pre",
369       G_CALLBACK (do_pad_link_pre));
370   gst_tracing_register_hook (tracer, "pad-link-post",
371       G_CALLBACK (do_pad_link_post));
372   gst_tracing_register_hook (tracer, "pad-unlink-pre",
373       G_CALLBACK (do_pad_unlink_pre));
374   gst_tracing_register_hook (tracer, "pad-unlink-post",
375       G_CALLBACK (do_pad_unlink_post));
376 }