summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhi-Bang Nguyen <pnguyen@baylibre.com>2021-05-06 20:06:06 +0200
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2021-05-25 04:56:32 +0300
commita25a611bb3f7a994475fa21d663bc18aa8420863 (patch)
treec6b574955f9634f6c4f951e523747a8782d6cc14
parent34bee5e84ecba01e0ded5cacbc46c277c5a0edba (diff)
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 <pnguyen@baylibre.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--src/libcamera/pipeline/simple/simple.cpp30
1 files changed, 19 insertions, 11 deletions
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<std::pair<const char *, unsigned int>> 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<SimpleCameraData> data =
- std::make_unique<SimpleCameraData>(this, info, sensor);
+ std::make_unique<SimpleCameraData>(this, numStreams, sensor);
if (!data->isValid()) {
LOG(SimplePipeline, Error)
<< "No valid pipeline for sensor '"