# 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;
# 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'
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
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])
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 ***
common/Makefile
common/m4/Makefile
gst/Makefile
-gst/qa/Makefile
+gst/validate/Makefile
data/Makefile
po/Makefile.in
])
Prefix : ${prefix}
Compiler : ${CC}
-gst-qa configured. Type 'make' to build.
+gst-validate configured. Type 'make' to build.
"
-SUBDIRS = qa
+SUBDIRS = validate
+++ /dev/null
-gst-qa-0.10
-gst-qa-transcoding-0.10
-gst-qa-file-check-0.10
+++ /dev/null
-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 =
+++ /dev/null
-/* GStreamer
- * Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
- *
- * 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 <glib-object.h>
-#include <gst/gst.h>
-#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__ */
-
+++ /dev/null
-/* GStreamer
- * Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
- *
- * 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 <string.h>
-
-/**
- * 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);
-}
+++ /dev/null
-/* GStreamer
- * Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
- *
- * 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 <glib-object.h>
-#include <gst/gst.h>
-
-#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__ */
-
+++ /dev/null
-/* GStreamer
- * Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
- *
- * 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 <gst/gst.h>
-#include <gst/pbutils/pbutils.h>
-
-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;
-
- /* <File checking data> */
- /* 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__ */
-
+++ /dev/null
-/* GStreamer
- * Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
- *
- * 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;
- }
-}
+++ /dev/null
-/* GStreamer
- * Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
- *
- * 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 <glib-object.h>
-#include <gst/gst.h>
-#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__ */
-
+++ /dev/null
-/* GStreamer
- * Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
- *
- * 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 <string.h>
-
-#define __USE_GNU
-#include <dlfcn.h>
-
-#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;
-}
+++ /dev/null
-/* GStreamer
- * Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
- *
- * 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 <glib-object.h>
-#include <gst/gst.h>
-#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__ */
-
+++ /dev/null
-/* GStreamer
- * Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
- *
- * 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 <string.h>
-#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));
-}
+++ /dev/null
-/* GStreamer
- * Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
- *
- * 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 <glib-object.h>
-#include <gst/gst.h>
-
-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__ */
-
+++ /dev/null
-/* GStreamer
- *
- * Copyright (C) 2013 Thibault Saunier <thibault.saunier@collabora.com>
- *
- * 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;
-}
+++ /dev/null
-/* GStreamer
- *
- * Copyright (C) 2013 Thibault Saunier <thibault.saunier@collabora.com>
- *
- * 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 <glib-object.h>
-#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_ */
+++ /dev/null
-/* GStreamer
- * Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
- *
- * 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 <glib-object.h>
-#include <gst/gst.h>
-
-#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__ */
-
+++ /dev/null
-/* GStreamer
- * Copyright (C) 2013 Thibault Saunier <thibault.saunier@collabora.com>
- *
- * 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 <glib.h>
-#include <glib-object.h>
-#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__ */
+++ /dev/null
-/* GStreamer
- * Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
- */
-
-#include <gst/qa/gst-qa-runner.h>
-#include <gst/qa/gst-qa-file-checker.h>
-#include <gst/qa/gst-qa-monitor-factory.h>
-
--- /dev/null
+gst-validate-0.10
+gst-validate-transcoding-0.10
+gst-validate-file-check-0.10
--- /dev/null
+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 =
/* GStreamer
* Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
*
- * 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
* 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);
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 "
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:
}
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);
}
--- /dev/null
+/* GStreamer
+ * Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
+ *
+ * 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 <glib-object.h>
+#include <gst/gst.h>
+#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__ */
+
/* GStreamer
* Copyright (C) 2013 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
*
- * 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
#include "config.h"
#endif
#include <stdio.h>
-#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;
}
--- /dev/null
+/* GStreamer
+ * Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
+ *
+ * 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 <string.h>
+
+/**
+ * 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);
+}
--- /dev/null
+/* GStreamer
+ * Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
+ *
+ * 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 <glib-object.h>
+#include <gst/gst.h>
+
+#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__ */
+
#include <string.h>
#include <gst/gst.h>
-#include <gst/qa/qa.h>
+#include <gst/validate/validate.h>
#include <gst/pbutils/encoding-profile.h>
static GstEncodingProfile *encoding_profile = NULL;
int
main (int argc, gchar ** argv)
{
- GstQaRunner *runner;
+ GstValidateRunner *runner;
GOptionContext *ctx;
- GstQaFileChecker *fc;
+ GstValidateFileChecker *fc;
GError *err = NULL;
guint count = -1;
{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)) {
if (argc != 2) {
g_printerr ("%i arguments recived, 1 expected.\n"
"You should run the test using:\n"
- " ./gst-qa-file-check-0.10 <uri> [options]\n", argc - 1);
+ " ./gst-validate-file-check-0.10 <uri> [options]\n", argc - 1);
return 1;
}
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,
"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);
/* GStreamer
* Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
*
- * 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
# 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 <glib/gstdio.h>
#include <gst/pbutils/pbutils.h>
#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)
}
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,
}
static void
-gst_qa_file_checker_init (GstQaFileChecker * fc)
+gst_validate_file_checker_init (GstValidateFileChecker * fc)
{
fc->uri = NULL;
fc->profile = NULL;
}
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:
}
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);
}
static gboolean
-check_file_size (GstQaFileChecker * fc)
+check_file_size (GstValidateFileChecker * fc)
{
GStatBuf statbuf;
gchar *filepath;
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;
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);
}
static gboolean
-check_file_duration (GstQaFileChecker * fc, GstDiscovererInfo * info)
+check_file_duration (GstValidateFileChecker * fc, GstDiscovererInfo * info)
{
GstClockTime real_duration;
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),
}
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;
} 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;
}
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;
}
static gboolean
-check_encoding_profile (GstQaFileChecker * fc, GstDiscovererInfo * info)
+check_encoding_profile (GstValidateFileChecker * fc, GstDiscovererInfo * info)
{
GstEncodingProfile *profile = fc->profile;
GstDiscovererStreamInfo *stream;
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);
}
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;
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,
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;
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);
}
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);
}
static gboolean
-check_playback (GstQaFileChecker * fc)
+check_playback (GstValidateFileChecker * fc)
{
if (!fc->test_playback)
return TRUE;
}
static gboolean
-send_reverse_seek (GstQaFileChecker * fc, GstElement * pipeline)
+send_reverse_seek (GstValidateFileChecker * fc, GstElement * pipeline)
{
gboolean ret;
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;
}
gboolean
-gst_qa_file_checker_run (GstQaFileChecker * fc)
+gst_validate_file_checker_run (GstValidateFileChecker * fc)
{
GError *err = NULL;
GstDiscovererInfo *info;
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;
}
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;
--- /dev/null
+/* GStreamer
+ * Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
+ *
+ * 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 <gst/gst.h>
+#include <gst/pbutils/pbutils.h>
+
+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;
+
+ /* <File checking data> */
+ /* 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__ */
+
/* GStreamer
* Copyright (C) 2004 Thomas Vander Stichele <thomas@apestaart.org>
*
- * 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
*/
-#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.
#endif
-#endif /* __GST_QA_I18N_LIB_H__ */
+#endif /* __GST_VALIDATE_I18N_LIB_H__ */
/* GStreamer
* Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
*
- * 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
* 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;
}
/* GStreamer
* Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
*
- * 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
* 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 <glib-object.h>
#include <gst/gst.h>
-#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__ */
/* GStreamer
* Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
*
- * 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
#include <gst/gst.h>
#include <string.h>
-#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 <dlfcn.h>
-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 *
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;
}
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;
}
element = gst_parse_launchv_real (argv, error);
if (GST_IS_PIPELINE (element)) {
- gst_qa_preload_wrap (element);
+ gst_validate_preload_wrap (element);
}
return element;
}
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;
}
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;
}
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;
}
--- /dev/null
+/* GStreamer
+ * Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
+ *
+ * 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;
+ }
+}
--- /dev/null
+/* GStreamer
+ * Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
+ *
+ * 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 <glib-object.h>
+#include <gst/gst.h>
+#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__ */
+
--- /dev/null
+/* GStreamer
+ * Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
+ *
+ * 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 <string.h>
+
+#define __USE_GNU
+#include <dlfcn.h>
+
+#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;
+}
/* GStreamer
* Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
*
- * 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
* 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 <glib-object.h>
#include <gst/gst.h>
-#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
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__ */
/* GStreamer
* Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
*
- * 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
#include <string.h>
-#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);
}
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);
/*
* 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;
}
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);
--- /dev/null
+/* GStreamer
+ * Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
+ *
+ * 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 <glib-object.h>
+#include <gst/gst.h>
+#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__ */
+
/* GStreamer
* Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
*
- * 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
* 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 <gst/gst.h>
#include <string.h>
#include <stdarg.h>
/**
- * 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"
* 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"); \
} \
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 */
static void
-_check_field_type (GstQaPadMonitor * monitor, GstStructure * structure,
+_check_field_type (GstValidatePadMonitor * monitor, GstStructure * structure,
const gchar * field, ...)
{
va_list var_args;
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;
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)),
}
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);
}
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);
}
static void
-gst_qa_pad_monitor_check_caps_complete (GstQaPadMonitor * monitor,
+gst_validate_pad_monitor_check_caps_complete (GstValidatePadMonitor * monitor,
GstCaps * caps)
{
GstStructure *structure;
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;
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)) {
}
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);
}
}
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;
}
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);
}
}
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))
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;
}
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)
}
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);
}
/**
- * 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;
}
}
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
/* 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;
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))) {
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)) {
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;
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));
}
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));
}
}
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);
}
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)) {
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);
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);
}
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)) {
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:
}
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);
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:
}
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:
}
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:
/* 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);
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);
}
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));
}
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);
}
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));
}
}
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;
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)) {
}
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) {
|| (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");
}
}
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)) {
}
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;
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)) {
}
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 */
}
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;
} 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);
}
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);
}
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)) &&
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),
}
}
- 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;
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;
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);
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);
}
}
- 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");
}
}
}
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");
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);
/* GStreamer
* Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
*
- * 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
* 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 <glib-object.h>
#include <gst/gst.h>
-#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;
};
/**
- * 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__ */
--- /dev/null
+/* GStreamer
+ * Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
+ *
+ * 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 <string.h>
+#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));
+}
--- /dev/null
+/* GStreamer
+ * Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
+ *
+ * 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 <glib-object.h>
+#include <gst/gst.h>
+
+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__ */
+
--- /dev/null
+/* GStreamer
+ *
+ * Copyright (C) 2013 Thibault Saunier <thibault.saunier@collabora.com>
+ *
+ * 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;
+}
--- /dev/null
+/* GStreamer
+ *
+ * Copyright (C) 2013 Thibault Saunier <thibault.saunier@collabora.com>
+ *
+ * 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 <glib-object.h>
+#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_ */
/* GStreamer
* Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
*
- * 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
* 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
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);
}
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? */
--- /dev/null
+/* GStreamer
+ * Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
+ *
+ * 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 <glib-object.h>
+#include <gst/gst.h>
+
+#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__ */
+
/* GStreamer
* Copyright (C) 2013 Thibault Saunier <thibault.saunier@collabora.com>
*
- * 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
#include <gio/gio.h>
#include <string.h>
-#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
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
{
ScenarioAction action;
} EosInfo;
-struct _GstQaScenarioPrivate
+struct _GstValidateScenarioPrivate
{
GstElement *pipeline;
- GstQaRunner *runner;
+ GstValidateRunner *runner;
GList *seeks;
gint64 seeked_position; /* last seeked position */
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;
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;
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 ();
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;
_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;
}
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");
}
}
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) {
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));
}
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,
}
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);
/* 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));
}
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;
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)))))),
}
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;
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)
}
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;
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);
}
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:
}
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) {
/* 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;
}
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;
}
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;
}
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);
--- /dev/null
+/* GStreamer
+ * Copyright (C) 2013 Thibault Saunier <thibault.saunier@collabora.com>
+ *
+ * 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 <glib.h>
+#include <glib-object.h>
+#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__ */
#include <string.h>
#include <gst/gst.h>
-#include <gst/qa/qa.h>
+#include <gst/validate/validate.h>
#include <gst/pbutils/encoding-profile.h>
-#include "gst-qa-file-checker.h"
+#include "gst-validate-file-checker.h"
static GMainLoop *mainloop;
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");
}
}
main (int argc, gchar ** argv)
{
GstBus *bus;
- GstQaRunner *runner;
- GstQaMonitor *monitor;
+ GstValidateRunner *runner;
+ GstValidateMonitor *monitor;
GOptionContext *ctx;
GError *err = NULL;
"video/webm:video/x-vp8|<presence>: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",
{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)) {
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 <input-file> <output-file> [options]\n",
+ " ./gst-validate-transcoding-0.10 <input-file> <output-file> [options]\n",
argc - 1);
return 1;
}
/* 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);
}
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:
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");
}
#include <string.h>
#include <gst/gst.h>
-#include <gst/qa/qa.h>
+#include <gst/validate/validate.h>
static GMainLoop *mainloop;
static GstElement *pipeline;
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) {
}
if (scenario) {
- g_setenv ("GST_QA_SCENARIO", scenario, TRUE);
+ g_setenv ("GST_VALIDATE_SCENARIO", scenario, TRUE);
}
g_option_context_free (ctx);
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);
}
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:
--- /dev/null
+/* GStreamer
+ * Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
+ */
+
+#include <gst/validate/gst-validate-runner.h>
+#include <gst/validate/gst-validate-file-checker.h>
+#include <gst/validate/gst-validate-monitor-factory.h>
+