[libcamera-devel] [PATCH v2 09/18] libcamera: software_isp: Add Debayer base class
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Tue Jan 23 18:17:09 CET 2024
On Sat, Jan 13, 2024 at 03:22:09PM +0100, 📷-dev wrote:
> Add a base class for debayer implementations. This is intended to be
> suitable for both GPU (or otherwise) accelerated debayer implementations
> as well as CPU based debayering.
Same comment as for the stats, let's keep it simple, we have a single
implementation, we'll make code modular later when/if we can.
> Doxygen documentation by Dennis Bonke.
>
> Co-authored-by: Dennis Bonke <admin at dennisbonke.com>
> Signed-off-by: Dennis Bonke <admin at dennisbonke.com>
> Co-authored-by: Andrey Konovalov <andrey.konovalov at linaro.org>
> Signed-off-by: Andrey Konovalov <andrey.konovalov at linaro.org>
> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> Tested-by: Bryan O'Donoghue <bryan.odonoghue at linaro.org> # sc8280xp Lenovo x13s
> Tested-by: Pavel Machek <pavel at ucw.cz>
> ---
> .../libcamera/internal/software_isp/debayer.h | 132 ++++++++++++++++++
> .../internal/software_isp/debayer_params.h | 43 ++++++
> .../internal/software_isp/meson.build | 2 +
> src/libcamera/software_isp/debayer.cpp | 22 +++
> src/libcamera/software_isp/meson.build | 1 +
> 5 files changed, 200 insertions(+)
> create mode 100644 include/libcamera/internal/software_isp/debayer.h
> create mode 100644 include/libcamera/internal/software_isp/debayer_params.h
> create mode 100644 src/libcamera/software_isp/debayer.cpp
>
> diff --git a/include/libcamera/internal/software_isp/debayer.h b/include/libcamera/internal/software_isp/debayer.h
> new file mode 100644
> index 00000000..39e6f393
> --- /dev/null
> +++ b/include/libcamera/internal/software_isp/debayer.h
> @@ -0,0 +1,132 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2023, Linaro Ltd
> + * Copyright (C) 2023, Red Hat Inc.
> + *
> + * Authors:
> + * Hans de Goede <hdegoede at redhat.com>
> + *
> + * debayer.h - debayering base class
> + */
> +
> +#pragma once
> +
> +#include <stdint.h>
> +
> +#include <libcamera/base/log.h>
> +#include <libcamera/base/signal.h>
> +
> +#include <libcamera/geometry.h>
> +#include <libcamera/stream.h>
> +
> +#include "libcamera/internal/software_isp/debayer_params.h"
> +
> +namespace libcamera {
> +
> +class FrameBuffer;
> +
> +LOG_DECLARE_CATEGORY(Debayer)
> +
> +/**
> + * \class Debayer
> + * \brief Base debayering class
> + *
> + * Base class that provides functions for setting up the debayering process.
> + */
> +class Debayer
> +{
> +public:
> + virtual ~Debayer() = 0;
> +
> + /**
> + * \brief Configure the debayer object according to the passed in parameters.
> + * \param[in] inputCfg The input configuration.
> + * \param[in] outputCfgs The output configurations.
> + *
> + * \return 0 on success, a negative errno on failure.
> + */
> + virtual int configure(const StreamConfiguration &inputCfg,
> + const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs) = 0;
> +
> + /**
> + * \brief Get the width and height at which the bayer pattern repeats.
> + * \param[in] inputFormat The input format.
> + *
> + * \return pattern size or an empty size for unsupported inputFormats.
> + */
> + virtual Size patternSize(PixelFormat inputFormat) = 0;
> +
> + /**
> + * \brief Get the supported output formats.
> + * \param[in] inputFormat The input format.
> + *
> + * \return all supported output formats or an empty vector if there are none.
> + */
> + virtual std::vector<PixelFormat> formats(PixelFormat inputFormat) = 0;
> +
> + /**
> + * \brief Get the stride and the frame size.
> + * \param[in] outputFormat The output format.
> + * \param[in] size The output size.
> + *
> + * \return a tuple of the stride and the frame size, or a tuple with 0,0 if there is no valid output config.
> + */
> + virtual std::tuple<unsigned int, unsigned int>
> + strideAndFrameSize(const PixelFormat &outputFormat, const Size &size) = 0;
> +
> + /**
> + * \brief Process the bayer data into the requested format.
> + * \param[in] input The input buffer.
> + * \param[in] output The output buffer.
> + * \param[in] params The parameters to be used in debayering.
> + *
> + * \note DebayerParams is passed by value deliberately so that a copy is passed
> + * when this is run in another thread by invokeMethod().
> + */
> + virtual void process(FrameBuffer *input, FrameBuffer *output, DebayerParams params) = 0;
> +
> + /**
> + * \brief Get the supported output sizes for the given input format and size.
> + * \param[in] inputFormat The input format.
> + * \param[in] inputSize The input size.
> + *
> + * \return The valid size ranges or an empty range if there are none.
> + */
> + SizeRange sizes(PixelFormat inputFormat, const Size &inputSize)
> + {
> + Size pattern_size = patternSize(inputFormat);
> +
> + if (pattern_size.isNull())
> + return {};
> +
> + /*
> + * For debayer interpolation a border of pattern-height x pattern-width
> + * is kept around the entire image. Combined with a minimum-size of
> + * pattern-height x pattern-width this means the input-size needs to be
> + * at least (3 * pattern-height) x (3 * pattern-width).
> + */
> + if (inputSize.width < (3 * pattern_size.width) ||
> + inputSize.height < (3 * pattern_size.height)) {
> + LOG(Debayer, Warning)
> + << "Input format size too small: " << inputSize.toString();
> + return {};
> + }
> +
> + return SizeRange(Size(pattern_size.width, pattern_size.height),
> + Size((inputSize.width - 2 * pattern_size.width) & ~(pattern_size.width - 1),
> + (inputSize.height - 2 * pattern_size.height) & ~(pattern_size.height - 1)),
> + pattern_size.width, pattern_size.height);
> + }
> +
> + /**
> + * \brief Signals when the input buffer is ready.
> + */
> + Signal<FrameBuffer *> inputBufferReady;
> +
> + /**
> + * \brief Signals when the output buffer is ready.
> + */
> + Signal<FrameBuffer *> outputBufferReady;
> +};
> +
> +} /* namespace libcamera */
> diff --git a/include/libcamera/internal/software_isp/debayer_params.h b/include/libcamera/internal/software_isp/debayer_params.h
> new file mode 100644
> index 00000000..8f515304
> --- /dev/null
> +++ b/include/libcamera/internal/software_isp/debayer_params.h
> @@ -0,0 +1,43 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2023, Red Hat Inc.
> + *
> + * Authors:
> + * Hans de Goede <hdegoede at redhat.com>
> + *
> + * swstats.h - software statistics base class
> + */
> +
> +#pragma once
> +
> +namespace libcamera {
> +
> +/**
> + * \brief Struct to hold the debayer parameters.
> + */
> +struct DebayerParams {
> + /**
> + * \brief Red Gain.
> + *
> + * 128 = 0.5, 256 = 1.0, 512 = 2.0, etc.
> + */
> + unsigned int gainR;
> + /**
> + * \brief Green Gain.
> + *
> + * 128 = 0.5, 256 = 1.0, 512 = 2.0, etc.
> + */
> + unsigned int gainG;
> + /**
> + * \brief Blue Gain.
> + *
> + * 128 = 0.5, 256 = 1.0, 512 = 2.0, etc.
> + */
> + unsigned int gainB;
> + /**
> + * \brief Gamma correction, 1.0 is no correction.
> + */
> + float gamma;
> +};
> +
> +} /* namespace libcamera */
> diff --git a/include/libcamera/internal/software_isp/meson.build b/include/libcamera/internal/software_isp/meson.build
> index 1d9e4018..7e40925e 100644
> --- a/include/libcamera/internal/software_isp/meson.build
> +++ b/include/libcamera/internal/software_isp/meson.build
> @@ -1,6 +1,8 @@
> # SPDX-License-Identifier: CC0-1.0
>
> libcamera_internal_headers += files([
> + 'debayer.h',
> + 'debayer_params.h',
> 'swisp_stats.h',
> 'swstats.h',
> 'swstats_cpu.h',
> diff --git a/src/libcamera/software_isp/debayer.cpp b/src/libcamera/software_isp/debayer.cpp
> new file mode 100644
> index 00000000..442da1ac
> --- /dev/null
> +++ b/src/libcamera/software_isp/debayer.cpp
> @@ -0,0 +1,22 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2023, Linaro Ltd
> + * Copyright (C) 2023, Red Hat Inc.
> + *
> + * Authors:
> + * Hans de Goede <hdegoede at redhat.com>
> + *
> + * debayer.cpp - debayer base class
> + */
> +
> +#include "libcamera/internal/software_isp/debayer.h"
> +
> +namespace libcamera {
> +
> +LOG_DEFINE_CATEGORY(Debayer)
> +
> +Debayer::~Debayer()
> +{
> +}
> +
> +} /* namespace libcamera */
> diff --git a/src/libcamera/software_isp/meson.build b/src/libcamera/software_isp/meson.build
> index d31c6217..d4ae5ac7 100644
> --- a/src/libcamera/software_isp/meson.build
> +++ b/src/libcamera/software_isp/meson.build
> @@ -1,6 +1,7 @@
> # SPDX-License-Identifier: CC0-1.0
>
> libcamera_sources += files([
> + 'debayer.cpp',
> 'swstats.cpp',
> 'swstats_cpu.cpp',
> ])
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list