Files
veejay/veejay-30aug04/veejay-0.6/ccvt/ccvt_c2.c
Niels Elburg 8ee2c5578f Initial revision
git-svn-id: svn://code.dyne.org/veejay/trunk@3 eb8d1916-c9e9-0310-b8de-cf0c9472ead5
2004-07-30 18:46:12 +00:00

120 lines
2.5 KiB
C

/*
* Convert an image from yuv colourspace to rgb
*
* Code by Tony Hague (C) 2001.
*/
#include "ccvt.h"
#include "ccvt_types.h"
/* by suitable definition of PIXTYPE, can do yuv to rgb or bgr, with or
without word alignment */
/* This doesn't exactly earn a prize in a programming beauty contest. */
#define WHOLE_FUNC2RGB(type) \
const unsigned char *y1, *y2, *u, *v; \
PIXTYPE_##type *l1, *l2; \
int r, g, b, cr, cg, cb, yp, j, i; \
\
if ((width & 1) || (height & 1)) \
return; \
\
l1 = (PIXTYPE_##type *)dst; \
l2 = l1 + width; \
y1 = (unsigned char *)src; \
y2 = y1 + width; \
u = (unsigned char *)src + width * height; \
v = u + (width * height) / 4; \
j = height / 2; \
while (j--) { \
i = width / 2; \
while (i--) { \
/* Since U & V are valid for 4 pixels, repeat code 4 \
times for different Y */ \
cb = ((*u-128) * 454)>>8; \
cr = ((*v-128) * 359)>>8; \
cg = ((*v-128) * 183 + (*u-128) * 88)>>8; \
\
yp = *(y1++); \
r = yp + cr; \
b = yp + cb; \
g = yp - cg; \
SAT(r); \
SAT(g); \
SAT(b); \
l1->b = b; \
l1->g = g; \
l1->r = r; \
l1++; \
\
yp = *(y1++); \
r = yp + cr; \
b = yp + cb; \
g = yp - cg; \
SAT(r); \
SAT(g); \
SAT(b); \
l1->b = b; \
l1->g = g; \
l1->r = r; \
l1++; \
\
yp = *(y2++); \
r = yp + cr; \
b = yp + cb; \
g = yp - cg; \
SAT(r); \
SAT(g); \
SAT(b); \
l2->b = b; \
l2->g = g; \
l2->r = r; \
l2++; \
\
yp = *(y2++); \
r = yp + cr; \
b = yp + cb; \
g = yp - cg; \
SAT(r); \
SAT(g); \
SAT(b); \
l2->b = b; \
l2->g = g; \
l2->r = r; \
l2++; \
\
u++; \
v++; \
} \
y1 = y2; \
y2 += width; \
l1 = l2; \
l2 += width; \
}
void ccvt_420p_bgr32(int width, int height, const void *src, void *dst)
{
WHOLE_FUNC2RGB(bgr32)
}
void ccvt_420p_bgr24(int width, int height, const void *src, void *dst)
{
WHOLE_FUNC2RGB(bgr24)
}
void ccvt_420p_rgb32(int width, int height, const void *src, void *dst)
{
printf("bit smarter func\n");
WHOLE_FUNC2RGB(rgb32)
}
void ccvt_420p_rgb24(int width, int height, const void *src, void *dst)
{
WHOLE_FUNC2RGB(rgb24)
}