diff --git a/include/freerdp/codec/rfx.h b/include/freerdp/codec/rfx.h index f82445b74..d735adaa4 100644 --- a/include/freerdp/codec/rfx.h +++ b/include/freerdp/codec/rfx.h @@ -110,11 +110,11 @@ struct _RFX_CONTEXT /* temporary data within a frame */ UINT32 frame_idx; BOOL header_processed; - BYTE num_quants; + BYTE numQuant; UINT32* quants; - BYTE quant_idx_y; - BYTE quant_idx_cb; - BYTE quant_idx_cr; + BYTE quantIdxY; + BYTE quantIdxCb; + BYTE quantIdxCr; /* routines */ void (*quantization_decode)(INT16* buffer, const UINT32* quantization_values); diff --git a/libfreerdp/codec/rfx.c b/libfreerdp/codec/rfx.c index 32cfcec0f..bd744ee7f 100644 --- a/libfreerdp/codec/rfx.c +++ b/libfreerdp/codec/rfx.c @@ -605,10 +605,10 @@ static BOOL rfx_process_message_tileset(RFX_CONTEXT* context, RFX_MESSAGE* messa Stream_Seek_UINT16(s); /* idx (2 bytes), must be set to 0x0000 */ Stream_Seek_UINT16(s); /* properties (2 bytes) */ - Stream_Read_UINT8(s, context->num_quants); /* numQuant (1 byte) */ + Stream_Read_UINT8(s, context->numQuant); /* numQuant (1 byte) */ Stream_Seek_UINT8(s); /* tileSize (1 byte), must be set to 0x40 */ - if (context->num_quants < 1) + if (context->numQuant < 1) { DEBUG_WARN("no quantization value."); return TRUE; @@ -625,19 +625,19 @@ static BOOL rfx_process_message_tileset(RFX_CONTEXT* context, RFX_MESSAGE* messa Stream_Read_UINT32(s, tilesDataSize); /* tilesDataSize (4 bytes) */ if (context->quants != NULL) - context->quants = (UINT32*) realloc((void*) context->quants, context->num_quants * 10 * sizeof(UINT32)); + context->quants = (UINT32*) realloc((void*) context->quants, context->numQuant * 10 * sizeof(UINT32)); else - context->quants = (UINT32*) malloc(context->num_quants * 10 * sizeof(UINT32)); + context->quants = (UINT32*) malloc(context->numQuant * 10 * sizeof(UINT32)); quants = context->quants; /* quantVals */ - if (Stream_GetRemainingLength(s) < context->num_quants * 5) + if (Stream_GetRemainingLength(s) < context->numQuant * 5) { - DEBUG_WARN("RfxMessageTileSet packet too small for num_quants=%d", context->num_quants); + DEBUG_WARN("RfxMessageTileSet packet too small for num_quants=%d", context->numQuant); return FALSE; } - for (i = 0; i < context->num_quants; i++) + for (i = 0; i < context->numQuant; i++) { /* RFX_CODEC_QUANT */ Stream_Read_UINT8(s, quant); @@ -1000,14 +1000,8 @@ static void rfx_compose_message_region(RFX_CONTEXT* context, wStream* s, Stream_Write_UINT16(s, 1); /* numTilesets */ } -static void rfx_compose_message_tile(RFX_CONTEXT* context, wStream* s, - BYTE* tile_data, int tile_width, int tile_height, int rowstride, - const UINT32* quantVals, int quantIdxY, int quantIdxCb, int quantIdxCr, - int xIdx, int yIdx) +static void rfx_compose_message_tile(RFX_CONTEXT* context, wStream* s, RFX_TILE* tile, int rowstride) { - int YLen = 0; - int CbLen = 0; - int CrLen = 0; int start_pos, end_pos; Stream_EnsureRemainingCapacity(s, 19); @@ -1015,29 +1009,27 @@ static void rfx_compose_message_tile(RFX_CONTEXT* context, wStream* s, Stream_Write_UINT16(s, CBT_TILE); /* BlockT.blockType */ Stream_Seek_UINT32(s); /* set BlockT.blockLen later */ - Stream_Write_UINT8(s, quantIdxY); - Stream_Write_UINT8(s, quantIdxCb); - Stream_Write_UINT8(s, quantIdxCr); - Stream_Write_UINT16(s, xIdx); - Stream_Write_UINT16(s, yIdx); + Stream_Write_UINT8(s, tile->quantIdxY); + Stream_Write_UINT8(s, tile->quantIdxCb); + Stream_Write_UINT8(s, tile->quantIdxCr); + Stream_Write_UINT16(s, tile->xIdx); + Stream_Write_UINT16(s, tile->yIdx); Stream_Seek(s, 6); /* YLen, CbLen, CrLen */ - rfx_encode_rgb(context, tile_data, tile_width, tile_height, rowstride, - quantVals + quantIdxY * 10, quantVals + quantIdxCb * 10, quantVals + quantIdxCr * 10, - s, &YLen, &CbLen, &CrLen); + rfx_encode_rgb(context, tile, rowstride, s); DEBUG_RFX("xIdx=%d yIdx=%d width=%d height=%d YLen=%d CbLen=%d CrLen=%d", - xIdx, yIdx, tile_width, tile_height, YLen, CbLen, CrLen); + tile->xIdx, tile->yIdx, tile->width, tile->height, tile->YLen, tile->CbLen, tile->CrLen); end_pos = Stream_GetPosition(s); Stream_SetPosition(s, start_pos + 2); - Stream_Write_UINT32(s, 19 + YLen + CbLen + CrLen); /* BlockT.blockLen */ + Stream_Write_UINT32(s, 19 + tile->YLen + tile->CbLen + tile->CrLen); /* BlockT.blockLen */ Stream_SetPosition(s, start_pos + 13); - Stream_Write_UINT16(s, YLen); - Stream_Write_UINT16(s, CbLen); - Stream_Write_UINT16(s, CrLen); + Stream_Write_UINT16(s, tile->YLen); + Stream_Write_UINT16(s, tile->CbLen); + Stream_Write_UINT16(s, tile->CrLen); Stream_SetPosition(s, end_pos); } @@ -1050,26 +1042,20 @@ struct _RFX_TILE_COMPOSE_WORK_PARAM wStream* s; int rowstride; - UINT32* quantVals; }; typedef struct _RFX_TILE_COMPOSE_WORK_PARAM RFX_TILE_COMPOSE_WORK_PARAM; void CALLBACK rfx_compose_message_tile_work_callback(PTP_CALLBACK_INSTANCE instance, void* context, PTP_WORK work) { - RFX_TILE* tile; RFX_TILE_COMPOSE_WORK_PARAM* param = (RFX_TILE_COMPOSE_WORK_PARAM*) context; - tile = param->tile; - /** * We need to clear the stream as the RLGR encoder expects it to be initialized to zero. * This allows simplifying and improving the performance of the encoding process. */ Stream_Clear(param->s); - rfx_compose_message_tile(param->context, param->s, - tile->data, tile->width, tile->height, param->rowstride, - param->quantVals, tile->quantIdxY, tile->quantIdxCb, tile->quantIdxCr, tile->xIdx, tile->yIdx); + rfx_compose_message_tile(param->context, param->s, param->tile, param->rowstride); } static void rfx_compose_message_tileset(RFX_CONTEXT* context, wStream* s, @@ -1082,9 +1068,6 @@ static void rfx_compose_message_tileset(RFX_CONTEXT* context, wStream* s, int numQuants; const UINT32* quantVals; const UINT32* quantValsPtr; - int quantIdxY; - int quantIdxCb; - int quantIdxCr; int numTiles; int numTilesX; int numTilesY; @@ -1094,23 +1077,18 @@ static void rfx_compose_message_tileset(RFX_CONTEXT* context, wStream* s, PTP_WORK* work_objects = NULL; RFX_TILE_COMPOSE_WORK_PARAM* params = NULL; - if (context->num_quants == 0) + if (!context->numQuant) { - numQuants = 1; - quantVals = rfx_default_quantization_values; - quantIdxY = 0; - quantIdxCb = 0; - quantIdxCr = 0; - } - else - { - numQuants = context->num_quants; - quantVals = context->quants; - quantIdxY = context->quant_idx_y; - quantIdxCb = context->quant_idx_cb; - quantIdxCr = context->quant_idx_cr; + context->numQuant = 1; + context->quants = (UINT32*) rfx_default_quantization_values; + context->quantIdxY = 0; + context->quantIdxCb = 0; + context->quantIdxCr = 0; } + numQuants = context->numQuant; + quantVals = context->quants; + numTilesX = (width + 63) / 64; numTilesY = (height + 63) / 64; numTiles = numTilesX * numTilesY; @@ -1160,9 +1138,9 @@ static void rfx_compose_message_tileset(RFX_CONTEXT* context, wStream* s, tile->width = (xIdx < numTilesX - 1) ? 64 : width - xIdx * 64; tile->height = (yIdx < numTilesY - 1) ? 64 : height - yIdx * 64; - tile->quantIdxY = quantIdxY; - tile->quantIdxCb = quantIdxCb; - tile->quantIdxCr = quantIdxCr; + tile->quantIdxY = context->quantIdxY; + tile->quantIdxCb = context->quantIdxCb; + tile->quantIdxCr = context->quantIdxCr; tile->xIdx = xIdx; tile->yIdx = yIdx; tile->YLen = 0; @@ -1177,7 +1155,6 @@ static void rfx_compose_message_tileset(RFX_CONTEXT* context, wStream* s, params[i].context = context; params[i].s = StreamPool_Take(context->priv->EncoderStreamPool, 0); params[i].rowstride = rowstride; - params[i].quantVals = (UINT32*) quantVals; work_objects[i] = CreateThreadpoolWork((PTP_WORK_CALLBACK) rfx_compose_message_tile_work_callback, (void*) ¶ms[i], &context->priv->ThreadPoolEnv); @@ -1186,9 +1163,7 @@ static void rfx_compose_message_tileset(RFX_CONTEXT* context, wStream* s, } else { - rfx_compose_message_tile(context, s, tile->data, tile->width, tile->height, - rowstride, quantVals, tile->quantIdxY, tile->quantIdxCb, tile->quantIdxCr, - tile->xIdx, tile->yIdx); + rfx_compose_message_tile(context, s, tile, rowstride); } } } diff --git a/libfreerdp/codec/rfx_encode.c b/libfreerdp/codec/rfx_encode.c index 0bed64925..a97215deb 100644 --- a/libfreerdp/codec/rfx_encode.c +++ b/libfreerdp/codec/rfx_encode.c @@ -217,14 +217,19 @@ static void rfx_encode_component(RFX_CONTEXT* context, const UINT32* quantizatio BufferPool_Return(context->priv->BufferPool, dwt_buffer); } -void rfx_encode_rgb(RFX_CONTEXT* context, const BYTE* rgb_data, int width, int height, int rowstride, - const UINT32* y_quants, const UINT32* cb_quants, const UINT32* cr_quants, - wStream* data_out, int* y_size, int* cb_size, int* cr_size) +void rfx_encode_rgb(RFX_CONTEXT* context, RFX_TILE* tile, int rowstride, wStream* s) { INT16* pSrcDst[3]; + int YLen, CbLen, CrLen; + UINT32 *y_quants, *cb_quants, *cr_quants; primitives_t* prims = primitives_get(); static const prim_size_t roi_64x64 = { 64, 64 }; + YLen = CbLen = CrLen = 0; + y_quants = context->quants + (tile->quantIdxY * 10); + cb_quants = context->quants + (tile->quantIdxCb * 10); + cr_quants = context->quants + (tile->quantIdxCr * 10); + pSrcDst[0] = (INT16*)((BYTE*)BufferPool_Take(context->priv->BufferPool, -1) + 16); /* y_r_buffer */ pSrcDst[1] = (INT16*)((BYTE*)BufferPool_Take(context->priv->BufferPool, -1) + 16); /* cb_g_buffer */ pSrcDst[2] = (INT16*)((BYTE*)BufferPool_Take(context->priv->BufferPool, -1) + 16); /* cr_b_buffer */ @@ -232,7 +237,7 @@ void rfx_encode_rgb(RFX_CONTEXT* context, const BYTE* rgb_data, int width, int h PROFILER_ENTER(context->priv->prof_rfx_encode_rgb); PROFILER_ENTER(context->priv->prof_rfx_encode_format_rgb); - rfx_encode_format_rgb(rgb_data, width, height, rowstride, + rfx_encode_format_rgb(tile->data, tile->width, tile->height, rowstride, context->pixel_format, context->palette, pSrcDst[0], pSrcDst[1], pSrcDst[2]); PROFILER_EXIT(context->priv->prof_rfx_encode_format_rgb); @@ -242,21 +247,25 @@ void rfx_encode_rgb(RFX_CONTEXT* context, const BYTE* rgb_data, int width, int h PROFILER_EXIT(context->priv->prof_rfx_rgb_to_ycbcr); /* Ensure the buffer is reasonably large enough */ - Stream_EnsureRemainingCapacity(data_out, 4096); + Stream_EnsureRemainingCapacity(s, 4096); rfx_encode_component(context, y_quants, pSrcDst[0], - Stream_Pointer(data_out), Stream_GetRemainingLength(data_out), y_size); - Stream_Seek(data_out, *y_size); + Stream_Pointer(s), Stream_GetRemainingLength(s), &YLen); + Stream_Seek(s, YLen); - Stream_EnsureRemainingCapacity(data_out, 4096); + Stream_EnsureRemainingCapacity(s, 4096); rfx_encode_component(context, cb_quants, pSrcDst[1], - Stream_Pointer(data_out), Stream_GetRemainingLength(data_out), cb_size); - Stream_Seek(data_out, *cb_size); + Stream_Pointer(s), Stream_GetRemainingLength(s), &CbLen); + Stream_Seek(s, CbLen); - Stream_EnsureRemainingCapacity(data_out, 4096); + Stream_EnsureRemainingCapacity(s, 4096); rfx_encode_component(context, cr_quants, pSrcDst[2], - Stream_Pointer(data_out), Stream_GetRemainingLength(data_out), cr_size); - Stream_Seek(data_out, *cr_size); + Stream_Pointer(s), Stream_GetRemainingLength(s), &CrLen); + Stream_Seek(s, CrLen); + + tile->YLen = (UINT16) YLen; + tile->CbLen = (UINT16) CbLen; + tile->CrLen = (UINT16) CrLen; PROFILER_EXIT(context->priv->prof_rfx_encode_rgb); diff --git a/libfreerdp/codec/rfx_encode.h b/libfreerdp/codec/rfx_encode.h index e329bded2..ff1197b7f 100644 --- a/libfreerdp/codec/rfx_encode.h +++ b/libfreerdp/codec/rfx_encode.h @@ -22,9 +22,7 @@ #include -void rfx_encode_rgb(RFX_CONTEXT* context, const BYTE* rgb_data, int width, int height, int rowstride, - const UINT32* y_quants, const UINT32* cb_quants, const UINT32* cr_quants, - wStream* data_out, int* y_size, int* cb_size, int* cr_size); +void rfx_encode_rgb(RFX_CONTEXT* context, RFX_TILE* tile, int rowstride, wStream* s); #endif