qa-monitor: add parent relation for monitors
authorThiago Santos <thiago.sousa.santos@collabora.com>
Fri, 12 Jul 2013 19:02:25 +0000 (16:02 -0300)
committerThiago Santos <thiago.sousa.santos@collabora.com>
Fri, 12 Jul 2013 19:02:25 +0000 (16:02 -0300)
This is useful because Pad monitors will have to ask the
parent element monitors for some element details for
doing checks

validate/gst/qa/gst-qa-bin-monitor.c
validate/gst/qa/gst-qa-bin-monitor.h
validate/gst/qa/gst-qa-element-monitor.c
validate/gst/qa/gst-qa-element-monitor.h
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-pad-monitor.c
validate/gst/qa/gst-qa-pad-monitor.h
validate/gst/qa/gst-qa-runner.c

index f063f81..1beae76 100644 (file)
@@ -86,10 +86,11 @@ gst_qa_bin_monitor_init (GstQaBinMonitor * bin_monitor)
  * @bin: (transfer-none): a #GstBin to run QA on
  */
 GstQaBinMonitor *
-gst_qa_bin_monitor_new (GstBin * bin, GstQaRunner * runner)
+gst_qa_bin_monitor_new (GstBin * bin, GstQaRunner * runner,
+    GstQaMonitor * parent)
 {
   GstQaBinMonitor *monitor = g_object_new (GST_TYPE_QA_BIN_MONITOR, "object",
-      bin, "qa-runner", runner, NULL);
+      bin, "qa-runner", runner, "qa-parent", parent, NULL);
 
   if (GST_QA_MONITOR_GET_OBJECT (monitor) == NULL) {
     g_object_unref (monitor);
@@ -154,7 +155,7 @@ gst_qa_bin_monitor_wrap_element (GstQaBinMonitor * monitor,
 
   element_monitor =
       gst_qa_monitor_factory_create (element,
-      GST_QA_MONITOR_GET_RUNNER (monitor));
+      GST_QA_MONITOR_GET_RUNNER (monitor), GST_QA_MONITOR_CAST (monitor));
   g_return_if_fail (element_monitor != NULL);
 
   GST_QA_MONITOR_LOCK (monitor);
index 633f22d..955ec2e 100644 (file)
@@ -72,7 +72,7 @@ struct _GstQaBinMonitorClass {
 /* normal GObject stuff */
 GType          gst_qa_bin_monitor_get_type             (void);
 
-GstQaBinMonitor *   gst_qa_bin_monitor_new      (GstBin * bin, GstQaRunner * runner);
+GstQaBinMonitor *   gst_qa_bin_monitor_new      (GstBin * bin, GstQaRunner * runner, GstQaMonitor * parent);
 
 G_END_DECLS
 
index 802bf63..ce7b7b9 100644 (file)
@@ -86,14 +86,15 @@ gst_qa_element_monitor_init (GstQaElementMonitor * element_monitor)
  * @element: (transfer-none): a #GstElement to run QA on
  */
 GstQaElementMonitor *
-gst_qa_element_monitor_new (GstElement * element, GstQaRunner * runner)
+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, NULL);
+      "qa-runner", runner, "qa-parent", parent, NULL);
 
   if (GST_QA_ELEMENT_MONITOR_GET_ELEMENT (monitor) == NULL) {
     g_object_unref (monitor);
@@ -172,7 +173,8 @@ gst_qa_element_monitor_wrap_pad (GstQaElementMonitor * monitor, GstPad * pad)
   GST_DEBUG_OBJECT (monitor, "Wrapping pad %s:%s", GST_DEBUG_PAD_NAME (pad));
 
   pad_monitor =
-      gst_qa_pad_monitor_new (pad, GST_QA_MONITOR_GET_RUNNER (monitor));
+      gst_qa_pad_monitor_new (pad, GST_QA_MONITOR_GET_RUNNER (monitor),
+      monitor);
   g_return_if_fail (pad_monitor != NULL);
 
   GST_QA_MONITOR_LOCK (monitor);
index 94891dc..5afb357 100644 (file)
@@ -73,7 +73,7 @@ struct _GstQaElementMonitorClass {
 /* normal GObject stuff */
 GType          gst_qa_element_monitor_get_type         (void);
 
-GstQaElementMonitor *   gst_qa_element_monitor_new      (GstElement * element, GstQaRunner * runner);
+GstQaElementMonitor *   gst_qa_element_monitor_new      (GstElement * element, GstQaRunner * runner, GstQaMonitor * parent);
 
 G_END_DECLS
 
index eea9ba3..14ed708 100644 (file)
 #include "gst-qa-bin-monitor.h"
 
 GstQaElementMonitor *
-gst_qa_monitor_factory_create (GstElement * element, GstQaRunner * runner)
+gst_qa_monitor_factory_create (GstElement * element, GstQaRunner * runner,
+    GstQaMonitor * parent)
 {
   g_return_val_if_fail (element != NULL, NULL);
 
   if (GST_IS_BIN (element)) {
     return
         GST_QA_ELEMENT_MONITOR_CAST (gst_qa_bin_monitor_new (GST_BIN_CAST
-            (element), runner));
+            (element), runner, parent));
   }
 
-  return gst_qa_element_monitor_new (element, runner);
+  return gst_qa_element_monitor_new (element, runner, parent);
 }
