diff --git a/validate/gst/qa/gst-qa-monitor.c b/validate/gst/qa/gst-qa-monitor.c index 1059210300..46fc1358b5 100644 --- a/validate/gst/qa/gst-qa-monitor.c +++ b/validate/gst/qa/gst-qa-monitor.c @@ -188,8 +188,8 @@ 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) +GstElement * +gst_qa_monitor_get_element (GstQaMonitor * monitor) { GstQaMonitorClass *klass = GST_QA_MONITOR_GET_CLASS (monitor); GstElement *element = NULL; @@ -197,6 +197,15 @@ gst_qa_monitor_get_element_name (GstQaMonitor * monitor) if (klass->get_element) element = klass->get_element (monitor); + return element; +} + +const gchar * +gst_qa_monitor_get_element_name (GstQaMonitor * monitor) +{ + GstElement *element; + + element = gst_qa_monitor_get_element (monitor); if (element) return GST_ELEMENT_NAME (element); return NULL; diff --git a/validate/gst/qa/gst-qa-monitor.h b/validate/gst/qa/gst-qa-monitor.h index 3ec28c36bf..8486ac1b4e 100644 --- a/validate/gst/qa/gst-qa-monitor.h +++ b/validate/gst/qa/gst-qa-monitor.h @@ -98,6 +98,7 @@ GType gst_qa_monitor_get_type (void); void gst_qa_monitor_attach_override (GstQaMonitor * monitor, GstQaOverride * override); +GstElement * gst_qa_monitor_get_element (GstQaMonitor * monitor); const gchar * gst_qa_monitor_get_element_name (GstQaMonitor * monitor); G_END_DECLS diff --git a/validate/gst/qa/gst-qa-override-registry.c b/validate/gst/qa/gst-qa-override-registry.c index 2a51450200..8c13188482 100644 --- a/validate/gst/qa/gst-qa-override-registry.c +++ b/validate/gst/qa/gst-qa-override-registry.c @@ -29,6 +29,12 @@ typedef struct GstQaOverride *override; } GstQaOverrideRegistryNameEntry; +typedef struct +{ + GType gtype; + GstQaOverride *override; +} GstQaOverrideRegistryGTypeEntry; + static GMutex _gst_qa_override_registry_mutex; static GstQaOverrideRegistry *_registry_default; @@ -42,6 +48,8 @@ gst_qa_override_registry_new (void) g_mutex_init (®->mutex); g_queue_init (®->name_overrides); + g_queue_init (®->gtype_overrides); + g_queue_init (®->klass_overrides); return reg; } @@ -72,6 +80,35 @@ gst_qa_override_register_by_name (const gchar * name, GstQaOverride * override) GST_QA_OVERRIDE_REGISTRY_UNLOCK (registry); } +void +gst_qa_override_register_by_type (GType gtype, GstQaOverride * override) +{ + GstQaOverrideRegistry *registry = gst_qa_override_registry_get (); + GstQaOverrideRegistryGTypeEntry *entry = + g_slice_new (GstQaOverrideRegistryGTypeEntry); + + GST_QA_OVERRIDE_REGISTRY_LOCK (registry); + entry->gtype = gtype; + entry->override = override; + g_queue_push_tail (®istry->gtype_overrides, entry); + GST_QA_OVERRIDE_REGISTRY_UNLOCK (registry); +} + +void +gst_qa_override_register_by_klass (const gchar * klass, + 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 (klass); + entry->override = override; + g_queue_push_tail (®istry->klass_overrides, entry); + GST_QA_OVERRIDE_REGISTRY_UNLOCK (registry); +} + static void gst_qa_override_registry_attach_name_overrides_unlocked (GstQaOverrideRegistry * registry, GstQaMonitor * monitor) @@ -89,6 +126,50 @@ gst_qa_override_registry_attach_name_overrides_unlocked (GstQaOverrideRegistry * } } +static void +gst_qa_override_registry_attach_gtype_overrides_unlocked (GstQaOverrideRegistry + * registry, GstQaMonitor * monitor) +{ + GstQaOverrideRegistryGTypeEntry *entry; + GstElement *element; + GList *iter; + + element = gst_qa_monitor_get_element (monitor); + if (!element) + return; + + for (iter = registry->name_overrides.head; iter; iter = g_list_next (iter)) { + entry = iter->data; + if (G_TYPE_CHECK_INSTANCE_TYPE (element, entry->gtype)) { + gst_qa_monitor_attach_override (monitor, entry->override); + } + } +} + +static void +gst_qa_override_registry_attach_klass_overrides_unlocked (GstQaOverrideRegistry + * registry, GstQaMonitor * monitor) +{ + GstQaOverrideRegistryNameEntry *entry; + GList *iter; + GstElement *element; + GstElementClass *klass; + + element = gst_qa_monitor_get_element (monitor); + if (!element) + return; + + klass = GST_ELEMENT_GET_CLASS (element); + + for (iter = registry->name_overrides.head; iter; iter = g_list_next (iter)) { + entry = iter->data; + /* TODO It would be more correct to split it before comparing */ + if (strstr (klass->details.klass, entry->name) != NULL) { + gst_qa_monitor_attach_override (monitor, entry->override); + } + } +} + void gst_qa_override_registry_attach_overrides (GstQaMonitor * monitor) { @@ -96,5 +177,7 @@ gst_qa_override_registry_attach_overrides (GstQaMonitor * monitor) GST_QA_OVERRIDE_REGISTRY_LOCK (reg); gst_qa_override_registry_attach_name_overrides_unlocked (reg, monitor); + gst_qa_override_registry_attach_gtype_overrides_unlocked (reg, monitor); + gst_qa_override_registry_attach_klass_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 index 69d26cbccc..6401ff3ef1 100644 --- a/validate/gst/qa/gst-qa-override-registry.h +++ b/validate/gst/qa/gst-qa-override-registry.h @@ -34,11 +34,15 @@ typedef struct { GMutex mutex; GQueue name_overrides; + GQueue gtype_overrides; + GQueue klass_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_register_by_type (GType gtype, GstQaOverride * override); +void gst_qa_override_register_by_klass (const gchar * klass, GstQaOverride * override); void gst_qa_override_registry_attach_overrides (GstQaMonitor * monitor);