Il giorno mer 28 feb 2024 alle ore 08:41 Vivek Kasireddy <vivek.kasireddy@xxxxxxxxx> ha scritto: > > 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@xxxxxxxxx> > Cc: Gerd Hoffmann <kraxel@xxxxxxxxxx> > Cc: Marc-André Lureau <marcandre.lureau@xxxxxxxxxx> > Cc: Dongwon Kim <dongwon.kim@xxxxxxxxx> > Signed-off-by: Vivek Kasireddy <vivek.kasireddy@xxxxxxxxx> Acked > --- > server/dcc.cpp | 22 ++++++++++++---------- > server/dcc.h | 6 ++++++ > 2 files changed, 18 insertions(+), 10 deletions(-) > > diff --git a/server/dcc.cpp b/server/dcc.cpp > index 01c16ab7..ca73470a 100644 > --- a/server/dcc.cpp > +++ b/server/dcc.cpp > @@ -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(); > } > diff --git a/server/dcc.h b/server/dcc.h > index a8dd3bef..47f082fe 100644 > --- a/server/dcc.h > +++ b/server/dcc.h > @@ -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;