libfreerdp-codec: refactor internal rfx_compose_message_tile
This commit is contained in:
parent
916a4eee4b
commit
482e836ad8
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -22,9 +22,7 @@
|
||||
|
||||
#include <freerdp/codec/rfx.h>
|
||||
|
||||
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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user