dcc: Check to see if the client supports multiple codecs (v2)

We need to determine if the client is new enough to support multiple
codecs -- which might include any of the Gstreamer based ones.

v2: (suggestions and fixups from Frediano)
- Add is_gl_client() method to DisplayChannelClient instead of a
  dcc_is_gl_client() function.
- Avoid the usage of XXX_CAST macro.

Cc: Frediano Ziglio <freddy77@gmail.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Marc-André Lureau <marcandre.lureau@redhat.com>
Cc: Dongwon Kim <dongwon.kim@intel.com>
Signed-off-by: Vivek Kasireddy <vivek.kasireddy@intel.com>
This commit is contained in:
Vivek Kasireddy 2023-03-15 13:09:48 -07:00
parent e285cb5f75
commit 9c8c569149
2 changed files with 18 additions and 10 deletions

View File

@ -494,29 +494,31 @@ 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)) {
auto dcc = static_cast<DisplayChannelClient *>(rcc);
if (dcc->is_gl_client()) {
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 dcc = static_cast<DisplayChannelClient *>(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() &&
!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();
}

View File

@ -47,6 +47,12 @@ public:
spice_wan_compression_t zlib_glz_state);
virtual void disconnect() override;
bool is_gl_client()
{
return red_stream_is_plain_unix(get_stream()) &&
test_remote_cap(SPICE_DISPLAY_CAP_GL_SCANOUT);
}
protected:
virtual bool handle_message(uint16_t type, uint32_t size, void *msg) override;
virtual bool config_socket() override;