[Spice-commits] server/reds.c

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jul 5 12:37:01 UTC 2019


 server/reds.c |   35 +++++++++++++++++++++++++++++++----
 1 file changed, 31 insertions(+), 4 deletions(-)

New commits:
commit b4150de3cd0e56d4ce43a99ef5c3c5f5cbdfc4a3
Author: Kevin Pouget <kpouget at redhat.com>
Date:   Thu Jul 4 12:18:10 2019 +0200

    reds: spice_server_set_video_codecs: fail when no codec can be installed
    
    Public function spice_server_set_video_codecs: return -1 if no
    encoder/codec has been installed, instead of always returning 0.
    
    Internal function reds_set_video_codecs_from_string: return the number
    of invalid encoder/codec entries found in the input list, and update
    the installed pointer with the number of encoder/codec pairs
    successfully installed.
    
    Acked-by: Frediano Ziglio <fziglio at redhat.com>

diff --git a/server/reds.c b/server/reds.c
index baadee47..7783ab0b 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -3815,12 +3815,22 @@ static char* parse_next_video_codec(char *codecs, char **encoder, char **codec)
     return codecs + strcspn(codecs, ";");
 }
 
-static void reds_set_video_codecs_from_string(RedsState *reds, const char *codecs)
+/* Enable the encoders/codecs from the list specified in @codecs.
+ *
+ * @reds: the #RedsState to modify
+ * @codecs: a codec string in the following format: encoder:codec;encoder:codec
+ * @installed: (optional): a location to return the number of codecs successfull installed
+ * @return -1 if @codecs is %NULL (@installed is not modified) or the number of invalid
+ *         encoders/codecs found in @codecs.
+ */
+static int reds_set_video_codecs_from_string(RedsState *reds, const char *codecs,
+                                             unsigned int *installed)
 {
     char *encoder_name, *codec_name;
     GArray *video_codecs;
+    int invalid_codecs = 0;
 
-    g_return_if_fail(codecs != NULL);
+    g_return_val_if_fail(codecs != NULL, -1);
 
     if (strcmp(codecs, "auto") == 0) {
         codecs = default_video_codecs;
@@ -3833,15 +3843,19 @@ static void reds_set_video_codecs_from_string(RedsState *reds, const char *codec
         uint32_t encoder_index, codec_index;
         if (!encoder_name || !codec_name) {
             spice_warning("spice: invalid encoder:codec value at %s", codecs);
+            invalid_codecs++;
 
         } else if (!get_name_index(video_encoder_names, encoder_name, &encoder_index)){
             spice_warning("spice: unknown video encoder %s", encoder_name);
+            invalid_codecs++;
 
         } else if (!get_name_index(video_codec_names, codec_name, &codec_index)) {
             spice_warning("spice: unknown video codec %s", codec_name);
+            invalid_codecs++;
 
         } else if (!video_encoder_procs[encoder_index]) {
             spice_warning("spice: unsupported video encoder %s", encoder_name);
+            invalid_codecs++;
 
         } else {
             RedVideoCodec new_codec;
@@ -3862,6 +3876,12 @@ static void reds_set_video_codecs_from_string(RedsState *reds, const char *codec
     }
 
     g_free(codecs_copy);
+
+    if (installed) {
+        *installed = video_codecs->len;
+    }
+
+    return invalid_codecs;
 }
 
 SPICE_GNUC_VISIBLE int spice_server_init(SpiceServer *reds, SpiceCoreInterface *core)
@@ -3873,7 +3893,7 @@ SPICE_GNUC_VISIBLE int spice_server_init(SpiceServer *reds, SpiceCoreInterface *
         reds_add_renderer(reds, default_renderer);
     }
     if (reds->config->video_codecs->len == 0) {
-        reds_set_video_codecs_from_string(reds, default_video_codecs);
+        reds_set_video_codecs_from_string(reds, default_video_codecs, NULL);
     }
     return ret;
 }
@@ -4219,8 +4239,15 @@ uint32_t reds_get_streaming_video(const RedsState *reds)
 
 SPICE_GNUC_VISIBLE int spice_server_set_video_codecs(SpiceServer *reds, const char *video_codecs)
 {
-    reds_set_video_codecs_from_string(reds, video_codecs);
+    unsigned int installed = 0;
+
+    reds_set_video_codecs_from_string(reds, video_codecs, &installed);
+
+    if (!installed) {
+        return -1;
+    }
     reds_on_vc_change(reds);
+
     return 0;
 }
 


More information about the Spice-commits mailing list