diff --git a/validate/gst/qa/Makefile.am b/validate/gst/qa/Makefile.am index a7f308c31e..3656d63fa0 100644 --- a/validate/gst/qa/Makefile.am +++ b/validate/gst/qa/Makefile.am @@ -12,6 +12,7 @@ c_sources = \ gst-qa-report.c \ gst-qa-scenario.c \ gst-qa-override.c \ + gst-qa-override-registry.c \ gst-qa-monitor-preload.c noinst_HEADERS = diff --git a/validate/gst/qa/gst-qa-bin-monitor.c b/validate/gst/qa/gst-qa-bin-monitor.c index 6ef4270548..b44b28ecb1 100644 --- a/validate/gst/qa/gst-qa-bin-monitor.c +++ b/validate/gst/qa/gst-qa-bin-monitor.c @@ -154,8 +154,9 @@ gst_qa_bin_monitor_wrap_element (GstQaBinMonitor * monitor, GST_DEBUG_OBJECT (monitor, "Wrapping element %s", GST_ELEMENT_NAME (element)); element_monitor = - gst_qa_monitor_factory_create (element, - GST_QA_MONITOR_GET_RUNNER (monitor), GST_QA_MONITOR_CAST (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))); g_return_if_fail (element_monitor != NULL); GST_QA_MONITOR_LOCK (monitor); diff --git a/validate/gst/qa/gst-qa-element-monitor.c b/validate/gst/qa/gst-qa-element-monitor.c index 00c01fe14c..30e1e8d3b1 100644 --- a/validate/gst/qa/gst-qa-element-monitor.c +++ b/validate/gst/qa/gst-qa-element-monitor.c @@ -42,6 +42,7 @@ G_DEFINE_TYPE_WITH_CODE (GstQaElementMonitor, gst_qa_element_monitor, 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, @@ -74,6 +75,7 @@ gst_qa_element_monitor_class_init (GstQaElementMonitorClass * 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 @@ -104,6 +106,12 @@ gst_qa_element_monitor_new (GstElement * element, GstQaRunner * runner, 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) { diff --git a/validate/gst/qa/gst-qa-monitor-factory.c b/validate/gst/qa/gst-qa-monitor-factory.c index 14ed708b0e..85793c27e2 100644 --- a/validate/gst/qa/gst-qa-monitor-factory.c +++ b/validate/gst/qa/gst-qa-monitor-factory.c @@ -21,18 +21,31 @@ #include "gst-qa-monitor-factory.h" #include "gst-qa-bin-monitor.h" +#include "gst-qa-pad-monitor.h" +#include "gst-qa-override-registry.h" -GstQaElementMonitor * -gst_qa_monitor_factory_create (GstElement * element, GstQaRunner * runner, +GstQaMonitor * +gst_qa_monitor_factory_create (GstObject * target, GstQaRunner * runner, GstQaMonitor * parent) { - g_return_val_if_fail (element != NULL, NULL); + GstQaMonitor *monitor = NULL; + g_return_val_if_fail (target != NULL, NULL); - if (GST_IS_BIN (element)) { - return - GST_QA_ELEMENT_MONITOR_CAST (gst_qa_bin_monitor_new (GST_BIN_CAST - (element), runner, parent)); + 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))); + } else if (GST_IS_BIN (target)) { + monitor = + GST_QA_MONITOR_CAST (gst_qa_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)); } - return gst_qa_element_monitor_new (element, runner, parent); + g_return_val_if_fail (target != NULL, NULL); + gst_qa_override_registry_attach_overrides (monitor); + return monitor; } diff --git a/validate/gst/qa/gst-qa-monitor-factory.h b/validate/gst/qa/gst-qa-monitor-factory.h index df7abd0d8e..48a4ef421e 100644 --- a/validate/gst/qa/gst-qa-monitor-factory.h +++ b/validate/gst/qa/gst-qa-monitor-factory.h @@ -24,12 +24,12 @@ #include #include -#include "gst-qa-element-monitor.h" +#include "gst-qa-monitor.h" #include "gst-qa-runner.h" G_BEGIN_DECLS -GstQaElementMonitor * gst_qa_monitor_factory_create (GstElement * element, GstQaRunner * runner, GstQaMonitor * parent); +GstQaMonitor * gst_qa_monitor_factory_create (GstObject * target, GstQaRunner * runner, GstQaMonitor * parent); G_END_DECLS diff --git a/validate/gst/qa/gst-qa-monitor.c b/validate/gst/qa/gst-qa-monitor.c index 0a543610b3..76769a6137 100644 --- a/validate/gst/qa/gst-qa-monitor.c +++ b/validate/gst/qa/gst-qa-monitor.c @@ -75,6 +75,7 @@ gst_qa_monitor_dispose (GObject * object) GstQaMonitor *monitor = GST_QA_MONITOR_CAST (object); g_mutex_clear (&monitor->mutex); + g_queue_clear (&monitor->overrides); if (monitor->target) g_object_weak_unref (G_OBJECT (monitor->target), @@ -138,6 +139,7 @@ gst_qa_monitor_init (GstQaMonitor * monitor) { g_mutex_init (&monitor->mutex); + g_queue_init (&monitor->overrides); } /** @@ -173,6 +175,29 @@ gst_qa_monitor_setup (GstQaMonitor * monitor) return GST_QA_MONITOR_GET_CLASS (monitor)->setup (monitor); } +const gchar * +gst_qa_monitor_get_element_name (GstQaMonitor * monitor) +{ + GstQaMonitorClass *klass = GST_QA_MONITOR_GET_CLASS (monitor); + GstElement *element = NULL; + + if (klass->get_element) + element = klass->get_element (monitor); + + if (element) + return GST_ELEMENT_NAME (element); + return NULL; +} + +void +gst_qa_monitor_attach_override (GstQaMonitor * monitor, + GstQaOverride * override) +{ + GST_QA_MONITOR_LOCK (monitor); + g_queue_push_tail (&monitor->overrides, override); + GST_QA_MONITOR_UNLOCK (monitor); +} + static void gst_qa_monitor_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) diff --git a/validate/gst/qa/gst-qa-monitor.h b/validate/gst/qa/gst-qa-monitor.h index d45ba10f61..550817c731 100644 --- a/validate/gst/qa/gst-qa-monitor.h +++ b/validate/gst/qa/gst-qa-monitor.h @@ -26,6 +26,7 @@ #include #include "gst-qa-report.h" #include "gst-qa-runner.h" +#include "gst-qa-override.h" G_BEGIN_DECLS @@ -71,6 +72,8 @@ struct _GstQaMonitor { GstQaRunner *runner; + GQueue overrides; + /*< private >*/ GHashTable *reports; }; @@ -85,11 +88,17 @@ 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); + +const gchar * gst_qa_monitor_get_element_name (GstQaMonitor * monitor); + G_END_DECLS #endif /* __GST_QA_MONITOR_H__ */ diff --git a/validate/gst/qa/gst-qa-override-registry.c b/validate/gst/qa/gst-qa-override-registry.c new file mode 100644 index 0000000000..2a51450200 --- /dev/null +++ b/validate/gst/qa/gst-qa-override-registry.c @@ -0,0 +1,100 @@ +/* GStreamer + * Copyright (C) 2013 Thiago Santos + * + * gst-qa-override-registry.c - QA Override Registry + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include + +#include "gst-qa-override-registry.h" + +typedef struct +{ + gchar *name; + GstQaOverride *override; +} GstQaOverrideRegistryNameEntry; + +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) + +static GstQaOverrideRegistry * +gst_qa_override_registry_new (void) +{ + GstQaOverrideRegistry *reg = g_slice_new0 (GstQaOverrideRegistry); + + g_mutex_init (®->mutex); + g_queue_init (®->name_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); +} + +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); + } + } +} + +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_UNLOCK (reg); +} diff --git a/validate/gst/qa/gst-qa-override-registry.h b/validate/gst/qa/gst-qa-override-registry.h new file mode 100644 index 0000000000..69d26cbccc --- /dev/null +++ b/validate/gst/qa/gst-qa-override-registry.h @@ -0,0 +1,48 @@ +/* GStreamer + * Copyright (C) 2013 Thiago Santos + * + * gst-qa-override-registry.h - 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. + */ + +#ifndef __GST_QA_OVERRIDE_REGISTRY_H__ +#define __GST_QA_OVERRIDE_REGISTRY_H__ + +#include +#include +#include "gst-qa-report.h" +#include "gst-qa-monitor.h" +#include "gst-qa-override.h" + +G_BEGIN_DECLS + +typedef struct { + GMutex mutex; + + GQueue name_overrides; +} GstQaOverrideRegistry; + +GstQaOverrideRegistry * gst_qa_override_registry_get (void); + +void gst_qa_override_register_by_name (const gchar * name, GstQaOverride * override); + +void gst_qa_override_registry_attach_overrides (GstQaMonitor * monitor); + +G_END_DECLS + +#endif /* __GST_QA_OVERRIDE_REGISTRY_H__ */ + diff --git a/validate/gst/qa/gst-qa-pad-monitor.c b/validate/gst/qa/gst-qa-pad-monitor.c index 733e3066e0..81c46f7de6 100644 --- a/validate/gst/qa/gst-qa-pad-monitor.c +++ b/validate/gst/qa/gst-qa-pad-monitor.c @@ -96,6 +96,7 @@ _serialized_event_data_free (SerializedEventData * serialized_event) } static gboolean gst_qa_pad_monitor_do_setup (GstQaMonitor * monitor); +static GstElement *gst_qa_pad_monitor_get_element (GstQaMonitor * monitor); /* This was copied from gstpad.c and might need * updating whenever it changes in core */ @@ -526,6 +527,7 @@ gst_qa_pad_monitor_class_init (GstQaPadMonitorClass * klass) gobject_class->dispose = gst_qa_pad_monitor_dispose; monitor_klass->setup = gst_qa_pad_monitor_do_setup; + monitor_klass->get_element = gst_qa_pad_monitor_get_element; } static void @@ -562,6 +564,14 @@ gst_qa_pad_monitor_new (GstPad * pad, GstQaRunner * runner, return monitor; } +static GstElement * +gst_qa_pad_monitor_get_element (GstQaMonitor * monitor) +{ + GstPad *pad = GST_QA_PAD_MONITOR_GET_PAD (monitor); + + return GST_PAD_PARENT (pad); +} + static gboolean gst_qa_pad_monitor_timestamp_is_in_received_range (GstQaPadMonitor * monitor, GstClockTime ts) diff --git a/validate/gst/qa/gst-qa-pad-monitor.h b/validate/gst/qa/gst-qa-pad-monitor.h index 18010a8f38..8c77457765 100644 --- a/validate/gst/qa/gst-qa-pad-monitor.h +++ b/validate/gst/qa/gst-qa-pad-monitor.h @@ -29,6 +29,9 @@ G_BEGIN_DECLS +/* forward declaratin */ +typedef struct _GstQaElementMonitor GstQaElementMonitor; + #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)) @@ -43,6 +46,7 @@ G_BEGIN_DECLS typedef struct _GstQaPadMonitor GstQaPadMonitor; typedef struct _GstQaPadMonitorClass GstQaPadMonitorClass; + /** * GstQaPadMonitor: * diff --git a/validate/gst/qa/gst-qa-runner.c b/validate/gst/qa/gst-qa-runner.c index cb296b0a8b..377164a144 100644 --- a/validate/gst/qa/gst-qa-runner.c +++ b/validate/gst/qa/gst-qa-runner.c @@ -22,6 +22,7 @@ #include "gst-qa-runner.h" #include "gst-qa-report.h" #include "gst-qa-monitor-factory.h" +#include "gst-qa-element-monitor.h" #include "gst-qa-scenario.h" /** @@ -131,7 +132,8 @@ gst_qa_runner_setup (GstQaRunner * runner) GST_INFO_OBJECT (runner, "Starting QA Runner setup"); runner->monitor = - gst_qa_monitor_factory_create (runner->pipeline, runner, NULL); + gst_qa_monitor_factory_create (GST_OBJECT_CAST (runner->pipeline), runner, + NULL); if (runner->monitor == NULL) { GST_WARNING_OBJECT (runner, "Setup failed"); return FALSE; diff --git a/validate/gst/qa/gst-qa-runner.h b/validate/gst/qa/gst-qa-runner.h index 4ab0e9f4f6..38b867f11d 100644 --- a/validate/gst/qa/gst-qa-runner.h +++ b/validate/gst/qa/gst-qa-runner.h @@ -30,7 +30,7 @@ G_BEGIN_DECLS /* forward declaration */ -typedef struct _GstQaElementMonitor GstQaElementMonitor; +typedef struct _GstQaMonitor GstQaMonitor; typedef struct _GstQaScenario GstQaScenario; #define GST_TYPE_QA_RUNNER (gst_qa_runner_get_type ()) @@ -60,7 +60,7 @@ struct _GstQaRunner { /*< private >*/ GstElement *pipeline; - GstQaElementMonitor *monitor; + GstQaMonitor *monitor; GstQaScenario *scenario; GSList *reports;