[spice-streaming-server,v2,3/3] Do not use an encoding not supported by the client

Submitted by Frediano Ziglio on Nov. 9, 2017, 1:39 p.m.

Details

Message ID 20171109133931.6870-4-fziglio@redhat.com
State New
Headers show
Series "Some updates for" ( rev: 1 ) in Spice

Not browsing as part of any series.

Commit Message

Frediano Ziglio Nov. 9, 2017, 1:39 p.m.
This allows for instance old clients to work correctly.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
---
 src/concrete-agent.cpp        | 5 ++++-
 src/concrete-agent.hpp        | 3 ++-
 src/spice-streaming-agent.cpp | 6 +++++-
 3 files changed, 11 insertions(+), 3 deletions(-)

Patch hide | download patch | download mbox

diff --git a/src/concrete-agent.cpp b/src/concrete-agent.cpp
index 192054a..404ee74 100644
--- a/src/concrete-agent.cpp
+++ b/src/concrete-agent.cpp
@@ -98,7 +98,7 @@  void ConcreteAgent::LoadPlugin(const char *plugin_filename)
     }
 }
 
-FrameCapture *ConcreteAgent::GetBestFrameCapture()
+FrameCapture *ConcreteAgent::GetBestFrameCapture(const std::set<SpiceVideoCodecType>& codecs)
 {
     vector<pair<unsigned, shared_ptr<Plugin>>> sorted_plugins;
 
@@ -113,6 +113,9 @@  FrameCapture *ConcreteAgent::GetBestFrameCapture()
         if (plugin.first == DontUse) {
             break;
         }
+        // check client supports the codec
+        if (codecs.find(plugin.second->VideoCodecType()) == codecs.end())
+            continue;
         FrameCapture *capture = plugin.second->CreateCapture();
         if (capture) {
             return capture;
diff --git a/src/concrete-agent.hpp b/src/concrete-agent.hpp
index 828368b..6c300fa 100644
--- a/src/concrete-agent.hpp
+++ b/src/concrete-agent.hpp
@@ -7,6 +7,7 @@ 
 #define SPICE_STREAMING_AGENT_CONCRETE_AGENT_HPP
 
 #include <vector>
+#include <set>
 #include <memory>
 #include <spice-streaming-agent/plugin.hpp>
 
@@ -33,7 +34,7 @@  public:
     void LoadPlugins(const char *directory);
     // pointer must remain valid
     void AddOption(const char *name, const char *value);
-    FrameCapture *GetBestFrameCapture();
+    FrameCapture *GetBestFrameCapture(const std::set<SpiceVideoCodecType>& codecs);
     bool PluginVersionIsCompatible(unsigned pluginVersion) const override;
 private:
     void LoadPlugin(const char *plugin_filename);
diff --git a/src/spice-streaming-agent.cpp b/src/spice-streaming-agent.cpp
index 608d2c7..56fcbe1 100644
--- a/src/spice-streaming-agent.cpp
+++ b/src/spice-streaming-agent.cpp
@@ -51,6 +51,7 @@  typedef struct {
 } SpiceStreamDataMessage;
 
 static int streaming_requested;
+static std::set<SpiceVideoCodecType> client_codecs;
 static bool quit;
 static int streamfd = -1;
 static bool stdin_ok;
@@ -142,6 +143,9 @@  static int read_command_from_device(void)
     streaming_requested = msg[0]; /* num_codecs */
     syslog(LOG_INFO, "GOT START_STOP message -- request to %s streaming\n",
            streaming_requested ? "START" : "STOP");
+    client_codecs.clear();
+    for (int i = 1; i <= msg[0]; ++i)
+        client_codecs.insert((SpiceVideoCodecType) msg[i]);
     return 1;
 }
 
@@ -372,7 +376,7 @@  do_capture(const char *streamport, FILE *f_log)
         syslog(LOG_INFO, "streaming starts now\n");
         uint64_t time_last = 0;
 
-        std::unique_ptr<FrameCapture> capture(agent.GetBestFrameCapture());
+        std::unique_ptr<FrameCapture> capture(agent.GetBestFrameCapture(client_codecs));
         if (!capture)
             throw std::runtime_error("cannot find a suitable capture system");