From 8c791907ab4940973b84f96863f399436012bd53 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marc-Andr=C3=A9=20Moreau?= Date: Tue, 15 Jul 2014 12:50:47 -0400 Subject: [PATCH] shadow: reset encoder on reconnection --- server/shadow/shadow_client.c | 2 + server/shadow/shadow_encoder.c | 114 +++++++++++++++++++++++++++++++---------- server/shadow/shadow_encoder.h | 1 + 3 files changed, 90 insertions(+), 27 deletions(-) diff --git a/server/shadow/shadow_client.c b/server/shadow/shadow_client.c index debff8a..743cb5d 100644 --- a/server/shadow/shadow_client.c +++ b/server/shadow/shadow_client.c @@ -173,6 +173,8 @@ BOOL shadow_client_activate(freerdp_peer* peer) client->activated = TRUE; client->inLobby = client->mayView ? FALSE : TRUE; + shadow_encoder_reset(client->server->encoder); + return TRUE; } diff --git a/server/shadow/shadow_encoder.c b/server/shadow/shadow_encoder.c index 82c5aab..87ce42b 100644 --- a/server/shadow/shadow_encoder.c +++ b/server/shadow/shadow_encoder.c @@ -112,29 +112,16 @@ int shadow_encoder_grid_uninit(rdpShadowEncoder* encoder) return 0; } -rdpShadowEncoder* shadow_encoder_new(rdpShadowServer* server) +int shadow_encoder_init(rdpShadowEncoder* encoder) { DWORD planarFlags; - rdpShadowEncoder* encoder; - - encoder = (rdpShadowEncoder*) calloc(1, sizeof(rdpShadowEncoder)); - - if (!encoder) - return NULL; - encoder->server = server; - - encoder->width = server->screen->width; - encoder->height = server->screen->height; - - encoder->bitsPerPixel = 32; - encoder->bytesPerPixel = 4; encoder->scanline = (encoder->width + (encoder->width % 4)) * 4; encoder->data = (BYTE*) malloc(encoder->scanline * encoder->height); if (!encoder->data) - return NULL; + return -1; encoder->maxTileWidth = 64; encoder->maxTileHeight = 64; @@ -169,28 +156,101 @@ rdpShadowEncoder* shadow_encoder_new(rdpShadowServer* server) encoder->frameAck = TRUE; encoder->frameList = ListDictionary_New(TRUE); - return encoder; + return 1; } -void shadow_encoder_free(rdpShadowEncoder* encoder) +int shadow_encoder_uninit(rdpShadowEncoder* encoder) { - if (!encoder) - return; + if (encoder->bs) + { + Stream_Free(encoder->bs, TRUE); + encoder->bs = NULL; + } + + if (encoder->bts) + { + Stream_Free(encoder->bts, TRUE); + encoder->bts = NULL; + } + + if (encoder->rfx_s) + { + Stream_Free(encoder->rfx_s, TRUE); + encoder->rfx_s = NULL; + } - Stream_Free(encoder->bs, TRUE); - Stream_Free(encoder->bts, TRUE); + if (encoder->rfx) + { + rfx_context_free(encoder->rfx); + encoder->rfx = NULL; + } - Stream_Free(encoder->rfx_s, TRUE); - rfx_context_free(encoder->rfx); + if (encoder->nsc_s) + { + Stream_Free(encoder->nsc_s, TRUE); + encoder->nsc_s = NULL; + } - Stream_Free(encoder->nsc_s, TRUE); - nsc_context_free(encoder->nsc); + if (encoder->nsc) + { + nsc_context_free(encoder->nsc); + encoder->nsc = NULL; + } - freerdp_bitmap_planar_context_free(encoder->planar); + if (encoder->planar) + { + freerdp_bitmap_planar_context_free(encoder->planar); + encoder->planar = NULL; + } shadow_encoder_grid_uninit(encoder); - ListDictionary_Free(encoder->frameList); + if (encoder->frameList) + { + ListDictionary_Free(encoder->frameList); + encoder->frameList = NULL; + } + + return 1; +} + +int shadow_encoder_reset(rdpShadowEncoder* encoder) +{ + if (shadow_encoder_uninit(encoder) < 0) + return -1; + + return shadow_encoder_init(encoder); +} + +rdpShadowEncoder* shadow_encoder_new(rdpShadowServer* server) +{ + rdpShadowEncoder* encoder; + + encoder = (rdpShadowEncoder*) calloc(1, sizeof(rdpShadowEncoder)); + + if (!encoder) + return NULL; + + encoder->server = server; + + encoder->width = server->screen->width; + encoder->height = server->screen->height; + + encoder->bitsPerPixel = 32; + encoder->bytesPerPixel = 4; + + if (shadow_encoder_init(encoder) < 0) + return NULL; + + return encoder; +} + +void shadow_encoder_free(rdpShadowEncoder* encoder) +{ + if (!encoder) + return; + + shadow_encoder_uninit(encoder); free(encoder); } diff --git a/server/shadow/shadow_encoder.h b/server/shadow/shadow_encoder.h index 5170ed6..6895c80 100644 --- a/server/shadow/shadow_encoder.h +++ b/server/shadow/shadow_encoder.h @@ -69,6 +69,7 @@ struct rdp_shadow_encoder extern "C" { #endif +int shadow_encoder_reset(rdpShadowEncoder* encoder); int shadow_encoder_create_frame_id(rdpShadowEncoder* encoder); rdpShadowEncoder* shadow_encoder_new(rdpShadowServer* server); -- 2.7.4