[Spice-devel] [RFC spice-streaming-agent 1/2] gst-plugin: allow the instantiation of multiple GST encoder plugins

Kevin Pouget kpouget at redhat.com
Wed Jul 31 08:36:34 UTC 2019


With this patch, spice-streaming-agent can be launched with multiple
Gstreamer video codecs enabled:

> spice-streaming-agent -c gst.codec=vp8 -c gst.codec=vp9 ...
---
 src/gst-plugin.cpp | 50 ++++++++++++++++++++++++++++------------------
 1 file changed, 31 insertions(+), 19 deletions(-)

diff --git a/src/gst-plugin.cpp b/src/gst-plugin.cpp
index 9858beb..6252e42 100644
--- a/src/gst-plugin.cpp
+++ b/src/gst-plugin.cpp
@@ -102,7 +102,7 @@ class GstreamerPlugin final: public Plugin
 public:
     FrameCapture *CreateCapture() override;
     unsigned Rank() override;
-    void ParseOptions(const ConfigureOption *options);
+    void ParseOptions(const ConfigureOption *options, SpiceVideoCodecType codec);
     SpiceVideoCodecType VideoCodecType() const override {
         return settings.codec;
     }
@@ -419,8 +419,10 @@ unsigned GstreamerPlugin::Rank()
     return SoftwareMin;
 }
 
-void GstreamerPlugin::ParseOptions(const ConfigureOption *options)
+void GstreamerPlugin::ParseOptions(const ConfigureOption *options,  SpiceVideoCodecType codec)
 {
+    settings.codec = codec;
+
     for (; options->name; ++options) {
         const std::string name = options->name;
         const std::string value = options->value;
@@ -431,20 +433,6 @@ void GstreamerPlugin::ParseOptions(const ConfigureOption *options)
             } catch (const std::exception &e) {
                 throw std::runtime_error("Invalid value '" + value + "' for option 'framerate'.");
             }
-        } else if (name == "gst.codec") {
-            if (value == "h264") {
-                settings.codec = SPICE_VIDEO_CODEC_TYPE_H264;
-            } else if (value == "vp9") {
-                settings.codec = SPICE_VIDEO_CODEC_TYPE_VP9;
-            } else if (value == "vp8") {
-                settings.codec = SPICE_VIDEO_CODEC_TYPE_VP8;
-            } else if (value == "mjpeg") {
-                settings.codec = SPICE_VIDEO_CODEC_TYPE_MJPEG;
-            } else if (value == "h265") {
-                settings.codec = SPICE_VIDEO_CODEC_TYPE_H265;
-            } else {
-                throw std::runtime_error("Invalid value '" + value + "' for option 'gst.codec'.");
-            }
         } else if (name == "gst.encoder") {
             settings.encoder = value;
         }
@@ -459,11 +447,35 @@ SPICE_STREAMING_AGENT_PLUGIN(agent)
 {
     gst_init(nullptr, nullptr);
 
-    auto plugin = std::make_shared<GstreamerPlugin>();
+    auto options = agent->Options();
+    for (; options->name; ++options) {
+        const std::string name = options->name;
+        const std::string value = options->value;
 
-    plugin->ParseOptions(agent->Options());
+        if (name == "gst.codec") {
+            SpiceVideoCodecType codec_type;
+            if (value == "mjpeg") {
+                codec_type = SPICE_VIDEO_CODEC_TYPE_MJPEG;
+            } else if (value == "h264") {
+                codec_type = SPICE_VIDEO_CODEC_TYPE_H264;
+            } else if (value == "h265") {
+                codec_type = SPICE_VIDEO_CODEC_TYPE_H265;
+            } else if (value == "vp8") {
+                codec_type = SPICE_VIDEO_CODEC_TYPE_VP8;
+            } else if (value == "vp9") {
+                codec_type = SPICE_VIDEO_CODEC_TYPE_VP9;
+            } else {
+                throw std::runtime_error("Invalid value '" + value + "' for option 'gst.codec'.");
+            }
+
+            auto plugin = std::make_shared<GstreamerPlugin>();
+            plugin->ParseOptions(agent->Options(), codec_type);
+            agent->Register(plugin);
+        }
+    }
 
-    agent->Register(plugin);
+    // no default value at the moment
+    // (used to be h264, see GstreamerEncoderSettings::codec)
 
     return true;
 }
-- 
2.21.0



More information about the Spice-devel mailing list