[libcamera-devel] [PATCH v5 14/19] libcamera: ipu3: Implement camera start/stop

Jacopo Mondi jacopo at jmondi.org
Tue Mar 26 09:38:57 CET 2019


Start and stop video devices in the pipeline.

Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
 src/libcamera/pipeline/ipu3/ipu3.cpp | 93 ++++++++++++++++++++++++++--
 1 file changed, 87 insertions(+), 6 deletions(-)

diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index d3519bb1d536..5b3c44174566 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -111,6 +111,9 @@ public:
 	int exportBuffers(enum OutputId id, unsigned int count);
 	void freeBuffers();
 
+	int start();
+	void stop();
+
 	unsigned int index_;
 	std::string name_;
 	MediaDevice *media_;
@@ -154,6 +157,9 @@ public:
 	BufferPool *exportBuffers();
 	void freeBuffers();
 
+	int start();
+	void stop();
+
 	V4L2Device *output_;
 	V4L2Subdevice *csi2_;
 	V4L2Subdevice *sensor_;
@@ -371,12 +377,24 @@ int PipelineHandlerIPU3::freeBuffers(Camera *camera, Stream *stream)
 int PipelineHandlerIPU3::start(Camera *camera)
 {
 	IPU3CameraData *data = cameraData(camera);
-	V4L2Device *cio2 = data->cio2_.output_;
+	CIO2Device *cio2 = &data->cio2_;
+	ImgUDevice *imgu = data->imgu_;
 	int ret;
 
-	ret = cio2->streamOn();
+	/*
+	 * Start the ImgU video devices, buffers will be queued to the
+	 * ImgU output and viewfinder when requests will be queued.
+	 */
+	ret = cio2->start();
+	if (ret) {
+		cio2->stop();
+		return ret;
+	}
+
+	ret = imgu->start();
 	if (ret) {
-		LOG(IPU3, Info) << "Failed to start camera " << camera->name();
+		imgu->stop();
+		cio2->stop();
 		return ret;
 	}
 
@@ -386,10 +404,9 @@ int PipelineHandlerIPU3::start(Camera *camera)
 void PipelineHandlerIPU3::stop(Camera *camera)
 {
 	IPU3CameraData *data = cameraData(camera);
-	V4L2Device *cio2 = data->cio2_.output_;
 
-	if (cio2->streamOff())
-		LOG(IPU3, Info) << "Failed to stop camera " << camera->name();
+	data->cio2_.stop();
+	data->imgu_->stop();
 
 	PipelineHandler::stop(camera);
 }
@@ -833,6 +850,46 @@ void ImgUDevice::freeBuffers()
 		LOG(IPU3, Error) << "Failed to release ImgU input buffers";
 }
 
+int ImgUDevice::start()
+{
+	int ret;
+
+	/* Start the ImgU video devices. */
+	ret = output_->streamOn();
+	if (ret) {
+		LOG(IPU3, Error) << "Failed to start ImgU output";
+		return ret;
+	}
+
+	ret = viewfinder_->streamOn();
+	if (ret) {
+		LOG(IPU3, Error) << "Failed to start ImgU viewfinder";
+		return ret;
+	}
+
+	ret = stat_->streamOn();
+	if (ret) {
+		LOG(IPU3, Error) << "Failed to start ImgU stat";
+		return ret;
+	}
+
+	ret = input_->streamOn();
+	if (ret) {
+		LOG(IPU3, Error) << "Failed to start ImgU input";
+		return ret;
+	}
+
+	return 0;
+}
+
+void ImgUDevice::stop()
+{
+	output_->streamOff();
+	viewfinder_->streamOff();
+	stat_->streamOff();
+	input_->streamOff();
+}
+
 /*------------------------------------------------------------------------------
  * CIO2 Device
  */
@@ -1026,6 +1083,30 @@ void CIO2Device::freeBuffers()
 		LOG(IPU3, Error) << "Failed to release CIO2 buffers";
 }
 
+int CIO2Device::start()
+{
+	int ret;
+
+	for (Buffer &buffer : pool_.buffers()) {
+		ret = output_->queueBuffer(&buffer);
+		if (ret)
+			return ret;
+	}
+
+	ret = output_->streamOn();
+	if (ret) {
+		LOG(IPU3, Error) << "Failed to start CIO2";
+		return ret;
+	}
+
+	return 0;
+}
+
+void CIO2Device::stop()
+{
+	output_->streamOff();
+}
+
 REGISTER_PIPELINE_HANDLER(PipelineHandlerIPU3);
 
 } /* namespace libcamera */
-- 
2.21.0



More information about the libcamera-devel mailing list