diff --git a/src/pixfmt_conv.c b/src/pixfmt_conv.c index 4c01f916c..435cdcb76 100644 --- a/src/pixfmt_conv.c +++ b/src/pixfmt_conv.c @@ -981,6 +981,7 @@ void vc_copylineRGBtoRGBA(unsigned char * __restrict dst, const unsigned char * * @param[in] pix_size source pixel size (3 for RGB, 4 for RGBA) */ #define vc_copylineToUYVY709(dst, src, dst_len, roff, goff, boff, pix_size) {\ + const struct color_coeffs *cfs = get_color_coeffs(DEPTH8); \ register uint32_t *d = (uint32_t *)(void *) dst;\ OPTIMIZED_FOR (int x = 0; x <= (dst_len) - 4; x += 4) {\ int r, g, b;\ @@ -989,23 +990,21 @@ void vc_copylineRGBtoRGBA(unsigned char * __restrict dst, const unsigned char * g = src[goff];\ b = src[boff];\ src += pix_size;\ - y1 = 11993 * r + 40239 * g + 4063 * b + (1<<20);\ - u = -6619 * r -22151 * g + 28770 * b;\ - v = 28770 * r - 26149 * g - 2621 * b;\ + y1 = (RGB_TO_Y(cfs, r, g, b) >> COMP_BASE) + 16;\ + u = RGB_TO_CB(cfs, r, g, b);\ + v = RGB_TO_CR(cfs, r, g, b);\ r = src[roff];\ g = src[goff];\ b = src[boff];\ src += pix_size;\ - y2 = 11993 * r + 40239 * g + 4063 * b + (1<<20);\ - u += -6619 * r -22151 * g + 28770 * b;\ - v += 28770 * r - 26149 * g - 2621 * b;\ - u = u / 2 + (1<<23);\ - v = v / 2 + (1<<23);\ + y2 = (RGB_TO_Y(cfs, r, g, b) >> COMP_BASE) + 16;\ + u += RGB_TO_CB(cfs, r, g, b);\ + v += RGB_TO_CR(cfs, r, g, b);\ + u = ((u / 2) >> COMP_BASE) + 128;\ + v = ((v / 2) >> COMP_BASE) + 128;\ \ - *d++ = (CLAMP(y2, 0, (1<<24)-1) >> 16) << 24 |\ - (CLAMP(v, 0, (1<<24)-1) >> 16) << 16 |\ - (CLAMP(y1, 0, (1<<24)-1) >> 16) << 8 |\ - (CLAMP(u, 0, (1<<24)-1) >> 16);\ + *d++ = ((y2 & 0xFF) << 24) | ((v & 0xFF) << 16) | \ + ((y1 & 0xFF) << 8) | (u & 0xFF); \ }\ }