API: add GST_SEGMENT_FORMAT, which is a printf extension we register that lets us...
authorTim-Philipp Müller <tim@centricular.net>
Wed, 9 Aug 2006 15:13:14 +0000 (15:13 +0000)
committerTim-Philipp Müller <tim@centricular.net>
Wed, 9 Aug 2006 15:13:14 +0000 (15:13 +0000)
Original commit message from CVS:
* configure.ac:
* docs/gst/gstreamer-sections.txt:
* gst/gstconfig.h.in:
* gst/gstinfo.c: (_gst_debug_init), (gst_debug_print_segment),
(_gst_info_printf_extension_ptr),
(_gst_info_printf_extension_segment):
API: add GST_SEGMENT_FORMAT, which is a printf extension we
register that lets us easily dump GstSegments into debug
logs (#350419).
* tests/check/gst/gstinfo.c: (segment_printf_extension_log_func),
(info_segment_format_printf_extension), (gst_info_suite):
Add simple unit test that logs a bunch of different segments (not
valgrinded at the moment because of leaks in gst_debug_add_log_function).

ChangeLog
configure.ac
docs/gst/gstreamer-sections.txt
gst/gstconfig.h.in
gst/gstinfo.c
tests/check/gst/gstinfo.c [new file with mode: 0644]

index 888f2f4..6444a10 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2006-08-08  Tim-Philipp Müller  <tim at centricular dot net>
+
+       * configure.ac:
+       * docs/gst/gstreamer-sections.txt:
+       * gst/gstconfig.h.in:
+       * gst/gstinfo.c: (_gst_debug_init), (gst_debug_print_segment),
+       (_gst_info_printf_extension_ptr),
+       (_gst_info_printf_extension_segment):
+         API: add GST_SEGMENT_FORMAT, which is a printf extension we
+         register that lets us easily dump GstSegments into debug
+         logs (#350419).
+
+       * tests/check/gst/gstinfo.c: (segment_printf_extension_log_func),
+       (info_segment_format_printf_extension), (gst_info_suite):
+         Add simple unit test that logs a bunch of different segments (not
+         valgrinded at the moment because of leaks in gst_debug_add_log_function).
+
 2006-08-09  Edward Hervey  <edward@fluendo.com>
 
        * libs/gst/base/gstbasetransform.c:
index 6602ed8..99454e1 100644 (file)
@@ -321,13 +321,16 @@ GST_CHECK_FUNCTION
 dnl test for register_printf_function
 AC_CHECK_FUNC(register_printf_function,
   [
-    GST_PRINTF_EXTENSION_FORMAT_DEFINE="#define GST_PTR_FORMAT \"P\""
+    GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE="#define GST_PTR_FORMAT \"P\""
+    GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE="#define GST_SEGMENT_FORMAT \"Q\""
     AC_DEFINE(HAVE_PRINTF_EXTENSION, 1,
       [Defined if we have register_printf_function ()])
   ],
-  GST_PRINTF_EXTENSION_FORMAT_DEFINE="#define GST_PTR_FORMAT \"p\""
+  GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE="#define GST_PTR_FORMAT \"p\""
+  GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE="#define GST_SEGMENT_FORMAT \"p\""
 )
-AC_SUBST(GST_PRINTF_EXTENSION_FORMAT_DEFINE)
+AC_SUBST(GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE)
+AC_SUBST(GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE)
 
 dnl test if we have dladdr(); we use it for debugging; see gst/gstinfo.c
 save_cflags="$CFLAGS"
index 815e56f..2ef95ca 100644 (file)
@@ -381,6 +381,7 @@ GST_DISABLE_URI
 GST_DISABLE_LOADSAVE_REGISTRY
 GST_HAVE_GLIB_2_8
 GST_PTR_FORMAT
+GST_SEGMENT_FORMAT
 GST_EXPORT
 GST_PLUGIN_EXPORT
 GST_PADDING
index 9c69202..daa6065 100644 (file)
  * printf format type used to debug GStreamer types.
  * This can only be used on types whose size is >= sizeof(gpointer).
  */
-@GST_PRINTF_EXTENSION_FORMAT_DEFINE@
+@GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+/**
+ * GST_SEGMENT_FORMAT:
+ *
+ * printf format type used to debug GStreamer segments.
+ * This can only be used on pointers to GstSegment structures.
+ *
+ * Since: 0.10.10
+ */
+@GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
 
 /* whether or not the CPU supports unaligned access */
 @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
index 35b58f5..689aa3d 100644 (file)
 #include <string.h>             /* G_VA_COPY */
 #include "gst_private.h"
 #include "gstutils.h"
+#include "gstsegment.h"
 #ifdef HAVE_VALGRIND
 #  include <valgrind/valgrind.h>
 #endif
@@ -149,7 +150,9 @@ static void gst_debug_reset_threshold (gpointer category, gpointer unused);
 static void gst_debug_reset_all_thresholds (void);
 
 #ifdef HAVE_PRINTF_EXTENSION
-static int _gst_info_printf_extension (FILE * stream,
+static int _gst_info_printf_extension_ptr (FILE * stream,
+    const struct printf_info *info, const void *const *args);
+static int _gst_info_printf_extension_segment (FILE * stream,
     const struct printf_info *info, const void *const *args);
 static int _gst_info_printf_extension_arginfo (const struct printf_info *info,
     size_t n, int *argtypes);
@@ -279,8 +282,10 @@ _gst_debug_init (void)
   start_time = GST_TIMEVAL_TO_TIME (current);
 
 #ifdef HAVE_PRINTF_EXTENSION
-  register_printf_function (GST_PTR_FORMAT[0], _gst_info_printf_extension,
+  register_printf_function (GST_PTR_FORMAT[0], _gst_info_printf_extension_ptr,
       _gst_info_printf_extension_arginfo);
+  register_printf_function (GST_SEGMENT_FORMAT[0],
+      _gst_info_printf_extension_segment, _gst_info_printf_extension_arginfo);
 #endif
 
   /* do NOT use a single debug function before this line has been run */
@@ -490,6 +495,48 @@ gst_debug_print_object (gpointer ptr)
   return g_strdup_printf ("%p", ptr);
 }
 
+static gchar *
+gst_debug_print_segment (gpointer ptr)
+{
+  GstSegment *segment = (GstSegment *) ptr;
+
+  /* nicely printed segment */
+  if (segment == NULL) {
+    return g_strdup ("(NULL)");
+  }
+
+  switch (segment->format) {
+    case GST_FORMAT_UNDEFINED:{
+      return g_strdup_printf ("UNDEFINED segment");
+    }
+    case GST_FORMAT_TIME:{
+      return g_strdup_printf ("time segment start=%" GST_TIME_FORMAT
+          ", stop=%" GST_TIME_FORMAT ", last_stop=%" GST_TIME_FORMAT
+          ", duration=%" GST_TIME_FORMAT ", rate=%f, applied_rate=%f"
+          ", flags=0x%02x, time=%" GST_TIME_FORMAT ", accum=%" GST_TIME_FORMAT,
+          GST_TIME_ARGS (segment->start), GST_TIME_ARGS (segment->stop),
+          GST_TIME_ARGS (segment->last_stop), GST_TIME_ARGS (segment->duration),
+          segment->rate, segment->applied_rate, (guint) segment->flags,
+          GST_TIME_ARGS (segment->time), GST_TIME_ARGS (segment->accum));
+    }
+    default:{
+      const gchar *format_name;
+
+      format_name = gst_format_get_name (segment->format);
+      if (G_UNLIKELY (format_name == NULL))
+        format_name = "(UNKNOWN FORMAT)";
+      return g_strdup_printf ("%s segment start=%" G_GINT64_FORMAT
+          ", stop=%" G_GINT64_FORMAT ", last_stop=%" G_GINT64_FORMAT
+          ", duration=%" G_GINT64_FORMAT ", rate=%f, applied_rate=%f"
+          ", flags=0x%02x, time=%" GST_TIME_FORMAT ", accum=%" GST_TIME_FORMAT,
+          format_name, segment->start, segment->stop, segment->last_stop,
+          segment->duration, segment->rate, segment->applied_rate,
+          (guint) segment->flags, GST_TIME_ARGS (segment->time),
+          GST_TIME_ARGS (segment->accum));
+    }
+  }
+}
+
 /**
  * gst_debug_construct_term_color:
  * @colorinfo: the color info
@@ -1174,7 +1221,7 @@ _gst_debug_register_funcptr (GstDebugFuncPtr func, gchar * ptrname)
 
 #ifdef HAVE_PRINTF_EXTENSION
 static int
-_gst_info_printf_extension (FILE * stream, const struct printf_info *info,
+_gst_info_printf_extension_ptr (FILE * stream, const struct printf_info *info,
     const void *const *args)
 {
   char *buffer;
@@ -1188,7 +1235,26 @@ _gst_info_printf_extension (FILE * stream, const struct printf_info *info,
   len = fprintf (stream, "%*s", (info->left ? -info->width : info->width),
       buffer);
 
-  free (buffer);
+  g_free (buffer);
+  return len;
+}
+
+static int
+_gst_info_printf_extension_segment (FILE * stream,
+    const struct printf_info *info, const void *const *args)
+{
+  char *buffer;
+  int len;
+  void *ptr;
+
+  buffer = NULL;
+  ptr = *(void **) args[0];
+
+  buffer = gst_debug_print_segment (ptr);
+  len = fprintf (stream, "%*s", (info->left ? -info->width : info->width),
+      buffer);
+
+  g_free (buffer);
   return len;
 }
 
diff --git a/tests/check/gst/gstinfo.c b/tests/check/gst/gstinfo.c
new file mode 100644 (file)
index 0000000..45219b9
--- /dev/null
@@ -0,0 +1,127 @@
+/* GStreamer
+ *
+ * Unit tests for GstInfo
+ *
+ * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
+ *
+ * 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., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <gst/check/gstcheck.h>
+
+static void
+segment_printf_extension_log_func (GstDebugCategory * category,
+    GstDebugLevel level, const gchar * file, const gchar * function,
+    gint line, GObject * object, GstDebugMessage * message, gpointer unused)
+{
+  const gchar *dbg_msg;
+
+  dbg_msg = gst_debug_message_get (message);
+  fail_unless (dbg_msg != NULL);
+
+  /* g_print ("%s\n", dbg_msg); */
+
+  /* quick hack to still get stuff to show if GST_DEBUG is set */
+  if (g_getenv ("GST_DEBUG")) {
+    gst_debug_log_default (category, level, file, function, line, object,
+        message, unused);
+  }
+}
+
+/* check our GST_SEGMENT_FORMAT printf extension stuff */
+GST_START_TEST (info_segment_format_printf_extension)
+{
+  /* set up our own log function to make sure the code in gstinfo is actually
+   * executed without GST_DEBUG being set or it being output to stdout */
+  gst_debug_remove_log_function (gst_debug_log_default);
+  gst_debug_add_log_function (segment_printf_extension_log_func, NULL);
+
+  gst_debug_set_default_threshold (GST_LEVEL_LOG);
+
+  /* TIME segment */
+  {
+    GstSegment segment;
+
+    gst_segment_init (&segment, GST_FORMAT_TIME);
+
+    gst_segment_set_newsegment_full (&segment, FALSE, 1.0, 2.0,
+        GST_FORMAT_TIME, 0, 5 * 60 * GST_SECOND, 0);
+
+    segment.last_stop = 2 * GST_SECOND;
+    segment.duration = 90 * 60 * GST_SECOND;
+
+    GST_LOG ("TIME: %" GST_SEGMENT_FORMAT, &segment);
+  }
+
+  /* BYTE segment */
+  {
+    GstSegment segment;
+
+    gst_segment_init (&segment, GST_FORMAT_BYTES);
+
+    gst_segment_set_newsegment_full (&segment, FALSE, 1.0, 1.0,
+        GST_FORMAT_BYTES, 0, 9999999, 0);
+
+    GST_LOG ("BYTE: %" GST_SEGMENT_FORMAT, &segment);
+  }
+
+  /* UNKNOWN format segment (format numbers are consecutive from 0) */
+  {
+    GstSegment segment;
+
+    gst_segment_init (&segment, 98765432);
+
+    gst_segment_set_newsegment_full (&segment, FALSE, 1.0, 1.0,
+        GST_FORMAT_BYTES, 0, 987654321, 0);
+
+    GST_LOG ("UNKNOWN: %" GST_SEGMENT_FORMAT, &segment);
+  }
+
+  /* UNDEFINED format segment */
+  {
+    GstSegment segment;
+
+    gst_segment_init (&segment, GST_FORMAT_UNDEFINED);
+
+    GST_LOG ("UNDEFINED: %" GST_SEGMENT_FORMAT, &segment);
+  }
+
+  /* NULL segment */
+  GST_LOG ("NULL: %" GST_SEGMENT_FORMAT, NULL);
+
+  /* clean up */
+  gst_debug_set_default_threshold (GST_LEVEL_NONE);
+  gst_debug_add_log_function (gst_debug_log_default, NULL);
+  gst_debug_remove_log_function (segment_printf_extension_log_func);
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_info_suite (void)
+{
+  Suite *s = suite_create ("GstInfo");
+  TCase *tc_chain = tcase_create ("info");
+
+  tcase_set_timeout (tc_chain, 30);
+
+  suite_add_tcase (s, tc_chain);
+  tcase_add_test (tc_chain, info_segment_format_printf_extension);
+
+  return s;
+}
+
+GST_CHECK_MAIN (gst_info);