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++; } }