summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/xine-utils/color.c61
-rw-r--r--src/xine-utils/xineutils.h3
2 files changed, 31 insertions, 33 deletions
diff --git a/src/xine-utils/color.c b/src/xine-utils/color.c
index 3c2388c27..3ffa790a7 100644
--- a/src/xine-utils/color.c
+++ b/src/xine-utils/color.c
@@ -66,51 +66,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.
*/
-#if 1
+/*
+#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
@@ -1317,7 +1312,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;
diff --git a/src/xine-utils/xineutils.h b/src/xine-utils/xineutils.h
index 5b16e6e3c..cbf88aeaf 100644
--- a/src/xine-utils/xineutils.h
+++ b/src/xine-utils/xineutils.h
@@ -291,6 +291,9 @@ extern void (*yuy2_to_yv12)
#define SCALEFACTOR 65536
#define CENTERSAMPLE 128
+/* These conversions are normalised for the MPEG Y'CbCr colourspace.
+ * (Yes, we know that we call it YUV elsewhere.)
+ */
#define COMPUTE_Y(r, g, b) \
(unsigned char) \
((y_r_table[r] + y_g_table[g] + y_b_table[b]) / SCALEFACTOR)