[PATCH v2] libcamera: software_isp: Reset stored exposure in black level
Milan Zamazal
mzamazal at redhat.com
Fri Mar 28 09:11:54 CET 2025
Kieran Bingham <kieran.bingham at ideasonboard.com> writes:
> Quoting Robert Mader (2025-03-26 15:11:53)
>> Yep, works fine here -> T-b
Thank you, Robert, for testing.
> Patch work only picks up on full tags.
>
> Tested-by: Robert Mader <robert.mader at collabora.com>
I believe the patch is all right now and could get in for 0.5?
> Thanks
>
>>
>> On 24.03.25 15:22, Robert Mader wrote:
>> > Sure, unfortunately not before Wednesday. Made me a reminder.
>> >
>> > On 24.03.25 15:20, Milan Zamazal wrote:
>> >> Hi Robert,
>> >>
>> >> would you have a chance to test that this changed version also works?
>> >> (I expect it does, just testing before merging.)
>> >>
>> >> Milan Zamazal <mzamazal at redhat.com> writes:
>> >>
>> >>> Automatic black level setting in software ISP updates the determined
>> >>> black level value when exposure or gain change. It stores the last
>> >>> exposure and gain values to detect the change.
>> >>>
>> >>> BlackLevel::configure() resets the stored black level value but not the
>> >>> exposure and gain values. This can prevent updating the black value
>> >>> and
>> >>> cause bad image output, e.g. after suspending and resuming a camera, if
>> >>> exposure and gain remain unchanged.
>> >>>
>> >>> Let's store exposure and gain in IPAActiveState. Although the values
>> >>> are not supposed to be used outside BlackLevel class, storing them in
>> >>> the context has the advantage of their automatic reset together with
>> >>> the
>> >>> other context contents and having them in `blc' struct indicates their
>> >>> relationship to the black value computation.
>> >>>
>> >>> Bug: https://bugs.libcamera.org/show_bug.cgi?id=259
>> >>> Signed-off-by: Milan Zamazal <mzamazal at redhat.com>
>> >>> ---
>> >>> src/ipa/simple/algorithms/blc.cpp | 10 +++++-----
>> >>> src/ipa/simple/algorithms/blc.h | 2 --
>> >>> src/ipa/simple/ipa_context.h | 2 ++
>> >>> 3 files changed, 7 insertions(+), 7 deletions(-)
>> >>>
>> >>> diff --git a/src/ipa/simple/algorithms/blc.cpp
>> >>> b/src/ipa/simple/algorithms/blc.cpp
>> >>> index 1d7d370b..089e492a 100644
>> >>> --- a/src/ipa/simple/algorithms/blc.cpp
>> >>> +++ b/src/ipa/simple/algorithms/blc.cpp
>> >>> @@ -1,6 +1,6 @@
>> >>> /* SPDX-License-Identifier: LGPL-2.1-or-later */
>> >>> /*
>> >>> - * Copyright (C) 2024, Red Hat Inc.
>> >>> + * Copyright (C) 2024-2025, Red Hat Inc.
>> >>> *
>> >>> * Black level handling
>> >>> */
>> >>> @@ -54,8 +54,8 @@ void BlackLevel::process(IPAContext &context,
>> >>> if (context.configuration.black.level.has_value())
>> >>> return;
>> >>> - if (frameContext.sensor.exposure == exposure_ &&
>> >>> - frameContext.sensor.gain == gain_) {
>> >>> + if (frameContext.sensor.exposure ==
>> >>> context.activeState.blc.lastExposure &&
>> >>> + frameContext.sensor.gain ==
>> >>> context.activeState.blc.lastGain) {
>> >>> return;
>> >>> }
>> >>> @@ -79,8 +79,8 @@ void BlackLevel::process(IPAContext &context,
>> >>> seen += histogram[i];
>> >>> if (seen >= pixelThreshold) {
>> >>> context.activeState.blc.level = i * histogramRatio;
>> >>> - exposure_ = frameContext.sensor.exposure;
>> >>> - gain_ = frameContext.sensor.gain;
>> >>> + context.activeState.blc.lastExposure =
>> >>> frameContext.sensor.exposure;
>> >>> + context.activeState.blc.lastGain =
>> >>> frameContext.sensor.gain;
>> >>> LOG(IPASoftBL, Debug)
>> >>> << "Auto-set black level: "
>> >>> << i << "/" << SwIspStats::kYHistogramSize
>> >>> diff --git a/src/ipa/simple/algorithms/blc.h
>> >>> b/src/ipa/simple/algorithms/blc.h
>> >>> index 52d59cab..db9e6d63 100644
>> >>> --- a/src/ipa/simple/algorithms/blc.h
>> >>> +++ b/src/ipa/simple/algorithms/blc.h
>> >>> @@ -30,8 +30,6 @@ public:
>> >>> ControlList &metadata) override;
>> >>> private:
>> >>> - int32_t exposure_;
>> >>> - double gain_;
>> >>> std::optional<uint8_t> definedLevel_;
>> >>> };
>> >>> diff --git a/src/ipa/simple/ipa_context.h
>> >>> b/src/ipa/simple/ipa_context.h
>> >>> index 4af51306..b1198af5 100644
>> >>> --- a/src/ipa/simple/ipa_context.h
>> >>> +++ b/src/ipa/simple/ipa_context.h
>> >>> @@ -33,6 +33,8 @@ struct IPASessionConfiguration {
>> >>> struct IPAActiveState {
>> >>> struct {
>> >>> uint8_t level;
>> >>> + int32_t lastExposure;
>> >>> + double lastGain;
>> >>> } blc;
>> >>> struct {
>>
>> --
>> Robert Mader
>> Consultant Software Developer
>>
>> Collabora Ltd.
>> Platinum Building, St John's Innovation Park, Cambridge CB4 0DS, UK
>> Registered in England & Wales, no. 5513718
>>
More information about the libcamera-devel
mailing list