1
0
Fork 0
mirror of https://gitlab.postmarketos.org/postmarketOS/pmaports.git synced 2025-07-15 17:55:10 +03:00
pmaports/temp/libcamera/0001-pipeline-simple-Fix-matching-with-empty-media-graphs.patch
Robert Mader 5677fe9d6d
temp/libcamera: upgrade to 0.5.1
See
https://gitlab.freedesktop.org/camera/libcamera/-/releases/v0.5.1

Additional changes:
 - Adopt build to commit "ipa: Move IPA installations to a subdir"
 - Backport a fix for the simple pipeline

Part-of: https://gitlab.postmarketos.org/postmarketos/pmaports/-/merge_requests/6608
[ci:skip-build]: already built successfully in CI
2025-06-05 12:42:12 +02:00

127 lines
4.2 KiB
Diff

From db54410e0113ae8bb35972d2467462cb495e997f Mon Sep 17 00:00:00 2001
From: Paul Elder <paul.elder@ideasonboard.com>
Date: Tue, 13 May 2025 15:37:51 +0200
Subject: [PATCH 01/13] pipeline: simple: Fix matching with empty media graphs
The match() function currently reports that it is not possible to create
any cameras if it encounters an empty media graph.
Fix this by looping over all media graphs and only returning false when
all of them fail to create a camera.
It is worth noting that an issue does exist when on a partial match that
ends in an invalid match, any media devices that were acquired will stay
acquired. This is not a new issue though, as any acquired media devices
in general are not released until pipeline handler deconstruction. This
requires a rework of how we do matching and pipeline handler
construction, so it is captured in a comment.
In the meantime, this fix fixes a problem without increasing the net
number of problems.
Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
---
src/libcamera/pipeline/simple/simple.cpp | 62 +++++++++++++++++-------
1 file changed, 45 insertions(+), 17 deletions(-)
diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
index efb07051b..4323472e1 100644
--- a/src/libcamera/pipeline/simple/simple.cpp
+++ b/src/libcamera/pipeline/simple/simple.cpp
@@ -427,6 +427,9 @@ private:
return static_cast<SimpleCameraData *>(camera->_d());
}
+ bool matchDevice(MediaDevice *media, const SimplePipelineInfo &info,
+ DeviceEnumerator *enumerator);
+
std::vector<MediaEntity *> locateSensors(MediaDevice *media);
static int resetRoutingTable(V4L2Subdevice *subdev);
@@ -1660,25 +1663,13 @@ int SimplePipelineHandler::resetRoutingTable(V4L2Subdevice *subdev)
return 0;
}
-bool SimplePipelineHandler::match(DeviceEnumerator *enumerator)
+bool SimplePipelineHandler::matchDevice(MediaDevice *media,
+ const SimplePipelineInfo &info,
+ DeviceEnumerator *enumerator)
{
- const SimplePipelineInfo *info = nullptr;
unsigned int numStreams = 1;
- MediaDevice *media;
- for (const SimplePipelineInfo &inf : supportedDevices) {
- DeviceMatch dm(inf.driver);
- media = acquireMediaDevice(enumerator, dm);
- if (media) {
- info = &inf;
- break;
- }
- }
-
- if (!media)
- return false;
-
- for (const auto &[name, streams] : info->converters) {
+ for (const auto &[name, streams] : info.converters) {
DeviceMatch converterMatch(name);
converter_ = acquireMediaDevice(enumerator, converterMatch);
if (converter_) {
@@ -1687,7 +1678,7 @@ bool SimplePipelineHandler::match(DeviceEnumerator *enumerator)
}
}
- swIspEnabled_ = info->swIspEnabled;
+ swIspEnabled_ = info.swIspEnabled;
/* Locate the sensors. */
std::vector<MediaEntity *> sensors = locateSensors(media);
@@ -1806,6 +1797,43 @@ bool SimplePipelineHandler::match(DeviceEnumerator *enumerator)
return registered;
}
+bool SimplePipelineHandler::match(DeviceEnumerator *enumerator)
+{
+ MediaDevice *media;
+
+ for (const SimplePipelineInfo &inf : supportedDevices) {
+ DeviceMatch dm(inf.driver);
+ while ((media = acquireMediaDevice(enumerator, dm))) {
+ /*
+ * If match succeeds, return true to let match() be
+ * called again on a new instance of the pipeline
+ * handler. Otherwise keep looping until we do
+ * successfully match one (or run out).
+ */
+ if (matchDevice(media, inf, enumerator)) {
+ LOG(SimplePipeline, Debug)
+ << "Matched on device: "
+ << media->deviceNode();
+ return true;
+ }
+
+ /*
+ * \todo We need to clear the list of media devices
+ * that we've already acquired in the event that we
+ * fail to create a camera. This requires a rework of
+ * DeviceEnumerator, or even how we create pipelines
+ * handlers. This is because at the moment acquired
+ * media devices are only released on pipeline handler
+ * deconstruction, and if we release them any earlier
+ * then DeviceEnumerator::search() will keep returning
+ * the same media devices.
+ */
+ }
+ }
+
+ return false;
+}
+
V4L2VideoDevice *SimplePipelineHandler::video(const MediaEntity *entity)
{
auto iter = entities_.find(entity);
--
2.49.0