summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDarren Salt <linux@youmustbejoking.demon.co.uk>2012-02-15 00:52:08 +0000
committerDarren Salt <linux@youmustbejoking.demon.co.uk>2012-02-15 00:52:08 +0000
commit82ffe8cb63a7551346c0e655714e24b54a696f1e (patch)
tree13ca9824d2208f16e41f5295093e840522a527b9 /src
parentc7b56e4119bc8870fc4f35ac38159414cfe54ff1 (diff)
parent061c58a5d30290c29f25044cbe9bdcf00364f333 (diff)
downloadxine-lib-82ffe8cb63a7551346c0e655714e24b54a696f1e.tar.gz
xine-lib-82ffe8cb63a7551346c0e655714e24b54a696f1e.tar.bz2
Merge from 1.1.
--HG-- rename : src/xine-utils/xineutils.h => include/xine/xineutils.h
Diffstat (limited to 'src')
-rw-r--r--src/xine-utils/color.c62
1 files changed, 28 insertions, 34 deletions
diff --git a/src/xine-utils/color.c b/src/xine-utils/color.c
index b9b007c7a..adfd953c2 100644
--- a/src/xine-utils/color.c
+++ b/src/xine-utils/color.c
@@ -67,52 +67,46 @@
/*
* In search of the perfect colorspace conversion formulae...
- * These are the conversion equations that xine currently uses:
+ * These are the conversion equations that xine currently uses
+ * (before normalisation):
*
* Y = 0.29900 * R + 0.58700 * G + 0.11400 * B
* U = -0.16874 * R - 0.33126 * G + 0.50000 * B + 128
* V = 0.50000 * R - 0.41869 * G - 0.08131 * B + 128
- *
- * Feel free to experiment with different coefficients by altering the
- * next 9 defines.
*/
-/* convert full range rgb to mpeg range yuv */
-#if 0
+/*
+#define Y_R (SCALEFACTOR * 0.29900 * 219.0 / 255.0)
+#define Y_G (SCALEFACTOR * 0.58700 * 219.0 / 255.0)
+#define Y_B (SCALEFACTOR * 0.11400 * 219.0 / 255.0)
-#define Y_R (SCALEFACTOR * 0.29900)
-#define Y_G (SCALEFACTOR * 0.58700)
-#define Y_B (SCALEFACTOR * 0.11400)
+#define U_R (SCALEFACTOR * -0.16874 * 224.0 / 255.0)
+#define U_G (SCALEFACTOR * -0.33126 * 224.0 / 255.0)
+#define U_B (SCALEFACTOR * 0.50000 * 224.0 / 255.0)
-#define U_R (SCALEFACTOR * -0.16874)
-#define U_G (SCALEFACTOR * -0.33126)
-#define U_B (SCALEFACTOR * 0.50000)
+#define V_R (SCALEFACTOR * 0.50000 * 224.0 / 255.0)
+#define V_G (SCALEFACTOR * -0.41869 * 224.0 / 255.0)
+#define V_B (SCALEFACTOR * -0.08131 * 224.0 / 255.0)
+*/
-#define V_R (SCALEFACTOR * 0.50000)
-#define V_G (SCALEFACTOR * -0.41869)
-#define V_B (SCALEFACTOR * -0.08131)
+#define Y_R (SCALEFACTOR * 0.299 * 219.0 / 255.0)
+#define Y_G (SCALEFACTOR * 0.587 * 219.0 / 255.0)
+#define Y_B (SCALEFACTOR * 0.114 * 219.0 / 255.0)
-#else
+#define U_R (SCALEFACTOR * -0.299 / 1.772 * 224.0 / 255.0)
+#define U_G (SCALEFACTOR * -0.587 / 1.772 * 224.0 / 255.0)
+#define U_B (SCALEFACTOR * 0.886 / 1.772 * 224.0 / 255.0)
+
+#define V_R (SCALEFACTOR * 0.701 / 1.402 * 224.0 / 255.0)
+#define V_G (SCALEFACTOR * -0.587 / 1.402 * 224.0 / 255.0)
+#define V_B (SCALEFACTOR * -0.114 / 1.402 * 224.0 / 255.0)
/*
- * Here is another promising set of coefficients. If you use these, you
- * must also add 16 to the Y calculation in the COMPUTE_Y macro found
- * in xineutils.h.
+ * With the normalisation factors above, Y needs 16 added.
+ * This is done during setup, not in the macros in xineutils.h, because
+ * doing it there would be an API change.
*/
-
-#define Y_R (SCALEFACTOR * 0.257)
-#define Y_G (SCALEFACTOR * 0.504)
-#define Y_B (SCALEFACTOR * 0.098)
-
-#define U_R (SCALEFACTOR * -0.148)
-#define U_G (SCALEFACTOR * -0.291)
-#define U_B (SCALEFACTOR * 0.439)
-
-#define V_R (SCALEFACTOR * 0.439)
-#define V_G (SCALEFACTOR * -0.368)
-#define V_B (SCALEFACTOR * -0.071)
-
-#endif
+#define Y_MOD (16 * SCALEFACTOR)
/*
* Precalculate all of the YUV tables since it requires fewer than
@@ -1319,7 +1313,7 @@ void init_yuv_conversion(void) {
/* initialize the RGB -> YUV tables */
for (i = 0; i < 256; i++) {
- y_r_table[i] = Y_R * i;
+ y_r_table[i] = Y_R * i + Y_MOD;
y_g_table[i] = Y_G * i;
y_b_table[i] = Y_B * i;