[libcamera-devel,06/27] libcamera: v4l2_device: Implement stream{On, Off}

Message ID 20190206060818.13907-7-laurent.pinchart@ideasonboard.com
State Accepted
Delegated to: Laurent Pinchart
Headers show
Series
  • Capture frames throught requests
Related show

Commit Message

Laurent Pinchart Feb. 6, 2019, 6:07 a.m. UTC
From: Kieran Bingham <kieran.bingham@ideasonboard.com>

Support starting and stopping a stream on a V4L2 device. Buffers must be
queued before the stream is started.

Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
---
 src/libcamera/include/v4l2_device.h |  3 ++
 src/libcamera/v4l2_device.cpp       | 45 +++++++++++++++++++++++++++++
 2 files changed, 48 insertions(+)

Patch

diff --git a/src/libcamera/include/v4l2_device.h b/src/libcamera/include/v4l2_device.h
index 30a8f77d9772..988e646c5de1 100644
--- a/src/libcamera/include/v4l2_device.h
+++ b/src/libcamera/include/v4l2_device.h
@@ -103,6 +103,9 @@  public:
 	int queueBuffer(Buffer *buffer);
 	Signal<Buffer *> bufferReady;
 
+	int streamOn();
+	int streamOff();
+
 private:
 	int getFormatSingleplane(V4L2DeviceFormat *format);
 	int setFormatSingleplane(V4L2DeviceFormat *format);
diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp
index 134a468c4236..f9839fc715f4 100644
--- a/src/libcamera/v4l2_device.cpp
+++ b/src/libcamera/v4l2_device.cpp
@@ -756,4 +756,49 @@  void V4L2Device::bufferAvailable(EventNotifier *notifier)
  * \brief A Signal emitted when a buffer completes
  */
 
+/**
+ * \brief Start the video stream
+ *
+ * \return 0 on success or a negative error code otherwise
+ */
+int V4L2Device::streamOn()
+{
+	int ret;
+
+	ret = ioctl(fd_, VIDIOC_STREAMON, &bufferType_);
+	if (ret < 0) {
+		ret = -errno;
+		LOG(V4L2, Error)
+			<< "Failed to start streaming: " << strerror(-ret);
+		return ret;
+	}
+
+	return 0;
+}
+
+/**
+ * \brief Stop the video stream
+ *
+ * \todo Ensure completion notifications are sent for all queued buffers
+ *
+ * \return 0 on success or a negative error code otherwise
+ */
+int V4L2Device::streamOff()
+{
+	int ret;
+
+	ret = ioctl(fd_, VIDIOC_STREAMOFF, &bufferType_);
+	if (ret < 0) {
+		ret = -errno;
+		LOG(V4L2, Error)
+			<< "Failed to stop streaming: " << strerror(-ret);
+		return ret;
+	}
+
+	queuedBuffersCount_ = 0;
+	fdEvent_->setEnabled(false);
+
+	return 0;
+}
+
 } /* namespace libcamera */