| Message ID | 20260506230722.1041596-4-devve.3@gmail.com |
|---|---|
| State | New |
| Headers | show |
| Series |
|
| Related | show |
d3vv3 <devve.3@gmail.com> writes: > Read default values for gamma, contrast, and saturation from the tuning > file so sensors can specify different image processing defaults without > code changes. Falls back to prior defaults (gamma 2.2, contrast 1.0, > saturation 1.0) when not specified in YAML. > > Signed-off-by: d3vv3 <devve.3@gmail.com> Reviewed-by: Milan Zamazal <mzamazal@redhat.com> > --- > src/ipa/simple/algorithms/adjust.cpp | 48 +++++++++++++--------------- > src/ipa/simple/algorithms/adjust.h | 4 +++ > src/ipa/simple/ipa_context.h | 8 ++--- > 3 files changed, 31 insertions(+), 29 deletions(-) > > diff --git a/src/ipa/simple/algorithms/adjust.cpp b/src/ipa/simple/algorithms/adjust.cpp > index 8bf39c4c..a03a6f1f 100644 > --- a/src/ipa/simple/algorithms/adjust.cpp > +++ b/src/ipa/simple/algorithms/adjust.cpp > @@ -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; > } > @@ -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(); > } > } > @@ -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, > @@ -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") > diff --git a/src/ipa/simple/algorithms/adjust.h b/src/ipa/simple/algorithms/adjust.h > index 49c1f26c..a836b51b 100644 > --- a/src/ipa/simple/algorithms/adjust.h > +++ b/src/ipa/simple/algorithms/adjust.h > @@ -43,6 +43,10 @@ public: > > private: > void applySaturation(Matrix<float, 3, 3> &ccm, float saturation); > + > + float defaultGamma_; > + float defaultContrast_; > + float defaultSaturation_; > }; > > } /* namespace ipa::soft::algorithms */ > diff --git a/src/ipa/simple/ipa_context.h b/src/ipa/simple/ipa_context.h > index 34f7403a..cd9a8eda 100644 > --- a/src/ipa/simple/ipa_context.h > +++ b/src/ipa/simple/ipa_context.h > @@ -58,8 +58,8 @@ struct IPAActiveState { > struct { > float gamma; > /* 0..2 range, 1.0 = normal */ > - std::optional<float> contrast; > - std::optional<float> saturation; > + float contrast; > + float saturation; > } knobs; > }; > > @@ -77,8 +77,8 @@ struct IPAFrameContext : public FrameContext { > } gains; > > float gamma; > - std::optional<float> contrast; > - std::optional<float> saturation; > + float contrast; > + float saturation; > }; > > struct IPAContext {
diff --git a/src/ipa/simple/algorithms/adjust.cpp b/src/ipa/simple/algorithms/adjust.cpp index 8bf39c4c..a03a6f1f 100644 --- a/src/ipa/simple/algorithms/adjust.cpp +++ b/src/ipa/simple/algorithms/adjust.cpp @@ -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; } @@ -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(); } } @@ -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, @@ -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") diff --git a/src/ipa/simple/algorithms/adjust.h b/src/ipa/simple/algorithms/adjust.h index 49c1f26c..a836b51b 100644 --- a/src/ipa/simple/algorithms/adjust.h +++ b/src/ipa/simple/algorithms/adjust.h @@ -43,6 +43,10 @@ public: private: void applySaturation(Matrix<float, 3, 3> &ccm, float saturation); + + float defaultGamma_; + float defaultContrast_; + float defaultSaturation_; }; } /* namespace ipa::soft::algorithms */ diff --git a/src/ipa/simple/ipa_context.h b/src/ipa/simple/ipa_context.h index 34f7403a..cd9a8eda 100644 --- a/src/ipa/simple/ipa_context.h +++ b/src/ipa/simple/ipa_context.h @@ -58,8 +58,8 @@ struct IPAActiveState { struct { float gamma; /* 0..2 range, 1.0 = normal */ - std::optional<float> contrast; - std::optional<float> saturation; + float contrast; + float saturation; } knobs; }; @@ -77,8 +77,8 @@ struct IPAFrameContext : public FrameContext { } gains; float gamma; - std::optional<float> contrast; - std::optional<float> saturation; + float contrast; + float saturation; }; struct IPAContext {
Read default values for gamma, contrast, and saturation from the tuning file so sensors can specify different image processing defaults without code changes. Falls back to prior defaults (gamma 2.2, contrast 1.0, saturation 1.0) when not specified in YAML. Signed-off-by: d3vv3 <devve.3@gmail.com> --- src/ipa/simple/algorithms/adjust.cpp | 48 +++++++++++++--------------- src/ipa/simple/algorithms/adjust.h | 4 +++ src/ipa/simple/ipa_context.h | 8 ++--- 3 files changed, 31 insertions(+), 29 deletions(-)