diff options
author | Vic Lee <llyzs@163.com> | 2011-06-22 11:47:24 +0400 |
---|---|---|
committer | Vic Lee <llyzs@163.com> | 2011-06-22 11:47:24 +0400 |
commit | a79037ca6d95aed69f01f702af0acc95d931b551 (patch) | |
tree | cee764e31d66d84fb6cbc1b4140d4c770f64694d | |
parent | 187b344622d55857e92bc29a50cb8eabb2009a7e (diff) |
libfreerdp-rfx: simplify DWT working buffer.
It's not necessary to have one buffer per tile size 8/16/32, since the buffer is only a temporary calculation area between horizontal and vertical transformation and once done the data is useless. Allocate the maximum required buffer saves some memory usage.
-rw-r--r-- | cunit/test_librfx.c | 2 | ||||
-rw-r--r-- | include/freerdp/rfx.h | 10 | ||||
-rw-r--r-- | libfreerdp-rfx/librfx.c | 4 | ||||
-rw-r--r-- | libfreerdp-rfx/rfx_decode.c | 2 | ||||
-rw-r--r-- | libfreerdp-rfx/rfx_dwt.c | 16 | ||||
-rw-r--r-- | libfreerdp-rfx/rfx_dwt.h | 4 | ||||
-rw-r--r-- | libfreerdp-rfx/rfx_encode.c | 2 | ||||
-rw-r--r-- | libfreerdp-rfx/sse/rfx_sse2.c | 8 | ||||
-rw-r--r-- | libfreerdp-rfx/sse/rfx_sse2.h | 2 |
9 files changed, 22 insertions, 28 deletions
diff --git a/cunit/test_librfx.c b/cunit/test_librfx.c index 584ac7a..78c453d 100644 --- a/cunit/test_librfx.c +++ b/cunit/test_librfx.c @@ -269,7 +269,7 @@ test_dwt(void) RFX_CONTEXT * context; context = rfx_context_new(); - rfx_dwt_2d_decode(buffer, context->dwt_buffer_8, context->dwt_buffer_16, context->dwt_buffer_32); + rfx_dwt_2d_decode(buffer, context->dwt_buffer); //dump_buffer(buffer, 4096); rfx_context_free(context); } diff --git a/include/freerdp/rfx.h b/include/freerdp/rfx.h index 7cf309c..7b2fede 100644 --- a/include/freerdp/rfx.h +++ b/include/freerdp/rfx.h @@ -157,20 +157,16 @@ struct _RFX_CONTEXT sint16 * cb_g_buffer; sint16 * cr_b_buffer; - sint16 dwt_mem_8[8*8*2*2 + 8]; /* sub-band width 8 */ - sint16 dwt_mem_16[16*16*2*2 + 8]; /* sub-band width 16 */ - sint16 dwt_mem_32[32*32*2*2 + 8]; /* sub-band width 32 */ + sint16 dwt_mem[32*32*2*2 + 8]; /* maximum sub-band width is 32 */ - sint16 * dwt_buffer_8; - sint16 * dwt_buffer_16; - sint16 * dwt_buffer_32; + sint16 * dwt_buffer; /* routines */ void (* decode_YCbCr_to_RGB)(sint16 * y_r_buf, sint16 * cb_g_buf, sint16 * cr_b_buf); void (* encode_RGB_to_YCbCr)(sint16 * y_r_buf, sint16 * cb_g_buf, sint16 * cr_b_buf); void (* quantization_decode)(sint16 * buffer, const uint32 * quantization_values); void (* quantization_encode)(sint16 * buffer, const uint32 * quantization_values); - void (* dwt_2d_decode)(sint16 * buffer, sint16 * dwt_buffer_8, sint16 * dwt_buffer_16, sint16 * dwt_buffer_32); + void (* dwt_2d_decode)(sint16 * buffer, sint16 * dwt_buffer); /* profiler definitions */ PROFILER_DEFINE(prof_rfx_decode_rgb); diff --git a/libfreerdp-rfx/librfx.c b/libfreerdp-rfx/librfx.c index c8e5bee..1693bfb 100644 --- a/libfreerdp-rfx/librfx.c +++ b/libfreerdp-rfx/librfx.c @@ -135,9 +135,7 @@ rfx_context_new(void) context->cb_g_buffer = (sint16 *)(((uintptr_t)context->cb_g_mem + 16) & ~ 0x0F); context->cr_b_buffer = (sint16 *)(((uintptr_t)context->cr_b_mem + 16) & ~ 0x0F); - context->dwt_buffer_8 = (sint16 *)(((uintptr_t)context->dwt_mem_8 + 16) & ~ 0x0F); - context->dwt_buffer_16 = (sint16 *)(((uintptr_t)context->dwt_mem_16 + 16) & ~ 0x0F); - context->dwt_buffer_32 = (sint16 *)(((uintptr_t)context->dwt_mem_32 + 16) & ~ 0x0F); + context->dwt_buffer = (sint16 *)(((uintptr_t)context->dwt_mem + 16) & ~ 0x0F); /* create profilers for default decoding routines */ rfx_profiler_create(context); diff --git a/libfreerdp-rfx/rfx_decode.c b/libfreerdp-rfx/rfx_decode.c index aff61ef..8dc8853 100644 --- a/libfreerdp-rfx/rfx_decode.c +++ b/libfreerdp-rfx/rfx_decode.c @@ -120,7 +120,7 @@ rfx_decode_component(RFX_CONTEXT * context, const uint32 * quantization_values, PROFILER_EXIT(context->prof_rfx_quantization_decode); PROFILER_ENTER(context->prof_rfx_dwt_2d_decode); - context->dwt_2d_decode(buffer, context->dwt_buffer_8, context->dwt_buffer_16, context->dwt_buffer_32); + context->dwt_2d_decode(buffer, context->dwt_buffer); PROFILER_EXIT(context->prof_rfx_dwt_2d_decode); PROFILER_EXIT(context->prof_rfx_decode_component); diff --git a/libfreerdp-rfx/rfx_dwt.c b/libfreerdp-rfx/rfx_dwt.c index 97b8ec6..5fc5f64 100644 --- a/libfreerdp-rfx/rfx_dwt.c +++ b/libfreerdp-rfx/rfx_dwt.c @@ -106,11 +106,11 @@ rfx_dwt_2d_decode_block(sint16 * buffer, sint16 * idwt, int subband_width) } void -rfx_dwt_2d_decode(sint16 * buffer, sint16 * dwt_buffer_8, sint16 * dwt_buffer_16, sint16 * dwt_buffer_32) +rfx_dwt_2d_decode(sint16 * buffer, sint16 * dwt_buffer) { - rfx_dwt_2d_decode_block(buffer + 3840, dwt_buffer_8, 8); - rfx_dwt_2d_decode_block(buffer + 3072, dwt_buffer_16, 16); - rfx_dwt_2d_decode_block(buffer, dwt_buffer_32, 32); + rfx_dwt_2d_decode_block(buffer + 3840, dwt_buffer, 8); + rfx_dwt_2d_decode_block(buffer + 3072, dwt_buffer, 16); + rfx_dwt_2d_decode_block(buffer, dwt_buffer, 32); } void @@ -190,9 +190,9 @@ rfx_dwt_2d_encode_block(sint16 * buffer, sint16 * dwt, int subband_width) } void -rfx_dwt_2d_encode(sint16 * buffer, sint16 * dwt_buffer_8, sint16 * dwt_buffer_16, sint16 * dwt_buffer_32) +rfx_dwt_2d_encode(sint16 * buffer, sint16 * dwt_buffer) { - rfx_dwt_2d_encode_block(buffer, dwt_buffer_32, 32); - rfx_dwt_2d_encode_block(buffer + 3072, dwt_buffer_16, 16); - rfx_dwt_2d_encode_block(buffer + 3840, dwt_buffer_8, 8); + rfx_dwt_2d_encode_block(buffer, dwt_buffer, 32); + rfx_dwt_2d_encode_block(buffer + 3072, dwt_buffer, 16); + rfx_dwt_2d_encode_block(buffer + 3840, dwt_buffer, 8); } diff --git a/libfreerdp-rfx/rfx_dwt.h b/libfreerdp-rfx/rfx_dwt.h index 6fee77d..449d61c 100644 --- a/libfreerdp-rfx/rfx_dwt.h +++ b/libfreerdp-rfx/rfx_dwt.h @@ -23,9 +23,9 @@ #include <freerdp/rfx.h> void -rfx_dwt_2d_decode(sint16 * buffer, sint16 * dwt_buffer_8, sint16 * dwt_buffer_16, sint16 * dwt_buffer_32); +rfx_dwt_2d_decode(sint16 * buffer, sint16 * dwt_buffer); void -rfx_dwt_2d_encode(sint16 * buffer, sint16 * dwt_buffer_8, sint16 * dwt_buffer_16, sint16 * dwt_buffer_32); +rfx_dwt_2d_encode(sint16 * buffer, sint16 * dwt_buffer); #endif diff --git a/libfreerdp-rfx/rfx_encode.c b/libfreerdp-rfx/rfx_encode.c index e458dd1..ddb9d2d 100644 --- a/libfreerdp-rfx/rfx_encode.c +++ b/libfreerdp-rfx/rfx_encode.c @@ -132,7 +132,7 @@ rfx_encode_component(RFX_CONTEXT * context, const uint32 * quantization_values, PROFILER_ENTER(context->prof_rfx_encode_component); PROFILER_ENTER(context->prof_rfx_dwt_2d_encode); - rfx_dwt_2d_encode(data, context->dwt_buffer_8, context->dwt_buffer_16, context->dwt_buffer_32); + rfx_dwt_2d_encode(data, context->dwt_buffer); PROFILER_EXIT(context->prof_rfx_dwt_2d_encode); PROFILER_ENTER(context->prof_rfx_quantization_encode); diff --git a/libfreerdp-rfx/sse/rfx_sse2.c b/libfreerdp-rfx/sse/rfx_sse2.c index 63dfdcf..a215f86 100644 --- a/libfreerdp-rfx/sse/rfx_sse2.c +++ b/libfreerdp-rfx/sse/rfx_sse2.c @@ -415,11 +415,11 @@ rfx_dwt_2d_decode_block_SSE2(sint16 * buffer, sint16 * idwt, int subband_width) } void -rfx_dwt_2d_decode_SSE2(sint16 * buffer, sint16 * dwt_buffer_8, sint16 * dwt_buffer_16, sint16 * dwt_buffer_32) +rfx_dwt_2d_decode_SSE2(sint16 * buffer, sint16 * dwt_buffer) { _mm_prefetch_buffer((char *) buffer, 4096 * sizeof(sint16)); - rfx_dwt_2d_decode_block_SSE2(buffer + 3840, dwt_buffer_8, 8); - rfx_dwt_2d_decode_block_SSE2(buffer + 3072, dwt_buffer_16, 16); - rfx_dwt_2d_decode_block_SSE2(buffer, dwt_buffer_32, 32); + rfx_dwt_2d_decode_block_SSE2(buffer + 3840, dwt_buffer, 8); + rfx_dwt_2d_decode_block_SSE2(buffer + 3072, dwt_buffer, 16); + rfx_dwt_2d_decode_block_SSE2(buffer, dwt_buffer, 32); } diff --git a/libfreerdp-rfx/sse/rfx_sse2.h b/libfreerdp-rfx/sse/rfx_sse2.h index 8f35f7c..0fcf604 100644 --- a/libfreerdp-rfx/sse/rfx_sse2.h +++ b/libfreerdp-rfx/sse/rfx_sse2.h @@ -26,6 +26,6 @@ void rfx_decode_YCbCr_to_RGB_SSE2(sint16 * y_r_buffer, sint16 * cb_g_buffer, sin void rfx_encode_RGB_to_YCbCr_SSE2(sint16 * y_r_buffer, sint16 * cb_g_buffer, sint16 * cr_b_buffer); void rfx_quantization_decode_SSE2(sint16 * buffer, const uint32 * quantization_values); void rfx_quantization_encode_SSE2(sint16 * buffer, const uint32 * quantization_values); -void rfx_dwt_2d_decode_SSE2(sint16 * buffer, sint16 * dwt_buffer_8, sint16 * dwt_buffer_16, sint16 * dwt_buffer_32); +void rfx_dwt_2d_decode_SSE2(sint16 * buffer, sint16 * dwt_buffer); #endif /* __RFX_SSE2_H */ |