diff options
author | Stephen Erisman <serisman@serisman.com> | 2011-06-16 05:40:47 +0400 |
---|---|---|
committer | Stephen Erisman <serisman@serisman.com> | 2011-06-16 05:40:47 +0400 |
commit | 6deecb6f8cd1814096414160df8f03814c59269b (patch) | |
tree | fac1bb23b9113acc3359c5725b353d7dca4f3aae | |
parent | 597575898dc5b3ab38f2c9b6127483b951e1bc46 (diff) |
libfreerdp-rfx: break out rfx_decode_format_RGB and add to profiler
-rw-r--r-- | include/freerdp/rfx.h | 1 | ||||
-rw-r--r-- | libfreerdp-rfx/librfx.c | 3 | ||||
-rw-r--r-- | libfreerdp-rfx/rfx_decode.c | 113 |
3 files changed, 60 insertions, 57 deletions
diff --git a/include/freerdp/rfx.h b/include/freerdp/rfx.h index a433cc2..3737b4d 100644 --- a/include/freerdp/rfx.h +++ b/include/freerdp/rfx.h @@ -179,6 +179,7 @@ struct _RFX_CONTEXT PROFILER_DEFINE(prof_rfx_quantization_decode); PROFILER_DEFINE(prof_rfx_dwt_2d_decode); PROFILER_DEFINE(prof_rfx_decode_YCbCr_to_RGB); + PROFILER_DEFINE(prof_rfx_decode_format_RGB); }; typedef struct _RFX_CONTEXT RFX_CONTEXT; diff --git a/libfreerdp-rfx/librfx.c b/libfreerdp-rfx/librfx.c index da37ab3..990f9a7 100644 --- a/libfreerdp-rfx/librfx.c +++ b/libfreerdp-rfx/librfx.c @@ -59,6 +59,7 @@ void rfx_profiler_create(RFX_CONTEXT * context) PROFILER_CREATE(context->prof_rfx_quantization_decode, "rfx_quantization_decode"); PROFILER_CREATE(context->prof_rfx_dwt_2d_decode, "rfx_dwt_2d_decode"); PROFILER_CREATE(context->prof_rfx_decode_YCbCr_to_RGB, "rfx_decode_YCbCr_to_RGB"); + PROFILER_CREATE(context->prof_rfx_decode_format_RGB, "rfx_decode_format_RGB"); } void rfx_profiler_free(RFX_CONTEXT * context) @@ -70,6 +71,7 @@ void rfx_profiler_free(RFX_CONTEXT * context) PROFILER_FREE(context->prof_rfx_quantization_decode); PROFILER_FREE(context->prof_rfx_dwt_2d_decode); PROFILER_FREE(context->prof_rfx_decode_YCbCr_to_RGB); + PROFILER_FREE(context->prof_rfx_decode_format_RGB); } void rfx_profiler_print(RFX_CONTEXT * context) @@ -82,6 +84,7 @@ void rfx_profiler_print(RFX_CONTEXT * context) PROFILER_PRINT(context->prof_rfx_quantization_decode); PROFILER_PRINT(context->prof_rfx_dwt_2d_decode); PROFILER_PRINT(context->prof_rfx_decode_YCbCr_to_RGB); + PROFILER_PRINT(context->prof_rfx_decode_format_RGB); PROFILER_PRINT_FOOTER; } diff --git a/libfreerdp-rfx/rfx_decode.c b/libfreerdp-rfx/rfx_decode.c index 5735095..072f2c4 100644 --- a/libfreerdp-rfx/rfx_decode.c +++ b/libfreerdp-rfx/rfx_decode.c @@ -27,6 +27,57 @@ #include "rfx_decode.h" +static __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__)) +rfx_decode_format_RGB(sint16 * r_buf, sint16 * g_buf, sint16 * b_buf, + RFX_PIXEL_FORMAT pixel_format, uint8 * dst_buf) +{ + sint16 * r = r_buf; + sint16 * g = g_buf; + sint16 * b = b_buf; + uint8 * dst = dst_buf; + int i; + + switch (pixel_format) + { + case RFX_PIXEL_FORMAT_BGRA: + for (i = 0; i < 4096; i++) + { + *dst++ = (uint8) (*b++); + *dst++ = (uint8) (*g++); + *dst++ = (uint8) (*r++); + *dst++ = 0xFF; + } + break; + case RFX_PIXEL_FORMAT_RGBA: + for (i = 0; i < 4096; i++) + { + *dst++ = (uint8) (*r++); + *dst++ = (uint8) (*g++); + *dst++ = (uint8) (*b++); + *dst++ = 0xFF; + } + break; + case RFX_PIXEL_FORMAT_BGR: + for (i = 0; i < 4096; i++) + { + *dst++ = (uint8) (*b++); + *dst++ = (uint8) (*g++); + *dst++ = (uint8) (*r++); + } + break; + case RFX_PIXEL_FORMAT_RGB: + for (i = 0; i < 4096; i++) + { + *dst++ = (uint8) (*r++); + *dst++ = (uint8) (*g++); + *dst++ = (uint8) (*b++); + } + break; + default: + break; + } +} + #define MINMAX(_v,_l,_h) ((_v) < (_l) ? (_l) : ((_v) > (_h) ? (_h) : (_v))) void @@ -81,13 +132,8 @@ rfx_decode_rgb(RFX_CONTEXT * context, const uint8 * cb_data, int cb_size, const uint32 * cb_quants, const uint8 * cr_data, int cr_size, const uint32 * cr_quants, uint8* rgb_buffer) { - int i; - uint8 * dst; - sint16 * r, * g, * b; - PROFILER_ENTER(context->prof_rfx_decode_rgb); - dst = rgb_buffer; rfx_decode_component(context, y_quants, y_data, y_size, context->y_r_buffer); rfx_decode_component(context, cb_quants, cb_data, cb_size, context->cb_g_buffer); rfx_decode_component(context, cr_quants, cr_data, cr_size, context->cr_b_buffer); @@ -96,58 +142,11 @@ rfx_decode_rgb(RFX_CONTEXT * context, context->decode_YCbCr_to_RGB(context->y_r_buffer, context->cb_g_buffer, context->cr_b_buffer); PROFILER_EXIT(context->prof_rfx_decode_YCbCr_to_RGB); - switch (context->pixel_format) - { - case RFX_PIXEL_FORMAT_BGRA: - r = context->y_r_buffer; - g = context->cb_g_buffer; - b = context->cr_b_buffer; - for (i = 0; i < 4096; i++) - { - *dst++ = (uint8) (*b++); - *dst++ = (uint8) (*g++); - *dst++ = (uint8) (*r++); - *dst++ = 0xFF; - } - break; - case RFX_PIXEL_FORMAT_RGBA: - r = context->y_r_buffer; - g = context->cb_g_buffer; - b = context->cr_b_buffer; - for (i = 0; i < 4096; i++) - { - *dst++ = (uint8) (*r++); - *dst++ = (uint8) (*g++); - *dst++ = (uint8) (*b++); - *dst++ = 0xFF; - } - break; - case RFX_PIXEL_FORMAT_BGR: - r = context->y_r_buffer; - g = context->cb_g_buffer; - b = context->cr_b_buffer; - for (i = 0; i < 4096; i++) - { - *dst++ = (uint8) (*b++); - *dst++ = (uint8) (*g++); - *dst++ = (uint8) (*r++); - } - break; - case RFX_PIXEL_FORMAT_RGB: - r = context->y_r_buffer; - g = context->cb_g_buffer; - b = context->cr_b_buffer; - for (i = 0; i < 4096; i++) - { - *dst++ = (uint8) (*r++); - *dst++ = (uint8) (*g++); - *dst++ = (uint8) (*b++); - } - break; - default: - break; - } - + PROFILER_ENTER(context->prof_rfx_decode_format_RGB); + rfx_decode_format_RGB(context->y_r_buffer, context->cb_g_buffer, context->cr_b_buffer, + context->pixel_format, rgb_buffer); + PROFILER_EXIT(context->prof_rfx_decode_format_RGB); + PROFILER_EXIT(context->prof_rfx_decode_rgb); return rgb_buffer; } |