gstreamer/plugins/tracers/gstlog.c
Nicolas Dufresne e1be065293 tracers: log: Fix post query trace
The post tracer hooks have a GstQuery argument which was truncated from
the trace. As the post hook is the one that contains the useful data,
this bug was hiding the important information from that trace.
2018-11-06 15:41:01 -05:00

377 lines
13 KiB
C

/* GStreamer
* Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
*
* gstlog.c: tracing module that logs events
*
* 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.
*/
/**
* SECTION:element-logtracer
* @short_description: log hook event
*
* A tracing module that logs all data from all hooks.
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "gstlog.h"
GST_DEBUG_CATEGORY_STATIC (gst_log_debug);
#define GST_CAT_DEFAULT gst_log_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_BIN);
GST_DEBUG_CATEGORY_STATIC (GST_CAT_BUFFER);
GST_DEBUG_CATEGORY_STATIC (GST_CAT_BUFFER_LIST);
GST_DEBUG_CATEGORY_STATIC (GST_CAT_EVENT);
GST_DEBUG_CATEGORY_STATIC (GST_CAT_MESSAGE);
GST_DEBUG_CATEGORY_STATIC (GST_CAT_QUERY);
GST_DEBUG_CATEGORY_STATIC (GST_CAT_STATES);
GST_DEBUG_CATEGORY_STATIC (GST_CAT_PADS);
GST_DEBUG_CATEGORY_STATIC (GST_CAT_ELEMENT_PADS);
GST_DEBUG_CATEGORY_STATIC (GST_CAT_ELEMENT_FACTORY);
#define _do_init \
GST_DEBUG_CATEGORY_INIT (gst_log_debug, "log", 0, "log tracer"); \
GST_DEBUG_CATEGORY_GET (GST_CAT_BUFFER, "GST_BUFFER"); \
GST_DEBUG_CATEGORY_GET (GST_CAT_BUFFER_LIST, "GST_BUFFER_LIST"); \
GST_DEBUG_CATEGORY_GET (GST_CAT_EVENT, "GST_EVENT"); \
GST_DEBUG_CATEGORY_GET (GST_CAT_MESSAGE, "GST_MESSAGE"); \
GST_DEBUG_CATEGORY_GET (GST_CAT_STATES, "GST_STATES"); \
GST_DEBUG_CATEGORY_GET (GST_CAT_PADS, "GST_PADS"); \
GST_DEBUG_CATEGORY_GET (GST_CAT_ELEMENT_PADS, "GST_ELEMENT_PADS"); \
GST_DEBUG_CATEGORY_GET (GST_CAT_ELEMENT_FACTORY, "GST_ELEMENT_FACTORY"); \
GST_DEBUG_CATEGORY_GET (GST_CAT_QUERY, "query"); \
GST_DEBUG_CATEGORY_GET (GST_CAT_BIN, "bin");
#define gst_log_tracer_parent_class parent_class
G_DEFINE_TYPE_WITH_CODE (GstLogTracer, gst_log_tracer, GST_TYPE_TRACER,
_do_init);
static void
do_log (GstDebugCategory * cat, const char *func, GObject * obj,
const char *fmt, ...)
{
va_list var_args;
va_start (var_args, fmt);
gst_debug_log_valist (cat, GST_LEVEL_TRACE, "", func, 0, obj, fmt, var_args);
va_end (var_args);
}
static void
do_push_buffer_pre (GstTracer * self, guint64 ts, GstPad * pad,
GstBuffer * buffer)
{
do_log (GST_CAT_BUFFER, GST_FUNCTION, (GObject *) pad,
"%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", buffer=%" GST_PTR_FORMAT,
GST_TIME_ARGS (ts), pad, buffer);
}
static void
do_push_buffer_post (GstTracer * self, guint64 ts, GstPad * pad,
GstFlowReturn res)
{
do_log (GST_CAT_BUFFER, GST_FUNCTION, (GObject *) pad,
"%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", res=%d",
GST_TIME_ARGS (ts), pad, res);
}
static void
do_push_buffer_list_pre (GstTracer * self, guint64 ts, GstPad * pad,
GstBufferList * list)
{
do_log (GST_CAT_BUFFER_LIST, GST_FUNCTION, (GObject *) pad,
"%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", list=%p",
GST_TIME_ARGS (ts), pad, list);
}
static void
do_push_buffer_list_post (GstTracer * self, guint64 ts, GstPad * pad,
GstFlowReturn res)
{
do_log (GST_CAT_BUFFER_LIST, GST_FUNCTION, (GObject *) pad,
"%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", res=%d",
GST_TIME_ARGS (ts), pad, res);
}
static void
do_pull_range_pre (GstTracer * self, guint64 ts, GstPad * pad, guint64 offset,
guint size)
{
do_log (GST_CAT_BUFFER, GST_FUNCTION, (GObject *) pad,
"%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", offset=%" G_GUINT64_FORMAT
", size=%u", GST_TIME_ARGS (ts), pad, offset, size);
}
static void
do_pull_range_post (GstTracer * self, guint64 ts, GstPad * pad,
GstBuffer * buffer, GstFlowReturn res)
{
do_log (GST_CAT_BUFFER, GST_FUNCTION, (GObject *) pad,
"%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", buffer=%" GST_PTR_FORMAT
", res=%d", GST_TIME_ARGS (ts), pad, buffer, res);
}
static void
do_push_event_pre (GstTracer * self, guint64 ts, GstPad * pad, GstEvent * event)
{
do_log (GST_CAT_EVENT, GST_FUNCTION, (GObject *) pad,
"%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", event=%" GST_PTR_FORMAT,
GST_TIME_ARGS (ts), pad, event);
}
static void
do_push_event_post (GstTracer * self, guint64 ts, GstPad * pad, gboolean res)
{
do_log (GST_CAT_EVENT, GST_FUNCTION, (GObject *) pad,
"%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", res=%d",
GST_TIME_ARGS (ts), pad, res);
}
static void
do_pad_query_pre (GstTracer * self, guint64 ts, GstPad * pad, GstQuery * query)
{
do_log (GST_CAT_QUERY, GST_FUNCTION, (GObject *) pad,
"%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", query=%"
GST_PTR_FORMAT, GST_TIME_ARGS (ts), pad, query);
}
static void
do_pad_query_post (GstTracer * self, guint64 ts, GstPad * pad, GstQuery * query,
gboolean res)
{
do_log (GST_CAT_QUERY, GST_FUNCTION, (GObject *) pad,
"%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", query=%" GST_PTR_FORMAT
", res=%d", GST_TIME_ARGS (ts), pad, query, res);
}
static void
do_post_message_pre (GstTracer * self, guint64 ts, GstElement * elem,
GstMessage * msg)
{
do_log (GST_CAT_MESSAGE, GST_FUNCTION, (GObject *) elem,
"%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", message=%"
GST_PTR_FORMAT, GST_TIME_ARGS (ts), elem, msg);
}
static void
do_post_message_post (GstTracer * self, guint64 ts, GstElement * elem,
gboolean res)
{
do_log (GST_CAT_MESSAGE, GST_FUNCTION, (GObject *) elem,
"%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", res=%d",
GST_TIME_ARGS (ts), elem, res);
}
static void
do_element_query_pre (GstTracer * self, guint64 ts, GstElement * elem,
GstQuery * query)
{
do_log (GST_CAT_QUERY, GST_FUNCTION, (GObject *) elem,
"%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", query=%"
GST_PTR_FORMAT, GST_TIME_ARGS (ts), elem, query);
}
static void
do_element_query_post (GstTracer * self, guint64 ts, GstElement * elem,
GstQuery * query, gboolean res)
{
do_log (GST_CAT_QUERY, GST_FUNCTION, (GObject *) elem,
"%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", query=%"
GST_PTR_FORMAT ", res=%d", GST_TIME_ARGS (ts), elem, query, res);
}
static void
do_element_new (GstTracer * self, guint64 ts, GstElement * elem)
{
do_log (GST_CAT_ELEMENT_FACTORY, GST_FUNCTION, (GObject *) elem,
"%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT,
GST_TIME_ARGS (ts), elem);
}
static void
do_element_add_pad (GstTracer * self, guint64 ts, GstElement * elem,
GstPad * pad)
{
do_log (GST_CAT_ELEMENT_PADS, GST_FUNCTION, (GObject *) elem,
"%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", pad=%" GST_PTR_FORMAT,
GST_TIME_ARGS (ts), elem, pad);
}
static void
do_element_remove_pad (GstTracer * self, guint64 ts, GstElement * elem,
GstPad * pad)
{
do_log (GST_CAT_ELEMENT_PADS, GST_FUNCTION, (GObject *) elem,
"%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", pad=%" GST_PTR_FORMAT,
GST_TIME_ARGS (ts), elem, pad);
}
static void
do_element_change_state_pre (GstTracer * self, guint64 ts, GstElement * elem,
GstStateChange change)
{
do_log (GST_CAT_STATES, GST_FUNCTION, (GObject *) elem,
"%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", change=%d",
GST_TIME_ARGS (ts), elem, (gint) change);
}
static void
do_element_change_state_post (GstTracer * self, guint64 ts, GstElement * elem,
GstStateChange change, GstStateChangeReturn res)
{
do_log (GST_CAT_STATES, GST_FUNCTION, (GObject *) elem,
"%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", change=%d, res=%d",
GST_TIME_ARGS (ts), elem, (gint) change, (gint) res);
}
static void
do_bin_add_pre (GstTracer * self, guint64 ts, GstBin * bin, GstElement * elem)
{
do_log (GST_CAT_BIN, GST_FUNCTION, (GObject *) bin,
"%" GST_TIME_FORMAT ", bin=%" GST_PTR_FORMAT ", element=%" GST_PTR_FORMAT,
GST_TIME_ARGS (ts), bin, elem);
}
static void
do_bin_add_post (GstTracer * self, guint64 ts, GstBin * bin, GstElement * elem,
gboolean res)
{
do_log (GST_CAT_BIN, GST_FUNCTION, (GObject *) bin,
"%" GST_TIME_FORMAT ", bin=%" GST_PTR_FORMAT ", element=%" GST_PTR_FORMAT
", res=%d", GST_TIME_ARGS (ts), bin, elem, res);
}
static void
do_bin_remove_pre (GstTracer * self, guint64 ts, GstBin * bin,
GstElement * elem)
{
do_log (GST_CAT_BIN, GST_FUNCTION, (GObject *) bin,
"%" GST_TIME_FORMAT ", bin=%" GST_PTR_FORMAT ", element=%" GST_PTR_FORMAT,
GST_TIME_ARGS (ts), bin, elem);
}
static void
do_bin_remove_post (GstTracer * self, guint64 ts, GstBin * bin, gboolean res)
{
do_log (GST_CAT_BIN, GST_FUNCTION, (GObject *) bin,
"%" GST_TIME_FORMAT ", bin=%" GST_PTR_FORMAT ", res=%d",
GST_TIME_ARGS (ts), bin, res);
}
static void
do_pad_link_pre (GstTracer * self, guint64 ts, GstPad * src, GstPad * sink)
{
do_log (GST_CAT_PADS, GST_FUNCTION, (GObject *) src,
"%" GST_TIME_FORMAT ", src=%" GST_PTR_FORMAT ", sink=%" GST_PTR_FORMAT,
GST_TIME_ARGS (ts), src, sink);
}
static void
do_pad_link_post (GstTracer * self, guint64 ts, GstPad * src, GstPad * sink,
GstPadLinkReturn res)
{
do_log (GST_CAT_PADS, GST_FUNCTION, (GObject *) src,
"%" GST_TIME_FORMAT ", src=%" GST_PTR_FORMAT ", sink=%" GST_PTR_FORMAT
", res=%d", GST_TIME_ARGS (ts), src, sink, (gint) res);
}
static void
do_pad_unlink_pre (GstTracer * self, guint64 ts, GstPad * src,
GstElement * sink)
{
do_log (GST_CAT_PADS, GST_FUNCTION, (GObject *) src,
"%" GST_TIME_FORMAT ", src=%" GST_PTR_FORMAT ", sink=%" GST_PTR_FORMAT,
GST_TIME_ARGS (ts), src, sink);
}
static void
do_pad_unlink_post (GstTracer * self, guint64 ts, GstPad * src,
GstElement * sink, gboolean res)
{
do_log (GST_CAT_PADS, GST_FUNCTION, (GObject *) src,
"%" GST_TIME_FORMAT ", src=%" GST_PTR_FORMAT ", sink=%" GST_PTR_FORMAT
", res=%d", GST_TIME_ARGS (ts), src, sink, (gint) res);
}
/* tracer class */
static void
gst_log_tracer_class_init (GstLogTracerClass * klass)
{
}
static void
gst_log_tracer_init (GstLogTracer * self)
{
GstTracer *tracer = GST_TRACER (self);
gst_tracing_register_hook (tracer, "pad-push-pre",
G_CALLBACK (do_push_buffer_pre));
gst_tracing_register_hook (tracer, "pad-push-post",
G_CALLBACK (do_push_buffer_post));
gst_tracing_register_hook (tracer, "pad-push-list-pre",
G_CALLBACK (do_push_buffer_list_pre));
gst_tracing_register_hook (tracer, "pad-push-list-post",
G_CALLBACK (do_push_buffer_list_post));
gst_tracing_register_hook (tracer, "pad-pull-range-pre",
G_CALLBACK (do_pull_range_pre));
gst_tracing_register_hook (tracer, "pad-pull-range-post",
G_CALLBACK (do_pull_range_post));
gst_tracing_register_hook (tracer, "pad-push-event-pre",
G_CALLBACK (do_push_event_pre));
gst_tracing_register_hook (tracer, "pad-push-event-post",
G_CALLBACK (do_push_event_post));
gst_tracing_register_hook (tracer, "pad-query-pre",
G_CALLBACK (do_pad_query_pre));
gst_tracing_register_hook (tracer, "pad-query-post",
G_CALLBACK (do_pad_query_post));
gst_tracing_register_hook (tracer, "element-post-message-pre",
G_CALLBACK (do_post_message_pre));
gst_tracing_register_hook (tracer, "element-post-message-post",
G_CALLBACK (do_post_message_post));
gst_tracing_register_hook (tracer, "element-query-pre",
G_CALLBACK (do_element_query_pre));
gst_tracing_register_hook (tracer, "element-query-post",
G_CALLBACK (do_element_query_post));
gst_tracing_register_hook (tracer, "element-new",
G_CALLBACK (do_element_new));
gst_tracing_register_hook (tracer, "element-add-pad",
G_CALLBACK (do_element_add_pad));
gst_tracing_register_hook (tracer, "element-remove-pad",
G_CALLBACK (do_element_remove_pad));
gst_tracing_register_hook (tracer, "element-change-state-pre",
G_CALLBACK (do_element_change_state_pre));
gst_tracing_register_hook (tracer, "element-change-state-post",
G_CALLBACK (do_element_change_state_post));
gst_tracing_register_hook (tracer, "bin-add-pre",
G_CALLBACK (do_bin_add_pre));
gst_tracing_register_hook (tracer, "bin-add-post",
G_CALLBACK (do_bin_add_post));
gst_tracing_register_hook (tracer, "bin-remove-pre",
G_CALLBACK (do_bin_remove_pre));
gst_tracing_register_hook (tracer, "bin-remove-post",
G_CALLBACK (do_bin_remove_post));
gst_tracing_register_hook (tracer, "pad-link-pre",
G_CALLBACK (do_pad_link_pre));
gst_tracing_register_hook (tracer, "pad-link-post",
G_CALLBACK (do_pad_link_post));
gst_tracing_register_hook (tracer, "pad-unlink-pre",
G_CALLBACK (do_pad_unlink_pre));
gst_tracing_register_hook (tracer, "pad-unlink-post",
G_CALLBACK (do_pad_unlink_post));
}