Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions include/libcamera/internal/software_isp/debayer_params.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ namespace libcamera {

struct DebayerParams {
Matrix<float, 3, 3> combinedMatrix = { { 1.0, 0.0, 0.0,
0.0, 1.0, 0.0,
0.0, 0.0, 1.0 } };
0.0, 1.0, 0.0,
0.0, 0.0, 1.0 } };
RGB<float> blackLevel = RGB<float>({ 0.0, 0.0, 0.0 });
float gamma = 1.0;
float contrastExp = 1.0;
Expand Down
1 change: 1 addition & 0 deletions include/libcamera/internal/software_isp/swstats_cpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ class SwStatsCpu

unsigned int xShift_;
unsigned int stride_;
unsigned int sumShift_;

std::vector<SwIspStats> stats_;
SharedMemObject<SwIspStats> sharedStats_;
Expand Down
14 changes: 14 additions & 0 deletions src/ipa/libipa/camera_sensor_helper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -653,6 +653,18 @@ class CameraSensorHelperImx708 : public CameraSensorHelper
};
REGISTER_CAMERA_SENSOR_HELPER("imx708", CameraSensorHelperImx708)

class CameraSensorHelperOv01a10 : public CameraSensorHelper
{
public:
CameraSensorHelperOv01a10()
{
/* From dark frame measurement: 0x40 at 10bits. */
blackLevel_ = 4096;
gain_ = AnalogueGainLinear{ 1, 0, 0, 256 };
}
};
REGISTER_CAMERA_SENSOR_HELPER("ov01a10", CameraSensorHelperOv01a10)

class CameraSensorHelperOv2685 : public CameraSensorHelper
{
public:
Expand All @@ -672,6 +684,8 @@ class CameraSensorHelperOv2740 : public CameraSensorHelper
public:
CameraSensorHelperOv2740()
{
/* From Linux kernel driver: 0x40 at 10bits. */
blackLevel_ = 4096;
gain_ = AnalogueGainLinear{ 1, 0, 0, 128 };
}
};
Expand Down
48 changes: 23 additions & 25 deletions src/ipa/simple/algorithms/adjust.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,34 +14,37 @@
#include <libcamera/control_ids.h>

#include "libcamera/internal/matrix.h"
#include "libcamera/internal/yaml_parser.h"

namespace libcamera {

namespace ipa::soft::algorithms {

constexpr float kDefaultContrast = 1.0f;
constexpr float kDefaultSaturation = 1.0f;

LOG_DEFINE_CATEGORY(IPASoftAdjust)

int Adjust::init(IPAContext &context, [[maybe_unused]] const ValueNode &tuningData)
int Adjust::init(IPAContext &context, const ValueNode &tuningData)
{
defaultGamma_ = tuningData["gamma"].get<float>().value_or(kDefaultGamma);
defaultContrast_ = tuningData["contrast"].get<float>().value_or(1.0f);
defaultSaturation_ = tuningData["saturation"].get<float>().value_or(1.0f);

context.ctrlMap[&controls::Gamma] =
ControlInfo(0.1f, 10.0f, kDefaultGamma);
ControlInfo(0.1f, 10.0f, defaultGamma_);
context.ctrlMap[&controls::Contrast] =
ControlInfo(0.0f, 2.0f, kDefaultContrast);
ControlInfo(0.0f, 2.0f, defaultContrast_);
if (context.ccmEnabled)
context.ctrlMap[&controls::Saturation] =
ControlInfo(0.0f, 2.0f, kDefaultSaturation);
ControlInfo(0.0f, 2.0f, defaultSaturation_);

return 0;
}

int Adjust::configure(IPAContext &context,
[[maybe_unused]] const IPAConfigInfo &configInfo)
{
context.activeState.knobs.gamma = kDefaultGamma;
context.activeState.knobs.contrast = std::optional<float>();
context.activeState.knobs.saturation = std::optional<float>();
context.activeState.knobs.gamma = defaultGamma_;
context.activeState.knobs.contrast = defaultContrast_;
context.activeState.knobs.saturation = defaultSaturation_;

return 0;
}
Expand All @@ -59,13 +62,13 @@ void Adjust::queueRequest(typename Module::Context &context,

const auto &contrast = controls.get(controls::Contrast);
if (contrast.has_value()) {
context.activeState.knobs.contrast = contrast;
context.activeState.knobs.contrast = contrast.value();
LOG(IPASoftAdjust, Debug) << "Setting contrast to " << contrast.value();
}

const auto &saturation = controls.get(controls::Saturation);
if (saturation.has_value()) {
context.activeState.knobs.saturation = saturation;
context.activeState.knobs.saturation = saturation.value();
LOG(IPASoftAdjust, Debug) << "Setting saturation to " << saturation.value();
}
}
Expand Down Expand Up @@ -100,15 +103,15 @@ void Adjust::prepare(IPAContext &context,
frameContext.gamma = context.activeState.knobs.gamma;
frameContext.contrast = context.activeState.knobs.contrast;

auto &saturation = context.activeState.knobs.saturation;
if (context.ccmEnabled && saturation) {
applySaturation(context.activeState.combinedMatrix, saturation.value());
const float saturation = context.activeState.knobs.saturation;
if (context.ccmEnabled) {
applySaturation(context.activeState.combinedMatrix, saturation);
frameContext.saturation = saturation;
}

params->gamma = 1.0 / context.activeState.knobs.gamma;
const float contrast = context.activeState.knobs.contrast.value_or(kDefaultContrast);
params->contrastExp = tan(std::clamp(contrast * M_PI_4, 0.0, M_PI_2 - 0.00001));
params->contrastExp = tan(std::clamp(context.activeState.knobs.contrast * M_PI_4,
0.0, M_PI_2 - 0.00001));
}

void Adjust::process([[maybe_unused]] IPAContext &context,
Expand All @@ -117,14 +120,9 @@ void Adjust::process([[maybe_unused]] IPAContext &context,
[[maybe_unused]] const SwIspStats *stats,
ControlList &metadata)
{
const auto &gamma = frameContext.gamma;
metadata.set(controls::Gamma, gamma);

const auto &contrast = frameContext.contrast;
metadata.set(controls::Contrast, contrast.value_or(kDefaultContrast));

const auto &saturation = frameContext.saturation;
metadata.set(controls::Saturation, saturation.value_or(kDefaultSaturation));
metadata.set(controls::Gamma, frameContext.gamma);
metadata.set(controls::Contrast, frameContext.contrast);
metadata.set(controls::Saturation, frameContext.saturation);
}

REGISTER_IPA_ALGORITHM(Adjust, "Adjust")
Expand Down
4 changes: 4 additions & 0 deletions src/ipa/simple/algorithms/adjust.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@ class Adjust : public Algorithm

private:
void applySaturation(Matrix<float, 3, 3> &ccm, float saturation);

float defaultGamma_;
float defaultContrast_;
float defaultSaturation_;
};

} /* namespace ipa::soft::algorithms */
Expand Down
Loading