summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/xine-engine/alphablend.c37
1 files changed, 21 insertions, 16 deletions
diff --git a/src/xine-engine/alphablend.c b/src/xine-engine/alphablend.c
index 91f46312d..e83061c50 100644
--- a/src/xine-engine/alphablend.c
+++ b/src/xine-engine/alphablend.c
@@ -2183,7 +2183,7 @@ void _x_alphablend_free(alphablend_t *extra_data)
extra_data->buffer_size = 0;
}
-#define saturate(n, l, u) ((n) < (l) ? (l) : ((n) > (u) ? (u) : (n)))
+#define saturate(v) if (v & ~255) v = (~((uint32_t)v)) >> 24
void _x_clut_yuv2rgb(uint32_t *clut, int num_items)
{
@@ -2196,20 +2196,25 @@ void _x_clut_yuv2rgb(uint32_t *clut, int num_items)
clut_t c;
} tmp = { *clut };
- int y, u, v, r, g, b;
- y = saturate(tmp.c.y, 16, 235);
- u = saturate(tmp.c.cb, 16, 240);
- v = saturate(tmp.c.cr, 16, 240);
-
- y = (9 * y) / 8;
- r = y + (25 * v) / 16 - 218;
- g = y + (-13 * v) / 16 + (-25 * u) / 64 + 136;
- b = y + 2 * u - 274;
-
- tmp.c.cb = saturate(b, 0, 255);
- tmp.c.cr = saturate(g, 0, 255);
- tmp.c.y = saturate(r, 0, 255);
-
- *clut++ = tmp.u32;
+ int32_t y, u, v, r, g, b;
+
+ y = tmp.c.y;
+ u = tmp.c.cb;
+ v = tmp.c.cr;
+
+ /* This is the middle between ITU 601 (SD) and 709 (HD), mpeg range. */
+ y *= 76304;
+ r = (y + 111028 * v - 15432448) >> 16;
+ saturate (r);
+ g = (y - 19818 * u - 44093 * v + 6959744) >> 16;
+ saturate (g);
+ b = (y + 135306 * u - 18540032) >> 16;
+ saturate (b);
+
+ /* see clut_to_argb () */
+ tmp.c.cb = b;
+ tmp.c.cr = g;
+ tmp.c.y = r;
+ *clut++ = tmp.u32;
}
}