<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>