libfreerdp-codec: remove old RemoteFX tile pool
This commit is contained in:
parent
d8875ae3e7
commit
9a7bcbb084
@ -31,8 +31,6 @@ set(${MODULE_PREFIX}_SRCS
|
|||||||
rfx_dwt.h
|
rfx_dwt.h
|
||||||
rfx_encode.c
|
rfx_encode.c
|
||||||
rfx_encode.h
|
rfx_encode.h
|
||||||
rfx_pool.c
|
|
||||||
rfx_pool.h
|
|
||||||
rfx_quantization.c
|
rfx_quantization.c
|
||||||
rfx_quantization.h
|
rfx_quantization.h
|
||||||
rfx_rlgr.c
|
rfx_rlgr.c
|
||||||
@ -98,8 +96,11 @@ set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS
|
|||||||
MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL
|
MONOLITHIC ${MONOLITHIC_BUILD} INTERNAL
|
||||||
MODULE freerdp
|
MODULE freerdp
|
||||||
MODULES freerdp-primitives freerdp-utils)
|
MODULES freerdp-primitives freerdp-utils)
|
||||||
|
|
||||||
message(STATUS "libfreerdp-codec libs: ${${MODULE_PREFIX}_LIBS}")
|
set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS
|
||||||
|
MONOLITHIC ${MONOLITHIC_BUILD}
|
||||||
|
MODULE winpr
|
||||||
|
MODULES winpr-crt winpr-utils)
|
||||||
|
|
||||||
if(MONOLITHIC_BUILD)
|
if(MONOLITHIC_BUILD)
|
||||||
set(FREERDP_LIBS ${FREERDP_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE)
|
set(FREERDP_LIBS ${FREERDP_LIBS} ${${MODULE_PREFIX}_LIBS} PARENT_SCOPE)
|
||||||
|
@ -36,7 +36,6 @@
|
|||||||
|
|
||||||
#include "rfx_constants.h"
|
#include "rfx_constants.h"
|
||||||
#include "rfx_types.h"
|
#include "rfx_types.h"
|
||||||
#include "rfx_pool.h"
|
|
||||||
#include "rfx_decode.h"
|
#include "rfx_decode.h"
|
||||||
#include "rfx_encode.h"
|
#include "rfx_encode.h"
|
||||||
#include "rfx_quantization.h"
|
#include "rfx_quantization.h"
|
||||||
@ -148,7 +147,8 @@ RFX_CONTEXT* rfx_context_new(void)
|
|||||||
context->priv = (RFX_CONTEXT_PRIV*) malloc(sizeof(RFX_CONTEXT_PRIV));
|
context->priv = (RFX_CONTEXT_PRIV*) malloc(sizeof(RFX_CONTEXT_PRIV));
|
||||||
ZeroMemory(context->priv, sizeof(RFX_CONTEXT_PRIV));
|
ZeroMemory(context->priv, sizeof(RFX_CONTEXT_PRIV));
|
||||||
|
|
||||||
context->priv->pool = rfx_pool_new();
|
context->priv->TilePool = Queue_New(TRUE, -1, -1);
|
||||||
|
context->priv->TileQueue = Queue_New(TRUE, -1, -1);
|
||||||
|
|
||||||
/* initialize the default pixel format */
|
/* initialize the default pixel format */
|
||||||
rfx_context_set_pixel_format(context, RDP_PIXEL_FORMAT_B8G8R8A8);
|
rfx_context_set_pixel_format(context, RDP_PIXEL_FORMAT_B8G8R8A8);
|
||||||
@ -183,7 +183,8 @@ void rfx_context_free(RFX_CONTEXT* context)
|
|||||||
{
|
{
|
||||||
free(context->quants);
|
free(context->quants);
|
||||||
|
|
||||||
rfx_pool_free(context->priv->pool);
|
Queue_Free(context->priv->TilePool);
|
||||||
|
Queue_Free(context->priv->TileQueue);
|
||||||
|
|
||||||
rfx_profiler_print(context);
|
rfx_profiler_print(context);
|
||||||
rfx_profiler_free(context);
|
rfx_profiler_free(context);
|
||||||
@ -195,6 +196,7 @@ void rfx_context_free(RFX_CONTEXT* context)
|
|||||||
void rfx_context_set_pixel_format(RFX_CONTEXT* context, RDP_PIXEL_FORMAT pixel_format)
|
void rfx_context_set_pixel_format(RFX_CONTEXT* context, RDP_PIXEL_FORMAT pixel_format)
|
||||||
{
|
{
|
||||||
context->pixel_format = pixel_format;
|
context->pixel_format = pixel_format;
|
||||||
|
|
||||||
switch (pixel_format)
|
switch (pixel_format)
|
||||||
{
|
{
|
||||||
case RDP_PIXEL_FORMAT_B8G8R8A8:
|
case RDP_PIXEL_FORMAT_B8G8R8A8:
|
||||||
@ -227,6 +229,30 @@ void rfx_context_reset(RFX_CONTEXT* context)
|
|||||||
context->frame_idx = 0;
|
context->frame_idx = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RFX_TILE* rfx_tile_pool_take(RFX_CONTEXT* context)
|
||||||
|
{
|
||||||
|
RFX_TILE* tile = NULL;
|
||||||
|
|
||||||
|
if (WaitForSingleObject(Queue_Event(context->priv->TilePool), 0) == WAIT_OBJECT_0)
|
||||||
|
tile = Queue_Dequeue(context->priv->TilePool);
|
||||||
|
|
||||||
|
if (!tile)
|
||||||
|
{
|
||||||
|
tile = (RFX_TILE*) malloc(sizeof(RFX_TILE));
|
||||||
|
|
||||||
|
tile->x = tile->y = 0;
|
||||||
|
tile->data = (BYTE*) malloc(4096 * 4); /* 64x64 * 4 */
|
||||||
|
}
|
||||||
|
|
||||||
|
return tile;
|
||||||
|
}
|
||||||
|
|
||||||
|
int rfx_tile_pool_return(RFX_CONTEXT* context, RFX_TILE* tile)
|
||||||
|
{
|
||||||
|
Queue_Enqueue(context->priv->TilePool, tile);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void rfx_process_message_sync(RFX_CONTEXT* context, STREAM* s)
|
static void rfx_process_message_sync(RFX_CONTEXT* context, STREAM* s)
|
||||||
{
|
{
|
||||||
UINT32 magic;
|
UINT32 magic;
|
||||||
@ -412,7 +438,7 @@ static void rfx_process_message_tile(RFX_CONTEXT* context, RFX_TILE* tile, STREA
|
|||||||
YLen, context->quants + (quantIdxY * 10),
|
YLen, context->quants + (quantIdxY * 10),
|
||||||
CbLen, context->quants + (quantIdxCb * 10),
|
CbLen, context->quants + (quantIdxCb * 10),
|
||||||
CrLen, context->quants + (quantIdxCr * 10),
|
CrLen, context->quants + (quantIdxCr * 10),
|
||||||
tile->data, 64*sizeof(UINT32));
|
tile->data, 64 * sizeof(UINT32));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rfx_process_message_tileset(RFX_CONTEXT* context, RFX_MESSAGE* message, STREAM* s)
|
static void rfx_process_message_tileset(RFX_CONTEXT* context, RFX_MESSAGE* message, STREAM* s)
|
||||||
@ -490,7 +516,8 @@ static void rfx_process_message_tileset(RFX_CONTEXT* context, RFX_MESSAGE* messa
|
|||||||
context->quants[i * 10 + 8], context->quants[i * 10 + 9]);
|
context->quants[i * 10 + 8], context->quants[i * 10 + 9]);
|
||||||
}
|
}
|
||||||
|
|
||||||
message->tiles = rfx_pool_get_tiles(context->priv->pool, message->num_tiles);
|
message->tiles = (RFX_TILE**) malloc(sizeof(RFX_TILE*) * message->num_tiles);
|
||||||
|
ZeroMemory(message->tiles, sizeof(RFX_TILE*) * message->num_tiles);
|
||||||
|
|
||||||
/* tiles */
|
/* tiles */
|
||||||
for (i = 0; i < message->num_tiles; i++)
|
for (i = 0; i < message->num_tiles; i++)
|
||||||
@ -507,6 +534,7 @@ static void rfx_process_message_tileset(RFX_CONTEXT* context, RFX_MESSAGE* messa
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message->tiles[i] = rfx_tile_pool_take(context);
|
||||||
rfx_process_message_tile(context, message->tiles[i], s);
|
rfx_process_message_tile(context, message->tiles[i], s);
|
||||||
|
|
||||||
stream_set_pos(s, pos);
|
stream_set_pos(s, pos);
|
||||||
@ -621,13 +649,17 @@ RFX_RECT* rfx_message_get_rect(RFX_MESSAGE* message, int index)
|
|||||||
|
|
||||||
void rfx_message_free(RFX_CONTEXT* context, RFX_MESSAGE* message)
|
void rfx_message_free(RFX_CONTEXT* context, RFX_MESSAGE* message)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
if (message != NULL)
|
if (message != NULL)
|
||||||
{
|
{
|
||||||
free(message->rects);
|
free(message->rects);
|
||||||
|
|
||||||
if (message->tiles != NULL)
|
if (message->tiles)
|
||||||
{
|
{
|
||||||
rfx_pool_put_tiles(context->priv->pool, message->tiles, message->num_tiles);
|
for (i = 0; i < message->num_tiles; i++)
|
||||||
|
rfx_tile_pool_return(context, message->tiles[i]);
|
||||||
|
|
||||||
free(message->tiles);
|
free(message->tiles);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -790,9 +822,9 @@ static void rfx_compose_message_tile(RFX_CONTEXT* context, STREAM* s,
|
|||||||
static void rfx_compose_message_tileset(RFX_CONTEXT* context, STREAM* s,
|
static void rfx_compose_message_tileset(RFX_CONTEXT* context, STREAM* s,
|
||||||
BYTE* image_data, int width, int height, int rowstride)
|
BYTE* image_data, int width, int height, int rowstride)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
int size;
|
int size;
|
||||||
int start_pos, end_pos;
|
int start_pos, end_pos;
|
||||||
int i;
|
|
||||||
int numQuants;
|
int numQuants;
|
||||||
const UINT32* quantVals;
|
const UINT32* quantVals;
|
||||||
const UINT32* quantValsPtr;
|
const UINT32* quantValsPtr;
|
||||||
|
@ -1,121 +0,0 @@
|
|||||||
/**
|
|
||||||
* FreeRDP: A Remote Desktop Protocol Implementation
|
|
||||||
* RemoteFX Codec Library - Memory Pool
|
|
||||||
*
|
|
||||||
* Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <winpr/crt.h>
|
|
||||||
|
|
||||||
#include "rfx_pool.h"
|
|
||||||
|
|
||||||
RFX_POOL* rfx_pool_new()
|
|
||||||
{
|
|
||||||
RFX_POOL* pool;
|
|
||||||
|
|
||||||
pool = (RFX_POOL*) malloc(sizeof(RFX_POOL));
|
|
||||||
ZeroMemory(pool, sizeof(RFX_POOL));
|
|
||||||
|
|
||||||
pool->size = 64;
|
|
||||||
pool->tiles = (RFX_TILE**) malloc(sizeof(RFX_TILE*) * pool->size);
|
|
||||||
ZeroMemory(pool->tiles, sizeof(RFX_TILE*) * pool->size);
|
|
||||||
|
|
||||||
return pool;
|
|
||||||
}
|
|
||||||
|
|
||||||
void rfx_pool_free(RFX_POOL* pool)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
RFX_TILE* tile;
|
|
||||||
|
|
||||||
for (i = 0; i < pool->count; i++)
|
|
||||||
{
|
|
||||||
tile = pool->tiles[i];
|
|
||||||
|
|
||||||
if (tile != NULL)
|
|
||||||
{
|
|
||||||
if (tile->data != NULL)
|
|
||||||
free(tile->data);
|
|
||||||
|
|
||||||
free(tile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
free(pool->tiles);
|
|
||||||
free(pool);
|
|
||||||
}
|
|
||||||
|
|
||||||
void rfx_pool_put_tile(RFX_POOL* pool, RFX_TILE* tile)
|
|
||||||
{
|
|
||||||
if (pool->count >= pool->size)
|
|
||||||
{
|
|
||||||
pool->size *= 2;
|
|
||||||
pool->tiles = (RFX_TILE**) realloc((void*) pool->tiles, sizeof(RFX_TILE*) * pool->size);
|
|
||||||
}
|
|
||||||
|
|
||||||
pool->tiles[(pool->count)++] = tile;
|
|
||||||
}
|
|
||||||
|
|
||||||
RFX_TILE* rfx_pool_get_tile(RFX_POOL* pool)
|
|
||||||
{
|
|
||||||
RFX_TILE* tile;
|
|
||||||
|
|
||||||
if (pool->count < 1)
|
|
||||||
{
|
|
||||||
tile = (RFX_TILE*) malloc(sizeof(RFX_TILE));
|
|
||||||
ZeroMemory(tile, sizeof(RFX_TILE));
|
|
||||||
|
|
||||||
tile->data = (BYTE*) malloc(4096 * 4); /* 64x64 * 4 */
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tile = pool->tiles[--(pool->count)];
|
|
||||||
}
|
|
||||||
|
|
||||||
return tile;
|
|
||||||
}
|
|
||||||
|
|
||||||
void rfx_pool_put_tiles(RFX_POOL* pool, RFX_TILE** tiles, int count)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < count; i++)
|
|
||||||
{
|
|
||||||
rfx_pool_put_tile(pool, tiles[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RFX_TILE** rfx_pool_get_tiles(RFX_POOL* pool, int count)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
RFX_TILE** tiles;
|
|
||||||
|
|
||||||
tiles = (RFX_TILE**) malloc(sizeof(RFX_TILE*) * count);
|
|
||||||
|
|
||||||
for (i = 0; i < count; i++)
|
|
||||||
{
|
|
||||||
tiles[i] = rfx_pool_get_tile(pool);
|
|
||||||
}
|
|
||||||
|
|
||||||
return tiles;
|
|
||||||
}
|
|
@ -1,40 +0,0 @@
|
|||||||
/**
|
|
||||||
* FreeRDP: A Remote Desktop Protocol Implementation
|
|
||||||
* RemoteFX Codec Library - Memory Pool
|
|
||||||
*
|
|
||||||
* Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __RFX_POOL_H
|
|
||||||
#define __RFX_POOL_H
|
|
||||||
|
|
||||||
#include <freerdp/codec/rfx.h>
|
|
||||||
|
|
||||||
struct _RFX_POOL
|
|
||||||
{
|
|
||||||
int size;
|
|
||||||
int count;
|
|
||||||
RFX_TILE** tiles;
|
|
||||||
};
|
|
||||||
typedef struct _RFX_POOL RFX_POOL;
|
|
||||||
|
|
||||||
RFX_POOL* rfx_pool_new();
|
|
||||||
void rfx_pool_free(RFX_POOL* pool);
|
|
||||||
void rfx_pool_put_tile(RFX_POOL* pool, RFX_TILE* tile);
|
|
||||||
RFX_TILE* rfx_pool_get_tile(RFX_POOL* pool);
|
|
||||||
void rfx_pool_put_tiles(RFX_POOL* pool, RFX_TILE** tiles, int count);
|
|
||||||
RFX_TILE** rfx_pool_get_tiles(RFX_POOL* pool, int count);
|
|
||||||
|
|
||||||
#endif /* __RFX_POOL_H */
|
|
@ -24,6 +24,9 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <winpr/crt.h>
|
||||||
|
#include <winpr/collections.h>
|
||||||
|
|
||||||
#include <freerdp/utils/debug.h>
|
#include <freerdp/utils/debug.h>
|
||||||
#include <freerdp/utils/profiler.h>
|
#include <freerdp/utils/profiler.h>
|
||||||
|
|
||||||
@ -33,13 +36,12 @@
|
|||||||
#define DEBUG_RFX(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
|
#define DEBUG_RFX(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "rfx_pool.h"
|
|
||||||
|
|
||||||
struct _RFX_CONTEXT_PRIV
|
struct _RFX_CONTEXT_PRIV
|
||||||
{
|
{
|
||||||
/* pre-allocated buffers */
|
/* pre-allocated buffers */
|
||||||
|
|
||||||
RFX_POOL* pool; /* memory pool */
|
wQueue* TilePool;
|
||||||
|
wQueue* TileQueue;
|
||||||
|
|
||||||
INT16 y_r_mem[4096 + 8]; /* 4096 = 64x64 (+ 8x2 = 16 for mem align) */
|
INT16 y_r_mem[4096 + 8]; /* 4096 = 64x64 (+ 8x2 = 16 for mem align) */
|
||||||
INT16 cb_g_mem[4096 + 8]; /* 4096 = 64x64 (+ 8x2 = 16 for mem align) */
|
INT16 cb_g_mem[4096 + 8]; /* 4096 = 64x64 (+ 8x2 = 16 for mem align) */
|
||||||
|
@ -138,8 +138,21 @@ void Queue_Enqueue(wQueue* queue, void* obj)
|
|||||||
|
|
||||||
if (queue->size == queue->capacity)
|
if (queue->size == queue->capacity)
|
||||||
{
|
{
|
||||||
queue->capacity *= queue->growthFactor;
|
int old_capacity;
|
||||||
|
int new_capacity;
|
||||||
|
|
||||||
|
old_capacity = queue->capacity;
|
||||||
|
new_capacity = queue->capacity * queue->growthFactor;
|
||||||
|
|
||||||
|
queue->capacity = new_capacity;
|
||||||
queue->array = (void**) realloc(queue->array, sizeof(void*) * queue->capacity);
|
queue->array = (void**) realloc(queue->array, sizeof(void*) * queue->capacity);
|
||||||
|
ZeroMemory(&(queue->array[old_capacity]), old_capacity * sizeof(void*));
|
||||||
|
|
||||||
|
if (queue->tail < (old_capacity - 1))
|
||||||
|
{
|
||||||
|
CopyMemory(&(queue->array[old_capacity]), queue->array, queue->tail * sizeof(void*));
|
||||||
|
queue->tail += old_capacity;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
queue->array[queue->tail] = obj;
|
queue->array[queue->tail] = obj;
|
||||||
|
@ -18,7 +18,6 @@ int TestQueue(int argc, char* argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
count = Queue_Count(queue);
|
count = Queue_Count(queue);
|
||||||
|
|
||||||
printf("queue count: %d\n", count);
|
printf("queue count: %d\n", count);
|
||||||
|
|
||||||
for (index = 1; index <= 10; index++)
|
for (index = 1; index <= 10; index++)
|
||||||
@ -29,6 +28,25 @@ int TestQueue(int argc, char* argv[])
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
count = Queue_Count(queue);
|
||||||
|
printf("queue count: %d\n", count);
|
||||||
|
|
||||||
|
Queue_Enqueue(queue, (void*) (size_t) 1);
|
||||||
|
Queue_Enqueue(queue, (void*) (size_t) 2);
|
||||||
|
Queue_Enqueue(queue, (void*) (size_t) 3);
|
||||||
|
|
||||||
|
Queue_Dequeue(queue);
|
||||||
|
Queue_Dequeue(queue);
|
||||||
|
|
||||||
|
Queue_Enqueue(queue, (void*) (size_t) 4);
|
||||||
|
Queue_Enqueue(queue, (void*) (size_t) 5);
|
||||||
|
Queue_Enqueue(queue, (void*) (size_t) 6);
|
||||||
|
|
||||||
|
Queue_Dequeue(queue);
|
||||||
|
Queue_Dequeue(queue);
|
||||||
|
Queue_Dequeue(queue);
|
||||||
|
Queue_Dequeue(queue);
|
||||||
|
|
||||||
Queue_Clear(queue);
|
Queue_Clear(queue);
|
||||||
Queue_Free(queue);
|
Queue_Free(queue);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user