for(int i = 0; i < h; ++i)
for (int j = 0; j < w; ++j)
{
Y = (unsigned char)((66 * (*r) + 129 * (*g) + 25 * (*b) + 128) >> 8) + 16;
*(y_buffer + i * w + j) = Y;
if ((i % 2 == 0) && (j % 2 == 0))
{
U = (unsigned char)((-38 * (*r) - 74 * (*g) + 112 * (*b) + 128) >> 8) + 128;
*(u_buffer + (i/2) * uv_w + j/2) = U;
V = (unsigned char)((112 * (*r) - 94 * (*g) - 18 * (*b) + 128) >> 8) + 128;
*(v_buffer + (i/2) * uv_w + j/2) = V;
}
}
#define RGB2YUV_SHIFT 15 //ffmpeg rgb2yuv
#define BY ( (int) (0.114 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
#define BV (-(int) (0.081 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
#define BU ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
#define GY ( (int) (0.587 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
#define GV (-(int) (0.419 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
#define GU (-(int) (0.331 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
#define RY ( (int) (0.299 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
#define RV ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
#define RU (-(int) (0.169 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5))
y = (int)((RY * r + GY * g + BY * b + ( 33 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT);
u = (int)((RU * r + GU * g + BU * b + (257 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT);
v = (int)((RV * r + GV * g + BV * b + (257 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT);