From 52002376eab42c401526282d98a3a2bf8c9b9121 Mon Sep 17 00:00:00 2001 From: Thiago Santos Date: Wed, 14 Aug 2013 16:30:39 -0300 Subject: [PATCH] rename gst-qa -> gst-validate --- validate/autogen.sh | 6 +- validate/configure.ac | 12 +- validate/gst/Makefile.am | 2 +- validate/gst/qa/.gitignore | 3 - validate/gst/qa/Makefile.am | 84 --- validate/gst/qa/gst-qa-bin-monitor.h | 83 --- validate/gst/qa/gst-qa-element-monitor.c | 201 ------- validate/gst/qa/gst-qa-element-monitor.h | 84 --- validate/gst/qa/gst-qa-file-checker.h | 93 --- validate/gst/qa/gst-qa-monitor.c | 289 ---------- validate/gst/qa/gst-qa-monitor.h | 109 ---- validate/gst/qa/gst-qa-override-registry.c | 231 -------- validate/gst/qa/gst-qa-override.h | 79 --- validate/gst/qa/gst-qa-report.c | 343 ----------- validate/gst/qa/gst-qa-report.h | 189 ------ validate/gst/qa/gst-qa-reporter.c | 183 ------ validate/gst/qa/gst-qa-reporter.h | 83 --- validate/gst/qa/gst-qa-runner.h | 87 --- validate/gst/qa/gst-qa-scenario.h | 65 --- validate/gst/qa/qa.h | 8 - validate/gst/validate/.gitignore | 3 + validate/gst/validate/Makefile.am | 84 +++ validate/gst/{qa => validate}/gettext.h | 0 .../gst-validate-bin-monitor.c} | 102 ++-- validate/gst/validate/gst-validate-bin-monitor.h | 83 +++ .../gst-validate-default-overrides.c} | 21 +- .../gst/validate/gst-validate-element-monitor.c | 208 +++++++ .../gst/validate/gst-validate-element-monitor.h | 84 +++ .../gst-validate-file-check.c} | 18 +- .../gst-validate-file-checker.c} | 128 +++-- validate/gst/validate/gst-validate-file-checker.h | 93 +++ .../gst-validate-i18n-lib.h} | 8 +- .../gst-validate-monitor-factory.c} | 30 +- .../gst-validate-monitor-factory.h} | 14 +- .../gst-validate-monitor-preload.c} | 28 +- validate/gst/validate/gst-validate-monitor.c | 294 ++++++++++ validate/gst/validate/gst-validate-monitor.h | 109 ++++ .../gst/validate/gst-validate-override-registry.c | 233 ++++++++ .../gst-validate-override-registry.h} | 28 +- .../gst-validate-override.c} | 78 +-- validate/gst/validate/gst-validate-override.h | 79 +++ .../gst-validate-pad-monitor.c} | 638 +++++++++++---------- .../gst-validate-pad-monitor.h} | 58 +- validate/gst/validate/gst-validate-report.c | 350 +++++++++++ validate/gst/validate/gst-validate-report.h | 189 ++++++ validate/gst/validate/gst-validate-reporter.c | 186 ++++++ validate/gst/validate/gst-validate-reporter.h | 83 +++ .../gst-validate-runner.c} | 59 +- validate/gst/validate/gst-validate-runner.h | 87 +++ .../gst-validate-scenario.c} | 163 +++--- validate/gst/validate/gst-validate-scenario.h | 65 +++ .../gst-validate-transcoding.c} | 32 +- .../gst/{qa/gst-qa.c => validate/gst-validate.c} | 21 +- validate/gst/validate/validate.h | 8 + 54 files changed, 2987 insertions(+), 2911 deletions(-) delete mode 100644 validate/gst/qa/.gitignore delete mode 100644 validate/gst/qa/Makefile.am delete mode 100644 validate/gst/qa/gst-qa-bin-monitor.h delete mode 100644 validate/gst/qa/gst-qa-element-monitor.c delete mode 100644 validate/gst/qa/gst-qa-element-monitor.h delete mode 100644 validate/gst/qa/gst-qa-file-checker.h delete mode 100644 validate/gst/qa/gst-qa-monitor.c delete mode 100644 validate/gst/qa/gst-qa-monitor.h delete mode 100644 validate/gst/qa/gst-qa-override-registry.c delete mode 100644 validate/gst/qa/gst-qa-override.h delete mode 100644 validate/gst/qa/gst-qa-report.c delete mode 100644 validate/gst/qa/gst-qa-report.h delete mode 100644 validate/gst/qa/gst-qa-reporter.c delete mode 100644 validate/gst/qa/gst-qa-reporter.h delete mode 100644 validate/gst/qa/gst-qa-runner.h delete mode 100644 validate/gst/qa/gst-qa-scenario.h delete mode 100644 validate/gst/qa/qa.h create mode 100644 validate/gst/validate/.gitignore create mode 100644 validate/gst/validate/Makefile.am rename validate/gst/{qa => validate}/gettext.h (100%) rename validate/gst/{qa/gst-qa-bin-monitor.c => validate/gst-validate-bin-monitor.c} (50%) create mode 100644 validate/gst/validate/gst-validate-bin-monitor.h rename validate/gst/{qa/gst-qa-default-overrides.c => validate/gst-validate-default-overrides.c} (69%) create mode 100644 validate/gst/validate/gst-validate-element-monitor.c create mode 100644 validate/gst/validate/gst-validate-element-monitor.h rename validate/gst/{qa/gst-qa-file-check.c => validate/gst-validate-file-check.c} (94%) rename validate/gst/{qa/gst-qa-file-checker.c => validate/gst-validate-file-checker.c} (82%) create mode 100644 validate/gst/validate/gst-validate-file-checker.h rename validate/gst/{qa/gst-qa-i18n-lib.h => validate/gst-validate-i18n-lib.h} (88%) rename validate/gst/{qa/gst-qa-monitor-factory.c => validate/gst-validate-monitor-factory.c} (57%) rename validate/gst/{qa/gst-qa-monitor-factory.h => validate/gst-validate-monitor-factory.h} (68%) rename validate/gst/{qa/gst-qa-monitor-preload.c => validate/gst-validate-monitor-preload.c} (84%) create mode 100644 validate/gst/validate/gst-validate-monitor.c create mode 100644 validate/gst/validate/gst-validate-monitor.h create mode 100644 validate/gst/validate/gst-validate-override-registry.c rename validate/gst/{qa/gst-qa-override-registry.h => validate/gst-validate-override-registry.h} (55%) rename validate/gst/{qa/gst-qa-override.c => validate/gst-validate-override.c} (50%) create mode 100644 validate/gst/validate/gst-validate-override.h rename validate/gst/{qa/gst-qa-pad-monitor.c => validate/gst-validate-pad-monitor.c} (66%) rename validate/gst/{qa/gst-qa-pad-monitor.h => validate/gst-validate-pad-monitor.h} (53%) create mode 100644 validate/gst/validate/gst-validate-report.c create mode 100644 validate/gst/validate/gst-validate-report.h create mode 100644 validate/gst/validate/gst-validate-reporter.c create mode 100644 validate/gst/validate/gst-validate-reporter.h rename validate/gst/{qa/gst-qa-runner.c => validate/gst-validate-runner.c} (56%) create mode 100644 validate/gst/validate/gst-validate-runner.h rename validate/gst/{qa/gst-qa-scenario.c => validate/gst-validate-scenario.c} (77%) create mode 100644 validate/gst/validate/gst-validate-scenario.h rename validate/gst/{qa/gst-qa-transcoding.c => validate/gst-validate-transcoding.c} (91%) rename validate/gst/{qa/gst-qa.c => validate/gst-validate.c} (81%) create mode 100644 validate/gst/validate/validate.h diff --git a/validate/autogen.sh b/validate/autogen.sh index 95ff44d..68856f9 100755 --- a/validate/autogen.sh +++ b/validate/autogen.sh @@ -2,8 +2,8 @@ # Run this to generate all the initial makefiles, etc. DIE=0 -package=gst-qa -srcfile=gst/qa/gst-qa.c +package=gst-validate +srcfile=gst/validate/gst-validate.c # Make sure we have common if test ! -f common/gst-autogen.sh; @@ -31,7 +31,7 @@ fi # GNU gettext automake support doesn't get along with git. # https://bugzilla.gnome.org/show_bug.cgi?id=661128 -touch -t 200001010000 po/gst-qa-0.10.pot +touch -t 200001010000 po/gst-validate-0.10.pot CONFIGURE_DEF_OPT='--enable-maintainer-mode --enable-gtk-doc' diff --git a/validate/configure.ac b/validate/configure.ac index 01ba560..524ad6c 100644 --- a/validate/configure.ac +++ b/validate/configure.ac @@ -2,9 +2,9 @@ AC_PREREQ(2.62) dnl initialize autoconf dnl when going to/from release please set the nano (fourth number) right ! dnl releases only do Wall, cvs and prerelease does Werror too -AC_INIT(Gst-QA, 0.0.1.1, +AC_INIT(Gst-Validate, 0.0.1.1, http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer, - gst-qa) + gst-validate) AG_GST_INIT dnl initialize automake @@ -17,7 +17,7 @@ dnl check if this is a release version AS_NANO(GST_GIT="no", GST_GIT="yes") dnl can autoconf find the source ? -AC_CONFIG_SRCDIR([gst/qa/gst-qa.c]) +AC_CONFIG_SRCDIR([gst/validate/gst-validate.c]) dnl define the output header for config AC_CONFIG_HEADERS([config.h]) @@ -60,7 +60,7 @@ dnl set up gettext dnl the version check needs to stay here because autopoint greps for it AM_GNU_GETTEXT_VERSION([0.17]) AM_GNU_GETTEXT([external]) -AG_GST_GETTEXT([gst-qa-$GST_API_VERSION]) +AG_GST_GETTEXT([gst-validate-$GST_API_VERSION]) dnl *** check for arguments to configure *** @@ -243,7 +243,7 @@ Makefile common/Makefile common/m4/Makefile gst/Makefile -gst/qa/Makefile +gst/validate/Makefile data/Makefile po/Makefile.in ]) @@ -257,5 +257,5 @@ Configuration Prefix : ${prefix} Compiler : ${CC} -gst-qa configured. Type 'make' to build. +gst-validate configured. Type 'make' to build. " diff --git a/validate/gst/Makefile.am b/validate/gst/Makefile.am index 697b342..bc3ef4b 100644 --- a/validate/gst/Makefile.am +++ b/validate/gst/Makefile.am @@ -1 +1 @@ -SUBDIRS = qa +SUBDIRS = validate diff --git a/validate/gst/qa/.gitignore b/validate/gst/qa/.gitignore deleted file mode 100644 index 8237df4..0000000 --- a/validate/gst/qa/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -gst-qa-0.10 -gst-qa-transcoding-0.10 -gst-qa-file-check-0.10 diff --git a/validate/gst/qa/Makefile.am b/validate/gst/qa/Makefile.am deleted file mode 100644 index 665973d..0000000 --- a/validate/gst/qa/Makefile.am +++ /dev/null @@ -1,84 +0,0 @@ -libgstqa_@GST_API_VERSION@_la_SOURCES = \ - gst-qa-runner.c \ - gst-qa-reporter.c \ - gst-qa-monitor.c \ - gst-qa-element-monitor.c \ - gst-qa-bin-monitor.c \ - gst-qa-pad-monitor.c \ - gst-qa-monitor-factory.c \ - gst-qa-report.c \ - gst-qa-scenario.c \ - gst-qa-override.c \ - gst-qa-override-registry.c \ - gst-qa-file-checker.c - -noinst_HEADERS = \ - gettext.h \ - gst-qa-bin-monitor.h \ - gst-qa-element-monitor.h \ - gst-qa-file-checker.h \ - gst-qa-i18n-lib.h \ - gst-qa-monitor-factory.h \ - gst-qa-monitor.h \ - gst-qa-override.h \ - gst-qa-override-registry.h \ - gst-qa-pad-monitor.h \ - gst-qa-reporter.h \ - gst-qa-report.h \ - gst-qa-runner.h \ - gst-qa-scenario.h - -lib_LTLIBRARIES = \ - libgstqa-@GST_API_VERSION@.la \ - libgstqa-default-overrides-@GST_API_VERSION@.la \ - libgstqa-preload-@GST_API_VERSION@.la - -libgstqa_@GST_API_VERSION@_la_CFLAGS = $(GST_ALL_CFLAGS) $(GIO_CFLAGS) -libgstqa_@GST_API_VERSION@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) \ - $(GST_LT_LDFLAGS) $(GIO_LDFLAGS) -libgstqa_@GST_API_VERSION@_la_LIBADD = \ - $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) \ - $(GST_ALL_LIBS) $(GIO_LIBS) - -libgstqa_@GST_API_VERSION@includedir = $(includedir)/gstreamer-@GST_API_VERSION@/gst/qa -libgstqa_@GST_API_VERSION@include_HEADERS = \ - qa.h - -libgstqa_default_overrides_@GST_API_VERSION@_la_SOURCES = \ - gst-qa-default-overrides.c - -libgstqa_default_overrides_@GST_API_VERSION@_la_CFLAGS = $(GST_ALL_CFLAGS) $(GIO_CFLAGS) -libgstqa_default_overrides_@GST_API_VERSION@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) \ - $(GST_LT_LDFLAGS) $(GIO_LDFLAGS) -libgstqa_default_overrides_@GST_API_VERSION@_la_LIBADD = \ - $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) \ - $(GST_ALL_LIBS) $(GIO_LIBS) - -libgstqa_default_overrides_@GST_API_VERSION@includedir = $(includedir)/gstreamer-@GST_API_VERSION@/gst/qa -libgstqa_default_overrides_@GST_API_VERSION@include_HEADERS = - -libgstqa_preload_@GST_API_VERSION@_la_SOURCES = \ - gst-qa-monitor-preload.c - -libgstqa_preload_@GST_API_VERSION@_la_CFLAGS = $(GST_ALL_CFLAGS) -libgstqa_preload_@GST_API_VERSION@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) \ - $(GST_LT_LDFLAGS) -lgstqa-@GST_API_VERSION@ -libgstqa_preload_@GST_API_VERSION@_la_LIBADD = \ - $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) \ - $(GST_ALL_LIBS) -lgstqa-@GST_API_VERSION@ -libgstqa_preload_@GST_API_VERSION@includedir = $(includedir)/gstreamer-@GST_API_VERSION@/gst/qa -libgstqa_preload_@GST_API_VERSION@include_HEADERS = - -bin_PROGRAMS = \ - gst-qa-@GST_API_VERSION@ \ - gst-qa-transcoding-@GST_API_VERSION@ \ - gst-qa-file-check-@GST_API_VERSION@ - -AM_CFLAGS = $(GST_ALL_CFLAGS) $(GST_PBUTILS_CFLAGS) -LDADD = $(top_builddir)/gst/qa/libgstqa-@GST_API_VERSION@.la $(GST_PBUTILS_LIBS) $(GST_LIBS) - -gst_qa_@GST_API_VERSION@_SOURCES = gst-qa.c -gst_qa_transcoding_@GST_API_VERSION@_SOURCES = gst-qa-transcoding.c -gst_qa_file_check_@GST_API_VERSION@_SOURCES = gst-qa-file-check.c - -CLEANFILES = diff --git a/validate/gst/qa/gst-qa-bin-monitor.h b/validate/gst/qa/gst-qa-bin-monitor.h deleted file mode 100644 index 684d904..0000000 --- a/validate/gst/qa/gst-qa-bin-monitor.h +++ /dev/null @@ -1,83 +0,0 @@ -/* GStreamer - * Copyright (C) 2013 Thiago Santos - * - * gst-qa-bin-monitor.h - QA BinMonitor class - * - * 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.1 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. - */ - -#ifndef __GST_QA_BIN_MONITOR_H__ -#define __GST_QA_BIN_MONITOR_H__ - -#include -#include -#include "gst-qa-element-monitor.h" -#include "gst-qa-runner.h" -#include "gst-qa-scenario.h" - -G_BEGIN_DECLS - -#define GST_TYPE_QA_BIN_MONITOR (gst_qa_bin_monitor_get_type ()) -#define GST_IS_QA_BIN_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_QA_BIN_MONITOR)) -#define GST_IS_QA_BIN_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_QA_BIN_MONITOR)) -#define GST_QA_BIN_MONITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_QA_BIN_MONITOR, GstQaBinMonitorClass)) -#define GST_QA_BIN_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_QA_BIN_MONITOR, GstQaBinMonitor)) -#define GST_QA_BIN_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_QA_BIN_MONITOR, GstQaBinMonitorClass)) -#define GST_QA_BIN_MONITOR_CAST(obj) ((GstQaBinMonitor*)(obj)) -#define GST_QA_BIN_MONITOR_CLASS_CAST(klass) ((GstQaBinMonitorClass*)(klass)) - -#define GST_QA_BIN_MONITOR_GET_BIN(m) (GST_BIN_CAST (GST_QA_ELEMENT_MONITOR_GET_ELEMENT (m))) - -typedef struct _GstQaBinMonitor GstQaBinMonitor; -typedef struct _GstQaBinMonitorClass GstQaBinMonitorClass; - -/** - * GstQaBinMonitor: - * - * GStreamer QA BinMonitor class. - * - * Class that wraps a #GstBin for QA checks - */ -struct _GstQaBinMonitor { - GstQaElementMonitor parent; - - GList *element_monitors; - - GstQaScenario *scenario; - - /*< private >*/ - gulong element_added_id; -}; - -/** - * GstQaBinMonitorClass: - * @parent_class: parent - * - * GStreamer QA BinMonitor object class. - */ -struct _GstQaBinMonitorClass { - GstQaElementMonitorClass parent_class; -}; - -/* normal GObject stuff */ -GType gst_qa_bin_monitor_get_type (void); - -GstQaBinMonitor * gst_qa_bin_monitor_new (GstBin * bin, GstQaRunner * runner, GstQaMonitor * parent); - -G_END_DECLS - -#endif /* __GST_QA_BIN_MONITOR_H__ */ - diff --git a/validate/gst/qa/gst-qa-element-monitor.c b/validate/gst/qa/gst-qa-element-monitor.c deleted file mode 100644 index c87a733..0000000 --- a/validate/gst/qa/gst-qa-element-monitor.c +++ /dev/null @@ -1,201 +0,0 @@ -/* GStreamer - * Copyright (C) 2013 Thiago Santos - * - * gst-qa-element-monitor.c - QA ElementMonitor class - * - * 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.1 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-qa-element-monitor.h" -#include "gst-qa-pad-monitor.h" -#include "gst-qa-monitor-factory.h" -#include - -/** - * SECTION:gst-qa-element-monitor - * @short_description: Class that wraps a #GstElement for QA checks - * - * TODO - */ - -GST_DEBUG_CATEGORY_STATIC (gst_qa_element_monitor_debug); -#define GST_CAT_DEFAULT gst_qa_element_monitor_debug - -#define _do_init \ - GST_DEBUG_CATEGORY_INIT (gst_qa_element_monitor_debug, "qa_element_monitor", 0, "QA ElementMonitor"); -#define gst_qa_element_monitor_parent_class parent_class -G_DEFINE_TYPE_WITH_CODE (GstQaElementMonitor, gst_qa_element_monitor, - GST_TYPE_QA_MONITOR, _do_init); - -static void -gst_qa_element_monitor_wrap_pad (GstQaElementMonitor * monitor, GstPad * pad); -static gboolean gst_qa_element_monitor_do_setup (GstQaMonitor * monitor); -static GstElement *gst_qa_element_monitor_get_element (GstQaMonitor * monitor); - -static void -_qa_element_pad_added (GstElement * element, GstPad * pad, - GstQaElementMonitor * monitor); - -static void -gst_qa_element_monitor_dispose (GObject * object) -{ - GstQaElementMonitor *monitor = GST_QA_ELEMENT_MONITOR_CAST (object); - - if (GST_QA_MONITOR_GET_OBJECT (monitor) && monitor->pad_added_id) - g_signal_handler_disconnect (GST_QA_MONITOR_GET_OBJECT (monitor), - monitor->pad_added_id); - - g_list_free_full (monitor->pad_monitors, g_object_unref); - - G_OBJECT_CLASS (parent_class)->dispose (object); -} - - -static void -gst_qa_element_monitor_class_init (GstQaElementMonitorClass * klass) -{ - GObjectClass *gobject_class; - GstQaMonitorClass *monitor_klass; - - gobject_class = G_OBJECT_CLASS (klass); - monitor_klass = GST_QA_MONITOR_CLASS (klass); - - gobject_class->dispose = gst_qa_element_monitor_dispose; - - monitor_klass->setup = gst_qa_element_monitor_do_setup; - monitor_klass->get_element = gst_qa_element_monitor_get_element; -} - -static void -gst_qa_element_monitor_init (GstQaElementMonitor * element_monitor) -{ -} - -/** - * gst_qa_element_monitor_new: - * @element: (transfer-none): a #GstElement to run QA on - */ -GstQaElementMonitor * -gst_qa_element_monitor_new (GstElement * element, GstQaRunner * runner, - GstQaMonitor * parent) -{ - GstQaElementMonitor *monitor; - - g_return_val_if_fail (element != NULL, NULL); - - monitor = g_object_new (GST_TYPE_QA_ELEMENT_MONITOR, "object", element, - "qa-runner", runner, "qa-parent", parent, NULL); - - if (GST_QA_ELEMENT_MONITOR_GET_ELEMENT (monitor) == NULL) { - g_object_unref (monitor); - return NULL; - } - - return monitor; -} - -static GstElement * -gst_qa_element_monitor_get_element (GstQaMonitor * monitor) -{ - return GST_QA_ELEMENT_MONITOR_GET_ELEMENT (monitor); -} - -static void -gst_qa_element_monitor_inspect (GstQaElementMonitor * monitor) -{ - GstElement *element; - GstElementClass *klass; - - element = GST_QA_ELEMENT_MONITOR_GET_ELEMENT (monitor); - klass = GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS (element)); - - monitor->is_decoder = strstr (klass->details.klass, "Decoder") != NULL; - monitor->is_encoder = strstr (klass->details.klass, "Encoder") != NULL; -} - -static gboolean -gst_qa_element_monitor_do_setup (GstQaMonitor * monitor) -{ - GstIterator *iterator; - gboolean done; - GstPad *pad; - GstQaElementMonitor *elem_monitor; - GstElement *element; - - if (!GST_IS_ELEMENT (GST_QA_MONITOR_GET_OBJECT (monitor))) { - GST_WARNING_OBJECT (monitor, "Trying to create element monitor with other " - "type of object"); - return FALSE; - } - - elem_monitor = GST_QA_ELEMENT_MONITOR_CAST (monitor); - - GST_DEBUG_OBJECT (monitor, "Setting up monitor for element %" GST_PTR_FORMAT, - GST_QA_MONITOR_GET_OBJECT (monitor)); - element = GST_QA_ELEMENT_MONITOR_GET_ELEMENT (monitor); - - gst_qa_element_monitor_inspect (elem_monitor); - - elem_monitor->pad_added_id = g_signal_connect (element, "pad-added", - G_CALLBACK (_qa_element_pad_added), monitor); - - iterator = gst_element_iterate_pads (element); - done = FALSE; - while (!done) { - switch (gst_iterator_next (iterator, (gpointer *) & pad)) { - case GST_ITERATOR_OK: - gst_qa_element_monitor_wrap_pad (elem_monitor, pad); - gst_object_unref (pad); - break; - case GST_ITERATOR_RESYNC: - /* TODO how to handle this? */ - gst_iterator_resync (iterator); - break; - case GST_ITERATOR_ERROR: - done = TRUE; - break; - case GST_ITERATOR_DONE: - done = TRUE; - break; - } - } - gst_iterator_free (iterator); - return TRUE; -} - -static void -gst_qa_element_monitor_wrap_pad (GstQaElementMonitor * monitor, GstPad * pad) -{ - GstQaPadMonitor *pad_monitor; - GST_DEBUG_OBJECT (monitor, "Wrapping pad %s:%s", GST_DEBUG_PAD_NAME (pad)); - - pad_monitor = - GST_QA_PAD_MONITOR (gst_qa_monitor_factory_create (GST_OBJECT (pad), - GST_QA_MONITOR_GET_RUNNER (monitor), GST_QA_MONITOR (monitor))); - g_return_if_fail (pad_monitor != NULL); - - GST_QA_MONITOR_LOCK (monitor); - monitor->pad_monitors = g_list_prepend (monitor->pad_monitors, pad_monitor); - GST_QA_MONITOR_UNLOCK (monitor); -} - -static void -_qa_element_pad_added (GstElement * element, GstPad * pad, - GstQaElementMonitor * monitor) -{ - g_return_if_fail (GST_QA_ELEMENT_MONITOR_GET_ELEMENT (monitor) == element); - gst_qa_element_monitor_wrap_pad (monitor, pad); -} diff --git a/validate/gst/qa/gst-qa-element-monitor.h b/validate/gst/qa/gst-qa-element-monitor.h deleted file mode 100644 index 43e103e..0000000 --- a/validate/gst/qa/gst-qa-element-monitor.h +++ /dev/null @@ -1,84 +0,0 @@ -/* GStreamer - * Copyright (C) 2013 Thiago Santos - * - * gst-qa-element-monitor.h - QA ElementMonitor class - * - * 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.1 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. - */ - -#ifndef __GST_QA_ELEMENT_MONITOR_H__ -#define __GST_QA_ELEMENT_MONITOR_H__ - -#include -#include - -#include "gst-qa-monitor.h" - -G_BEGIN_DECLS - -#define GST_TYPE_QA_ELEMENT_MONITOR (gst_qa_element_monitor_get_type ()) -#define GST_IS_QA_ELEMENT_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_QA_ELEMENT_MONITOR)) -#define GST_IS_QA_ELEMENT_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_QA_ELEMENT_MONITOR)) -#define GST_QA_ELEMENT_MONITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_QA_ELEMENT_MONITOR, GstQaElementMonitorClass)) -#define GST_QA_ELEMENT_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_QA_ELEMENT_MONITOR, GstQaElementMonitor)) -#define GST_QA_ELEMENT_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_QA_ELEMENT_MONITOR, GstQaElementMonitorClass)) -#define GST_QA_ELEMENT_MONITOR_CAST(obj) ((GstQaElementMonitor*)(obj)) -#define GST_QA_ELEMENT_MONITOR_CLASS_CAST(klass) ((GstQaElementMonitorClass*)(klass)) - -#define GST_QA_ELEMENT_MONITOR_GET_ELEMENT(m) (GST_ELEMENT_CAST (GST_QA_MONITOR_GET_OBJECT (m))) -#define GST_QA_ELEMENT_MONITOR_ELEMENT_IS_DECODER(m) (GST_QA_ELEMENT_MONITOR_CAST (m)->is_decoder) -#define GST_QA_ELEMENT_MONITOR_ELEMENT_IS_ENCODER(m) (GST_QA_ELEMENT_MONITOR_CAST (m)->is_encoder) - -typedef struct _GstQaElementMonitor GstQaElementMonitor; -typedef struct _GstQaElementMonitorClass GstQaElementMonitorClass; - -/** - * GstQaElementMonitor: - * - * GStreamer QA ElementMonitor class. - * - * Class that wraps a #GstElement for QA checks - */ -struct _GstQaElementMonitor { - GstQaMonitor parent; - - /*< private >*/ - gulong pad_added_id; - GList *pad_monitors; - - gboolean is_decoder; - gboolean is_encoder; -}; - -/** - * GstQaElementMonitorClass: - * @parent_class: parent - * - * GStreamer QA ElementMonitor object class. - */ -struct _GstQaElementMonitorClass { - GstQaMonitorClass parent_class; -}; - -/* normal GObject stuff */ -GType gst_qa_element_monitor_get_type (void); - -GstQaElementMonitor * gst_qa_element_monitor_new (GstElement * element, GstQaRunner * runner, GstQaMonitor * parent); - -G_END_DECLS - -#endif /* __GST_QA_ELEMENT_MONITOR_H__ */ - diff --git a/validate/gst/qa/gst-qa-file-checker.h b/validate/gst/qa/gst-qa-file-checker.h deleted file mode 100644 index 6e7f728..0000000 --- a/validate/gst/qa/gst-qa-file-checker.h +++ /dev/null @@ -1,93 +0,0 @@ -/* GStreamer - * Copyright (C) 2013 Thiago Santos - * - * gst-qa-file-checker.h - QA File conformance check utility functions / structs - * - * 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.1 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. - */ - -#ifndef __GST_QA_FILE_CHECK_H__ -#define __GST_QA_FILE_CHECK_H__ - -#include -#include - -G_BEGIN_DECLS - -#define GST_TYPE_QA_FILE_CHECKER (gst_qa_file_checker_get_type ()) -#define GST_IS_QA_FILE_CHECKER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_QA_FILE_CHECKER)) -#define GST_IS_QA_FILE_CHECKER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_QA_FILE_CHECKER)) -#define GST_QA_FILE_CHECKER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_QA_FILE_CHECKER, GstQaFileCheckerClass)) -#define GST_QA_FILE_CHECKER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_QA_FILE_CHECKER, GstQaFileChecker)) -#define GST_QA_FILE_CHECKER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_QA_FILE_CHECKER, GstQaFileCheckerClass)) -#define GST_QA_FILE_CHECKER_CAST(obj) ((GstQaFileChecker*)(obj)) -#define GST_QA_FILE_CHECKER_CLASS_CAST(klass) ((GstQaFileCheckerClass*)(klass)) - -typedef struct _GstQaFileChecker GstQaFileChecker; -typedef struct _GstQaFileCheckerClass GstQaFileCheckerClass; - -/** - * GstQaFileChecker: - * - * GStreamer QA FileChecker class. - * - * Class that wraps a #GObject for QA checks - */ -struct _GstQaFileChecker { - GObject object; - - /* */ - /* Value for the expected total duration of the file in nanosecs - * Set to GST_CLOCK_TIME_NONE if it shouldn't be tested */ - GstClockTime duration; - /* Acceptable tolerance for duration */ - GstClockTime duration_tolerance; - - /* Expected file_size, set to 0 to skip test */ - guint64 file_size; - /* Acceptable tolerance for file_size check */ - guint64 file_size_tolerance; - - gboolean seekable; /* TODO should we care about disabling this check? */ - - gboolean test_playback; - gboolean test_reverse_playback; - - gchar *uri; - - /* Set to NULL to skip check */ - GstEncodingProfile *profile; -}; - -/** - * GstQaFileCheckerClass: - * @parent_class: parent - * - * GStreamer QA FileChecker object class. - */ -struct _GstQaFileCheckerClass { - GObjectClass parent_class; -}; - -/* normal GObject stuff */ -GType gst_qa_file_checker_get_type (void); - -gboolean gst_qa_file_checker_run (GstQaFileChecker * fc); - -G_END_DECLS - -#endif /* __GST_QA_FILE_CHECK_H__ */ - diff --git a/validate/gst/qa/gst-qa-monitor.c b/validate/gst/qa/gst-qa-monitor.c deleted file mode 100644 index f7729de..0000000 --- a/validate/gst/qa/gst-qa-monitor.c +++ /dev/null @@ -1,289 +0,0 @@ -/* GStreamer - * Copyright (C) 2013 Thiago Santos - * - * gst-qa-element-monitor.c - QA Monitor class - * - * 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.1 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-qa-monitor.h" - -/** - * SECTION:gst-qa-monitor - * @short_description: Base class that wraps a #GObject for QA checks - * - * TODO - */ - -enum -{ - PROP_0, - PROP_OBJECT, - PROP_RUNNER, - PROP_QA_PARENT, - PROP_LAST -}; - -GST_DEBUG_CATEGORY_STATIC (gst_qa_monitor_debug); -#define GST_CAT_DEFAULT gst_qa_monitor_debug - -static gboolean gst_qa_monitor_do_setup (GstQaMonitor * monitor); -static void -gst_qa_monitor_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); -static void -gst_qa_monitor_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); -static GObject *gst_qa_monitor_constructor (GType type, - guint n_construct_params, GObjectConstructParam * construct_params); - -gboolean gst_qa_monitor_setup (GstQaMonitor * monitor); - -static void gst_qa_monitor_intercept_report (GstQaReporter * reporter, - GstQaReport * report); - -#define _do_init \ - GST_DEBUG_CATEGORY_INIT (gst_qa_monitor_debug, "qa_monitor", 0, "QA Monitor");\ - G_IMPLEMENT_INTERFACE (GST_TYPE_QA_REPORTER, _reporter_iface_init) - -static void -_reporter_iface_init (GstQaReporterInterface * iface) -{ - iface->intercept_report = gst_qa_monitor_intercept_report; -} - -#define gst_qa_monitor_parent_class parent_class -G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GstQaMonitor, gst_qa_monitor, - G_TYPE_OBJECT, _do_init); - -void -_target_freed_cb (GstQaMonitor * monitor, GObject * where_the_object_was) -{ - GST_DEBUG_OBJECT (monitor, "Target was freed"); - monitor->target = NULL; -} - -static void -gst_qa_monitor_dispose (GObject * object) -{ - GstQaMonitor *monitor = GST_QA_MONITOR_CAST (object); - - g_mutex_clear (&monitor->mutex); - g_mutex_clear (&monitor->overrides_mutex); - g_queue_clear (&monitor->overrides); - - if (monitor->target) - g_object_weak_unref (G_OBJECT (monitor->target), - (GWeakNotify) _target_freed_cb, monitor); - - G_OBJECT_CLASS (parent_class)->dispose (object); -} - -static void -gst_qa_monitor_finalize (GObject * object) -{ - gst_qa_reporter_set_name (GST_QA_REPORTER (object), NULL); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -static void -gst_qa_monitor_class_init (GstQaMonitorClass * klass) -{ - GObjectClass *gobject_class; - - gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->get_property = gst_qa_monitor_get_property; - gobject_class->set_property = gst_qa_monitor_set_property; - gobject_class->dispose = gst_qa_monitor_dispose; - gobject_class->finalize = gst_qa_monitor_finalize; - gobject_class->constructor = gst_qa_monitor_constructor; - - klass->setup = gst_qa_monitor_do_setup; - - g_object_class_install_property (gobject_class, PROP_OBJECT, - g_param_spec_object ("object", "Object", "The object to be monitored", - GST_TYPE_OBJECT, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)); - - g_object_class_install_property (gobject_class, PROP_RUNNER, - g_param_spec_object ("qa-runner", "QA Runner", "The QA runner to " - "report errors to", GST_TYPE_QA_RUNNER, - G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)); - - g_object_class_install_property (gobject_class, PROP_QA_PARENT, - g_param_spec_object ("qa-parent", "QA parent monitor", "The QA monitor " - "that is the parent of this one", GST_TYPE_QA_MONITOR, - G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)); -} - -static GObject * -gst_qa_monitor_constructor (GType type, guint n_construct_params, - GObjectConstructParam * construct_params) -{ - GstQaMonitor *monitor = - GST_QA_MONITOR_CAST (G_OBJECT_CLASS (parent_class)->constructor (type, - n_construct_params, - construct_params)); - gst_qa_monitor_setup (monitor); - return (GObject *) monitor; -} - -static void -gst_qa_monitor_init (GstQaMonitor * monitor) -{ - g_mutex_init (&monitor->mutex); - - g_mutex_init (&monitor->overrides_mutex); - g_queue_init (&monitor->overrides); -} - -/** - * gst_qa_monitor_new: - * @element: (transfer-none): a #GObject to run QA on - */ -GstQaMonitor * -gst_qa_monitor_new (GObject * object) -{ - GstQaMonitor *monitor = g_object_new (GST_TYPE_QA_MONITOR, "object", - G_TYPE_OBJECT, object, NULL); - - if (GST_QA_MONITOR_GET_OBJECT (monitor) == NULL) { - /* setup failed, no use on returning this monitor */ - g_object_unref (monitor); - return NULL; - } - - return monitor; -} - -static gboolean -gst_qa_monitor_do_setup (GstQaMonitor * monitor) -{ - /* NOP */ - return TRUE; -} - -gboolean -gst_qa_monitor_setup (GstQaMonitor * monitor) -{ - GST_DEBUG_OBJECT (monitor, "Starting monitor setup"); - return GST_QA_MONITOR_GET_CLASS (monitor)->setup (monitor); -} - -GstElement * -gst_qa_monitor_get_element (GstQaMonitor * monitor) -{ - GstQaMonitorClass *klass = GST_QA_MONITOR_GET_CLASS (monitor); - GstElement *element = NULL; - - if (klass->get_element) - element = klass->get_element (monitor); - - return element; -} - -const gchar * -gst_qa_monitor_get_element_name (GstQaMonitor * monitor) -{ - GstElement *element; - - element = gst_qa_monitor_get_element (monitor); - if (element) - return GST_ELEMENT_NAME (element); - return NULL; -} - -/* Check if any of our overrides wants to change the report severity */ -static void -gst_qa_monitor_intercept_report (GstQaReporter * reporter, GstQaReport * report) -{ - GList *iter; - GstQaMonitor *monitor = GST_QA_MONITOR_CAST (reporter); - - GST_QA_MONITOR_OVERRIDES_LOCK (monitor); - for (iter = monitor->overrides.head; iter; iter = g_list_next (iter)) { - report->level = - gst_qa_override_get_severity (iter->data, - gst_qa_issue_get_id (report->issue), report->level); - } - GST_QA_MONITOR_OVERRIDES_UNLOCK (monitor); -} - -void -gst_qa_monitor_attach_override (GstQaMonitor * monitor, - GstQaOverride * override) -{ - GST_QA_MONITOR_OVERRIDES_LOCK (monitor); - g_queue_push_tail (&monitor->overrides, override); - GST_QA_MONITOR_OVERRIDES_UNLOCK (monitor); -} - -static void -gst_qa_monitor_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec) -{ - GstQaMonitor *monitor; - - monitor = GST_QA_MONITOR_CAST (object); - - switch (prop_id) { - case PROP_OBJECT: - g_assert (monitor->target == NULL); - monitor->target = g_value_get_object (value); - g_object_weak_ref (G_OBJECT (monitor->target), - (GWeakNotify) _target_freed_cb, monitor); - - if (monitor->target) - gst_qa_reporter_set_name (GST_QA_REPORTER (monitor), g_strdup - (GST_OBJECT_NAME (monitor->target))); - break; - case PROP_RUNNER: - gst_qa_reporter_set_runner (GST_QA_REPORTER (monitor), - g_value_get_object (value)); - break; - case PROP_QA_PARENT: - monitor->parent = g_value_get_object (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gst_qa_monitor_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec) -{ - GstQaMonitor *monitor; - - monitor = GST_QA_MONITOR_CAST (object); - - switch (prop_id) { - case PROP_OBJECT: - g_value_set_object (value, GST_QA_MONITOR_GET_OBJECT (monitor)); - break; - case PROP_RUNNER: - g_value_set_object (value, GST_QA_MONITOR_GET_RUNNER (monitor)); - break; - case PROP_QA_PARENT: - g_value_set_object (value, GST_QA_MONITOR_GET_PARENT (monitor)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} diff --git a/validate/gst/qa/gst-qa-monitor.h b/validate/gst/qa/gst-qa-monitor.h deleted file mode 100644 index f97bcb6..0000000 --- a/validate/gst/qa/gst-qa-monitor.h +++ /dev/null @@ -1,109 +0,0 @@ -/* GStreamer - * Copyright (C) 2013 Thiago Santos - * - * gst-qa-monitor.h - QA Monitor abstract base class - * - * 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.1 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. - */ - -#ifndef __GST_QA_MONITOR_H__ -#define __GST_QA_MONITOR_H__ - -#include -#include -#include "gst-qa-report.h" -#include "gst-qa-reporter.h" -#include "gst-qa-runner.h" -#include "gst-qa-override.h" - -G_BEGIN_DECLS - -#define GST_TYPE_QA_MONITOR (gst_qa_monitor_get_type ()) -#define GST_IS_QA_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_QA_MONITOR)) -#define GST_IS_QA_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_QA_MONITOR)) -#define GST_QA_MONITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_QA_MONITOR, GstQaMonitorClass)) -#define GST_QA_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_QA_MONITOR, GstQaMonitor)) -#define GST_QA_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_QA_MONITOR, GstQaMonitorClass)) -#define GST_QA_MONITOR_CAST(obj) ((GstQaMonitor*)(obj)) -#define GST_QA_MONITOR_CLASS_CAST(klass) ((GstQaMonitorClass*)(klass)) - -#define GST_QA_MONITOR_GET_OBJECT(m) (GST_QA_MONITOR_CAST (m)->target) -#define GST_QA_MONITOR_GET_RUNNER(m) (gst_qa_reporter_get_runner (GST_QA_REPORTER_CAST (m))) -#define GST_QA_MONITOR_GET_PARENT(m) (GST_QA_MONITOR_CAST (m)->parent) -#define GST_QA_MONITOR_LOCK(m) (g_mutex_lock (&GST_QA_MONITOR_CAST(m)->mutex)) -#define GST_QA_MONITOR_UNLOCK(m) (g_mutex_unlock (&GST_QA_MONITOR_CAST(m)->mutex)) -#define GST_QA_MONITOR_OVERRIDES_LOCK(m) g_mutex_lock (&GST_QA_MONITOR_CAST (m)->overrides_mutex) -#define GST_QA_MONITOR_OVERRIDES_UNLOCK(m) g_mutex_unlock (&GST_QA_MONITOR_CAST (m)->overrides_mutex) -#define GST_QA_MONITOR_OVERRIDES(m) (GST_QA_MONITOR_CAST (m)->overrides) - -/* #else TODO Implemen no variadic macros, use inline, - * Problem being: - * GST_QA_REPORT_LEVEL_ ## status - * GST_QA_AREA_ ## area ## _ ## subarea - */ - -typedef struct _GstQaMonitor GstQaMonitor; -typedef struct _GstQaMonitorClass GstQaMonitorClass; - -/** - * GstQaMonitor: - * - * GStreamer QA Monitor class. - * - * Class that wraps a #GObject for QA checks - */ -struct _GstQaMonitor { - GObject object; - - GstObject *target; - GMutex mutex; - gchar *target_name; - - GstQaMonitor *parent; - - GMutex overrides_mutex; - GQueue overrides; - - /*< private >*/ - GHashTable *reports; -}; - -/** - * GstQaMonitorClass: - * @parent_class: parent - * - * GStreamer QA Monitor object class. - */ -struct _GstQaMonitorClass { - GObjectClass parent_class; - - gboolean (* setup) (GstQaMonitor * monitor); - GstElement *(* get_element) (GstQaMonitor * monitor); -}; - -/* normal GObject stuff */ -GType gst_qa_monitor_get_type (void); - -void gst_qa_monitor_attach_override (GstQaMonitor * monitor, - GstQaOverride * override); - -GstElement * gst_qa_monitor_get_element (GstQaMonitor * monitor); -const gchar * gst_qa_monitor_get_element_name (GstQaMonitor * monitor); - -G_END_DECLS - -#endif /* __GST_QA_MONITOR_H__ */ - diff --git a/validate/gst/qa/gst-qa-override-registry.c b/validate/gst/qa/gst-qa-override-registry.c deleted file mode 100644 index 3d029b0..0000000 --- a/validate/gst/qa/gst-qa-override-registry.c +++ /dev/null @@ -1,231 +0,0 @@ -/* GStreamer - * Copyright (C) 2013 Thiago Santos - * - * gst-qa-override-registry.c - QA Override Registry - * - * 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.1 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 - -#define __USE_GNU -#include - -#include "gst-qa-override-registry.h" - -typedef struct -{ - gchar *name; - GstQaOverride *override; -} GstQaOverrideRegistryNameEntry; - -typedef struct -{ - GType gtype; - GstQaOverride *override; -} GstQaOverrideRegistryGTypeEntry; - -static GMutex _gst_qa_override_registry_mutex; -static GstQaOverrideRegistry *_registry_default; - -#define GST_QA_OVERRIDE_REGISTRY_LOCK(r) g_mutex_lock (&r->mutex) -#define GST_QA_OVERRIDE_REGISTRY_UNLOCK(r) g_mutex_unlock (&r->mutex) - -#define GST_QA_OVERRIDE_INIT_SYMBOL "gst_qa_create_overrides" - -static GstQaOverrideRegistry * -gst_qa_override_registry_new (void) -{ - GstQaOverrideRegistry *reg = g_slice_new0 (GstQaOverrideRegistry); - - g_mutex_init (®->mutex); - g_queue_init (®->name_overrides); - g_queue_init (®->gtype_overrides); - g_queue_init (®->klass_overrides); - - return reg; -} - -GstQaOverrideRegistry * -gst_qa_override_registry_get (void) -{ - g_mutex_lock (&_gst_qa_override_registry_mutex); - if (G_UNLIKELY (!_registry_default)) { - _registry_default = gst_qa_override_registry_new (); - } - g_mutex_unlock (&_gst_qa_override_registry_mutex); - - return _registry_default; -} - -void -gst_qa_override_register_by_name (const gchar * name, GstQaOverride * override) -{ - GstQaOverrideRegistry *registry = gst_qa_override_registry_get (); - GstQaOverrideRegistryNameEntry *entry = - g_slice_new (GstQaOverrideRegistryNameEntry); - - GST_QA_OVERRIDE_REGISTRY_LOCK (registry); - entry->name = g_strdup (name); - entry->override = override; - g_queue_push_tail (®istry->name_overrides, entry); - GST_QA_OVERRIDE_REGISTRY_UNLOCK (registry); -} - -void -gst_qa_override_register_by_type (GType gtype, GstQaOverride * override) -{ - GstQaOverrideRegistry *registry = gst_qa_override_registry_get (); - GstQaOverrideRegistryGTypeEntry *entry = - g_slice_new (GstQaOverrideRegistryGTypeEntry); - - GST_QA_OVERRIDE_REGISTRY_LOCK (registry); - entry->gtype = gtype; - entry->override = override; - g_queue_push_tail (®istry->gtype_overrides, entry); - GST_QA_OVERRIDE_REGISTRY_UNLOCK (registry); -} - -void -gst_qa_override_register_by_klass (const gchar * klass, - GstQaOverride * override) -{ - GstQaOverrideRegistry *registry = gst_qa_override_registry_get (); - GstQaOverrideRegistryNameEntry *entry = - g_slice_new (GstQaOverrideRegistryNameEntry); - - GST_QA_OVERRIDE_REGISTRY_LOCK (registry); - entry->name = g_strdup (klass); - entry->override = override; - g_queue_push_tail (®istry->klass_overrides, entry); - GST_QA_OVERRIDE_REGISTRY_UNLOCK (registry); -} - -static void -gst_qa_override_registry_attach_name_overrides_unlocked (GstQaOverrideRegistry * - registry, GstQaMonitor * monitor) -{ - GstQaOverrideRegistryNameEntry *entry; - GList *iter; - const gchar *name; - - name = gst_qa_monitor_get_element_name (monitor); - for (iter = registry->name_overrides.head; iter; iter = g_list_next (iter)) { - entry = iter->data; - if (strcmp (name, entry->name) == 0) { - gst_qa_monitor_attach_override (monitor, entry->override); - } - } -} - -static void -gst_qa_override_registry_attach_gtype_overrides_unlocked (GstQaOverrideRegistry - * registry, GstQaMonitor * monitor) -{ - GstQaOverrideRegistryGTypeEntry *entry; - GstElement *element; - GList *iter; - - element = gst_qa_monitor_get_element (monitor); - if (!element) - return; - - for (iter = registry->name_overrides.head; iter; iter = g_list_next (iter)) { - entry = iter->data; - if (G_TYPE_CHECK_INSTANCE_TYPE (element, entry->gtype)) { - gst_qa_monitor_attach_override (monitor, entry->override); - } - } -} - -static void -gst_qa_override_registry_attach_klass_overrides_unlocked (GstQaOverrideRegistry - * registry, GstQaMonitor * monitor) -{ - GstQaOverrideRegistryNameEntry *entry; - GList *iter; - GstElement *element; - GstElementClass *klass; - - element = gst_qa_monitor_get_element (monitor); - if (!element) - return; - - klass = GST_ELEMENT_GET_CLASS (element); - - for (iter = registry->name_overrides.head; iter; iter = g_list_next (iter)) { - entry = iter->data; - /* TODO It would be more correct to split it before comparing */ - if (strstr (klass->details.klass, entry->name) != NULL) { - gst_qa_monitor_attach_override (monitor, entry->override); - } - } -} - -void -gst_qa_override_registry_attach_overrides (GstQaMonitor * monitor) -{ - GstQaOverrideRegistry *reg = gst_qa_override_registry_get (); - - GST_QA_OVERRIDE_REGISTRY_LOCK (reg); - gst_qa_override_registry_attach_name_overrides_unlocked (reg, monitor); - gst_qa_override_registry_attach_gtype_overrides_unlocked (reg, monitor); - gst_qa_override_registry_attach_klass_overrides_unlocked (reg, monitor); - GST_QA_OVERRIDE_REGISTRY_UNLOCK (reg); -} - -int -gst_qa_override_registry_preload (void) -{ - gchar **solist, *const *so; - const char *sos, *soerr; - void *sol; - int ret, (*entry) (void), nloaded = 0; - - sos = g_getenv ("GST_QA_OVERRIDE"); - if (!sos) { - GST_INFO ("No GST_QA_OVERRIDE found, no overrides to load"); - return 0; - } - solist = g_strsplit (sos, ",", 0); - for (so = solist; *so; ++so) { - GST_INFO ("Loading overrides from %s", *so); - sol = dlopen (*so, RTLD_LAZY); - if (!sol) { - soerr = dlerror (); - GST_ERROR ("Failed to load %s %s", *so, soerr ? soerr : "no idea why"); - continue; - } - entry = dlsym (sol, GST_QA_OVERRIDE_INIT_SYMBOL); - if (entry) { - ret = (*entry) (); - if (ret > 0) { - GST_INFO ("Loaded %d overrides from %s", ret, *so); - nloaded += ret; - } else if (ret < 0) { - GST_WARNING ("Error loading overrides from %s", *so); - } else { - GST_INFO ("Loaded no overrides from %s", *so); - } - } else { - GST_WARNING (GST_QA_OVERRIDE_INIT_SYMBOL " not found in %s", *so); - } - dlclose (sol); - } - g_strfreev (solist); - GST_INFO ("%d overrides loaded", nloaded); - return nloaded; -} diff --git a/validate/gst/qa/gst-qa-override.h b/validate/gst/qa/gst-qa-override.h deleted file mode 100644 index dbafe9c..0000000 --- a/validate/gst/qa/gst-qa-override.h +++ /dev/null @@ -1,79 +0,0 @@ -/* GStreamer - * Copyright (C) 2013 Thiago Santos - * - * gst-qa-override.h - QA Override that allows customizing QA behavior - * - * 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.1 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. - */ - -#ifndef __GST_QA_OVERRIDE_H__ -#define __GST_QA_OVERRIDE_H__ - -#include -#include -#include "gst-qa-report.h" - -G_BEGIN_DECLS - -typedef struct _QstQaOverride GstQaOverride; -typedef struct _GstQaMonitor GstQaMonitor; - -typedef void (*GstQaOverrideBufferHandler)(GstQaOverride * override, - GstQaMonitor * pad_monitor, GstBuffer * buffer); -typedef void (*GstQaOverrideEventHandler)(GstQaOverride * override, - GstQaMonitor * pad_monitor, GstEvent * event); -typedef void (*GstQaOverrideQueryHandler)(GstQaOverride * override, - GstQaMonitor * pad_monitor, GstQuery * query); -typedef void (*GstQaOverrideGetCapsHandler)(GstQaOverride * override, - GstQaMonitor * pad_monitor, GstCaps * caps); -typedef void (*GstQaOverrideSetCapsHandler)(GstQaOverride * override, - GstQaMonitor * pad_monitor, GstCaps * caps); - -struct _QstQaOverride { - GHashTable *level_override; - - /* Pad handlers */ - GstQaOverrideBufferHandler buffer_handler; - GstQaOverrideEventHandler event_handler; - GstQaOverrideQueryHandler query_handler; - GstQaOverrideBufferHandler buffer_probe_handler; - GstQaOverrideGetCapsHandler getcaps_handler; - GstQaOverrideSetCapsHandler setcaps_handler; -}; - -GstQaOverride * gst_qa_override_new (void); -void gst_qa_override_free (GstQaOverride * override); -void gst_qa_override_change_severity (GstQaOverride * override, GstQaIssueId issue_id, GstQaReportLevel new_level); -GstQaReportLevel gst_qa_override_get_severity (GstQaOverride * override, GstQaIssueId issue_id, GstQaReportLevel default_level); - -void gst_qa_override_event_handler (GstQaOverride * override, GstQaMonitor * monitor, GstEvent * event); -void gst_qa_override_buffer_handler (GstQaOverride * override, GstQaMonitor * monitor, GstBuffer * buffer); -void gst_qa_override_query_handler (GstQaOverride * override, GstQaMonitor * monitor, GstQuery * query); -void gst_qa_override_buffer_probe_handler (GstQaOverride * override, GstQaMonitor * monitor, GstBuffer * buffer); -void gst_qa_override_getcaps_handler (GstQaOverride * override, GstQaMonitor * monitor, GstCaps * caps); -void gst_qa_override_setcaps_handler (GstQaOverride * override, GstQaMonitor * monitor, GstCaps * caps); - -void gst_qa_override_set_event_handler (GstQaOverride * override, GstQaOverrideEventHandler handler); -void gst_qa_override_set_buffer_handler (GstQaOverride * override, GstQaOverrideBufferHandler handler); -void gst_qa_override_set_query_handler (GstQaOverride * override, GstQaOverrideQueryHandler handler); -void gst_qa_override_set_buffer_probe_handler (GstQaOverride * override, GstQaOverrideBufferHandler handler); -void gst_qa_override_set_getcaps_handler (GstQaOverride * override, GstQaOverrideGetCapsHandler handler); -void gst_qa_override_set_setcaps_handler (GstQaOverride * override, GstQaOverrideSetCapsHandler handler); - -G_END_DECLS - -#endif /* __GST_QA_OVERRIDE_H__ */ - diff --git a/validate/gst/qa/gst-qa-report.c b/validate/gst/qa/gst-qa-report.c deleted file mode 100644 index 45f1169..0000000 --- a/validate/gst/qa/gst-qa-report.c +++ /dev/null @@ -1,343 +0,0 @@ -/* GStreamer - * Copyright (C) 2013 Thiago Santos - * - * gst-qa-monitor-report.c - QA report/issues functions - * - * 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.1 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. - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include -#include "gst-qa-i18n-lib.h" - -#include "gst-qa-report.h" -#include "gst-qa-reporter.h" -#include "gst-qa-monitor.h" - -static GstClockTime _gst_qa_report_start_time = 0; -static GstQaDebugFlags _gst_qa_flags = 0; -static GHashTable *_gst_qa_issues = NULL; - -G_DEFINE_BOXED_TYPE (GstQaReport, gst_qa_report, - (GBoxedCopyFunc) gst_qa_report_ref, (GBoxedFreeFunc) gst_qa_report_unref); - -GstQaIssueId -gst_qa_issue_get_id (GstQaIssue * issue) -{ - return issue->issue_id; -} - -GstQaIssue * -gst_qa_issue_new (GstQaIssueId issue_id, gchar * summary, - gchar * description, GstQaReportLevel default_level) -{ - GstQaIssue *issue = g_slice_new (GstQaIssue); - - issue->issue_id = issue_id; - issue->summary = summary; - issue->description = description; - issue->default_level = default_level; - issue->repeat = FALSE; - - return issue; -} - -static void -gst_qa_issue_free (GstQaIssue * issue) -{ - g_free (issue->summary); - g_free (issue->description); - g_slice_free (GstQaIssue, issue); -} - -void -gst_qa_issue_register (GstQaIssue * issue) -{ - g_return_if_fail (g_hash_table_lookup (_gst_qa_issues, - (gpointer) gst_qa_issue_get_id (issue)) == NULL); - - g_hash_table_insert (_gst_qa_issues, (gpointer) gst_qa_issue_get_id (issue), - issue); -} - -#define REGISTER_QA_ISSUE(id,sum,desc,lvl) gst_qa_issue_register (gst_qa_issue_new (id, sum, desc, lvl)) -static void -gst_qa_report_load_issues (void) -{ - g_return_if_fail (_gst_qa_issues == NULL); - - _gst_qa_issues = g_hash_table_new_full (g_direct_hash, g_direct_equal, - NULL, (GDestroyNotify) gst_qa_issue_free); - - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_BUFFER_BEFORE_SEGMENT, - _("buffer was received before a segment"), - _("in push mode, a segment event must be received before a buffer"), - GST_QA_REPORT_LEVEL_WARNING); - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_BUFFER_IS_OUT_OF_SEGMENT, - _("buffer is out of the segment range"), - _("buffer being pushed is out of the current segment's start-stop " - " range. Meaning it is going to be discarded downstream without " - "any use"), GST_QA_REPORT_LEVEL_ISSUE); - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_BUFFER_TIMESTAMP_OUT_OF_RECEIVED_RANGE, - _("buffer timestamp is out of the received buffer timestamps' range"), - _("a buffer leaving an element should have its timestamps in the range " - "of the received buffers timestamps. i.e. If an element received " - "buffers with timestamps from 0s to 10s, it can't push a buffer with " - "with a 11s timestamp, because it doesn't have data for that"), - GST_QA_REPORT_LEVEL_WARNING); - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_FIRST_BUFFER_RUNNING_TIME_IS_NOT_ZERO, - _("first buffer's running time isn't 0"), - _("the first buffer's received running time is expected to be 0"), - GST_QA_REPORT_LEVEL_WARNING); - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_WRONG_FLOW_RETURN, _("flow return from pad push doesn't match expected value"), _("flow return from a 1:1 sink/src pad element is as simple as " "returning what downstream returned. For elements that have multiple " "src pads, flow returns should be properly combined"), /* TODO fill me more */ - GST_QA_REPORT_LEVEL_CRITICAL); - - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_CAPS_IS_MISSING_FIELD, - _("caps is missing a required field for its type"), - _("some caps types are expected to contain a set of basic fields. " - "For example, raw video should have 'width', 'height', 'framerate' " - "and 'pixel-aspect-ratio'"), GST_QA_REPORT_LEVEL_ISSUE); - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_CAPS_FIELD_HAS_BAD_TYPE, - _("caps field has an unexpected type"), - _("some common caps fields should always use the same expected types"), - GST_QA_REPORT_LEVEL_WARNING); - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_CAPS_EXPECTED_FIELD_NOT_FOUND, - _("caps expected field wasn't present"), - _("a field that should be present in the caps wasn't found. " - "Fields sets on a sink pad caps should be propagated downstream " - "when it makes sense to do so"), GST_QA_REPORT_LEVEL_WARNING); - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_GET_CAPS_NOT_PROXYING_FIELDS, - _("getcaps function isn't proxying downstream fields correctly"), - _("elements should set downstream caps restrictions on its caps when " - "replying upstream's getcaps queries to avoid upstream sending data" - " in an unsupported format"), GST_QA_REPORT_LEVEL_CRITICAL); - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_CAPS_FIELD_UNEXPECTED_VALUE, - _("a field in caps has an unexpected value"), - _("fields set on a sink pad should be propagated downstream via " - "set caps"), GST_QA_REPORT_LEVEL_CRITICAL); - - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_EVENT_NEWSEGMENT_NOT_PUSHED, - _("new segment event wasn't propagated downstream"), - _("segments received from upstream should be pushed downstream"), - GST_QA_REPORT_LEVEL_WARNING); - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_SERIALIZED_EVENT_WASNT_PUSHED_IN_TIME, - _("a serialized event received should be pushed in the same 'time' " - "as it was received"), - _("serialized events should be pushed in the same order they are " - "received and serialized with buffers. If an event is received after" - " a buffer with timestamp end 'X', it should be pushed right after " - "buffers with timestamp end 'X'"), GST_QA_REPORT_LEVEL_WARNING); - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_EVENT_HAS_WRONG_SEQNUM, - _("events that are part of the same pipeline 'operation' should " - "have the same seqnum"), - _("when events/messages are created from another event/message, " - "they should have their seqnums set to the original event/message " - "seqnum"), GST_QA_REPORT_LEVEL_ISSUE); - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_EVENT_SERIALIZED_OUT_OF_ORDER, - _("a serialized event received should be pushed in the same order " - "as it was received"), - _("serialized events should be pushed in the same order they are " - "received."), GST_QA_REPORT_LEVEL_WARNING); - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_EVENT_NEW_SEGMENT_MISMATCH, - _("a new segment event has different value than the received one"), - _("when receiving a new segment, an element should push an equivalent" - "segment downstream"), GST_QA_REPORT_LEVEL_WARNING); - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_EVENT_FLUSH_START_UNEXPECTED, - _("received an unexpected flush start event"), - NULL, GST_QA_REPORT_LEVEL_WARNING); - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_EVENT_FLUSH_STOP_UNEXPECTED, - _("received an unexpected flush stop event"), - NULL, GST_QA_REPORT_LEVEL_WARNING); - - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_EVENT_SEEK_NOT_HANDLED, - _("seek event wasn't handled"), NULL, GST_QA_REPORT_LEVEL_CRITICAL); - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_EVENT_SEEK_RESULT_POSITION_WRONG, - _("position after a seek is wrong"), NULL, GST_QA_REPORT_LEVEL_CRITICAL); - - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_STATE_CHANGE_FAILURE, - _("state change failed"), NULL, GST_QA_REPORT_LEVEL_CRITICAL); - - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_FILE_SIZE_IS_ZERO, - _("resulting file size is 0"), NULL, GST_QA_REPORT_LEVEL_CRITICAL); - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_FILE_SIZE_INCORRECT, - _("resulting file size wasn't within the expected values"), - NULL, GST_QA_REPORT_LEVEL_WARNING); - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_FILE_DURATION_INCORRECT, - _("resulting file duration wasn't within the expected values"), - NULL, GST_QA_REPORT_LEVEL_WARNING); - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_FILE_SEEKABLE_INCORRECT, - _("resulting file wasn't seekable or not seekable as expected"), - NULL, GST_QA_REPORT_LEVEL_WARNING); - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_FILE_PROFILE_INCORRECT, - _("resulting file stream profiles didn't match expected values"), - NULL, GST_QA_REPORT_LEVEL_CRITICAL); - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_FILE_NOT_FOUND, - _("resulting file could not be found for testing"), NULL, - GST_QA_REPORT_LEVEL_CRITICAL); - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_FILE_CHECK_FAILURE, - _("an error occured while checking the file for conformance"), NULL, - GST_QA_REPORT_LEVEL_CRITICAL); - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_FILE_PLAYBACK_START_FAILURE, - _("an error occured while starting playback of the test file"), NULL, - GST_QA_REPORT_LEVEL_CRITICAL); - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_FILE_PLAYBACK_ERROR, - _("an error during playback of the file"), NULL, - GST_QA_REPORT_LEVEL_CRITICAL); - - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_ALLOCATION_FAILURE, - _("a memory allocation failed during QA run"), - NULL, GST_QA_REPORT_LEVEL_CRITICAL); - REGISTER_QA_ISSUE (GST_QA_ISSUE_ID_MISSING_PLUGIN, - _("a gstreamer plugin is missing and prevented QA from running"), - NULL, GST_QA_REPORT_LEVEL_CRITICAL); -} - -void -gst_qa_report_init (void) -{ - const gchar *var; - const GDebugKey keys[] = { - {"fatal_criticals", GST_QA_FATAL_CRITICALS}, - {"fatal_warnings", GST_QA_FATAL_WARNINGS}, - {"fatal_issues", GST_QA_FATAL_ISSUES} - }; - - if (_gst_qa_report_start_time == 0) { - _gst_qa_report_start_time = gst_util_get_timestamp (); - - /* init the debug flags */ - var = g_getenv ("GST_QA"); - if (var && strlen (var) > 0) { - _gst_qa_flags = g_parse_debug_string (var, keys, 3); - } - - gst_qa_report_load_issues (); - } -} - -GstQaIssue * -gst_qa_issue_from_id (GstQaIssueId issue_id) -{ - return g_hash_table_lookup (_gst_qa_issues, (gpointer) issue_id); -} - -/* TODO how are these functions going to work with extensions */ -const gchar * -gst_qa_report_level_get_name (GstQaReportLevel level) -{ - switch (level) { - case GST_QA_REPORT_LEVEL_CRITICAL: - return "critical"; - case GST_QA_REPORT_LEVEL_WARNING: - return "warning"; - case GST_QA_REPORT_LEVEL_ISSUE: - return "issue"; - case GST_QA_REPORT_LEVEL_IGNORE: - return "ignore"; - default: - return "unknown"; - } -} - -const gchar * -gst_qa_report_area_get_name (GstQaReportArea area) -{ - switch (area) { - case GST_QA_AREA_EVENT: - return "event"; - case GST_QA_AREA_BUFFER: - return "buffer"; - case GST_QA_AREA_QUERY: - return "query"; - case GST_QA_AREA_CAPS: - return "caps"; - case GST_QA_AREA_SEEK: - return "seek"; - case GST_QA_AREA_STATE: - return "state"; - case GST_QA_AREA_FILE_CHECK: - return "file-check"; - case GST_QA_AREA_RUN_ERROR: - return "run-error"; - case GST_QA_AREA_OTHER: - return "other"; - default: - g_assert_not_reached (); - return "unknown"; - } -} - -void -gst_qa_report_check_abort (GstQaReport * report) -{ - if ((report->level == GST_QA_REPORT_LEVEL_ISSUE && - _gst_qa_flags & GST_QA_FATAL_ISSUES) || - (report->level == GST_QA_REPORT_LEVEL_WARNING && - _gst_qa_flags & GST_QA_FATAL_WARNINGS) || - (report->level == GST_QA_REPORT_LEVEL_CRITICAL && - _gst_qa_flags & GST_QA_FATAL_CRITICALS)) { - g_error ("Fatal report received: %" GST_QA_ERROR_REPORT_PRINT_FORMAT, - GST_QA_REPORT_PRINT_ARGS (report)); - } -} - -GstQaIssueId -gst_qa_report_get_issue_id (GstQaReport * report) -{ - return gst_qa_issue_get_id (report->issue); -} - -GstQaReport * -gst_qa_report_new (GstQaIssue * issue, GstQaReporter * reporter, - const gchar * message) -{ - GstQaReport *report = g_slice_new0 (GstQaReport); - - report->issue = issue; - report->reporter = reporter; /* TODO should we ref? */ - report->message = g_strdup (message); - report->timestamp = gst_util_get_timestamp () - _gst_qa_report_start_time; - report->level = issue->default_level; - - return report; -} - -void -gst_qa_report_unref (GstQaReport * report) -{ - if (G_UNLIKELY (g_atomic_int_dec_and_test (&report->refcount))) { - g_free (report->message); - g_slice_free (GstQaReport, report); - } -} - -GstQaReport * -gst_qa_report_ref (GstQaReport * report) -{ - g_atomic_int_inc (&report->refcount); - - return report; -} - -void -gst_qa_report_printf (GstQaReport * report) -{ - g_print ("%" GST_QA_ERROR_REPORT_PRINT_FORMAT "\n", - GST_QA_REPORT_PRINT_ARGS (report)); -} diff --git a/validate/gst/qa/gst-qa-report.h b/validate/gst/qa/gst-qa-report.h deleted file mode 100644 index 33089c1..0000000 --- a/validate/gst/qa/gst-qa-report.h +++ /dev/null @@ -1,189 +0,0 @@ -/* GStreamer - * Copyright (C) 2013 Thiago Santos - * - * gst-qa-monitor-report.h - QA Element report structures and functions - * - * 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.1 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. - */ - -#ifndef __GST_QA_REPORT_H__ -#define __GST_QA_REPORT_H__ - -#include -#include - -G_BEGIN_DECLS - -/* forward declaration */ -typedef struct _GstQaReporter GstQaReporter; - -GType gst_qa_report_get_type (void); -#define GST_TYPE_QA_REPORT (gst_qa_report_get_type ()) - -typedef enum { - GST_QA_FATAL_DEFAULT = 0, - GST_QA_FATAL_ISSUES = 1 << 0, - GST_QA_FATAL_WARNINGS = 1 << 1, - GST_QA_FATAL_CRITICALS = 1 << 2 -} GstQaDebugFlags; - -typedef enum { - GST_QA_REPORT_LEVEL_CRITICAL, - GST_QA_REPORT_LEVEL_WARNING, - GST_QA_REPORT_LEVEL_ISSUE, - GST_QA_REPORT_LEVEL_IGNORE, - GST_QA_REPORT_LEVEL_NUM_ENTRIES, -} GstQaReportLevel; - -typedef enum { - GST_QA_AREA_EVENT=1, - GST_QA_AREA_BUFFER, - GST_QA_AREA_QUERY, - GST_QA_AREA_CAPS, - GST_QA_AREA_SEEK, - GST_QA_AREA_STATE, - GST_QA_AREA_FILE_CHECK, - GST_QA_AREA_RUN_ERROR, - GST_QA_AREA_OTHER=100, -} GstQaReportArea; - -typedef guintptr GstQaIssueId; -#define GST_QA_ISSUE_ID_UNKNOWN 0 - -#define GST_QA_ISSUE_ID_SHIFT 16 -#define GST_QA_ISSUE_ID_CUSTOM_FIRST (2 << 15) - -#define GST_QA_ISSUE_ID_BUFFER_BEFORE_SEGMENT (((GstQaIssueId) GST_QA_AREA_BUFFER) << GST_QA_ISSUE_ID_SHIFT | 1) -#define GST_QA_ISSUE_ID_BUFFER_IS_OUT_OF_SEGMENT (((GstQaIssueId) GST_QA_AREA_BUFFER) << GST_QA_ISSUE_ID_SHIFT | 2) -#define GST_QA_ISSUE_ID_BUFFER_TIMESTAMP_OUT_OF_RECEIVED_RANGE (((GstQaIssueId) GST_QA_AREA_BUFFER) << GST_QA_ISSUE_ID_SHIFT | 3) -#define GST_QA_ISSUE_ID_FIRST_BUFFER_RUNNING_TIME_IS_NOT_ZERO (((GstQaIssueId) GST_QA_AREA_BUFFER) << GST_QA_ISSUE_ID_SHIFT | 4) -#define GST_QA_ISSUE_ID_WRONG_FLOW_RETURN (((GstQaIssueId) GST_QA_AREA_BUFFER) << GST_QA_ISSUE_ID_SHIFT | 5) - -#define GST_QA_ISSUE_ID_CAPS_IS_MISSING_FIELD (((GstQaIssueId) GST_QA_AREA_CAPS) << GST_QA_ISSUE_ID_SHIFT | 1) -#define GST_QA_ISSUE_ID_CAPS_FIELD_HAS_BAD_TYPE (((GstQaIssueId) GST_QA_AREA_CAPS) << GST_QA_ISSUE_ID_SHIFT | 2) -#define GST_QA_ISSUE_ID_CAPS_EXPECTED_FIELD_NOT_FOUND (((GstQaIssueId) GST_QA_AREA_CAPS) << GST_QA_ISSUE_ID_SHIFT | 3) -#define GST_QA_ISSUE_ID_GET_CAPS_NOT_PROXYING_FIELDS (((GstQaIssueId) GST_QA_AREA_CAPS) << GST_QA_ISSUE_ID_SHIFT | 4) -#define GST_QA_ISSUE_ID_CAPS_FIELD_UNEXPECTED_VALUE (((GstQaIssueId) GST_QA_AREA_CAPS) << GST_QA_ISSUE_ID_SHIFT | 5) - -#define GST_QA_ISSUE_ID_EVENT_NEWSEGMENT_NOT_PUSHED (((GstQaIssueId) GST_QA_AREA_EVENT) << GST_QA_ISSUE_ID_SHIFT | 1) -#define GST_QA_ISSUE_ID_SERIALIZED_EVENT_WASNT_PUSHED_IN_TIME (((GstQaIssueId) GST_QA_AREA_EVENT) << GST_QA_ISSUE_ID_SHIFT | 2) -#define GST_QA_ISSUE_ID_EVENT_HAS_WRONG_SEQNUM (((GstQaIssueId) GST_QA_AREA_EVENT) << GST_QA_ISSUE_ID_SHIFT | 3) -#define GST_QA_ISSUE_ID_EVENT_SERIALIZED_OUT_OF_ORDER (((GstQaIssueId) GST_QA_AREA_EVENT) << GST_QA_ISSUE_ID_SHIFT | 4) -#define GST_QA_ISSUE_ID_EVENT_NEW_SEGMENT_MISMATCH (((GstQaIssueId) GST_QA_AREA_EVENT) << GST_QA_ISSUE_ID_SHIFT | 5) -#define GST_QA_ISSUE_ID_EVENT_FLUSH_START_UNEXPECTED (((GstQaIssueId) GST_QA_AREA_EVENT) << GST_QA_ISSUE_ID_SHIFT | 6) -#define GST_QA_ISSUE_ID_EVENT_FLUSH_STOP_UNEXPECTED (((GstQaIssueId) GST_QA_AREA_EVENT) << GST_QA_ISSUE_ID_SHIFT | 7) - -#define GST_QA_ISSUE_ID_EVENT_SEEK_NOT_HANDLED (((GstQaIssueId) GST_QA_AREA_SEEK) << GST_QA_ISSUE_ID_SHIFT | 1) -#define GST_QA_ISSUE_ID_EVENT_SEEK_RESULT_POSITION_WRONG (((GstQaIssueId) GST_QA_AREA_SEEK) << GST_QA_ISSUE_ID_SHIFT | 2) - -#define GST_QA_ISSUE_ID_STATE_CHANGE_FAILURE (((GstQaIssueId) GST_QA_AREA_STATE) << GST_QA_ISSUE_ID_SHIFT | 1) - -#define GST_QA_ISSUE_ID_FILE_SIZE_IS_ZERO (((GstQaIssueId) GST_QA_AREA_FILE_CHECK) << GST_QA_ISSUE_ID_SHIFT | 1) -#define GST_QA_ISSUE_ID_FILE_SIZE_INCORRECT (((GstQaIssueId) GST_QA_AREA_FILE_CHECK) << GST_QA_ISSUE_ID_SHIFT | 2) -#define GST_QA_ISSUE_ID_FILE_DURATION_INCORRECT (((GstQaIssueId) GST_QA_AREA_FILE_CHECK) << GST_QA_ISSUE_ID_SHIFT | 3) -#define GST_QA_ISSUE_ID_FILE_SEEKABLE_INCORRECT (((GstQaIssueId) GST_QA_AREA_FILE_CHECK) << GST_QA_ISSUE_ID_SHIFT | 4) -#define GST_QA_ISSUE_ID_FILE_PROFILE_INCORRECT (((GstQaIssueId) GST_QA_AREA_FILE_CHECK) << GST_QA_ISSUE_ID_SHIFT | 5) -#define GST_QA_ISSUE_ID_FILE_NOT_FOUND (((GstQaIssueId) GST_QA_AREA_FILE_CHECK) << GST_QA_ISSUE_ID_SHIFT | 6) -#define GST_QA_ISSUE_ID_FILE_CHECK_FAILURE (((GstQaIssueId) GST_QA_AREA_FILE_CHECK) << GST_QA_ISSUE_ID_SHIFT | 7) -#define GST_QA_ISSUE_ID_FILE_PLAYBACK_START_FAILURE (((GstQaIssueId) GST_QA_AREA_FILE_CHECK) << GST_QA_ISSUE_ID_SHIFT | 8) -#define GST_QA_ISSUE_ID_FILE_PLAYBACK_ERROR (((GstQaIssueId) GST_QA_AREA_FILE_CHECK) << GST_QA_ISSUE_ID_SHIFT | 9) - -#define GST_QA_ISSUE_ID_ALLOCATION_FAILURE (((GstQaIssueId) GST_QA_AREA_RUN_ERROR) << GST_QA_ISSUE_ID_SHIFT | 1) -#define GST_QA_ISSUE_ID_MISSING_PLUGIN (((GstQaIssueId) GST_QA_AREA_RUN_ERROR) << GST_QA_ISSUE_ID_SHIFT | 2) - -#define GST_QA_ISSUE_ID_AREA(id) ((guintptr)(id >> GST_QA_ISSUE_ID_SHIFT)) - -typedef struct { - GstQaIssueId issue_id; - - /* Summary: one-liner translatable description of the issue */ - gchar *summary; - /* description: multi-line translatable description of: - * * what the issue is (and why it's an issue) - * * what the source problem could be - * * pointers to fixing the issue - */ - gchar *description; - - /* default_level: The default level of severity for this - * issue. */ - GstQaReportLevel default_level; - - /* repeat: whether the issue might be triggered - * multiple times but only remembered once */ - gboolean repeat; -} GstQaIssue; - -#define GST_QA_ISSUE_AREA(i) (GST_QA_ISSUE_ID_AREA (gst_qa_issue_get_id (i))) - -typedef struct { - gint refcount; - - /* issue: The issue this report corresponds to (to get dsecription, summary,...) */ - GstQaIssue *issue; - - GstQaReportLevel level; - - /* The reporter that reported the issue (to get names, info, ...) */ - GstQaReporter *reporter; - - /* timestamp: The time at which this issue happened since - * the process start (to stay in sync with gst logging) */ - GstClockTime timestamp; - - /* message: issue-specific message. Gives more detail on the actual - * issue. Can be NULL */ - gchar *message; -} GstQaReport; - -#define GST_QA_ISSUE_FORMAT G_GUINTPTR_FORMAT " (%s) : %s(%" G_GUINTPTR_FORMAT "): %s" -#define GST_QA_ISSUE_ARGS(i) gst_qa_issue_get_id (i), gst_qa_report_level_get_name (i->default_level), \ - gst_qa_report_area_get_name (GST_QA_ISSUE_AREA (i)), GST_QA_ISSUE_AREA (i), \ - i->summary - -#define GST_QA_ERROR_REPORT_PRINT_FORMAT GST_TIME_FORMAT " <%s>: %" GST_QA_ISSUE_FORMAT ": %s" -#define GST_QA_REPORT_PRINT_ARGS(r) GST_TIME_ARGS (r->timestamp), \ - gst_qa_reporter_get_name (r->reporter), \ - GST_QA_ISSUE_ARGS (r->issue), \ - r->message - -void gst_qa_report_init (void); -GstQaIssue * gst_qa_issue_from_id (GstQaIssueId issue_id); -GstQaIssueId gst_qa_issue_get_id (GstQaIssue * issue); -void gst_qa_issue_register (GstQaIssue * issue); -GstQaIssue * gst_qa_issue_new (GstQaIssueId issue_id, gchar * summary, - gchar * description, - GstQaReportLevel default_level); - -GstQaReport * gst_qa_report_new (GstQaIssue * issue, - GstQaReporter * reporter, - const gchar * message); -void gst_qa_report_unref (GstQaReport * report); -GstQaReport * gst_qa_report_ref (GstQaReport * report); - -GstQaIssueId gst_qa_report_get_issue_id (GstQaReport * report); - -void gst_qa_report_check_abort (GstQaReport * report); -void gst_qa_report_printf (GstQaReport * report); - -const gchar * gst_qa_report_level_get_name (GstQaReportLevel level); -const gchar * gst_qa_report_area_get_name (GstQaReportArea area); -const gchar * gst_qa_report_subarea_get_name (GstQaReportArea area, gint subarea); - -G_END_DECLS - -#endif /* __GST_QA_REPORT_H__ */ - diff --git a/validate/gst/qa/gst-qa-reporter.c b/validate/gst/qa/gst-qa-reporter.c deleted file mode 100644 index 36e2aec..0000000 --- a/validate/gst/qa/gst-qa-reporter.c +++ /dev/null @@ -1,183 +0,0 @@ -/* GStreamer - * - * Copyright (C) 2013 Thibault Saunier - * - * 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-qa-reporter.h" -#include "gst-qa-report.h" - -#define REPORTER_PRIVATE "gst-qa-reporter-private" - -GST_DEBUG_CATEGORY_STATIC (gst_qa_reporter); -#define GST_CAT_DEFAULT gst_qa_reporter - -typedef struct _GstQaReporterPrivate -{ - GstQaRunner *runner; - GHashTable *reports; - char *name; -} GstQaReporterPrivate; - -static void -gst_qa_reporter_default_init (GstQaReporterInterface * iface) -{ - GST_DEBUG_CATEGORY_INIT (gst_qa_reporter, "gstqareporter", - GST_DEBUG_FG_MAGENTA, "gst qa reporter"); - - g_object_interface_install_property (iface, - g_param_spec_object ("qa-runner", "QA Runner", "The QA runner to " - "report errors to", GST_TYPE_QA_RUNNER, - G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)); -} - -G_DEFINE_INTERFACE (GstQaReporter, gst_qa_reporter, G_TYPE_OBJECT); - -static void -_free_priv (GstQaReporterPrivate * priv) -{ - g_hash_table_unref (priv->reports); - g_free (priv->name); -} - -static GstQaReporterPrivate * -gst_qa_reporter_get_priv (GstQaReporter * reporter) -{ - GstQaReporterPrivate *priv = - g_object_get_data (G_OBJECT (reporter), REPORTER_PRIVATE); - - if (priv == NULL) { - priv = g_slice_new0 (GstQaReporterPrivate); - priv->reports = g_hash_table_new_full (g_direct_hash, - g_direct_equal, NULL, (GDestroyNotify) gst_qa_report_unref); - - g_object_set_data_full (G_OBJECT (reporter), REPORTER_PRIVATE, priv, - (GDestroyNotify) _free_priv); - } - - return priv; -} - -static void -gst_qa_reporter_intercept_report (GstQaReporter * reporter, - GstQaReport * report) -{ - GstQaReporterInterface *iface = GST_QA_REPORTER_GET_INTERFACE (reporter); - - if (iface->intercept_report) { - iface->intercept_report (reporter, report); - } -} - -void -gst_qa_report_valist (GstQaReporter * reporter, - GstQaIssueId issue_id, const gchar * format, va_list var_args) -{ - GstQaReport *report; - gchar *message; - GstQaIssue *issue; - GstQaReporterPrivate *priv = gst_qa_reporter_get_priv (reporter); - - issue = gst_qa_issue_from_id (issue_id); - - g_return_if_fail (issue != NULL); - - message = g_strdup_vprintf (format, var_args); - report = gst_qa_report_new (issue, reporter, message); - - gst_qa_reporter_intercept_report (reporter, report); - - if (issue->repeat == FALSE) { - GstQaIssueId issue_id = gst_qa_issue_get_id (issue); - - if (g_hash_table_lookup (priv->reports, (gconstpointer) issue_id)) { - GST_DEBUG ("Report \"%" G_GUINTPTR_FORMAT ":%s\" already present", - issue_id, issue->summary); - gst_qa_report_unref (report); - return; - } - - g_hash_table_insert (priv->reports, (gpointer) issue_id, report); - } - - if (report->level == GST_QA_REPORT_LEVEL_CRITICAL) - GST_ERROR ("<%s>: %s", priv->name, message); - else if (report->level == GST_QA_REPORT_LEVEL_WARNING) - GST_WARNING ("<%s>: %s", priv->name, message); - else if (report->level == GST_QA_REPORT_LEVEL_ISSUE) - GST_LOG ("<%s>: %s", priv->name, message); - else - GST_DEBUG ("<%s>: %s", priv->name, message); - - GST_INFO_OBJECT (reporter, "Received error report %" GST_QA_ISSUE_FORMAT - " : %s", GST_QA_ISSUE_ARGS (issue), message); - gst_qa_report_printf (report); - gst_qa_report_check_abort (report); - - if (priv->runner) { - gst_qa_runner_add_report (priv->runner, report); - } else { - gst_qa_report_unref (report); - } - - g_free (message); -} - -void -gst_qa_report (GstQaReporter * reporter, GstQaIssueId issue_id, - const gchar * format, ...) -{ - va_list var_args; - - va_start (var_args, format); - gst_qa_report_valist (reporter, issue_id, format, var_args); - va_end (var_args); -} - -void -gst_qa_reporter_set_name (GstQaReporter * reporter, gchar * name) -{ - GstQaReporterPrivate *priv = gst_qa_reporter_get_priv (reporter); - - if (priv->name) - g_free (priv->name); - - priv->name = name; -} - -const gchar * -gst_qa_reporter_get_name (GstQaReporter * reporter) -{ - GstQaReporterPrivate *priv = gst_qa_reporter_get_priv (reporter); - - return priv->name; -} - -GstQaRunner * -gst_qa_reporter_get_runner (GstQaReporter * reporter) -{ - GstQaReporterPrivate *priv = gst_qa_reporter_get_priv (reporter); - - return priv->runner; -} - -void -gst_qa_reporter_set_runner (GstQaReporter * reporter, GstQaRunner * runner) -{ - GstQaReporterPrivate *priv = gst_qa_reporter_get_priv (reporter); - - priv->runner = runner; -} diff --git a/validate/gst/qa/gst-qa-reporter.h b/validate/gst/qa/gst-qa-reporter.h deleted file mode 100644 index 0125c46..0000000 --- a/validate/gst/qa/gst-qa-reporter.h +++ /dev/null @@ -1,83 +0,0 @@ -/* GStreamer - * - * Copyright (C) 2013 Thibault Saunier - * - * 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. - */ -#ifndef _GST_QA_REPORTER_ -#define _GST_QA_REPORTER_ - -#include -#include "gst-qa-runner.h" -#include "gst-qa-report.h" - -G_BEGIN_DECLS - -typedef struct _GstQaReporter GstQaReporter; -typedef struct _GstQaReporterInterface GstQaReporterInterface; - -/* GstQaReporter interface declarations */ -#define GST_TYPE_QA_REPORTER (gst_qa_reporter_get_type ()) -#define GST_QA_REPORTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_QA_REPORTER, GstQaReporter)) -#define GST_IS_QA_REPORTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_QA_REPORTER)) -#define GST_QA_REPORTER_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_QA_REPORTER, GstQaReporterInterface)) -#define GST_QA_REPORTER_CAST(obj) ((GstQaReporter *) obj) - -#ifdef G_HAVE_ISO_VARARGS -#define GST_QA_REPORT(m, issue_id, ...) \ -G_STMT_START { \ - gst_qa_report (GST_QA_REPORTER (m), issue_id, \ - __VA_ARGS__ ); \ -} G_STMT_END - -#else /* G_HAVE_GNUC_VARARGS */ -#ifdef G_HAVE_GNUC_VARARGS -#define GST_QA_REPORT(m, issue_id, args...) \ -G_STMT_START { \ - gst_qa_report (GST_QA_REPORTER (m), \ - issue_id, ##args ); \ -} G_STMT_END - -#endif /* G_HAVE_ISO_VARARGS */ -#endif /* G_HAVE_GNUC_VARARGS */ - -GType gst_qa_reporter_get_type (void); - -/** - * GstQaReporter: - */ -struct _GstQaReporterInterface -{ - GTypeInterface parent; - - void (*intercept_report)(GstQaReporter * reporter, GstQaReport * report); -}; - -void gst_qa_reporter_set_name (GstQaReporter * reporter, - gchar * name); -const gchar * gst_qa_reporter_get_name (GstQaReporter * reporter); -GstQaRunner * gst_qa_reporter_get_runner (GstQaReporter *reporter); -void gst_qa_reporter_init (GstQaReporter * reporter, const gchar *name); -void gst_qa_report (GstQaReporter * reporter, GstQaIssueId issue_id, - const gchar * format, ...); -void gst_qa_report_valist (GstQaReporter * reporter, GstQaIssueId issue_id, - const gchar * format, va_list var_args); - -void gst_qa_reporter_set_runner (GstQaReporter * reporter, - GstQaRunner *runner); - -G_END_DECLS -#endif /* _GST_QA_REPORTER_ */ diff --git a/validate/gst/qa/gst-qa-runner.h b/validate/gst/qa/gst-qa-runner.h deleted file mode 100644 index 454535c..0000000 --- a/validate/gst/qa/gst-qa-runner.h +++ /dev/null @@ -1,87 +0,0 @@ -/* GStreamer - * Copyright (C) 2013 Thiago Santos - * - * gst-qa-runner.h - QA Runner class - * - * 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.1 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. - */ - -#ifndef __GST_QA_RUNNER_H__ -#define __GST_QA_RUNNER_H__ - -#include -#include - -#include "gst-qa-report.h" - -G_BEGIN_DECLS - -/* forward declaration */ -typedef struct _GstQaScenario GstQaScenario; - -#define GST_TYPE_QA_RUNNER (gst_qa_runner_get_type ()) -#define GST_IS_QA_RUNNER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_QA_RUNNER)) -#define GST_IS_QA_RUNNER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_QA_RUNNER)) -#define GST_QA_RUNNER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_QA_RUNNER, GstQaRunnerClass)) -#define GST_QA_RUNNER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_QA_RUNNER, GstQaRunner)) -#define GST_QA_RUNNER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_QA_RUNNER, GstQaRunnerClass)) -#define GST_QA_RUNNER_CAST(obj) ((GstQaRunner*)(obj)) -#define GST_QA_RUNNER_CLASS_CAST(klass) ((GstQaRunnerClass*)(klass)) - -typedef struct _GstQaRunner GstQaRunner; -typedef struct _GstQaRunnerClass GstQaRunnerClass; - -/* TODO hide this to be opaque? */ -/** - * GstQaRunner: - * - * GStreamer QA Runner class. - * - * Class that manages a QA test run for some pipeline - */ -struct _GstQaRunner { - GObject object; - - gboolean setup; - - /*< private >*/ - GSList *reports; -}; - -/** - * GstQaRunnerClass: - * @parent_class: parent - * - * GStreamer QA Runner object class. - */ -struct _GstQaRunnerClass { - GObjectClass parent_class; -}; - -/* normal GObject stuff */ -GType gst_qa_runner_get_type (void); - -GstQaRunner * gst_qa_runner_new (void); - -void gst_qa_runner_add_report (GstQaRunner * runner, GstQaReport * report); - -guint gst_qa_runner_get_reports_count (GstQaRunner * runner); -GSList * gst_qa_runner_get_reports (GstQaRunner * runner); - -G_END_DECLS - -#endif /* __GST_QA_RUNNER_H__ */ - diff --git a/validate/gst/qa/gst-qa-scenario.h b/validate/gst/qa/gst-qa-scenario.h deleted file mode 100644 index 46c790a..0000000 --- a/validate/gst/qa/gst-qa-scenario.h +++ /dev/null @@ -1,65 +0,0 @@ -/* GStreamer - * Copyright (C) 2013 Thibault Saunier - * - * gst-qa-runner.c - QA Runner class - * - * 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.1 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. - */ - -#ifndef __GST_QA_SCENARIO_H__ -#define __GST_QA_SCENARIO_H__ - -#include -#include -#include "gst-qa-runner.h" - -G_BEGIN_DECLS - -#define GST_TYPE_QA_SCENARIO (gst_qa_scenario_get_type ()) -#define GST_QA_SCENARIO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_QA_SCENARIO, GstQaScenario)) -#define GST_QA_SCENARIO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_QA_SCENARIO, GstQaScenarioClass)) -#define GST_IS_QA_SCENARIO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_QA_SCENARIO)) -#define GST_IS_QA_SCENARIO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_QA_SCENARIO)) -#define GST_QA_SCENARIO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_QA_SCENARIO, GstQaScenarioClass)) - -typedef struct _GstQaScenario GstQaScenario; -typedef struct _GstQaScenarioClass GstQaScenarioClass; -typedef struct _GstQaScenarioPrivate GstQaScenarioPrivate; - - -struct _GstQaScenarioClass -{ - GObjectClass parent_class; - - GMarkupParser content_parser; -}; - -struct _GstQaScenario -{ - GObject parent; - - GstQaScenarioPrivate *priv; -}; - -GType gst_qa_scenario_get_type (void); - -GstQaScenario * gst_qa_scenario_factory_create (GstQaRunner *runner, - GstElement *pipeline, - const gchar *scenario_name); - -G_END_DECLS - -#endif /* __GST_QA_SCENARIOS__ */ diff --git a/validate/gst/qa/qa.h b/validate/gst/qa/qa.h deleted file mode 100644 index 6fb2ba9..0000000 --- a/validate/gst/qa/qa.h +++ /dev/null @@ -1,8 +0,0 @@ -/* GStreamer - * Copyright (C) 2013 Thiago Santos - */ - -#include -#include -#include - diff --git a/validate/gst/validate/.gitignore b/validate/gst/validate/.gitignore new file mode 100644 index 0000000..944e954 --- /dev/null +++ b/validate/gst/validate/.gitignore @@ -0,0 +1,3 @@ +gst-validate-0.10 +gst-validate-transcoding-0.10 +gst-validate-file-check-0.10 diff --git a/validate/gst/validate/Makefile.am b/validate/gst/validate/Makefile.am new file mode 100644 index 0000000..c9ae209 --- /dev/null +++ b/validate/gst/validate/Makefile.am @@ -0,0 +1,84 @@ +libgstvalidate_@GST_API_VERSION@_la_SOURCES = \ + gst-validate-runner.c \ + gst-validate-reporter.c \ + gst-validate-monitor.c \ + gst-validate-element-monitor.c \ + gst-validate-bin-monitor.c \ + gst-validate-pad-monitor.c \ + gst-validate-monitor-factory.c \ + gst-validate-report.c \ + gst-validate-scenario.c \ + gst-validate-override.c \ + gst-validate-override-registry.c \ + gst-validate-file-checker.c + +noinst_HEADERS = \ + gettext.h \ + gst-validate-bin-monitor.h \ + gst-validate-element-monitor.h \ + gst-validate-file-checker.h \ + gst-validate-i18n-lib.h \ + gst-validate-monitor-factory.h \ + gst-validate-monitor.h \ + gst-validate-override.h \ + gst-validate-override-registry.h \ + gst-validate-pad-monitor.h \ + gst-validate-reporter.h \ + gst-validate-report.h \ + gst-validate-runner.h \ + gst-validate-scenario.h + +lib_LTLIBRARIES = \ + libgstvalidate-@GST_API_VERSION@.la \ + libgstvalidate-default-overrides-@GST_API_VERSION@.la \ + libgstvalidate-preload-@GST_API_VERSION@.la + +libgstvalidate_@GST_API_VERSION@_la_CFLAGS = $(GST_ALL_CFLAGS) $(GIO_CFLAGS) +libgstvalidate_@GST_API_VERSION@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) \ + $(GST_LT_LDFLAGS) $(GIO_LDFLAGS) +libgstvalidate_@GST_API_VERSION@_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) \ + $(GST_ALL_LIBS) $(GIO_LIBS) + +libgstvalidate_@GST_API_VERSION@includedir = $(includedir)/gstreamer-@GST_API_VERSION@/gst/validate +libgstvalidate_@GST_API_VERSION@include_HEADERS = \ + validate.h + +libgstvalidate_default_overrides_@GST_API_VERSION@_la_SOURCES = \ + gst-validate-default-overrides.c + +libgstvalidate_default_overrides_@GST_API_VERSION@_la_CFLAGS = $(GST_ALL_CFLAGS) $(GIO_CFLAGS) +libgstvalidate_default_overrides_@GST_API_VERSION@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) \ + $(GST_LT_LDFLAGS) $(GIO_LDFLAGS) +libgstvalidate_default_overrides_@GST_API_VERSION@_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) \ + $(GST_ALL_LIBS) $(GIO_LIBS) + +libgstvalidate_default_overrides_@GST_API_VERSION@includedir = $(includedir)/gstreamer-@GST_API_VERSION@/gst/validate +libgstvalidate_default_overrides_@GST_API_VERSION@include_HEADERS = + +libgstvalidate_preload_@GST_API_VERSION@_la_SOURCES = \ + gst-validate-monitor-preload.c + +libgstvalidate_preload_@GST_API_VERSION@_la_CFLAGS = $(GST_ALL_CFLAGS) +libgstvalidate_preload_@GST_API_VERSION@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) \ + $(GST_LT_LDFLAGS) -lgstvalidate-@GST_API_VERSION@ +libgstvalidate_preload_@GST_API_VERSION@_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) \ + $(GST_ALL_LIBS) -lgstvalidate-@GST_API_VERSION@ +libgstvalidate_preload_@GST_API_VERSION@includedir = $(includedir)/gstreamer-@GST_API_VERSION@/gst/validate +libgstvalidate_preload_@GST_API_VERSION@include_HEADERS = + +bin_PROGRAMS = \ + gst-validate-@GST_API_VERSION@ \ + gst-validate-transcoding-@GST_API_VERSION@ \ + gst-validate-file-check-@GST_API_VERSION@ + +AM_CFLAGS = $(GST_ALL_CFLAGS) $(GST_PBUTILS_CFLAGS) +LDADD = $(top_builddir)/gst/validate/libgstvalidate-@GST_API_VERSION@.la $(GST_PBUTILS_LIBS) $(GST_LIBS) + +gst_validate_@GST_API_VERSION@_SOURCES = gst-validate.c +gst_validate_transcoding_@GST_API_VERSION@_SOURCES = gst-validate-transcoding.c +gst_validate_file_check_@GST_API_VERSION@_SOURCES = gst-validate-file-check.c + +CLEANFILES = diff --git a/validate/gst/qa/gettext.h b/validate/gst/validate/gettext.h similarity index 100% rename from validate/gst/qa/gettext.h rename to validate/gst/validate/gettext.h diff --git a/validate/gst/qa/gst-qa-bin-monitor.c b/validate/gst/validate/gst-validate-bin-monitor.c similarity index 50% rename from validate/gst/qa/gst-qa-bin-monitor.c rename to validate/gst/validate/gst-validate-bin-monitor.c index ce6649a..7537f48 100644 --- a/validate/gst/qa/gst-qa-bin-monitor.c +++ b/validate/gst/validate/gst-validate-bin-monitor.c @@ -1,7 +1,7 @@ /* GStreamer * Copyright (C) 2013 Thiago Santos * - * gst-qa-bin-monitor.c - QA BinMonitor class + * gst-validate-bin-monitor.c - Validate BinMonitor class * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -19,39 +19,39 @@ * Boston, MA 02111-1307, USA. */ -#include "gst-qa-bin-monitor.h" -#include "gst-qa-monitor-factory.h" +#include "gst-validate-bin-monitor.h" +#include "gst-validate-monitor-factory.h" /** - * SECTION:gst-qa-bin-monitor - * @short_description: Class that wraps a #GstBin for QA checks + * SECTION:gst-validate-bin-monitor + * @short_description: Class that wraps a #GstBin for Validate checks * * TODO */ -GST_DEBUG_CATEGORY_STATIC (gst_qa_bin_monitor_debug); -#define GST_CAT_DEFAULT gst_qa_bin_monitor_debug +GST_DEBUG_CATEGORY_STATIC (gst_validate_bin_monitor_debug); +#define GST_CAT_DEFAULT gst_validate_bin_monitor_debug #define _do_init \ - GST_DEBUG_CATEGORY_INIT (gst_qa_bin_monitor_debug, "qa_bin_monitor", 0, "QA BinMonitor"); -#define gst_qa_bin_monitor_parent_class parent_class -G_DEFINE_TYPE_WITH_CODE (GstQaBinMonitor, gst_qa_bin_monitor, - GST_TYPE_QA_ELEMENT_MONITOR, _do_init); + GST_DEBUG_CATEGORY_INIT (gst_validate_bin_monitor_debug, "qa_bin_monitor", 0, "VALIDATE BinMonitor"); +#define gst_validate_bin_monitor_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstValidateBinMonitor, gst_validate_bin_monitor, + GST_TYPE_VALIDATE_ELEMENT_MONITOR, _do_init); static void -gst_qa_bin_monitor_wrap_element (GstQaBinMonitor * monitor, +gst_validate_bin_monitor_wrap_element (GstValidateBinMonitor * monitor, GstElement * element); -static gboolean gst_qa_bin_monitor_setup (GstQaMonitor * monitor); +static gboolean gst_validate_bin_monitor_setup (GstValidateMonitor * monitor); static void _qa_bin_element_added (GstBin * bin, GstElement * pad, - GstQaBinMonitor * monitor); + GstValidateBinMonitor * monitor); static void -gst_qa_bin_monitor_dispose (GObject * object) +gst_validate_bin_monitor_dispose (GObject * object) { - GstQaBinMonitor *monitor = GST_QA_BIN_MONITOR_CAST (object); - GstElement *bin = GST_QA_ELEMENT_MONITOR_GET_ELEMENT (monitor); + GstValidateBinMonitor *monitor = GST_VALIDATE_BIN_MONITOR_CAST (object); + GstElement *bin = GST_VALIDATE_ELEMENT_MONITOR_GET_ELEMENT (monitor); if (bin && monitor->element_added_id) g_signal_handler_disconnect (bin, monitor->element_added_id); @@ -66,69 +66,71 @@ gst_qa_bin_monitor_dispose (GObject * object) static void -gst_qa_bin_monitor_class_init (GstQaBinMonitorClass * klass) +gst_validate_bin_monitor_class_init (GstValidateBinMonitorClass * klass) { GObjectClass *gobject_class; - GstQaMonitorClass *qamonitor_class; + GstValidateMonitorClass *validatemonitor_class; gobject_class = G_OBJECT_CLASS (klass); - qamonitor_class = GST_QA_MONITOR_CLASS_CAST (klass); + validatemonitor_class = GST_VALIDATE_MONITOR_CLASS_CAST (klass); - gobject_class->dispose = gst_qa_bin_monitor_dispose; + gobject_class->dispose = gst_validate_bin_monitor_dispose; - qamonitor_class->setup = gst_qa_bin_monitor_setup; + validatemonitor_class->setup = gst_validate_bin_monitor_setup; } static void -gst_qa_bin_monitor_init (GstQaBinMonitor * bin_monitor) +gst_validate_bin_monitor_init (GstValidateBinMonitor * bin_monitor) { } static void -gst_qa_bin_monitor_create_scenarios (GstQaBinMonitor * monitor) +gst_validate_bin_monitor_create_scenarios (GstValidateBinMonitor * monitor) { /* scenarios currently only make sense for pipelines */ - if (GST_IS_PIPELINE (GST_QA_MONITOR_GET_OBJECT (monitor))) { + if (GST_IS_PIPELINE (GST_VALIDATE_MONITOR_GET_OBJECT (monitor))) { const gchar *scenario_name; - if ((scenario_name = g_getenv ("GST_QA_SCENARIO"))) { + if ((scenario_name = g_getenv ("GST_VALIDATE_SCENARIO"))) { monitor->scenario = - gst_qa_scenario_factory_create (GST_QA_MONITOR_GET_RUNNER (monitor), - GST_ELEMENT_CAST (GST_QA_MONITOR_GET_OBJECT (monitor)), + gst_validate_scenario_factory_create (GST_VALIDATE_MONITOR_GET_RUNNER + (monitor), + GST_ELEMENT_CAST (GST_VALIDATE_MONITOR_GET_OBJECT (monitor)), scenario_name); } } } /** - * gst_qa_bin_monitor_new: - * @bin: (transfer-none): a #GstBin to run QA on + * gst_validate_bin_monitor_new: + * @bin: (transfer-none): a #GstBin to run Validate on */ -GstQaBinMonitor * -gst_qa_bin_monitor_new (GstBin * bin, GstQaRunner * runner, - GstQaMonitor * parent) +GstValidateBinMonitor * +gst_validate_bin_monitor_new (GstBin * bin, GstValidateRunner * runner, + GstValidateMonitor * parent) { - GstQaBinMonitor *monitor = g_object_new (GST_TYPE_QA_BIN_MONITOR, "object", + GstValidateBinMonitor *monitor = + g_object_new (GST_TYPE_VALIDATE_BIN_MONITOR, "object", bin, "qa-runner", runner, "qa-parent", parent, NULL); - if (GST_QA_MONITOR_GET_OBJECT (monitor) == NULL) { + if (GST_VALIDATE_MONITOR_GET_OBJECT (monitor) == NULL) { g_object_unref (monitor); return NULL; } - gst_qa_bin_monitor_create_scenarios (monitor); + gst_validate_bin_monitor_create_scenarios (monitor); return monitor; } static gboolean -gst_qa_bin_monitor_setup (GstQaMonitor * monitor) +gst_validate_bin_monitor_setup (GstValidateMonitor * monitor) { GstIterator *iterator; gboolean done; GstElement *element; - GstQaBinMonitor *bin_monitor = GST_QA_BIN_MONITOR_CAST (monitor); - GstBin *bin = GST_QA_BIN_MONITOR_GET_BIN (bin_monitor); + GstValidateBinMonitor *bin_monitor = GST_VALIDATE_BIN_MONITOR_CAST (monitor); + GstBin *bin = GST_VALIDATE_BIN_MONITOR_GET_BIN (bin_monitor); if (!GST_IS_BIN (bin)) { GST_WARNING_OBJECT (monitor, "Trying to create bin monitor with other " @@ -148,7 +150,7 @@ gst_qa_bin_monitor_setup (GstQaMonitor * monitor) while (!done) { switch (gst_iterator_next (iterator, (gpointer *) & element)) { case GST_ITERATOR_OK: - gst_qa_bin_monitor_wrap_element (bin_monitor, element); + gst_validate_bin_monitor_wrap_element (bin_monitor, element); gst_object_unref (element); break; case GST_ITERATOR_RESYNC: @@ -169,29 +171,29 @@ gst_qa_bin_monitor_setup (GstQaMonitor * monitor) } static void -gst_qa_bin_monitor_wrap_element (GstQaBinMonitor * monitor, +gst_validate_bin_monitor_wrap_element (GstValidateBinMonitor * monitor, GstElement * element) { - GstQaElementMonitor *element_monitor; + GstValidateElementMonitor *element_monitor; GST_DEBUG_OBJECT (monitor, "Wrapping element %s", GST_ELEMENT_NAME (element)); element_monitor = - GST_QA_ELEMENT_MONITOR_CAST (gst_qa_monitor_factory_create - (GST_OBJECT_CAST (element), GST_QA_MONITOR_GET_RUNNER (monitor), - GST_QA_MONITOR_CAST (monitor))); + GST_VALIDATE_ELEMENT_MONITOR_CAST (gst_validate_monitor_factory_create + (GST_OBJECT_CAST (element), GST_VALIDATE_MONITOR_GET_RUNNER (monitor), + GST_VALIDATE_MONITOR_CAST (monitor))); g_return_if_fail (element_monitor != NULL); - GST_QA_MONITOR_LOCK (monitor); + GST_VALIDATE_MONITOR_LOCK (monitor); monitor->element_monitors = g_list_prepend (monitor->element_monitors, element_monitor); - GST_QA_MONITOR_UNLOCK (monitor); + GST_VALIDATE_MONITOR_UNLOCK (monitor); } static void _qa_bin_element_added (GstBin * bin, GstElement * element, - GstQaBinMonitor * monitor) + GstValidateBinMonitor * monitor) { - g_return_if_fail (GST_QA_ELEMENT_MONITOR_GET_ELEMENT (monitor) == + g_return_if_fail (GST_VALIDATE_ELEMENT_MONITOR_GET_ELEMENT (monitor) == GST_ELEMENT_CAST (bin)); - gst_qa_bin_monitor_wrap_element (monitor, element); + gst_validate_bin_monitor_wrap_element (monitor, element); } diff --git a/validate/gst/validate/gst-validate-bin-monitor.h b/validate/gst/validate/gst-validate-bin-monitor.h new file mode 100644 index 0000000..c20dd83 --- /dev/null +++ b/validate/gst/validate/gst-validate-bin-monitor.h @@ -0,0 +1,83 @@ +/* GStreamer + * Copyright (C) 2013 Thiago Santos + * + * gst-validate-bin-monitor.h - Validate BinMonitor class + * + * 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.1 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. + */ + +#ifndef __GST_VALIDATE_BIN_MONITOR_H__ +#define __GST_VALIDATE_BIN_MONITOR_H__ + +#include +#include +#include "gst-validate-element-monitor.h" +#include "gst-validate-runner.h" +#include "gst-validate-scenario.h" + +G_BEGIN_DECLS + +#define GST_TYPE_VALIDATE_BIN_MONITOR (gst_validate_bin_monitor_get_type ()) +#define GST_IS_VALIDATE_BIN_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_VALIDATE_BIN_MONITOR)) +#define GST_IS_VALIDATE_BIN_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_VALIDATE_BIN_MONITOR)) +#define GST_VALIDATE_BIN_MONITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_VALIDATE_BIN_MONITOR, GstValidateBinMonitorClass)) +#define GST_VALIDATE_BIN_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_VALIDATE_BIN_MONITOR, GstValidateBinMonitor)) +#define GST_VALIDATE_BIN_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_VALIDATE_BIN_MONITOR, GstValidateBinMonitorClass)) +#define GST_VALIDATE_BIN_MONITOR_CAST(obj) ((GstValidateBinMonitor*)(obj)) +#define GST_VALIDATE_BIN_MONITOR_CLASS_CAST(klass) ((GstValidateBinMonitorClass*)(klass)) + +#define GST_VALIDATE_BIN_MONITOR_GET_BIN(m) (GST_BIN_CAST (GST_VALIDATE_ELEMENT_MONITOR_GET_ELEMENT (m))) + +typedef struct _GstValidateBinMonitor GstValidateBinMonitor; +typedef struct _GstValidateBinMonitorClass GstValidateBinMonitorClass; + +/** + * GstValidateBinMonitor: + * + * GStreamer Validate BinMonitor class. + * + * Class that wraps a #GstBin for Validate checks + */ +struct _GstValidateBinMonitor { + GstValidateElementMonitor parent; + + GList *element_monitors; + + GstValidateScenario *scenario; + + /*< private >*/ + gulong element_added_id; +}; + +/** + * GstValidateBinMonitorClass: + * @parent_class: parent + * + * GStreamer Validate BinMonitor object class. + */ +struct _GstValidateBinMonitorClass { + GstValidateElementMonitorClass parent_class; +}; + +/* normal GObject stuff */ +GType gst_validate_bin_monitor_get_type (void); + +GstValidateBinMonitor * gst_validate_bin_monitor_new (GstBin * bin, GstValidateRunner * runner, GstValidateMonitor * parent); + +G_END_DECLS + +#endif /* __GST_VALIDATE_BIN_MONITOR_H__ */ + diff --git a/validate/gst/qa/gst-qa-default-overrides.c b/validate/gst/validate/gst-validate-default-overrides.c similarity index 69% rename from validate/gst/qa/gst-qa-default-overrides.c rename to validate/gst/validate/gst-validate-default-overrides.c index eafb9e7..95fa946 100644 --- a/validate/gst/qa/gst-qa-default-overrides.c +++ b/validate/gst/validate/gst-validate-default-overrides.c @@ -1,7 +1,7 @@ /* GStreamer * Copyright (C) 2013 Vincent Penquerc'h * - * gst-qa-default-overrides.c - Test overrides + * gst-validate-default-overrides.c - Test overrides * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -23,20 +23,21 @@ #include "config.h" #endif #include -#include "gst-qa-override.h" -#include "gst-qa-override-registry.h" -#include "gst-qa-report.h" +#include "gst-validate-override.h" +#include "gst-validate-override-registry.h" +#include "gst-validate-report.h" int -gst_qa_create_overrides (void) +gst_validate_create_overrides (void) { - GstQaOverride *o; + GstValidateOverride *o; /* Some random test override. Will moan on: gst-launch videotestsrc num-buffers=10 ! video/x-raw-yuv ! fakesink */ - o = gst_qa_override_new (); - gst_qa_override_change_severity (o, GST_QA_ISSUE_ID_CAPS_IS_MISSING_FIELD, - GST_QA_REPORT_LEVEL_CRITICAL); - gst_qa_override_register_by_name ("capsfilter0", o); + o = gst_validate_override_new (); + gst_validate_override_change_severity (o, + GST_VALIDATE_ISSUE_ID_CAPS_IS_MISSING_FIELD, + GST_VALIDATE_REPORT_LEVEL_CRITICAL); + gst_validate_override_register_by_name ("capsfilter0", o); return 1; } diff --git a/validate/gst/validate/gst-validate-element-monitor.c b/validate/gst/validate/gst-validate-element-monitor.c new file mode 100644 index 0000000..c64d7b5 --- /dev/null +++ b/validate/gst/validate/gst-validate-element-monitor.c @@ -0,0 +1,208 @@ +/* GStreamer + * Copyright (C) 2013 Thiago Santos + * + * gst-validate-element-monitor.c - Validate ElementMonitor class + * + * 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.1 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-validate-element-monitor.h" +#include "gst-validate-pad-monitor.h" +#include "gst-validate-monitor-factory.h" +#include + +/** + * SECTION:gst-validate-element-monitor + * @short_description: Class that wraps a #GstElement for Validate checks + * + * TODO + */ + +GST_DEBUG_CATEGORY_STATIC (gst_validate_element_monitor_debug); +#define GST_CAT_DEFAULT gst_validate_element_monitor_debug + +#define _do_init \ + GST_DEBUG_CATEGORY_INIT (gst_validate_element_monitor_debug, "qa_element_monitor", 0, "VALIDATE ElementMonitor"); +#define gst_validate_element_monitor_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstValidateElementMonitor, + gst_validate_element_monitor, GST_TYPE_VALIDATE_MONITOR, _do_init); + +static void +gst_validate_element_monitor_wrap_pad (GstValidateElementMonitor * monitor, + GstPad * pad); +static gboolean gst_validate_element_monitor_do_setup (GstValidateMonitor * + monitor); +static GstElement *gst_validate_element_monitor_get_element (GstValidateMonitor + * monitor); + +static void +_qa_element_pad_added (GstElement * element, GstPad * pad, + GstValidateElementMonitor * monitor); + +static void +gst_validate_element_monitor_dispose (GObject * object) +{ + GstValidateElementMonitor *monitor = + GST_VALIDATE_ELEMENT_MONITOR_CAST (object); + + if (GST_VALIDATE_MONITOR_GET_OBJECT (monitor) && monitor->pad_added_id) + g_signal_handler_disconnect (GST_VALIDATE_MONITOR_GET_OBJECT (monitor), + monitor->pad_added_id); + + g_list_free_full (monitor->pad_monitors, g_object_unref); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + + +static void +gst_validate_element_monitor_class_init (GstValidateElementMonitorClass * klass) +{ + GObjectClass *gobject_class; + GstValidateMonitorClass *monitor_klass; + + gobject_class = G_OBJECT_CLASS (klass); + monitor_klass = GST_VALIDATE_MONITOR_CLASS (klass); + + gobject_class->dispose = gst_validate_element_monitor_dispose; + + monitor_klass->setup = gst_validate_element_monitor_do_setup; + monitor_klass->get_element = gst_validate_element_monitor_get_element; +} + +static void +gst_validate_element_monitor_init (GstValidateElementMonitor * element_monitor) +{ +} + +/** + * gst_validate_element_monitor_new: + * @element: (transfer-none): a #GstElement to run Validate on + */ +GstValidateElementMonitor * +gst_validate_element_monitor_new (GstElement * element, + GstValidateRunner * runner, GstValidateMonitor * parent) +{ + GstValidateElementMonitor *monitor; + + g_return_val_if_fail (element != NULL, NULL); + + monitor = g_object_new (GST_TYPE_VALIDATE_ELEMENT_MONITOR, "object", element, + "qa-runner", runner, "qa-parent", parent, NULL); + + if (GST_VALIDATE_ELEMENT_MONITOR_GET_ELEMENT (monitor) == NULL) { + g_object_unref (monitor); + return NULL; + } + + return monitor; +} + +static GstElement * +gst_validate_element_monitor_get_element (GstValidateMonitor * monitor) +{ + return GST_VALIDATE_ELEMENT_MONITOR_GET_ELEMENT (monitor); +} + +static void +gst_validate_element_monitor_inspect (GstValidateElementMonitor * monitor) +{ + GstElement *element; + GstElementClass *klass; + + element = GST_VALIDATE_ELEMENT_MONITOR_GET_ELEMENT (monitor); + klass = GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS (element)); + + monitor->is_decoder = strstr (klass->details.klass, "Decoder") != NULL; + monitor->is_encoder = strstr (klass->details.klass, "Encoder") != NULL; +} + +static gboolean +gst_validate_element_monitor_do_setup (GstValidateMonitor * monitor) +{ + GstIterator *iterator; + gboolean done; + GstPad *pad; + GstValidateElementMonitor *elem_monitor; + GstElement *element; + + if (!GST_IS_ELEMENT (GST_VALIDATE_MONITOR_GET_OBJECT (monitor))) { + GST_WARNING_OBJECT (monitor, "Trying to create element monitor with other " + "type of object"); + return FALSE; + } + + elem_monitor = GST_VALIDATE_ELEMENT_MONITOR_CAST (monitor); + + GST_DEBUG_OBJECT (monitor, "Setting up monitor for element %" GST_PTR_FORMAT, + GST_VALIDATE_MONITOR_GET_OBJECT (monitor)); + element = GST_VALIDATE_ELEMENT_MONITOR_GET_ELEMENT (monitor); + + gst_validate_element_monitor_inspect (elem_monitor); + + elem_monitor->pad_added_id = g_signal_connect (element, "pad-added", + G_CALLBACK (_qa_element_pad_added), monitor); + + iterator = gst_element_iterate_pads (element); + done = FALSE; + while (!done) { + switch (gst_iterator_next (iterator, (gpointer *) & pad)) { + case GST_ITERATOR_OK: + gst_validate_element_monitor_wrap_pad (elem_monitor, pad); + gst_object_unref (pad); + break; + case GST_ITERATOR_RESYNC: + /* TODO how to handle this? */ + gst_iterator_resync (iterator); + break; + case GST_ITERATOR_ERROR: + done = TRUE; + break; + case GST_ITERATOR_DONE: + done = TRUE; + break; + } + } + gst_iterator_free (iterator); + return TRUE; +} + +static void +gst_validate_element_monitor_wrap_pad (GstValidateElementMonitor * monitor, + GstPad * pad) +{ + GstValidatePadMonitor *pad_monitor; + GST_DEBUG_OBJECT (monitor, "Wrapping pad %s:%s", GST_DEBUG_PAD_NAME (pad)); + + pad_monitor = + GST_VALIDATE_PAD_MONITOR (gst_validate_monitor_factory_create (GST_OBJECT + (pad), GST_VALIDATE_MONITOR_GET_RUNNER (monitor), + GST_VALIDATE_MONITOR (monitor))); + g_return_if_fail (pad_monitor != NULL); + + GST_VALIDATE_MONITOR_LOCK (monitor); + monitor->pad_monitors = g_list_prepend (monitor->pad_monitors, pad_monitor); + GST_VALIDATE_MONITOR_UNLOCK (monitor); +} + +static void +_qa_element_pad_added (GstElement * element, GstPad * pad, + GstValidateElementMonitor * monitor) +{ + g_return_if_fail (GST_VALIDATE_ELEMENT_MONITOR_GET_ELEMENT (monitor) == + element); + gst_validate_element_monitor_wrap_pad (monitor, pad); +} diff --git a/validate/gst/validate/gst-validate-element-monitor.h b/validate/gst/validate/gst-validate-element-monitor.h new file mode 100644 index 0000000..bebf178 --- /dev/null +++ b/validate/gst/validate/gst-validate-element-monitor.h @@ -0,0 +1,84 @@ +/* GStreamer + * Copyright (C) 2013 Thiago Santos + * + * gst-validate-element-monitor.h - Validate ElementMonitor class + * + * 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.1 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. + */ + +#ifndef __GST_VALIDATE_ELEMENT_MONITOR_H__ +#define __GST_VALIDATE_ELEMENT_MONITOR_H__ + +#include +#include + +#include "gst-validate-monitor.h" + +G_BEGIN_DECLS + +#define GST_TYPE_VALIDATE_ELEMENT_MONITOR (gst_validate_element_monitor_get_type ()) +#define GST_IS_VALIDATE_ELEMENT_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_VALIDATE_ELEMENT_MONITOR)) +#define GST_IS_VALIDATE_ELEMENT_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_VALIDATE_ELEMENT_MONITOR)) +#define GST_VALIDATE_ELEMENT_MONITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_VALIDATE_ELEMENT_MONITOR, GstValidateElementMonitorClass)) +#define GST_VALIDATE_ELEMENT_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_VALIDATE_ELEMENT_MONITOR, GstValidateElementMonitor)) +#define GST_VALIDATE_ELEMENT_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_VALIDATE_ELEMENT_MONITOR, GstValidateElementMonitorClass)) +#define GST_VALIDATE_ELEMENT_MONITOR_CAST(obj) ((GstValidateElementMonitor*)(obj)) +#define GST_VALIDATE_ELEMENT_MONITOR_CLASS_CAST(klass) ((GstValidateElementMonitorClass*)(klass)) + +#define GST_VALIDATE_ELEMENT_MONITOR_GET_ELEMENT(m) (GST_ELEMENT_CAST (GST_VALIDATE_MONITOR_GET_OBJECT (m))) +#define GST_VALIDATE_ELEMENT_MONITOR_ELEMENT_IS_DECODER(m) (GST_VALIDATE_ELEMENT_MONITOR_CAST (m)->is_decoder) +#define GST_VALIDATE_ELEMENT_MONITOR_ELEMENT_IS_ENCODER(m) (GST_VALIDATE_ELEMENT_MONITOR_CAST (m)->is_encoder) + +typedef struct _GstValidateElementMonitor GstValidateElementMonitor; +typedef struct _GstValidateElementMonitorClass GstValidateElementMonitorClass; + +/** + * GstValidateElementMonitor: + * + * GStreamer Validate ElementMonitor class. + * + * Class that wraps a #GstElement for Validate checks + */ +struct _GstValidateElementMonitor { + GstValidateMonitor parent; + + /*< private >*/ + gulong pad_added_id; + GList *pad_monitors; + + gboolean is_decoder; + gboolean is_encoder; +}; + +/** + * GstValidateElementMonitorClass: + * @parent_class: parent + * + * GStreamer Validate ElementMonitor object class. + */ +struct _GstValidateElementMonitorClass { + GstValidateMonitorClass parent_class; +}; + +/* normal GObject stuff */ +GType gst_validate_element_monitor_get_type (void); + +GstValidateElementMonitor * gst_validate_element_monitor_new (GstElement * element, GstValidateRunner * runner, GstValidateMonitor * parent); + +G_END_DECLS + +#endif /* __GST_VALIDATE_ELEMENT_MONITOR_H__ */ + diff --git a/validate/gst/qa/gst-qa-file-check.c b/validate/gst/validate/gst-validate-file-check.c similarity index 94% rename from validate/gst/qa/gst-qa-file-check.c rename to validate/gst/validate/gst-validate-file-check.c index 197785d..8aaf686 100644 --- a/validate/gst/qa/gst-qa-file-check.c +++ b/validate/gst/validate/gst-validate-file-check.c @@ -10,7 +10,7 @@ #include #include -#include +#include #include static GstEncodingProfile *encoding_profile = NULL; @@ -144,9 +144,9 @@ _parse_encoding_profile (const gchar * option_name, const gchar * value, int main (int argc, gchar ** argv) { - GstQaRunner *runner; + GstValidateRunner *runner; GOptionContext *ctx; - GstQaFileChecker *fc; + GstValidateFileChecker *fc; GError *err = NULL; guint count = -1; @@ -188,7 +188,7 @@ main (int argc, gchar ** argv) {NULL} }; - ctx = g_option_context_new ("- runs QA transcoding test."); + ctx = g_option_context_new ("- runs Validate transcoding test."); g_option_context_add_main_entries (ctx, options, NULL); if (!g_option_context_parse (ctx, &argc, &argv, &err)) { @@ -204,7 +204,7 @@ main (int argc, gchar ** argv) if (argc != 2) { g_printerr ("%i arguments recived, 1 expected.\n" "You should run the test using:\n" - " ./gst-qa-file-check-0.10 [options]\n", argc - 1); + " ./gst-validate-file-check-0.10 [options]\n", argc - 1); return 1; } @@ -212,8 +212,8 @@ main (int argc, gchar ** argv) duration = (GstClockTime) duration_arg; /* Create the pipeline */ - runner = gst_qa_runner_new (); - fc = g_object_new (GST_TYPE_QA_FILE_CHECKER, "uri", + runner = gst_validate_runner_new (); + fc = g_object_new (GST_TYPE_VALIDATE_FILE_CHECKER, "uri", argv[1], "profile", encoding_profile, "qa-runner", runner, "is-seekable", seekable, "test-playback", playback, "test-reverse-playback", reverse_playback, @@ -222,10 +222,10 @@ main (int argc, gchar ** argv) "duration-tolerance", (guint64) duration_tolerance, NULL); g_print ("Starting tests\n"); - if (!gst_qa_file_checker_run (fc)) { + if (!gst_validate_file_checker_run (fc)) { g_print ("Failed file checking\n"); } - count = gst_qa_runner_get_reports_count (runner); + count = gst_validate_runner_get_reports_count (runner); g_print ("Tests finished, total issues found: %u\n", count); g_object_unref (fc); diff --git a/validate/gst/qa/gst-qa-file-checker.c b/validate/gst/validate/gst-validate-file-checker.c similarity index 82% rename from validate/gst/qa/gst-qa-file-checker.c rename to validate/gst/validate/gst-validate-file-checker.c index fb05f66..92c31fb 100644 --- a/validate/gst/qa/gst-qa-file-checker.c +++ b/validate/gst/validate/gst-validate-file-checker.c @@ -1,7 +1,7 @@ /* GStreamer * Copyright (C) 2013 Thiago Santos * - * gst-qa-file-checker.c - QA File conformance check utility functions / structs + * gst-validate-file-checker.c - Validate File conformance check utility functions / structs * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -24,8 +24,8 @@ # include "config.h" #endif -#include "gst-qa-file-checker.h" -#include "gst-qa-reporter.h" +#include "gst-validate-file-checker.h" +#include "gst-validate-reporter.h" #include #include @@ -54,41 +54,41 @@ enum #define DEFAULT_PLAYBACK FALSE #define DEFAULT_REVERSE_PLAYBACK FALSE -GST_DEBUG_CATEGORY_STATIC (gst_qa_file_checker_debug); -#define GST_CAT_DEFAULT gst_qa_file_checker_debug +GST_DEBUG_CATEGORY_STATIC (gst_validate_file_checker_debug); +#define GST_CAT_DEFAULT gst_validate_file_checker_debug static void -gst_qa_file_checker_get_property (GObject * object, guint prop_id, +gst_validate_file_checker_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void -gst_qa_file_checker_set_property (GObject * object, guint prop_id, +gst_validate_file_checker_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); #define _do_init \ - GST_DEBUG_CATEGORY_INIT (gst_qa_file_checker_debug, "qa_file_checker", 0, "QA FileChecker");\ - G_IMPLEMENT_INTERFACE (GST_TYPE_QA_REPORTER, _reporter_iface_init) + GST_DEBUG_CATEGORY_INIT (gst_validate_file_checker_debug, "qa_file_checker", 0, "VALIDATE FileChecker");\ + G_IMPLEMENT_INTERFACE (GST_TYPE_VALIDATE_REPORTER, _reporter_iface_init) static void -_reporter_iface_init (GstQaReporterInterface * iface) +_reporter_iface_init (GstValidateReporterInterface * iface) { } -#define gst_qa_file_checker_parent_class parent_class -G_DEFINE_TYPE_WITH_CODE (GstQaFileChecker, gst_qa_file_checker, +#define gst_validate_file_checker_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstValidateFileChecker, gst_validate_file_checker, G_TYPE_OBJECT, _do_init); static void -gst_qa_file_checker_dispose (GObject * object) +gst_validate_file_checker_dispose (GObject * object) { G_OBJECT_CLASS (parent_class)->dispose (object); } static void -gst_qa_file_checker_finalize (GObject * object) +gst_validate_file_checker_finalize (GObject * object) { - GstQaFileChecker *fc = GST_QA_FILE_CHECKER_CAST (object); + GstValidateFileChecker *fc = GST_VALIDATE_FILE_CHECKER_CAST (object); - gst_qa_reporter_set_name (GST_QA_REPORTER (object), NULL); + gst_validate_reporter_set_name (GST_VALIDATE_REPORTER (object), NULL); g_free (fc->uri); if (fc->profile) @@ -98,20 +98,21 @@ gst_qa_file_checker_finalize (GObject * object) } static void -gst_qa_file_checker_class_init (GstQaFileCheckerClass * klass) +gst_validate_file_checker_class_init (GstValidateFileCheckerClass * klass) { GObjectClass *gobject_class; gobject_class = G_OBJECT_CLASS (klass); - gobject_class->get_property = gst_qa_file_checker_get_property; - gobject_class->set_property = gst_qa_file_checker_set_property; - gobject_class->dispose = gst_qa_file_checker_dispose; - gobject_class->finalize = gst_qa_file_checker_finalize; + gobject_class->get_property = gst_validate_file_checker_get_property; + gobject_class->set_property = gst_validate_file_checker_set_property; + gobject_class->dispose = gst_validate_file_checker_dispose; + gobject_class->finalize = gst_validate_file_checker_finalize; g_object_class_install_property (gobject_class, PROP_RUNNER, - g_param_spec_object ("qa-runner", "QA Runner", "The QA runner to " - "report errors to", GST_TYPE_QA_RUNNER, + g_param_spec_object ("qa-runner", "VALIDATE Runner", + "The Validate runner to " "report errors to", + GST_TYPE_VALIDATE_RUNNER, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_URI, @@ -163,7 +164,7 @@ gst_qa_file_checker_class_init (GstQaFileCheckerClass * klass) } static void -gst_qa_file_checker_init (GstQaFileChecker * fc) +gst_validate_file_checker_init (GstValidateFileChecker * fc) { fc->uri = NULL; fc->profile = NULL; @@ -177,16 +178,16 @@ gst_qa_file_checker_init (GstQaFileChecker * fc) } static void -gst_qa_file_checker_set_property (GObject * object, guint prop_id, +gst_validate_file_checker_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { - GstQaFileChecker *fc; + GstValidateFileChecker *fc; - fc = GST_QA_FILE_CHECKER_CAST (object); + fc = GST_VALIDATE_FILE_CHECKER_CAST (object); switch (prop_id) { case PROP_RUNNER: - gst_qa_reporter_set_runner (GST_QA_REPORTER (fc), + gst_validate_reporter_set_runner (GST_VALIDATE_REPORTER (fc), g_value_get_object (value)); break; case PROP_URI: @@ -226,17 +227,17 @@ gst_qa_file_checker_set_property (GObject * object, guint prop_id, } static void -gst_qa_file_checker_get_property (GObject * object, guint prop_id, +gst_validate_file_checker_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { - GstQaFileChecker *fc; + GstValidateFileChecker *fc; - fc = GST_QA_FILE_CHECKER_CAST (object); + fc = GST_VALIDATE_FILE_CHECKER_CAST (object); switch (prop_id) { case PROP_RUNNER: g_value_set_object (value, - gst_qa_reporter_get_runner (GST_QA_REPORTER (fc))); + gst_validate_reporter_get_runner (GST_VALIDATE_REPORTER (fc))); break; case PROP_URI: g_value_set_string (value, fc->uri); @@ -272,7 +273,7 @@ gst_qa_file_checker_get_property (GObject * object, guint prop_id, } static gboolean -check_file_size (GstQaFileChecker * fc) +check_file_size (GstValidateFileChecker * fc) { GStatBuf statbuf; gchar *filepath; @@ -282,7 +283,7 @@ check_file_size (GstQaFileChecker * fc) filepath = g_filename_from_uri (fc->uri, NULL, &err); if (!filepath) { - GST_QA_REPORT (fc, GST_QA_ISSUE_ID_FILE_NOT_FOUND, + GST_VALIDATE_REPORT (fc, GST_VALIDATE_ISSUE_ID_FILE_NOT_FOUND, "Failed to get filepath from uri %s. %s", fc->uri, err->message); g_error_free (err); return FALSE; @@ -291,20 +292,20 @@ check_file_size (GstQaFileChecker * fc) if (g_stat (filepath, &statbuf) == 0) { size = statbuf.st_size; } else { - GST_QA_REPORT (fc, GST_QA_ISSUE_ID_FILE_NOT_FOUND, + GST_VALIDATE_REPORT (fc, GST_VALIDATE_ISSUE_ID_FILE_NOT_FOUND, "Failed to get file stats from uri %s", fc->uri); ret = FALSE; goto end; } if (size == 0) { - GST_QA_REPORT (fc, GST_QA_ISSUE_ID_FILE_SIZE_IS_ZERO, "File %s has size 0", - fc->uri); + GST_VALIDATE_REPORT (fc, GST_VALIDATE_ISSUE_ID_FILE_SIZE_IS_ZERO, + "File %s has size 0", fc->uri); ret = FALSE; } else if (fc->file_size != 0 && (size < fc->file_size - fc->file_size_tolerance || size > fc->file_size + fc->file_size_tolerance)) { - GST_QA_REPORT (fc, GST_QA_ISSUE_ID_FILE_SIZE_INCORRECT, + GST_VALIDATE_REPORT (fc, GST_VALIDATE_ISSUE_ID_FILE_SIZE_INCORRECT, "File %s has size %" G_GUINT64_FORMAT ", it was expected to have %" G_GUINT64_FORMAT " (+-%" G_GUINT64_FORMAT ")", fc->uri, size, fc->file_size, fc->file_size_tolerance); @@ -318,7 +319,7 @@ end: } static gboolean -check_file_duration (GstQaFileChecker * fc, GstDiscovererInfo * info) +check_file_duration (GstValidateFileChecker * fc, GstDiscovererInfo * info) { GstClockTime real_duration; @@ -328,7 +329,7 @@ check_file_duration (GstQaFileChecker * fc, GstDiscovererInfo * info) real_duration = gst_discoverer_info_get_duration (info); if (real_duration < fc->duration - fc->duration_tolerance || real_duration > fc->duration + fc->duration_tolerance) { - GST_QA_REPORT (fc, GST_QA_ISSUE_ID_FILE_SIZE_INCORRECT, + GST_VALIDATE_REPORT (fc, GST_VALIDATE_ISSUE_ID_FILE_SIZE_INCORRECT, "File %s has duration %" GST_TIME_FORMAT ", it was expected to have %" GST_TIME_FORMAT " (+-%" GST_TIME_FORMAT ")", fc->uri, GST_TIME_ARGS (real_duration), GST_TIME_ARGS (fc->duration), @@ -339,13 +340,13 @@ check_file_duration (GstQaFileChecker * fc, GstDiscovererInfo * info) } static gboolean -check_seekable (GstQaFileChecker * fc, GstDiscovererInfo * info) +check_seekable (GstValidateFileChecker * fc, GstDiscovererInfo * info) { gboolean real_seekable; real_seekable = gst_discoverer_info_get_seekable (info); if (real_seekable != fc->seekable) { - GST_QA_REPORT (fc, GST_QA_ISSUE_ID_FILE_SEEKABLE_INCORRECT, + GST_VALIDATE_REPORT (fc, GST_VALIDATE_ISSUE_ID_FILE_SEEKABLE_INCORRECT, "File was expected to %s be seekable, but it %s", fc->seekable ? "" : "not", real_seekable ? "is" : "isn't"); return FALSE; @@ -377,13 +378,13 @@ G_STMT_START { \ } G_STMT_END static gboolean -compare_encoding_profile_with_discoverer_stream (GstQaFileChecker * fc, +compare_encoding_profile_with_discoverer_stream (GstValidateFileChecker * fc, GstEncodingProfile * prof, GstDiscovererStreamInfo * stream, gchar ** msg); static gboolean -compare_container_profile_with_container_discoverer_stream (GstQaFileChecker * - fc, GstEncodingContainerProfile * prof, GstDiscovererContainerInfo * stream, - gchar ** msg) + compare_container_profile_with_container_discoverer_stream + (GstValidateFileChecker * fc, GstEncodingContainerProfile * prof, + GstDiscovererContainerInfo * stream, gchar ** msg) { ExpectedStream *expected_streams = NULL; GList *container_streams; @@ -475,7 +476,7 @@ end: } static gboolean -compare_encoding_profile_with_discoverer_stream (GstQaFileChecker * fc, +compare_encoding_profile_with_discoverer_stream (GstValidateFileChecker * fc, GstEncodingProfile * prof, GstDiscovererStreamInfo * stream, gchar ** msg) { gboolean ret = TRUE; @@ -575,7 +576,7 @@ end: } static gboolean -check_encoding_profile (GstQaFileChecker * fc, GstDiscovererInfo * info) +check_encoding_profile (GstValidateFileChecker * fc, GstDiscovererInfo * info) { GstEncodingProfile *profile = fc->profile; GstDiscovererStreamInfo *stream; @@ -589,7 +590,7 @@ check_encoding_profile (GstQaFileChecker * fc, GstDiscovererInfo * info) if (!compare_encoding_profile_with_discoverer_stream (fc, fc->profile, stream, &msg)) { - GST_QA_REPORT (fc, GST_QA_ISSUE_ID_FILE_PROFILE_INCORRECT, msg); + GST_VALIDATE_REPORT (fc, GST_VALIDATE_ISSUE_ID_FILE_PROFILE_INCORRECT, msg); g_free (msg); } @@ -597,9 +598,10 @@ check_encoding_profile (GstQaFileChecker * fc, GstDiscovererInfo * info) return ret; } -typedef gboolean (*GstElementConfigureFunc) (GstQaFileChecker *, GstElement *); +typedef gboolean (*GstElementConfigureFunc) (GstValidateFileChecker *, + GstElement *); static gboolean -check_playback_scenario (GstQaFileChecker * fc, +check_playback_scenario (GstValidateFileChecker * fc, GstElementConfigureFunc configure_function, const gchar * messages_prefix) { GstElement *playbin; @@ -613,8 +615,8 @@ check_playback_scenario (GstQaFileChecker * fc, audiosink = gst_element_factory_make ("fakesink", "fc-audiosink"); if (!playbin || !videosink || !audiosink) { - GST_QA_REPORT (fc, GST_QA_ISSUE_ID_MISSING_PLUGIN, "file check requires " - "playbin2 and fakesink to be available"); + GST_VALIDATE_REPORT (fc, GST_VALIDATE_ISSUE_ID_MISSING_PLUGIN, + "file check requires " "playbin2 and fakesink to be available"); } g_object_set (playbin, "video-sink", videosink, "audio-sink", audiosink, @@ -622,7 +624,7 @@ check_playback_scenario (GstQaFileChecker * fc, if (gst_element_set_state (playbin, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) { - GST_QA_REPORT (fc, GST_QA_ISSUE_ID_FILE_PLAYBACK_START_FAILURE, + GST_VALIDATE_REPORT (fc, GST_VALIDATE_ISSUE_ID_FILE_PLAYBACK_START_FAILURE, "Failed to " "change pipeline state to playing"); ret = FALSE; goto end; @@ -645,7 +647,7 @@ check_playback_scenario (GstQaFileChecker * fc, gchar *debug = NULL; gst_message_parse_error (msg, &error, &debug); - GST_QA_REPORT (fc, GST_QA_ISSUE_ID_FILE_PLAYBACK_ERROR, + GST_VALIDATE_REPORT (fc, GST_VALIDATE_ISSUE_ID_FILE_PLAYBACK_ERROR, "%s - File %s failed " "during playback. Error: %s : %s", messages_prefix, fc->uri, error->message, debug); g_error_free (error); @@ -657,7 +659,7 @@ check_playback_scenario (GstQaFileChecker * fc, } gst_message_unref (msg); } else { - GST_QA_REPORT (fc, GST_QA_ISSUE_ID_FILE_PLAYBACK_ERROR, "%s - " + GST_VALIDATE_REPORT (fc, GST_VALIDATE_ISSUE_ID_FILE_PLAYBACK_ERROR, "%s - " "File playback finished unexpectedly", messages_prefix); } gst_object_unref (bus); @@ -670,7 +672,7 @@ end: } static gboolean -check_playback (GstQaFileChecker * fc) +check_playback (GstValidateFileChecker * fc) { if (!fc->test_playback) return TRUE; @@ -678,7 +680,7 @@ check_playback (GstQaFileChecker * fc) } static gboolean -send_reverse_seek (GstQaFileChecker * fc, GstElement * pipeline) +send_reverse_seek (GstValidateFileChecker * fc, GstElement * pipeline) { gboolean ret; @@ -686,14 +688,14 @@ send_reverse_seek (GstQaFileChecker * fc, GstElement * pipeline) GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, -1); if (!ret) { - GST_QA_REPORT (fc, GST_QA_ISSUE_ID_FILE_PLAYBACK_ERROR, + GST_VALIDATE_REPORT (fc, GST_VALIDATE_ISSUE_ID_FILE_PLAYBACK_ERROR, "Reverse playback seek failed"); } return ret; } static gboolean -check_reverse_playback (GstQaFileChecker * fc) +check_reverse_playback (GstValidateFileChecker * fc) { if (!fc->test_reverse_playback) return TRUE; @@ -701,7 +703,7 @@ check_reverse_playback (GstQaFileChecker * fc) } gboolean -gst_qa_file_checker_run (GstQaFileChecker * fc) +gst_validate_file_checker_run (GstValidateFileChecker * fc) { GError *err = NULL; GstDiscovererInfo *info; @@ -711,7 +713,7 @@ gst_qa_file_checker_run (GstQaFileChecker * fc) g_return_val_if_fail (fc->uri != NULL, FALSE); if (!discoverer) { - GST_QA_REPORT (fc, GST_QA_ISSUE_ID_ALLOCATION_FAILURE, + GST_VALIDATE_REPORT (fc, GST_VALIDATE_ISSUE_ID_ALLOCATION_FAILURE, "Failed to create GstDiscoverer"); return FALSE; } @@ -719,7 +721,7 @@ gst_qa_file_checker_run (GstQaFileChecker * fc) info = gst_discoverer_discover_uri (discoverer, fc->uri, &err); if (gst_discoverer_info_get_result (info) != GST_DISCOVERER_OK) { - GST_QA_REPORT (fc, GST_QA_ISSUE_ID_FILE_CHECK_FAILURE, + GST_VALIDATE_REPORT (fc, GST_VALIDATE_ISSUE_ID_FILE_CHECK_FAILURE, "Discoverer failed to discover the file, result: %d", gst_discoverer_info_get_result (info)); return FALSE; diff --git a/validate/gst/validate/gst-validate-file-checker.h b/validate/gst/validate/gst-validate-file-checker.h new file mode 100644 index 0000000..99476e6 --- /dev/null +++ b/validate/gst/validate/gst-validate-file-checker.h @@ -0,0 +1,93 @@ +/* GStreamer + * Copyright (C) 2013 Thiago Santos + * + * gst-validate-file-checker.h - Validate File conformance check utility functions / structs + * + * 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.1 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. + */ + +#ifndef __GST_VALIDATE_FILE_CHECK_H__ +#define __GST_VALIDATE_FILE_CHECK_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_VALIDATE_FILE_CHECKER (gst_validate_file_checker_get_type ()) +#define GST_IS_VALIDATE_FILE_CHECKER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_VALIDATE_FILE_CHECKER)) +#define GST_IS_VALIDATE_FILE_CHECKER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_VALIDATE_FILE_CHECKER)) +#define GST_VALIDATE_FILE_CHECKER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_VALIDATE_FILE_CHECKER, GstValidateFileCheckerClass)) +#define GST_VALIDATE_FILE_CHECKER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_VALIDATE_FILE_CHECKER, GstValidateFileChecker)) +#define GST_VALIDATE_FILE_CHECKER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_VALIDATE_FILE_CHECKER, GstValidateFileCheckerClass)) +#define GST_VALIDATE_FILE_CHECKER_CAST(obj) ((GstValidateFileChecker*)(obj)) +#define GST_VALIDATE_FILE_CHECKER_CLASS_CAST(klass) ((GstValidateFileCheckerClass*)(klass)) + +typedef struct _GstValidateFileChecker GstValidateFileChecker; +typedef struct _GstValidateFileCheckerClass GstValidateFileCheckerClass; + +/** + * GstValidateFileChecker: + * + * GStreamer Validate FileChecker class. + * + * Class that wraps a #GObject for Validate checks + */ +struct _GstValidateFileChecker { + GObject object; + + /* */ + /* Value for the expected total duration of the file in nanosecs + * Set to GST_CLOCK_TIME_NONE if it shouldn't be tested */ + GstClockTime duration; + /* Acceptable tolerance for duration */ + GstClockTime duration_tolerance; + + /* Expected file_size, set to 0 to skip test */ + guint64 file_size; + /* Acceptable tolerance for file_size check */ + guint64 file_size_tolerance; + + gboolean seekable; /* TODO should we care about disabling this check? */ + + gboolean test_playback; + gboolean test_reverse_playback; + + gchar *uri; + + /* Set to NULL to skip check */ + GstEncodingProfile *profile; +}; + +/** + * GstValidateFileCheckerClass: + * @parent_class: parent + * + * GStreamer Validate FileChecker object class. + */ +struct _GstValidateFileCheckerClass { + GObjectClass parent_class; +}; + +/* normal GObject stuff */ +GType gst_validate_file_checker_get_type (void); + +gboolean gst_validate_file_checker_run (GstValidateFileChecker * fc); + +G_END_DECLS + +#endif /* __GST_VALIDATE_FILE_CHECK_H__ */ + diff --git a/validate/gst/qa/gst-qa-i18n-lib.h b/validate/gst/validate/gst-validate-i18n-lib.h similarity index 88% rename from validate/gst/qa/gst-qa-i18n-lib.h rename to validate/gst/validate/gst-validate-i18n-lib.h index 5a0e239..f01f677 100644 --- a/validate/gst/qa/gst-qa-i18n-lib.h +++ b/validate/gst/validate/gst-validate-i18n-lib.h @@ -1,7 +1,7 @@ /* GStreamer * Copyright (C) 2004 Thomas Vander Stichele * - * gst-qa-i18n-lib.h: internationalization macros for the GStreamer libraries + * gst-validate-i18n-lib.h: internationalization macros for the GStreamer libraries * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -20,8 +20,8 @@ */ -#ifndef __GST_QA_I18N_LIB_H__ -#define __GST_QA_I18N_LIB_H__ +#ifndef __GST_VALIDATE_I18N_LIB_H__ +#define __GST_VALIDATE_I18N_LIB_H__ #ifndef PACKAGE_NAME #error You must include config.h before including this header. @@ -44,4 +44,4 @@ #endif -#endif /* __GST_QA_I18N_LIB_H__ */ +#endif /* __GST_VALIDATE_I18N_LIB_H__ */ diff --git a/validate/gst/qa/gst-qa-monitor-factory.c b/validate/gst/validate/gst-validate-monitor-factory.c similarity index 57% rename from validate/gst/qa/gst-qa-monitor-factory.c rename to validate/gst/validate/gst-validate-monitor-factory.c index 85793c2..02890c1 100644 --- a/validate/gst/qa/gst-qa-monitor-factory.c +++ b/validate/gst/validate/gst-validate-monitor-factory.c @@ -1,7 +1,7 @@ /* GStreamer * Copyright (C) 2013 Thiago Santos * - * gst-qa-monitor-factory.c - QA Element monitors factory utility functions + * gst-validate-monitor-factory.c - Validate Element monitors factory utility functions * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -19,33 +19,33 @@ * Boston, MA 02111-1307, USA. */ -#include "gst-qa-monitor-factory.h" -#include "gst-qa-bin-monitor.h" -#include "gst-qa-pad-monitor.h" -#include "gst-qa-override-registry.h" +#include "gst-validate-monitor-factory.h" +#include "gst-validate-bin-monitor.h" +#include "gst-validate-pad-monitor.h" +#include "gst-validate-override-registry.h" -GstQaMonitor * -gst_qa_monitor_factory_create (GstObject * target, GstQaRunner * runner, - GstQaMonitor * parent) +GstValidateMonitor * +gst_validate_monitor_factory_create (GstObject * target, + GstValidateRunner * runner, GstValidateMonitor * parent) { - GstQaMonitor *monitor = NULL; + GstValidateMonitor *monitor = NULL; g_return_val_if_fail (target != NULL, NULL); if (GST_IS_PAD (target)) { monitor = - GST_QA_MONITOR_CAST (gst_qa_pad_monitor_new (GST_PAD_CAST (target), - runner, GST_QA_ELEMENT_MONITOR_CAST (parent))); + GST_VALIDATE_MONITOR_CAST (gst_validate_pad_monitor_new (GST_PAD_CAST + (target), runner, GST_VALIDATE_ELEMENT_MONITOR_CAST (parent))); } else if (GST_IS_BIN (target)) { monitor = - GST_QA_MONITOR_CAST (gst_qa_bin_monitor_new (GST_BIN_CAST + GST_VALIDATE_MONITOR_CAST (gst_validate_bin_monitor_new (GST_BIN_CAST (target), runner, parent)); } else if (GST_IS_ELEMENT (target)) { monitor = - GST_QA_MONITOR_CAST (gst_qa_element_monitor_new (GST_ELEMENT_CAST - (target), runner, parent)); + GST_VALIDATE_MONITOR_CAST (gst_validate_element_monitor_new + (GST_ELEMENT_CAST (target), runner, parent)); } g_return_val_if_fail (target != NULL, NULL); - gst_qa_override_registry_attach_overrides (monitor); + gst_validate_override_registry_attach_overrides (monitor); return monitor; } diff --git a/validate/gst/qa/gst-qa-monitor-factory.h b/validate/gst/validate/gst-validate-monitor-factory.h similarity index 68% rename from validate/gst/qa/gst-qa-monitor-factory.h rename to validate/gst/validate/gst-validate-monitor-factory.h index 48a4ef4..14be950 100644 --- a/validate/gst/qa/gst-qa-monitor-factory.h +++ b/validate/gst/validate/gst-validate-monitor-factory.h @@ -1,7 +1,7 @@ /* GStreamer * Copyright (C) 2013 Thiago Santos * - * gst-qa-monitor-factory.h - QA Element monitors factory utility functions + * gst-validate-monitor-factory.h - Validate Element monitors factory utility functions * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -19,19 +19,19 @@ * Boston, MA 02111-1307, USA. */ -#ifndef __GST_QA_MONITOR_FACTORY_H__ -#define __GST_QA_MONITOR_FACTORY_H__ +#ifndef __GST_VALIDATE_MONITOR_FACTORY_H__ +#define __GST_VALIDATE_MONITOR_FACTORY_H__ #include #include -#include "gst-qa-monitor.h" -#include "gst-qa-runner.h" +#include "gst-validate-monitor.h" +#include "gst-validate-runner.h" G_BEGIN_DECLS -GstQaMonitor * gst_qa_monitor_factory_create (GstObject * target, GstQaRunner * runner, GstQaMonitor * parent); +GstValidateMonitor * gst_validate_monitor_factory_create (GstObject * target, GstValidateRunner * runner, GstValidateMonitor * parent); G_END_DECLS -#endif /* __GST_QA_MONITOR_FACTORY_H__ */ +#endif /* __GST_VALIDATE_MONITOR_FACTORY_H__ */ diff --git a/validate/gst/qa/gst-qa-monitor-preload.c b/validate/gst/validate/gst-validate-monitor-preload.c similarity index 84% rename from validate/gst/qa/gst-qa-monitor-preload.c rename to validate/gst/validate/gst-validate-monitor-preload.c index bd8e774..f27d483 100644 --- a/validate/gst/qa/gst-qa-monitor-preload.c +++ b/validate/gst/validate/gst-validate-monitor-preload.c @@ -1,7 +1,7 @@ /* GStreamer * Copyright (C) 2013 Thiago Santos * - * gst-qa-monitor-preload.c - QA Element monitors preload functions + * gst-validate-monitor-preload.c - Validate Element monitors preload functions * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -21,27 +21,27 @@ #include #include -#include "gst-qa-runner.h" -#include "gst-qa-monitor-factory.h" +#include "gst-validate-runner.h" +#include "gst-validate-monitor-factory.h" #define __USE_GNU #include -static GstQaRunner *runner = NULL; +static GstValidateRunner *runner = NULL; /* - * Functions that wrap object creation so gst-qa can be used + * Functions that wrap object creation so gst-validate can be used * to monitor 'standard' applications */ static void -gst_qa_preload_wrap (GstElement * element) +gst_validate_preload_wrap (GstElement * element) { if (runner == NULL) - runner = gst_qa_runner_new (); + runner = gst_validate_runner_new (); /* the reference to the monitor is lost */ - gst_qa_monitor_factory_create (GST_OBJECT_CAST (element), runner, NULL); + gst_validate_monitor_factory_create (GST_OBJECT_CAST (element), runner, NULL); } GstElement * @@ -58,7 +58,7 @@ gst_element_factory_make (const gchar * element_name, const gchar * name) element = gst_element_factory_make_real (element_name, name); if (GST_IS_PIPELINE (element)) { - gst_qa_preload_wrap (element); + gst_validate_preload_wrap (element); } return element; } @@ -73,7 +73,7 @@ gst_pipeline_new (const gchar * name) gst_pipeline_new_real = dlsym (RTLD_NEXT, "gst_pipeline_new"); element = gst_pipeline_new_real (name); - gst_qa_preload_wrap (element); + gst_validate_preload_wrap (element); return element; } @@ -89,7 +89,7 @@ gst_parse_launchv (const gchar ** argv, GError ** error) element = gst_parse_launchv_real (argv, error); if (GST_IS_PIPELINE (element)) { - gst_qa_preload_wrap (element); + gst_validate_preload_wrap (element); } return element; } @@ -107,7 +107,7 @@ gst_parse_launchv_full (const gchar ** argv, GstParseContext * context, element = gst_parse_launchv_full_real (argv, context, flags, error); if (GST_IS_PIPELINE (element)) { - gst_qa_preload_wrap (element); + gst_validate_preload_wrap (element); } return element; } @@ -123,7 +123,7 @@ gst_parse_launch (const gchar * pipeline_description, GError ** error) element = gst_parse_launch_real (pipeline_description, error); if (GST_IS_PIPELINE (element)) { - gst_qa_preload_wrap (element); + gst_validate_preload_wrap (element); } return element; } @@ -142,7 +142,7 @@ gst_parse_launch_full (const gchar * pipeline_description, element = gst_parse_launch_full_real (pipeline_description, context, flags, error); if (GST_IS_PIPELINE (element)) { - gst_qa_preload_wrap (element); + gst_validate_preload_wrap (element); } return element; } diff --git a/validate/gst/validate/gst-validate-monitor.c b/validate/gst/validate/gst-validate-monitor.c new file mode 100644 index 0000000..be82f40 --- /dev/null +++ b/validate/gst/validate/gst-validate-monitor.c @@ -0,0 +1,294 @@ +/* GStreamer + * Copyright (C) 2013 Thiago Santos + * + * gst-validate-element-monitor.c - Validate Monitor class + * + * 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.1 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-validate-monitor.h" + +/** + * SECTION:gst-validate-monitor + * @short_description: Base class that wraps a #GObject for Validate checks + * + * TODO + */ + +enum +{ + PROP_0, + PROP_OBJECT, + PROP_RUNNER, + PROP_VALIDATE_PARENT, + PROP_LAST +}; + +GST_DEBUG_CATEGORY_STATIC (gst_validate_monitor_debug); +#define GST_CAT_DEFAULT gst_validate_monitor_debug + +static gboolean gst_validate_monitor_do_setup (GstValidateMonitor * monitor); +static void +gst_validate_monitor_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void +gst_validate_monitor_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static GObject *gst_validate_monitor_constructor (GType type, + guint n_construct_params, GObjectConstructParam * construct_params); + +gboolean gst_validate_monitor_setup (GstValidateMonitor * monitor); + +static void gst_validate_monitor_intercept_report (GstValidateReporter * + reporter, GstValidateReport * report); + +#define _do_init \ + GST_DEBUG_CATEGORY_INIT (gst_validate_monitor_debug, "qa_monitor", 0, "VALIDATE Monitor");\ + G_IMPLEMENT_INTERFACE (GST_TYPE_VALIDATE_REPORTER, _reporter_iface_init) + +static void +_reporter_iface_init (GstValidateReporterInterface * iface) +{ + iface->intercept_report = gst_validate_monitor_intercept_report; +} + +#define gst_validate_monitor_parent_class parent_class +G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GstValidateMonitor, gst_validate_monitor, + G_TYPE_OBJECT, _do_init); + +void +_target_freed_cb (GstValidateMonitor * monitor, GObject * where_the_object_was) +{ + GST_DEBUG_OBJECT (monitor, "Target was freed"); + monitor->target = NULL; +} + +static void +gst_validate_monitor_dispose (GObject * object) +{ + GstValidateMonitor *monitor = GST_VALIDATE_MONITOR_CAST (object); + + g_mutex_clear (&monitor->mutex); + g_mutex_clear (&monitor->overrides_mutex); + g_queue_clear (&monitor->overrides); + + if (monitor->target) + g_object_weak_unref (G_OBJECT (monitor->target), + (GWeakNotify) _target_freed_cb, monitor); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_validate_monitor_finalize (GObject * object) +{ + gst_validate_reporter_set_name (GST_VALIDATE_REPORTER (object), NULL); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_validate_monitor_class_init (GstValidateMonitorClass * klass) +{ + GObjectClass *gobject_class; + + gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->get_property = gst_validate_monitor_get_property; + gobject_class->set_property = gst_validate_monitor_set_property; + gobject_class->dispose = gst_validate_monitor_dispose; + gobject_class->finalize = gst_validate_monitor_finalize; + gobject_class->constructor = gst_validate_monitor_constructor; + + klass->setup = gst_validate_monitor_do_setup; + + g_object_class_install_property (gobject_class, PROP_OBJECT, + g_param_spec_object ("object", "Object", "The object to be monitored", + GST_TYPE_OBJECT, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class, PROP_RUNNER, + g_param_spec_object ("qa-runner", "VALIDATE Runner", + "The Validate runner to " "report errors to", + GST_TYPE_VALIDATE_RUNNER, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class, PROP_VALIDATE_PARENT, + g_param_spec_object ("qa-parent", "VALIDATE parent monitor", + "The Validate monitor " "that is the parent of this one", + GST_TYPE_VALIDATE_MONITOR, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)); +} + +static GObject * +gst_validate_monitor_constructor (GType type, guint n_construct_params, + GObjectConstructParam * construct_params) +{ + GstValidateMonitor *monitor = + GST_VALIDATE_MONITOR_CAST (G_OBJECT_CLASS (parent_class)->constructor + (type, + n_construct_params, + construct_params)); + gst_validate_monitor_setup (monitor); + return (GObject *) monitor; +} + +static void +gst_validate_monitor_init (GstValidateMonitor * monitor) +{ + g_mutex_init (&monitor->mutex); + + g_mutex_init (&monitor->overrides_mutex); + g_queue_init (&monitor->overrides); +} + +/** + * gst_validate_monitor_new: + * @element: (transfer-none): a #GObject to run Validate on + */ +GstValidateMonitor * +gst_validate_monitor_new (GObject * object) +{ + GstValidateMonitor *monitor = + g_object_new (GST_TYPE_VALIDATE_MONITOR, "object", + G_TYPE_OBJECT, object, NULL); + + if (GST_VALIDATE_MONITOR_GET_OBJECT (monitor) == NULL) { + /* setup failed, no use on returning this monitor */ + g_object_unref (monitor); + return NULL; + } + + return monitor; +} + +static gboolean +gst_validate_monitor_do_setup (GstValidateMonitor * monitor) +{ + /* NOP */ + return TRUE; +} + +gboolean +gst_validate_monitor_setup (GstValidateMonitor * monitor) +{ + GST_DEBUG_OBJECT (monitor, "Starting monitor setup"); + return GST_VALIDATE_MONITOR_GET_CLASS (monitor)->setup (monitor); +} + +GstElement * +gst_validate_monitor_get_element (GstValidateMonitor * monitor) +{ + GstValidateMonitorClass *klass = GST_VALIDATE_MONITOR_GET_CLASS (monitor); + GstElement *element = NULL; + + if (klass->get_element) + element = klass->get_element (monitor); + + return element; +} + +const gchar * +gst_validate_monitor_get_element_name (GstValidateMonitor * monitor) +{ + GstElement *element; + + element = gst_validate_monitor_get_element (monitor); + if (element) + return GST_ELEMENT_NAME (element); + return NULL; +} + +/* Check if any of our overrides wants to change the report severity */ +static void +gst_validate_monitor_intercept_report (GstValidateReporter * reporter, + GstValidateReport * report) +{ + GList *iter; + GstValidateMonitor *monitor = GST_VALIDATE_MONITOR_CAST (reporter); + + GST_VALIDATE_MONITOR_OVERRIDES_LOCK (monitor); + for (iter = monitor->overrides.head; iter; iter = g_list_next (iter)) { + report->level = + gst_validate_override_get_severity (iter->data, + gst_validate_issue_get_id (report->issue), report->level); + } + GST_VALIDATE_MONITOR_OVERRIDES_UNLOCK (monitor); +} + +void +gst_validate_monitor_attach_override (GstValidateMonitor * monitor, + GstValidateOverride * override) +{ + GST_VALIDATE_MONITOR_OVERRIDES_LOCK (monitor); + g_queue_push_tail (&monitor->overrides, override); + GST_VALIDATE_MONITOR_OVERRIDES_UNLOCK (monitor); +} + +static void +gst_validate_monitor_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstValidateMonitor *monitor; + + monitor = GST_VALIDATE_MONITOR_CAST (object); + + switch (prop_id) { + case PROP_OBJECT: + g_assert (monitor->target == NULL); + monitor->target = g_value_get_object (value); + g_object_weak_ref (G_OBJECT (monitor->target), + (GWeakNotify) _target_freed_cb, monitor); + + if (monitor->target) + gst_validate_reporter_set_name (GST_VALIDATE_REPORTER (monitor), + g_strdup (GST_OBJECT_NAME (monitor->target))); + break; + case PROP_RUNNER: + gst_validate_reporter_set_runner (GST_VALIDATE_REPORTER (monitor), + g_value_get_object (value)); + break; + case PROP_VALIDATE_PARENT: + monitor->parent = g_value_get_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_validate_monitor_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstValidateMonitor *monitor; + + monitor = GST_VALIDATE_MONITOR_CAST (object); + + switch (prop_id) { + case PROP_OBJECT: + g_value_set_object (value, GST_VALIDATE_MONITOR_GET_OBJECT (monitor)); + break; + case PROP_RUNNER: + g_value_set_object (value, GST_VALIDATE_MONITOR_GET_RUNNER (monitor)); + break; + case PROP_VALIDATE_PARENT: + g_value_set_object (value, GST_VALIDATE_MONITOR_GET_PARENT (monitor)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} diff --git a/validate/gst/validate/gst-validate-monitor.h b/validate/gst/validate/gst-validate-monitor.h new file mode 100644 index 0000000..c53eb36 --- /dev/null +++ b/validate/gst/validate/gst-validate-monitor.h @@ -0,0 +1,109 @@ +/* GStreamer + * Copyright (C) 2013 Thiago Santos + * + * gst-validate-monitor.h - Validate Monitor abstract base class + * + * 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.1 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. + */ + +#ifndef __GST_VALIDATE_MONITOR_H__ +#define __GST_VALIDATE_MONITOR_H__ + +#include +#include +#include "gst-validate-report.h" +#include "gst-validate-reporter.h" +#include "gst-validate-runner.h" +#include "gst-validate-override.h" + +G_BEGIN_DECLS + +#define GST_TYPE_VALIDATE_MONITOR (gst_validate_monitor_get_type ()) +#define GST_IS_VALIDATE_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_VALIDATE_MONITOR)) +#define GST_IS_VALIDATE_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_VALIDATE_MONITOR)) +#define GST_VALIDATE_MONITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_VALIDATE_MONITOR, GstValidateMonitorClass)) +#define GST_VALIDATE_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_VALIDATE_MONITOR, GstValidateMonitor)) +#define GST_VALIDATE_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_VALIDATE_MONITOR, GstValidateMonitorClass)) +#define GST_VALIDATE_MONITOR_CAST(obj) ((GstValidateMonitor*)(obj)) +#define GST_VALIDATE_MONITOR_CLASS_CAST(klass) ((GstValidateMonitorClass*)(klass)) + +#define GST_VALIDATE_MONITOR_GET_OBJECT(m) (GST_VALIDATE_MONITOR_CAST (m)->target) +#define GST_VALIDATE_MONITOR_GET_RUNNER(m) (gst_validate_reporter_get_runner (GST_VALIDATE_REPORTER_CAST (m))) +#define GST_VALIDATE_MONITOR_GET_PARENT(m) (GST_VALIDATE_MONITOR_CAST (m)->parent) +#define GST_VALIDATE_MONITOR_LOCK(m) (g_mutex_lock (&GST_VALIDATE_MONITOR_CAST(m)->mutex)) +#define GST_VALIDATE_MONITOR_UNLOCK(m) (g_mutex_unlock (&GST_VALIDATE_MONITOR_CAST(m)->mutex)) +#define GST_VALIDATE_MONITOR_OVERRIDES_LOCK(m) g_mutex_lock (&GST_VALIDATE_MONITOR_CAST (m)->overrides_mutex) +#define GST_VALIDATE_MONITOR_OVERRIDES_UNLOCK(m) g_mutex_unlock (&GST_VALIDATE_MONITOR_CAST (m)->overrides_mutex) +#define GST_VALIDATE_MONITOR_OVERRIDES(m) (GST_VALIDATE_MONITOR_CAST (m)->overrides) + +/* #else TODO Implemen no variadic macros, use inline, + * Problem being: + * GST_VALIDATE_REPORT_LEVEL_ ## status + * GST_VALIDATE_AREA_ ## area ## _ ## subarea + */ + +typedef struct _GstValidateMonitor GstValidateMonitor; +typedef struct _GstValidateMonitorClass GstValidateMonitorClass; + +/** + * GstValidateMonitor: + * + * GStreamer Validate Monitor class. + * + * Class that wraps a #GObject for Validate checks + */ +struct _GstValidateMonitor { + GObject object; + + GstObject *target; + GMutex mutex; + gchar *target_name; + + GstValidateMonitor *parent; + + GMutex overrides_mutex; + GQueue overrides; + + /*< private >*/ + GHashTable *reports; +}; + +/** + * GstValidateMonitorClass: + * @parent_class: parent + * + * GStreamer Validate Monitor object class. + */ +struct _GstValidateMonitorClass { + GObjectClass parent_class; + + gboolean (* setup) (GstValidateMonitor * monitor); + GstElement *(* get_element) (GstValidateMonitor * monitor); +}; + +/* normal GObject stuff */ +GType gst_validate_monitor_get_type (void); + +void gst_validate_monitor_attach_override (GstValidateMonitor * monitor, + GstValidateOverride * override); + +GstElement * gst_validate_monitor_get_element (GstValidateMonitor * monitor); +const gchar * gst_validate_monitor_get_element_name (GstValidateMonitor * monitor); + +G_END_DECLS + +#endif /* __GST_VALIDATE_MONITOR_H__ */ + diff --git a/validate/gst/validate/gst-validate-override-registry.c b/validate/gst/validate/gst-validate-override-registry.c new file mode 100644 index 0000000..d593981 --- /dev/null +++ b/validate/gst/validate/gst-validate-override-registry.c @@ -0,0 +1,233 @@ +/* GStreamer + * Copyright (C) 2013 Thiago Santos + * + * gst-validate-override-registry.c - Validate Override Registry + * + * 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.1 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 + +#define __USE_GNU +#include + +#include "gst-validate-override-registry.h" + +typedef struct +{ + gchar *name; + GstValidateOverride *override; +} GstValidateOverrideRegistryNameEntry; + +typedef struct +{ + GType gtype; + GstValidateOverride *override; +} GstValidateOverrideRegistryGTypeEntry; + +static GMutex _gst_validate_override_registry_mutex; +static GstValidateOverrideRegistry *_registry_default; + +#define GST_VALIDATE_OVERRIDE_REGISTRY_LOCK(r) g_mutex_lock (&r->mutex) +#define GST_VALIDATE_OVERRIDE_REGISTRY_UNLOCK(r) g_mutex_unlock (&r->mutex) + +#define GST_VALIDATE_OVERRIDE_INIT_SYMBOL "gst_validate_create_overrides" + +static GstValidateOverrideRegistry * +gst_validate_override_registry_new (void) +{ + GstValidateOverrideRegistry *reg = g_slice_new0 (GstValidateOverrideRegistry); + + g_mutex_init (®->mutex); + g_queue_init (®->name_overrides); + g_queue_init (®->gtype_overrides); + g_queue_init (®->klass_overrides); + + return reg; +} + +GstValidateOverrideRegistry * +gst_validate_override_registry_get (void) +{ + g_mutex_lock (&_gst_validate_override_registry_mutex); + if (G_UNLIKELY (!_registry_default)) { + _registry_default = gst_validate_override_registry_new (); + } + g_mutex_unlock (&_gst_validate_override_registry_mutex); + + return _registry_default; +} + +void +gst_validate_override_register_by_name (const gchar * name, + GstValidateOverride * override) +{ + GstValidateOverrideRegistry *registry = gst_validate_override_registry_get (); + GstValidateOverrideRegistryNameEntry *entry = + g_slice_new (GstValidateOverrideRegistryNameEntry); + + GST_VALIDATE_OVERRIDE_REGISTRY_LOCK (registry); + entry->name = g_strdup (name); + entry->override = override; + g_queue_push_tail (®istry->name_overrides, entry); + GST_VALIDATE_OVERRIDE_REGISTRY_UNLOCK (registry); +} + +void +gst_validate_override_register_by_type (GType gtype, + GstValidateOverride * override) +{ + GstValidateOverrideRegistry *registry = gst_validate_override_registry_get (); + GstValidateOverrideRegistryGTypeEntry *entry = + g_slice_new (GstValidateOverrideRegistryGTypeEntry); + + GST_VALIDATE_OVERRIDE_REGISTRY_LOCK (registry); + entry->gtype = gtype; + entry->override = override; + g_queue_push_tail (®istry->gtype_overrides, entry); + GST_VALIDATE_OVERRIDE_REGISTRY_UNLOCK (registry); +} + +void +gst_validate_override_register_by_klass (const gchar * klass, + GstValidateOverride * override) +{ + GstValidateOverrideRegistry *registry = gst_validate_override_registry_get (); + GstValidateOverrideRegistryNameEntry *entry = + g_slice_new (GstValidateOverrideRegistryNameEntry); + + GST_VALIDATE_OVERRIDE_REGISTRY_LOCK (registry); + entry->name = g_strdup (klass); + entry->override = override; + g_queue_push_tail (®istry->klass_overrides, entry); + GST_VALIDATE_OVERRIDE_REGISTRY_UNLOCK (registry); +} + +static void + gst_validate_override_registry_attach_name_overrides_unlocked + (GstValidateOverrideRegistry * registry, GstValidateMonitor * monitor) +{ + GstValidateOverrideRegistryNameEntry *entry; + GList *iter; + const gchar *name; + + name = gst_validate_monitor_get_element_name (monitor); + for (iter = registry->name_overrides.head; iter; iter = g_list_next (iter)) { + entry = iter->data; + if (strcmp (name, entry->name) == 0) { + gst_validate_monitor_attach_override (monitor, entry->override); + } + } +} + +static void + gst_validate_override_registry_attach_gtype_overrides_unlocked + (GstValidateOverrideRegistry * registry, GstValidateMonitor * monitor) +{ + GstValidateOverrideRegistryGTypeEntry *entry; + GstElement *element; + GList *iter; + + element = gst_validate_monitor_get_element (monitor); + if (!element) + return; + + for (iter = registry->name_overrides.head; iter; iter = g_list_next (iter)) { + entry = iter->data; + if (G_TYPE_CHECK_INSTANCE_TYPE (element, entry->gtype)) { + gst_validate_monitor_attach_override (monitor, entry->override); + } + } +} + +static void + gst_validate_override_registry_attach_klass_overrides_unlocked + (GstValidateOverrideRegistry * registry, GstValidateMonitor * monitor) +{ + GstValidateOverrideRegistryNameEntry *entry; + GList *iter; + GstElement *element; + GstElementClass *klass; + + element = gst_validate_monitor_get_element (monitor); + if (!element) + return; + + klass = GST_ELEMENT_GET_CLASS (element); + + for (iter = registry->name_overrides.head; iter; iter = g_list_next (iter)) { + entry = iter->data; + /* TODO It would be more correct to split it before comparing */ + if (strstr (klass->details.klass, entry->name) != NULL) { + gst_validate_monitor_attach_override (monitor, entry->override); + } + } +} + +void +gst_validate_override_registry_attach_overrides (GstValidateMonitor * monitor) +{ + GstValidateOverrideRegistry *reg = gst_validate_override_registry_get (); + + GST_VALIDATE_OVERRIDE_REGISTRY_LOCK (reg); + gst_validate_override_registry_attach_name_overrides_unlocked (reg, monitor); + gst_validate_override_registry_attach_gtype_overrides_unlocked (reg, monitor); + gst_validate_override_registry_attach_klass_overrides_unlocked (reg, monitor); + GST_VALIDATE_OVERRIDE_REGISTRY_UNLOCK (reg); +} + +int +gst_validate_override_registry_preload (void) +{ + gchar **solist, *const *so; + const char *sos, *soerr; + void *sol; + int ret, (*entry) (void), nloaded = 0; + + sos = g_getenv ("GST_VALIDATE_OVERRIDE"); + if (!sos) { + GST_INFO ("No GST_VALIDATE_OVERRIDE found, no overrides to load"); + return 0; + } + solist = g_strsplit (sos, ",", 0); + for (so = solist; *so; ++so) { + GST_INFO ("Loading overrides from %s", *so); + sol = dlopen (*so, RTLD_LAZY); + if (!sol) { + soerr = dlerror (); + GST_ERROR ("Failed to load %s %s", *so, soerr ? soerr : "no idea why"); + continue; + } + entry = dlsym (sol, GST_VALIDATE_OVERRIDE_INIT_SYMBOL); + if (entry) { + ret = (*entry) (); + if (ret > 0) { + GST_INFO ("Loaded %d overrides from %s", ret, *so); + nloaded += ret; + } else if (ret < 0) { + GST_WARNING ("Error loading overrides from %s", *so); + } else { + GST_INFO ("Loaded no overrides from %s", *so); + } + } else { + GST_WARNING (GST_VALIDATE_OVERRIDE_INIT_SYMBOL " not found in %s", *so); + } + dlclose (sol); + } + g_strfreev (solist); + GST_INFO ("%d overrides loaded", nloaded); + return nloaded; +} diff --git a/validate/gst/qa/gst-qa-override-registry.h b/validate/gst/validate/gst-validate-override-registry.h similarity index 55% rename from validate/gst/qa/gst-qa-override-registry.h rename to validate/gst/validate/gst-validate-override-registry.h index f4911fd..8b94bb8 100644 --- a/validate/gst/qa/gst-qa-override-registry.h +++ b/validate/gst/validate/gst-validate-override-registry.h @@ -1,7 +1,7 @@ /* GStreamer * Copyright (C) 2013 Thiago Santos * - * gst-qa-override-registry.h - QA Override registry + * gst-validate-override-registry.h - Validate Override registry * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -19,14 +19,14 @@ * Boston, MA 02111-1307, USA. */ -#ifndef __GST_QA_OVERRIDE_REGISTRY_H__ -#define __GST_QA_OVERRIDE_REGISTRY_H__ +#ifndef __GST_VALIDATE_OVERRIDE_REGISTRY_H__ +#define __GST_VALIDATE_OVERRIDE_REGISTRY_H__ #include #include -#include "gst-qa-report.h" -#include "gst-qa-monitor.h" -#include "gst-qa-override.h" +#include "gst-validate-report.h" +#include "gst-validate-monitor.h" +#include "gst-validate-override.h" G_BEGIN_DECLS @@ -36,19 +36,19 @@ typedef struct { GQueue name_overrides; GQueue gtype_overrides; GQueue klass_overrides; -} GstQaOverrideRegistry; +} GstValidateOverrideRegistry; -GstQaOverrideRegistry * gst_qa_override_registry_get (void); +GstValidateOverrideRegistry * gst_validate_override_registry_get (void); -void gst_qa_override_register_by_name (const gchar * name, GstQaOverride * override); -void gst_qa_override_register_by_type (GType gtype, GstQaOverride * override); -void gst_qa_override_register_by_klass (const gchar * klass, GstQaOverride * override); +void gst_validate_override_register_by_name (const gchar * name, GstValidateOverride * override); +void gst_validate_override_register_by_type (GType gtype, GstValidateOverride * override); +void gst_validate_override_register_by_klass (const gchar * klass, GstValidateOverride * override); -void gst_qa_override_registry_attach_overrides (GstQaMonitor * monitor); +void gst_validate_override_registry_attach_overrides (GstValidateMonitor * monitor); -int gst_qa_override_registry_preload (void); +int gst_validate_override_registry_preload (void); G_END_DECLS -#endif /* __GST_QA_OVERRIDE_REGISTRY_H__ */ +#endif /* __GST_VALIDATE_OVERRIDE_REGISTRY_H__ */ diff --git a/validate/gst/qa/gst-qa-override.c b/validate/gst/validate/gst-validate-override.c similarity index 50% rename from validate/gst/qa/gst-qa-override.c rename to validate/gst/validate/gst-validate-override.c index 63c553c..8d3762c 100644 --- a/validate/gst/qa/gst-qa-override.c +++ b/validate/gst/validate/gst-validate-override.c @@ -1,7 +1,7 @@ /* GStreamer * Copyright (C) 2013 Thiago Santos * - * gst-qa-override.c - QA Override that allows customizing QA behavior + * gst-validate-override.c - Validate Override that allows customizing Validate behavior * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -21,12 +21,12 @@ #include -#include "gst-qa-override.h" +#include "gst-validate-override.h" -GstQaOverride * -gst_qa_override_new (void) +GstValidateOverride * +gst_validate_override_new (void) { - GstQaOverride *override = g_slice_new0 (GstQaOverride); + GstValidateOverride *override = g_slice_new0 (GstValidateOverride); override->level_override = g_hash_table_new (g_direct_hash, g_direct_equal); @@ -34,15 +34,15 @@ gst_qa_override_new (void) } void -gst_qa_override_free (GstQaOverride * override) +gst_validate_override_free (GstValidateOverride * override) { g_hash_table_unref (override->level_override); - g_slice_free (GstQaOverride, override); + g_slice_free (GstValidateOverride, override); } void -gst_qa_override_change_severity (GstQaOverride * override, - GstQaIssueId issue_id, GstQaReportLevel new_level) +gst_validate_override_change_severity (GstValidateOverride * override, + GstValidateIssueId issue_id, GstValidateReportLevel new_level) { g_hash_table_insert (override->level_override, (gpointer) issue_id, (gpointer) new_level); @@ -50,14 +50,14 @@ gst_qa_override_change_severity (GstQaOverride * override, /* * Also receives @default_level to preserve a custom level that might have - * been set by a previous GstQaOverride and should not go back to the - * GstQaIssue default + * been set by a previous GstValidateOverride and should not go back to the + * GstValidateIssue default */ -GstQaReportLevel -gst_qa_override_get_severity (GstQaOverride * override, GstQaIssueId issue_id, - GstQaReportLevel default_level) +GstValidateReportLevel +gst_validate_override_get_severity (GstValidateOverride * override, + GstValidateIssueId issue_id, GstValidateReportLevel default_level) { - GstQaReportLevel level; + GstValidateReportLevel level; if (g_hash_table_lookup_extended (override->level_override, (gpointer) issue_id, NULL, (gpointer *) & level)) { return level; @@ -66,90 +66,90 @@ gst_qa_override_get_severity (GstQaOverride * override, GstQaIssueId issue_id, } void -gst_qa_override_set_event_handler (GstQaOverride * override, - GstQaOverrideEventHandler handler) +gst_validate_override_set_event_handler (GstValidateOverride * override, + GstValidateOverrideEventHandler handler) { override->event_handler = handler; } void -gst_qa_override_set_buffer_handler (GstQaOverride * override, - GstQaOverrideBufferHandler handler) +gst_validate_override_set_buffer_handler (GstValidateOverride * override, + GstValidateOverrideBufferHandler handler) { override->buffer_handler = handler; } void -gst_qa_override_set_query_handler (GstQaOverride * override, - GstQaOverrideQueryHandler handler) +gst_validate_override_set_query_handler (GstValidateOverride * override, + GstValidateOverrideQueryHandler handler) { override->query_handler = handler; } void -gst_qa_override_set_buffer_probe_handler (GstQaOverride * override, - GstQaOverrideBufferHandler handler) +gst_validate_override_set_buffer_probe_handler (GstValidateOverride * override, + GstValidateOverrideBufferHandler handler) { override->buffer_probe_handler = handler; } void -gst_qa_override_set_getcaps_handler (GstQaOverride * override, - GstQaOverrideGetCapsHandler handler) +gst_validate_override_set_getcaps_handler (GstValidateOverride * override, + GstValidateOverrideGetCapsHandler handler) { override->getcaps_handler = handler; } void -gst_qa_override_set_setcaps_handler (GstQaOverride * override, - GstQaOverrideSetCapsHandler handler) +gst_validate_override_set_setcaps_handler (GstValidateOverride * override, + GstValidateOverrideSetCapsHandler handler) { override->setcaps_handler = handler; } void -gst_qa_override_event_handler (GstQaOverride * override, GstQaMonitor * monitor, - GstEvent * event) +gst_validate_override_event_handler (GstValidateOverride * override, + GstValidateMonitor * monitor, GstEvent * event) { if (override->event_handler) override->event_handler (override, monitor, event); } void -gst_qa_override_buffer_handler (GstQaOverride * override, - GstQaMonitor * monitor, GstBuffer * buffer) +gst_validate_override_buffer_handler (GstValidateOverride * override, + GstValidateMonitor * monitor, GstBuffer * buffer) { if (override->buffer_handler) override->buffer_handler (override, monitor, buffer); } void -gst_qa_override_query_handler (GstQaOverride * override, GstQaMonitor * monitor, - GstQuery * query) +gst_validate_override_query_handler (GstValidateOverride * override, + GstValidateMonitor * monitor, GstQuery * query) { if (override->query_handler) override->query_handler (override, monitor, query); } void -gst_qa_override_buffer_probe_handler (GstQaOverride * override, - GstQaMonitor * monitor, GstBuffer * buffer) +gst_validate_override_buffer_probe_handler (GstValidateOverride * override, + GstValidateMonitor * monitor, GstBuffer * buffer) { if (override->buffer_probe_handler) override->buffer_probe_handler (override, monitor, buffer); } void -gst_qa_override_getcaps_handler (GstQaOverride * override, - GstQaMonitor * monitor, GstCaps * caps) +gst_validate_override_getcaps_handler (GstValidateOverride * override, + GstValidateMonitor * monitor, GstCaps * caps) { if (override->getcaps_handler) override->getcaps_handler (override, monitor, caps); } void -gst_qa_override_setcaps_handler (GstQaOverride * override, - GstQaMonitor * monitor, GstCaps * caps) +gst_validate_override_setcaps_handler (GstValidateOverride * override, + GstValidateMonitor * monitor, GstCaps * caps) { if (override->setcaps_handler) override->setcaps_handler (override, monitor, caps); diff --git a/validate/gst/validate/gst-validate-override.h b/validate/gst/validate/gst-validate-override.h new file mode 100644 index 0000000..50c0c24 --- /dev/null +++ b/validate/gst/validate/gst-validate-override.h @@ -0,0 +1,79 @@ +/* GStreamer + * Copyright (C) 2013 Thiago Santos + * + * gst-validate-override.h - Validate Override that allows customizing Validate behavior + * + * 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.1 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. + */ + +#ifndef __GST_VALIDATE_OVERRIDE_H__ +#define __GST_VALIDATE_OVERRIDE_H__ + +#include +#include +#include "gst-validate-report.h" + +G_BEGIN_DECLS + +typedef struct _QstQaOverride GstValidateOverride; +typedef struct _GstValidateMonitor GstValidateMonitor; + +typedef void (*GstValidateOverrideBufferHandler)(GstValidateOverride * override, + GstValidateMonitor * pad_monitor, GstBuffer * buffer); +typedef void (*GstValidateOverrideEventHandler)(GstValidateOverride * override, + GstValidateMonitor * pad_monitor, GstEvent * event); +typedef void (*GstValidateOverrideQueryHandler)(GstValidateOverride * override, + GstValidateMonitor * pad_monitor, GstQuery * query); +typedef void (*GstValidateOverrideGetCapsHandler)(GstValidateOverride * override, + GstValidateMonitor * pad_monitor, GstCaps * caps); +typedef void (*GstValidateOverrideSetCapsHandler)(GstValidateOverride * override, + GstValidateMonitor * pad_monitor, GstCaps * caps); + +struct _QstQaOverride { + GHashTable *level_override; + + /* Pad handlers */ + GstValidateOverrideBufferHandler buffer_handler; + GstValidateOverrideEventHandler event_handler; + GstValidateOverrideQueryHandler query_handler; + GstValidateOverrideBufferHandler buffer_probe_handler; + GstValidateOverrideGetCapsHandler getcaps_handler; + GstValidateOverrideSetCapsHandler setcaps_handler; +}; + +GstValidateOverride * gst_validate_override_new (void); +void gst_validate_override_free (GstValidateOverride * override); +void gst_validate_override_change_severity (GstValidateOverride * override, GstValidateIssueId issue_id, GstValidateReportLevel new_level); +GstValidateReportLevel gst_validate_override_get_severity (GstValidateOverride * override, GstValidateIssueId issue_id, GstValidateReportLevel default_level); + +void gst_validate_override_event_handler (GstValidateOverride * override, GstValidateMonitor * monitor, GstEvent * event); +void gst_validate_override_buffer_handler (GstValidateOverride * override, GstValidateMonitor * monitor, GstBuffer * buffer); +void gst_validate_override_query_handler (GstValidateOverride * override, GstValidateMonitor * monitor, GstQuery * query); +void gst_validate_override_buffer_probe_handler (GstValidateOverride * override, GstValidateMonitor * monitor, GstBuffer * buffer); +void gst_validate_override_getcaps_handler (GstValidateOverride * override, GstValidateMonitor * monitor, GstCaps * caps); +void gst_validate_override_setcaps_handler (GstValidateOverride * override, GstValidateMonitor * monitor, GstCaps * caps); + +void gst_validate_override_set_event_handler (GstValidateOverride * override, GstValidateOverrideEventHandler handler); +void gst_validate_override_set_buffer_handler (GstValidateOverride * override, GstValidateOverrideBufferHandler handler); +void gst_validate_override_set_query_handler (GstValidateOverride * override, GstValidateOverrideQueryHandler handler); +void gst_validate_override_set_buffer_probe_handler (GstValidateOverride * override, GstValidateOverrideBufferHandler handler); +void gst_validate_override_set_getcaps_handler (GstValidateOverride * override, GstValidateOverrideGetCapsHandler handler); +void gst_validate_override_set_setcaps_handler (GstValidateOverride * override, GstValidateOverrideSetCapsHandler handler); + +G_END_DECLS + +#endif /* __GST_VALIDATE_OVERRIDE_H__ */ + diff --git a/validate/gst/qa/gst-qa-pad-monitor.c b/validate/gst/validate/gst-validate-pad-monitor.c similarity index 66% rename from validate/gst/qa/gst-qa-pad-monitor.c rename to validate/gst/validate/gst-validate-pad-monitor.c index c19238c..246308d 100644 --- a/validate/gst/qa/gst-qa-pad-monitor.c +++ b/validate/gst/validate/gst-validate-pad-monitor.c @@ -1,7 +1,7 @@ /* GStreamer * Copyright (C) 2013 Thiago Santos * - * gst-qa-pad-monitor.c - QA PadMonitor class + * gst-validate-pad-monitor.c - Validate PadMonitor class * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -19,28 +19,28 @@ * Boston, MA 02111-1307, USA. */ -#include "gst-qa-pad-monitor.h" -#include "gst-qa-element-monitor.h" -#include "gst-qa-reporter.h" +#include "gst-validate-pad-monitor.h" +#include "gst-validate-element-monitor.h" +#include "gst-validate-reporter.h" #include #include #include /** - * SECTION:gst-qa-pad-monitor - * @short_description: Class that wraps a #GstPad for QA checks + * SECTION:gst-validate-pad-monitor + * @short_description: Class that wraps a #GstPad for Validate checks * * TODO */ -GST_DEBUG_CATEGORY_STATIC (gst_qa_pad_monitor_debug); -#define GST_CAT_DEFAULT gst_qa_pad_monitor_debug +GST_DEBUG_CATEGORY_STATIC (gst_validate_pad_monitor_debug); +#define GST_CAT_DEFAULT gst_validate_pad_monitor_debug #define _do_init \ - GST_DEBUG_CATEGORY_INIT (gst_qa_pad_monitor_debug, "qa_pad_monitor", 0, "QA PadMonitor"); -#define gst_qa_pad_monitor_parent_class parent_class -G_DEFINE_TYPE_WITH_CODE (GstQaPadMonitor, gst_qa_pad_monitor, - GST_TYPE_QA_MONITOR, _do_init); + GST_DEBUG_CATEGORY_INIT (gst_validate_pad_monitor_debug, "qa_pad_monitor", 0, "VALIDATE PadMonitor"); +#define gst_validate_pad_monitor_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstValidatePadMonitor, gst_validate_pad_monitor, + GST_TYPE_VALIDATE_MONITOR, _do_init); #define PAD_IS_IN_PUSH_MODE(p) ((p)->mode == GST_ACTIVATE_PUSH) #define PENDING_FIELDS "pending-fields" @@ -64,19 +64,19 @@ G_DEFINE_TYPE_WITH_CODE (GstQaPadMonitor, gst_qa_pad_monitor, * linked pads (sinkpad). But in this case it might lock and unlock freely without * causing deadlocks. */ -#define GST_QA_PAD_MONITOR_PARENT_LOCK(m) \ +#define GST_VALIDATE_PAD_MONITOR_PARENT_LOCK(m) \ G_STMT_START { \ - if (G_LIKELY (GST_QA_MONITOR_GET_PARENT (m))) { \ - GST_QA_MONITOR_LOCK (GST_QA_MONITOR_GET_PARENT (m)); \ + if (G_LIKELY (GST_VALIDATE_MONITOR_GET_PARENT (m))) { \ + GST_VALIDATE_MONITOR_LOCK (GST_VALIDATE_MONITOR_GET_PARENT (m)); \ } else { \ GST_WARNING_OBJECT (m, "No parent found, can't lock"); \ } \ } G_STMT_END -#define GST_QA_PAD_MONITOR_PARENT_UNLOCK(m) \ +#define GST_VALIDATE_PAD_MONITOR_PARENT_UNLOCK(m) \ G_STMT_START { \ - if (G_LIKELY (GST_QA_MONITOR_GET_PARENT (m))) { \ - GST_QA_MONITOR_UNLOCK (GST_QA_MONITOR_GET_PARENT (m)); \ + if (G_LIKELY (GST_VALIDATE_MONITOR_GET_PARENT (m))) { \ + GST_VALIDATE_MONITOR_UNLOCK (GST_VALIDATE_MONITOR_GET_PARENT (m)); \ } else { \ GST_WARNING_OBJECT (m, "No parent found, can't unlock"); \ } \ @@ -95,8 +95,10 @@ _serialized_event_data_free (SerializedEventData * serialized_event) g_slice_free (SerializedEventData, serialized_event); } -static gboolean gst_qa_pad_monitor_do_setup (GstQaMonitor * monitor); -static GstElement *gst_qa_pad_monitor_get_element (GstQaMonitor * monitor); +static gboolean gst_validate_pad_monitor_do_setup (GstValidateMonitor * + monitor); +static GstElement *gst_validate_pad_monitor_get_element (GstValidateMonitor * + monitor); /* This was copied from gstpad.c and might need * updating whenever it changes in core */ @@ -148,7 +150,7 @@ _structure_is_raw_audio (GstStructure * structure) static void -_check_field_type (GstQaPadMonitor * monitor, GstStructure * structure, +_check_field_type (GstValidatePadMonitor * monitor, GstStructure * structure, const gchar * field, ...) { va_list var_args; @@ -158,8 +160,8 @@ _check_field_type (GstQaPadMonitor * monitor, GstStructure * structure, gint rejected_types_index = 0; if (!gst_structure_has_field (structure, field)) { - GST_QA_REPORT (monitor, - GST_QA_ISSUE_ID_CAPS_IS_MISSING_FIELD, + GST_VALIDATE_REPORT (monitor, + GST_VALIDATE_ISSUE_ID_CAPS_IS_MISSING_FIELD, "Field '%s' is missing from structure: %" GST_PTR_FORMAT, field, structure); return; @@ -177,8 +179,8 @@ _check_field_type (GstQaPadMonitor * monitor, GstStructure * structure, va_end (var_args); joined_types = g_strjoinv (" / ", (gchar **) rejected_types); - GST_QA_REPORT (monitor, - GST_QA_ISSUE_ID_CAPS_FIELD_HAS_BAD_TYPE, + GST_VALIDATE_REPORT (monitor, + GST_VALIDATE_ISSUE_ID_CAPS_FIELD_HAS_BAD_TYPE, "Field '%s' has wrong type %s in structure '%" GST_PTR_FORMAT "'. Expected: %s", field, g_type_name (gst_structure_get_field_type (structure, field)), @@ -187,8 +189,8 @@ _check_field_type (GstQaPadMonitor * monitor, GstStructure * structure, } static void -gst_qa_pad_monitor_check_raw_video_caps_complete (GstQaPadMonitor * monitor, - GstStructure * structure) +gst_validate_pad_monitor_check_raw_video_caps_complete (GstValidatePadMonitor * + monitor, GstStructure * structure) { _check_field_type (monitor, structure, "width", G_TYPE_INT, GST_TYPE_INT_RANGE, 0); @@ -214,8 +216,8 @@ gst_qa_pad_monitor_check_raw_video_caps_complete (GstQaPadMonitor * monitor, } static void -gst_qa_pad_monitor_check_raw_audio_caps_complete (GstQaPadMonitor * monitor, - GstStructure * structure) +gst_validate_pad_monitor_check_raw_audio_caps_complete (GstValidatePadMonitor * + monitor, GstStructure * structure) { _check_field_type (monitor, structure, "rate", G_TYPE_INT, GST_TYPE_LIST, GST_TYPE_INT_RANGE, 0); @@ -228,7 +230,7 @@ gst_qa_pad_monitor_check_raw_audio_caps_complete (GstQaPadMonitor * monitor, } static void -gst_qa_pad_monitor_check_caps_complete (GstQaPadMonitor * monitor, +gst_validate_pad_monitor_check_caps_complete (GstValidatePadMonitor * monitor, GstCaps * caps) { GstStructure *structure; @@ -238,16 +240,18 @@ gst_qa_pad_monitor_check_caps_complete (GstQaPadMonitor * monitor, structure = gst_caps_get_structure (caps, i); if (_structure_is_raw_video (structure)) { - gst_qa_pad_monitor_check_raw_video_caps_complete (monitor, structure); + gst_validate_pad_monitor_check_raw_video_caps_complete (monitor, + structure); } else if (_structure_is_raw_audio (structure)) { - gst_qa_pad_monitor_check_raw_audio_caps_complete (monitor, structure); + gst_validate_pad_monitor_check_raw_audio_caps_complete (monitor, + structure); } } } static GstCaps * -gst_qa_pad_monitor_get_othercaps (GstQaPadMonitor * monitor) +gst_validate_pad_monitor_get_othercaps (GstValidatePadMonitor * monitor) { GstCaps *caps = gst_caps_new_empty (); GstIterator *iter; @@ -255,7 +259,9 @@ gst_qa_pad_monitor_get_othercaps (GstQaPadMonitor * monitor) GstPad *otherpad; GstCaps *peercaps; - iter = gst_pad_iterate_internal_links (GST_QA_PAD_MONITOR_GET_PAD (monitor)); + iter = + gst_pad_iterate_internal_links (GST_VALIDATE_PAD_MONITOR_GET_PAD + (monitor)); done = FALSE; while (!done) { switch (gst_iterator_next (iter, (gpointer *) & otherpad)) { @@ -307,12 +313,13 @@ _structure_is_audio (GstStructure * structure) } static gboolean -gst_qa_pad_monitor_pad_should_proxy_othercaps (GstQaPadMonitor * monitor) +gst_validate_pad_monitor_pad_should_proxy_othercaps (GstValidatePadMonitor * + monitor) { - GstQaMonitor *parent = GST_QA_MONITOR_GET_PARENT (monitor); + GstValidateMonitor *parent = GST_VALIDATE_MONITOR_GET_PARENT (monitor); /* We only know how to handle othercaps checks for codecs so far */ - return GST_QA_ELEMENT_MONITOR_ELEMENT_IS_DECODER (parent) || - GST_QA_ELEMENT_MONITOR_ELEMENT_IS_ENCODER (parent); + return GST_VALIDATE_ELEMENT_MONITOR_ELEMENT_IS_DECODER (parent) || + GST_VALIDATE_ELEMENT_MONITOR_ELEMENT_IS_ENCODER (parent); } @@ -394,18 +401,18 @@ _structures_field_is_contained (GstStructure * s1, GstStructure * s2, } static void -gst_qa_pad_monitor_check_caps_fields_proxied (GstQaPadMonitor * monitor, - GstCaps * caps) +gst_validate_pad_monitor_check_caps_fields_proxied (GstValidatePadMonitor * + monitor, GstCaps * caps) { GstStructure *structure; GstStructure *otherstructure; GstCaps *othercaps; gint i, j; - if (!gst_qa_pad_monitor_pad_should_proxy_othercaps (monitor)) + if (!gst_validate_pad_monitor_pad_should_proxy_othercaps (monitor)) return; - othercaps = gst_qa_pad_monitor_get_othercaps (monitor); + othercaps = gst_validate_pad_monitor_get_othercaps (monitor); for (i = 0; i < gst_caps_get_size (othercaps); i++) { gboolean found = FALSE; @@ -448,7 +455,8 @@ gst_qa_pad_monitor_check_caps_fields_proxied (GstQaPadMonitor * monitor, } if (type_match && !found) { - GST_QA_REPORT (monitor, GST_QA_ISSUE_ID_GET_CAPS_NOT_PROXYING_FIELDS, + GST_VALIDATE_REPORT (monitor, + GST_VALIDATE_ISSUE_ID_GET_CAPS_NOT_PROXYING_FIELDS, "Peer pad structure '%" GST_PTR_FORMAT "' has no similar version " "on pad's caps '%" GST_PTR_FORMAT "'", otherstructure, caps); } @@ -456,8 +464,8 @@ gst_qa_pad_monitor_check_caps_fields_proxied (GstQaPadMonitor * monitor, } static void -gst_qa_pad_monitor_check_late_serialized_events (GstQaPadMonitor * monitor, - GstClockTime ts) +gst_validate_pad_monitor_check_late_serialized_events (GstValidatePadMonitor * + monitor, GstClockTime ts) { gint i; if (!GST_CLOCK_TIME_IS_VALID (ts)) @@ -467,12 +475,12 @@ gst_qa_pad_monitor_check_late_serialized_events (GstQaPadMonitor * monitor, SerializedEventData *data = g_ptr_array_index (monitor->serialized_events, i); if (data->timestamp < ts) { - GST_QA_REPORT (monitor, - GST_QA_ISSUE_ID_SERIALIZED_EVENT_WASNT_PUSHED_IN_TIME, + GST_VALIDATE_REPORT (monitor, + GST_VALIDATE_ISSUE_ID_SERIALIZED_EVENT_WASNT_PUSHED_IN_TIME, "Serialized event %" GST_PTR_FORMAT " wasn't pushed before expected " "timestamp %" GST_TIME_FORMAT " on pad %s:%s", data->event, GST_TIME_ARGS (data->timestamp), - GST_DEBUG_PAD_NAME (GST_QA_PAD_MONITOR_GET_PAD (monitor))); + GST_DEBUG_PAD_NAME (GST_VALIDATE_PAD_MONITOR_GET_PAD (monitor))); } else { /* events should be ordered by ts */ break; @@ -484,17 +492,18 @@ gst_qa_pad_monitor_check_late_serialized_events (GstQaPadMonitor * monitor, } void -_parent_set_cb (GstObject * object, GstObject * parent, GstQaMonitor * monitor) +_parent_set_cb (GstObject * object, GstObject * parent, + GstValidateMonitor * monitor) { - gst_qa_reporter_set_name (GST_QA_REPORTER (monitor), g_strdup_printf ("%s:%s", - GST_DEBUG_PAD_NAME (object))); + gst_validate_reporter_set_name (GST_VALIDATE_REPORTER (monitor), + g_strdup_printf ("%s:%s", GST_DEBUG_PAD_NAME (object))); } static void -gst_qa_pad_monitor_dispose (GObject * object) +gst_validate_pad_monitor_dispose (GObject * object) { - GstQaPadMonitor *monitor = GST_QA_PAD_MONITOR_CAST (object); - GstPad *pad = GST_QA_PAD_MONITOR_GET_PAD (monitor); + GstValidatePadMonitor *monitor = GST_VALIDATE_PAD_MONITOR_CAST (object); + GstPad *pad = GST_VALIDATE_PAD_MONITOR_GET_PAD (monitor); if (pad) { if (monitor->buffer_probe_id) @@ -516,22 +525,22 @@ gst_qa_pad_monitor_dispose (GObject * object) } static void -gst_qa_pad_monitor_class_init (GstQaPadMonitorClass * klass) +gst_validate_pad_monitor_class_init (GstValidatePadMonitorClass * klass) { GObjectClass *gobject_class; - GstQaMonitorClass *monitor_klass; + GstValidateMonitorClass *monitor_klass; gobject_class = G_OBJECT_CLASS (klass); - monitor_klass = GST_QA_MONITOR_CLASS (klass); + monitor_klass = GST_VALIDATE_MONITOR_CLASS (klass); - gobject_class->dispose = gst_qa_pad_monitor_dispose; + gobject_class->dispose = gst_validate_pad_monitor_dispose; - monitor_klass->setup = gst_qa_pad_monitor_do_setup; - monitor_klass->get_element = gst_qa_pad_monitor_get_element; + monitor_klass->setup = gst_validate_pad_monitor_do_setup; + monitor_klass->get_element = gst_validate_pad_monitor_get_element; } static void -gst_qa_pad_monitor_init (GstQaPadMonitor * pad_monitor) +gst_validate_pad_monitor_init (GstValidatePadMonitor * pad_monitor) { pad_monitor->pending_setcaps_fields = gst_structure_empty_new (PENDING_FIELDS); @@ -546,18 +555,18 @@ gst_qa_pad_monitor_init (GstQaPadMonitor * pad_monitor) } /** - * gst_qa_pad_monitor_new: - * @pad: (transfer-none): a #GstPad to run QA on + * gst_validate_pad_monitor_new: + * @pad: (transfer-none): a #GstPad to run Validate on */ -GstQaPadMonitor * -gst_qa_pad_monitor_new (GstPad * pad, GstQaRunner * runner, - GstQaElementMonitor * parent) +GstValidatePadMonitor * +gst_validate_pad_monitor_new (GstPad * pad, GstValidateRunner * runner, + GstValidateElementMonitor * parent) { - GstQaPadMonitor *monitor = g_object_new (GST_TYPE_QA_PAD_MONITOR, + GstValidatePadMonitor *monitor = g_object_new (GST_TYPE_VALIDATE_PAD_MONITOR, "object", pad, "qa-runner", runner, "qa-parent", parent, NULL); - if (GST_QA_PAD_MONITOR_GET_PAD (monitor) == NULL) { + if (GST_VALIDATE_PAD_MONITOR_GET_PAD (monitor) == NULL) { g_object_unref (monitor); return NULL; } @@ -565,125 +574,125 @@ gst_qa_pad_monitor_new (GstPad * pad, GstQaRunner * runner, } static GstElement * -gst_qa_pad_monitor_get_element (GstQaMonitor * monitor) +gst_validate_pad_monitor_get_element (GstValidateMonitor * monitor) { - GstPad *pad = GST_QA_PAD_MONITOR_GET_PAD (monitor); + GstPad *pad = GST_VALIDATE_PAD_MONITOR_GET_PAD (monitor); return GST_PAD_PARENT (pad); } static void -gst_qa_pad_monitor_event_overrides (GstQaPadMonitor * pad_monitor, +gst_validate_pad_monitor_event_overrides (GstValidatePadMonitor * pad_monitor, GstEvent * event) { GList *iter; - GST_QA_MONITOR_OVERRIDES_LOCK (pad_monitor); - for (iter = GST_QA_MONITOR_OVERRIDES (pad_monitor).head; iter; + GST_VALIDATE_MONITOR_OVERRIDES_LOCK (pad_monitor); + for (iter = GST_VALIDATE_MONITOR_OVERRIDES (pad_monitor).head; iter; iter = g_list_next (iter)) { - GstQaOverride *override = iter->data; + GstValidateOverride *override = iter->data; - gst_qa_override_event_handler (override, GST_QA_MONITOR_CAST (pad_monitor), - event); + gst_validate_override_event_handler (override, + GST_VALIDATE_MONITOR_CAST (pad_monitor), event); } - GST_QA_MONITOR_OVERRIDES_UNLOCK (pad_monitor); + GST_VALIDATE_MONITOR_OVERRIDES_UNLOCK (pad_monitor); } static void -gst_qa_pad_monitor_buffer_overrides (GstQaPadMonitor * pad_monitor, +gst_validate_pad_monitor_buffer_overrides (GstValidatePadMonitor * pad_monitor, GstBuffer * buffer) { GList *iter; - GST_QA_MONITOR_OVERRIDES_LOCK (pad_monitor); - for (iter = GST_QA_MONITOR_OVERRIDES (pad_monitor).head; iter; + GST_VALIDATE_MONITOR_OVERRIDES_LOCK (pad_monitor); + for (iter = GST_VALIDATE_MONITOR_OVERRIDES (pad_monitor).head; iter; iter = g_list_next (iter)) { - GstQaOverride *override = iter->data; + GstValidateOverride *override = iter->data; - gst_qa_override_buffer_handler (override, GST_QA_MONITOR_CAST (pad_monitor), - buffer); + gst_validate_override_buffer_handler (override, + GST_VALIDATE_MONITOR_CAST (pad_monitor), buffer); } - GST_QA_MONITOR_OVERRIDES_UNLOCK (pad_monitor); + GST_VALIDATE_MONITOR_OVERRIDES_UNLOCK (pad_monitor); } static void -gst_qa_pad_monitor_buffer_probe_overrides (GstQaPadMonitor * pad_monitor, - GstBuffer * buffer) +gst_validate_pad_monitor_buffer_probe_overrides (GstValidatePadMonitor * + pad_monitor, GstBuffer * buffer) { GList *iter; - GST_QA_MONITOR_OVERRIDES_LOCK (pad_monitor); - for (iter = GST_QA_MONITOR_OVERRIDES (pad_monitor).head; iter; + GST_VALIDATE_MONITOR_OVERRIDES_LOCK (pad_monitor); + for (iter = GST_VALIDATE_MONITOR_OVERRIDES (pad_monitor).head; iter; iter = g_list_next (iter)) { - GstQaOverride *override = iter->data; + GstValidateOverride *override = iter->data; - gst_qa_override_buffer_probe_handler (override, - GST_QA_MONITOR_CAST (pad_monitor), buffer); + gst_validate_override_buffer_probe_handler (override, + GST_VALIDATE_MONITOR_CAST (pad_monitor), buffer); } - GST_QA_MONITOR_OVERRIDES_UNLOCK (pad_monitor); + GST_VALIDATE_MONITOR_OVERRIDES_UNLOCK (pad_monitor); } static void -gst_qa_pad_monitor_query_overrides (GstQaPadMonitor * pad_monitor, +gst_validate_pad_monitor_query_overrides (GstValidatePadMonitor * pad_monitor, GstQuery * query) { GList *iter; - GST_QA_MONITOR_OVERRIDES_LOCK (pad_monitor); - for (iter = GST_QA_MONITOR_OVERRIDES (pad_monitor).head; iter; + GST_VALIDATE_MONITOR_OVERRIDES_LOCK (pad_monitor); + for (iter = GST_VALIDATE_MONITOR_OVERRIDES (pad_monitor).head; iter; iter = g_list_next (iter)) { - GstQaOverride *override = iter->data; + GstValidateOverride *override = iter->data; - gst_qa_override_query_handler (override, GST_QA_MONITOR_CAST (pad_monitor), - query); + gst_validate_override_query_handler (override, + GST_VALIDATE_MONITOR_CAST (pad_monitor), query); } - GST_QA_MONITOR_OVERRIDES_UNLOCK (pad_monitor); + GST_VALIDATE_MONITOR_OVERRIDES_UNLOCK (pad_monitor); } static void -gst_qa_pad_monitor_getcaps_overrides (GstQaPadMonitor * pad_monitor, +gst_validate_pad_monitor_getcaps_overrides (GstValidatePadMonitor * pad_monitor, GstCaps * caps) { GList *iter; - GST_QA_MONITOR_OVERRIDES_LOCK (pad_monitor); - for (iter = GST_QA_MONITOR_OVERRIDES (pad_monitor).head; iter; + GST_VALIDATE_MONITOR_OVERRIDES_LOCK (pad_monitor); + for (iter = GST_VALIDATE_MONITOR_OVERRIDES (pad_monitor).head; iter; iter = g_list_next (iter)) { - GstQaOverride *override = iter->data; + GstValidateOverride *override = iter->data; - gst_qa_override_getcaps_handler (override, - GST_QA_MONITOR_CAST (pad_monitor), caps); + gst_validate_override_getcaps_handler (override, + GST_VALIDATE_MONITOR_CAST (pad_monitor), caps); } - GST_QA_MONITOR_OVERRIDES_UNLOCK (pad_monitor); + GST_VALIDATE_MONITOR_OVERRIDES_UNLOCK (pad_monitor); } static void -gst_qa_pad_monitor_setcaps_overrides (GstQaPadMonitor * pad_monitor, +gst_validate_pad_monitor_setcaps_overrides (GstValidatePadMonitor * pad_monitor, GstCaps * caps) { GList *iter; - GST_QA_MONITOR_OVERRIDES_LOCK (pad_monitor); - for (iter = GST_QA_MONITOR_OVERRIDES (pad_monitor).head; iter; + GST_VALIDATE_MONITOR_OVERRIDES_LOCK (pad_monitor); + for (iter = GST_VALIDATE_MONITOR_OVERRIDES (pad_monitor).head; iter; iter = g_list_next (iter)) { - GstQaOverride *override = iter->data; + GstValidateOverride *override = iter->data; - gst_qa_override_setcaps_handler (override, - GST_QA_MONITOR_CAST (pad_monitor), caps); + gst_validate_override_setcaps_handler (override, + GST_VALIDATE_MONITOR_CAST (pad_monitor), caps); } - GST_QA_MONITOR_OVERRIDES_UNLOCK (pad_monitor); + GST_VALIDATE_MONITOR_OVERRIDES_UNLOCK (pad_monitor); } static gboolean -gst_qa_pad_monitor_timestamp_is_in_received_range (GstQaPadMonitor * monitor, - GstClockTime ts) +gst_validate_pad_monitor_timestamp_is_in_received_range (GstValidatePadMonitor * + monitor, GstClockTime ts) { GST_DEBUG_OBJECT (monitor, "Checking if timestamp %" GST_TIME_FORMAT " is in range: %" GST_TIME_FORMAT " - %" GST_TIME_FORMAT " for pad " "%s:%s", GST_TIME_ARGS (ts), GST_TIME_ARGS (monitor->timestamp_range_start), GST_TIME_ARGS (monitor->timestamp_range_end), - GST_DEBUG_PAD_NAME (GST_QA_PAD_MONITOR_GET_PAD (monitor))); + GST_DEBUG_PAD_NAME (GST_VALIDATE_PAD_MONITOR_GET_PAD (monitor))); return !GST_CLOCK_TIME_IS_VALID (monitor->timestamp_range_start) || !GST_CLOCK_TIME_IS_VALID (monitor->timestamp_range_end) || (monitor->timestamp_range_start <= ts @@ -693,8 +702,8 @@ gst_qa_pad_monitor_timestamp_is_in_received_range (GstQaPadMonitor * monitor, /* Iterates over internal links (sinkpads) to check that this buffer has * a timestamp that is in the range of the lastly received buffers */ static void -gst_qa_pad_monitor_check_buffer_timestamp_in_received_range (GstQaPadMonitor * - monitor, GstBuffer * buffer) + gst_validate_pad_monitor_check_buffer_timestamp_in_received_range + (GstValidatePadMonitor * monitor, GstBuffer * buffer) { GstClockTime ts; GstClockTime ts_end; @@ -703,7 +712,7 @@ gst_qa_pad_monitor_check_buffer_timestamp_in_received_range (GstQaPadMonitor * gboolean found = FALSE; gboolean done; GstPad *otherpad; - GstQaPadMonitor *othermonitor; + GstValidatePadMonitor *othermonitor; if (!GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (buffer)) || !GST_CLOCK_TIME_IS_VALID (GST_BUFFER_DURATION (buffer))) { @@ -715,7 +724,9 @@ gst_qa_pad_monitor_check_buffer_timestamp_in_received_range (GstQaPadMonitor * ts = GST_BUFFER_TIMESTAMP (buffer); ts_end = ts + GST_BUFFER_DURATION (buffer); - iter = gst_pad_iterate_internal_links (GST_QA_PAD_MONITOR_GET_PAD (monitor)); + iter = + gst_pad_iterate_internal_links (GST_VALIDATE_PAD_MONITOR_GET_PAD + (monitor)); done = FALSE; while (!done) { switch (gst_iterator_next (iter, (gpointer *) & otherpad)) { @@ -723,14 +734,16 @@ gst_qa_pad_monitor_check_buffer_timestamp_in_received_range (GstQaPadMonitor * GST_DEBUG_OBJECT (monitor, "Checking pad %s:%s input timestamps", GST_DEBUG_PAD_NAME (otherpad)); othermonitor = g_object_get_data ((GObject *) otherpad, "qa-monitor"); - GST_QA_MONITOR_LOCK (othermonitor); - if (gst_qa_pad_monitor_timestamp_is_in_received_range (othermonitor, ts) - && gst_qa_pad_monitor_timestamp_is_in_received_range (othermonitor, - ts_end)) { + GST_VALIDATE_MONITOR_LOCK (othermonitor); + if (gst_validate_pad_monitor_timestamp_is_in_received_range + (othermonitor, ts) + && + gst_validate_pad_monitor_timestamp_is_in_received_range + (othermonitor, ts_end)) { done = TRUE; found = TRUE; } - GST_QA_MONITOR_UNLOCK (othermonitor); + GST_VALIDATE_MONITOR_UNLOCK (othermonitor); gst_object_unref (otherpad); has_one = TRUE; break; @@ -756,8 +769,8 @@ gst_qa_pad_monitor_check_buffer_timestamp_in_received_range (GstQaPadMonitor * return; } if (!found) { - GST_QA_REPORT (monitor, - GST_QA_ISSUE_ID_BUFFER_TIMESTAMP_OUT_OF_RECEIVED_RANGE, + GST_VALIDATE_REPORT (monitor, + GST_VALIDATE_ISSUE_ID_BUFFER_TIMESTAMP_OUT_OF_RECEIVED_RANGE, "Timestamp %" GST_TIME_FORMAT " - %" GST_TIME_FORMAT " is out of range of received input", GST_TIME_ARGS (ts), GST_TIME_ARGS (ts_end)); @@ -765,24 +778,25 @@ gst_qa_pad_monitor_check_buffer_timestamp_in_received_range (GstQaPadMonitor * } static void -gst_qa_pad_monitor_check_first_buffer (GstQaPadMonitor * pad_monitor, - GstBuffer * buffer) +gst_validate_pad_monitor_check_first_buffer (GstValidatePadMonitor * + pad_monitor, GstBuffer * buffer) { if (G_UNLIKELY (pad_monitor->first_buffer)) { pad_monitor->first_buffer = FALSE; if (!pad_monitor->has_segment - && PAD_IS_IN_PUSH_MODE (GST_QA_PAD_MONITOR_GET_PAD (pad_monitor))) { - GST_QA_REPORT (pad_monitor, - GST_QA_ISSUE_ID_BUFFER_BEFORE_SEGMENT, + && PAD_IS_IN_PUSH_MODE (GST_VALIDATE_PAD_MONITOR_GET_PAD (pad_monitor))) + { + GST_VALIDATE_REPORT (pad_monitor, + GST_VALIDATE_ISSUE_ID_BUFFER_BEFORE_SEGMENT, "Received buffer before Segment event"); } if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (buffer))) { gint64 running_time = gst_segment_to_running_time (&pad_monitor->segment, pad_monitor->segment.format, GST_BUFFER_TIMESTAMP (buffer)); if (running_time != 0) { - GST_QA_REPORT (pad_monitor, - GST_QA_ISSUE_ID_FIRST_BUFFER_RUNNING_TIME_IS_NOT_ZERO, + GST_VALIDATE_REPORT (pad_monitor, + GST_VALIDATE_ISSUE_ID_FIRST_BUFFER_RUNNING_TIME_IS_NOT_ZERO, "First buffer running time is not 0, it is: %" GST_TIME_FORMAT, GST_TIME_ARGS (running_time)); } @@ -791,8 +805,8 @@ gst_qa_pad_monitor_check_first_buffer (GstQaPadMonitor * pad_monitor, } static void -gst_qa_pad_monitor_update_buffer_data (GstQaPadMonitor * pad_monitor, - GstBuffer * buffer) +gst_validate_pad_monitor_update_buffer_data (GstValidatePadMonitor * + pad_monitor, GstBuffer * buffer) { pad_monitor->current_timestamp = GST_BUFFER_TIMESTAMP (buffer); pad_monitor->current_duration = GST_BUFFER_DURATION (buffer); @@ -837,18 +851,20 @@ _combine_flows (GstFlowReturn ret1, GstFlowReturn ret2) } static void -gst_qa_pad_monitor_check_aggregated_return (GstQaPadMonitor * monitor, - GstFlowReturn ret) +gst_validate_pad_monitor_check_aggregated_return (GstValidatePadMonitor * + monitor, GstFlowReturn ret) { GstIterator *iter; gboolean done; GstPad *otherpad; GstPad *peerpad; - GstQaPadMonitor *othermonitor; + GstValidatePadMonitor *othermonitor; GstFlowReturn aggregated = GST_FLOW_NOT_LINKED; gboolean found_a_pad = FALSE; - iter = gst_pad_iterate_internal_links (GST_QA_PAD_MONITOR_GET_PAD (monitor)); + iter = + gst_pad_iterate_internal_links (GST_VALIDATE_PAD_MONITOR_GET_PAD + (monitor)); done = FALSE; while (!done) { switch (gst_iterator_next (iter, (gpointer *) & otherpad)) { @@ -858,10 +874,10 @@ gst_qa_pad_monitor_check_aggregated_return (GstQaPadMonitor * monitor, othermonitor = g_object_get_data ((GObject *) peerpad, "qa-monitor"); if (othermonitor) { found_a_pad = TRUE; - GST_QA_MONITOR_LOCK (othermonitor); + GST_VALIDATE_MONITOR_LOCK (othermonitor); aggregated = _combine_flows (aggregated, othermonitor->last_flow_return); - GST_QA_MONITOR_UNLOCK (othermonitor); + GST_VALIDATE_MONITOR_UNLOCK (othermonitor); } gst_object_unref (peerpad); @@ -890,7 +906,7 @@ gst_qa_pad_monitor_check_aggregated_return (GstQaPadMonitor * monitor, return; } if (aggregated != ret) { - GST_QA_REPORT (monitor, GST_QA_ISSUE_ID_WRONG_FLOW_RETURN, + GST_VALIDATE_REPORT (monitor, GST_VALIDATE_ISSUE_ID_WRONG_FLOW_RETURN, "Wrong combined flow return %s(%d). Expected: %s(%d)", gst_flow_get_name (ret), ret, gst_flow_get_name (aggregated), aggregated); @@ -898,18 +914,20 @@ gst_qa_pad_monitor_check_aggregated_return (GstQaPadMonitor * monitor, } static void -gst_qa_pad_monitor_otherpad_add_pending_serialized_event (GstQaPadMonitor * - monitor, GstEvent * event, GstClockTime last_ts) + gst_validate_pad_monitor_otherpad_add_pending_serialized_event + (GstValidatePadMonitor * monitor, GstEvent * event, GstClockTime last_ts) { GstIterator *iter; gboolean done; GstPad *otherpad; - GstQaPadMonitor *othermonitor; + GstValidatePadMonitor *othermonitor; if (!GST_EVENT_IS_SERIALIZED (event)) return; - iter = gst_pad_iterate_internal_links (GST_QA_PAD_MONITOR_GET_PAD (monitor)); + iter = + gst_pad_iterate_internal_links (GST_VALIDATE_PAD_MONITOR_GET_PAD + (monitor)); done = FALSE; while (!done) { switch (gst_iterator_next (iter, (gpointer *) & otherpad)) { @@ -919,9 +937,9 @@ gst_qa_pad_monitor_otherpad_add_pending_serialized_event (GstQaPadMonitor * SerializedEventData *data = g_slice_new0 (SerializedEventData); data->timestamp = last_ts; data->event = gst_event_ref (event); - GST_QA_MONITOR_LOCK (othermonitor); + GST_VALIDATE_MONITOR_LOCK (othermonitor); g_ptr_array_add (othermonitor->serialized_events, data); - GST_QA_MONITOR_UNLOCK (othermonitor); + GST_VALIDATE_MONITOR_UNLOCK (othermonitor); } break; case GST_ITERATOR_RESYNC: @@ -940,13 +958,13 @@ gst_qa_pad_monitor_otherpad_add_pending_serialized_event (GstQaPadMonitor * } static void -gst_qa_pad_monitor_otherpad_add_pending_field (GstQaPadMonitor * monitor, - GstStructure * structure, const gchar * field) +gst_validate_pad_monitor_otherpad_add_pending_field (GstValidatePadMonitor * + monitor, GstStructure * structure, const gchar * field) { GstIterator *iter; gboolean done; GstPad *otherpad; - GstQaPadMonitor *othermonitor; + GstValidatePadMonitor *othermonitor; const GValue *v; v = gst_structure_get_value (structure, field); @@ -956,18 +974,20 @@ gst_qa_pad_monitor_otherpad_add_pending_field (GstQaPadMonitor * monitor, return; } - iter = gst_pad_iterate_internal_links (GST_QA_PAD_MONITOR_GET_PAD (monitor)); + iter = + gst_pad_iterate_internal_links (GST_VALIDATE_PAD_MONITOR_GET_PAD + (monitor)); done = FALSE; while (!done) { switch (gst_iterator_next (iter, (gpointer *) & otherpad)) { case GST_ITERATOR_OK: othermonitor = g_object_get_data ((GObject *) otherpad, "qa-monitor"); if (othermonitor) { - GST_QA_MONITOR_LOCK (othermonitor); + GST_VALIDATE_MONITOR_LOCK (othermonitor); g_assert (othermonitor->pending_setcaps_fields != NULL); gst_structure_set_value (othermonitor->pending_setcaps_fields, field, v); - GST_QA_MONITOR_UNLOCK (othermonitor); + GST_VALIDATE_MONITOR_UNLOCK (othermonitor); } break; case GST_ITERATOR_RESYNC: @@ -986,26 +1006,29 @@ gst_qa_pad_monitor_otherpad_add_pending_field (GstQaPadMonitor * monitor, } static void -gst_qa_pad_monitor_otherpad_clear_pending_fields (GstQaPadMonitor * monitor) +gst_validate_pad_monitor_otherpad_clear_pending_fields (GstValidatePadMonitor * + monitor) { GstIterator *iter; gboolean done; GstPad *otherpad; - GstQaPadMonitor *othermonitor; + GstValidatePadMonitor *othermonitor; - iter = gst_pad_iterate_internal_links (GST_QA_PAD_MONITOR_GET_PAD (monitor)); + iter = + gst_pad_iterate_internal_links (GST_VALIDATE_PAD_MONITOR_GET_PAD + (monitor)); done = FALSE; while (!done) { switch (gst_iterator_next (iter, (gpointer *) & otherpad)) { case GST_ITERATOR_OK: othermonitor = g_object_get_data ((GObject *) otherpad, "qa-monitor"); if (othermonitor) { - GST_QA_MONITOR_LOCK (othermonitor); + GST_VALIDATE_MONITOR_LOCK (othermonitor); g_assert (othermonitor->pending_setcaps_fields != NULL); gst_structure_free (othermonitor->pending_setcaps_fields); othermonitor->pending_setcaps_fields = gst_structure_empty_new (PENDING_FIELDS); - GST_QA_MONITOR_UNLOCK (othermonitor); + GST_VALIDATE_MONITOR_UNLOCK (othermonitor); } break; case GST_ITERATOR_RESYNC: @@ -1024,28 +1047,30 @@ gst_qa_pad_monitor_otherpad_clear_pending_fields (GstQaPadMonitor * monitor) } static void -gst_qa_pad_monitor_add_expected_newsegment (GstQaPadMonitor * monitor, - GstEvent * event) +gst_validate_pad_monitor_add_expected_newsegment (GstValidatePadMonitor * + monitor, GstEvent * event) { GstIterator *iter; gboolean done; GstPad *otherpad; - GstQaPadMonitor *othermonitor; + GstValidatePadMonitor *othermonitor; - iter = gst_pad_iterate_internal_links (GST_QA_PAD_MONITOR_GET_PAD (monitor)); + iter = + gst_pad_iterate_internal_links (GST_VALIDATE_PAD_MONITOR_GET_PAD + (monitor)); done = FALSE; while (!done) { switch (gst_iterator_next (iter, (gpointer *) & otherpad)) { case GST_ITERATOR_OK: othermonitor = g_object_get_data ((GObject *) otherpad, "qa-monitor"); - GST_QA_MONITOR_LOCK (othermonitor); + GST_VALIDATE_MONITOR_LOCK (othermonitor); if (othermonitor->expected_segment) { - GST_QA_REPORT (othermonitor, - GST_QA_ISSUE_ID_EVENT_NEWSEGMENT_NOT_PUSHED, ""); + GST_VALIDATE_REPORT (othermonitor, + GST_VALIDATE_ISSUE_ID_EVENT_NEWSEGMENT_NOT_PUSHED, ""); gst_event_unref (othermonitor->expected_segment); } othermonitor->expected_segment = gst_event_ref (event); - GST_QA_MONITOR_UNLOCK (othermonitor); + GST_VALIDATE_MONITOR_UNLOCK (othermonitor); gst_object_unref (otherpad); break; case GST_ITERATOR_RESYNC: @@ -1065,8 +1090,8 @@ gst_qa_pad_monitor_add_expected_newsegment (GstQaPadMonitor * monitor, /* common checks for both sink and src event functions */ static void -gst_qa_pad_monitor_common_event_check (GstQaPadMonitor * pad_monitor, - GstEvent * event) +gst_validate_pad_monitor_common_event_check (GstValidatePadMonitor * + pad_monitor, GstEvent * event) { guint32 seqnum = gst_event_get_seqnum (event); @@ -1077,8 +1102,8 @@ gst_qa_pad_monitor_common_event_check (GstQaPadMonitor * pad_monitor, if (seqnum == pad_monitor->pending_flush_start_seqnum) { pad_monitor->pending_flush_start_seqnum = 0; } else { - GST_QA_REPORT (pad_monitor, - GST_QA_ISSUE_ID_EVENT_HAS_WRONG_SEQNUM, + GST_VALIDATE_REPORT (pad_monitor, + GST_VALIDATE_ISSUE_ID_EVENT_HAS_WRONG_SEQNUM, "The expected flush-start seqnum should be the same as the " "one from the event that caused it (probably a seek). Got: %u." " Expected: %u", seqnum, pad_monitor->pending_flush_start_seqnum); @@ -1086,8 +1111,8 @@ gst_qa_pad_monitor_common_event_check (GstQaPadMonitor * pad_monitor, } if (pad_monitor->pending_flush_stop) { - GST_QA_REPORT (pad_monitor, - GST_QA_ISSUE_ID_EVENT_FLUSH_START_UNEXPECTED, + GST_VALIDATE_REPORT (pad_monitor, + GST_VALIDATE_ISSUE_ID_EVENT_FLUSH_START_UNEXPECTED, "Received flush-start from %" GST_PTR_FORMAT " when flush-stop was expected", GST_EVENT_SRC (event)); } @@ -1100,8 +1125,8 @@ gst_qa_pad_monitor_common_event_check (GstQaPadMonitor * pad_monitor, if (seqnum == pad_monitor->pending_flush_stop_seqnum) { pad_monitor->pending_flush_stop_seqnum = 0; } else { - GST_QA_REPORT (pad_monitor, - GST_QA_ISSUE_ID_EVENT_HAS_WRONG_SEQNUM, + GST_VALIDATE_REPORT (pad_monitor, + GST_VALIDATE_ISSUE_ID_EVENT_HAS_WRONG_SEQNUM, "The expected flush-stop seqnum should be the same as the " "one from the event that caused it (probably a seek). Got: %u." " Expected: %u", seqnum, pad_monitor->pending_flush_stop_seqnum); @@ -1109,8 +1134,8 @@ gst_qa_pad_monitor_common_event_check (GstQaPadMonitor * pad_monitor, } if (!pad_monitor->pending_flush_stop) { - GST_QA_REPORT (pad_monitor, - GST_QA_ISSUE_ID_EVENT_FLUSH_STOP_UNEXPECTED, + GST_VALIDATE_REPORT (pad_monitor, + GST_VALIDATE_ISSUE_ID_EVENT_FLUSH_STOP_UNEXPECTED, "Unexpected flush-stop %p from %" GST_PTR_FORMAT, event, GST_EVENT_SRC (event)); } @@ -1123,7 +1148,7 @@ gst_qa_pad_monitor_common_event_check (GstQaPadMonitor * pad_monitor, } static gboolean -gst_qa_pad_monitor_sink_event_check (GstQaPadMonitor * pad_monitor, +gst_validate_pad_monitor_sink_event_check (GstValidatePadMonitor * pad_monitor, GstEvent * event, GstPadEventFunction handler) { gboolean ret = TRUE; @@ -1132,9 +1157,9 @@ gst_qa_pad_monitor_sink_event_check (GstQaPadMonitor * pad_monitor, GstFormat format; gint64 start, stop, position; guint32 seqnum = gst_event_get_seqnum (event); - GstPad *pad = GST_QA_PAD_MONITOR_GET_PAD (pad_monitor); + GstPad *pad = GST_VALIDATE_PAD_MONITOR_GET_PAD (pad_monitor); - gst_qa_pad_monitor_common_event_check (pad_monitor, event); + gst_validate_pad_monitor_common_event_check (pad_monitor, event); /* pre checks */ switch (GST_EVENT_TYPE (event)) { @@ -1153,7 +1178,7 @@ gst_qa_pad_monitor_sink_event_check (GstQaPadMonitor * pad_monitor, } if (GST_PAD_DIRECTION (pad) == GST_PAD_SINK) { - gst_qa_pad_monitor_add_expected_newsegment (pad_monitor, event); + gst_validate_pad_monitor_add_expected_newsegment (pad_monitor, event); } else { /* check if this segment is the expected one */ if (pad_monitor->expected_segment) { @@ -1172,8 +1197,8 @@ gst_qa_pad_monitor_sink_event_check (GstQaPadMonitor * pad_monitor, || (exp_rate * exp_applied_rate != rate * applied_rate) || exp_start != start || exp_stop != stop || exp_position != position) { - GST_QA_REPORT (pad_monitor, - GST_QA_ISSUE_ID_EVENT_NEW_SEGMENT_MISMATCH, + GST_VALIDATE_REPORT (pad_monitor, + GST_VALIDATE_ISSUE_ID_EVENT_NEW_SEGMENT_MISMATCH, "Expected segment didn't match received segment event"); } } @@ -1201,15 +1226,15 @@ gst_qa_pad_monitor_sink_event_check (GstQaPadMonitor * pad_monitor, break; } - GST_QA_MONITOR_UNLOCK (pad_monitor); - GST_QA_PAD_MONITOR_PARENT_UNLOCK (pad_monitor); - gst_qa_pad_monitor_event_overrides (pad_monitor, event); + GST_VALIDATE_MONITOR_UNLOCK (pad_monitor); + GST_VALIDATE_PAD_MONITOR_PARENT_UNLOCK (pad_monitor); + gst_validate_pad_monitor_event_overrides (pad_monitor, event); if (handler) { gst_event_ref (event); ret = pad_monitor->event_func (pad, event); } - GST_QA_PAD_MONITOR_PARENT_LOCK (pad_monitor); - GST_QA_MONITOR_LOCK (pad_monitor); + GST_VALIDATE_PAD_MONITOR_PARENT_LOCK (pad_monitor); + GST_VALIDATE_MONITOR_LOCK (pad_monitor); /* post checks */ switch (GST_EVENT_TYPE (event)) { @@ -1238,7 +1263,7 @@ gst_qa_pad_monitor_sink_event_check (GstQaPadMonitor * pad_monitor, } static gboolean -gst_qa_pad_monitor_src_event_check (GstQaPadMonitor * pad_monitor, +gst_validate_pad_monitor_src_event_check (GstValidatePadMonitor * pad_monitor, GstEvent * event, GstPadEventFunction handler) { gboolean ret = TRUE; @@ -1248,9 +1273,9 @@ gst_qa_pad_monitor_src_event_check (GstQaPadMonitor * pad_monitor, GstSeekFlags seek_flags; GstSeekType start_type, stop_type; guint32 seqnum = gst_event_get_seqnum (event); - GstPad *pad = GST_QA_PAD_MONITOR_GET_PAD (pad_monitor); + GstPad *pad = GST_VALIDATE_PAD_MONITOR_GET_PAD (pad_monitor); - gst_qa_pad_monitor_common_event_check (pad_monitor, event); + gst_validate_pad_monitor_common_event_check (pad_monitor, event); /* pre checks */ switch (GST_EVENT_TYPE (event)) { @@ -1282,10 +1307,10 @@ gst_qa_pad_monitor_src_event_check (GstQaPadMonitor * pad_monitor, } if (handler) { - GST_QA_MONITOR_UNLOCK (pad_monitor); + GST_VALIDATE_MONITOR_UNLOCK (pad_monitor); gst_event_ref (event); ret = pad_monitor->event_func (pad, event); - GST_QA_MONITOR_LOCK (pad_monitor); + GST_VALIDATE_MONITOR_LOCK (pad_monitor); } /* post checks */ @@ -1307,46 +1332,46 @@ gst_qa_pad_monitor_src_event_check (GstQaPadMonitor * pad_monitor, } static GstFlowReturn -gst_qa_pad_monitor_chain_func (GstPad * pad, GstBuffer * buffer) +gst_validate_pad_monitor_chain_func (GstPad * pad, GstBuffer * buffer) { - GstQaPadMonitor *pad_monitor = + GstValidatePadMonitor *pad_monitor = g_object_get_data ((GObject *) pad, "qa-monitor"); GstFlowReturn ret; - GST_QA_PAD_MONITOR_PARENT_LOCK (pad_monitor); - GST_QA_MONITOR_LOCK (pad_monitor); + GST_VALIDATE_PAD_MONITOR_PARENT_LOCK (pad_monitor); + GST_VALIDATE_MONITOR_LOCK (pad_monitor); - gst_qa_pad_monitor_check_first_buffer (pad_monitor, buffer); - gst_qa_pad_monitor_update_buffer_data (pad_monitor, buffer); + gst_validate_pad_monitor_check_first_buffer (pad_monitor, buffer); + gst_validate_pad_monitor_update_buffer_data (pad_monitor, buffer); - GST_QA_MONITOR_UNLOCK (pad_monitor); - GST_QA_PAD_MONITOR_PARENT_UNLOCK (pad_monitor); + GST_VALIDATE_MONITOR_UNLOCK (pad_monitor); + GST_VALIDATE_PAD_MONITOR_PARENT_UNLOCK (pad_monitor); - gst_qa_pad_monitor_buffer_overrides (pad_monitor, buffer); + gst_validate_pad_monitor_buffer_overrides (pad_monitor, buffer); ret = pad_monitor->chain_func (pad, buffer); - GST_QA_PAD_MONITOR_PARENT_LOCK (pad_monitor); - GST_QA_MONITOR_LOCK (pad_monitor); + GST_VALIDATE_PAD_MONITOR_PARENT_LOCK (pad_monitor); + GST_VALIDATE_MONITOR_LOCK (pad_monitor); pad_monitor->last_flow_return = ret; - gst_qa_pad_monitor_check_aggregated_return (pad_monitor, ret); + gst_validate_pad_monitor_check_aggregated_return (pad_monitor, ret); - GST_QA_MONITOR_UNLOCK (pad_monitor); - GST_QA_PAD_MONITOR_PARENT_UNLOCK (pad_monitor); + GST_VALIDATE_MONITOR_UNLOCK (pad_monitor); + GST_VALIDATE_PAD_MONITOR_PARENT_UNLOCK (pad_monitor); return ret; } static gboolean -gst_qa_pad_monitor_sink_event_func (GstPad * pad, GstEvent * event) +gst_validate_pad_monitor_sink_event_func (GstPad * pad, GstEvent * event) { - GstQaPadMonitor *pad_monitor = + GstValidatePadMonitor *pad_monitor = g_object_get_data ((GObject *) pad, "qa-monitor"); gboolean ret; - GST_QA_PAD_MONITOR_PARENT_LOCK (pad_monitor); - GST_QA_MONITOR_LOCK (pad_monitor); + GST_VALIDATE_PAD_MONITOR_PARENT_LOCK (pad_monitor); + GST_VALIDATE_MONITOR_LOCK (pad_monitor); if (GST_EVENT_IS_SERIALIZED (event)) { GstClockTime last_ts; @@ -1358,50 +1383,50 @@ gst_qa_pad_monitor_sink_event_func (GstPad * pad, GstEvent * event) } else { last_ts = 0; } - gst_qa_pad_monitor_otherpad_add_pending_serialized_event (pad_monitor, + gst_validate_pad_monitor_otherpad_add_pending_serialized_event (pad_monitor, event, last_ts); } - ret = gst_qa_pad_monitor_sink_event_check (pad_monitor, event, + ret = gst_validate_pad_monitor_sink_event_check (pad_monitor, event, pad_monitor->event_func); - GST_QA_MONITOR_UNLOCK (pad_monitor); - GST_QA_PAD_MONITOR_PARENT_UNLOCK (pad_monitor); + GST_VALIDATE_MONITOR_UNLOCK (pad_monitor); + GST_VALIDATE_PAD_MONITOR_PARENT_UNLOCK (pad_monitor); return ret; } static gboolean -gst_qa_pad_monitor_src_event_func (GstPad * pad, GstEvent * event) +gst_validate_pad_monitor_src_event_func (GstPad * pad, GstEvent * event) { - GstQaPadMonitor *pad_monitor = + GstValidatePadMonitor *pad_monitor = g_object_get_data ((GObject *) pad, "qa-monitor"); gboolean ret; - GST_QA_MONITOR_LOCK (pad_monitor); - ret = gst_qa_pad_monitor_src_event_check (pad_monitor, event, + GST_VALIDATE_MONITOR_LOCK (pad_monitor); + ret = gst_validate_pad_monitor_src_event_check (pad_monitor, event, pad_monitor->event_func); - GST_QA_MONITOR_UNLOCK (pad_monitor); + GST_VALIDATE_MONITOR_UNLOCK (pad_monitor); return ret; } static gboolean -gst_qa_pad_monitor_query_func (GstPad * pad, GstQuery * query) +gst_validate_pad_monitor_query_func (GstPad * pad, GstQuery * query) { - GstQaPadMonitor *pad_monitor = + GstValidatePadMonitor *pad_monitor = g_object_get_data ((GObject *) pad, "qa-monitor"); gboolean ret; - gst_qa_pad_monitor_query_overrides (pad_monitor, query); + gst_validate_pad_monitor_query_overrides (pad_monitor, query); ret = pad_monitor->query_func (pad, query); return ret; } static gboolean -gst_qa_pad_buffer_alloc_func (GstPad * pad, guint64 offset, guint size, +gst_validate_pad_buffer_alloc_func (GstPad * pad, guint64 offset, guint size, GstCaps * caps, GstBuffer ** buffer) { - GstQaPadMonitor *pad_monitor = + GstValidatePadMonitor *pad_monitor = g_object_get_data ((GObject *) pad, "qa-monitor"); gboolean ret; ret = pad_monitor->bufferalloc_func (pad, offset, size, caps, buffer); @@ -1409,10 +1434,10 @@ gst_qa_pad_buffer_alloc_func (GstPad * pad, guint64 offset, guint size, } static gboolean -gst_qa_pad_get_range_func (GstPad * pad, guint64 offset, guint size, +gst_validate_pad_get_range_func (GstPad * pad, guint64 offset, guint size, GstBuffer ** buffer) { - GstQaPadMonitor *pad_monitor = + GstValidatePadMonitor *pad_monitor = g_object_get_data ((GObject *) pad, "qa-monitor"); gboolean ret; ret = pad_monitor->getrange_func (pad, offset, size, buffer); @@ -1420,25 +1445,26 @@ gst_qa_pad_get_range_func (GstPad * pad, guint64 offset, guint size, } static gboolean -gst_qa_pad_monitor_buffer_probe (GstPad * pad, GstBuffer * buffer, +gst_validate_pad_monitor_buffer_probe (GstPad * pad, GstBuffer * buffer, gpointer udata) { - GstQaPadMonitor *monitor = udata; + GstValidatePadMonitor *monitor = udata; - GST_QA_PAD_MONITOR_PARENT_LOCK (monitor); - GST_QA_MONITOR_LOCK (monitor); + GST_VALIDATE_PAD_MONITOR_PARENT_LOCK (monitor); + GST_VALIDATE_MONITOR_LOCK (monitor); - gst_qa_pad_monitor_check_first_buffer (monitor, buffer); - gst_qa_pad_monitor_update_buffer_data (monitor, buffer); + gst_validate_pad_monitor_check_first_buffer (monitor, buffer); + gst_validate_pad_monitor_update_buffer_data (monitor, buffer); - gst_qa_pad_monitor_check_buffer_timestamp_in_received_range (monitor, buffer); + gst_validate_pad_monitor_check_buffer_timestamp_in_received_range (monitor, + buffer); - gst_qa_pad_monitor_check_late_serialized_events (monitor, + gst_validate_pad_monitor_check_late_serialized_events (monitor, GST_BUFFER_TIMESTAMP (buffer)); - if (G_LIKELY (GST_QA_MONITOR_GET_PARENT (monitor))) { - /* a GstQaPadMonitor parent must be a GstQaElementMonitor */ - if (GST_QA_ELEMENT_MONITOR_ELEMENT_IS_DECODER (monitor)) { + if (G_LIKELY (GST_VALIDATE_MONITOR_GET_PARENT (monitor))) { + /* a GstValidatePadMonitor parent must be a GstValidateElementMonitor */ + if (GST_VALIDATE_ELEMENT_MONITOR_ELEMENT_IS_DECODER (monitor)) { /* should not push out of segment data */ if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (buffer)) && GST_CLOCK_TIME_IS_VALID (GST_BUFFER_DURATION (buffer)) && @@ -1446,10 +1472,11 @@ gst_qa_pad_monitor_buffer_probe (GstPad * pad, GstBuffer * buffer, GST_BUFFER_TIMESTAMP (buffer), GST_BUFFER_TIMESTAMP (buffer) + GST_BUFFER_DURATION (buffer), NULL, NULL)) { /* TODO is this a timestamp issue? */ - GST_QA_REPORT (monitor, GST_QA_ISSUE_ID_BUFFER_IS_OUT_OF_SEGMENT, + GST_VALIDATE_REPORT (monitor, + GST_VALIDATE_ISSUE_ID_BUFFER_IS_OUT_OF_SEGMENT, "buffer is out of segment and shouldn't be pushed. Timestamp: %" - GST_TIME_FORMAT " - duration: %" GST_TIME_FORMAT - ". Range: %" GST_TIME_FORMAT " - %" GST_TIME_FORMAT, + GST_TIME_FORMAT " - duration: %" GST_TIME_FORMAT ". Range: %" + GST_TIME_FORMAT " - %" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)), GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)), GST_TIME_ARGS (monitor->segment.start), @@ -1458,20 +1485,21 @@ gst_qa_pad_monitor_buffer_probe (GstPad * pad, GstBuffer * buffer, } } - GST_QA_MONITOR_UNLOCK (monitor); - GST_QA_PAD_MONITOR_PARENT_UNLOCK (monitor); - gst_qa_pad_monitor_buffer_probe_overrides (monitor, buffer); + GST_VALIDATE_MONITOR_UNLOCK (monitor); + GST_VALIDATE_PAD_MONITOR_PARENT_UNLOCK (monitor); + gst_validate_pad_monitor_buffer_probe_overrides (monitor, buffer); return TRUE; } static gboolean -gst_qa_pad_monitor_event_probe (GstPad * pad, GstEvent * event, gpointer udata) +gst_validate_pad_monitor_event_probe (GstPad * pad, GstEvent * event, + gpointer udata) { - GstQaPadMonitor *monitor = GST_QA_PAD_MONITOR_CAST (udata); + GstValidatePadMonitor *monitor = GST_VALIDATE_PAD_MONITOR_CAST (udata); gboolean ret; - GST_QA_PAD_MONITOR_PARENT_LOCK (monitor); - GST_QA_MONITOR_LOCK (monitor); + GST_VALIDATE_PAD_MONITOR_PARENT_LOCK (monitor); + GST_VALIDATE_MONITOR_LOCK (monitor); if (GST_EVENT_IS_SERIALIZED (event)) { gint i; @@ -1492,27 +1520,28 @@ gst_qa_pad_monitor_event_probe (GstPad * pad, GstEvent * event, gpointer udata) if (event == stored_event->event || GST_EVENT_TYPE (event) == GST_EVENT_TYPE (stored_event->event)) { - GST_QA_REPORT (monitor, GST_QA_ISSUE_ID_EVENT_SERIALIZED_OUT_OF_ORDER, + GST_VALIDATE_REPORT (monitor, + GST_VALIDATE_ISSUE_ID_EVENT_SERIALIZED_OUT_OF_ORDER, "Serialized event %" GST_PTR_FORMAT " was pushed out of original " "serialization order in pad %s:%s", event, - GST_DEBUG_PAD_NAME (GST_QA_PAD_MONITOR_GET_PAD (monitor))); + GST_DEBUG_PAD_NAME (GST_VALIDATE_PAD_MONITOR_GET_PAD (monitor))); } } } /* This so far is just like an event that is flowing downstream, * so we do the same checks as a sinkpad event handler */ - ret = gst_qa_pad_monitor_sink_event_check (monitor, event, NULL); - GST_QA_MONITOR_UNLOCK (monitor); - GST_QA_PAD_MONITOR_PARENT_UNLOCK (monitor); + ret = gst_validate_pad_monitor_sink_event_check (monitor, event, NULL); + GST_VALIDATE_MONITOR_UNLOCK (monitor); + GST_VALIDATE_PAD_MONITOR_PARENT_UNLOCK (monitor); return ret; } static GstCaps * -gst_qa_pad_monitor_getcaps_func (GstPad * pad) +gst_validate_pad_monitor_getcaps_func (GstPad * pad) { - GstQaPadMonitor *pad_monitor = + GstValidatePadMonitor *pad_monitor = g_object_get_data ((GObject *) pad, "qa-monitor"); GstCaps *ret = NULL; @@ -1525,31 +1554,31 @@ gst_qa_pad_monitor_getcaps_func (GstPad * pad) if (ret) { /* We shouldn't need to lock the parent as this doesn't modify * other monitors, just does some peer_pad_caps */ - GST_QA_MONITOR_LOCK (pad_monitor); + GST_VALIDATE_MONITOR_LOCK (pad_monitor); if (GST_PAD_DIRECTION (pad) == GST_PAD_SINK) { - gst_qa_pad_monitor_check_caps_fields_proxied (pad_monitor, ret); + gst_validate_pad_monitor_check_caps_fields_proxied (pad_monitor, ret); } - GST_QA_MONITOR_UNLOCK (pad_monitor); + GST_VALIDATE_MONITOR_UNLOCK (pad_monitor); } - gst_qa_pad_monitor_getcaps_overrides (pad_monitor, ret); + gst_validate_pad_monitor_getcaps_overrides (pad_monitor, ret); return ret; } static gboolean -gst_qa_pad_monitor_setcaps_func (GstPad * pad, GstCaps * caps) +gst_validate_pad_monitor_setcaps_func (GstPad * pad, GstCaps * caps) { - GstQaPadMonitor *pad_monitor = + GstValidatePadMonitor *pad_monitor = g_object_get_data ((GObject *) pad, "qa-monitor"); gboolean ret = TRUE; GstStructure *structure; - GST_QA_PAD_MONITOR_PARENT_LOCK (pad_monitor); - GST_QA_MONITOR_LOCK (pad_monitor); + GST_VALIDATE_PAD_MONITOR_PARENT_LOCK (pad_monitor); + GST_VALIDATE_MONITOR_LOCK (pad_monitor); - gst_qa_pad_monitor_check_caps_complete (pad_monitor, caps); + gst_validate_pad_monitor_check_caps_complete (pad_monitor, caps); if (caps) { structure = gst_caps_get_structure (caps, 0); @@ -1566,13 +1595,13 @@ gst_qa_pad_monitor_setcaps_func (GstPad * pad, GstCaps * caps) gst_structure_get_value (pad_monitor->pending_setcaps_fields, name); if (v == NULL) { - GST_QA_REPORT (pad_monitor, - GST_QA_ISSUE_ID_CAPS_EXPECTED_FIELD_NOT_FOUND, + GST_VALIDATE_REPORT (pad_monitor, + GST_VALIDATE_ISSUE_ID_CAPS_EXPECTED_FIELD_NOT_FOUND, "Field %s is missing from setcaps caps '%" GST_PTR_FORMAT "'", name, caps); } else if (gst_value_compare (v, otherv) != GST_VALUE_EQUAL) { - GST_QA_REPORT (pad_monitor, - GST_QA_ISSUE_ID_CAPS_FIELD_UNEXPECTED_VALUE, + GST_VALIDATE_REPORT (pad_monitor, + GST_VALIDATE_ISSUE_ID_CAPS_FIELD_UNEXPECTED_VALUE, "Field %s from setcaps caps '%" GST_PTR_FORMAT "' is different " "from expected value in caps '%" GST_PTR_FORMAT "'", name, caps, pad_monitor->pending_setcaps_fields); @@ -1580,21 +1609,21 @@ gst_qa_pad_monitor_setcaps_func (GstPad * pad, GstCaps * caps) } } - if (gst_qa_pad_monitor_pad_should_proxy_othercaps (pad_monitor)) { + if (gst_validate_pad_monitor_pad_should_proxy_othercaps (pad_monitor)) { if (_structure_is_video (structure)) { - gst_qa_pad_monitor_otherpad_add_pending_field (pad_monitor, structure, - "width"); - gst_qa_pad_monitor_otherpad_add_pending_field (pad_monitor, structure, - "height"); - gst_qa_pad_monitor_otherpad_add_pending_field (pad_monitor, structure, - "framerate"); - gst_qa_pad_monitor_otherpad_add_pending_field (pad_monitor, structure, - "pixel-aspect-ratio"); + gst_validate_pad_monitor_otherpad_add_pending_field (pad_monitor, + structure, "width"); + gst_validate_pad_monitor_otherpad_add_pending_field (pad_monitor, + structure, "height"); + gst_validate_pad_monitor_otherpad_add_pending_field (pad_monitor, + structure, "framerate"); + gst_validate_pad_monitor_otherpad_add_pending_field (pad_monitor, + structure, "pixel-aspect-ratio"); } else if (_structure_is_audio (structure)) { - gst_qa_pad_monitor_otherpad_add_pending_field (pad_monitor, structure, - "rate"); - gst_qa_pad_monitor_otherpad_add_pending_field (pad_monitor, structure, - "channels"); + gst_validate_pad_monitor_otherpad_add_pending_field (pad_monitor, + structure, "rate"); + gst_validate_pad_monitor_otherpad_add_pending_field (pad_monitor, + structure, "channels"); } } } @@ -1603,35 +1632,35 @@ gst_qa_pad_monitor_setcaps_func (GstPad * pad, GstCaps * caps) pad_monitor->pending_setcaps_fields = gst_structure_empty_new (PENDING_FIELDS); - GST_QA_MONITOR_UNLOCK (pad_monitor); - GST_QA_PAD_MONITOR_PARENT_UNLOCK (pad_monitor); + GST_VALIDATE_MONITOR_UNLOCK (pad_monitor); + GST_VALIDATE_PAD_MONITOR_PARENT_UNLOCK (pad_monitor); - gst_qa_pad_monitor_setcaps_overrides (pad_monitor, caps); + gst_validate_pad_monitor_setcaps_overrides (pad_monitor, caps); if (pad_monitor->setcaps_func) { ret = pad_monitor->setcaps_func (pad, caps); } - GST_QA_PAD_MONITOR_PARENT_LOCK (pad_monitor); + GST_VALIDATE_PAD_MONITOR_PARENT_LOCK (pad_monitor); if (!ret) - gst_qa_pad_monitor_otherpad_clear_pending_fields (pad_monitor); - GST_QA_PAD_MONITOR_PARENT_UNLOCK (pad_monitor); + gst_validate_pad_monitor_otherpad_clear_pending_fields (pad_monitor); + GST_VALIDATE_PAD_MONITOR_PARENT_UNLOCK (pad_monitor); return ret; } static gboolean -gst_qa_pad_monitor_do_setup (GstQaMonitor * monitor) +gst_validate_pad_monitor_do_setup (GstValidateMonitor * monitor) { - GstQaPadMonitor *pad_monitor = GST_QA_PAD_MONITOR_CAST (monitor); + GstValidatePadMonitor *pad_monitor = GST_VALIDATE_PAD_MONITOR_CAST (monitor); GstPad *pad; - if (!GST_IS_PAD (GST_QA_MONITOR_GET_OBJECT (monitor))) { + if (!GST_IS_PAD (GST_VALIDATE_MONITOR_GET_OBJECT (monitor))) { GST_WARNING_OBJECT (monitor, "Trying to create pad monitor with other " "type of object"); return FALSE; } - pad = GST_QA_PAD_MONITOR_GET_PAD (pad_monitor); + pad = GST_VALIDATE_PAD_MONITOR_GET_PAD (pad_monitor); if (g_object_get_data ((GObject *) pad, "qa-monitor")) { GST_WARNING_OBJECT (pad_monitor, "Pad already has a qa-monitor associated"); @@ -1647,32 +1676,33 @@ gst_qa_pad_monitor_do_setup (GstQaMonitor * monitor) if (GST_PAD_DIRECTION (pad) == GST_PAD_SINK) { pad_monitor->bufferalloc_func = GST_PAD_BUFFERALLOCFUNC (pad); if (pad_monitor->bufferalloc_func) - gst_pad_set_bufferalloc_function (pad, gst_qa_pad_buffer_alloc_func); + gst_pad_set_bufferalloc_function (pad, + gst_validate_pad_buffer_alloc_func); pad_monitor->chain_func = GST_PAD_CHAINFUNC (pad); if (pad_monitor->chain_func) - gst_pad_set_chain_function (pad, gst_qa_pad_monitor_chain_func); + gst_pad_set_chain_function (pad, gst_validate_pad_monitor_chain_func); - gst_pad_set_event_function (pad, gst_qa_pad_monitor_sink_event_func); + gst_pad_set_event_function (pad, gst_validate_pad_monitor_sink_event_func); } else { pad_monitor->getrange_func = GST_PAD_GETRANGEFUNC (pad); if (pad_monitor->getrange_func) - gst_pad_set_getrange_function (pad, gst_qa_pad_get_range_func); + gst_pad_set_getrange_function (pad, gst_validate_pad_get_range_func); - gst_pad_set_event_function (pad, gst_qa_pad_monitor_src_event_func); + gst_pad_set_event_function (pad, gst_validate_pad_monitor_src_event_func); /* add buffer/event probes */ pad_monitor->buffer_probe_id = gst_pad_add_buffer_probe (pad, - (GCallback) gst_qa_pad_monitor_buffer_probe, pad_monitor); + (GCallback) gst_validate_pad_monitor_buffer_probe, pad_monitor); pad_monitor->event_probe_id = gst_pad_add_event_probe (pad, - (GCallback) gst_qa_pad_monitor_event_probe, pad_monitor); + (GCallback) gst_validate_pad_monitor_event_probe, pad_monitor); } - gst_pad_set_query_function (pad, gst_qa_pad_monitor_query_func); - gst_pad_set_getcaps_function (pad, gst_qa_pad_monitor_getcaps_func); - gst_pad_set_setcaps_function (pad, gst_qa_pad_monitor_setcaps_func); + gst_pad_set_query_function (pad, gst_validate_pad_monitor_query_func); + gst_pad_set_getcaps_function (pad, gst_validate_pad_monitor_getcaps_func); + gst_pad_set_setcaps_function (pad, gst_validate_pad_monitor_setcaps_func); - gst_qa_reporter_set_name (GST_QA_REPORTER (monitor), g_strdup_printf ("%s:%s", - GST_DEBUG_PAD_NAME (pad))); + gst_validate_reporter_set_name (GST_VALIDATE_REPORTER (monitor), + g_strdup_printf ("%s:%s", GST_DEBUG_PAD_NAME (pad))); g_signal_connect (pad, "parent-set", (GCallback) _parent_set_cb, monitor); diff --git a/validate/gst/qa/gst-qa-pad-monitor.h b/validate/gst/validate/gst-validate-pad-monitor.h similarity index 53% rename from validate/gst/qa/gst-qa-pad-monitor.h rename to validate/gst/validate/gst-validate-pad-monitor.h index 8c77457..107ccb2 100644 --- a/validate/gst/qa/gst-qa-pad-monitor.h +++ b/validate/gst/validate/gst-validate-pad-monitor.h @@ -1,7 +1,7 @@ /* GStreamer * Copyright (C) 2013 Thiago Santos * - * gst-qa-pad-monitor.h - QA PadMonitor class + * gst-validate-pad-monitor.h - Validate PadMonitor class * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -19,45 +19,45 @@ * Boston, MA 02111-1307, USA. */ -#ifndef __GST_QA_PAD_MONITOR_H__ -#define __GST_QA_PAD_MONITOR_H__ +#ifndef __GST_VALIDATE_PAD_MONITOR_H__ +#define __GST_VALIDATE_PAD_MONITOR_H__ #include #include -#include "gst-qa-monitor.h" +#include "gst-validate-monitor.h" G_BEGIN_DECLS /* forward declaratin */ -typedef struct _GstQaElementMonitor GstQaElementMonitor; +typedef struct _GstValidateElementMonitor GstValidateElementMonitor; -#define GST_TYPE_QA_PAD_MONITOR (gst_qa_pad_monitor_get_type ()) -#define GST_IS_QA_PAD_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_QA_PAD_MONITOR)) -#define GST_IS_QA_PAD_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_QA_PAD_MONITOR)) -#define GST_QA_PAD_MONITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_QA_PAD_MONITOR, GstQaPadMonitorClass)) -#define GST_QA_PAD_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_QA_PAD_MONITOR, GstQaPadMonitor)) -#define GST_QA_PAD_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_QA_PAD_MONITOR, GstQaPadMonitorClass)) -#define GST_QA_PAD_MONITOR_CAST(obj) ((GstQaPadMonitor*)(obj)) -#define GST_QA_PAD_MONITOR_CLASS_CAST(klass) ((GstQaPadMonitorClass*)(klass)) +#define GST_TYPE_VALIDATE_PAD_MONITOR (gst_validate_pad_monitor_get_type ()) +#define GST_IS_VALIDATE_PAD_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_VALIDATE_PAD_MONITOR)) +#define GST_IS_VALIDATE_PAD_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_VALIDATE_PAD_MONITOR)) +#define GST_VALIDATE_PAD_MONITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_VALIDATE_PAD_MONITOR, GstValidatePadMonitorClass)) +#define GST_VALIDATE_PAD_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_VALIDATE_PAD_MONITOR, GstValidatePadMonitor)) +#define GST_VALIDATE_PAD_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_VALIDATE_PAD_MONITOR, GstValidatePadMonitorClass)) +#define GST_VALIDATE_PAD_MONITOR_CAST(obj) ((GstValidatePadMonitor*)(obj)) +#define GST_VALIDATE_PAD_MONITOR_CLASS_CAST(klass) ((GstValidatePadMonitorClass*)(klass)) -#define GST_QA_PAD_MONITOR_GET_PAD(m) (GST_PAD_CAST (GST_QA_MONITOR_GET_OBJECT (m))) +#define GST_VALIDATE_PAD_MONITOR_GET_PAD(m) (GST_PAD_CAST (GST_VALIDATE_MONITOR_GET_OBJECT (m))) -typedef struct _GstQaPadMonitor GstQaPadMonitor; -typedef struct _GstQaPadMonitorClass GstQaPadMonitorClass; +typedef struct _GstValidatePadMonitor GstValidatePadMonitor; +typedef struct _GstValidatePadMonitorClass GstValidatePadMonitorClass; /** - * GstQaPadMonitor: + * GstValidatePadMonitor: * - * GStreamer QA PadMonitor class. + * GStreamer Validate PadMonitor class. * - * Class that wraps a #GstPad for QA checks + * Class that wraps a #GstPad for Validate checks */ -struct _GstQaPadMonitor { - GstQaMonitor parent; +struct _GstValidatePadMonitor { + GstValidateMonitor parent; - GstQaElementMonitor *element_monitor; + GstValidateElementMonitor *element_monitor; gboolean setup; GstPad *pad; @@ -109,21 +109,21 @@ struct _GstQaPadMonitor { }; /** - * GstQaPadMonitorClass: + * GstValidatePadMonitorClass: * @parent_class: parent * - * GStreamer QA PadMonitor object class. + * GStreamer Validate PadMonitor object class. */ -struct _GstQaPadMonitorClass { - GstQaMonitorClass parent_class; +struct _GstValidatePadMonitorClass { + GstValidateMonitorClass parent_class; }; /* normal GObject stuff */ -GType gst_qa_pad_monitor_get_type (void); +GType gst_validate_pad_monitor_get_type (void); -GstQaPadMonitor * gst_qa_pad_monitor_new (GstPad * pad, GstQaRunner * runner, GstQaElementMonitor *element_monitor); +GstValidatePadMonitor * gst_validate_pad_monitor_new (GstPad * pad, GstValidateRunner * runner, GstValidateElementMonitor *element_monitor); G_END_DECLS -#endif /* __GST_QA_PAD_MONITOR_H__ */ +#endif /* __GST_VALIDATE_PAD_MONITOR_H__ */ diff --git a/validate/gst/validate/gst-validate-report.c b/validate/gst/validate/gst-validate-report.c new file mode 100644 index 0000000..522097e --- /dev/null +++ b/validate/gst/validate/gst-validate-report.c @@ -0,0 +1,350 @@ +/* GStreamer + * Copyright (C) 2013 Thiago Santos + * + * gst-validate-monitor-report.c - Validate report/issues functions + * + * 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.1 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. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include "gst-validate-i18n-lib.h" + +#include "gst-validate-report.h" +#include "gst-validate-reporter.h" +#include "gst-validate-monitor.h" + +static GstClockTime _gst_validate_report_start_time = 0; +static GstValidateDebugFlags _gst_validate_flags = 0; +static GHashTable *_gst_validate_issues = NULL; + +G_DEFINE_BOXED_TYPE (GstValidateReport, gst_validate_report, + (GBoxedCopyFunc) gst_validate_report_ref, + (GBoxedFreeFunc) gst_validate_report_unref); + +GstValidateIssueId +gst_validate_issue_get_id (GstValidateIssue * issue) +{ + return issue->issue_id; +} + +GstValidateIssue * +gst_validate_issue_new (GstValidateIssueId issue_id, gchar * summary, + gchar * description, GstValidateReportLevel default_level) +{ + GstValidateIssue *issue = g_slice_new (GstValidateIssue); + + issue->issue_id = issue_id; + issue->summary = summary; + issue->description = description; + issue->default_level = default_level; + issue->repeat = FALSE; + + return issue; +} + +static void +gst_validate_issue_free (GstValidateIssue * issue) +{ + g_free (issue->summary); + g_free (issue->description); + g_slice_free (GstValidateIssue, issue); +} + +void +gst_validate_issue_register (GstValidateIssue * issue) +{ + g_return_if_fail (g_hash_table_lookup (_gst_validate_issues, + (gpointer) gst_validate_issue_get_id (issue)) == NULL); + + g_hash_table_insert (_gst_validate_issues, + (gpointer) gst_validate_issue_get_id (issue), issue); +} + +#define REGISTER_VALIDATE_ISSUE(id,sum,desc,lvl) gst_validate_issue_register (gst_validate_issue_new (id, sum, desc, lvl)) +static void +gst_validate_report_load_issues (void) +{ + g_return_if_fail (_gst_validate_issues == NULL); + + _gst_validate_issues = g_hash_table_new_full (g_direct_hash, g_direct_equal, + NULL, (GDestroyNotify) gst_validate_issue_free); + + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_BUFFER_BEFORE_SEGMENT, + _("buffer was received before a segment"), + _("in push mode, a segment event must be received before a buffer"), + GST_VALIDATE_REPORT_LEVEL_WARNING); + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_BUFFER_IS_OUT_OF_SEGMENT, + _("buffer is out of the segment range"), + _("buffer being pushed is out of the current segment's start-stop " + " range. Meaning it is going to be discarded downstream without " + "any use"), GST_VALIDATE_REPORT_LEVEL_ISSUE); + REGISTER_VALIDATE_ISSUE + (GST_VALIDATE_ISSUE_ID_BUFFER_TIMESTAMP_OUT_OF_RECEIVED_RANGE, + _("buffer timestamp is out of the received buffer timestamps' range"), + _("a buffer leaving an element should have its timestamps in the range " + "of the received buffers timestamps. i.e. If an element received " + "buffers with timestamps from 0s to 10s, it can't push a buffer with " + "with a 11s timestamp, because it doesn't have data for that"), + GST_VALIDATE_REPORT_LEVEL_WARNING); + REGISTER_VALIDATE_ISSUE + (GST_VALIDATE_ISSUE_ID_FIRST_BUFFER_RUNNING_TIME_IS_NOT_ZERO, + _("first buffer's running time isn't 0"), + _("the first buffer's received running time is expected to be 0"), + GST_VALIDATE_REPORT_LEVEL_WARNING); + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_WRONG_FLOW_RETURN, _("flow return from pad push doesn't match expected value"), _("flow return from a 1:1 sink/src pad element is as simple as " "returning what downstream returned. For elements that have multiple " "src pads, flow returns should be properly combined"), /* TODO fill me more */ + GST_VALIDATE_REPORT_LEVEL_CRITICAL); + + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_CAPS_IS_MISSING_FIELD, + _("caps is missing a required field for its type"), + _("some caps types are expected to contain a set of basic fields. " + "For example, raw video should have 'width', 'height', 'framerate' " + "and 'pixel-aspect-ratio'"), GST_VALIDATE_REPORT_LEVEL_ISSUE); + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_CAPS_FIELD_HAS_BAD_TYPE, + _("caps field has an unexpected type"), + _("some common caps fields should always use the same expected types"), + GST_VALIDATE_REPORT_LEVEL_WARNING); + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_CAPS_EXPECTED_FIELD_NOT_FOUND, + _("caps expected field wasn't present"), + _("a field that should be present in the caps wasn't found. " + "Fields sets on a sink pad caps should be propagated downstream " + "when it makes sense to do so"), GST_VALIDATE_REPORT_LEVEL_WARNING); + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_GET_CAPS_NOT_PROXYING_FIELDS, + _("getcaps function isn't proxying downstream fields correctly"), + _("elements should set downstream caps restrictions on its caps when " + "replying upstream's getcaps queries to avoid upstream sending data" + " in an unsupported format"), GST_VALIDATE_REPORT_LEVEL_CRITICAL); + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_CAPS_FIELD_UNEXPECTED_VALUE, + _("a field in caps has an unexpected value"), + _("fields set on a sink pad should be propagated downstream via " + "set caps"), GST_VALIDATE_REPORT_LEVEL_CRITICAL); + + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_EVENT_NEWSEGMENT_NOT_PUSHED, + _("new segment event wasn't propagated downstream"), + _("segments received from upstream should be pushed downstream"), + GST_VALIDATE_REPORT_LEVEL_WARNING); + REGISTER_VALIDATE_ISSUE + (GST_VALIDATE_ISSUE_ID_SERIALIZED_EVENT_WASNT_PUSHED_IN_TIME, + _("a serialized event received should be pushed in the same 'time' " + "as it was received"), + _("serialized events should be pushed in the same order they are " + "received and serialized with buffers. If an event is received after" + " a buffer with timestamp end 'X', it should be pushed right after " + "buffers with timestamp end 'X'"), GST_VALIDATE_REPORT_LEVEL_WARNING); + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_EVENT_HAS_WRONG_SEQNUM, + _("events that are part of the same pipeline 'operation' should " + "have the same seqnum"), + _("when events/messages are created from another event/message, " + "they should have their seqnums set to the original event/message " + "seqnum"), GST_VALIDATE_REPORT_LEVEL_ISSUE); + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_EVENT_SERIALIZED_OUT_OF_ORDER, + _("a serialized event received should be pushed in the same order " + "as it was received"), + _("serialized events should be pushed in the same order they are " + "received."), GST_VALIDATE_REPORT_LEVEL_WARNING); + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_EVENT_NEW_SEGMENT_MISMATCH, + _("a new segment event has different value than the received one"), + _("when receiving a new segment, an element should push an equivalent" + "segment downstream"), GST_VALIDATE_REPORT_LEVEL_WARNING); + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_EVENT_FLUSH_START_UNEXPECTED, + _("received an unexpected flush start event"), NULL, + GST_VALIDATE_REPORT_LEVEL_WARNING); + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_EVENT_FLUSH_STOP_UNEXPECTED, + _("received an unexpected flush stop event"), NULL, + GST_VALIDATE_REPORT_LEVEL_WARNING); + + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_EVENT_SEEK_NOT_HANDLED, + _("seek event wasn't handled"), NULL, GST_VALIDATE_REPORT_LEVEL_CRITICAL); + REGISTER_VALIDATE_ISSUE + (GST_VALIDATE_ISSUE_ID_EVENT_SEEK_RESULT_POSITION_WRONG, + _("position after a seek is wrong"), NULL, + GST_VALIDATE_REPORT_LEVEL_CRITICAL); + + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_STATE_CHANGE_FAILURE, + _("state change failed"), NULL, GST_VALIDATE_REPORT_LEVEL_CRITICAL); + + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_FILE_SIZE_IS_ZERO, + _("resulting file size is 0"), NULL, GST_VALIDATE_REPORT_LEVEL_CRITICAL); + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_FILE_SIZE_INCORRECT, + _("resulting file size wasn't within the expected values"), + NULL, GST_VALIDATE_REPORT_LEVEL_WARNING); + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_FILE_DURATION_INCORRECT, + _("resulting file duration wasn't within the expected values"), + NULL, GST_VALIDATE_REPORT_LEVEL_WARNING); + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_FILE_SEEKABLE_INCORRECT, + _("resulting file wasn't seekable or not seekable as expected"), + NULL, GST_VALIDATE_REPORT_LEVEL_WARNING); + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_FILE_PROFILE_INCORRECT, + _("resulting file stream profiles didn't match expected values"), + NULL, GST_VALIDATE_REPORT_LEVEL_CRITICAL); + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_FILE_NOT_FOUND, + _("resulting file could not be found for testing"), NULL, + GST_VALIDATE_REPORT_LEVEL_CRITICAL); + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_FILE_CHECK_FAILURE, + _("an error occured while checking the file for conformance"), NULL, + GST_VALIDATE_REPORT_LEVEL_CRITICAL); + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_FILE_PLAYBACK_START_FAILURE, + _("an error occured while starting playback of the test file"), NULL, + GST_VALIDATE_REPORT_LEVEL_CRITICAL); + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_FILE_PLAYBACK_ERROR, + _("an error during playback of the file"), NULL, + GST_VALIDATE_REPORT_LEVEL_CRITICAL); + + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_ALLOCATION_FAILURE, + _("a memory allocation failed during Validate run"), + NULL, GST_VALIDATE_REPORT_LEVEL_CRITICAL); + REGISTER_VALIDATE_ISSUE (GST_VALIDATE_ISSUE_ID_MISSING_PLUGIN, + _("a gstreamer plugin is missing and prevented Validate from running"), + NULL, GST_VALIDATE_REPORT_LEVEL_CRITICAL); +} + +void +gst_validate_report_init (void) +{ + const gchar *var; + const GDebugKey keys[] = { + {"fatal_criticals", GST_VALIDATE_FATAL_CRITICALS}, + {"fatal_warnings", GST_VALIDATE_FATAL_WARNINGS}, + {"fatal_issues", GST_VALIDATE_FATAL_ISSUES} + }; + + if (_gst_validate_report_start_time == 0) { + _gst_validate_report_start_time = gst_util_get_timestamp (); + + /* init the debug flags */ + var = g_getenv ("GST_VALIDATE"); + if (var && strlen (var) > 0) { + _gst_validate_flags = g_parse_debug_string (var, keys, 3); + } + + gst_validate_report_load_issues (); + } +} + +GstValidateIssue * +gst_validate_issue_from_id (GstValidateIssueId issue_id) +{ + return g_hash_table_lookup (_gst_validate_issues, (gpointer) issue_id); +} + +/* TODO how are these functions going to work with extensions */ +const gchar * +gst_validate_report_level_get_name (GstValidateReportLevel level) +{ + switch (level) { + case GST_VALIDATE_REPORT_LEVEL_CRITICAL: + return "critical"; + case GST_VALIDATE_REPORT_LEVEL_WARNING: + return "warning"; + case GST_VALIDATE_REPORT_LEVEL_ISSUE: + return "issue"; + case GST_VALIDATE_REPORT_LEVEL_IGNORE: + return "ignore"; + default: + return "unknown"; + } +} + +const gchar * +gst_validate_report_area_get_name (GstValidateReportArea area) +{ + switch (area) { + case GST_VALIDATE_AREA_EVENT: + return "event"; + case GST_VALIDATE_AREA_BUFFER: + return "buffer"; + case GST_VALIDATE_AREA_QUERY: + return "query"; + case GST_VALIDATE_AREA_CAPS: + return "caps"; + case GST_VALIDATE_AREA_SEEK: + return "seek"; + case GST_VALIDATE_AREA_STATE: + return "state"; + case GST_VALIDATE_AREA_FILE_CHECK: + return "file-check"; + case GST_VALIDATE_AREA_RUN_ERROR: + return "run-error"; + case GST_VALIDATE_AREA_OTHER: + return "other"; + default: + g_assert_not_reached (); + return "unknown"; + } +} + +void +gst_validate_report_check_abort (GstValidateReport * report) +{ + if ((report->level == GST_VALIDATE_REPORT_LEVEL_ISSUE && + _gst_validate_flags & GST_VALIDATE_FATAL_ISSUES) || + (report->level == GST_VALIDATE_REPORT_LEVEL_WARNING && + _gst_validate_flags & GST_VALIDATE_FATAL_WARNINGS) || + (report->level == GST_VALIDATE_REPORT_LEVEL_CRITICAL && + _gst_validate_flags & GST_VALIDATE_FATAL_CRITICALS)) { + g_error ("Fatal report received: %" GST_VALIDATE_ERROR_REPORT_PRINT_FORMAT, + GST_VALIDATE_REPORT_PRINT_ARGS (report)); + } +} + +GstValidateIssueId +gst_validate_report_get_issue_id (GstValidateReport * report) +{ + return gst_validate_issue_get_id (report->issue); +} + +GstValidateReport * +gst_validate_report_new (GstValidateIssue * issue, + GstValidateReporter * reporter, const gchar * message) +{ + GstValidateReport *report = g_slice_new0 (GstValidateReport); + + report->issue = issue; + report->reporter = reporter; /* TODO should we ref? */ + report->message = g_strdup (message); + report->timestamp = + gst_util_get_timestamp () - _gst_validate_report_start_time; + report->level = issue->default_level; + + return report; +} + +void +gst_validate_report_unref (GstValidateReport * report) +{ + if (G_UNLIKELY (g_atomic_int_dec_and_test (&report->refcount))) { + g_free (report->message); + g_slice_free (GstValidateReport, report); + } +} + +GstValidateReport * +gst_validate_report_ref (GstValidateReport * report) +{ + g_atomic_int_inc (&report->refcount); + + return report; +} + +void +gst_validate_report_printf (GstValidateReport * report) +{ + g_print ("%" GST_VALIDATE_ERROR_REPORT_PRINT_FORMAT "\n", + GST_VALIDATE_REPORT_PRINT_ARGS (report)); +} diff --git a/validate/gst/validate/gst-validate-report.h b/validate/gst/validate/gst-validate-report.h new file mode 100644 index 0000000..6fcfc90 --- /dev/null +++ b/validate/gst/validate/gst-validate-report.h @@ -0,0 +1,189 @@ +/* GStreamer + * Copyright (C) 2013 Thiago Santos + * + * gst-validate-monitor-report.h - Validate Element report structures and functions + * + * 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.1 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. + */ + +#ifndef __GST_VALIDATE_REPORT_H__ +#define __GST_VALIDATE_REPORT_H__ + +#include +#include + +G_BEGIN_DECLS + +/* forward declaration */ +typedef struct _GstValidateReporter GstValidateReporter; + +GType gst_validate_report_get_type (void); +#define GST_TYPE_VALIDATE_REPORT (gst_validate_report_get_type ()) + +typedef enum { + GST_VALIDATE_FATAL_DEFAULT = 0, + GST_VALIDATE_FATAL_ISSUES = 1 << 0, + GST_VALIDATE_FATAL_WARNINGS = 1 << 1, + GST_VALIDATE_FATAL_CRITICALS = 1 << 2 +} GstValidateDebugFlags; + +typedef enum { + GST_VALIDATE_REPORT_LEVEL_CRITICAL, + GST_VALIDATE_REPORT_LEVEL_WARNING, + GST_VALIDATE_REPORT_LEVEL_ISSUE, + GST_VALIDATE_REPORT_LEVEL_IGNORE, + GST_VALIDATE_REPORT_LEVEL_NUM_ENTRIES, +} GstValidateReportLevel; + +typedef enum { + GST_VALIDATE_AREA_EVENT=1, + GST_VALIDATE_AREA_BUFFER, + GST_VALIDATE_AREA_QUERY, + GST_VALIDATE_AREA_CAPS, + GST_VALIDATE_AREA_SEEK, + GST_VALIDATE_AREA_STATE, + GST_VALIDATE_AREA_FILE_CHECK, + GST_VALIDATE_AREA_RUN_ERROR, + GST_VALIDATE_AREA_OTHER=100, +} GstValidateReportArea; + +typedef guintptr GstValidateIssueId; +#define GST_VALIDATE_ISSUE_ID_UNKNOWN 0 + +#define GST_VALIDATE_ISSUE_ID_SHIFT 16 +#define GST_VALIDATE_ISSUE_ID_CUSTOM_FIRST (2 << 15) + +#define GST_VALIDATE_ISSUE_ID_BUFFER_BEFORE_SEGMENT (((GstValidateIssueId) GST_VALIDATE_AREA_BUFFER) << GST_VALIDATE_ISSUE_ID_SHIFT | 1) +#define GST_VALIDATE_ISSUE_ID_BUFFER_IS_OUT_OF_SEGMENT (((GstValidateIssueId) GST_VALIDATE_AREA_BUFFER) << GST_VALIDATE_ISSUE_ID_SHIFT | 2) +#define GST_VALIDATE_ISSUE_ID_BUFFER_TIMESTAMP_OUT_OF_RECEIVED_RANGE (((GstValidateIssueId) GST_VALIDATE_AREA_BUFFER) << GST_VALIDATE_ISSUE_ID_SHIFT | 3) +#define GST_VALIDATE_ISSUE_ID_FIRST_BUFFER_RUNNING_TIME_IS_NOT_ZERO (((GstValidateIssueId) GST_VALIDATE_AREA_BUFFER) << GST_VALIDATE_ISSUE_ID_SHIFT | 4) +#define GST_VALIDATE_ISSUE_ID_WRONG_FLOW_RETURN (((GstValidateIssueId) GST_VALIDATE_AREA_BUFFER) << GST_VALIDATE_ISSUE_ID_SHIFT | 5) + +#define GST_VALIDATE_ISSUE_ID_CAPS_IS_MISSING_FIELD (((GstValidateIssueId) GST_VALIDATE_AREA_CAPS) << GST_VALIDATE_ISSUE_ID_SHIFT | 1) +#define GST_VALIDATE_ISSUE_ID_CAPS_FIELD_HAS_BAD_TYPE (((GstValidateIssueId) GST_VALIDATE_AREA_CAPS) << GST_VALIDATE_ISSUE_ID_SHIFT | 2) +#define GST_VALIDATE_ISSUE_ID_CAPS_EXPECTED_FIELD_NOT_FOUND (((GstValidateIssueId) GST_VALIDATE_AREA_CAPS) << GST_VALIDATE_ISSUE_ID_SHIFT | 3) +#define GST_VALIDATE_ISSUE_ID_GET_CAPS_NOT_PROXYING_FIELDS (((GstValidateIssueId) GST_VALIDATE_AREA_CAPS) << GST_VALIDATE_ISSUE_ID_SHIFT | 4) +#define GST_VALIDATE_ISSUE_ID_CAPS_FIELD_UNEXPECTED_VALUE (((GstValidateIssueId) GST_VALIDATE_AREA_CAPS) << GST_VALIDATE_ISSUE_ID_SHIFT | 5) + +#define GST_VALIDATE_ISSUE_ID_EVENT_NEWSEGMENT_NOT_PUSHED (((GstValidateIssueId) GST_VALIDATE_AREA_EVENT) << GST_VALIDATE_ISSUE_ID_SHIFT | 1) +#define GST_VALIDATE_ISSUE_ID_SERIALIZED_EVENT_WASNT_PUSHED_IN_TIME (((GstValidateIssueId) GST_VALIDATE_AREA_EVENT) << GST_VALIDATE_ISSUE_ID_SHIFT | 2) +#define GST_VALIDATE_ISSUE_ID_EVENT_HAS_WRONG_SEQNUM (((GstValidateIssueId) GST_VALIDATE_AREA_EVENT) << GST_VALIDATE_ISSUE_ID_SHIFT | 3) +#define GST_VALIDATE_ISSUE_ID_EVENT_SERIALIZED_OUT_OF_ORDER (((GstValidateIssueId) GST_VALIDATE_AREA_EVENT) << GST_VALIDATE_ISSUE_ID_SHIFT | 4) +#define GST_VALIDATE_ISSUE_ID_EVENT_NEW_SEGMENT_MISMATCH (((GstValidateIssueId) GST_VALIDATE_AREA_EVENT) << GST_VALIDATE_ISSUE_ID_SHIFT | 5) +#define GST_VALIDATE_ISSUE_ID_EVENT_FLUSH_START_UNEXPECTED (((GstValidateIssueId) GST_VALIDATE_AREA_EVENT) << GST_VALIDATE_ISSUE_ID_SHIFT | 6) +#define GST_VALIDATE_ISSUE_ID_EVENT_FLUSH_STOP_UNEXPECTED (((GstValidateIssueId) GST_VALIDATE_AREA_EVENT) << GST_VALIDATE_ISSUE_ID_SHIFT | 7) + +#define GST_VALIDATE_ISSUE_ID_EVENT_SEEK_NOT_HANDLED (((GstValidateIssueId) GST_VALIDATE_AREA_SEEK) << GST_VALIDATE_ISSUE_ID_SHIFT | 1) +#define GST_VALIDATE_ISSUE_ID_EVENT_SEEK_RESULT_POSITION_WRONG (((GstValidateIssueId) GST_VALIDATE_AREA_SEEK) << GST_VALIDATE_ISSUE_ID_SHIFT | 2) + +#define GST_VALIDATE_ISSUE_ID_STATE_CHANGE_FAILURE (((GstValidateIssueId) GST_VALIDATE_AREA_STATE) << GST_VALIDATE_ISSUE_ID_SHIFT | 1) + +#define GST_VALIDATE_ISSUE_ID_FILE_SIZE_IS_ZERO (((GstValidateIssueId) GST_VALIDATE_AREA_FILE_CHECK) << GST_VALIDATE_ISSUE_ID_SHIFT | 1) +#define GST_VALIDATE_ISSUE_ID_FILE_SIZE_INCORRECT (((GstValidateIssueId) GST_VALIDATE_AREA_FILE_CHECK) << GST_VALIDATE_ISSUE_ID_SHIFT | 2) +#define GST_VALIDATE_ISSUE_ID_FILE_DURATION_INCORRECT (((GstValidateIssueId) GST_VALIDATE_AREA_FILE_CHECK) << GST_VALIDATE_ISSUE_ID_SHIFT | 3) +#define GST_VALIDATE_ISSUE_ID_FILE_SEEKABLE_INCORRECT (((GstValidateIssueId) GST_VALIDATE_AREA_FILE_CHECK) << GST_VALIDATE_ISSUE_ID_SHIFT | 4) +#define GST_VALIDATE_ISSUE_ID_FILE_PROFILE_INCORRECT (((GstValidateIssueId) GST_VALIDATE_AREA_FILE_CHECK) << GST_VALIDATE_ISSUE_ID_SHIFT | 5) +#define GST_VALIDATE_ISSUE_ID_FILE_NOT_FOUND (((GstValidateIssueId) GST_VALIDATE_AREA_FILE_CHECK) << GST_VALIDATE_ISSUE_ID_SHIFT | 6) +#define GST_VALIDATE_ISSUE_ID_FILE_CHECK_FAILURE (((GstValidateIssueId) GST_VALIDATE_AREA_FILE_CHECK) << GST_VALIDATE_ISSUE_ID_SHIFT | 7) +#define GST_VALIDATE_ISSUE_ID_FILE_PLAYBACK_START_FAILURE (((GstValidateIssueId) GST_VALIDATE_AREA_FILE_CHECK) << GST_VALIDATE_ISSUE_ID_SHIFT | 8) +#define GST_VALIDATE_ISSUE_ID_FILE_PLAYBACK_ERROR (((GstValidateIssueId) GST_VALIDATE_AREA_FILE_CHECK) << GST_VALIDATE_ISSUE_ID_SHIFT | 9) + +#define GST_VALIDATE_ISSUE_ID_ALLOCATION_FAILURE (((GstValidateIssueId) GST_VALIDATE_AREA_RUN_ERROR) << GST_VALIDATE_ISSUE_ID_SHIFT | 1) +#define GST_VALIDATE_ISSUE_ID_MISSING_PLUGIN (((GstValidateIssueId) GST_VALIDATE_AREA_RUN_ERROR) << GST_VALIDATE_ISSUE_ID_SHIFT | 2) + +#define GST_VALIDATE_ISSUE_ID_AREA(id) ((guintptr)(id >> GST_VALIDATE_ISSUE_ID_SHIFT)) + +typedef struct { + GstValidateIssueId issue_id; + + /* Summary: one-liner translatable description of the issue */ + gchar *summary; + /* description: multi-line translatable description of: + * * what the issue is (and why it's an issue) + * * what the source problem could be + * * pointers to fixing the issue + */ + gchar *description; + + /* default_level: The default level of severity for this + * issue. */ + GstValidateReportLevel default_level; + + /* repeat: whether the issue might be triggered + * multiple times but only remembered once */ + gboolean repeat; +} GstValidateIssue; + +#define GST_VALIDATE_ISSUE_AREA(i) (GST_VALIDATE_ISSUE_ID_AREA (gst_validate_issue_get_id (i))) + +typedef struct { + gint refcount; + + /* issue: The issue this report corresponds to (to get dsecription, summary,...) */ + GstValidateIssue *issue; + + GstValidateReportLevel level; + + /* The reporter that reported the issue (to get names, info, ...) */ + GstValidateReporter *reporter; + + /* timestamp: The time at which this issue happened since + * the process start (to stay in sync with gst logging) */ + GstClockTime timestamp; + + /* message: issue-specific message. Gives more detail on the actual + * issue. Can be NULL */ + gchar *message; +} GstValidateReport; + +#define GST_VALIDATE_ISSUE_FORMAT G_GUINTPTR_FORMAT " (%s) : %s(%" G_GUINTPTR_FORMAT "): %s" +#define GST_VALIDATE_ISSUE_ARGS(i) gst_validate_issue_get_id (i), gst_validate_report_level_get_name (i->default_level), \ + gst_validate_report_area_get_name (GST_VALIDATE_ISSUE_AREA (i)), GST_VALIDATE_ISSUE_AREA (i), \ + i->summary + +#define GST_VALIDATE_ERROR_REPORT_PRINT_FORMAT GST_TIME_FORMAT " <%s>: %" GST_VALIDATE_ISSUE_FORMAT ": %s" +#define GST_VALIDATE_REPORT_PRINT_ARGS(r) GST_TIME_ARGS (r->timestamp), \ + gst_validate_reporter_get_name (r->reporter), \ + GST_VALIDATE_ISSUE_ARGS (r->issue), \ + r->message + +void gst_validate_report_init (void); +GstValidateIssue * gst_validate_issue_from_id (GstValidateIssueId issue_id); +GstValidateIssueId gst_validate_issue_get_id (GstValidateIssue * issue); +void gst_validate_issue_register (GstValidateIssue * issue); +GstValidateIssue * gst_validate_issue_new (GstValidateIssueId issue_id, gchar * summary, + gchar * description, + GstValidateReportLevel default_level); + +GstValidateReport * gst_validate_report_new (GstValidateIssue * issue, + GstValidateReporter * reporter, + const gchar * message); +void gst_validate_report_unref (GstValidateReport * report); +GstValidateReport * gst_validate_report_ref (GstValidateReport * report); + +GstValidateIssueId gst_validate_report_get_issue_id (GstValidateReport * report); + +void gst_validate_report_check_abort (GstValidateReport * report); +void gst_validate_report_printf (GstValidateReport * report); + +const gchar * gst_validate_report_level_get_name (GstValidateReportLevel level); +const gchar * gst_validate_report_area_get_name (GstValidateReportArea area); +const gchar * gst_validate_report_subarea_get_name (GstValidateReportArea area, gint subarea); + +G_END_DECLS + +#endif /* __GST_VALIDATE_REPORT_H__ */ + diff --git a/validate/gst/validate/gst-validate-reporter.c b/validate/gst/validate/gst-validate-reporter.c new file mode 100644 index 0000000..4d4a9cd --- /dev/null +++ b/validate/gst/validate/gst-validate-reporter.c @@ -0,0 +1,186 @@ +/* GStreamer + * + * Copyright (C) 2013 Thibault Saunier + * + * 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-validate-reporter.h" +#include "gst-validate-report.h" + +#define REPORTER_PRIVATE "gst-validate-reporter-private" + +GST_DEBUG_CATEGORY_STATIC (gst_validate_reporter); +#define GST_CAT_DEFAULT gst_validate_reporter + +typedef struct _GstValidateReporterPrivate +{ + GstValidateRunner *runner; + GHashTable *reports; + char *name; +} GstValidateReporterPrivate; + +static void +gst_validate_reporter_default_init (GstValidateReporterInterface * iface) +{ + GST_DEBUG_CATEGORY_INIT (gst_validate_reporter, "gstvalidatereporter", + GST_DEBUG_FG_MAGENTA, "gst qa reporter"); + + g_object_interface_install_property (iface, + g_param_spec_object ("qa-runner", "VALIDATE Runner", + "The Validate runner to " "report errors to", + GST_TYPE_VALIDATE_RUNNER, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)); +} + +G_DEFINE_INTERFACE (GstValidateReporter, gst_validate_reporter, G_TYPE_OBJECT); + +static void +_free_priv (GstValidateReporterPrivate * priv) +{ + g_hash_table_unref (priv->reports); + g_free (priv->name); +} + +static GstValidateReporterPrivate * +gst_validate_reporter_get_priv (GstValidateReporter * reporter) +{ + GstValidateReporterPrivate *priv = + g_object_get_data (G_OBJECT (reporter), REPORTER_PRIVATE); + + if (priv == NULL) { + priv = g_slice_new0 (GstValidateReporterPrivate); + priv->reports = g_hash_table_new_full (g_direct_hash, + g_direct_equal, NULL, (GDestroyNotify) gst_validate_report_unref); + + g_object_set_data_full (G_OBJECT (reporter), REPORTER_PRIVATE, priv, + (GDestroyNotify) _free_priv); + } + + return priv; +} + +static void +gst_validate_reporter_intercept_report (GstValidateReporter * reporter, + GstValidateReport * report) +{ + GstValidateReporterInterface *iface = + GST_VALIDATE_REPORTER_GET_INTERFACE (reporter); + + if (iface->intercept_report) { + iface->intercept_report (reporter, report); + } +} + +void +gst_validate_report_valist (GstValidateReporter * reporter, + GstValidateIssueId issue_id, const gchar * format, va_list var_args) +{ + GstValidateReport *report; + gchar *message; + GstValidateIssue *issue; + GstValidateReporterPrivate *priv = gst_validate_reporter_get_priv (reporter); + + issue = gst_validate_issue_from_id (issue_id); + + g_return_if_fail (issue != NULL); + + message = g_strdup_vprintf (format, var_args); + report = gst_validate_report_new (issue, reporter, message); + + gst_validate_reporter_intercept_report (reporter, report); + + if (issue->repeat == FALSE) { + GstValidateIssueId issue_id = gst_validate_issue_get_id (issue); + + if (g_hash_table_lookup (priv->reports, (gconstpointer) issue_id)) { + GST_DEBUG ("Report \"%" G_GUINTPTR_FORMAT ":%s\" already present", + issue_id, issue->summary); + gst_validate_report_unref (report); + return; + } + + g_hash_table_insert (priv->reports, (gpointer) issue_id, report); + } + + if (report->level == GST_VALIDATE_REPORT_LEVEL_CRITICAL) + GST_ERROR ("<%s>: %s", priv->name, message); + else if (report->level == GST_VALIDATE_REPORT_LEVEL_WARNING) + GST_WARNING ("<%s>: %s", priv->name, message); + else if (report->level == GST_VALIDATE_REPORT_LEVEL_ISSUE) + GST_LOG ("<%s>: %s", priv->name, message); + else + GST_DEBUG ("<%s>: %s", priv->name, message); + + GST_INFO_OBJECT (reporter, "Received error report %" GST_VALIDATE_ISSUE_FORMAT + " : %s", GST_VALIDATE_ISSUE_ARGS (issue), message); + gst_validate_report_printf (report); + gst_validate_report_check_abort (report); + + if (priv->runner) { + gst_validate_runner_add_report (priv->runner, report); + } else { + gst_validate_report_unref (report); + } + + g_free (message); +} + +void +gst_validate_report (GstValidateReporter * reporter, + GstValidateIssueId issue_id, const gchar * format, ...) +{ + va_list var_args; + + va_start (var_args, format); + gst_validate_report_valist (reporter, issue_id, format, var_args); + va_end (var_args); +} + +void +gst_validate_reporter_set_name (GstValidateReporter * reporter, gchar * name) +{ + GstValidateReporterPrivate *priv = gst_validate_reporter_get_priv (reporter); + + if (priv->name) + g_free (priv->name); + + priv->name = name; +} + +const gchar * +gst_validate_reporter_get_name (GstValidateReporter * reporter) +{ + GstValidateReporterPrivate *priv = gst_validate_reporter_get_priv (reporter); + + return priv->name; +} + +GstValidateRunner * +gst_validate_reporter_get_runner (GstValidateReporter * reporter) +{ + GstValidateReporterPrivate *priv = gst_validate_reporter_get_priv (reporter); + + return priv->runner; +} + +void +gst_validate_reporter_set_runner (GstValidateReporter * reporter, + GstValidateRunner * runner) +{ + GstValidateReporterPrivate *priv = gst_validate_reporter_get_priv (reporter); + + priv->runner = runner; +} diff --git a/validate/gst/validate/gst-validate-reporter.h b/validate/gst/validate/gst-validate-reporter.h new file mode 100644 index 0000000..75575e7 --- /dev/null +++ b/validate/gst/validate/gst-validate-reporter.h @@ -0,0 +1,83 @@ +/* GStreamer + * + * Copyright (C) 2013 Thibault Saunier + * + * 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. + */ +#ifndef _GST_VALIDATE_REPORTER_ +#define _GST_VALIDATE_REPORTER_ + +#include +#include "gst-validate-runner.h" +#include "gst-validate-report.h" + +G_BEGIN_DECLS + +typedef struct _GstValidateReporter GstValidateReporter; +typedef struct _GstValidateReporterInterface GstValidateReporterInterface; + +/* GstValidateReporter interface declarations */ +#define GST_TYPE_VALIDATE_REPORTER (gst_validate_reporter_get_type ()) +#define GST_VALIDATE_REPORTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_VALIDATE_REPORTER, GstValidateReporter)) +#define GST_IS_VALIDATE_REPORTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_VALIDATE_REPORTER)) +#define GST_VALIDATE_REPORTER_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_VALIDATE_REPORTER, GstValidateReporterInterface)) +#define GST_VALIDATE_REPORTER_CAST(obj) ((GstValidateReporter *) obj) + +#ifdef G_HAVE_ISO_VARARGS +#define GST_VALIDATE_REPORT(m, issue_id, ...) \ +G_STMT_START { \ + gst_validate_report (GST_VALIDATE_REPORTER (m), issue_id, \ + __VA_ARGS__ ); \ +} G_STMT_END + +#else /* G_HAVE_GNUC_VARARGS */ +#ifdef G_HAVE_GNUC_VARARGS +#define GST_VALIDATE_REPORT(m, issue_id, args...) \ +G_STMT_START { \ + gst_validate_report (GST_VALIDATE_REPORTER (m), \ + issue_id, ##args ); \ +} G_STMT_END + +#endif /* G_HAVE_ISO_VARARGS */ +#endif /* G_HAVE_GNUC_VARARGS */ + +GType gst_validate_reporter_get_type (void); + +/** + * GstValidateReporter: + */ +struct _GstValidateReporterInterface +{ + GTypeInterface parent; + + void (*intercept_report)(GstValidateReporter * reporter, GstValidateReport * report); +}; + +void gst_validate_reporter_set_name (GstValidateReporter * reporter, + gchar * name); +const gchar * gst_validate_reporter_get_name (GstValidateReporter * reporter); +GstValidateRunner * gst_validate_reporter_get_runner (GstValidateReporter *reporter); +void gst_validate_reporter_init (GstValidateReporter * reporter, const gchar *name); +void gst_validate_report (GstValidateReporter * reporter, GstValidateIssueId issue_id, + const gchar * format, ...); +void gst_validate_report_valist (GstValidateReporter * reporter, GstValidateIssueId issue_id, + const gchar * format, va_list var_args); + +void gst_validate_reporter_set_runner (GstValidateReporter * reporter, + GstValidateRunner *runner); + +G_END_DECLS +#endif /* _GST_VALIDATE_REPORTER_ */ diff --git a/validate/gst/qa/gst-qa-runner.c b/validate/gst/validate/gst-validate-runner.c similarity index 56% rename from validate/gst/qa/gst-qa-runner.c rename to validate/gst/validate/gst-validate-runner.c index 445e1d1..0a24b5a 100644 --- a/validate/gst/qa/gst-qa-runner.c +++ b/validate/gst/validate/gst-validate-runner.c @@ -1,7 +1,7 @@ /* GStreamer * Copyright (C) 2013 Thiago Santos * - * gst-qa-runner.c - QA Runner class + * gst-validate-runner.c - Validate Runner class * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -19,25 +19,26 @@ * Boston, MA 02111-1307, USA. */ -#include "gst-qa-runner.h" -#include "gst-qa-report.h" -#include "gst-qa-monitor-factory.h" -#include "gst-qa-override-registry.h" +#include "gst-validate-runner.h" +#include "gst-validate-report.h" +#include "gst-validate-monitor-factory.h" +#include "gst-validate-override-registry.h" /** - * SECTION:gst-qa-runner - * @short_description: Class that runs Gst QA tests for a pipeline + * SECTION:gst-validate-runner + * @short_description: Class that runs Gst Validate tests for a pipeline * * TODO */ -GST_DEBUG_CATEGORY_STATIC (gst_qa_runner_debug); -#define GST_CAT_DEFAULT gst_qa_runner_debug +GST_DEBUG_CATEGORY_STATIC (gst_validate_runner_debug); +#define GST_CAT_DEFAULT gst_validate_runner_debug #define _do_init \ - GST_DEBUG_CATEGORY_INIT (gst_qa_runner_debug, "qa_runner", 0, "QA Runner"); -#define gst_qa_runner_parent_class parent_class -G_DEFINE_TYPE_WITH_CODE (GstQaRunner, gst_qa_runner, G_TYPE_OBJECT, _do_init); + GST_DEBUG_CATEGORY_INIT (gst_validate_runner_debug, "qa_runner", 0, "VALIDATE Runner"); +#define gst_validate_runner_parent_class parent_class +G_DEFINE_TYPE_WITH_CODE (GstValidateRunner, gst_validate_runner, G_TYPE_OBJECT, + _do_init); /* signals */ enum @@ -50,53 +51,55 @@ enum static guint _signals[LAST_SIGNAL] = { 0 }; static void -gst_qa_runner_dispose (GObject * object) +gst_validate_runner_dispose (GObject * object) { - GstQaRunner *runner = GST_QA_RUNNER_CAST (object); + GstValidateRunner *runner = GST_VALIDATE_RUNNER_CAST (object); - g_slist_free_full (runner->reports, (GDestroyNotify) gst_qa_report_unref); + g_slist_free_full (runner->reports, + (GDestroyNotify) gst_validate_report_unref); G_OBJECT_CLASS (parent_class)->dispose (object); } static void -gst_qa_runner_class_init (GstQaRunnerClass * klass) +gst_validate_runner_class_init (GstValidateRunnerClass * klass) { GObjectClass *gobject_class; gobject_class = G_OBJECT_CLASS (klass); - gobject_class->dispose = gst_qa_runner_dispose; + gobject_class->dispose = gst_validate_runner_dispose; /* init the report system (can be called multiple times) */ - gst_qa_report_init (); + gst_validate_report_init (); /* Ensure we load overrides before any use of a monitor */ - gst_qa_override_registry_preload (); + gst_validate_override_registry_preload (); _signals[REPORT_ADDED_SIGNAL] = g_signal_new ("report-added", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 1, - GST_TYPE_QA_REPORT); + GST_TYPE_VALIDATE_REPORT); } static void -gst_qa_runner_init (GstQaRunner * runner) +gst_validate_runner_init (GstValidateRunner * runner) { runner->setup = FALSE; } /** - * gst_qa_runner_new: + * gst_validate_runner_new: */ -GstQaRunner * -gst_qa_runner_new (void) +GstValidateRunner * +gst_validate_runner_new (void) { - return g_object_new (GST_TYPE_QA_RUNNER, NULL); + return g_object_new (GST_TYPE_VALIDATE_RUNNER, NULL); } void -gst_qa_runner_add_report (GstQaRunner * runner, GstQaReport * report) +gst_validate_runner_add_report (GstValidateRunner * runner, + GstValidateReport * report) { runner->reports = g_slist_prepend (runner->reports, report); @@ -104,14 +107,14 @@ gst_qa_runner_add_report (GstQaRunner * runner, GstQaReport * report) } guint -gst_qa_runner_get_reports_count (GstQaRunner * runner) +gst_validate_runner_get_reports_count (GstValidateRunner * runner) { g_return_val_if_fail (runner != NULL, 0); return g_slist_length (runner->reports); } GSList * -gst_qa_runner_get_reports (GstQaRunner * runner) +gst_validate_runner_get_reports (GstValidateRunner * runner) { /* TODO should we need locking or put in htte docs to always call this * after pipeline ends? */ diff --git a/validate/gst/validate/gst-validate-runner.h b/validate/gst/validate/gst-validate-runner.h new file mode 100644 index 0000000..b087725 --- /dev/null +++ b/validate/gst/validate/gst-validate-runner.h @@ -0,0 +1,87 @@ +/* GStreamer + * Copyright (C) 2013 Thiago Santos + * + * gst-validate-runner.h - Validate Runner class + * + * 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.1 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. + */ + +#ifndef __GST_VALIDATE_RUNNER_H__ +#define __GST_VALIDATE_RUNNER_H__ + +#include +#include + +#include "gst-validate-report.h" + +G_BEGIN_DECLS + +/* forward declaration */ +typedef struct _GstValidateScenario GstValidateScenario; + +#define GST_TYPE_VALIDATE_RUNNER (gst_validate_runner_get_type ()) +#define GST_IS_VALIDATE_RUNNER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_VALIDATE_RUNNER)) +#define GST_IS_VALIDATE_RUNNER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_VALIDATE_RUNNER)) +#define GST_VALIDATE_RUNNER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_VALIDATE_RUNNER, GstValidateRunnerClass)) +#define GST_VALIDATE_RUNNER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_VALIDATE_RUNNER, GstValidateRunner)) +#define GST_VALIDATE_RUNNER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_VALIDATE_RUNNER, GstValidateRunnerClass)) +#define GST_VALIDATE_RUNNER_CAST(obj) ((GstValidateRunner*)(obj)) +#define GST_VALIDATE_RUNNER_CLASS_CAST(klass) ((GstValidateRunnerClass*)(klass)) + +typedef struct _GstValidateRunner GstValidateRunner; +typedef struct _GstValidateRunnerClass GstValidateRunnerClass; + +/* TODO hide this to be opaque? */ +/** + * GstValidateRunner: + * + * GStreamer Validate Runner class. + * + * Class that manages a Validate test run for some pipeline + */ +struct _GstValidateRunner { + GObject object; + + gboolean setup; + + /*< private >*/ + GSList *reports; +}; + +/** + * GstValidateRunnerClass: + * @parent_class: parent + * + * GStreamer Validate Runner object class. + */ +struct _GstValidateRunnerClass { + GObjectClass parent_class; +}; + +/* normal GObject stuff */ +GType gst_validate_runner_get_type (void); + +GstValidateRunner * gst_validate_runner_new (void); + +void gst_validate_runner_add_report (GstValidateRunner * runner, GstValidateReport * report); + +guint gst_validate_runner_get_reports_count (GstValidateRunner * runner); +GSList * gst_validate_runner_get_reports (GstValidateRunner * runner); + +G_END_DECLS + +#endif /* __GST_VALIDATE_RUNNER_H__ */ + diff --git a/validate/gst/qa/gst-qa-scenario.c b/validate/gst/validate/gst-validate-scenario.c similarity index 77% rename from validate/gst/qa/gst-qa-scenario.c rename to validate/gst/validate/gst-validate-scenario.c index 673d2e9..6439e56 100644 --- a/validate/gst/qa/gst-qa-scenario.c +++ b/validate/gst/validate/gst-validate-scenario.c @@ -1,7 +1,7 @@ /* GStreamer * Copyright (C) 2013 Thibault Saunier * - * gst-qa-scenario.c - QA Scenario class + * gst-validate-scenario.c - Validate Scenario class * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -27,18 +27,18 @@ #include #include -#include "gst-qa-scenario.h" -#include "gst-qa-reporter.h" -#include "gst-qa-report.h" +#include "gst-validate-scenario.h" +#include "gst-validate-reporter.h" +#include "gst-validate-report.h" -#define GST_QA_SCENARIO_GET_PRIVATE(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE ((o), GST_TYPE_QA_SCENARIO, GstQaScenarioPrivate)) +#define GST_VALIDATE_SCENARIO_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), GST_TYPE_VALIDATE_SCENARIO, GstValidateScenarioPrivate)) -#define GST_QA_SCENARIO_SUFFIX ".xml" -#define GST_QA_SCENARIO_DIRECTORY "qa-scenario" +#define GST_VALIDATE_SCENARIO_SUFFIX ".xml" +#define GST_VALIDATE_SCENARIO_DIRECTORY "qa-scenario" -GST_DEBUG_CATEGORY_STATIC (gst_qa_scenario); -#define GST_CAT_DEFAULT gst_qa_scenario +GST_DEBUG_CATEGORY_STATIC (gst_validate_scenario); +#define GST_CAT_DEFAULT gst_validate_scenario #define DEFAULT_SEEK_TOLERANCE (0.1 * GST_SECOND) /* tolerance seek interval @@ -50,13 +50,13 @@ enum PROP_LAST }; -static void gst_qa_scenario_class_init (GstQaScenarioClass * klass); -static void gst_qa_scenario_init (GstQaScenario * scenario); -static void gst_qa_scenario_dispose (GObject * object); -static void gst_qa_scenario_finalize (GObject * object); +static void gst_validate_scenario_class_init (GstValidateScenarioClass * klass); +static void gst_validate_scenario_init (GstValidateScenario * scenario); +static void gst_validate_scenario_dispose (GObject * object); +static void gst_validate_scenario_finalize (GObject * object); -G_DEFINE_TYPE_WITH_CODE (GstQaScenario, gst_qa_scenario, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (GST_TYPE_QA_REPORTER, NULL)); +G_DEFINE_TYPE_WITH_CODE (GstValidateScenario, gst_validate_scenario, + G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (GST_TYPE_VALIDATE_REPORTER, NULL)); typedef enum { @@ -101,10 +101,10 @@ typedef struct _EosInfo ScenarioAction action; } EosInfo; -struct _GstQaScenarioPrivate +struct _GstValidateScenarioPrivate { GstElement *pipeline; - GstQaRunner *runner; + GstValidateRunner *runner; GList *seeks; gint64 seeked_position; /* last seeked position */ @@ -248,9 +248,9 @@ _free_scenario_action (ScenarioAction * act) static inline void _parse_seek (GMarkupParseContext * context, const gchar * element_name, const gchar ** attribute_names, const gchar ** attribute_values, - GstQaScenario * scenario, GError ** error) + GstValidateScenario * scenario, GError ** error) { - GstQaScenarioPrivate *priv = scenario->priv; + GstValidateScenarioPrivate *priv = scenario->priv; const char *format, *rate, *flags, *start_type, *start, *stop_type, *stop; const char *playback_time = NULL; @@ -285,9 +285,9 @@ _parse_seek (GMarkupParseContext * context, const gchar * element_name, static inline void _parse_pause (GMarkupParseContext * context, const gchar * element_name, const gchar ** attribute_names, const gchar ** attribute_values, - GstQaScenario * scenario, GError ** error) + GstValidateScenario * scenario, GError ** error) { - GstQaScenarioPrivate *priv = scenario->priv; + GstValidateScenarioPrivate *priv = scenario->priv; const char *duration = NULL; const char *playback_time = NULL; @@ -310,9 +310,9 @@ _parse_pause (GMarkupParseContext * context, const gchar * element_name, static inline void _parse_eos (GMarkupParseContext * context, const gchar * element_name, const gchar ** attribute_names, const gchar ** attribute_values, - GstQaScenario * scenario, GError ** error) + GstValidateScenario * scenario, GError ** error) { - GstQaScenarioPrivate *priv = scenario->priv; + GstValidateScenarioPrivate *priv = scenario->priv; const char *playback_time = NULL; EosInfo *info = _new_eos_info (); @@ -334,8 +334,9 @@ _parse_element_start (GMarkupParseContext * context, const gchar * element_name, const gchar ** attribute_names, const gchar ** attribute_values, gpointer udata, GError ** error) { - GstQaScenario *scenario = udata; - GstQaScenarioPrivate *priv = GST_QA_SCENARIO_GET_PRIVATE (scenario); + GstValidateScenario *scenario = udata; + GstValidateScenarioPrivate *priv = + GST_VALIDATE_SCENARIO_GET_PRIVATE (scenario); if (strcmp (element_name, "scenario") == 0) { priv->in_scenario = TRUE; @@ -368,8 +369,9 @@ static void _parse_element_end (GMarkupParseContext * context, const gchar * element_name, gpointer udata, GError ** error) { - GstQaScenario *scenario = udata; - GstQaScenarioPrivate *priv = GST_QA_SCENARIO_GET_PRIVATE (scenario); + GstValidateScenario *scenario = udata; + GstValidateScenarioPrivate *priv = + GST_VALIDATE_SCENARIO_GET_PRIVATE (scenario); if (strcmp (element_name, "actions") == 0) { priv->in_actions = FALSE; @@ -379,13 +381,13 @@ _parse_element_end (GMarkupParseContext * context, const gchar * element_name, } static gboolean -_pause_action_restore_playing (GstQaScenario * scenario) +_pause_action_restore_playing (GstValidateScenario * scenario) { GstElement *pipeline = scenario->priv->pipeline; if (gst_element_set_state (pipeline, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) { - GST_QA_REPORT (scenario, GST_QA_ISSUE_ID_STATE_CHANGE_FAILURE, + GST_VALIDATE_REPORT (scenario, GST_VALIDATE_ISSUE_ID_STATE_CHANGE_FAILURE, "Failed to set state to playing"); } @@ -393,9 +395,9 @@ _pause_action_restore_playing (GstQaScenario * scenario) } static void -_execute_action (GstQaScenario * scenario, ScenarioAction * act) +_execute_action (GstValidateScenario * scenario, ScenarioAction * act) { - GstQaScenarioPrivate *priv = scenario->priv; + GstValidateScenarioPrivate *priv = scenario->priv; GstElement *pipeline = scenario->priv->pipeline; if (act->type == SCENARIO_ACTION_SEEK) { @@ -407,7 +409,8 @@ _execute_action (GstQaScenario * scenario, ScenarioAction * act) seek->format, seek->flags, seek->start_type, seek->start, seek->stop_type, seek->stop) == FALSE) { - GST_QA_REPORT (scenario, GST_QA_ISSUE_ID_EVENT_SEEK_NOT_HANDLED, + GST_VALIDATE_REPORT (scenario, + GST_VALIDATE_ISSUE_ID_EVENT_SEEK_NOT_HANDLED, "Could not seek to position %" GST_TIME_FORMAT, GST_TIME_ARGS (priv->seeked_position)); } @@ -421,7 +424,7 @@ _execute_action (GstQaScenario * scenario, ScenarioAction * act) if (gst_element_set_state (pipeline, GST_STATE_PAUSED) == GST_STATE_CHANGE_FAILURE) { - GST_QA_REPORT (scenario, GST_QA_ISSUE_ID_STATE_CHANGE_FAILURE, + GST_VALIDATE_REPORT (scenario, GST_VALIDATE_ISSUE_ID_STATE_CHANGE_FAILURE, "Failed to set state to paused"); } g_timeout_add (pause->duration / GST_MSECOND, @@ -433,12 +436,12 @@ _execute_action (GstQaScenario * scenario, ScenarioAction * act) } static gboolean -get_position (GstQaScenario * scenario) +get_position (GstValidateScenario * scenario) { GList *tmp; gint64 position; GstFormat format = GST_FORMAT_TIME; - GstQaScenarioPrivate *priv = scenario->priv; + GstValidateScenarioPrivate *priv = scenario->priv; GstElement *pipeline = scenario->priv->pipeline; gst_element_query_position (pipeline, &format, &position); @@ -453,7 +456,8 @@ get_position (GstQaScenario * scenario) /* TODO what about non flushing seeks? */ /* TODO why is this inside the action time if ? */ if (GST_CLOCK_TIME_IS_VALID (priv->seeked_position)) - GST_QA_REPORT (scenario, GST_QA_ISSUE_ID_EVENT_SEEK_NOT_HANDLED, + GST_VALIDATE_REPORT (scenario, + GST_VALIDATE_ISSUE_ID_EVENT_SEEK_NOT_HANDLED, "Previous seek to %" GST_TIME_FORMAT " was not handled", GST_TIME_ARGS (priv->seeked_position)); @@ -469,9 +473,10 @@ get_position (GstQaScenario * scenario) } static gboolean -async_done_cb (GstBus * bus, GstMessage * message, GstQaScenario * scenario) +async_done_cb (GstBus * bus, GstMessage * message, + GstValidateScenario * scenario) { - GstQaScenarioPrivate *priv = scenario->priv; + GstValidateScenarioPrivate *priv = scenario->priv; if (GST_CLOCK_TIME_IS_VALID (priv->seeked_position)) { gint64 position; @@ -482,10 +487,10 @@ async_done_cb (GstBus * bus, GstMessage * message, GstQaScenario * scenario) position < (MAX (0, ((gint64) (priv->seeked_position - priv->seek_pos_tol))))) { - GST_QA_REPORT (scenario, GST_QA_ISSUE_ID_EVENT_SEEK_RESULT_POSITION_WRONG, - "Seeked position %" GST_TIME_FORMAT - "not in the expected range [%" GST_TIME_FORMAT " -- %" - GST_TIME_FORMAT, GST_TIME_ARGS (position), + GST_VALIDATE_REPORT (scenario, + GST_VALIDATE_ISSUE_ID_EVENT_SEEK_RESULT_POSITION_WRONG, + "Seeked position %" GST_TIME_FORMAT "not in the expected range [%" + GST_TIME_FORMAT " -- %" GST_TIME_FORMAT, GST_TIME_ARGS (position), GST_TIME_ARGS (((MAX (0, ((gint64) (priv->seeked_position - priv->seek_pos_tol)))))), @@ -498,7 +503,8 @@ async_done_cb (GstBus * bus, GstMessage * message, GstQaScenario * scenario) } static gboolean -_load_scenario_file (GstQaScenario * scenario, const gchar * scenario_file) +_load_scenario_file (GstValidateScenario * scenario, + const gchar * scenario_file) { gsize xmlsize; GFile *file = NULL; @@ -506,7 +512,8 @@ _load_scenario_file (GstQaScenario * scenario, const gchar * scenario_file) gboolean ret = TRUE; gchar *xmlcontent = NULL; GMarkupParseContext *parsecontext = NULL; - GstQaScenarioClass *self_class = GST_QA_SCENARIO_GET_CLASS (scenario); + GstValidateScenarioClass *self_class = + GST_VALIDATE_SCENARIO_GET_CLASS (scenario); gchar *uri = gst_filename_to_uri (scenario_file, &err); if (uri == NULL) @@ -560,7 +567,8 @@ failed: } gboolean -gst_qa_scenario_load (GstQaScenario * scenario, const gchar * scenario_name) +gst_validate_scenario_load (GstValidateScenario * scenario, + const gchar * scenario_name) { gboolean ret = TRUE; gchar *lfilename = NULL, *tldir = NULL; @@ -568,18 +576,19 @@ gst_qa_scenario_load (GstQaScenario * scenario, const gchar * scenario_name) if (!scenario_name) goto invalid_name; - lfilename = g_strdup_printf ("%s" GST_QA_SCENARIO_SUFFIX, scenario_name); + lfilename = + g_strdup_printf ("%s" GST_VALIDATE_SCENARIO_SUFFIX, scenario_name); /* Try from local profiles */ tldir = g_build_filename (g_get_user_data_dir (), "gstreamer-" GST_API_VERSION, - GST_QA_SCENARIO_DIRECTORY, lfilename, NULL); + GST_VALIDATE_SCENARIO_DIRECTORY, lfilename, NULL); if (!(ret = _load_scenario_file (scenario, tldir))) { g_free (tldir); /* Try from system-wide profiles */ tldir = g_build_filename (GST_DATADIR, "gstreamer-" GST_API_VERSION, - GST_QA_SCENARIO_DIRECTORY, lfilename, NULL); + GST_VALIDATE_SCENARIO_DIRECTORY, lfilename, NULL); ret = _load_scenario_file (scenario, tldir); } @@ -609,14 +618,14 @@ invalid_name: static void -gst_qa_scenario_set_property (GObject * object, guint prop_id, +gst_validate_scenario_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { switch (prop_id) { case PROP_RUNNER: /* we assume the runner is valid as long as this scenario is, * no ref taken */ - gst_qa_reporter_set_runner (GST_QA_REPORTER (object), + gst_validate_reporter_set_runner (GST_VALIDATE_REPORTER (object), g_value_get_object (value)); break; default: @@ -625,7 +634,7 @@ gst_qa_scenario_set_property (GObject * object, guint prop_id, } static void -gst_qa_scenario_get_property (GObject * object, guint prop_id, +gst_validate_scenario_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { switch (prop_id) { @@ -633,7 +642,7 @@ gst_qa_scenario_get_property (GObject * object, guint prop_id, /* we assume the runner is valid as long as this scenario is, * no ref taken */ g_value_set_object (value, - gst_qa_reporter_get_runner (GST_QA_REPORTER (object))); + gst_validate_reporter_get_runner (GST_VALIDATE_REPORTER (object))); break; default: break; @@ -641,24 +650,25 @@ gst_qa_scenario_get_property (GObject * object, guint prop_id, } static void -gst_qa_scenario_class_init (GstQaScenarioClass * klass) +gst_validate_scenario_class_init (GstValidateScenarioClass * klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - GST_DEBUG_CATEGORY_INIT (gst_qa_scenario, "gstqascenario", + GST_DEBUG_CATEGORY_INIT (gst_validate_scenario, "gstvalidatescenario", GST_DEBUG_FG_MAGENTA, "gst qa scenario"); - g_type_class_add_private (klass, sizeof (GstQaScenarioPrivate)); + g_type_class_add_private (klass, sizeof (GstValidateScenarioPrivate)); - object_class->dispose = gst_qa_scenario_dispose; - object_class->finalize = gst_qa_scenario_finalize; + object_class->dispose = gst_validate_scenario_dispose; + object_class->finalize = gst_validate_scenario_finalize; - object_class->get_property = gst_qa_scenario_get_property; - object_class->set_property = gst_qa_scenario_set_property; + object_class->get_property = gst_validate_scenario_get_property; + object_class->set_property = gst_validate_scenario_set_property; g_object_class_install_property (object_class, PROP_RUNNER, - g_param_spec_object ("qa-runner", "QA Runner", "The QA runner to " - "report errors to", GST_TYPE_QA_RUNNER, + g_param_spec_object ("qa-runner", "VALIDATE Runner", + "The Validate runner to " "report errors to", + GST_TYPE_VALIDATE_RUNNER, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)); klass->content_parser.start_element = _parse_element_start; @@ -666,10 +676,10 @@ gst_qa_scenario_class_init (GstQaScenarioClass * klass) } static void -gst_qa_scenario_init (GstQaScenario * scenario) +gst_validate_scenario_init (GstValidateScenario * scenario) { - GstQaScenarioPrivate *priv = scenario->priv = - GST_QA_SCENARIO_GET_PRIVATE (scenario); + GstValidateScenarioPrivate *priv = scenario->priv = + GST_VALIDATE_SCENARIO_GET_PRIVATE (scenario); priv->seeked_position = GST_CLOCK_TIME_NONE; @@ -677,40 +687,41 @@ gst_qa_scenario_init (GstQaScenario * scenario) } static void -gst_qa_scenario_dispose (GObject * object) +gst_validate_scenario_dispose (GObject * object) { - GstQaScenarioPrivate *priv = GST_QA_SCENARIO (object)->priv; + GstValidateScenarioPrivate *priv = GST_VALIDATE_SCENARIO (object)->priv; if (priv->pipeline) gst_object_unref (priv->pipeline); g_list_free_full (priv->seeks, (GDestroyNotify) _free_scenario_action); - G_OBJECT_CLASS (gst_qa_scenario_parent_class)->dispose (object); + G_OBJECT_CLASS (gst_validate_scenario_parent_class)->dispose (object); } static void -gst_qa_scenario_finalize (GObject * object) +gst_validate_scenario_finalize (GObject * object) { - G_OBJECT_CLASS (gst_qa_scenario_parent_class)->finalize (object); + G_OBJECT_CLASS (gst_validate_scenario_parent_class)->finalize (object); } -GstQaScenario * -gst_qa_scenario_factory_create (GstQaRunner * runner, GstElement * pipeline, - const gchar * scenario_name) +GstValidateScenario * +gst_validate_scenario_factory_create (GstValidateRunner * runner, + GstElement * pipeline, const gchar * scenario_name) { GstBus *bus; - GstQaScenario *scenario = g_object_new (GST_TYPE_QA_SCENARIO, "qa-runner", + GstValidateScenario *scenario = + g_object_new (GST_TYPE_VALIDATE_SCENARIO, "qa-runner", runner, NULL); GST_LOG ("Creating scenario %s", scenario_name); - if (!gst_qa_scenario_load (scenario, scenario_name)) { + if (!gst_validate_scenario_load (scenario, scenario_name)) { g_object_unref (scenario); return NULL; } scenario->priv->pipeline = gst_object_ref (pipeline); - gst_qa_reporter_set_name (GST_QA_REPORTER (scenario), + gst_validate_reporter_set_name (GST_VALIDATE_REPORTER (scenario), g_strdup (scenario_name)); bus = gst_element_get_bus (pipeline); diff --git a/validate/gst/validate/gst-validate-scenario.h b/validate/gst/validate/gst-validate-scenario.h new file mode 100644 index 0000000..855df60 --- /dev/null +++ b/validate/gst/validate/gst-validate-scenario.h @@ -0,0 +1,65 @@ +/* GStreamer + * Copyright (C) 2013 Thibault Saunier + * + * gst-validate-runner.c - Validate Runner class + * + * 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.1 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. + */ + +#ifndef __GST_VALIDATE_SCENARIO_H__ +#define __GST_VALIDATE_SCENARIO_H__ + +#include +#include +#include "gst-validate-runner.h" + +G_BEGIN_DECLS + +#define GST_TYPE_VALIDATE_SCENARIO (gst_validate_scenario_get_type ()) +#define GST_VALIDATE_SCENARIO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_VALIDATE_SCENARIO, GstValidateScenario)) +#define GST_VALIDATE_SCENARIO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_VALIDATE_SCENARIO, GstValidateScenarioClass)) +#define GST_IS_VALIDATE_SCENARIO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_VALIDATE_SCENARIO)) +#define GST_IS_VALIDATE_SCENARIO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_VALIDATE_SCENARIO)) +#define GST_VALIDATE_SCENARIO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_VALIDATE_SCENARIO, GstValidateScenarioClass)) + +typedef struct _GstValidateScenario GstValidateScenario; +typedef struct _GstValidateScenarioClass GstValidateScenarioClass; +typedef struct _GstValidateScenarioPrivate GstValidateScenarioPrivate; + + +struct _GstValidateScenarioClass +{ + GObjectClass parent_class; + + GMarkupParser content_parser; +}; + +struct _GstValidateScenario +{ + GObject parent; + + GstValidateScenarioPrivate *priv; +}; + +GType gst_validate_scenario_get_type (void); + +GstValidateScenario * gst_validate_scenario_factory_create (GstValidateRunner *runner, + GstElement *pipeline, + const gchar *scenario_name); + +G_END_DECLS + +#endif /* __GST_VALIDATE_SCENARIOS__ */ diff --git a/validate/gst/qa/gst-qa-transcoding.c b/validate/gst/validate/gst-validate-transcoding.c similarity index 91% rename from validate/gst/qa/gst-qa-transcoding.c rename to validate/gst/validate/gst-validate-transcoding.c index 8edbaf9..60cb42a 100644 --- a/validate/gst/qa/gst-qa-transcoding.c +++ b/validate/gst/validate/gst-validate-transcoding.c @@ -10,10 +10,10 @@ #include #include -#include +#include #include -#include "gst-qa-file-checker.h" +#include "gst-validate-file-checker.h" static GMainLoop *mainloop; @@ -34,7 +34,7 @@ bus_callback (GstBus * bus, GstMessage * message, gpointer data) if (new == GST_STATE_PLAYING) { GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (pipeline), - GST_DEBUG_GRAPH_SHOW_ALL, "gst-qa-transcode.playing"); + GST_DEBUG_GRAPH_SHOW_ALL, "gst-validate-transcode.playing"); } } @@ -243,8 +243,8 @@ int main (int argc, gchar ** argv) { GstBus *bus; - GstQaRunner *runner; - GstQaMonitor *monitor; + GstValidateRunner *runner; + GstValidateMonitor *monitor; GOptionContext *ctx; GError *err = NULL; @@ -263,7 +263,7 @@ main (int argc, gchar ** argv) "video/webm:video/x-vp8|:audio/x-vorbis\n", "properties-values"}, {"set-scenario", '\0', 0, G_OPTION_ARG_STRING, &scenario, - "Let you set a scenario, it will override the GST_QA_SCENARIO " + "Let you set a scenario, it will override the GST_VALIDATE_SCENARIO " "environment variable", NULL}, {"run-file-checks", 'c', 0, G_OPTION_ARG_NONE, &run_file_checks, "If post file transcoding checks should be run", @@ -271,7 +271,7 @@ main (int argc, gchar ** argv) {NULL} }; - ctx = g_option_context_new ("- runs QA transcoding test."); + ctx = g_option_context_new ("- runs Validate transcoding test."); g_option_context_add_main_entries (ctx, options, NULL); if (!g_option_context_parse (ctx, &argc, &argv, &err)) { @@ -283,14 +283,14 @@ main (int argc, gchar ** argv) g_option_context_free (ctx); if (scenario) - g_setenv ("GST_QA_SCENARIO", scenario, TRUE); + g_setenv ("GST_VALIDATE_SCENARIO", scenario, TRUE); gst_init (&argc, &argv); if (argc != 3) { g_printerr ("%i arguments recived, 2 expected.\n" "You should run the test using:\n" - " ./gst-qa-transcoding-0.10 [options]\n", + " ./gst-validate-transcoding-0.10 [options]\n", argc - 1); return 1; } @@ -305,13 +305,14 @@ main (int argc, gchar ** argv) /* Create the pipeline */ create_transcoding_pipeline (argv[1], argv[2]); - runner = gst_qa_runner_new (); + runner = gst_validate_runner_new (); monitor = - gst_qa_monitor_factory_create (GST_OBJECT_CAST (pipeline), runner, NULL); + gst_validate_monitor_factory_create (GST_OBJECT_CAST (pipeline), runner, + NULL); mainloop = g_main_loop_new (NULL, FALSE); if (!runner) { - g_printerr ("Failed to setup QA Runner\n"); + g_printerr ("Failed to setup Validate Runner\n"); exit (1); } @@ -325,7 +326,7 @@ main (int argc, gchar ** argv) goto exit; g_main_loop_run (mainloop); - count = gst_qa_runner_get_reports_count (runner); + count = gst_validate_runner_get_reports_count (runner); g_print ("Pipeline finished, total issues found: %u\n", count); exit: @@ -336,10 +337,11 @@ exit: g_object_unref (pipeline); if (run_file_checks) { - GstQaFileChecker *fc = g_object_new (GST_TYPE_QA_FILE_CHECKER, "uri", + GstValidateFileChecker *fc = + g_object_new (GST_TYPE_VALIDATE_FILE_CHECKER, "uri", argv[2], "profile", encoding_profile, "test-playback", TRUE, NULL); - if (!gst_qa_file_checker_run (fc)) { + if (!gst_validate_file_checker_run (fc)) { g_print ("Failed file checking\n"); } diff --git a/validate/gst/qa/gst-qa.c b/validate/gst/validate/gst-validate.c similarity index 81% rename from validate/gst/qa/gst-qa.c rename to validate/gst/validate/gst-validate.c index a05324f..6aee502 100644 --- a/validate/gst/qa/gst-qa.c +++ b/validate/gst/validate/gst-validate.c @@ -10,7 +10,7 @@ #include #include -#include +#include static GMainLoop *mainloop; static GstElement *pipeline; @@ -50,17 +50,17 @@ main (int argc, gchar ** argv) GOptionEntry options[] = { {"set-scenario", '\0', 0, G_OPTION_ARG_STRING, &scenario, - "Let you set a scenario, it will override the GST_QA_SCENARIO " + "Let you set a scenario, it will override the GST_VALIDATE_SCENARIO " "environment variable", NULL}, {NULL} }; GOptionContext *ctx; gchar **argvn; - GstQaRunner *runner; - GstQaMonitor *monitor; + GstValidateRunner *runner; + GstValidateMonitor *monitor; GstBus *bus; - ctx = g_option_context_new ("- runs QA tests for a pipeline."); + ctx = g_option_context_new ("- runs Validate tests for a pipeline."); g_option_context_add_main_entries (ctx, options, NULL); if (argc == 1) { @@ -75,7 +75,7 @@ main (int argc, gchar ** argv) } if (scenario) { - g_setenv ("GST_QA_SCENARIO", scenario, TRUE); + g_setenv ("GST_VALIDATE_SCENARIO", scenario, TRUE); } g_option_context_free (ctx); @@ -88,13 +88,14 @@ main (int argc, gchar ** argv) pipeline = (GstElement *) gst_parse_launchv ((const gchar **) argvn, &err); g_free (argvn); - runner = gst_qa_runner_new (); + runner = gst_validate_runner_new (); monitor = - gst_qa_monitor_factory_create (GST_OBJECT_CAST (pipeline), runner, NULL); + gst_validate_monitor_factory_create (GST_OBJECT_CAST (pipeline), runner, + NULL); mainloop = g_main_loop_new (NULL, FALSE); if (!runner) { - g_printerr ("Failed to setup QA Runner\n"); + g_printerr ("Failed to setup Validate Runner\n"); exit (1); } @@ -108,7 +109,7 @@ main (int argc, gchar ** argv) goto exit; g_main_loop_run (mainloop); - count = gst_qa_runner_get_reports_count (runner); + count = gst_validate_runner_get_reports_count (runner); g_print ("Pipeline finished, issues found: %u\n", count); exit: diff --git a/validate/gst/validate/validate.h b/validate/gst/validate/validate.h new file mode 100644 index 0000000..63a5a6b --- /dev/null +++ b/validate/gst/validate/validate.h @@ -0,0 +1,8 @@ +/* GStreamer + * Copyright (C) 2013 Thiago Santos + */ + +#include +#include +#include + -- 2.7.4