[Spice-devel] [PATCH spice-gtk v2 3/5] display-gst: check GstRegistry for decoding elements
Victor Toso
victortoso at redhat.com
Thu May 11 16:37:49 UTC 2017
From: Victor Toso <me at victortoso.com>
With this patch, we can find all the elements in the registry that are
video decoders which can handle the predefined GstCaps.
Main benefits are:
- We don't rely on predefined list of GstElements. We don't need to
update them;
- debugging: It does help to know what the registry has at runtime;
Signed-off-by: Victor Toso <victortoso at redhat.com>
Signed-off-by: Victor Toso <me at victortoso.com>
---
src/channel-display-gst.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 49 insertions(+)
diff --git a/src/channel-display-gst.c b/src/channel-display-gst.c
index 7323ce7..a9c45f6 100644
--- a/src/channel-display-gst.c
+++ b/src/channel-display-gst.c
@@ -535,6 +535,54 @@ VideoDecoder* create_gstreamer_decoder(int codec_type, display_stream *stream)
G_GNUC_INTERNAL
gboolean gstvideo_has_codec(int codec_type)
{
+#if GST_CHECK_VERSION(1,9,0)
+ GList *all_decoders, *codec_decoders;
+ GstCaps *caps;
+ GstElementFactoryListType type;
+
+ g_return_val_if_fail(gstvideo_init(), FALSE);
+ g_return_val_if_fail(VALID_VIDEO_CODEC_TYPE(codec_type), FALSE);
+
+ type = GST_ELEMENT_FACTORY_TYPE_DECODER | GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO;
+ all_decoders = gst_element_factory_list_get_elements(type, GST_RANK_NONE);
+ if (all_decoders == NULL) {
+ spice_warning("No video decoders from GStreamer were found");
+ return FALSE;
+ }
+
+ caps = gst_caps_from_string(gst_opts[codec_type].dec_caps);
+ codec_decoders = gst_element_factory_list_filter(all_decoders, caps, GST_PAD_SINK, TRUE);
+ gst_caps_unref(caps);
+
+ if (codec_decoders == NULL) {
+ spice_debug("From %u decoders, none can handle '%s'",
+ g_list_length(all_decoders), gst_opts[codec_type].dec_caps);
+ gst_plugin_feature_list_free(all_decoders);
+ return FALSE;
+ }
+
+ if (spice_util_get_debug()) {
+ GList *l;
+ GString *msg = g_string_new(NULL);
+ /* Print list of available decoders to make debugging easier */
+ g_string_printf(msg, "From %3u video decoder elements, %2u can handle caps %12s: ",
+ g_list_length(all_decoders), g_list_length(codec_decoders),
+ gst_opts[codec_type].dec_caps);
+
+ for (l = codec_decoders; l != NULL; l = l->next) {
+ GstPluginFeature *pfeat = GST_PLUGIN_FEATURE(l->data);
+ g_string_append_printf(msg, "%s, ", gst_plugin_feature_get_name(pfeat));
+ }
+
+ msg->str[msg->len - 2] = '\0';
+ spice_debug("%s", msg->str);
+ g_string_free(msg, TRUE);
+ }
+
+ gst_plugin_feature_list_free(codec_decoders);
+ gst_plugin_feature_list_free(all_decoders);
+ return TRUE;
+#else
gboolean has_codec = FALSE;
VideoDecoder *decoder = create_gstreamer_decoder(codec_type, NULL);
@@ -544,4 +592,5 @@ gboolean gstvideo_has_codec(int codec_type)
}
return has_codec;
+#endif
}
--
2.12.2
More information about the Spice-devel
mailing list