| Message ID | 20251203-rzv2h-pre-v3-2-1493e0638626@ideasonboard.com |
|---|---|
| State | Accepted |
| Headers | show |
| Series |
|
| Related | show |
Quoting Jacopo Mondi (2025-12-03 09:14:22) > From: Daniel Scally <dan.scally@ideasonboard.com> > > Some entities in a media graph have names that might differ from > implementation to implementation; for example the Camera Receiver > Unit and CSI-2 receiver on the RZ/V2H(P) SoC have entities with names > that include their address, in the form "csi-16000400.csi2". Passing > that entity name to DeviceMatch is too inflexible given it would only > work if that specific CSI-2 receiver were the one being used. > > Add an overload for DeviceMatch::add() such that users can pass in a > std::regex instead of a string. Update DeviceMatch::match() to check > for entities that are matched by the regular expressions added with > the new overload after checking for any exact matches from the vector > of strings. This allows us to use regex to match on patterns like > "csi-[0-9a-f]{8}.csi2". > > Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com> > Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> > > --- > Changes in v3: > - As suggested by Barnabas accept an std::regex in add() instead of a > reference and move it into the entityRegexs_ vector > > - Exit early in DeviceMatch::match() > > for (const MediaEntity *entity : device->entities()) { > if (!std::regex_search(entity->name(), nameRegex)) > continue; > > if (found) { > > } > } > > Compared to > > for (const MediaEntity *entity : device->entities()) { > if (std::regex_search(entity->name(), nameRegex)) { > if (found) { > > } > } > } > > - Invert the error logic when deviceNode is empty > > if (entity->deviceNode().empty()) { > LOG(DeviceEnumerator, Debug) > << "Skip " << entity->name() > << ": no device node"; > continue; > } > > found = true; > > Compared to > > if (!entity->deviceNode().empty()) { > found = true; > } else { > LOG(DeviceEnumerator, Debug) > << "Skip " << entity->name() > << ": no device node"; > } > > Changes in v2: > > - Instead of replacing the existing ::add() function and > matching process with regex, add an overload for ::add() > that takes a regex and incorporate that into ::match() > alongside the existing functionality. > --- > include/libcamera/internal/device_enumerator.h | 3 ++ > src/libcamera/device_enumerator.cpp | 39 +++++++++++++++++++++++++- > 2 files changed, 41 insertions(+), 1 deletion(-) > > diff --git a/include/libcamera/internal/device_enumerator.h b/include/libcamera/internal/device_enumerator.h > index db3532a9887af913ceee20cbba3f945e56e7b61d..fa8806b0c2a47ab89fdc74fe01ef77bf2e68abb1 100644 > --- a/include/libcamera/internal/device_enumerator.h > +++ b/include/libcamera/internal/device_enumerator.h > @@ -11,6 +11,7 @@ > #include <string> > #include <vector> > > +#include <libcamera/base/regex.h> > #include <libcamera/base/signal.h> > > namespace libcamera { > @@ -23,12 +24,14 @@ public: > DeviceMatch(const std::string &driver); > > void add(const std::string &entity); > + void add(const std::regex entity); > > bool match(const MediaDevice *device) const; > > private: > std::string driver_; > std::vector<std::string> entities_; > + std::vector<std::regex> entityRegexs_; > }; > > class DeviceEnumerator > diff --git a/src/libcamera/device_enumerator.cpp b/src/libcamera/device_enumerator.cpp > index ae17862f676310ef568e5331106ed661e84b5130..2911d5f0385f9765a2eafce2085d1fd627d94b95 100644 > --- a/src/libcamera/device_enumerator.cpp > +++ b/src/libcamera/device_enumerator.cpp > @@ -53,7 +53,8 @@ LOG_DEFINE_CATEGORY(DeviceEnumerator) > * > * A DeviceMatch is created with a specific Linux device driver in mind, > * therefore the name of the driver is a required property. One or more Entity > - * names can be added as match criteria. > + * names (or regular expressions designed to match an entity name) can be added > + * as match criteria. > * > * Pipeline handlers are recommended to add entities to DeviceMatch as > * appropriate to ensure that the media device they need can be uniquely > @@ -81,6 +82,15 @@ void DeviceMatch::add(const std::string &entity) > entities_.push_back(entity); > } > > +/** > + * \brief Add a regex to match a media entity name to the search pattern > + * \param[in] entity The regex intended to match to an entity in the media graph > + */ > +void DeviceMatch::add(const std::regex entity) > +{ > + entityRegexs_.push_back(std::move(entity)); > +} > + > /** > * \brief Compare a search pattern with a media device > * \param[in] device The media device > @@ -116,6 +126,33 @@ bool DeviceMatch::match(const MediaDevice *device) const > return false; > } > > + for (const std::regex &nameRegex : entityRegexs_) { > + bool found = false; > + > + for (const MediaEntity *entity : device->entities()) { > + if (!std::regex_search(entity->name(), nameRegex)) > + continue; > + > + if (found) { > + LOG(DeviceEnumerator, Error) > + << "Multiple entities match regex"; > + return false; > + } > + > + if (entity->deviceNode().empty()) { > + LOG(DeviceEnumerator, Debug) > + << "Skip " << entity->name() > + << ": no device node"; > + continue; > + } > + > + found = true; > + } > + > + if (!found) > + return false; > + } > + > return true; > } > > > -- > 2.51.1 >
2025. 12. 03. 10:14 keltezéssel, Jacopo Mondi írta: > From: Daniel Scally <dan.scally@ideasonboard.com> > > Some entities in a media graph have names that might differ from > implementation to implementation; for example the Camera Receiver > Unit and CSI-2 receiver on the RZ/V2H(P) SoC have entities with names > that include their address, in the form "csi-16000400.csi2". Passing > that entity name to DeviceMatch is too inflexible given it would only > work if that specific CSI-2 receiver were the one being used. > > Add an overload for DeviceMatch::add() such that users can pass in a > std::regex instead of a string. Update DeviceMatch::match() to check > for entities that are matched by the regular expressions added with > the new overload after checking for any exact matches from the vector > of strings. This allows us to use regex to match on patterns like > "csi-[0-9a-f]{8}.csi2". > > Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com> > Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> > Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> > > --- > [...] > diff --git a/src/libcamera/device_enumerator.cpp b/src/libcamera/device_enumerator.cpp > index ae17862f676310ef568e5331106ed661e84b5130..2911d5f0385f9765a2eafce2085d1fd627d94b95 100644 > --- a/src/libcamera/device_enumerator.cpp > +++ b/src/libcamera/device_enumerator.cpp > @@ -53,7 +53,8 @@ LOG_DEFINE_CATEGORY(DeviceEnumerator) > * > * A DeviceMatch is created with a specific Linux device driver in mind, > * therefore the name of the driver is a required property. One or more Entity > - * names can be added as match criteria. > + * names (or regular expressions designed to match an entity name) can be added > + * as match criteria. > * > * Pipeline handlers are recommended to add entities to DeviceMatch as > * appropriate to ensure that the media device they need can be uniquely > @@ -81,6 +82,15 @@ void DeviceMatch::add(const std::string &entity) > entities_.push_back(entity); > } > > +/** > + * \brief Add a regex to match a media entity name to the search pattern > + * \param[in] entity The regex intended to match to an entity in the media graph > + */ > +void DeviceMatch::add(const std::regex entity) Please drop the `const`. > +{ > + entityRegexs_.push_back(std::move(entity)); > +} > [...]
Hi Barnabás On Wed, Dec 03, 2025 at 09:29:56PM +0100, Barnabás Pőcze wrote: > 2025. 12. 03. 10:14 keltezéssel, Jacopo Mondi írta: > > From: Daniel Scally <dan.scally@ideasonboard.com> > > > > Some entities in a media graph have names that might differ from > > implementation to implementation; for example the Camera Receiver > > Unit and CSI-2 receiver on the RZ/V2H(P) SoC have entities with names > > that include their address, in the form "csi-16000400.csi2". Passing > > that entity name to DeviceMatch is too inflexible given it would only > > work if that specific CSI-2 receiver were the one being used. > > > > Add an overload for DeviceMatch::add() such that users can pass in a > > std::regex instead of a string. Update DeviceMatch::match() to check > > for entities that are matched by the regular expressions added with > > the new overload after checking for any exact matches from the vector > > of strings. This allows us to use regex to match on patterns like > > "csi-[0-9a-f]{8}.csi2". > > > > Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com> > > Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> > > Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> > > > > --- > > [...] > > diff --git a/src/libcamera/device_enumerator.cpp b/src/libcamera/device_enumerator.cpp > > index ae17862f676310ef568e5331106ed661e84b5130..2911d5f0385f9765a2eafce2085d1fd627d94b95 100644 > > --- a/src/libcamera/device_enumerator.cpp > > +++ b/src/libcamera/device_enumerator.cpp > > @@ -53,7 +53,8 @@ LOG_DEFINE_CATEGORY(DeviceEnumerator) > > * > > * A DeviceMatch is created with a specific Linux device driver in mind, > > * therefore the name of the driver is a required property. One or more Entity > > - * names can be added as match criteria. > > + * names (or regular expressions designed to match an entity name) can be added > > + * as match criteria. > > * > > * Pipeline handlers are recommended to add entities to DeviceMatch as > > * appropriate to ensure that the media device they need can be uniquely > > @@ -81,6 +82,15 @@ void DeviceMatch::add(const std::string &entity) > > entities_.push_back(entity); > > } > > +/** > > + * \brief Add a regex to match a media entity name to the search pattern > > + * \param[in] entity The regex intended to match to an entity in the media graph > > + */ > > +void DeviceMatch::add(const std::regex entity) > > Please drop the `const`. > Thanks, this is indeed a leftover. With this fixed, can I push the series or would you like me to resend it ? Thanks j > > > +{ > > + entityRegexs_.push_back(std::move(entity)); > > +} > > [...]
2025. 12. 04. 10:55 keltezéssel, Jacopo Mondi írta: > Hi Barnabás > > On Wed, Dec 03, 2025 at 09:29:56PM +0100, Barnabás Pőcze wrote: >> 2025. 12. 03. 10:14 keltezéssel, Jacopo Mondi írta: >>> From: Daniel Scally <dan.scally@ideasonboard.com> >>> >>> Some entities in a media graph have names that might differ from >>> implementation to implementation; for example the Camera Receiver >>> Unit and CSI-2 receiver on the RZ/V2H(P) SoC have entities with names >>> that include their address, in the form "csi-16000400.csi2". Passing >>> that entity name to DeviceMatch is too inflexible given it would only >>> work if that specific CSI-2 receiver were the one being used. >>> >>> Add an overload for DeviceMatch::add() such that users can pass in a >>> std::regex instead of a string. Update DeviceMatch::match() to check >>> for entities that are matched by the regular expressions added with >>> the new overload after checking for any exact matches from the vector >>> of strings. This allows us to use regex to match on patterns like >>> "csi-[0-9a-f]{8}.csi2". >>> >>> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com> >>> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> >>> Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> >>> >>> --- >>> [...] >>> diff --git a/src/libcamera/device_enumerator.cpp b/src/libcamera/device_enumerator.cpp >>> index ae17862f676310ef568e5331106ed661e84b5130..2911d5f0385f9765a2eafce2085d1fd627d94b95 100644 >>> --- a/src/libcamera/device_enumerator.cpp >>> +++ b/src/libcamera/device_enumerator.cpp >>> @@ -53,7 +53,8 @@ LOG_DEFINE_CATEGORY(DeviceEnumerator) >>> * >>> * A DeviceMatch is created with a specific Linux device driver in mind, >>> * therefore the name of the driver is a required property. One or more Entity >>> - * names can be added as match criteria. >>> + * names (or regular expressions designed to match an entity name) can be added >>> + * as match criteria. >>> * >>> * Pipeline handlers are recommended to add entities to DeviceMatch as >>> * appropriate to ensure that the media device they need can be uniquely >>> @@ -81,6 +82,15 @@ void DeviceMatch::add(const std::string &entity) >>> entities_.push_back(entity); >>> } >>> +/** >>> + * \brief Add a regex to match a media entity name to the search pattern >>> + * \param[in] entity The regex intended to match to an entity in the media graph >>> + */ >>> +void DeviceMatch::add(const std::regex entity) >> >> Please drop the `const`. >> > > Thanks, this is indeed a leftover. > > With this fixed, can I push the series or would you like me to resend > it ? I think so, no more comments from me. > > Thanks > j > >> >>> +{ >>> + entityRegexs_.push_back(std::move(entity)); >>> +} >>> [...]
diff --git a/include/libcamera/internal/device_enumerator.h b/include/libcamera/internal/device_enumerator.h index db3532a9887af913ceee20cbba3f945e56e7b61d..fa8806b0c2a47ab89fdc74fe01ef77bf2e68abb1 100644 --- a/include/libcamera/internal/device_enumerator.h +++ b/include/libcamera/internal/device_enumerator.h @@ -11,6 +11,7 @@ #include <string> #include <vector> +#include <libcamera/base/regex.h> #include <libcamera/base/signal.h> namespace libcamera { @@ -23,12 +24,14 @@ public: DeviceMatch(const std::string &driver); void add(const std::string &entity); + void add(const std::regex entity); bool match(const MediaDevice *device) const; private: std::string driver_; std::vector<std::string> entities_; + std::vector<std::regex> entityRegexs_; }; class DeviceEnumerator diff --git a/src/libcamera/device_enumerator.cpp b/src/libcamera/device_enumerator.cpp index ae17862f676310ef568e5331106ed661e84b5130..2911d5f0385f9765a2eafce2085d1fd627d94b95 100644 --- a/src/libcamera/device_enumerator.cpp +++ b/src/libcamera/device_enumerator.cpp @@ -53,7 +53,8 @@ LOG_DEFINE_CATEGORY(DeviceEnumerator) * * A DeviceMatch is created with a specific Linux device driver in mind, * therefore the name of the driver is a required property. One or more Entity - * names can be added as match criteria. + * names (or regular expressions designed to match an entity name) can be added + * as match criteria. * * Pipeline handlers are recommended to add entities to DeviceMatch as * appropriate to ensure that the media device they need can be uniquely @@ -81,6 +82,15 @@ void DeviceMatch::add(const std::string &entity) entities_.push_back(entity); } +/** + * \brief Add a regex to match a media entity name to the search pattern + * \param[in] entity The regex intended to match to an entity in the media graph + */ +void DeviceMatch::add(const std::regex entity) +{ + entityRegexs_.push_back(std::move(entity)); +} + /** * \brief Compare a search pattern with a media device * \param[in] device The media device @@ -116,6 +126,33 @@ bool DeviceMatch::match(const MediaDevice *device) const return false; } + for (const std::regex &nameRegex : entityRegexs_) { + bool found = false; + + for (const MediaEntity *entity : device->entities()) { + if (!std::regex_search(entity->name(), nameRegex)) + continue; + + if (found) { + LOG(DeviceEnumerator, Error) + << "Multiple entities match regex"; + return false; + } + + if (entity->deviceNode().empty()) { + LOG(DeviceEnumerator, Debug) + << "Skip " << entity->name() + << ": no device node"; + continue; + } + + found = true; + } + + if (!found) + return false; + } + return true; }