static void gst_validate_element_monitor_inspect (GstValidateElementMonitor * monitor) { GstElement *element; GstElementClass *klass; const gchar *klassname; element = GST_ELEMENT_CAST (gst_validate_monitor_get_target (GST_VALIDATE_MONITOR (monitor))); klass = GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS (element)); klassname = gst_element_class_get_metadata (klass, GST_ELEMENT_METADATA_KLASS); if (klassname) { monitor->is_decoder = strstr (klassname, "Decoder") != NULL; monitor->is_encoder = strstr (klassname, "Encoder") != NULL; monitor->is_demuxer = strstr (klassname, "Demuxer") != NULL; monitor->is_converter = strstr (klassname, "Converter") != NULL; } else GST_ERROR_OBJECT (element, "no klassname"); gst_object_unref (element); }
static gboolean gst_vaapiencode_set_format (GstVideoEncoder * venc, GstVideoCodecState * state) { GstVaapiEncode *const encode = GST_VAAPIENCODE_CAST (venc); gboolean ret; g_return_val_if_fail (state->caps != NULL, FALSE); if (!set_codec_state (encode, state)) return FALSE; if (!gst_vaapi_plugin_base_set_caps (GST_VAAPI_PLUGIN_BASE (encode), state->caps, NULL)) return FALSE; if (encode->input_state) gst_video_codec_state_unref (encode->input_state); encode->input_state = gst_video_codec_state_ref (state); encode->input_state_changed = TRUE; ret = gst_pad_start_task (GST_VAAPI_PLUGIN_BASE_SRC_PAD (encode), (GstTaskFunction) gst_vaapiencode_buffer_loop, encode, NULL); if (!ret) return FALSE; /* Store some tags */ { GstTagList *tags = gst_tag_list_new_empty (); const gchar *encoder, *codec; guint bitrate = 0; g_object_get (encode, "bitrate", &bitrate, NULL); gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_NOMINAL_BITRATE, bitrate, NULL); if ((encoder = gst_element_class_get_metadata (GST_ELEMENT_GET_CLASS (encode), GST_ELEMENT_METADATA_LONGNAME))) gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_ENCODER, encoder, NULL); if ((codec = gst_vaapi_codec_get_name (gst_vaapi_profile_get_codec (gst_vaapi_profile_from_caps (state->caps))))) gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_CODEC, codec, NULL); gst_video_encoder_merge_tags (venc, tags, GST_TAG_MERGE_REPLACE); gst_tag_list_unref (tags); } return TRUE; }
static GstElement *find_xvimagesink() { GstIterator *iterator = gst_bin_iterate_recurse(GST_BIN(pipeline)); GstElement *xvimagesink = NULL; gboolean done = FALSE; #if GST_CHECK_VERSION(1, 0, 0) GValue item = G_VALUE_INIT; #else gpointer item; #endif while (!done) { switch (gst_iterator_next(iterator, &item)) { case GST_ITERATOR_OK : { #if GST_CHECK_VERSION(1, 0, 0) GstElement *element = g_value_get_object(&item); #else GstElement *element = GST_ELEMENT(item); #endif GstElementClass *klass = GST_ELEMENT_GET_CLASS(element); #if GST_CHECK_VERSION(1, 0, 0) char *s = gst_element_class_get_metadata(klass, "description"); #else char *s = klass->details.description; #endif /* This is not the best way to check. */ if (strstr(s, "A Xv based videosink") != NULL || strstr(GST_OBJECT_NAME(element), "xvimage") != NULL) { xvimagesink = element; done = TRUE; } #if GST_CHECK_VERSION(1, 0, 0) g_value_reset(&item); #endif break; } case GST_ITERATOR_RESYNC : gst_iterator_resync(iterator); xvimagesink = NULL; done = FALSE; break; case GST_ITERATOR_DONE: case GST_ITERATOR_ERROR: default: done = TRUE; } } #if GST_CHECK_VERSION(1, 0, 0) g_value_unset(&item); #endif gst_iterator_free(iterator); return xvimagesink; }
static void bin_element_added (GstTracer * runner, GstClockTime ts, GstBin * bin, GstElement * element, gboolean result) { GstObject *parent; GstValidateElementMonitor *monitor = g_object_get_data (G_OBJECT (element), "validate-monitor"); if (!monitor) return; if (!monitor->is_decoder) return; parent = gst_object_get_parent (GST_OBJECT (element)); do { if (GES_IS_TRACK (parent)) { GstElementClass *klass = GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS (element)); const gchar *klassname = gst_element_class_get_metadata (klass, GST_ELEMENT_METADATA_KLASS); if (GES_IS_AUDIO_TRACK (parent) && strstr (klassname, "Audio") == NULL) { GST_VALIDATE_REPORT (monitor, WRONG_DECODER_ADDED, "Adding non audio decoder %s in audio track %s.", GST_OBJECT_NAME (element), GST_OBJECT_NAME (parent)); } else if (GES_IS_VIDEO_TRACK (parent) && strstr (klassname, "Video") == NULL && strstr (klassname, "Image") == NULL) { GST_VALIDATE_REPORT (monitor, WRONG_DECODER_ADDED, "Adding non video decoder %s in video track %s.", GST_OBJECT_NAME (element), GST_OBJECT_NAME (parent)); } gst_object_unref (parent); break; } gst_object_unref (parent); parent = gst_object_get_parent (parent); } while (parent); }