diff options
-rw-r--r-- | include/xine/xineutils.h | 13 | ||||
-rw-r--r-- | src/xine-utils/color.c | 62 |
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; |