V4L/DVB (9578): v4l core: add support for enumerating frame sizes and intervals
Mauro Carvalho Chehab [Wed, 12 Nov 2008 00:13:47 +0000 (21:13 -0300)]
video_ioctl2 lacks implementation of those two ioctls:
- VIDIOC_ENUM_FRAMESIZES and VIDIOC_ENUM_FRAMEINTERVALS

Adds implementation for those.

Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

drivers/media/video/v4l2-ioctl.c
include/media/v4l2-ioctl.h

index 0e648cb..213c4dd 100644 (file)
@@ -1747,6 +1747,73 @@ static int __video_do_ioctl(struct file *file,
                ret = ops->vidioc_s_hw_freq_seek(file, fh, p);
                break;
        }
+       case VIDIOC_ENUM_FRAMESIZES:
+       {
+               struct v4l2_frmsizeenum *p = arg;
+
+               if (!ops->vidioc_enum_framesizes)
+                       break;
+
+               memset(p, 0, sizeof(*p));
+
+               ret = ops->vidioc_enum_framesizes(file, fh, p);
+               dbgarg(cmd,
+                       "index=%d, pixelformat=%d, type=%d ",
+                       p->index, p->pixel_format, p->type);
+               switch (p->type) {
+               case V4L2_FRMSIZE_TYPE_DISCRETE:
+                       dbgarg2("width = %d, height=%d\n",
+                               p->discrete.width, p->discrete.height);
+                       break;
+               case V4L2_FRMSIZE_TYPE_STEPWISE:
+                       dbgarg2("min %dx%d, max %dx%d, step %dx%d\n",
+                               p->stepwise.min_width,  p->stepwise.min_height,
+                               p->stepwise.step_width, p->stepwise.step_height,
+                               p->stepwise.max_width,  p->stepwise.max_height);
+                       break;
+               case V4L2_FRMSIZE_TYPE_CONTINUOUS:
+                       dbgarg2("continuous\n");
+                       break;
+               default:
+                       dbgarg2("- Unknown type!\n");
+               }
+
+               break;
+       }
+       case VIDIOC_ENUM_FRAMEINTERVALS:
+       {
+               struct v4l2_frmivalenum *p = arg;
+
+               if (!ops->vidioc_enum_frameintervals)
+                       break;
+
+               memset(p, 0, sizeof(*p));
+
+               ret = ops->vidioc_enum_frameintervals(file, fh, p);
+               dbgarg(cmd,
+                       "index=%d, pixelformat=%d, width=%d, height=%d, type=%d ",
+                       p->index, p->pixel_format,
+                       p->width, p->height, p->type);
+               switch (p->type) {
+               case V4L2_FRMIVAL_TYPE_DISCRETE:
+                       dbgarg2("fps=%d/%d\n",
+                               p->discrete.numerator,
+                               p->discrete.denominator);
+                       break;
+               case V4L2_FRMIVAL_TYPE_STEPWISE:
+                       dbgarg2("min=%d, max=%d, step=%d\n",
+                               p->stepwise.min, p->stepwise.max,
+                               p->stepwise.step);
+                       break;
+               case V4L2_FRMIVAL_TYPE_CONTINUOUS:
+                       dbgarg2("continuous\n");
+                       break;
+               default:
+                       dbgarg2("- Unknown type!\n");
+               }
+               break;
+       }
+
        default:
        {
                if (!ops->vidioc_default)
index f598572..c884432 100644 (file)
@@ -232,6 +232,12 @@ struct v4l2_ioctl_ops {
        int (*vidioc_g_chip_ident)     (struct file *file, void *fh,
                                        struct v4l2_chip_ident *chip);
 
+       int (*vidioc_enum_framesizes)   (struct file *file, void *fh,
+                                        struct v4l2_frmsizeenum *fsize);
+
+       int (*vidioc_enum_frameintervals) (struct file *file, void *fh,
+                                          struct v4l2_frmivalenum *fival);
+
        /* For other private ioctls */
        int (*vidioc_default)          (struct file *file, void *fh,
                                        int cmd, void *arg);