Do not recreate already initialized codecs
authorArmin Novak <armin.novak@thincast.com>
Fri, 5 Feb 2021 10:06:23 +0000 (11:06 +0100)
committerakallabeth <akallabeth@users.noreply.github.com>
Thu, 25 Feb 2021 08:51:41 +0000 (09:51 +0100)
GFX and SurfaceBits commands share a common codec backend.
Recreating all codec context on GFX initialization will break
clients that are decoding SurfaceBits codec while having the GFX
channel initialized.

(cherry picked from commit 91a6ac131370c48a742b8bcc58ad188bb7ed60f8)

libfreerdp/core/codecs.c
libfreerdp/gdi/gfx.c

index ee3fbd1..c5ae912 100644 (file)
@@ -29,7 +29,7 @@
 
 BOOL freerdp_client_codecs_prepare(rdpCodecs* codecs, UINT32 flags, UINT32 width, UINT32 height)
 {
-       if ((flags & FREERDP_CODEC_INTERLEAVED))
+       if ((flags & FREERDP_CODEC_INTERLEAVED) && !codecs->interleaved)
        {
                bitmap_interleaved_context_free(codecs->interleaved);
 
@@ -40,7 +40,7 @@ BOOL freerdp_client_codecs_prepare(rdpCodecs* codecs, UINT32 flags, UINT32 width
                }
        }
 
-       if ((flags & FREERDP_CODEC_PLANAR))
+       if ((flags & FREERDP_CODEC_PLANAR) && !codecs->planar)
        {
                freerdp_bitmap_planar_context_free(codecs->planar);
 
@@ -51,7 +51,7 @@ BOOL freerdp_client_codecs_prepare(rdpCodecs* codecs, UINT32 flags, UINT32 width
                }
        }
 
-       if ((flags & FREERDP_CODEC_NSCODEC))
+       if ((flags & FREERDP_CODEC_NSCODEC) && !codecs->nsc)
        {
                nsc_context_free(codecs->nsc);
 
@@ -62,7 +62,7 @@ BOOL freerdp_client_codecs_prepare(rdpCodecs* codecs, UINT32 flags, UINT32 width
                }
        }
 
-       if ((flags & FREERDP_CODEC_REMOTEFX))
+       if ((flags & FREERDP_CODEC_REMOTEFX) && !codecs->rfx)
        {
                rfx_context_free(codecs->rfx);
 
@@ -73,7 +73,7 @@ BOOL freerdp_client_codecs_prepare(rdpCodecs* codecs, UINT32 flags, UINT32 width
                }
        }
 
-       if ((flags & FREERDP_CODEC_CLEARCODEC))
+       if ((flags & FREERDP_CODEC_CLEARCODEC) && !codecs->clear)
        {
                clear_context_free(codecs->clear);
 
@@ -84,11 +84,11 @@ BOOL freerdp_client_codecs_prepare(rdpCodecs* codecs, UINT32 flags, UINT32 width
                }
        }
 
-       if (flags & FREERDP_CODEC_ALPHACODEC)
+       if ((flags & FREERDP_CODEC_ALPHACODEC))
        {
        }
 
-       if ((flags & FREERDP_CODEC_PROGRESSIVE))
+       if ((flags & FREERDP_CODEC_PROGRESSIVE) && !codecs->progressive)
        {
                progressive_context_free(codecs->progressive);
 
@@ -100,7 +100,7 @@ BOOL freerdp_client_codecs_prepare(rdpCodecs* codecs, UINT32 flags, UINT32 width
        }
 
 #ifdef WITH_GFX_H264
-       if ((flags & (FREERDP_CODEC_AVC420 | FREERDP_CODEC_AVC444)))
+       if ((flags & (FREERDP_CODEC_AVC420 | FREERDP_CODEC_AVC444)) && !codecs->h264)
        {
                h264_context_free(codecs->h264);
 
index 3d50c80..15bbfee 100644 (file)
@@ -1475,9 +1475,6 @@ BOOL gdi_graphics_pipeline_init_ex(rdpGdi* gdi, RdpgfxClientContext* gfx,
                return FALSE;
 
        context = gdi->context;
-       freerdp_client_codecs_prepare(context->codecs, FREERDP_CODEC_ALL,
-                                     context->settings->DesktopWidth,
-                                     context->settings->DesktopHeight);
 
        gdi->gfx = gfx;
        gfx->custom = (void*)gdi;