static GObject * gst_validate_monitor_constructor (GType type, guint n_construct_params, GObjectConstructParam * construct_params) { GstObject *target; GstValidateMonitor *monitor = GST_VALIDATE_MONITOR_CAST (G_OBJECT_CLASS (parent_class)->constructor (type, n_construct_params, construct_params)); if (monitor->parent) { GstPipeline *parent_pipeline = gst_validate_monitor_get_pipeline (monitor->parent); gst_validate_monitor_set_media_descriptor (monitor, monitor->parent->media_descriptor); if (parent_pipeline) { g_weak_ref_init (&monitor->pipeline, parent_pipeline); gst_object_unref (parent_pipeline); } } gst_validate_override_registry_attach_overrides (monitor); gst_validate_monitor_setup (monitor); target = gst_validate_monitor_get_target (monitor); g_object_set_data ((GObject *) target, "validate-monitor", monitor); gst_object_unref (target); return (GObject *) monitor; }
static void gst_validate_bin_set_media_descriptor (GstValidateMonitor * monitor, GstValidateMediaDescriptor * media_descriptor) { GList *tmp; GST_VALIDATE_MONITOR_LOCK (monitor); for (tmp = GST_VALIDATE_BIN_MONITOR_CAST (monitor)->element_monitors; tmp; tmp = tmp->next) gst_validate_monitor_set_media_descriptor (tmp->data, media_descriptor); GST_VALIDATE_MONITOR_UNLOCK (monitor); GST_VALIDATE_MONITOR_CLASS (parent_class)->set_media_descriptor (monitor, media_descriptor); }
static GObject * gst_validate_monitor_constructor (GType type, guint n_construct_params, GObjectConstructParam * construct_params) { GstValidateMonitor *monitor = GST_VALIDATE_MONITOR_CAST (G_OBJECT_CLASS (parent_class)->constructor (type, n_construct_params, construct_params)); if (monitor->parent) { gst_validate_monitor_set_media_descriptor (monitor, monitor->parent->media_descriptor); } gst_validate_monitor_setup (monitor); return (GObject *) monitor; }
static void gst_validate_element_set_media_descriptor (GstValidateMonitor * monitor, GstValidateMediaDescriptor * media_descriptor) { gboolean done; GstPad *pad; GstValidateMonitor *pmonitor; GstIterator *iterator; GstElement *elem = GST_ELEMENT (gst_validate_monitor_get_target (monitor)); iterator = gst_element_iterate_pads (elem); gst_object_unref (elem); done = FALSE; while (!done) { GValue value = { 0, }; switch (gst_iterator_next (iterator, &value)) { case GST_ITERATOR_OK: pad = g_value_get_object (&value); pmonitor = g_object_get_data ((GObject *) pad, "validate-monitor"); if (pmonitor) gst_validate_monitor_set_media_descriptor (pmonitor, media_descriptor); g_value_reset (&value); break; case GST_ITERATOR_RESYNC: /* TODO how to handle this? */ gst_iterator_resync (iterator); break; case GST_ITERATOR_ERROR: done = TRUE; break; case GST_ITERATOR_DONE: done = TRUE; break; } } gst_iterator_free (iterator); }
static void _check_media_info (GstSegment * segment, BufferDesc * bufs) { GList *reports; GstEvent *segev; GstBuffer *buffer; GstElement *decoder; GstPad *srcpad, *sinkpad; GstValidateReport *report; GstValidateMonitor *monitor; GstValidateRunner *runner; GstMediaDescriptor *mdesc; GError *err = NULL; gint i, num_issues = 0; fail_unless (g_setenv ("GST_VALIDATE_REPORTING_DETAILS", "all", TRUE)); runner = gst_validate_runner_new (); mdesc = (GstMediaDescriptor *) gst_media_descriptor_parser_new_from_xml (runner, media_info, &err); decoder = fake_decoder_new (); monitor = gst_validate_monitor_factory_create (GST_OBJECT (decoder), runner, NULL); gst_validate_monitor_set_media_descriptor (monitor, mdesc); srcpad = gst_pad_new ("src", GST_PAD_SRC); sinkpad = decoder->sinkpads->data; ASSERT_OBJECT_REFCOUNT (sinkpad, "decoder ref", 1); fail_unless (gst_pad_activate_mode (srcpad, GST_PAD_MODE_PUSH, TRUE)); fail_unless_equals_int (gst_element_set_state (decoder, GST_STATE_PLAYING), GST_STATE_CHANGE_SUCCESS); assert_equals_string (gst_pad_link_get_name (gst_pad_link (srcpad, sinkpad)), gst_pad_link_get_name (GST_PAD_LINK_OK)); gst_check_setup_events_with_stream_id (srcpad, decoder, gst_caps_from_string ("video/x-fake"), GST_FORMAT_TIME, "the-stream"); if (segment) { segev = gst_event_new_segment (segment); fail_unless (gst_pad_push_event (srcpad, segev)); } for (i = 0; bufs[i].content != NULL; i++) { BufferDesc *buf = &bufs[i]; buffer = _create_buffer (buf); assert_equals_string (gst_flow_get_name (gst_pad_push (srcpad, buffer)), gst_flow_get_name (GST_FLOW_OK)); reports = gst_validate_runner_get_reports (runner); num_issues += buf->num_issues; assert_equals_int (g_list_length (reports), num_issues); if (buf->num_issues) { GList *tmp = g_list_nth (reports, num_issues - buf->num_issues); while (tmp) { report = tmp->data; fail_unless_equals_int (report->level, GST_VALIDATE_REPORT_LEVEL_WARNING); fail_unless_equals_int (report->issue->issue_id, WRONG_BUFFER); tmp = tmp->next; } } } /* clean up */ fail_unless (gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PUSH, FALSE)); fail_unless_equals_int (gst_element_set_state (decoder, GST_STATE_NULL), GST_STATE_CHANGE_SUCCESS); gst_object_unref (srcpad); check_destroyed (decoder, sinkpad, NULL); check_destroyed (runner, NULL, NULL); }