[Spice-devel] [PATCH spice-gtk 3/5] display-gst: check GstRegistry for decoding elements

Victor Toso victortoso at redhat.com
Thu May 4 13:43:50 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 773bd1c..000e3a9 100644
--- a/src/channel-display-gst.c
+++ b/src/channel-display-gst.c
@@ -526,6 +526,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);
@@ -535,4 +583,5 @@ gboolean gstvideo_has_codec(int codec_type)
     }
 
     return has_codec;
+#endif
 }
-- 
2.12.2



More information about the Spice-devel mailing list