From cb6b45d375c85e0d23d5ac737c647b05c42477da Mon Sep 17 00:00:00 2001 From: Thiago Santos Date: Fri, 12 Jul 2013 16:02:25 -0300 Subject: [PATCH] qa-monitor: add parent relation for monitors 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 | 7 ++++--- validate/gst/qa/gst-qa-bin-monitor.h | 2 +- validate/gst/qa/gst-qa-element-monitor.c | 8 +++++--- validate/gst/qa/gst-qa-element-monitor.h | 2 +- validate/gst/qa/gst-qa-monitor-factory.c | 7 ++++--- validate/gst/qa/gst-qa-monitor-factory.h | 2 +- validate/gst/qa/gst-qa-monitor.c | 25 ++++++++++++++++-------- validate/gst/qa/gst-qa-monitor.h | 9 ++++++--- validate/gst/qa/gst-qa-pad-monitor.c | 6 ++++-- validate/gst/qa/gst-qa-pad-monitor.h | 4 +++- validate/gst/qa/gst-qa-runner.c | 3 ++- 11 files changed, 48 insertions(+), 27 deletions(-) diff --git a/validate/gst/qa/gst-qa-bin-monitor.c b/validate/gst/qa/gst-qa-bin-monitor.c index f063f81e6d..1beae76ed7 100644 --- a/validate/gst/qa/gst-qa-bin-monitor.c +++ b/validate/gst/qa/gst-qa-bin-monitor.c @@ -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); diff --git a/validate/gst/qa/gst-qa-bin-monitor.h b/validate/gst/qa/gst-qa-bin-monitor.h index 633f22de46..955ec2ed70 100644 --- a/validate/gst/qa/gst-qa-bin-monitor.h +++ b/validate/gst/qa/gst-qa-bin-monitor.h @@ -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 diff --git a/validate/gst/qa/gst-qa-element-monitor.c b/validate/gst/qa/gst-qa-element-monitor.c index 802bf63504..ce7b7b9c98 100644 --- a/validate/gst/qa/gst-qa-element-monitor.c +++ b/validate/gst/qa/gst-qa-element-monitor.c @@ -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); diff --git a/validate/gst/qa/gst-qa-element-monitor.h b/validate/gst/qa/gst-qa-element-monitor.h index 94891dc7ed..5afb3575c6 100644 --- a/validate/gst/qa/gst-qa-element-monitor.h +++ b/validate/gst/qa/gst-qa-element-monitor.h @@ -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 diff --git a/validate/gst/qa/gst-qa-monitor-factory.c b/validate/gst/qa/gst-qa-monitor-factory.c index eea9ba3d76..14ed708b0e 100644 --- a/validate/gst/qa/gst-qa-monitor-factory.c +++ b/validate/gst/qa/gst-qa-monitor-factory.c @@ -23,15 +23,16 @@ #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); } diff --git a/validate/gst/qa/gst-qa-monitor-factory.h b/validate/gst/qa/gst-qa-monitor-factory.h index fe7ebcb69e..df7abd0d8e 100644 --- a/validate/gst/qa/gst-qa-monitor-factory.h +++ b/validate/gst/qa/gst-qa-monitor-factory.h @@ -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 diff --git a/validate/gst/qa/gst-qa-monitor.c b/validate/gst/qa/gst-qa-monitor.c index 6cee777996..55d699fbe9 100644 --- a/validate/gst/qa/gst-qa-monitor.c +++ b/validate/gst/qa/gst-qa-monitor.c @@ -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); diff --git a/validate/gst/qa/gst-qa-monitor.h b/validate/gst/qa/gst-qa-monitor.h index 64f0f661bb..32815e34fb 100644 --- a/validate/gst/qa/gst-qa-monitor.h +++ b/validate/gst/qa/gst-qa-monitor.h @@ -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 >*/ diff --git a/validate/gst/qa/gst-qa-pad-monitor.c b/validate/gst/qa/gst-qa-pad-monitor.c index 38002d97da..392b7d9854 100644 --- a/validate/gst/qa/gst-qa-pad-monitor.c +++ b/validate/gst/qa/gst-qa-pad-monitor.c @@ -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); diff --git a/validate/gst/qa/gst-qa-pad-monitor.h b/validate/gst/qa/gst-qa-pad-monitor.h index f7f6a2f353..6ae12f833a 100644 --- a/validate/gst/qa/gst-qa-pad-monitor.h +++ b/validate/gst/qa/gst-qa-pad-monitor.h @@ -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 diff --git a/validate/gst/qa/gst-qa-runner.c b/validate/gst/qa/gst-qa-runner.c index 9784e78677..79390ba155 100644 --- a/validate/gst/qa/gst-qa-runner.c +++ b/validate/gst/qa/gst-qa-runner.c @@ -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;