Before stopping a stream, we need to ensure that there is no ongoing gl_draw operation; otherwise, we may not get another opportunity to create a new stream if the current one gets stopped. And, once the stream is stopped, we need to clear the gl_draw_stream pointer associated with the relevant client (dcc). 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> --- server/video-stream.cpp | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/server/video-stream.cpp b/server/video-stream.cpp index 03a7d68d..b7f3d2c5 100644 --- a/server/video-stream.cpp +++ b/server/video-stream.cpp @@ -18,6 +18,7 @@ #include "video-stream.h" #include "display-channel-private.h" +#include "dcc-private.h" #include "main-channel-client.h" #include "red-client.h" @@ -115,6 +116,10 @@ void video_stream_stop(DisplayChannel *display, VideoStream *stream) } dcc->pipe_add(video_stream_destroy_item_new(stream_agent)); video_stream_agent_stats_print(stream_agent); + + if (stream == dcc->priv->gl_draw_stream) { + dcc->priv->gl_draw_stream = nullptr; + } } display->priv->streams_size_total -= stream->width * stream->height; ring_remove(&stream->link); @@ -974,6 +979,19 @@ void video_stream_detach_and_stop(DisplayChannel *display) } } +static bool is_stream_gl_draw(VideoStream *stream, DisplayChannel *display) +{ + DisplayChannelClient *dcc; + + FOREACH_DCC(display, dcc) { + if (stream == dcc->priv->gl_draw_stream && + dcc->priv->gl_draw_ongoing) { + return TRUE; + } + } + return FALSE; +} + void video_stream_timeout(DisplayChannel *display) { Ring *ring = &display->priv->streams; @@ -984,7 +1002,8 @@ void video_stream_timeout(DisplayChannel *display) while (item) { VideoStream *stream = SPICE_CONTAINEROF(item, VideoStream, link); item = ring_next(ring, item); - if (now >= (stream->last_time + RED_STREAM_TIMEOUT)) { + if (now >= (stream->last_time + RED_STREAM_TIMEOUT) && + !is_stream_gl_draw(stream, display)) { detach_video_stream_gracefully(display, stream, nullptr); video_stream_stop(display, stream); } -- 2.37.2