libv4l: Add support to use orientation from VIDIOC_ENUMINPUT
authorhans@rhel5-devel.localdomain <hans@rhel5-devel.localdomain>
Fri, 10 Apr 2009 11:34:07 +0000 (13:34 +0200)
committerhans@rhel5-devel.localdomain <hans@rhel5-devel.localdomain>
Fri, 10 Apr 2009 11:34:07 +0000 (13:34 +0200)
From: Adam Baker <linux@baker-net.org.uk>

Add check to libv4l of the sensor orientation as reported by
VIDIOC_ENUMINPUT

Priority: normal

Signed-off-by: Adam Baker <linux@baker-net.org.uk>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
lib/ChangeLog
lib/libv4lconvert/libv4lconvert.c

index 9b029d6..9c9a5a3 100644 (file)
@@ -1,3 +1,9 @@
+libv4l-0.5.11
+-------------
+* Add dependency generation to libv4l by: Gilles Gigan <gilles.gigan@gmail.com>
+* Add support to use orientation from VIDIOC_ENUMINPUT by:
+  Adam Baker <linux@baker-net.org.uk>
+
 libv4l-0.5.10
 -------------
 * sn9c20x cams have occasional bad jpeg frames, drop these to avoid the
index f11922f..f3191f1 100644 (file)
 #define MIN(a,b) (((a)<(b))?(a):(b))
 #define ARRAY_SIZE(x) ((int)sizeof(x)/(int)sizeof((x)[0]))
 
+/* Workaround this potentially being missing from videodev2.h */
+#ifndef V4L2_IN_ST_VFLIP
+#define V4L2_IN_ST_VFLIP       0x00000020 /* Output is flipped vertically */
+#endif
+
 /* Note for proper functioning of v4lconvert_enum_fmt the first entries in
   supported_src_pixfmts must match with the entries in supported_dst_pixfmts */
 #define SUPPORTED_DST_PIXFMTS \
@@ -179,6 +184,7 @@ struct v4lconvert_data *v4lconvert_create(int fd)
   int i, j;
   struct v4lconvert_data *data = calloc(1, sizeof(struct v4lconvert_data));
   struct v4l2_capability cap;
+  struct v4l2_input input;
 
   if (!data)
     return NULL;
@@ -206,6 +212,13 @@ struct v4lconvert_data *v4lconvert_create(int fd)
 
   /* Check if this cam has any special flags */
   data->flags = v4lconvert_get_flags(data->fd);
+  if ((syscall(SYS_ioctl, fd, VIDIOC_G_INPUT, &input.index) == 0) &&
+      (syscall(SYS_ioctl, fd, VIDIOC_ENUMINPUT, &input) == 0)) {
+    /* Don't yet support independent HFLIP and VFLIP so getting
+     * image the right way up is highest priority. */
+    if (input.status & V4L2_IN_ST_VFLIP)
+      data->flags |= V4LCONVERT_ROTATE_180;
+  }
   if (syscall(SYS_ioctl, fd, VIDIOC_QUERYCAP, &cap) == 0) {
     if (!strcmp((char *)cap.driver, "uvcvideo"))
       data->flags |= V4LCONVERT_IS_UVC;