[libcamera-devel] [PATCH] ipa: rpi: Add "focus" algorithm

Naushir Patuck naush at raspberrypi.com
Fri Jun 26 09:33:25 CEST 2020


Hi Kieran,

On Thu, 25 Jun 2020 at 17:27, Kieran Bingham
<kieran.bingham at ideasonboard.com> wrote:
>
> Hi David, Naush,
>
> On 28/05/2020 15:51, Naushir Patuck wrote:
> > From: David Plowman <david.plowman at raspberrypi.com>
> >
> > Adds FocusStatus to the image metadata, containing contrast measurements
> > across the image. Optionally also prints a contrast measure to the
> > console, to aid in manual adjustment of the lens. Note that it is not an
> > actual auto-focus algorithm that can drive a lens!
> >
> > Signed-off-by: David Plowman <david.plowman at raspberrypi.com>
> > Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
> > ---
> >  src/ipa/raspberrypi/controller/focus_status.h | 26 ++++++++++
> >  src/ipa/raspberrypi/controller/rpi/focus.cpp  | 51 +++++++++++++++++++
> >  src/ipa/raspberrypi/controller/rpi/focus.hpp  | 31 +++++++++++
> >  src/ipa/raspberrypi/data/imx477.json          |  4 ++
> >  src/ipa/raspberrypi/meson.build               |  1 +
> >  5 files changed, 113 insertions(+)
> >  create mode 100644 src/ipa/raspberrypi/controller/focus_status.h
> >  create mode 100644 src/ipa/raspberrypi/controller/rpi/focus.cpp
> >  create mode 100644 src/ipa/raspberrypi/controller/rpi/focus.hpp
> >
> > diff --git a/src/ipa/raspberrypi/controller/focus_status.h b/src/ipa/raspberrypi/controller/focus_status.h
> > new file mode 100644
> > index 00000000..3ad88777
> > --- /dev/null
> > +++ b/src/ipa/raspberrypi/controller/focus_status.h
> > @@ -0,0 +1,26 @@
> > +/* SPDX-License-Identifier: BSD-2-Clause */
> > +/*
> > + * Copyright (C) 2020, Raspberry Pi (Trading) Limited
> > + *
> > + * focus_status.h - focus measurement status
> > + */
> > +#pragma once
> > +
> > +#include <linux/bcm2835-isp.h>
> > +
> > +// The focus algorithm should post the following structure into the image's
> > +// "focus.status" metadata. Recall that it's only reporting focus (contrast)
> > +// measurements, it's not driving any kind of auto-focus algorithm!
> > +
> > +#ifdef __cplusplus
> > +extern "C" {
> > +#endif
> > +
> > +struct FocusStatus {
> > +     int num;
> > +     uint32_t focus_measures[FOCUS_REGIONS];
> > +};
> > +
> > +#ifdef __cplusplus
> > +}
> > +#endif
> > diff --git a/src/ipa/raspberrypi/controller/rpi/focus.cpp b/src/ipa/raspberrypi/controller/rpi/focus.cpp
> > new file mode 100644
> > index 00000000..d6cdc4bf
> > --- /dev/null
> > +++ b/src/ipa/raspberrypi/controller/rpi/focus.cpp
> > @@ -0,0 +1,51 @@
> > +/* SPDX-License-Identifier: BSD-2-Clause */
> > +/*
> > + * Copyright (C) 2020, Raspberry Pi (Trading) Limited
> > + *
> > + * focus.cpp - focus algorithm
> > + */
> > +#include <stdint.h>
> > +
> > +#include "../focus_status.h"
> > +#include "../logging.hpp"
> > +#include "focus.hpp"
> > +
> > +using namespace RPi;
> > +
> > +#define NAME "rpi.focus"
> > +
> > +Focus::Focus(Controller *controller)
> > +     : Algorithm(controller)
> > +{
> > +}
> > +
> > +char const *Focus::Name() const
> > +{
> > +     return NAME;
> > +}
> > +
> > +void Focus::Read(boost::property_tree::ptree const &params)
> > +{
> > +     print_ = params.get<int>("print", 0);
> > +}
> > +
> > +void Focus::Process(StatisticsPtr &stats, Metadata *image_metadata)
> > +{
> > +     FocusStatus status;
> > +     int i;
> > +     for (i = 0; i < FOCUS_REGIONS; i++)
> > +             status.focus_measures[i] = stats->focus_stats[i].contrast_val[1][1] / 1000;
> > +     status.num = i;
> > +     image_metadata->Set("focus.status", status);
> > +     if (print_) {
> > +             uint32_t value = (status.focus_measures[5] + status.focus_measures[6]) / 10;
> > +             RPI_LOG("Focus contrast measure: " << value);
> > +     }
> > +}
> > +
> > +/* Register algorithm with the system. */
> > +static Algorithm *Create(Controller *controller)
> > +{
> > +     return new Focus(controller);
> > +}
> > +static RegisterAlgorithm reg(NAME, &Create);
> > diff --git a/src/ipa/raspberrypi/controller/rpi/focus.hpp b/src/ipa/raspberrypi/controller/rpi/focus.hpp
> > new file mode 100644
> > index 00000000..d53401f7
> > --- /dev/null
> > +++ b/src/ipa/raspberrypi/controller/rpi/focus.hpp
> > @@ -0,0 +1,31 @@
> > +/* SPDX-License-Identifier: BSD-2-Clause */
> > +/*
> > + * Copyright (C) 2020, Raspberry Pi (Trading) Limited
> > + *
> > + * focus.hpp - focus algorithm
> > + */
> > +#pragma once
> > +
> > +#include "../algorithm.hpp"
> > +#include "../metadata.hpp"
> > +
> > +/*
> > + * The "focus" algorithm. All it does it print out a version of the
> > + * focus contrast measure; there is no actual auto-focus mechanism to
> > + * control.
> > + */
> > +
> > +namespace RPi {
> > +
> > +class Focus : public Algorithm
> > +{
> > +public:
> > +     Focus(Controller *controller);
> > +     char const *Name() const override;
> > +     void Read(boost::property_tree::ptree const &params) override;
> > +     void Process(StatisticsPtr &stats, Metadata *image_metadata) override;
> > +private:
> > +     bool print_;
>
> This introduces the following coverity warning:
>
>
> ** CID 293456:  Uninitialized members  (UNINIT_CTOR)
> /home/linuxembedded/iob/libcamera/libcamera-daily/src/ipa/raspberrypi/controller/rpi/focus.cpp:
> 20 in RPi::Focus::Focus(RPi::Controller *)()
>
>
> ________________________________________________________________________________________________________
> *** CID 293456:  Uninitialized members  (UNINIT_CTOR)
> /home/linuxembedded/iob/libcamera/libcamera-daily/src/ipa/raspberrypi/controller/rpi/focus.cpp:
> 20 in RPi::Focus::Focus(RPi::Controller *)()
> 14
> 15     #define NAME "rpi.focus"
> 16
> 17     Focus::Focus(Controller *controller)
> 18      : Algorithm(controller)
> 19     {
> >>>     CID 293456:  Uninitialized members  (UNINIT_CTOR)
> >>>     Non-static class member "print_" is not initialized in this
> constructor nor in any functions that it calls.
> 20     }
> 21
> 22     char const *Focus::Name() const
> 23     {
> 24      return NAME;
> 25     }
>
> If you supply a patch to fix, please add the tag:
>
> Reported-by: Coverity CID=293456
>
>
> Alternatively, if you believe it's a false positive and should not be
> fixed, let me know and I'll mark it as such to close the issue.
>

Thanks for the heads-up.  This is not actually a problem, as
Focus::Read() initialises print_ and is always called before
focus::process().  Not surprisingly, Coverity did not spot that.  I'll
put in an explicit initialiser to fix the defect.  I'm about to push a
set of patches for focus, so I'll add the fix to that.

Regards,
Naush


More information about the libcamera-devel mailing list