shithub: treason

ref: 66d57ced36e86949df7793fe4c21826951934fea
dir: /yuv.c/

View raw version
#include <u.h>

void yuv420_rgb24(
	int width, int height,
	u8int *y, u8int *u, u8int *v,
	u32int ystride, u32int uvstride,
	u8int *rgb, u32int rgbstride)
{
	u32int w, h;
	int r, g, b;
	int yy1, cb1, cr1, go;

	for(h = 0; h < height-1; h += 2){
		for(w = 0; w < width-1; w += 2){
			cb1 = *u - 0x80;
			cr1 = *v - 0x80;
			go = 22554*cb1 + 46802*cr1;

#define ONE do{ \
			yy1 = *y * 0x10101; \
			b = yy1 + 116130*cb1; \
			rgb[0] = (b >> 24) ? ~(b >> 31) : (b>>16); \
			g = yy1 - go; \
			rgb[1] = (g >> 24) ? ~(g >> 31) : (g>>16); \
			r = yy1 + 91881*cr1; \
			rgb[2] = (r >> 24) ? ~(r >> 31) : (r>>16); \
}while(0)

			ONE; y += 1;       rgb += 3;
			ONE; y += ystride; rgb += rgbstride;
			ONE; y -= 1;       rgb -= 3;
			ONE; y -= ystride; rgb -= rgbstride - 6;

			y += 2;
			u += 1;
			v += 1;
		}

		y += ystride*2 - w;
		u += uvstride - w/2;
		v += uvstride - w/2;
		rgb += rgbstride*2 - 3*w;
	}
}