public inbox for linux-media@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] v4l library YVYU decoding
@ 2008-09-01  8:04 Jean-Francois Moine
  2008-09-03 12:46 ` Hans de Goede
  0 siblings, 1 reply; 2+ messages in thread
From: Jean-Francois Moine @ 2008-09-01  8:04 UTC (permalink / raw)
  To: Hans de Goede; +Cc: Video 4 Linux

[-- Attachment #1: Type: text/plain, Size: 276 bytes --]

Hi Hans,

Here is a new YVYU decoding patch which replaces the previous one.

Sorry for it is not tested: the webcam 046d:0896 does not work well.

Cheers.

-- 
Ken ar c'hentañ |             ** Breizh ha Linux atav! **
Jef             |               http://moinejf.free.fr/


[-- Attachment #2: yvyu.pat --]
[-- Type: text/plain, Size: 4713 bytes --]


This patch adds the decoding of YVYU images generated by vc0321.

Signed-off-by: Jean-Francois Moine <moinejf@free.fr>

--- 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-31 16:31: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,15 @@
 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_yvyu_to_yuv420(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-31 15:47:58.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,23 @@
       }
       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;
+      default:
+	v4lconvert_yvyu_to_yuv420(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-31 16:44:29.000000000 +0200
@@ -130,6 +130,91 @@
   }
 }
 
+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_yvyu_to_yuv420(const unsigned char *src, unsigned char *dest,
+  int width, int height)
+{
+  int i, j;
+  const unsigned char *src1;
+  unsigned char *vdest;
+
+  /* copy the Y values */
+  src1 = src;
+  for (i = 0; i < height; i++) {
+    for (j = 0; j < width; j += 2) {
+      *dest++ = *src1;
+      *dest++ = src1[2];
+      src1 += 4;
+    }
+  }
+
+  /* copy the U and V values */
+  src++;				/* point to V */
+  src1 = src + width * 2;		/* next line */
+  vdest = dest + width * height / 4;
+  for (i = 0; i < height; i += 2) {
+    for (j = 0; j < width; j += 2) {
+      *dest++ = ((int) src[2] + src1[2]) / 2;	/* U */
+      *vdest++ = ((int) *src + *src1) / 2;	/* V */
+      src += 4;
+      src1 += 4;
+    }
+    src = src1;
+    src1 += width * 2;
+  }
+}
+
 void v4lconvert_swap_rgb(const unsigned char *src, unsigned char *dst,
   int width, int height)
 {

[-- Attachment #3: Type: text/plain, Size: 164 bytes --]

--
video4linux-list mailing list
Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] v4l library YVYU decoding
  2008-09-01  8:04 [PATCH] v4l library YVYU decoding Jean-Francois Moine
@ 2008-09-03 12:46 ` Hans de Goede
  0 siblings, 0 replies; 2+ messages in thread
From: Hans de Goede @ 2008-09-03 12:46 UTC (permalink / raw)
  To: Jean-Francois Moine; +Cc: Video 4 Linux

Jean-Francois Moine wrote:
> Hi Hans,
> 
> Here is a new YVYU decoding patch which replaces the previous one.
> 
> Sorry for it is not tested: the webcam 046d:0896 does not work well.
> 

Thanks,

I've found a cam which does YUYV and used your patch to add YUYV support as 
well, that seems to work well so I guess YVYU will work well too.

This support is in the just released 0.4.3 release (I must still send the 
announcement).

Regards,

Hans

--
video4linux-list mailing list
Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2008-09-03 12:35 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-09-01  8:04 [PATCH] v4l library YVYU decoding Jean-Francois Moine
2008-09-03 12:46 ` Hans de Goede

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox