[libcamera-devel] [PATCH v4 1/3] libcamera: Introduce camera sensor database
Hirokazu Honda
hiroh at chromium.org
Tue Apr 13 09:42:27 CEST 2021
Hi Jacopo,
On Tue, Apr 13, 2021 at 4:39 PM Jacopo Mondi <jacopo at jmondi.org> wrote:
>
> Hello,
>
> On Tue, Apr 13, 2021 at 04:00:25PM +0900, Hirokazu Honda wrote:
> > > > > > > > > > +
> > > > > > > > > > +/**
> > > > > > > > > > + * \brief Retrieve the properties associated with a sensor
> > > > > > > > > > + * \param sensor The sensor model name
> > > > > > > > > > + * \return A pointer to the SensorInfo instance associated with a sensor or
> > > > > > > > > > + * nullptr if the sensor is not supported in the database
> > > > > > > > > > + */
> > > > > > > > > > +const SensorInfo *SensorDatabase::get(const std::string &sensor)
> > > > > > > > > > +{
> > > > > > > > > > + for (unsigned int i = 0; i < std::size(sensorDatabase__); ++i) {
> > > > > > > > > > + if (sensorDatabase__[i].first == sensor)
> > > > > > > > > > + return sensorDatabase__[i].second;
> > > > > > > > > > + }
> > > > > > >
> > > > > > > Why not std::map ?
> > > > > >
> > > > > > I expect the reason is std::map cannot be constructed as constexpr.
> > > > >
> > > > > But the only function that uses it is get(), which isn't constexpr, so
> > > > > is that really a problem ?
> > > >
> > > > Global and static function should be trivially destructible.
> > > > https://google.github.io/styleguide/cppguide.html#Static_and_Global_Variables
> > >
> > > We have a more relaxed rule, documented in
> > > Documentation/coding_style.rst. In this case, a map is much more
> > > convenient, and as its initialization and destruction is independent of
> > > all other global variables, it doesn't risk causing most of the issues
> > > mentioned in the above link.
> > >
>
> Indeed I used std::pair to be able to declare it as constexpr.
>
> I'll make it a map if that's a not a requirement. I'll see if it's
> possbile to statically initialize it as I'm currently doing with the
> pair
>
> >
> > Thanks. I don't remember the description, although I think I read it previously.
> > That sounds good to me. Perhaps, the map would be put as a const
> > static variable within CameraSensorInfo::get().
> >
>
> The map needs to be statically initialized, it could be done inside
> the ::get() function most probably. Something like (not tested)
>
> const SensorInfo *SensorDatabase::get(const std::string &sensor)
> {
> static const std::map<const char *const, const SensorInfo *> sensorDb = {
> SENSOR_INFO(imx219),
> SENSOR_INFO(ov5670),
> SENSOR_INFO(ov13858),
> };
>
> const auto it = sensorDb.find(sensor.c_str());
> if (it == sensorDb.end())
> return nullptr;
>
> return it->second;
> }
>
> Thanks
> j
Yep, this code looks good to me. (and should work to my best of knowledge)
-Hiro
>
>
>
> > > > > > > namespace {
> > > > > > >
> > > > > > > const std::map<std::string, SensorInfo> sensorDatabase{
> > > > > > > { "imx219", {
> > > > > > > .unitCellSize = { 1120, 1120 },
> > > > > > > } },
> > > > > > > ...
> > > > > > > };
> > > > > > >
> > > > > > > } /* namespace */
> > > > > > >
> > > > > > > and this function can become
> > > > > > >
> > > > > > > const CameraSensorInfo *CameraSensorInfo::get(const std::string &sensor)
> > > > > > > {
> > > > > > > auto iter = sensorDatabase.find(sensor);
> > > > > > > if (iter == sensorDatabase.end())
> > > > > > > return nullptr;
> > > > > > >
> > > > > > > return *iter;
> > > > > > > }
> > > > > > >
> > > > > > > > > > +
> > > > > > > > > > + return nullptr;
> > > > > > > > > > +}
> > > > > > > > > > +
> > > > > > > > > > +} /* namespace libcamera */
> > > > > > > >
> > > > > > > > Reviewed-by: Hirokazu Honda <hiroh at chromium.org>
> > >
> > > --
> > > Regards,
> > >
> > > Laurent Pinchart
More information about the libcamera-devel
mailing list