<div dir="ltr"><div>Hi Laurent,</div><div><br></div><div>Just a friendly reminder of this patch :-)</div><div><br></div><div>Thanks !</div><div><br></div><div>Phi-Bang</div><div><br></div><div dir="ltr"><div>On Thu, May 6, 2021 at 8:06 PM Phi-Bang Nguyen <<a href="mailto:pnguyen@baylibre.com" target="_blank">pnguyen@baylibre.com</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">The supportedDevices may contain entries which have the same driver<br>
but different converters. For example, if we add these two entries:<br>
<br>
{ "mtk-seninf", "mtk-mdp", 3 },<br>
{ "mtk-seninf", "mtk-mdp3", 3 },<br>
<br>
the simple pipeline handler will always take the first one where it<br>
can acquire the driver and skip the rest.<br>
<br>
So, make the changes to support this usecase.<br>
<br>
Signed-off-by: Phi-Bang Nguyen <<a href="mailto:pnguyen@baylibre.com" target="_blank">pnguyen@baylibre.com</a>><br>
---<br>
 src/libcamera/pipeline/simple/simple.cpp | 30 +++++++++++++++---------<br>
 1 file changed, 19 insertions(+), 11 deletions(-)<br>
<br>
diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp<br>
index f6095d38..4c87ec4c 100644<br>
--- a/src/libcamera/pipeline/simple/simple.cpp<br>
+++ b/src/libcamera/pipeline/simple/simple.cpp<br>
@@ -127,16 +127,19 @@ class SimplePipelineHandler;<br>
<br>
 struct SimplePipelineInfo {<br>
        const char *driver;<br>
-       const char *converter;<br>
-       unsigned int numStreams;<br>
+       /*<br>
+        * Each converter in the list contains the name<br>
+        * and the number of streams it supports.<br>
+        */<br>
+       std::vector<std::pair<const char *, unsigned int>> converters;<br>
 };<br>
<br>
 namespace {<br>
<br>
 static const SimplePipelineInfo supportedDevices[] = {<br>
-       { "imx7-csi", "pxp", 1 },<br>
-       { "qcom-camss", nullptr, 1 },<br>
-       { "sun6i-csi", nullptr, 1 },<br>
+       { "imx7-csi", { { "pxp", 1 } } },<br>
+       { "qcom-camss", {} },<br>
+       { "sun6i-csi", {} },<br>
 };<br>
<br>
 } /* namespace */<br>
@@ -145,7 +148,7 @@ class SimpleCameraData : public CameraData<br>
 {<br>
 public:<br>
        SimpleCameraData(SimplePipelineHandler *pipe,<br>
-                        const SimplePipelineInfo *info,<br>
+                        unsigned int numStreams,<br>
                         MediaEntity *sensor);<br>
<br>
        bool isValid() const { return sensor_ != nullptr; }<br>
@@ -266,9 +269,9 @@ private:<br>
  */<br>
<br>
 SimpleCameraData::SimpleCameraData(SimplePipelineHandler *pipe,<br>
-                                  const SimplePipelineInfo *info,<br>
+                                  unsigned int numStreams,<br>
                                   MediaEntity *sensor)<br>
-       : CameraData(pipe), streams_(info->numStreams)<br>
+       : CameraData(pipe), streams_(numStreams)<br>
 {<br>
        int ret;<br>
<br>
@@ -934,6 +937,7 @@ bool SimplePipelineHandler::match(DeviceEnumerator *enumerator)<br>
 {<br>
        const SimplePipelineInfo *info = nullptr;<br>
        MediaDevice *converter = nullptr;<br>
+       unsigned int numStreams = 1;<br>
<br>
        for (const SimplePipelineInfo &inf : supportedDevices) {<br>
                DeviceMatch dm(inf.driver);<br>
@@ -947,9 +951,13 @@ bool SimplePipelineHandler::match(DeviceEnumerator *enumerator)<br>
        if (!media_)<br>
                return false;<br>
<br>
-       if (info->converter) {<br>
-               DeviceMatch converterMatch(info->converter);<br>
+       for (const auto &[name, streams] : info->converters) {<br>
+               DeviceMatch converterMatch(name);<br>
                converter = acquireMediaDevice(enumerator, converterMatch);<br>
+               if (converter) {<br>
+                       numStreams = streams;<br>
+                       break;<br>
+               }<br>
        }<br>
<br>
        /* Locate the sensors. */<br>
@@ -983,7 +991,7 @@ bool SimplePipelineHandler::match(DeviceEnumerator *enumerator)<br>
<br>
        for (MediaEntity *sensor : sensors) {<br>
                std::unique_ptr<SimpleCameraData> data =<br>
-                       std::make_unique<SimpleCameraData>(this, info, sensor);<br>
+                       std::make_unique<SimpleCameraData>(this, numStreams, sensor);<br>
                if (!data->isValid()) {<br>
                        LOG(SimplePipeline, Error)<br>
                                << "No valid pipeline for sensor '"<br>
-- <br>
2.25.1<br>
<br>
</blockquote></div></div>
</div>