From 0e8d6903b2f27b6cd31bf7a25f5d47483fc5c36f Mon Sep 17 00:00:00 2001
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Date: Sat, 3 Jul 2021 18:33:55 +0300
Subject: libcamera: pipeline: simple: Delay opening of video device until
 init()

The video device is currently opened in the SimpleCameraData
constructor. This requires opening the video devices on-demand the first
time they're accessed, which gets in the way of refactoring of
per-entity data storage in the pipeline handler.

Move opening of the video device to the SimpleCameraData::init()
function. The on-demand open mechanism isn't touched yet, it will be
refactored later.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Tested-by: Martin Kepplinger <martin.kepplinger@puri.sm>
---
 src/libcamera/pipeline/simple/simple.cpp | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

(limited to 'src')

diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
index 32bfd45f..76ead3e0 100644
--- a/src/libcamera/pipeline/simple/simple.cpp
+++ b/src/libcamera/pipeline/simple/simple.cpp
@@ -309,6 +309,7 @@ SimpleCameraData::SimpleCameraData(SimplePipelineHandler *pipe,
 	/* Remember at each entity where we came from. */
 	std::unordered_map<MediaEntity *, Entity> parents;
 	MediaEntity *entity = nullptr;
+	MediaEntity *video = nullptr;
 
 	queue.push({ sensor, nullptr });
 
@@ -322,7 +323,7 @@ SimpleCameraData::SimpleCameraData(SimplePipelineHandler *pipe,
 		if (entity->function() == MEDIA_ENT_F_IO_V4L) {
 			LOG(SimplePipeline, Debug)
 				<< "Found capture device " << entity->name();
-			video_ = pipe->video(entity);
+			video = entity;
 			break;
 		}
 
@@ -342,7 +343,7 @@ SimpleCameraData::SimpleCameraData(SimplePipelineHandler *pipe,
 		}
 	}
 
-	if (!video_)
+	if (!video)
 		return;
 
 	/*
@@ -386,9 +387,16 @@ SimplePipelineHandler *SimpleCameraData::pipe()
 
 int SimpleCameraData::init()
 {
-	SimpleConverter *converter = pipe()->converter();
+	SimplePipelineHandler *pipe = SimpleCameraData::pipe();
+	SimpleConverter *converter = pipe->converter();
 	int ret;
 
+	video_ = pipe->video(entities_.back().entity);
+	if (!video_) {
+		LOG(SimplePipeline, Error) << "Failed to open video device";
+		return -ENODEV;
+	}
+
 	/*
 	 * Setup links first as some subdev drivers take active links into
 	 * account to propagate TRY formats. Such is life :-(
-- 
cgit v1.2.1