[Spice-devel] [PATCH v1 1/5] dcc: Check to see if the client supports multiple codecs
Vivek Kasireddy
vivek.kasireddy at intel.com
Thu Mar 16 05:44:54 UTC 2023
We need to determine if the client is new enough to support multiple
codecs -- which might include any of the Gstreamer based ones.
Cc: Gerd Hoffmann <kraxel at redhat.com>
Cc: Marc-André Lureau <marcandre.lureau at redhat.com>
Cc: Dongwon Kim <dongwon.kim at intel.com>
Signed-off-by: Vivek Kasireddy <vivek.kasireddy at intel.com>
---
server/dcc-private.h | 2 ++
server/dcc.cpp | 22 +++++++++++-----------
server/display-channel-private.h | 6 ++++++
3 files changed, 19 insertions(+), 11 deletions(-)
diff --git a/server/dcc-private.h b/server/dcc-private.h
index 842c14b2..bf485aec 100644
--- a/server/dcc-private.h
+++ b/server/dcc-private.h
@@ -27,6 +27,8 @@
#include "push-visibility.h"
+XXX_CAST(RedChannelClient, DisplayChannelClient, DISPLAY_CHANNEL_CLIENT);
+
struct DisplayChannelClientPrivate
{
SPICE_CXX_GLIB_ALLOCATOR
diff --git a/server/dcc.cpp b/server/dcc.cpp
index 01c16ab7..f0b355ca 100644
--- a/server/dcc.cpp
+++ b/server/dcc.cpp
@@ -494,29 +494,29 @@ RedSurfaceDestroyItem::RedSurfaceDestroyItem(uint32_t surface_id)
RedPipeItemPtr dcc_gl_scanout_item_new(RedChannelClient *rcc, void *data, int num)
{
- /* FIXME: on !unix peer, start streaming with a video codec */
- if (!red_stream_is_plain_unix(rcc->get_stream()) ||
- !rcc->test_remote_cap(SPICE_DISPLAY_CAP_GL_SCANOUT)) {
+ DisplayChannelClient *dcc = DISPLAY_CHANNEL_CLIENT(rcc);
+
+ if (dcc_is_gl_client(dcc)) {
+ return red::make_shared<RedGlScanoutUnixItem>();
+ } else if (rcc->test_remote_cap(SPICE_DISPLAY_CAP_MULTI_CODEC)) {
+ return RedPipeItemPtr();
+ } else {
red_channel_warning(rcc->get_channel(),
- "FIXME: client does not support GL scanout");
+ "Client does not support GL scanout or multiple codecs");
rcc->disconnect();
return RedPipeItemPtr();
}
-
- return red::make_shared<RedGlScanoutUnixItem>();
}
-XXX_CAST(RedChannelClient, DisplayChannelClient, DISPLAY_CHANNEL_CLIENT);
-
RedPipeItemPtr dcc_gl_draw_item_new(RedChannelClient *rcc, void *data, int num)
{
DisplayChannelClient *dcc = DISPLAY_CHANNEL_CLIENT(rcc);
auto draw = static_cast<const SpiceMsgDisplayGlDraw *>(data);
- if (!red_stream_is_plain_unix(rcc->get_stream()) ||
- !rcc->test_remote_cap(SPICE_DISPLAY_CAP_GL_SCANOUT)) {
+ if (!dcc_is_gl_client(dcc) &&
+ !rcc->test_remote_cap(SPICE_DISPLAY_CAP_MULTI_CODEC)) {
red_channel_warning(rcc->get_channel(),
- "FIXME: client does not support GL scanout");
+ "Client does not support GL scanout or multiple codecs");
rcc->disconnect();
return RedPipeItemPtr();
}
diff --git a/server/display-channel-private.h b/server/display-channel-private.h
index 04ac2c0d..7600f213 100644
--- a/server/display-channel-private.h
+++ b/server/display-channel-private.h
@@ -346,4 +346,10 @@ static inline void region_add_clip_rects(QRegion *rgn, SpiceClipRects *data)
}
}
+static inline bool dcc_is_gl_client(DisplayChannelClient *dcc)
+{
+ return red_stream_is_plain_unix(dcc->get_stream()) &&
+ dcc->test_remote_cap(SPICE_DISPLAY_CAP_GL_SCANOUT);
+}
+
#endif /* DISPLAY_CHANNEL_PRIVATE_H_ */
--
2.37.2
More information about the Spice-devel
mailing list