ref: 1a3f7ac2dc211ff277d45e3dac690680fdb87bc6
dir: /yuv.c/
#include <u.h>
#include <libc.h>
#include "yuv.h"
#define Y ((( 54*r + 183*g + 18*b + 128) >> 8) + 0)
#define U (((-26*r - 86*g + 112*b + 128) >> 8) + 128)
#define V (((157*r - 143*g - 14*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++;
}
}