diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 01:24:41 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 01:24:41 +0000 |
commit | a9bcc81f821d7c66f623779fa5147e728eb3c388 (patch) | |
tree | 98676963bcdd537ae5908a067a8eb110b93486a6 /libfreerdp/codec/rfx_decode.c | |
parent | Initial commit. (diff) | |
download | freerdp3-a9bcc81f821d7c66f623779fa5147e728eb3c388.tar.xz freerdp3-a9bcc81f821d7c66f623779fa5147e728eb3c388.zip |
Adding upstream version 3.3.0+dfsg1.upstream/3.3.0+dfsg1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'libfreerdp/codec/rfx_decode.c')
-rw-r--r-- | libfreerdp/codec/rfx_decode.c | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/libfreerdp/codec/rfx_decode.c b/libfreerdp/codec/rfx_decode.c new file mode 100644 index 0000000..4aa3c3d --- /dev/null +++ b/libfreerdp/codec/rfx_decode.c @@ -0,0 +1,102 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * RemoteFX Codec Library - Decode + * + * Copyright 2011 Vic Lee + * Copyright 2011 Norbert Federa <norbert.federa@thincast.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <freerdp/config.h> + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <winpr/stream.h> +#include <freerdp/primitives.h> + +#include "rfx_types.h" +#include "rfx_rlgr.h" +#include "rfx_differential.h" +#include "rfx_quantization.h" +#include "rfx_dwt.h" + +#include "rfx_decode.h" + +void rfx_decode_component(RFX_CONTEXT* WINPR_RESTRICT context, + const UINT32* WINPR_RESTRICT quantization_values, + const BYTE* WINPR_RESTRICT data, size_t size, + INT16* WINPR_RESTRICT buffer) +{ + INT16* dwt_buffer = NULL; + dwt_buffer = BufferPool_Take(context->priv->BufferPool, -1); /* dwt_buffer */ + PROFILER_ENTER(context->priv->prof_rfx_decode_component) + PROFILER_ENTER(context->priv->prof_rfx_rlgr_decode) + context->rlgr_decode(context->mode, data, size, buffer, 4096); + PROFILER_EXIT(context->priv->prof_rfx_rlgr_decode) + PROFILER_ENTER(context->priv->prof_rfx_differential_decode) + rfx_differential_decode(buffer + 4032, 64); + PROFILER_EXIT(context->priv->prof_rfx_differential_decode) + PROFILER_ENTER(context->priv->prof_rfx_quantization_decode) + context->quantization_decode(buffer, quantization_values); + PROFILER_EXIT(context->priv->prof_rfx_quantization_decode) + PROFILER_ENTER(context->priv->prof_rfx_dwt_2d_decode) + context->dwt_2d_decode(buffer, dwt_buffer); + PROFILER_EXIT(context->priv->prof_rfx_dwt_2d_decode) + PROFILER_EXIT(context->priv->prof_rfx_decode_component) + BufferPool_Return(context->priv->BufferPool, dwt_buffer); +} + +/* rfx_decode_ycbcr_to_rgb code now resides in the primitives library. */ + +/* stride is bytes between rows in the output buffer. */ +BOOL rfx_decode_rgb(RFX_CONTEXT* context, const RFX_TILE* tile, BYTE* rgb_buffer, UINT32 stride) +{ + union + { + const INT16** cpv; + INT16** pv; + } cnv; + BOOL rc = TRUE; + BYTE* pBuffer = NULL; + INT16* pSrcDst[3]; + UINT32* y_quants = NULL; + UINT32* cb_quants = NULL; + UINT32* cr_quants = NULL; + static const prim_size_t roi_64x64 = { 64, 64 }; + const primitives_t* prims = primitives_get(); + PROFILER_ENTER(context->priv->prof_rfx_decode_rgb) + y_quants = context->quants + (tile->quantIdxY * 10); + cb_quants = context->quants + (tile->quantIdxCb * 10); + cr_quants = context->quants + (tile->quantIdxCr * 10); + pBuffer = (BYTE*)BufferPool_Take(context->priv->BufferPool, -1); + pSrcDst[0] = (INT16*)((BYTE*)(&pBuffer[((8192 + 32) * 0) + 16])); /* y_r_buffer */ + pSrcDst[1] = (INT16*)((BYTE*)(&pBuffer[((8192 + 32) * 1) + 16])); /* cb_g_buffer */ + pSrcDst[2] = (INT16*)((BYTE*)(&pBuffer[((8192 + 32) * 2) + 16])); /* cr_b_buffer */ + rfx_decode_component(context, y_quants, tile->YData, tile->YLen, pSrcDst[0]); /* YData */ + rfx_decode_component(context, cb_quants, tile->CbData, tile->CbLen, pSrcDst[1]); /* CbData */ + rfx_decode_component(context, cr_quants, tile->CrData, tile->CrLen, pSrcDst[2]); /* CrData */ + PROFILER_ENTER(context->priv->prof_rfx_ycbcr_to_rgb) + + cnv.pv = pSrcDst; + if (prims->yCbCrToRGB_16s8u_P3AC4R(cnv.cpv, 64 * sizeof(INT16), rgb_buffer, stride, + context->pixel_format, &roi_64x64) != PRIMITIVES_SUCCESS) + rc = FALSE; + + PROFILER_EXIT(context->priv->prof_rfx_ycbcr_to_rgb) + PROFILER_EXIT(context->priv->prof_rfx_decode_rgb) + BufferPool_Return(context->priv->BufferPool, pBuffer); + return rc; +} |