mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-17 01:15:06 +03:00
This denoise algorithm class will be used to pass in the user requested denoise operating mode to the controller. The existing Denoise controller will derive from this new DenoiseAlgorithm class. Add a denoise mode field in the denoise status metadata object for the IPA to use when configuring the ISP. Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
75 lines
1.9 KiB
C++
75 lines
1.9 KiB
C++
/* SPDX-License-Identifier: BSD-2-Clause */
|
|
/*
|
|
* Copyright (C) 2019-2021, Raspberry Pi (Trading) Limited
|
|
*
|
|
* sdn.cpp - SDN (spatial denoise) control algorithm
|
|
*/
|
|
|
|
#include "libcamera/internal/log.h"
|
|
|
|
#include "../denoise_status.h"
|
|
#include "../noise_status.h"
|
|
|
|
#include "sdn.hpp"
|
|
|
|
using namespace RPiController;
|
|
using namespace libcamera;
|
|
|
|
LOG_DEFINE_CATEGORY(RPiSdn)
|
|
|
|
// Calculate settings for the spatial denoise block using the noise profile in
|
|
// the image metadata.
|
|
|
|
#define NAME "rpi.sdn"
|
|
|
|
Sdn::Sdn(Controller *controller)
|
|
: DenoiseAlgorithm(controller), mode_(DenoiseMode::ColourOff)
|
|
{
|
|
}
|
|
|
|
char const *Sdn::Name() const
|
|
{
|
|
return NAME;
|
|
}
|
|
|
|
void Sdn::Read(boost::property_tree::ptree const ¶ms)
|
|
{
|
|
deviation_ = params.get<double>("deviation", 3.2);
|
|
strength_ = params.get<double>("strength", 0.75);
|
|
}
|
|
|
|
void Sdn::Initialise() {}
|
|
|
|
void Sdn::Prepare(Metadata *image_metadata)
|
|
{
|
|
struct NoiseStatus noise_status = {};
|
|
noise_status.noise_slope = 3.0; // in case no metadata
|
|
if (image_metadata->Get("noise.status", noise_status) != 0)
|
|
LOG(RPiSdn, Warning) << "no noise profile found";
|
|
LOG(RPiSdn, Debug)
|
|
<< "Noise profile: constant " << noise_status.noise_constant
|
|
<< " slope " << noise_status.noise_slope;
|
|
struct DenoiseStatus status;
|
|
status.noise_constant = noise_status.noise_constant * deviation_;
|
|
status.noise_slope = noise_status.noise_slope * deviation_;
|
|
status.strength = strength_;
|
|
status.mode = static_cast<std::underlying_type_t<DenoiseMode>>(mode_);
|
|
image_metadata->Set("denoise.status", status);
|
|
LOG(RPiSdn, Debug)
|
|
<< "programmed constant " << status.noise_constant
|
|
<< " slope " << status.noise_slope
|
|
<< " strength " << status.strength;
|
|
}
|
|
|
|
void Sdn::SetMode(DenoiseMode mode)
|
|
{
|
|
// We only distinguish between off and all other modes.
|
|
mode_ = mode;
|
|
}
|
|
|
|
// Register algorithm with the system.
|
|
static Algorithm *Create(Controller *controller)
|
|
{
|
|
return (Algorithm *)new Sdn(controller);
|
|
}
|
|
static RegisterAlgorithm reg(NAME, &Create);
|