On 01/23/2009 02:59 AM, Amos Tibaldi wrote:
> #define GUID_UYVY_PLANAR 0x59565955
Just a sidenote: This is misleading, that format is packed and not planar.
> void RGBToUV(unsigned short int r,
> unsigned short int g,
> unsigned short int b,
> unsigned short int * u,
> unsigned short int * v)
> {
> *u = -0.147 * r +
> -0.289 * g +
> 0.436 * b; // min(abs(r * -1214 + g * -2384 + b * 3598 + 4096 + 1048576)
> >> 13, 240);
> //(unsigned short int)(-0.147f*(float)r-0.289f*(float)g+0.436f*(float)b);
> *v = 0.615 * r +
> -0.515 * g +
> -0.100 * b;
> //min(abs(r * 3598 + g * -3013 + b * -585 + 4096 + 1048576) >> 13, 240);
> //(unsigned short int)(0.615f*(float)r-0.515f*(float)g-0.100f*(float)b);
> }
> void RGBToY(unsigned short int r,
> unsigned short int g,
> unsigned short int b,
> unsigned short int * y
> )
> {
> *y = 0.299 * r +
> 0.587 * g +
> 0.114 * b; // min(abs(r * 2104 + g * 4130 + b * 802 + 4096 + 131072) >>
> 13, 235);
> //(unsigned short int)(0.299f*(float)r+0.587f*(float)g+0.114f*(float)b);
> }
The formulas that are in use are wrong. You need to scale and shift the
YUV values. The formulas that you commented out are correct and yield
the correct colors here (min(abs(...) >> 13, 235)). These formulas also
worked in my test:
*y = ( ( 66 * r + 129 * g + 25 * b + 128) >> 8) + 16;
*u = ( ( -38 * r - 74 * g + 112 * b + 128) >> 8) + 128;
*v = ( ( 112 * r - 94 * g - 18 * b + 128) >> 8) + 128;
See wikipedia or msdn:
http://msdn.microsoft.com/en-us/library/ms893078.aspx
http://en.wikipedia.org/wiki/YUV#Numerical_approximations
tom
_______________________________________________
xorg mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/xorg