[libcamera-devel] [PATCH 04/12] libcamera: deviceenumerator: add DeviceMatch class
Niklas S??derlund
niklas.soderlund at ragnatech.se
Sat Dec 29 02:06:24 CET 2018
Hi Laurent,
Thanks for your feedback.
On 2018-12-29 00:02:41 +0200, Laurent Pinchart wrote:
> On Monday, 24 December 2018 12:55:30 EET Jacopo Mondi wrote:
> > Hi Niklas,
> > as I've commented on 00/12, I think the DeviceMatcher should be
> > replaced by a MediaDeviceDesc and have the MediaDevice do the matching
> > on it. Nonethless, I have some questions here, as they might apply
> > generally to all our code base.
>
> How about doing it the other way around, having the match() function in the
> MediaDeviceDesc class ? That would keep MediaDevice focused on handling media
> devices, and MediaDeviceDesc on handling matching. We could perhaps rename
> MediaDeviceDesc to MediaDeviceMatch (I don't dislike the MediaDeviceDesc name
> as such, but I don't really like abbreviating Desc).
I agree it would be good if the MedaDevice could focus on operating
media device and have the enumeration and matching in other objects.
>
> > On Sun, Dec 23, 2018 at 12:00:33AM +0100, Niklas S??derlund wrote:
> > > Provide a DeviceMatch class which represents all properties of a media
> > > device a pipeline hander can specify when searching for a device to use
> > > in its pipeline.
> > >
> > > Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> > > ---
> > >
> > > src/libcamera/deviceenumerator.cpp | 54 ++++++++++++++++++++++++
> > > src/libcamera/include/deviceenumerator.h | 17 ++++++++
> > > 2 files changed, 71 insertions(+)
> > >
> > > diff --git a/src/libcamera/deviceenumerator.cpp
> > > b/src/libcamera/deviceenumerator.cpp index
> > > 7c44a65b45472ef3..17b6874d229c791c 100644
> > > --- a/src/libcamera/deviceenumerator.cpp
> > > +++ b/src/libcamera/deviceenumerator.cpp
> > > @@ -75,4 +75,58 @@ bool DeviceInfo::lookup(const std::string &name,
> > > std::string &devnode) const
> > > return true;
> > > }
> > >
> > > +/* ----------------------------------------------------------------------
> > > + * DeviceMatch
> > > + */
> > > +
> > > +DeviceMatch::DeviceMatch(const std::string &driver)
> > > + : driver_(driver)
> > > +{
> > > +}
> >
> > Is it worth placing constructors with list initializers only in the
> > .cpp file?
> >
> > > +
> > > +void DeviceMatch::add(const std::string &entity)
> > > +{
> > > + entities_.push_back(std::string(entity));
>
> Doesn't entities_.push_back(entity); work as expected ?
It does, this is a mistake on my side. Thanks for pointing it out.
>
> > > +}
> > > +
> > > +bool DeviceMatch::match(const DeviceInfo *info) const
> > > +{
> > > + std::vector<std::string> entities;
> >
> > That's weird. This is clearly unused, but the compiler does not
> > complain. Actually I can keep it or remove it without any message from
> > g++. Was it here intentionally?
> >
> > > +
> > > + if (!matchInfo(info->info()))
> > > + return false;
> > > +
> > > + if (!matchEntities(info->entities()))
> > > + return false;
> > > +
> > > + return true;
>
> Given how simple the code is I would inline both matchInfo() and
> matchEntities() here.
OK I yield :-) Will inline in v2.
>
> > > +}
> > > +
> > > +bool DeviceMatch::matchInfo(const struct media_device_info &info) const
> > > +{
> > > + /* TODO: Add more optinal matching pairs from struct media_device_info
> > > */
> >
> > optional
> >
> > > + /* TODO: Allow for empty driver in DeviceMatch */
> > > + return driver_ == info.driver;
> > > +}
> > > +
> > > +bool DeviceMatch::matchEntities(const std::vector<std::string> &entities)
> > > const
> > > +{
> > > + for (const std::string &name : entities_) {
> > > + bool found = false;
> > > +
> > > + for (const std::string &entity : entities) {
> > > +
> >
> > nit: unnecessary empty line
> >
> > > + if (name == entity) {
> > > + found = true;
> > > + break;
> > > + }
> > > + }
> > > +
> > > + if (!found)
> > > + return false;
> > > + }
> > > +
> > > + return true;
> > > +}
> > > +
> > >
> > > } /* namespace libcamera */
> > >
> > > diff --git a/src/libcamera/include/deviceenumerator.h
> > > b/src/libcamera/include/deviceenumerator.h index
> > > 0136ed6ea23bf65e..fb412b8840cb2ffe 100644
> > > --- a/src/libcamera/include/deviceenumerator.h
> > > +++ b/src/libcamera/include/deviceenumerator.h
> > > @@ -39,6 +39,23 @@ private:
> > > std::map<std::string, std::string> entities_;
> > > };
> > >
> > > +class DeviceMatch
> > > +{
> > > +public:
> > > + DeviceMatch(const std::string &driver);
> > > +
> > > + void add(const std::string &entity);
> > > +
> > > + bool match(const DeviceInfo *info) const;
> > > +
> > > +private:
> > > + std::string driver_;
> > > + std::vector<std::string> entities_;
> > > +
> > > + bool matchInfo(const struct media_device_info &info) const;
> > > + bool matchEntities(const std::vector<std::string> &entities) const;
> > > +};
> > > +
> > >
> > > } /* namespace libcamera */
> > >
> > > #endif /* __LIBCAMERA_DEVICEENUMERATE_H__ */
> >
> > This is less than nit, but shouldn't this be DEVICEENUMERATOR ? :)
>
> --
> Regards,
>
> Laurent Pinchart
>
>
>
--
Regards,
Niklas Söderlund
More information about the libcamera-devel
mailing list