[Spice-devel] [spice-gtk v2 2/2] channel-display-gst: use a static array for gst options

Victor Toso victortoso at redhat.com
Wed Oct 19 21:42:10 UTC 2016


From: Victor Toso <me at victortoso.com>

Signed-off-by: Victor Toso <victortoso at redhat.com>
---
 src/channel-display-gst.c | 80 ++++++++++++++++++++++++++---------------------
 1 file changed, 44 insertions(+), 36 deletions(-)

diff --git a/src/channel-display-gst.c b/src/channel-display-gst.c
index 0c8fc01..9ec7b4e 100644
--- a/src/channel-display-gst.c
+++ b/src/channel-display-gst.c
@@ -50,6 +50,39 @@ typedef struct SpiceGstDecoder {
     guint timer_id;
 } SpiceGstDecoder;
 
+static struct {
+    const gchar *dec_name;
+    const gchar *dec_caps;
+} gst_opts[] = {
+    /* decodebin will use vaapi if installed, which for a time could
+     * intentionally crash the application. So only use decodebin as a
+     * fallback or when SPICE_GSTVIDEO_AUTO is set.
+     * See: https://bugs.freedesktop.org/show_bug.cgi?id=90884
+     */
+    { "decodebin", "" },
+
+    /* SPICE_VIDEO_CODEC_TYPE_MJPEG */
+    { "jpegdec", "caps=image/jpeg" },
+
+    /* SPICE_VIDEO_CODEC_TYPE_VP8
+     *
+     * typefind is unable to identify VP8 streams by design.
+     * See: https://bugzilla.gnome.org/show_bug.cgi?id=756457
+     */
+    { "vp8dec", "caps=video/x-vp8" },
+
+    /* SPICE_VIDEO_CODEC_TYPE_H264
+     * h264 streams detection works fine and setting an incomplete cap
+     * causes errors. So let typefind do all the work.
+     */
+    { "h264parse ! avdec_h264", "" },
+
+};
+
+G_STATIC_ASSERT(G_N_ELEMENTS(gst_opts) == SPICE_VIDEO_CODEC_TYPE_ENUM_END);
+
+#define VALID_VIDEO_CODEC_TYPE(codec) \
+    (codec > 0 && codec < SPICE_VIDEO_CODEC_TYPE_ENUM_END)
 
 /* ---------- SpiceFrame ---------- */
 
@@ -249,45 +282,20 @@ static void free_pipeline(SpiceGstDecoder *decoder)
 
 static gboolean create_pipeline(SpiceGstDecoder *decoder)
 {
-    const gchar *src_caps, *gstdec_name;
     gchar *desc;
+    gboolean auto_enabled;
+    guint opt;
     GstAppSinkCallbacks appsink_cbs = { 0 };
     GError *err = NULL;
 
-    switch (decoder->base.codec_type) {
-    case SPICE_VIDEO_CODEC_TYPE_MJPEG:
-        src_caps = "caps=image/jpeg";
-        gstdec_name = "jpegdec";
-        break;
-    case SPICE_VIDEO_CODEC_TYPE_VP8:
-        /* typefind is unable to identify VP8 streams by design.
-         * See: https://bugzilla.gnome.org/show_bug.cgi?id=756457
-         */
-        src_caps = "caps=video/x-vp8";
-        gstdec_name = "vp8dec";
-        break;
-    case SPICE_VIDEO_CODEC_TYPE_H264:
-        /* h264 streams detection works fine and setting an incomplete cap
-         * causes errors. So let typefind do all the work.
-         */
-        src_caps = "";
-        gstdec_name = "h264parse ! avdec_h264";
-        break;
-    default:
-        SPICE_DEBUG("Unknown codec type %d. Trying decodebin.",
-                    decoder->base.codec_type);
-        src_caps = "";
-        gstdec_name = NULL;
-        break;
-    }
-
-    /* decodebin will use vaapi if installed, which for a time could
-     * intentionally crash the application. So only use decodebin as a
-     * fallback or when SPICE_GSTVIDEO_AUTO is set.
-     * See: https://bugs.freedesktop.org/show_bug.cgi?id=90884
-     */
-    if (gstdec_name == NULL || g_getenv("SPICE_GSTVIDEO_AUTO") != NULL) {
-        gstdec_name = "decodebin";
+    auto_enabled = (g_getenv("SPICE_GSTVIDEO_AUTO") != NULL);
+    if (auto_enabled || !VALID_VIDEO_CODEC_TYPE(decoder->base.codec_type)) {
+        SPICE_DEBUG("Trying %s for codec type %d %s",
+                    gst_opts[0].dec_name, decoder->base.codec_type,
+                    (auto_enabled) ? "(SPICE_GSTVIDEO_AUTO is set)" : "");
+        opt = 0;
+    } else {
+        opt = decoder->base.codec_type;
     }
 
     /* - We schedule the frame display ourselves so set sync=false on appsink
@@ -300,7 +308,7 @@ static gboolean create_pipeline(SpiceGstDecoder *decoder)
     desc = g_strdup_printf("appsrc name=src is-live=true format=time max-bytes=0 block=true "
                            "%s ! %s ! videoconvert ! appsink name=sink "
                            "caps=video/x-raw,format=BGRx sync=false drop=false",
-                           src_caps, gstdec_name);
+                           gst_opts[opt].dec_caps, gst_opts[opt].dec_name);
     SPICE_DEBUG("GStreamer pipeline: %s", desc);
 
     decoder->pipeline = gst_parse_launch_full(desc, NULL, GST_PARSE_FLAG_FATAL_ERRORS, &err);
-- 
2.9.3



More information about the Spice-devel mailing list