[PATCH v6 00/18] Software ISP refactoring

Kieran Bingham kieran.bingham at ideasonboard.com
Tue Sep 10 00:15:34 CEST 2024


Quoting Milan Zamazal (2024-09-06 13:09:09)
> The purpose of this patch series is to bring software ISP code
> structuring closer to the hardware pipelines.  Most notably, the API
> around algorithm.h is used now.  This should make software ISP easier to
> understand, extend, maintain, and code-share with the other pipelines.
> 
> What is omitted in the patch series:
> 
> - Any bigger or unrelated functional changes.  The purpose of this
>   series is code restructuring, which is enough already.

Agreed, and I think trying to land this as soon as possible is helpful

> - Stats and params buffers are still used in the original way.  Making
>   their handling closer to the hardware pipelines will be a subject of
>   followup patches.  This series is a preparation step for that.

Indeed, though I do wonder if this will use 'parameter buffers' in the
same way. But I guess a defined structure interface will be much the
same as a parameter buffer so probably good to keep the naming
consistent.

> - Any IPA code sharing with hardware pipelines.  If there is an
>   opportunity for this, it can be addressed in followup patches.

Agreed

> 
> Available in git at
> https://gitlab.freedesktop.org/camera/libcamera-softisp/-/commits/pdm-algorithm
> 
> Pending, more input from reviewers needed (see v3 review discussions):
> - Should `frame' argument name be kept for consistency with other
>   pipelines for now or already renamed to something like
>   `sequenceNumber'?

I'm fine keeping it as 'frame' for now - but I'm constantly worried
about the different 'clock domains' of sequences between the sensor and
the requests.

We'll be tackling this as part of per-frame control 'soon' so I think
keeping it now is easiest.

> - Should black level be stored as a 0..1 number or a pixel value
>   number?

We store Black levels as pixel numbers, I think that's what you're doing
already so I'd keep it that way.

Toying around to test this branch earlier - we took a couple of
screenshots/captures running through camshark which now detects macbeth
charts and details the delta-e for each colour as a live overlay
(awesome work from Stefan!)

https://cloud.ideasonboard.com/apps/photos/public/ewHIg37E78qmqGPOwh6uCHAuM1svX3Jx

The reds seem to be a bit lost - I think that's where we'll see benefits
from starting to add some CCM support.  But that will be into sensor
specific tunings.



