diff options
author | Vic Lee <llyzs@163.com> | 2011-06-16 08:43:47 +0400 |
---|---|---|
committer | Vic Lee <llyzs@163.com> | 2011-06-16 08:44:11 +0400 |
commit | 6679e9c80d9fdbfaff79e3477bd129e6a99da96e (patch) | |
tree | dd5ee599dc84f26d4f656cb2028b4db480cfdeb8 | |
parent | e49d00c23e8d19c4599f1e87269a6406778c7657 (diff) |
libfreerdp-rfx: break out rfx_encode_format_RGB.
-rw-r--r-- | libfreerdp-rfx/rfx_encode.c | 135 |
1 files changed, 72 insertions, 63 deletions
diff --git a/libfreerdp-rfx/rfx_encode.c b/libfreerdp-rfx/rfx_encode.c index 8ff2a22..68bffaf 100644 --- a/libfreerdp-rfx/rfx_encode.c +++ b/libfreerdp-rfx/rfx_encode.c @@ -29,52 +29,14 @@ #define MINMAX(_v,_l,_h) ((_v) < (_l) ? (_l) : ((_v) > (_h) ? (_h) : (_v))) -void -rfx_encode_RGB_to_YCbCr(sint16 * y_r_buf, sint16 * cb_g_buf, sint16 * cr_b_buf) -{ - sint16 y, cb, cr; - sint16 r, g, b; - - int i; - for (i = 0; i < 4096; i++) - { - r = y_r_buf[i]; - g = cb_g_buf[i]; - b = cr_b_buf[i]; - y = ((r >> 2) + (r >> 5) + (r >> 6)) + ((g >> 1) + (g >> 4) + (g >> 6) + (g >> 7)) + ((b >> 4) + (b >> 5) + (b >> 6)); - y_r_buf[i] = MINMAX(y, 0, 255) - 128; - cb = 0 - ((r >> 3) + (r >> 5) + (r >> 7)) - ((g >> 2) + (g >> 4) + (g >> 6)) + (b >> 1); - cb_g_buf[i] = MINMAX(cb, -128, 127); - cr = (r >> 1) - ((g >> 2) + (g >> 3) + (g >> 5) + (g >> 7)) - ((b >> 4) + (b >> 6)); - cr_b_buf[i] = MINMAX(cr, -128, 127); - } -} - -static void -rfx_encode_component(RFX_CONTEXT * context, const uint32 * quantization_values, - sint16 * data, uint8 * buffer, int buffer_size, int * size) -{ - rfx_dwt_2d_encode(data, context->dwt_buffer_8, context->dwt_buffer_16, context->dwt_buffer_32); - - rfx_quantization_encode(data, quantization_values); - - rfx_differential_encode(data + 4032, 64); - - *size = rfx_rlgr_encode(context->mode, data, 4096, buffer, buffer_size); -} - -void -rfx_encode_rgb(RFX_CONTEXT * context, const uint8 * rgb_data, int width, int height, int rowstride, - const uint32 * y_quants, const uint32 * cb_quants, const uint32 * cr_quants, - uint8 * ycbcr_buffer, int buffer_size, int * y_size, int * cb_size, int * cr_size) +static __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__)) +rfx_encode_format_RGB(const uint8 * rgb_data, int width, int height, int rowstride, + RFX_PIXEL_FORMAT pixel_format, sint16 * r_buf, sint16 * g_buf, sint16 * b_buf) { int x, y; int x_exceed; int y_exceed; const uint8 * src; - sint16 * y_r_buffer = context->y_r_buffer; - sint16 * cb_g_buffer = context->cb_g_buffer; - sint16 * cr_b_buffer = context->cr_b_buffer; x_exceed = 64 - width; y_exceed = 64 - height; @@ -82,40 +44,40 @@ rfx_encode_rgb(RFX_CONTEXT * context, const uint8 * rgb_data, int width, int hei { src = rgb_data + y * rowstride; - switch (context->pixel_format) + switch (pixel_format) { case RFX_PIXEL_FORMAT_BGRA: for (x = 0; x < width; x++) { - *cr_b_buffer++ = (sint16) (*src++); - *cb_g_buffer++ = (sint16) (*src++); - *y_r_buffer++ = (sint16) (*src++); + *b_buf++ = (sint16) (*src++); + *g_buf++ = (sint16) (*src++); + *r_buf++ = (sint16) (*src++); src++; } break; case RFX_PIXEL_FORMAT_RGBA: for (x = 0; x < width; x++) { - *y_r_buffer++ = (sint16) (*src++); - *cb_g_buffer++ = (sint16) (*src++); - *cr_b_buffer++ = (sint16) (*src++); + *r_buf++ = (sint16) (*src++); + *g_buf++ = (sint16) (*src++); + *b_buf++ = (sint16) (*src++); src++; } break; case RFX_PIXEL_FORMAT_BGR: for (x = 0; x < width; x++) { - *cr_b_buffer++ = (sint16) (*src++); - *cb_g_buffer++ = (sint16) (*src++); - *y_r_buffer++ = (sint16) (*src++); + *b_buf++ = (sint16) (*src++); + *g_buf++ = (sint16) (*src++); + *r_buf++ = (sint16) (*src++); } break; case RFX_PIXEL_FORMAT_RGB: for (x = 0; x < width; x++) { - *y_r_buffer++ = (sint16) (*src++); - *cb_g_buffer++ = (sint16) (*src++); - *cr_b_buffer++ = (sint16) (*src++); + *r_buf++ = (sint16) (*src++); + *g_buf++ = (sint16) (*src++); + *b_buf++ = (sint16) (*src++); } break; default: @@ -124,22 +86,69 @@ rfx_encode_rgb(RFX_CONTEXT * context, const uint8 * rgb_data, int width, int hei /* Fill the horizontal region outside of 64x64 tile size to 0 in order to be better compressed. */ if (x_exceed > 0) { - memset(y_r_buffer, 0, x_exceed * sizeof(sint16)); - memset(cb_g_buffer, 0, x_exceed * sizeof(sint16)); - memset(cr_b_buffer, 0, x_exceed * sizeof(sint16)); - y_r_buffer += x_exceed; - cb_g_buffer += x_exceed; - cr_b_buffer += x_exceed; + memset(r_buf, 0, x_exceed * sizeof(sint16)); + memset(g_buf, 0, x_exceed * sizeof(sint16)); + memset(b_buf, 0, x_exceed * sizeof(sint16)); + r_buf += x_exceed; + g_buf += x_exceed; + b_buf += x_exceed; } } /* Fill the vertical region outside of 64x64 tile size to 0 in order to be better compressed. */ if (y_exceed > 0) { - memset(y_r_buffer, 0, y_exceed * 64 * sizeof(sint16)); - memset(cb_g_buffer, 0, y_exceed * 64 * sizeof(sint16)); - memset(cr_b_buffer, 0, y_exceed * 64 * sizeof(sint16)); + memset(r_buf, 0, y_exceed * 64 * sizeof(sint16)); + memset(g_buf, 0, y_exceed * 64 * sizeof(sint16)); + memset(b_buf, 0, y_exceed * 64 * sizeof(sint16)); + } +} + +void +rfx_encode_RGB_to_YCbCr(sint16 * y_r_buf, sint16 * cb_g_buf, sint16 * cr_b_buf) +{ + sint16 y, cb, cr; + sint16 r, g, b; + + int i; + for (i = 0; i < 4096; i++) + { + r = y_r_buf[i]; + g = cb_g_buf[i]; + b = cr_b_buf[i]; + y = ((r >> 2) + (r >> 5) + (r >> 6)) + ((g >> 1) + (g >> 4) + (g >> 6) + (g >> 7)) + ((b >> 4) + (b >> 5) + (b >> 6)); + y_r_buf[i] = MINMAX(y, 0, 255) - 128; + cb = 0 - ((r >> 3) + (r >> 5) + (r >> 7)) - ((g >> 2) + (g >> 4) + (g >> 6)) + (b >> 1); + cb_g_buf[i] = MINMAX(cb, -128, 127); + cr = (r >> 1) - ((g >> 2) + (g >> 3) + (g >> 5) + (g >> 7)) - ((b >> 4) + (b >> 6)); + cr_b_buf[i] = MINMAX(cr, -128, 127); } +} + +static void +rfx_encode_component(RFX_CONTEXT * context, const uint32 * quantization_values, + sint16 * data, uint8 * buffer, int buffer_size, int * size) +{ + rfx_dwt_2d_encode(data, context->dwt_buffer_8, context->dwt_buffer_16, context->dwt_buffer_32); + + rfx_quantization_encode(data, quantization_values); + + rfx_differential_encode(data + 4032, 64); + + *size = rfx_rlgr_encode(context->mode, data, 4096, buffer, buffer_size); +} + +void +rfx_encode_rgb(RFX_CONTEXT * context, const uint8 * rgb_data, int width, int height, int rowstride, + const uint32 * y_quants, const uint32 * cb_quants, const uint32 * cr_quants, + uint8 * ycbcr_buffer, int buffer_size, int * y_size, int * cb_size, int * cr_size) +{ + sint16 * y_r_buffer = context->y_r_buffer; + sint16 * cb_g_buffer = context->cb_g_buffer; + sint16 * cr_b_buffer = context->cr_b_buffer; + + rfx_encode_format_RGB(rgb_data, width, height, rowstride, + context->pixel_format, y_r_buffer, cb_g_buffer, cr_b_buffer); context->encode_RGB_to_YCbCr(context->y_r_buffer, context->cb_g_buffer, context->cr_b_buffer); |