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