Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FreeRDP/FreeRDP-old.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVic Lee <llyzs@163.com>2011-06-16 08:43:47 +0400
committerVic Lee <llyzs@163.com>2011-06-16 08:44:11 +0400
commit6679e9c80d9fdbfaff79e3477bd129e6a99da96e (patch)
treedd5ee599dc84f26d4f656cb2028b4db480cfdeb8
parente49d00c23e8d19c4599f1e87269a6406778c7657 (diff)
libfreerdp-rfx: break out rfx_encode_format_RGB.
-rw-r--r--libfreerdp-rfx/rfx_encode.c135
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);