From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mx3.redhat.com (mx3.redhat.com [172.16.48.32]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id m7THOiQp027984 for ; Fri, 29 Aug 2008 13:24:44 -0400 Received: from smtp5-g19.free.fr (smtp5-g19.free.fr [212.27.42.35]) by mx3.redhat.com (8.13.8/8.13.8) with ESMTP id m7THNGNn010372 for ; Fri, 29 Aug 2008 13:23:16 -0400 From: Jean-Francois Moine To: Hans de Goede Content-Type: multipart/mixed; boundary="=-Z9SlvSOp7sm81mjTHxV0" Date: Fri, 29 Aug 2008 18:57:54 +0200 Message-Id: <1220029074.1730.8.camel@localhost> Mime-Version: 1.0 Cc: Video 4 Linux Subject: [PATCH] YVYU decoding List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: video4linux-list-bounces@redhat.com Errors-To: video4linux-list-bounces@redhat.com List-ID: --=-Z9SlvSOp7sm81mjTHxV0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit Hi Hans, Here is a patch for decoding the YVYU frames of the vc0321. Cheers. -- Ken ar c'hentań | ** Breizh ha Linux atav! ** Jef | http://moinejf.free.fr/ --=-Z9SlvSOp7sm81mjTHxV0 Content-Disposition: attachment; filename=yvyu.pat Content-Type: text/plain; name=yvyu.pat; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit This patch adds the decoding of YVYU images generated by vc0321. Signed-off-by: Jean-Francois Moine --- v4l-dvb-423381bc0d61/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert-priv.h.orig 2008-08-29 14:00:57.000000000 +0200 +++ v4l-dvb-423381bc0d61/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert-priv.h 2008-08-29 18:24:40.000000000 +0200 @@ -59,6 +59,10 @@ #define V4L2_PIX_FMT_SRGGB8 v4l2_fourcc('R','G','G','B') #endif +#ifndef V4L2_PIX_FMT_YVYU +#define V4L2_PIX_FMT_YVYU v4l2_fourcc('Y', 'V', 'Y', 'U') +#endif + #define V4LCONVERT_ERROR_MSG_SIZE 256 #define V4LCONVERT_ERR(...) \ @@ -87,6 +91,12 @@ void v4lconvert_yuv420_to_bgr24(const unsigned char *src, unsigned char *dst, int width, int height); +void v4lconvert_yvyu_to_rgb24(const unsigned char *src, unsigned char *dst, + int width, int height); + +void v4lconvert_yvyu_to_bgr24(const unsigned char *src, unsigned char *dst, + int width, int height); + void v4lconvert_swap_rgb(const unsigned char *src, unsigned char *dst, int width, int height); --- v4l-dvb-423381bc0d61/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c.orig 2008-08-29 14:00:57.000000000 +0200 +++ v4l-dvb-423381bc0d61/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c 2008-08-29 18:22:10.000000000 +0200 @@ -49,6 +49,7 @@ V4L2_PIX_FMT_SN9C10X, V4L2_PIX_FMT_PAC207, V4L2_PIX_FMT_PJPG, + V4L2_PIX_FMT_YVYU, }; static const unsigned int supported_dst_pixfmts[] = { @@ -518,6 +519,19 @@ } break; + case V4L2_PIX_FMT_YVYU: + switch (dest_fmt->fmt.pix.pixelformat) { + case V4L2_PIX_FMT_RGB24: + v4lconvert_yvyu_to_rgb24(src, dest, dest_fmt->fmt.pix.width, + dest_fmt->fmt.pix.height); + break; + case V4L2_PIX_FMT_BGR24: + v4lconvert_yvyu_to_bgr24(src, dest, dest_fmt->fmt.pix.width, + dest_fmt->fmt.pix.height); + break; + } + break; + default: V4LCONVERT_ERR("Unknown src format in conversion\n"); errno = EINVAL; --- v4l-dvb-423381bc0d61/v4l2-apps/lib/libv4l/libv4lconvert/rgbyuv.c.orig 2008-08-29 14:00:57.000000000 +0200 +++ v4l-dvb-423381bc0d61/v4l2-apps/lib/libv4l/libv4lconvert/rgbyuv.c 2008-08-29 18:40:08.000000000 +0200 @@ -130,6 +130,58 @@ } } +void v4lconvert_yvyu_to_bgr24(const unsigned char *src, unsigned char *dest, + int width, int height) +{ + int j; + + while (--height >= 0) { + for (j = 0; j < width; j += 2) { + int u = src[3]; + int v = src[1]; + int u1 = (((u - 128) << 7) + (u - 128)) >> 6; + int rg = (((u - 128) << 1) + (u - 128) + + ((v - 128) << 2) + ((v - 128) << 1)) >> 3; + int v1 = (((v - 128) << 1) + (v - 128)) >> 1; + + *dest++ = CLIP(*src + u1); + *dest++ = CLIP(*src - rg); + *dest++ = CLIP(*src + v1); + + *dest++ = CLIP(src[2] + u1); + *dest++ = CLIP(src[2] - rg); + *dest++ = CLIP(src[2] + v1); + src += 4; + } + } +} + +void v4lconvert_yvyu_to_rgb24(const unsigned char *src, unsigned char *dest, + int width, int height) +{ + int j; + + while (--height >= 0) { + for (j = 0; j < width; j += 2) { + int u = src[3]; + int v = src[1]; + int u1 = (((u - 128) << 7) + (u - 128)) >> 6; + int rg = (((u - 128) << 1) + (u - 128) + + ((v - 128) << 2) + ((v - 128) << 1)) >> 3; + int v1 = (((v - 128) << 1) + (v - 128)) >> 1; + + *dest++ = CLIP(*src + v1); + *dest++ = CLIP(*src - rg); + *dest++ = CLIP(*src + u1); + + *dest++ = CLIP(src[2] + v1); + *dest++ = CLIP(src[2] - rg); + *dest++ = CLIP(src[2] + u1); + src += 4; + } + } +} + void v4lconvert_swap_rgb(const unsigned char *src, unsigned char *dst, int width, int height) { --=-Z9SlvSOp7sm81mjTHxV0 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline -- video4linux-list mailing list Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe https://www.redhat.com/mailman/listinfo/video4linux-list --=-Z9SlvSOp7sm81mjTHxV0--