v4l2: add v4l2_set_frame_rate
authorPaul Elder <paul.elder@ideasonboard.com>
Tue, 28 Aug 2018 06:10:01 +0000 (02:10 -0400)
committerPaul Elder <paul.elder@ideasonboard.com>
Wed, 6 Feb 2019 06:48:50 +0000 (01:48 -0500)
We would like to be able to set the frame rate of video sources. This
patch adds such a function for v4l2-based video sources to use.

Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
lib/v4l2.c
lib/v4l2.h

index 9030270..de6ed88 100644 (file)
@@ -500,6 +500,26 @@ int v4l2_set_format(struct v4l2_device *dev, struct v4l2_pix_format *format)
        return 0;
 }
 
+int v4l2_set_frame_rate(struct v4l2_device *dev, unsigned int fps)
+{
+       struct v4l2_streamparm parm;
+       int ret;
+
+       memset(&parm, 0, sizeof parm);
+       parm.type = dev->type;
+       parm.parm.capture.timeperframe.numerator = 1;
+       parm.parm.capture.timeperframe.denominator = fps;
+
+       ret = ioctl(dev->fd, VIDIOC_S_PARM, &parm);
+       if (ret < 0) {
+               printf("%s: unable to set frame rate (%d).\n", dev->name, errno);
+               return -errno;
+       }
+
+       dev->fps = fps;
+       return 0;
+}
+
 /* -----------------------------------------------------------------------------
  * Buffers management
  */
index 8d7b3c5..7bacf5d 100644 (file)
@@ -31,6 +31,7 @@ struct v4l2_device
        struct list_entry formats;
        struct v4l2_pix_format format;
        struct v4l2_rect crop;
+       unsigned int fps;
 
        struct video_buffer_set buffers;
 };
@@ -86,6 +87,19 @@ int v4l2_get_format(struct v4l2_device *dev, struct v4l2_pix_format *format);
 int v4l2_set_format(struct v4l2_device *dev, struct v4l2_pix_format *format);
 
 /*
+ * v4l2_set_frame_rate - Set the frame rate
+ * @dev: Device instance
+ * @fps: Frame rate
+ *
+ * Set the frame rate specified by @fps.
+ * The device can modify the requested format and size, in which case @dev->fps
+ * will be updated to reflect the modified setting.
+ *
+ * Return 0 on success or a negative error code on failure.
+ */
+int v4l2_set_frame_rate(struct v4l2_device *dev, unsigned int fps);
+
+/*
  * v4l2_get_crop - Retrieve the current crop rectangle
  * @dev: Device instance
  * @rect: Crop rectangle structure to be filled