[libcamera-devel] [PATCH 20/20] libcamera: pipeline: simple: Enable multiple streams for compatible devices

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sun Jan 31 23:47:02 CET 2021


Allow support for multiple streams on a per-device basis. The decision
should be made based on the ability of the converter to run multiple
times within the duration of one frame. Hardcode it in
SimplePipelineInfo for now.

We may later compute the number of supported streams dynamically based
on the requested configuration, using converter bandwidth information
instead of a hardcoded fixed value.

All platforms are currently limited to a single stream until they get
successfully tested with multiple streams.

Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
 src/libcamera/pipeline/simple/simple.cpp | 39 +++++++++++++-----------
 1 file changed, 21 insertions(+), 18 deletions(-)

diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
index 55a5528611c8..4a8a7ed24960 100644
--- a/src/libcamera/pipeline/simple/simple.cpp
+++ b/src/libcamera/pipeline/simple/simple.cpp
@@ -126,14 +126,15 @@ class SimplePipelineHandler;
 struct SimplePipelineInfo {
 	const char *driver;
 	const char *converter;
+	unsigned int numStreams;
 };
 
 namespace {
 
 static const SimplePipelineInfo supportedDevices[] = {
-	{ "imx7-csi", "pxp" },
-	{ "qcom-camss", nullptr },
-	{ "sun6i-csi", nullptr },
+	{ "imx7-csi", "pxp", 1 },
+	{ "qcom-camss", nullptr, 1 },
+	{ "sun6i-csi", nullptr, 1 },
 };
 
 } /* namespace */
@@ -141,7 +142,9 @@ static const SimplePipelineInfo supportedDevices[] = {
 class SimpleCameraData : public CameraData
 {
 public:
-	SimpleCameraData(SimplePipelineHandler *pipe, MediaEntity *sensor);
+	SimpleCameraData(SimplePipelineHandler *pipe,
+			 const SimplePipelineInfo *info,
+			 MediaEntity *sensor);
 
 	bool isValid() const { return sensor_ != nullptr; }
 
@@ -254,13 +257,12 @@ private:
  */
 
 SimpleCameraData::SimpleCameraData(SimplePipelineHandler *pipe,
+				   const SimplePipelineInfo *info,
 				   MediaEntity *sensor)
-	: CameraData(pipe)
+	: CameraData(pipe), streams_(info->numStreams)
 {
 	int ret;
 
-	streams_.resize(1);
-
 	/*
 	 * Walk the pipeline towards the video node and store all entities
 	 * along the way.
@@ -864,25 +866,26 @@ int SimplePipelineHandler::queueRequestDevice(Camera *camera, Request *request)
 
 bool SimplePipelineHandler::match(DeviceEnumerator *enumerator)
 {
+	const SimplePipelineInfo *info = nullptr;
 	MediaDevice *converter = nullptr;
 
-	for (const SimplePipelineInfo &info : supportedDevices) {
-		DeviceMatch dm(info.driver);
+	for (const SimplePipelineInfo &inf : supportedDevices) {
+		DeviceMatch dm(inf.driver);
 		media_ = acquireMediaDevice(enumerator, dm);
-		if (!media_)
-			continue;
-
-		if (!info.converter)
+		if (media_) {
+			info = &inf;
 			break;
-
-		DeviceMatch converterMatch(info.converter);
-		converter = acquireMediaDevice(enumerator, converterMatch);
-		break;
+		}
 	}
 
 	if (!media_)
 		return false;
 
+	if (info->converter) {
+		DeviceMatch converterMatch(info->converter);
+		converter = acquireMediaDevice(enumerator, converterMatch);
+	}
+
 	/* Locate the sensors. */
 	std::vector<MediaEntity *> sensors;
 
@@ -926,7 +929,7 @@ bool SimplePipelineHandler::match(DeviceEnumerator *enumerator)
 
 	for (MediaEntity *sensor : sensors) {
 		std::unique_ptr<SimpleCameraData> data =
-			std::make_unique<SimpleCameraData>(this, sensor);
+			std::make_unique<SimpleCameraData>(this, info, sensor);
 		if (!data->isValid()) {
 			LOG(SimplePipeline, Error)
 				<< "No valid pipeline for sensor '"
-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list