index fe7ebcb..df7abd0 100644 (file)
@@ -29,7 +29,7 @@
 
 G_BEGIN_DECLS
 
-GstQaElementMonitor *       gst_qa_monitor_factory_create (GstElement * element, GstQaRunner * runner);
+GstQaElementMonitor *       gst_qa_monitor_factory_create (GstElement * element, GstQaRunner * runner, GstQaMonitor * parent);
 
 G_END_DECLS
 
index 6cee777..55d699f 100644 (file)
@@ -33,6 +33,7 @@ enum
   PROP_0,
   PROP_OBJECT,
   PROP_RUNNER,
+  PROP_QA_PARENT,
   PROP_LAST
 };
 
@@ -64,8 +65,8 @@ gst_qa_monitor_dispose (GObject * object)
 
   g_mutex_clear (&monitor->mutex);
 
-  if (monitor->object)
-    g_object_unref (monitor->object);
+  if (monitor->target)
+    g_object_unref (monitor->target);
 
   G_OBJECT_CLASS (parent_class)->dispose (object);
 }
@@ -92,6 +93,11 @@ gst_qa_monitor_class_init (GstQaMonitorClass * klass)
       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 *
@@ -155,14 +161,17 @@ gst_qa_monitor_set_property (GObject * object, guint prop_id,
 
   switch (prop_id) {
     case PROP_OBJECT:
-      g_assert (monitor->object == NULL);
-      monitor->object = g_value_dup_object (value);
+      g_assert (monitor->target == NULL);
+      monitor->target = g_value_dup_object (value);
       break;
     case PROP_RUNNER:
       /* we assume the runner is valid as long as this monitor is,
        * no ref taken */
       monitor->runner = 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;
@@ -182,10 +191,10 @@ gst_qa_monitor_get_property (GObject * object, guint prop_id,
       g_value_set_object (value, GST_QA_MONITOR_GET_OBJECT (monitor));
       break;
     case PROP_RUNNER:
-      if (GST_QA_MONITOR_GET_RUNNER (monitor))
-        g_value_set_object (value, GST_QA_MONITOR_GET_RUNNER (monitor));
-      else
-        g_value_set_object (value, NULL);
+      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);
index 64f0f66..32815e3 100644 (file)
@@ -38,8 +38,9 @@ G_BEGIN_DECLS
 #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)->object)
+#define GST_QA_MONITOR_GET_OBJECT(m) (GST_QA_MONITOR_CAST (m)->target)
 #define GST_QA_MONITOR_GET_RUNNER(m) (GST_QA_MONITOR_CAST (m)->runner)
+#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))
 
@@ -54,11 +55,13 @@ typedef struct _GstQaMonitorClass GstQaMonitorClass;
  * Class that wraps a #GObject for QA checks
  */
 struct _GstQaMonitor {
-  GObject       parent;
+  GObject       object;
 
-  GstObject     *object;
+  GstObject     *target;
   GMutex         mutex;
 
+  GstQaMonitor  *parent;
+
   GstQaRunner   *runner;
 
   /*< private >*/
index 38002d9..392b7d9 100644 (file)
@@ -77,10 +77,12 @@ gst_qa_pad_monitor_init (GstQaPadMonitor * pad_monitor)
  * @pad: (transfer-none): a #GstPad to run QA on
  */
 GstQaPadMonitor *
-gst_qa_pad_monitor_new (GstPad * pad, GstQaRunner * runner)
+gst_qa_pad_monitor_new (GstPad * pad, GstQaRunner * runner,
+    GstQaElementMonitor * parent)
 {
   GstQaPadMonitor *monitor = g_object_new (GST_TYPE_QA_PAD_MONITOR,
-      "object", pad, "qa-runner", runner, NULL);
+      "object", pad, "qa-runner", runner, "qa-parent",
+      parent, NULL);
 
   if (GST_QA_PAD_MONITOR_GET_PAD (monitor) == NULL) {
     g_object_unref (monitor);
index f7f6a2f..6ae12f8 100644 (file)
@@ -53,6 +53,8 @@ typedef struct _GstQaPadMonitorClass GstQaPadMonitorClass;
 struct _GstQaPadMonitor {
   GstQaMonitor          parent;
 
+  GstQaElementMonitor *element_monitor;
+
   gboolean       setup;
   GstPad        *pad;
 
@@ -88,7 +90,7 @@ struct _GstQaPadMonitorClass {
 /* normal GObject stuff */
 GType          gst_qa_pad_monitor_get_type             (void);
 
-GstQaPadMonitor *   gst_qa_pad_monitor_new      (GstPad * pad, GstQaRunner * runner);
+GstQaPadMonitor *   gst_qa_pad_monitor_new      (GstPad * pad, GstQaRunner * runner, GstQaElementMonitor *element_monitor);
 
 G_END_DECLS
 
index 9784e78..79390ba 100644 (file)
@@ -91,7 +91,8 @@ gst_qa_runner_setup (GstQaRunner * runner)
     return TRUE;
 
   GST_INFO_OBJECT (runner, "Starting QA Runner setup");
-  runner->monitor = gst_qa_monitor_factory_create (runner->pipeline, runner);
+  runner->monitor =
+      gst_qa_monitor_factory_create (runner->pipeline, runner, NULL);
   if (runner->monitor == NULL) {
     GST_WARNING_OBJECT (runner, "Setup failed");
     return FALSE;