gst-qa-override-registry: adding the override-registry
authorThiago Santos <thiago.sousa.santos@collabora.com>
Fri, 26 Jul 2013 22:05:31 +0000 (19:05 -0300)
committerThiago Santos <thiago.sousa.santos@collabora.com>
Mon, 29 Jul 2013 12:53:54 +0000 (09:53 -0300)
This registry should contain the list of GstQaOverride to
be used on the pipelines being monitored

13 files changed:
validate/gst/qa/Makefile.am
validate/gst/qa/gst-qa-bin-monitor.c
validate/gst/qa/gst-qa-element-monitor.c
validate/gst/qa/gst-qa-monitor-factory.c
validate/gst/qa/gst-qa-monitor-factory.h
validate/gst/qa/gst-qa-monitor.c
validate/gst/qa/gst-qa-monitor.h
validate/gst/qa/gst-qa-override-registry.c [new file with mode: 0644]
validate/gst/qa/gst-qa-override-registry.h [new file with mode: 0644]
validate/gst/qa/gst-qa-pad-monitor.c
validate/gst/qa/gst-qa-pad-monitor.h
validate/gst/qa/gst-qa-runner.c
validate/gst/qa/gst-qa-runner.h

index a7f308c..3656d63 100644 (file)
@@ -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 =
index 6ef4270..b44b28e 100644 (file)
@@ -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);
index 00c01fe..30e1e8d 100644 (file)
@@ -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)
 {
index 14ed708..85793c2 100644 (file)
 
 #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;
 }
index df7abd0..48a4ef4 100644 (file)
 
 #include <glib-object.h>
 #include <gst/gst.h>
-#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
 
index 0a54361..76769a6 100644 (file)
@@ -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)
index d45ba10..550817c 100644 (file)
@@ -26,6 +26,7 @@
 #include <gst/gst.h>
 #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 (file)
index 0000000..2a51450
--- /dev/null
@@ -0,0 +1,100 @@
+/* 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>
+
+#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 (&reg->mutex);
+  g_queue_init (&reg->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 (&registry->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 (file)
index 0000000..69d26cb
--- /dev/null
@@ -0,0 +1,48 @@
+/* GStreamer
+ * Copyright (C) 2013 Thiago Santos <thiago.sousa.santos@collabora.com>
+ *
+ * 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 <glib-object.h>
+#include <gst/gst.h>
+#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__ */
+
index 733e306..81c46f7 100644 (file)
@@ -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)
index 18010a8..8c77457 100644 (file)
@@ -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:
  *
index cb296b0..377164a 100644 (file)
@@ -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;
index 4ab0e9f..38b867f 100644 (file)
@@ -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;