> Changes in v6:
> 
> - Use data->swIsp_ only if it is defined.
> - IPASoftSimple::prepare renamed to IPASoftSimple::fillParamsBuffer.
> - soft_ipa_interface.h include moved to the right patch.
> - Unneeded includes in algorithm *.h files dropped.
> - Duplicate kGammaLookupSize constant removed and gammaTable.size() used
>   instead.
> - Gamma algorithm merged to Lut algorithm.
> - Duplicate logging of AWB gains removed.
> - Miscellaneous formatting and cosmetic changes suggested by Laurent.
> 
> Changes in v5:
> - Construction of color lookup tables moved to a separate algorithm.
> 
> Changes in v4:
> - Removed the mistakenly included patches by Umang.
> - IPASoftInterface::prepare() is async now.
> - IPAConfigInfo definition moved to an earlier patch to avoid
>   unnecessary confusion.
> - colors.cpp/h split to gamma and awb.
> - Using the right black level variable in Agc::process.
> - Documentation of the newly introduced SwStatsCpu::finishFrame
>   arguments added.
> - Formatting changes as requested.
> - A forgotten obsolete source code comment removed.
> - Improvements to some commit messages.
> 
> Changes in v3:
> - SoftwareIsp::queueRequest changed to async.
> - IPAActiveState docstring reworded.
> - Minor formatting fixes.
> 
> Changes in v2:
> - Several cosmetic changes and patch arrangement problems pointed out by
>   Umang applied.
> - Added ipa_context.cpp, as a documentation file for ipa_context.h.
> - Added a clarification source comment why SoftwareIsp::queueBuffers needs
>   to get the frame number as a separate argument.
> - core_ipa_interface.h no longer included in module.h.
> - The context used by "14/19 Move black level to an algorithm module"
>   was changed and the black level changes tracking was put closer to the
>   pre-refactoring version, which makes more sense.
> 
> Milan Zamazal (18):
>   libcamera: software_isp: Remove superfluous includes
>   libcamera: software_isp: Move BlackLevel to libcamera::ipa::soft
>   libcamera: software_isp: Define skeletons for IPA refactoring
>   libcamera: software_isp: Let IPASoftSimple inherit Module
>   libcamera: software_isp: Make stats frame and buffer aware
>   libcamera: software_isp: Remove final dots in debayer.cpp docstrings
>   libcamera: software_isp: Track and pass frame ids
>   libcamera: software_isp: Create algorithms
>   libcamera: software_isp: Call Algorithm::configure
>   libcamera: software_isp: Call Algorithm::queueRequest
>   libcamera: software_isp: Call Algorithm::prepare
>   libcamera: software_isp: Call Algorithm::process
>   libcamera: software_isp: Move black level to an algorithm module
>   libcamera: software_isp: Move color handling to an algorithm module
>   libcamera: software_isp: Use floating point for color parameters
>   libcamera: software_isp: Use DelayedControls
>   libcamera: software_isp: Move exposure+gain to an algorithm module
>   libcamera: software_isp: Update black level only on exposure changes
> 
>  .../internal/software_isp/software_isp.h      |  15 +-
>  include/libcamera/ipa/soft.mojom              |  12 +-
>  src/ipa/simple/algorithms/agc.cpp             | 139 +++++++++
>  src/ipa/simple/algorithms/agc.h               |  33 ++
>  src/ipa/simple/algorithms/algorithm.h         |  22 ++
>  src/ipa/simple/algorithms/awb.cpp             |  69 +++++
>  src/ipa/simple/algorithms/awb.h               |  32 ++
>  src/ipa/simple/algorithms/blc.cpp             |  78 +++++
>  src/ipa/simple/algorithms/blc.h               |  36 +++
>  src/ipa/simple/algorithms/lut.cpp             |  81 +++++
>  src/ipa/simple/algorithms/lut.h               |  35 +++
>  src/ipa/simple/algorithms/meson.build         |   8 +
>  src/ipa/simple/black_level.cpp                |  88 ------
>  src/ipa/simple/black_level.h                  |  29 --
>  src/ipa/simple/data/uncalibrated.yaml         |   5 +
>  src/ipa/simple/ipa_context.cpp                | 102 +++++++
>  src/ipa/simple/ipa_context.h                  |  69 +++++
>  src/ipa/simple/meson.build                    |   9 +-
>  src/ipa/simple/module.h                       |  30 ++
>  src/ipa/simple/soft_simple.cpp                | 283 ++++++------------
>  src/libcamera/pipeline/simple/simple.cpp      |  48 ++-
>  src/libcamera/software_isp/TODO               |  39 ---
>  src/libcamera/software_isp/debayer.cpp        |  51 ++--
>  src/libcamera/software_isp/debayer.h          |   2 +-
>  src/libcamera/software_isp/debayer_cpu.cpp    |   9 +-
>  src/libcamera/software_isp/debayer_cpu.h      |   2 +-
>  src/libcamera/software_isp/software_isp.cpp   |  43 ++-
>  src/libcamera/software_isp/swstats_cpu.cpp    |   6 +-
>  src/libcamera/software_isp/swstats_cpu.h      |   4 +-
>  29 files changed, 955 insertions(+), 424 deletions(-)
>  create mode 100644 src/ipa/simple/algorithms/agc.cpp
>  create mode 100644 src/ipa/simple/algorithms/agc.h
>  create mode 100644 src/ipa/simple/algorithms/algorithm.h
>  create mode 100644 src/ipa/simple/algorithms/awb.cpp
>  create mode 100644 src/ipa/simple/algorithms/awb.h
>  create mode 100644 src/ipa/simple/algorithms/blc.cpp
>  create mode 100644 src/ipa/simple/algorithms/blc.h
>  create mode 100644 src/ipa/simple/algorithms/lut.cpp
>  create mode 100644 src/ipa/simple/algorithms/lut.h
>  create mode 100644 src/ipa/simple/algorithms/meson.build
>  delete mode 100644 src/ipa/simple/black_level.cpp
>  delete mode 100644 src/ipa/simple/black_level.h
>  create mode 100644 src/ipa/simple/ipa_context.cpp
>  create mode 100644 src/ipa/simple/ipa_context.h
>  create mode 100644 src/ipa/simple/module.h
> 
> -- 
> 2.44.1
>


More information about the libcamera-devel mailing list