summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/xine/xineutils.h13
-rw-r--r--src/xine-utils/color.c62
2 files changed, 35 insertions, 40 deletions
diff --git a/include/xine/xineutils.h b/include/xine/xineutils.h
index 5b8b4f1f4..608384ad7 100644
--- a/include/xine/xineutils.h
+++ b/include/xine/xineutils.h
@@ -254,20 +254,21 @@ extern void (*yuy2_to_yv12)
unsigned char *v_dst, int v_dst_pitch,
int width, int height) XINE_PROTECTED;
-/* convert full range rgb to mpeg range yuv */
-#define SCALESHIFT 16
-#define SCALEFACTOR (1<<SCALESHIFT)
+#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]) >> SCALESHIFT) + 16)
+ ((y_r_table[r] + y_g_table[g] + y_b_table[b]) / SCALEFACTOR)
#define COMPUTE_U(r, g, b) \
(unsigned char) \
- (((u_r_table[r] + u_g_table[g] + u_b_table[b]) >> SCALESHIFT) + CENTERSAMPLE)
+ ((u_r_table[r] + u_g_table[g] + u_b_table[b]) / SCALEFACTOR + CENTERSAMPLE)
#define COMPUTE_V(r, g, b) \
(unsigned char) \
- (((v_r_table[r] + v_g_table[g] + v_b_table[b]) >> SCALESHIFT) + CENTERSAMPLE)
+ ((v_r_table[r] + v_g_table[g] + v_b_table[b]) / SCALEFACTOR + CENTERSAMPLE)
#define UNPACK_BGR15(packed_pixel, r, g, b) \
b = (packed_pixel & 0x7C00) >> 7; \
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;