if (bitsPerPixel < 32)
{
- if (!freerdp_client_codecs_prepare(codecs, FREERDP_CODEC_INTERLEAVED))
+ if (!freerdp_client_codecs_prepare(codecs, FREERDP_CODEC_INTERLEAVED,
+ wfc->instance->settings->DesktopWidth,
+ wfc->instance->settings->DesktopHeight))
return FALSE;
status = interleaved_decompress(codecs->interleaved, pSrcData, SrcSize, bitsPerPixel,
}
else
{
- if (!freerdp_client_codecs_prepare(codecs, FREERDP_CODEC_PLANAR))
+ if (!freerdp_client_codecs_prepare(codecs, FREERDP_CODEC_PLANAR,
+ wfc->instance->settings->DesktopWidth,
+ wfc->instance->settings->DesktopHeight))
return FALSE;
status = planar_decompress(codecs->planar, pSrcData, SrcSize, &pDstData,
if (surface_bits_command->codecID == RDP_CODEC_ID_REMOTEFX)
{
- if (!freerdp_client_codecs_prepare(wfc->codecs, FREERDP_CODEC_REMOTEFX))
+ if (!freerdp_client_codecs_prepare(wfc->codecs, FREERDP_CODEC_REMOTEFX,
+ wfc->instance->settings->DesktopWidth,
+ wfc->instance->settings->DesktopHeight))
return;
if (!(message = rfx_process_message(wfc->codecs->rfx, surface_bits_command->bitmapData, surface_bits_command->bitmapDataLength)))
}
else if (surface_bits_command->codecID == RDP_CODEC_ID_NSCODEC)
{
- if (!freerdp_client_codecs_prepare(wfc->codecs, FREERDP_CODEC_NSCODEC))
+ if (!freerdp_client_codecs_prepare(wfc->codecs, FREERDP_CODEC_NSCODEC,
+ wfc->instance->settings->DesktopWidth,
+ wfc->instance->settings->DesktopHeight))
return;
nsc_process_message(wfc->codecs->nsc, surface_bits_command->bpp, surface_bits_command->width, surface_bits_command->height,
{
if (bpp < 32)
{
- if (!freerdp_client_codecs_prepare(wfc->codecs, FREERDP_CODEC_INTERLEAVED))
+ if (!freerdp_client_codecs_prepare(wfc->codecs, FREERDP_CODEC_INTERLEAVED,
+ wfc->instance->settings->DesktopWidth,
+ wfc->instance->settings->DesktopHeight))
return;
status = interleaved_decompress(wfc->codecs->interleaved, pSrcData, SrcSize, bpp,
}
else
{
- if (!freerdp_client_codecs_prepare(wfc->codecs, FREERDP_CODEC_PLANAR))
+ if (!freerdp_client_codecs_prepare(wfc->codecs, FREERDP_CODEC_PLANAR,
+ wfc->instance->settings->DesktopWidth,
+ wfc->instance->settings->DesktopHeight))
return;
status = planar_decompress(wfc->codecs->planar, pSrcData, SrcSize, &pDstData,
if (bitsPerPixel < 32)
{
- if (!freerdp_client_codecs_prepare(codecs, FREERDP_CODEC_INTERLEAVED))
+ if (!freerdp_client_codecs_prepare(codecs, FREERDP_CODEC_INTERLEAVED,
+ xfc->settings->DesktopWidth,
+ xfc->settings->DesktopHeight))
return FALSE;
status = interleaved_decompress(codecs->interleaved, pSrcData, SrcSize, bitsPerPixel,
}
else
{
- if (!freerdp_client_codecs_prepare(codecs, FREERDP_CODEC_PLANAR))
+ if (!freerdp_client_codecs_prepare(codecs, FREERDP_CODEC_PLANAR,
+ xfc->settings->DesktopWidth,
+ xfc->settings->DesktopHeight))
return FALSE;
status = planar_decompress(codecs->planar, pSrcData, SrcSize, &pDstData,
if (cmd->codecID == RDP_CODEC_ID_REMOTEFX)
{
- if (!freerdp_client_codecs_prepare(xfc->codecs, FREERDP_CODEC_REMOTEFX))
+ if (!freerdp_client_codecs_prepare(xfc->codecs, FREERDP_CODEC_REMOTEFX,
+ xfc->settings->DesktopWidth,
+ xfc->settings->DesktopHeight))
{
xf_unlock_x11(xfc, FALSE);
return FALSE;
}
else if (cmd->codecID == RDP_CODEC_ID_NSCODEC)
{
- if (!freerdp_client_codecs_prepare(xfc->codecs, FREERDP_CODEC_NSCODEC))
+ if (!freerdp_client_codecs_prepare(xfc->codecs, FREERDP_CODEC_NSCODEC,
+ xfc->settings->DesktopWidth,
+ xfc->settings->DesktopHeight))
{
xf_unlock_x11(xfc, FALSE);
return FALSE;
if (!surface)
return ERROR_INTERNAL_ERROR;
- if (!freerdp_client_codecs_prepare(surface->codecs, FREERDP_CODEC_REMOTEFX))
+ if (!freerdp_client_codecs_prepare(surface->codecs, FREERDP_CODEC_REMOTEFX,
+ surface->width, surface->height))
return ERROR_INTERNAL_ERROR;
if (!(message = rfx_process_message(surface->codecs->rfx, cmd->data, cmd->length)))
if (!surface)
return ERROR_INTERNAL_ERROR;
- if (!freerdp_client_codecs_prepare(xfc->codecs, FREERDP_CODEC_CLEARCODEC))
+ if (!freerdp_client_codecs_prepare(xfc->codecs, FREERDP_CODEC_CLEARCODEC,
+ xfc->settings->DesktopWidth,
+ xfc->settings->DesktopHeight))
return ERROR_INTERNAL_ERROR;
DstData = surface->data;
if (!surface)
return ERROR_INTERNAL_ERROR;
- if (!freerdp_client_codecs_prepare(surface->codecs, FREERDP_CODEC_PLANAR))
+ if (!freerdp_client_codecs_prepare(surface->codecs, FREERDP_CODEC_PLANAR,
+ surface->width, surface->height))
return ERROR_INTERNAL_ERROR;
DstData = surface->data;
if (!surface)
return ERROR_INTERNAL_ERROR;
- if (!freerdp_client_codecs_prepare(surface->codecs, FREERDP_CODEC_AVC420))
+ if (!freerdp_client_codecs_prepare(surface->codecs, FREERDP_CODEC_AVC420,
+ surface->width, surface->height))
return ERROR_INTERNAL_ERROR;
bs = (RDPGFX_AVC420_BITMAP_STREAM*) cmd->extra;
if (!surface)
return ERROR_INTERNAL_ERROR;
- if (!freerdp_client_codecs_prepare(surface->codecs, FREERDP_CODEC_AVC444))
+ if (!freerdp_client_codecs_prepare(surface->codecs, FREERDP_CODEC_AVC444,
+ surface->width, surface->height))
return ERROR_INTERNAL_ERROR;
bs = (RDPGFX_AVC444_BITMAP_STREAM*) cmd->extra;
if (!surface)
return ERROR_INTERNAL_ERROR;
- if (!freerdp_client_codecs_prepare(surface->codecs, FREERDP_CODEC_ALPHACODEC))
+ if (!freerdp_client_codecs_prepare(surface->codecs, FREERDP_CODEC_ALPHACODEC,
+ surface->width, surface->height))
return ERROR_INTERNAL_ERROR;
WLog_DBG(TAG, "xf_SurfaceCommand_Alpha: status: %d", status);
if (!surface)
return ERROR_INTERNAL_ERROR;
- if (!freerdp_client_codecs_prepare(surface->codecs, FREERDP_CODEC_PROGRESSIVE))
+ if (!freerdp_client_codecs_prepare(surface->codecs, FREERDP_CODEC_PROGRESSIVE,
+ surface->width, surface->height))
return ERROR_INTERNAL_ERROR;
progressive_create_surface_context(surface->codecs->progressive, cmd->surfaceId, surface->width, surface->height);
return CHANNEL_RC_NO_MEMORY;
}
- if (!freerdp_client_codecs_reset(surface->codecs, FREERDP_CODEC_ALL,
- createSurface->width, createSurface->height))
- {
- free (surface);
- return ERROR_INTERNAL_ERROR;
- }
-
surface->surfaceId = createSurface->surfaceId;
surface->width = (UINT32) createSurface->width;
surface->height = (UINT32) createSurface->height;
{
if (bpp < 32)
{
- if (!freerdp_client_codecs_prepare(xfc->codecs, FREERDP_CODEC_INTERLEAVED))
+ if (!freerdp_client_codecs_prepare(xfc->codecs, FREERDP_CODEC_INTERLEAVED,
+ xfc->settings->DesktopWidth,
+ xfc->settings->DesktopHeight))
return FALSE;
status = interleaved_decompress(xfc->codecs->interleaved, pSrcData, SrcSize, bpp,
}
else
{
- if (!freerdp_client_codecs_prepare(xfc->codecs, FREERDP_CODEC_PLANAR))
+ if (!freerdp_client_codecs_prepare(xfc->codecs, FREERDP_CODEC_PLANAR,
+ xfc->settings->DesktopWidth,
+ xfc->settings->DesktopHeight))
return FALSE;
status = planar_decompress(xfc->codecs->planar, pSrcData, SrcSize,
extern "C" {
#endif
-FREERDP_API BOOL freerdp_client_codecs_prepare(rdpCodecs* codecs, UINT32 flags);
+FREERDP_API BOOL freerdp_client_codecs_prepare(rdpCodecs* codecs, UINT32 flags,
+ UINT32 width, UINT32 height);
FREERDP_API BOOL freerdp_client_codecs_reset(rdpCodecs* codecs, UINT32 flags,
UINT32 width, UINT32 height);
#define TAG FREERDP_TAG("core.codecs")
-BOOL freerdp_client_codecs_prepare(rdpCodecs* codecs, UINT32 flags)
+BOOL freerdp_client_codecs_prepare(rdpCodecs* codecs, UINT32 flags, UINT32 width, UINT32 height)
{
if ((flags & FREERDP_CODEC_INTERLEAVED) && !codecs->interleaved)
{
WLog_ERR(TAG, "Failed to create interleaved codec context");
return FALSE;
}
+
+ if (!bitmap_interleaved_context_reset(codecs->interleaved))
+ {
+ WLog_ERR(TAG, "Failed to reset interleaved codec context");
+ bitmap_interleaved_context_free(codecs->interleaved);
+ return FALSE;
+ }
}
if ((flags & FREERDP_CODEC_PLANAR) && !codecs->planar)
WLog_ERR(TAG, "Failed to create planar bitmap codec context");
return FALSE;
}
+
+ if (!freerdp_bitmap_planar_context_reset(codecs->planar))
+ {
+ WLog_ERR(TAG, "Failed to reset plannar bitmap codec context");
+ freerdp_bitmap_planar_context_free(codecs->planar);
+ return FALSE;
+ }
}
if ((flags & FREERDP_CODEC_NSCODEC) && !codecs->nsc)
WLog_ERR(TAG, "Failed to create nsc codec context");
return FALSE;
}
+
+ if (!nsc_context_reset(codecs->nsc, width, height))
+ {
+ WLog_ERR(TAG, "Failed to reset nsc codec context");
+ nsc_context_free(codecs->nsc);
+ return FALSE;
+ }
}
if ((flags & FREERDP_CODEC_REMOTEFX) && !codecs->rfx)
WLog_ERR(TAG, "Failed to create rfx codec context");
return FALSE;
}
+
+ if (!rfx_context_reset(codecs->rfx, width, height))
+ {
+ WLog_ERR(TAG, "Failed to reset rfx codec context");
+ rfx_context_free(codecs->rfx);
+ return FALSE;
+ }
}
if ((flags & FREERDP_CODEC_CLEARCODEC) && !codecs->clear)
WLog_ERR(TAG, "Failed to create clear codec context");
return FALSE;
}
+
+ if (!clear_context_reset(codecs->clear))
+ {
+ WLog_ERR(TAG, "Failed to reset clear codec context");
+ clear_context_free(codecs->clear);
+ return FALSE;
+ }
}
if (flags & FREERDP_CODEC_ALPHACODEC)
WLog_ERR(TAG, "Failed to create progressive codec context");
return FALSE;
}
+
+ if (!progressive_context_reset(codecs->progressive))
+ {
+ WLog_ERR(TAG, "Failed to reset progressive codec context");
+ progressive_context_free(codecs->progressive);
+ return FALSE;
+ }
}
if ((flags & (FREERDP_CODEC_AVC420 | FREERDP_CODEC_AVC444)) && !codecs->h264)
WLog_ERR(TAG, "Failed to create h264 codec context");
return FALSE;
}
+
+ if (!h264_context_reset(codecs->h264, width, height))
+ {
+ WLog_ERR(TAG, "Failed to reset h264 codec context");
+ h264_context_free(codecs->h264);
+ return FALSE;
+ }
}
return TRUE;
if (bitsPerPixel < 32)
{
- if (!freerdp_client_codecs_prepare(codecs, FREERDP_CODEC_INTERLEAVED))
+ if (!freerdp_client_codecs_prepare(codecs, FREERDP_CODEC_INTERLEAVED,
+ gdi->width, gdi->height))
return FALSE;
status = interleaved_decompress(codecs->interleaved, pSrcData, SrcSize, bitsPerPixel,
}
else
{
- if (!freerdp_client_codecs_prepare(codecs, FREERDP_CODEC_PLANAR))
+ if (!freerdp_client_codecs_prepare(codecs, FREERDP_CODEC_PLANAR,
+ gdi->width, gdi->height))
return FALSE;
status = planar_decompress(codecs->planar, pSrcData, SrcSize, &pDstData,
if (cmd->codecID == RDP_CODEC_ID_REMOTEFX)
{
- if (!freerdp_client_codecs_prepare(gdi->codecs, FREERDP_CODEC_REMOTEFX))
+ if (!freerdp_client_codecs_prepare(gdi->codecs, FREERDP_CODEC_REMOTEFX,
+ gdi->width, gdi->height))
return FALSE;
if (!(message = rfx_process_message(gdi->codecs->rfx, cmd->bitmapData, cmd->bitmapDataLength)))
}
else if (cmd->codecID == RDP_CODEC_ID_NSCODEC)
{
- if (!freerdp_client_codecs_prepare(gdi->codecs, FREERDP_CODEC_NSCODEC))
+ if (!freerdp_client_codecs_prepare(gdi->codecs, FREERDP_CODEC_NSCODEC,
+ gdi->width, gdi->height))
return FALSE;
nsc_process_message(gdi->codecs->nsc, cmd->bpp, cmd->width, cmd->height, cmd->bitmapData, cmd->bitmapDataLength);
if (!surface)
return ERROR_INTERNAL_ERROR;
- if (!freerdp_client_codecs_prepare(surface->codecs, FREERDP_CODEC_REMOTEFX))
+ if (!freerdp_client_codecs_prepare(surface->codecs, FREERDP_CODEC_REMOTEFX,
+ surface->width, surface->height))
return ERROR_INTERNAL_ERROR;
if (!(message = rfx_process_message(surface->codecs->rfx, cmd->data, cmd->length)))
if (!surface)
return ERROR_INTERNAL_ERROR;
- if (!freerdp_client_codecs_prepare(gdi->codecs, FREERDP_CODEC_CLEARCODEC))
+ if (!freerdp_client_codecs_prepare(gdi->codecs, FREERDP_CODEC_CLEARCODEC,
+ gdi->width, gdi->height))
return ERROR_INTERNAL_ERROR;
DstData = surface->data;
if (!surface)
return ERROR_INTERNAL_ERROR;
- if (!freerdp_client_codecs_prepare(surface->codecs, FREERDP_CODEC_PLANAR))
+ if (!freerdp_client_codecs_prepare(surface->codecs, FREERDP_CODEC_PLANAR,
+ surface->width, surface->height))
return ERROR_INTERNAL_ERROR;
DstData = surface->data;
if (!surface)
return ERROR_INTERNAL_ERROR;
- if (!freerdp_client_codecs_prepare(surface->codecs, FREERDP_CODEC_AVC420))
+ if (!freerdp_client_codecs_prepare(surface->codecs, FREERDP_CODEC_AVC420,
+ surface->width, surface->height))
return ERROR_INTERNAL_ERROR;
bs = (RDPGFX_AVC420_BITMAP_STREAM*) cmd->extra;
if (!surface)
return ERROR_INTERNAL_ERROR;
- if (!freerdp_client_codecs_prepare(surface->codecs, FREERDP_CODEC_AVC444))
+ if (!freerdp_client_codecs_prepare(surface->codecs, FREERDP_CODEC_AVC444,
+ surface->width, surface->height))
return ERROR_INTERNAL_ERROR;
bs = (RDPGFX_AVC444_BITMAP_STREAM*) cmd->extra;
if (!surface)
return ERROR_INTERNAL_ERROR;
- if (!freerdp_client_codecs_prepare(surface->codecs, FREERDP_CODEC_ALPHACODEC))
+ if (!freerdp_client_codecs_prepare(surface->codecs, FREERDP_CODEC_ALPHACODEC,
+ surface->width, surface->height))
return ERROR_INTERNAL_ERROR;
WLog_DBG(TAG, "gdi_SurfaceCommand_Alpha: status: %d", status);
if (!surface)
return ERROR_INTERNAL_ERROR;
- if (!freerdp_client_codecs_prepare(surface->codecs, FREERDP_CODEC_PROGRESSIVE))
+ if (!freerdp_client_codecs_prepare(surface->codecs, FREERDP_CODEC_PROGRESSIVE,
+ surface->width, surface->height))
return ERROR_INTERNAL_ERROR;
progressive_create_surface_context(surface->codecs->progressive, cmd->surfaceId, surface->width, surface->height);
return CHANNEL_RC_NO_MEMORY;
}
- if (!freerdp_client_codecs_reset(surface->codecs, FREERDP_CODEC_ALL,
- createSurface->width, createSurface->height))
- {
- free (surface);
- return ERROR_INTERNAL_ERROR;
- }
-
surface->surfaceId = createSurface->surfaceId;
surface->width = (UINT32) createSurface->width;
surface->height = (UINT32) createSurface->height;
{
if (bpp < 32)
{
- if (!freerdp_client_codecs_prepare(gdi->codecs, FREERDP_CODEC_INTERLEAVED))
+ if (!freerdp_client_codecs_prepare(gdi->codecs, FREERDP_CODEC_INTERLEAVED,
+ gdi->width, gdi->height))
return FALSE;
status = interleaved_decompress(gdi->codecs->interleaved, pSrcData, SrcSize, bpp,
}
else
{
- if (!freerdp_client_codecs_prepare(gdi->codecs, FREERDP_CODEC_PLANAR))
+ if (!freerdp_client_codecs_prepare(gdi->codecs, FREERDP_CODEC_PLANAR,
+ gdi->width, gdi->height))
return FALSE;
status = planar_decompress(gdi->codecs->planar, pSrcData, SrcSize, &pDstData,