From c2d126cdd8aa97c9406aeed01ae5e4f9825d1cf2 Mon Sep 17 00:00:00 2001 From: akallabeth Date: Fri, 17 Sep 2021 09:09:48 +0200 Subject: [PATCH] Streamlined rdpCodec cleanup routines --- libfreerdp/core/codecs.c | 109 +++++++++++++++++++-------------------- 1 file changed, 52 insertions(+), 57 deletions(-) diff --git a/libfreerdp/core/codecs.c b/libfreerdp/core/codecs.c index bfd10ccc3..56895227b 100644 --- a/libfreerdp/core/codecs.c +++ b/libfreerdp/core/codecs.c @@ -21,18 +21,66 @@ #include "config.h" #endif +#include + #include "rdp.h" #include #define TAG FREERDP_TAG("core.codecs") -BOOL freerdp_client_codecs_prepare(rdpCodecs* codecs, UINT32 flags, UINT32 width, UINT32 height) +static void codecs_free_int(rdpCodecs* codecs) { - if ((flags & FREERDP_CODEC_INTERLEAVED)) + WINPR_ASSERT(codecs); + if (codecs->rfx) + { + rfx_context_free(codecs->rfx); + codecs->rfx = NULL; + } + + if (codecs->nsc) + { + nsc_context_free(codecs->nsc); + codecs->nsc = NULL; + } + +#ifdef WITH_GFX_H264 + if (codecs->h264) + { + h264_context_free(codecs->h264); + codecs->h264 = NULL; + } +#endif + + if (codecs->clear) + { + clear_context_free(codecs->clear); + codecs->clear = NULL; + } + + if (codecs->progressive) + { + progressive_context_free(codecs->progressive); + codecs->progressive = NULL; + } + + if (codecs->planar) + { + freerdp_bitmap_planar_context_free(codecs->planar); + codecs->planar = NULL; + } + + if (codecs->interleaved) { bitmap_interleaved_context_free(codecs->interleaved); - + codecs->interleaved = NULL; + } +} +BOOL freerdp_client_codecs_prepare(rdpCodecs* codecs, UINT32 flags, UINT32 width, UINT32 height) +{ + codecs_free_int(codecs); + if ((flags & FREERDP_CODEC_INTERLEAVED)) + { if (!(codecs->interleaved = bitmap_interleaved_context_new(FALSE))) { WLog_ERR(TAG, "Failed to create interleaved codec context"); @@ -42,8 +90,6 @@ BOOL freerdp_client_codecs_prepare(rdpCodecs* codecs, UINT32 flags, UINT32 width if ((flags & FREERDP_CODEC_PLANAR)) { - freerdp_bitmap_planar_context_free(codecs->planar); - if (!(codecs->planar = freerdp_bitmap_planar_context_new(FALSE, 64, 64))) { WLog_ERR(TAG, "Failed to create planar bitmap codec context"); @@ -53,8 +99,6 @@ BOOL freerdp_client_codecs_prepare(rdpCodecs* codecs, UINT32 flags, UINT32 width if ((flags & FREERDP_CODEC_NSCODEC)) { - nsc_context_free(codecs->nsc); - if (!(codecs->nsc = nsc_context_new())) { WLog_ERR(TAG, "Failed to create nsc codec context"); @@ -64,7 +108,6 @@ BOOL freerdp_client_codecs_prepare(rdpCodecs* codecs, UINT32 flags, UINT32 width if ((flags & FREERDP_CODEC_REMOTEFX)) { - rfx_context_free(codecs->rfx); if (!(codecs->rfx = rfx_context_new_ex(FALSE, codecs->context->settings->ThreadingFlags))) { WLog_ERR(TAG, "Failed to create rfx codec context"); @@ -74,8 +117,6 @@ BOOL freerdp_client_codecs_prepare(rdpCodecs* codecs, UINT32 flags, UINT32 width if ((flags & FREERDP_CODEC_CLEARCODEC)) { - clear_context_free(codecs->clear); - if (!(codecs->clear = clear_context_new(FALSE))) { WLog_ERR(TAG, "Failed to create clear codec context"); @@ -89,8 +130,6 @@ BOOL freerdp_client_codecs_prepare(rdpCodecs* codecs, UINT32 flags, UINT32 width if ((flags & FREERDP_CODEC_PROGRESSIVE)) { - progressive_context_free(codecs->progressive); - if (!(codecs->progressive = progressive_context_new(FALSE))) { WLog_ERR(TAG, "Failed to create progressive codec context"); @@ -101,8 +140,6 @@ BOOL freerdp_client_codecs_prepare(rdpCodecs* codecs, UINT32 flags, UINT32 width #ifdef WITH_GFX_H264 if ((flags & (FREERDP_CODEC_AVC420 | FREERDP_CODEC_AVC444))) { - h264_context_free(codecs->h264); - if (!(codecs->h264 = h264_context_new(FALSE))) { WLog_ERR(TAG, "Failed to create h264 codec context"); @@ -201,49 +238,7 @@ void codecs_free(rdpCodecs* codecs) if (!codecs) return; - if (codecs->rfx) - { - rfx_context_free(codecs->rfx); - codecs->rfx = NULL; - } - - if (codecs->nsc) - { - nsc_context_free(codecs->nsc); - codecs->nsc = NULL; - } - -#ifdef WITH_GFX_H264 - if (codecs->h264) - { - h264_context_free(codecs->h264); - codecs->h264 = NULL; - } -#endif - - if (codecs->clear) - { - clear_context_free(codecs->clear); - codecs->clear = NULL; - } - - if (codecs->progressive) - { - progressive_context_free(codecs->progressive); - codecs->progressive = NULL; - } - - if (codecs->planar) - { - freerdp_bitmap_planar_context_free(codecs->planar); - codecs->planar = NULL; - } - - if (codecs->interleaved) - { - bitmap_interleaved_context_free(codecs->interleaved); - codecs->interleaved = NULL; - } + codecs_free_int(codecs); free(codecs); }