* @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);
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);
/* 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
* @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);
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);
/* 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
#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);
}
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
PROP_0,
PROP_OBJECT,
PROP_RUNNER,
+ PROP_QA_PARENT,
PROP_LAST
};
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);
}
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 *
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;
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);
#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))
* 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 >*/
* @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);
struct _GstQaPadMonitor {
GstQaMonitor parent;
+ GstQaElementMonitor *element_monitor;
+
gboolean setup;
GstPad *pad;
/* 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
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;