static void gst_validate_pipeline_monitor_create_scenarios (GstValidateBinMonitor * monitor) { /* scenarios currently only make sense for pipelines */ const gchar *scenario_name; if ((scenario_name = g_getenv ("GST_VALIDATE_SCENARIO"))) { gchar **scenario_v = g_strsplit (scenario_name, "->", 2); if (scenario_v[1] && GST_VALIDATE_MONITOR_GET_OBJECT (monitor)) { if (!g_pattern_match_simple (scenario_v[1], GST_OBJECT_NAME (GST_VALIDATE_MONITOR_GET_OBJECT (monitor)))) { GST_INFO_OBJECT (monitor, "Not attaching to pipeline %" GST_PTR_FORMAT " as not matching pattern %s", GST_VALIDATE_MONITOR_GET_OBJECT (monitor), scenario_v[1]); g_strfreev (scenario_v); return; } } monitor->scenario = gst_validate_scenario_factory_create (GST_VALIDATE_MONITOR_GET_RUNNER (monitor), GST_ELEMENT_CAST (GST_VALIDATE_MONITOR_GET_OBJECT (monitor)), scenario_v[0]); g_strfreev (scenario_v); } }
/** * gst_validate_pipeline_monitor_new: * @pipeline: (transfer none): a #GstPipeline to run Validate on */ GstValidatePipelineMonitor * gst_validate_pipeline_monitor_new (GstPipeline * pipeline, GstValidateRunner * runner, GstValidateMonitor * parent) { GstBus *bus; GstValidatePipelineMonitor *monitor = g_object_new (GST_TYPE_VALIDATE_PIPELINE_MONITOR, "object", pipeline, "validate-runner", runner, "validate-parent", parent, "pipeline", pipeline, NULL); if (GST_VALIDATE_MONITOR_GET_OBJECT (monitor) == NULL) { g_object_unref (monitor); return NULL; } gst_validate_pipeline_monitor_create_scenarios (GST_VALIDATE_BIN_MONITOR (monitor)); bus = gst_element_get_bus (GST_ELEMENT (pipeline)); gst_bus_enable_sync_message_emission (bus); g_signal_connect (bus, "sync-message", (GCallback) _bus_handler, monitor); gst_object_unref (bus); if (g_strcmp0 (G_OBJECT_TYPE_NAME (pipeline), "GstPlayBin") == 0) monitor->is_playbin = TRUE; else if (g_strcmp0 (G_OBJECT_TYPE_NAME (pipeline), "GstPlayBin3") == 0) monitor->is_playbin3 = TRUE; return monitor; }
static gboolean print_position (GstValidateMonitor * monitor) { GstQuery *query; gint64 position, duration; JsonBuilder *jbuilder; GstElement *pipeline = GST_ELEMENT (GST_VALIDATE_MONITOR_GET_OBJECT (monitor)); gdouble rate = 1.0; GstFormat format = GST_FORMAT_TIME; if (!gst_element_query_position (pipeline, format, &position)) { GST_DEBUG_OBJECT (monitor, "Could not query position"); return TRUE; } format = GST_FORMAT_TIME; if (!gst_element_query_duration (pipeline, format, &duration)) { GST_DEBUG_OBJECT (monitor, "Could not query duration"); return TRUE; } query = gst_query_new_segment (GST_FORMAT_DEFAULT); if (gst_element_query (pipeline, query)) gst_query_parse_segment (query, &rate, NULL, NULL, NULL); gst_query_unref (query); jbuilder = json_builder_new (); json_builder_begin_object (jbuilder); json_builder_set_member_name (jbuilder, "type"); json_builder_add_string_value (jbuilder, "position"); json_builder_set_member_name (jbuilder, "position"); json_builder_add_int_value (jbuilder, position); json_builder_set_member_name (jbuilder, "duration"); json_builder_add_int_value (jbuilder, duration); json_builder_set_member_name (jbuilder, "speed"); json_builder_add_double_value (jbuilder, rate); json_builder_end_object (jbuilder); gst_validate_send (json_builder_get_root (jbuilder)); g_object_unref (jbuilder); gst_validate_printf (NULL, "<position: %" GST_TIME_FORMAT " duration: %" GST_TIME_FORMAT " speed: %f />\r", GST_TIME_ARGS (position), GST_TIME_ARGS (duration), rate); return TRUE; }
/** * gst_validate_monitor_new: * @element: (transfer-none): a #GObject to run Validate on */ GstValidateMonitor * gst_validate_monitor_new (GObject * object) { GstValidateMonitor *monitor = g_object_new (GST_TYPE_VALIDATE_MONITOR, "object", G_TYPE_OBJECT, object, NULL); if (GST_VALIDATE_MONITOR_GET_OBJECT (monitor) == NULL) { /* setup failed, no use on returning this monitor */ g_object_unref (monitor); return NULL; } return monitor; }
/** * gst_validate_bin_monitor_new: * @bin: (transfer none): a #GstBin to run Validate on */ GstValidateBinMonitor * gst_validate_bin_monitor_new (GstBin * bin, GstValidateRunner * runner, GstValidateMonitor * parent) { GstValidateBinMonitor *monitor = g_object_new (GST_TYPE_VALIDATE_BIN_MONITOR, "object", bin, "validate-runner", runner, "validate-parent", parent, NULL); if (GST_VALIDATE_MONITOR_GET_OBJECT (monitor) == NULL) { g_object_unref (monitor); return NULL; } return monitor; }
static gboolean print_position (GstValidateMonitor * monitor) { GstQuery *query; gint64 position, duration; GstElement *pipeline = GST_ELEMENT (GST_VALIDATE_MONITOR_GET_OBJECT (monitor)); gdouble rate = 1.0; GstFormat format = GST_FORMAT_TIME; if (!gst_element_query_position (pipeline, format, &position)) { GST_DEBUG_OBJECT (monitor, "Could not query position"); return TRUE; } format = GST_FORMAT_TIME; if (!gst_element_query_duration (pipeline, format, &duration)) { GST_DEBUG_OBJECT (monitor, "Could not query duration"); return TRUE; } query = gst_query_new_segment (GST_FORMAT_DEFAULT); if (gst_element_query (pipeline, query)) gst_query_parse_segment (query, &rate, NULL, NULL, NULL); gst_query_unref (query); gst_validate_printf (NULL, "<position: %" GST_TIME_FORMAT " duration: %" GST_TIME_FORMAT " speed: %f />\r", GST_TIME_ARGS (position), GST_TIME_ARGS (duration), rate); return TRUE; }