Move the initialisation of Bayer params and CCM to a new constructor in the Debayer class. Ensure we call the base class constructor from DebayerCpu's constructor in the expected constructor order Debayer then DebayerCpu. Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
190 lines
5 KiB
C++
190 lines
5 KiB
C++
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
/*
|
|
* Copyright (C) 2023, Linaro Ltd
|
|
* Copyright (C) 2023-2025 Red Hat Inc.
|
|
*
|
|
* Authors:
|
|
* Hans de Goede <hdegoede@redhat.com>
|
|
*
|
|
* debayer base class
|
|
*/
|
|
|
|
#include "debayer.h"
|
|
|
|
namespace libcamera {
|
|
|
|
/**
|
|
* \struct DebayerParams
|
|
* \brief Struct to hold the debayer parameters.
|
|
*/
|
|
|
|
/**
|
|
* \var DebayerParams::kRGBLookupSize
|
|
* \brief Size of a color lookup table
|
|
*/
|
|
|
|
/**
|
|
* \struct DebayerParams::CcmColumn
|
|
* \brief Type of a single column of a color correction matrix (CCM)
|
|
*
|
|
* When multiplying an input pixel, columns in the CCM correspond to the red,
|
|
* green or blue component of input pixel values, while rows correspond to the
|
|
* red, green or blue components of the output pixel values. The members of the
|
|
* CcmColumn structure are named after the colour components of the output pixel
|
|
* values they correspond to.
|
|
*/
|
|
|
|
/**
|
|
* \var DebayerParams::CcmColumn::r
|
|
* \brief Red (first) component of a CCM column
|
|
*/
|
|
|
|
/**
|
|
* \var DebayerParams::CcmColumn::g
|
|
* \brief Green (second) component of a CCM column
|
|
*/
|
|
|
|
/**
|
|
* \var DebayerParams::CcmColumn::b
|
|
* \brief Blue (third) component of a CCM column
|
|
*/
|
|
|
|
/**
|
|
* \typedef DebayerParams::LookupTable
|
|
* \brief Type of the lookup tables for single lookup values
|
|
*/
|
|
|
|
/**
|
|
* \typedef DebayerParams::CcmLookupTable
|
|
* \brief Type of the CCM lookup tables for red, green, blue values
|
|
*/
|
|
|
|
/**
|
|
* \var DebayerParams::red
|
|
* \brief Lookup table for red color, mapping input values to output values
|
|
*/
|
|
|
|
/**
|
|
* \var DebayerParams::green
|
|
* \brief Lookup table for green color, mapping input values to output values
|
|
*/
|
|
|
|
/**
|
|
* \var DebayerParams::blue
|
|
* \brief Lookup table for blue color, mapping input values to output values
|
|
*/
|
|
|
|
/**
|
|
* \var DebayerParams::redCcm
|
|
* \brief Lookup table for the CCM red column, mapping input values to output values
|
|
*/
|
|
|
|
/**
|
|
* \var DebayerParams::greenCcm
|
|
* \brief Lookup table for the CCM green column, mapping input values to output values
|
|
*/
|
|
|
|
/**
|
|
* \var DebayerParams::blueCcm
|
|
* \brief Lookup table for the CCM blue column, mapping input values to output values
|
|
*/
|
|
|
|
/**
|
|
* \var DebayerParams::gammaLut
|
|
* \brief Gamma lookup table used with color correction matrix
|
|
*/
|
|
|
|
/**
|
|
* \class Debayer
|
|
* \brief Base debayering class
|
|
*
|
|
* Base class that provides functions for setting up the debayering process.
|
|
*/
|
|
|
|
LOG_DEFINE_CATEGORY(Debayer)
|
|
|
|
Debayer::Debayer()
|
|
{
|
|
/* Initialize color lookup tables */
|
|
for (unsigned int i = 0; i < DebayerParams::kRGBLookupSize; i++) {
|
|
red_[i] = green_[i] = blue_[i] = i;
|
|
redCcm_[i] = { static_cast<int16_t>(i), 0, 0 };
|
|
greenCcm_[i] = { 0, static_cast<int16_t>(i), 0 };
|
|
blueCcm_[i] = { 0, 0, static_cast<int16_t>(i) };
|
|
}
|
|
}
|
|
|
|
Debayer::~Debayer()
|
|
{
|
|
}
|
|
|
|
/**
|
|
* \fn int Debayer::configure()
|
|
* \brief Configure the debayer object according to the passed in parameters
|
|
* \param[in] inputCfg The input configuration
|
|
* \param[in] outputCfgs The output configurations
|
|
* \param[in] ccmEnabled Whether a color correction matrix is applied
|
|
*
|
|
* \return 0 on success, a negative errno on failure
|
|
*/
|
|
|
|
/**
|
|
* \fn Size Debayer::patternSize(PixelFormat inputFormat)
|
|
* \brief Get the width and height at which the bayer pattern repeats
|
|
* \param[in] inputFormat The input format
|
|
*
|
|
* Valid sizes are: 2x2, 4x2 or 4x4.
|
|
*
|
|
* \return Pattern size or an empty size for unsupported inputFormats
|
|
*/
|
|
|
|
/**
|
|
* \fn std::vector<PixelFormat> Debayer::formats(PixelFormat inputFormat)
|
|
* \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
|
|
*/
|
|
|
|
/**
|
|
* \fn std::tuple<unsigned int, unsigned int> Debayer::strideAndFrameSize(const PixelFormat &outputFormat, const Size &size)
|
|
* \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
|
|
*/
|
|
|
|
/**
|
|
* \fn void Debayer::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output, DebayerParams params)
|
|
* \brief Process the bayer data into the requested format
|
|
* \param[in] frame The frame number
|
|
* \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().
|
|
*/
|
|
|
|
/**
|
|
* \fn virtual SizeRange Debayer::sizes(PixelFormat inputFormat, const Size &inputSize)
|
|
* \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
|
|
*/
|
|
|
|
/**
|
|
* \var Signal<FrameBuffer *> Debayer::inputBufferReady
|
|
* \brief Signals when the input buffer is ready
|
|
*/
|
|
|
|
/**
|
|
* \var Signal<FrameBuffer *> Debayer::outputBufferReady
|
|
* \brief Signals when the output buffer is ready
|
|
*/
|
|
|
|
} /* namespace libcamera */
|