You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeedu/kstars/kstars/indi/webcam/ccvt_c2.c

119 lines
2.5 KiB

/*
* 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)
{
WHOLE_FUNC2RGB(rgb32)
}
void ccvt_420p_rgb24(int width, int height, const void *src, void *dst)
{
WHOLE_FUNC2RGB(rgb24)
}