From a25a611bb3f7a994475fa21d663bc18aa8420863 Mon Sep 17 00:00:00 2001 From: Phi-Bang Nguyen Date: Thu, 6 May 2021 20:06:06 +0200 Subject: pipeline: simple: Rework the supportedDevices list The supportedDevices may contain entries which have the same driver but different converters. For example, if we add these two entries: { "mtk-seninf", "mtk-mdp", 3 }, { "mtk-seninf", "mtk-mdp3", 3 }, the simple pipeline handler will always take the first one where it can acquire the driver and skip the rest. So, make the changes to support this usecase. Signed-off-by: Phi-Bang Nguyen Reviewed-by: Laurent Pinchart Signed-off-by: Laurent Pinchart --- src/libcamera/pipeline/simple/simple.cpp | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp index e1ee640b..1b283c44 100644 --- a/src/libcamera/pipeline/simple/simple.cpp +++ b/src/libcamera/pipeline/simple/simple.cpp @@ -128,16 +128,19 @@ class SimplePipelineHandler; struct SimplePipelineInfo { const char *driver; - const char *converter; - unsigned int numStreams; + /* + * Each converter in the list contains the name + * and the number of streams it supports. + */ + std::vector> converters; }; namespace { static const SimplePipelineInfo supportedDevices[] = { - { "imx7-csi", "pxp", 1 }, - { "qcom-camss", nullptr, 1 }, - { "sun6i-csi", nullptr, 1 }, + { "imx7-csi", { { "pxp", 1 } } }, + { "qcom-camss", {} }, + { "sun6i-csi", {} }, }; } /* namespace */ @@ -146,7 +149,7 @@ class SimpleCameraData : public CameraData { public: SimpleCameraData(SimplePipelineHandler *pipe, - const SimplePipelineInfo *info, + unsigned int numStreams, MediaEntity *sensor); bool isValid() const { return sensor_ != nullptr; } @@ -267,9 +270,9 @@ private: */ SimpleCameraData::SimpleCameraData(SimplePipelineHandler *pipe, - const SimplePipelineInfo *info, + unsigned int numStreams, MediaEntity *sensor) - : CameraData(pipe), streams_(info->numStreams) + : CameraData(pipe), streams_(numStreams) { int ret; @@ -935,6 +938,7 @@ bool SimplePipelineHandler::match(DeviceEnumerator *enumerator) { const SimplePipelineInfo *info = nullptr; MediaDevice *converter = nullptr; + unsigned int numStreams = 1; for (const SimplePipelineInfo &inf : supportedDevices) { DeviceMatch dm(inf.driver); @@ -948,9 +952,13 @@ bool SimplePipelineHandler::match(DeviceEnumerator *enumerator) if (!media_) return false; - if (info->converter) { - DeviceMatch converterMatch(info->converter); + for (const auto &[name, streams] : info->converters) { + DeviceMatch converterMatch(name); converter = acquireMediaDevice(enumerator, converterMatch); + if (converter) { + numStreams = streams; + break; + } } /* Locate the sensors. */ @@ -984,7 +992,7 @@ bool SimplePipelineHandler::match(DeviceEnumerator *enumerator) for (MediaEntity *sensor : sensors) { std::unique_ptr data = - std::make_unique(this, info, sensor); + std::make_unique(this, numStreams, sensor); if (!data->isValid()) { LOG(SimplePipeline, Error) << "No valid pipeline for sensor '" -- cgit v1.2.1