stream, uvc: add uvc_stream_set_frame_rate
authorPaul Elder <paul.elder@ideasonboard.com>
Tue, 28 Aug 2018 06:17:15 +0000 (02:17 -0400)
committerPaul Elder <paul.elder@ideasonboard.com>
Wed, 6 Feb 2019 06:49:31 +0000 (01:49 -0500)
We would like to be able to set the frame rate of the video source of a
stream. This patch adds such a function to set the source's frame rate
from the stream. The frame rate is set right after the format is set.

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>
include/uvcgadget/stream.h
lib/stream.c
lib/uvc.c

index 9ab068f..bc83cfa 100644 (file)
@@ -91,6 +91,19 @@ int uvc_stream_set_format(struct uvc_stream *stream,
                          const struct v4l2_pix_format *format);
 
 /*
+ * uvc_stream_set_frame_rate - Set the frame rate for the stream
+ * @stream: the UVC stream
+ * @fps:    the frame rate in frames per second
+ *
+ * This function is called from the UVC protocol handler to configure the frame
+ * rate for the video source of the @stream. It must not be called directly by
+ * applications.
+ *
+ * Returns 0 on success, or a negative error code on failure.
+ */
+int uvc_stream_set_frame_rate(struct uvc_stream *stream, unsigned int fps);
+
+/*
  * uvc_stream_enable - Turn on/off video streaming for the UVC stream
  * @stream: the UVC stream
  * @enable: 0 to stop the stream, 1 to start it
index 19f0d78..168dc71 100644 (file)
@@ -156,6 +156,12 @@ int uvc_stream_set_format(struct uvc_stream *stream,
        return video_source_set_format(stream->src, &fmt);
 }
 
+int uvc_stream_set_frame_rate(struct uvc_stream *stream, unsigned int fps)
+{
+       printf("=== Setting frame rate to %u fps\n", fps);
+       return video_source_set_frame_rate(stream->src, fps);
+}
+
 /* ---------------------------------------------------------------------------
  * Stream handling
  */
index 695db5b..ab03f0e 100644 (file)
--- a/lib/uvc.c
+++ b/lib/uvc.c
@@ -269,6 +269,7 @@ uvc_events_process_data(struct uvc_device *dev,
                const struct uvc_function_config_format *format;
                const struct uvc_function_config_frame *frame;
                struct v4l2_pix_format pixfmt;
+               unsigned int fps;
 
                format = &dev->fc->streaming.formats[target->bFormatIndex-1];
                frame = &format->frames[target->bFrameIndex-1];
@@ -286,6 +287,10 @@ uvc_events_process_data(struct uvc_device *dev,
                        pixfmt.sizeimage = dev->maxsize * 1.5;
 
                uvc_stream_set_format(dev->stream, &pixfmt);
+
+               /* fps is guaranteed to be non-zero and thus valid. */
+               fps = 1.0 / (target->dwFrameInterval / 10000000.0);
+               uvc_stream_set_frame_rate(dev->stream, fps);
        }
 }