[libcamera-devel] [PATCH] ipa: rpi: Add "focus" algorithm
Kieran Bingham
kieran.bingham at ideasonboard.com
Thu Jun 25 18:27:32 CEST 2020
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 ¶ms)
> +{
> + 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 ¶ms) 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.
--
Regards
Kieran
> +};
> +
> +} /* namespace RPi */
> diff --git a/src/ipa/raspberrypi/data/imx477.json b/src/ipa/raspberrypi/data/imx477.json
> index dce5234f..389e8ce8 100644
> --- a/src/ipa/raspberrypi/data/imx477.json
> +++ b/src/ipa/raspberrypi/data/imx477.json
> @@ -412,5 +412,9 @@
> "rpi.sharpen":
> {
>
> + },
> + "rpi.focus":
> + {
> + "print": 1
> }
> }
> diff --git a/src/ipa/raspberrypi/meson.build b/src/ipa/raspberrypi/meson.build
> index 697902e9..9445cd09 100644
> --- a/src/ipa/raspberrypi/meson.build
> +++ b/src/ipa/raspberrypi/meson.build
> @@ -29,6 +29,7 @@ rpi_ipa_sources = files([
> 'controller/rpi/awb.cpp',
> 'controller/rpi/sharpen.cpp',
> 'controller/rpi/black_level.cpp',
> + 'controller/rpi/focus.cpp',
> 'controller/rpi/geq.cpp',
> 'controller/rpi/noise.cpp',
> 'controller/rpi/lux.cpp',
>
--
Regards
--
Kieran
More information about the libcamera-devel
mailing list