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