Files
external_libcamera/src/libcamera/software_isp/debayer.cpp
Bryan O'Donoghue 364886fb13 libcamera: software_isp: Move isStandardBayerOrder to base class
isStandardBayerOrder is useful to both CPU and GPU debayer logic and
reusable as-is for both.

Move to shared location in base class.

Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Milan Zamazal <mzamazal@redhat.com>
Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2025-12-12 23:32:52 +00:00

393 lines
11 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* 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.
*/
/**
* \fn Debayer::Debayer(const GlobalConfiguration &configuration)
* \brief Construct a Debayer object
* \param[in] configuration Global configuration reference
*/
/**
* \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(const GlobalConfiguration &configuration) : bench_(configuration)
{
/* 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
*/
/**
* \fn const SharedFD &Debayer::getStatsFD()
* \brief Get the file descriptor for the statistics
*
* This file descriptor provides access to the output statistics buffer
* associated with the current debayering process.
*
* \return The file descriptor pointing to the statistics data
*/
/**
* \fn unsigned int Debayer::frameSize()
* \brief Get the output frame size
*
* \return The total output frame size in bytes as configured for the
* current stream.
*/
/**
* \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
*/
/**
* \struct Debayer::DebayerInputConfig
* \brief Structure describing the incoming Bayer parameters
*
* The DebayerInputConfig structure defines the characteristics of the raw
* Bayer frame being processed, including:
* - The Bayer pattern dimensions (\ref patternSize)
* - Memory layout parameters such as stride and bytes per pixel (\ref bpp)
* - A list of supported output pixel formats.
*
* \var Debayer::DebayerInputConfig::patternSize
* Size of the Bayer pattern in pixels. For standard Bayer formats such as
* BGGR, GRBG, GBRG, and RGGB, this is typically 2×2 pixels.
*
* \var Debayer::DebayerInputConfig::bpp
* Number of bytes used per pixel in memory. This reflects storage size,
* not precision.
*
* \var Debayer::DebayerInputConfig::stride
* Line stride in bytes for the Bayer input frame.
*
* \var Debayer::DebayerInputConfig::outputFormats
* List of pixel formats supported as output for this input configuration.
*/
/**
* \struct Debayer::DebayerOutputConfig
* \brief Structure describing the output frame configuration
*
* Defines how the output of the debayer process is laid out in memory.
* It includes per-pixel size, stride, and total frame size.
*
* \var Debayer::DebayerOutputConfig::bpp
* Bytes used per pixel in the output format.
*
* \var Debayer::DebayerOutputConfig::stride
* Line stride in bytes for the output frame.
*
* \var Debayer::DebayerOutputConfig::frameSize
* Total frame size in bytes for the output buffer.
*/
/**
* \var Debayer::inputConfig_
* \brief Input configuration parameters for the current debayer operation
*
* Holds metadata describing the incoming Bayer image layout, including
* pattern size, bytes per pixel, stride, and supported output formats.
* Populated during configuration.
*/
/**
* \var Debayer::outputConfig_
* \brief Output configuration data for the debayered frame
*
* Contains bytes per pixel, stride, and total frame size for the
* output image buffer. Set during stream configuration.
*/
/**
* \var Debayer::red_
* \brief Lookup table for red channel gain and correction values
*
* This table provides precomputed per-pixel or per-intensity
* correction values for the red color channel used during debayering.
*/
/**
* \var Debayer::green_
* \brief Lookup table for green channel gain and correction values
*
* This table provides precomputed per-pixel or per-intensity
* correction values for the green color channel used during debayering.
*/
/**
* \var Debayer::blue_
* \brief Lookup table for blue channel gain and correction values
*
* This table provides precomputed per-pixel or per-intensity
* correction values for the blue color channel used during debayering.
*/
/**
* \var Debayer::redCcm_
* \brief Red channel Color Correction Matrix (CCM) lookup table
*
* Contains coefficients for green channel color correction.
*/
/**
* \var Debayer::greenCcm_
* \brief Green channel Color Correction Matrix (CCM) lookup table
*
* Contains coefficients for green channel color correction.
*/
/**
* \var Debayer::blueCcm_
* \brief Blue channel Color Correction Matrix (CCM) lookup table
*
* Contains coefficients for blue channel color correction.
*/
/**
* \var Debayer::gammaLut_
* \brief Gamma correction lookup table
*/
/**
* \var Debayer::swapRedBlueGains_
* \brief Flag indicating whether red and blue channel gains should be swapped
*
* Used when the Bayer pattern order indicates that red/blue color channels are
* reversed.
*/
/**
* \var Debayer::bench_
* \brief Benchmarking utility instance for performance measurements
*
* Used internally to track timing and performance metrics during
* debayer processing.
*/
/**
* \fn void Debayer::setParams(DebayerParams &params)
* \brief Select the bayer params to use for the next frame debayer
* \param[in] params The parameters to be used in debayering
*/
void Debayer::setParams(DebayerParams &params)
{
green_ = params.green;
greenCcm_ = params.greenCcm;
if (swapRedBlueGains_) {
red_ = params.blue;
blue_ = params.red;
redCcm_ = params.blueCcm;
blueCcm_ = params.redCcm;
for (unsigned int i = 0; i < 256; i++) {
std::swap(redCcm_[i].r, redCcm_[i].b);
std::swap(greenCcm_[i].r, greenCcm_[i].b);
std::swap(blueCcm_[i].r, blueCcm_[i].b);
}
} else {
red_ = params.red;
blue_ = params.blue;
redCcm_ = params.redCcm;
blueCcm_ = params.blueCcm;
}
gammaLut_ = params.gammaLut;
}
/**
* \fn void Debayer::dmaSyncBegin(DebayerParams &params)
* \brief Common CPU/GPU Dma Sync Buffer begin
*/
void Debayer::dmaSyncBegin(std::vector<DmaSyncer> &dmaSyncers, FrameBuffer *input, FrameBuffer *output)
{
for (const FrameBuffer::Plane &plane : input->planes())
dmaSyncers.emplace_back(plane.fd, DmaSyncer::SyncType::Read);
if (output) {
for (const FrameBuffer::Plane &plane : output->planes())
dmaSyncers.emplace_back(plane.fd, DmaSyncer::SyncType::Write);
}
}
/**
* \fn void Debayer::isStandardBayerOrder(BayerFormat::Order order)
* \brief Common method to validate standard 2x2 Bayer pattern of 2 Green, 1 Blue, 1 Red pixels
*/
bool Debayer::isStandardBayerOrder(BayerFormat::Order order)
{
return order == BayerFormat::BGGR || order == BayerFormat::GBRG ||
order == BayerFormat::GRBG || order == BayerFormat::RGGB;
}
} /* namespace libcamera */