ref: 47e3976507a60bc7e6caeb4ffddf5805a5cef1c3
dir: /yuv.c/
#include <u.h>
#include <libc.h>
#include "yuv.h"
/* ITU-R BT.601 */
//#define Y ((( 66*r + 129*g + 25*b + 128) >> 8) + 16)
//#define U (((-38*r - 74*g + 112*b + 128) >> 8) + 128)
//#define V (((112*r - 94*g - 18*b + 128) >> 8) + 128)
/* ITU-R BT.709 */
#define Y ((( 47*r + 157*g + 16*b + 128) >> 8) + 16)
#define U (((-26*r - 86*g + 112*b + 128) >> 8) + 128)
#define V (((112*r - 102*g - 10*b + 128) >> 8) + 128)
void
xrgb2yuv420(u8int *bgrx, int w, int h, YUV *yuv)
{
u8int *py, *pu, *pv;
int x, y, r, g, b;
py = yuv->y;
pu = yuv->u;
pv = yuv->v;
for(y = 0; y < h;){
for(x = 0; x < w;){
b = bgrx[0];
g = bgrx[1];
r = bgrx[2];
bgrx += 4;
py[x] = Y;
pu[x/2] = U;
pv[x/2] = V;
x++;
b = bgrx[0];
g = bgrx[1];
r = bgrx[2];
bgrx += 4;
py[x] = Y;
x++;
}
py += yuv->ys;
y++;
for(x = 0; x < w;){
b = bgrx[0];
g = bgrx[1];
r = bgrx[2];
bgrx += 4;
py[x] = Y;
x++;
}
py += yuv->ys;
pu += yuv->us;
pv += yuv->vs;
y++;
}
}