Presently the colour processing component exposes controls for
brightness, saturation, and contrast to the applications which are
handled and processed accordingly on the ISP.
The implementation lacks reporting the values that are set back to the
application.
Utilise the new Quantised types to provide the values that were applied
to the hardware and report them in the completed request metadata.
Reviewed-by: Isaac Scott <isaac.scott@ideasonboard.com>
Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Extend the new Quantized type infrastructure by providing a
FixedPointQTraits template.
This allows construction of fixed point types with a Quantized storage
that allows easy reading of both the underlying quantized type value and
a floating point representation of that same value.
Reviewed-by: Isaac Scott <isaac.scott@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Stefan Klug <stefan.klug@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
The fixedToFloatingPoint does not support unsigned Q types, and
incorrectly sign-extends all values which have the top most bit set in
the quantized values.
Fix this by ensuring that only signed types perform sign extension, and
simplify the calculation for unsigned types.
Convert the storage of the test cases to signed types to correctly
represent their intended purpose, to prevent test failures.
Reviewed-by: Isaac Scott <isaac.scott@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Frequently when handling data in IPA components we must convert and
store user interface values which may be floating point values, and
perform a specific operation or conversion to quantize this to a
hardware value.
This value may be to a fixed point type, or more custom code mappings,
but in either case it is important to contain both the required hardware
value, with its effective quantized value.
Provide a new storage type 'Quantized' which can be defined based on a
set of type specific Traits to perform the conversions between floats
and the underlying hardware type.
Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
Reviewed-by: Isaac Scott <isaac.scott@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
With the GPU accelerated softISP 2 separate benchmark results are printed,
1 for the generation of the output images on the GPU and a separate one
for generating the statistics on the CPU.
Add a new name argument to the Benchmark class descriptor and print this
out when printing the benchmark result.
Signed-off-by: Hans de Goede <johannes.goede@oss.qualcomm.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Milan Zamazal <mzamazal@redhat.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
The lens dewarp implementation done in commit 1784e08be3 ("libcamera:
dw100_vertexmap: Implement parametric dewarping") handles the dewarp
parameter p2 incorrectly because it uses the already dewarped x value as
input for the calculation of the y value. Fix that by using separate
variables for the output value. Do so for x and y to keep the code
symmetric even if it is only strictly required for y.
Fixes: 1784e08be3 ("libcamera: dw100_vertexmap: Implement parametric dewarping")
Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
`O_TMPFILE` requires file system support, which may not be available in
certain environments, usually containerized ones. So do not use it.
A new function is added for tests to be able to create unnamed temporary
files using `libcamera::MemFd` as the implementation.
Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
When calling `Debayer::process()` from `SoftwareIsp::process()`, the
`DebayerParams` object is copied multiple times:
(1) call of `BoundMethodMember<...>::activate()`
inside `Object::invokeMethod()`
(2) constructor of `BoundMethodArgs<...>`
inside `BoundMethodMember<...>::activate()`
(3) call of `BoundMethodMember<...>::invoke()`
inside `BoundMethodArgs::invokePack()`
(4) call of the actual pointer to member function
inside `BoundMethodMember::invoke()`
While compilers might avoid one or two of the above copies, this is still
not ideal. By making `Debayer::process()` take the parameter object by
const lvalue reference, only the copy in the `BoundMethodArgs` constructor
remains. So do that.
Before:
[0:12:51.133836595] [12424] DEBUG SoftwareIsp software_isp.cpp:399 params=0x7d0a691f57d0
copy from 0x7d0a691f57d0 into 0x7baa65f2bf30
copy from 0x7baa65f2bf30 into 0x7c6a69209758
copy from 0x7c6a69209758 into 0x7baa63223930
copy from 0x7baa63223930 into 0x7baa63223a70
[0:12:51.134559602] [12426] DEBUG eGL debayer_egl.cpp:538 params=0x7baa63223a70
771.099877 (30.06 fps) cam0-stream0 seq: 000031 bytesused: 8666112
After:
[0:13:42.861691943] [12543] DEBUG SoftwareIsp software_isp.cpp:399 params=0x7cfaad5f57d0
copy from 0x7cfaad5f57d0 into 0x7c5aad609758
[0:13:42.862453917] [12545] DEBUG eGL debayer_egl.cpp:538 params=0x7c5aad609758
822.827388 (30.02 fps) cam0-stream0 seq: 000031 bytesused: 8666112
Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
Reviewed-by: Milan Zamazal <mzamazal@redhat.com>
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
The matrix multiplication in Awb is swapped: the gains should be applied
after combinedMatrix, i.e. on the left side. The mistake happened when
`ccm' was replaced with combinedMatrix and gainMatrix multiplication was
moved to Awb. While CCM must be applied after gains, the gains must be
applied after the combined matrix, which no longer corresponds to CCM in
Awb.
Since there is currently no algorithm modifying combinedMatrix before
Awb, combinedMatrix is an identity matrix there and the wrong order
doesn't influence the output at the moment.
Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This release brings 158 commits with substantial development on the SoftISP
components. This brings in GPU acceleration, allowing us to get higher
throughput for cameras using this pipeline. Further development to improve the
image quality is ongoing now that we can perform more processing in realtime.
The simple pipeline handler now supports exposing the Raw streams directly
allowing us to enable the SoftISP by default without removing access to the
camera formats.
Kernel headers have been updated to v6.18, supporting the new V4L2 ISP kernel
interface which allows us to continue improvements to hardware ISP pipelines as
we add new features.
Logging has been improved to better detect when to enable or disable color
output and can be controlled through the environment variable
LIBCAMERA_LOG_COLOR.
A new control is added for LensShadingCorrectionEnable to allow runtime control
over the LSC components where supported.
The gstreamer pipeline now has raw support added to the libcamerasrc
stream-role property allowing raw streams to be configured and accessed.
An exciting new AWB algorithm using Neural Networks, has been added to the
Raspberry Pi IPA following extensive development and training performed by the
Raspberry Pi Camera Team.
And finally, the Documentation now includes a support matrix which will help
identify the current support and enablement for platforms and sensors.
Contributors:
36 Bryan O'Donoghue <bryan.odonoghue@linaro.org>
26 Milan Zamazal <mzamazal@redhat.com>
23 Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
20 Jacopo Mondi <jacopo.mondi@ideasonboard.com>
15 Stefan Klug <stefan.klug@ideasonboard.com>
8 Robert Mader <robert.mader@collabora.com>
5 Hans de Goede <hdegoede@redhat.com>
4 Daniel Scally <dan.scally@ideasonboard.com>
4 Peter Bailey <peter.bailey@raspberrypi.com>
3 Naushir Patuck <naush@raspberrypi.com>
2 Andrei Gansari <andrei.gansari@nxp.com>
2 Hans de Goede <johannes.goede@oss.qualcomm.com>
2 Jai Luthra <jai.luthra@ideasonboard.com>
2 Kieran Bingham <kieran.bingham@ideasonboard.com>
1 Julien Vuillaumier <julien.vuillaumier@nxp.com>
1 Khem Raj <raj.khem@gmail.com>
1 Laurent Pinchart <laurent.pinchart@ideasonboard.com>
1 Michael Olbrich <m.olbrich@pengutronix.de>
1 Paul Elder <paul.elder@ideasonboard.com>
1 Vasiliy Doylov <nekocwd@mainlining.org>
158 commits, 170 files changed, 7410 insertions(+), 2325 deletions(-)
Integration overview:
ABI:
The abi-compliance checker reports 100% compatibility in this release. But it's
a complete lie... so we're moving to v0.7.0 and increasing the SONAME for this
release.
$ ./utils/abi-compat.sh
Validating ABI compatibility between v0.6.0 and v0.7.0
Preparing, please wait ...
Comparing ABIs ...
Comparing APIs ...
Creating compatibility report ...
Binary compatibility: 100%
Source compatibility: 100%
Total binary compatibility problems: 0, warnings: 3
Total source compatibility problems: 0, warnings: 0
Report: compat_reports/libcamera/v0.6.0_to_v0.7.0/compat_report.html
The warnings reported are diagnosed as low severity but relate to a change of
the structure size of the public API Request object, which will require a
recompile of any users.
bugs:
- libcamera: simple: Move colour space logging after adjustment
- Fixes: 5a33bc10e9 ("libcamera: software_isp: Assign colour spaces in configurations")
- utils: gen-shader-headers: Fix subproject build
- Fixes: 19371dee41 ("utils: gen-shader-headers: Add a utility to generate headers from shaders")
- ipa: simple: awb: Fix ColourGains reported
- Fixes: a0b97475b1 ("ipa: simple: Report the ColourGains in metadata")
- apps: cam: Do not override Request::controls()
- Fixes: 568865a6c1 ("cam: Use script parser to set controls")
- gstreamer: Be prepared when queueing request
- Fixes: 06bd05bece ("gstreamer: Use dedicated lock for request queues")
- v4l2: v4l2_camera_proxy: Fix for getting default FrameDurationLimits
- Fixes: 4e9be7d11b ("ipa: ipu3, mali-c55, rkisp1, rpi: Fix reporting non-scalar controls")
- ipa: mali-c55: Retain Camera::controls() after ipa->configure()
- Fixes: fe989ee514 ("ipa: mali-c55: Add Mali-C55 ISP IPA module")
- ipa: ipu3: Retain Camera::controls() after ipa->configure()
- Fixes: 87353f2bba ("ipa: ipu3: Derive ipu3::algorithms::Agc from AgcMeanLuminance")
- libcamera: v4l2_subdevice: Remove unnecessary variable
- Fixes: 5d2aad02e8 ("libcamera: add model() for retrieving model name in V4L2Subdevice")
- libcamera: simple: Fix black level offsets in AWB
- Fixes: 4e13c6f55b ("Honor black level in AWB")
- apps: qcam: Disable -Wsfinae-incomplete
- Link: https://qt-project.atlassian.net/browse/QTBUG-143470
- libcamera: base: utils: Fix namespace of `operator<<` for `Duration`
- Fixes: 5055ca747c ("libcamera: utils: Add helper class for std::chrono::duration")
core:
- libcamera: media_pipeline: Add accessor for MediaPipeline list of entities
- libcamera: controls: Small style fixes
- libcamera: base: Wrap <regex.h>
- libcamera: device_enumerator: Support regex to match entity names
- libcamera: media_device: Get entity by regexp
- libcamera: V4L2Subdevice: Get device by regexp
- utils: gen-shader-headers: Add a utility to generate headers from shaders
- meson: Automatically generate glsl_shaders.h from specified shader programs
- include: linux: drm_fourcc.h: Update to v6.18
- include: linux: intel-ipu3.h: Update to v6.18
- include: linux: media-bus-format.h: Update to v6.18
- include: linux: v4l2-controls.h: Update to v6.18
- include: linux: videodev2.h: Update to v6.18
- include: linux: README: Update to Linux v6.18
- utils: gen-shader-headers: Fix subproject build
- libcamera: device_enumerator_udev: Disable copy/move
- libcamera: device_enumerator_udev: Handle duplicate devices
- include: linux: Add stddef.h
- include: linux: Add v4l2-isp.h
- libcamera: request: Create control list with Camera info map
- libcamera: request: Move metadata_ to Private
- libcamera: request: Make metadata_ a class instance
- libcamera: request: Make controls_ a class instance
- libcamera: camera: Ensure a request's controls are valid
- libcamera: camera_manager: CameraManager::version(): Add `threadsafe` ref
- libcamera: controls: Simplify SFINAE template parameter
- libcamera: base: log: Add `LIBCAMERA_LOG_COLOR` env var
- libcamera: control_serializer: Remove unnecessary allocation
- libcamera: base: event_dispatcher_poll: Dispatch `POLLPRI` first
- meson: Do not force libc++ when using clang
- treewide: Remove `libcamera::LOG(...)` occurrences
- libcamera: base: log: Do not instantiate disabled `LogMessage`s
- libcamera: base: log: Do not check severity before printing
- libcamera: base: log: Remove `LogInvalid` check
- libcamera: base: log: Inline `LOG()` into `ASSERT()`
- libcamera: base: utils: join(): Don't use `const_iterator` directly
- libcamera: v4l2_subdevice: Remove unnecessary variable
- libcamera: v4l2_subdevice: Avoid reconstructing the `std::regex` object
- libcamera: v4l2_subdevice: Avoid unnecessary copy
- libcamera: control_ids: Introduce LensShadingCorrectionEnable
- libcamera: yaml_parser: Fix uninitialized variable warning
- libcamera: base: utils: Simplify `operator<<` for `Duration`
- libcamera: base: utils: Fix namespace of `operator<<` for `Duration`
pipeline:
- pipeline: imx8-isi: Integrating MediaPipeline class
- libcamera: simple: Move colour space logging after adjustment
- libcamera: simple: Exclude raw configurations from output conversions
- libcamera: simple: Handle processed and raw formats separately
- libcamera: simple: Validate raw stream configurations
- libcamera: simple: Don't enforce conversion with an added raw stream
- libcamera: simple: Set the number of software ISP streams to 2
- libcamera: simple: Require metadata only when software ISP is used
- libcamera: simple: Make raw streams working
- pipeline: rpi: Rename Stream::prepareBuffers to Stream::allocateBuffers
- pipeline: rpi: Rework internal buffer allocations
- libcamera: simple: Enable SoftISP for imx7-csi
- libcamera: pipeline: virtual: Don't use span iterator as pointer
- libcamera: simple: Fix black level offsets in AWB
softisp:
- libcamera: shaders: Move GL shader programs to src/libcamera/assets/shader
- libcamera: swstats_cpu: Update statsProcessFn() / processLine0() documentation
- libcamera: swstats_cpu: Drop patternSize_ documentation
- libcamera: swstats_cpu: Move header to libcamera/internal/software_isp
- libcamera: software_isp: Move benchmark code to its own class
- libcamera: swstats_cpu: Add processFrame() method
- libcamera: software_isp: Move useful items from DebayerCpu to Debayer base class
- libcamera: software_isp: Move Bayer params init from DebayerCpu to Debayer
- libcamera: software_isp: Move param select code to Debayer base class
- libcamera: software_isp: Move DMA Sync code to Debayer base class
- libcamera: software_isp: Make output DMA sync contingent
- libcamera: software_isp: Move isStandardBayerOrder to base class
- libcamera: software_isp: debayer: Introduce a start() / stop() methods to the debayer object
- libcamera: software_isp: debayer: Make the debayer_ object of type class Debayer not DebayerCpu
- libcamera: software_isp: lut: Make CCM available in debayer params
- libcamera: software_isp: blacklevel: Make black level available in debayer params
- libcamera: software_isp: lut: Make gamma from lut.cpp available in debayer params
- libcamera: software_isp: lut: Make contrast available in debayer params
- libcamera: software_isp: debayer: Latch contrastExp not contrast to debayer parameters
- libcamera: software_isp: gbm: Add a GBM helper class for GPU surface access
- libcamera: software_isp: egl: Add a eGL base helper class
- libcamera: shaders: Rename bayer_8 to bayer_unpacked
- libcamera: shaders: Use highp not mediump for float precision
- libcamera: shaders: Extend debayer shaders to apply CCM gains
- libcamera: shaders: Extend bayer shaders to support swapping R and B on output
- libcamera: shaders: Add support for black level compensation
- libcamera: shaders: Add support for Gamma
- libcamera: shaders: Add support for contrast
- libcamera: shaders: Fix input sampling when width != stride
- libcamera: software_isp: Add member variables to track selected input/output pixelFormat
- libcamera: software_isp: Add a Size_ member variable to pass to eGL later
- libcamera: software_isp: debayer_egl: Add an eGL Debayer class
- libcamera: software_isp: debayer_cpu: Make getInputConfig and getOutputConfig static
- libcamera: software_isp: GPU support for unpacked 10/12-bit formats
- libcamera: software_isp: debayer_egl: Make DebayerEGL an environment option
- libcamera: software_isp: lut: Skip calculation lookup tables if gpuIspEnabled is true
- libcamera: software_isp: lut: Change default Gamma to 1.0/2.2
- libcamera: software_isp: Switch on default CCM at 65k
- libcamera: software_isp: debayer_egl: Make gpuisp default softisp mode
- libcamera: software_isp: Add a gpuisp todo list
- Revert "libcamera: software_isp: gbm: Add a GBM helper class for GPU surface access"
- egl: Remove unused functions
- egl: Remove bpp variable
- egl: Remove duplicated logging of EGL version
- egl: Print GLES version
- egl: Use the Mesa surfaceless platform instead of GBM
- egl: Add workaround for Mesa <= 22.2
apps:
- gstreamer: Add raw support to libcamerasrc stream-role property
- apps: cam: Do not override Request::controls()
- apps: lc-compliance: Commit camera configuration last
- qcam: viewfinder_gl: Set no-op Bayer shader values
- gstreamer: Be prepared when queueing request
- v4l2: v4l2_camera_proxy: Fix for getting default FrameDurationLimits
- apps: qcam: Disable -Wsfinae-incomplete
ipa:
- ipa: simple: awb: Fix ColourGains reported
- ipa: rpi: remove executable bits from data files
- ipa: mali-c55: Update header file and adjust IPA
- ipa: libipa: Introduce V4L2Params
- ipa: mali-c55: Introduce MaliC55Params
- ipa: simple: fix minimal analog gain init
- ipa: simple: agc: Make sure activeState.agc expo/again are always initialized
- ipa: simple: Add a flag to indicate gpuIspEnabled
- ipa: mali-c55: Retain Camera::controls() after ipa->configure()
- ipa: ipu3: Retain Camera::controls() after ipa->configure()
- ipa: rpi: controller: awb: Separate Bayesian AWB into AwbBayes
- ipa: rpi: controller: awb: Add Neural Network AWB
- ipa: rpi: controller: Ignore algorithms that are not enabled
- ipa: rpi: pisp: vc4: Update tuning files for new AWB
- libcamera: ipa: simple: Remove an unused include from awb.cpp
- libcamera: ipa: simple: Unwrap IPAFrameContext::ccm
- libcamera: ipa: simple: Generalize tracking matrix changes
- libcamera: ipa: simple: Rename "ccm" identifiers not specific to CCM
- libcamera: ipa: simple: Introduce a general correction matrix
- libcamera: ipa: simple: Initialise the general correction matrix
- libcamera: ipa: simple: Separate saturation from CCM
- libcamera: ipa: simple: Move contrast settings to adjust.cpp
- libcamera: ipa: simple: Make gamma adjustable
- libcamera: ipa: simple: Apply gain matrix in awb
- libcamera: ipa: simple: Use float type for adjustment controls
- libcamera: ipa: simple: Use symbolic constants for adjust defaults
- libcamera: ipa: simple: Set contrast metadata unconditionally
- libcamera: ipa: simple: Remove Lut algorithm
- libcamera: ipa: simple: Disable Ccm algorithm by default again
- ipa: rkisp1: lsc: Drop unused member variable
- ipa: rkisp1: lsc: Drop unused function declaration
- ipa: rkisp1: lsc: Replace assert with ASSERT
- ipa: rkisp1: lsc: Rename res to positions
- ipa: rkisp1: lsc: Rename res to ret
- ipa: rkisp1: lsc: Rename res to samples
- ipa: rksip1: lsc: Move function definitions out of class
- ipa: rkisp1: lsc: Move local types into anonymous namespace
- ipa: rkisp1: lsc: Handle quantization locally
- ipa: libipa: interpolator: Drop key quantization
- ipa: rkisp1: lsc: Pass sampling positions into samplePolynomial
- ipa: rkisp1: lsc: Pass crop rectangle as parameter
- ipa: rkisp1: lsc: Resample polynomial lens shading tables at configure time
- ipa: rkisp1: Implement LensShadingCorrectionEnable control
- ipa: rpi: Fix printing of `utils::Duration`
documentation:
- Documentation: Add ISP feature support matrix
- Documentation: Add camera sensor support table
- Documentation: guides: pipeline-handler: Refresh
Acked-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
In order for ADL to find the function, it must be in the namespace of any of
its arguments. Previously, however, that was not the case, and it has only
really worked by accident and could be easily made to fail by introducing
other `operator<<` overloads.
For example, a user of this function in `libcamera::ipa` would no longer
compile after introducing an `operator<<` into the `libcamera::ipa`
namespace as that would essentially hide this overload, and without ADL
it would not be found.
So move the function into the `utils` namespace.
Fixes: 5055ca747c ("libcamera: utils: Add helper class for std::chrono::duration")
Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
`utils::Duration` derives from `std::chrono::duration<...>`, but multiplying
it yields an `std::chrono::duration<...>`, not `Duration`. chrono duration
types only have `operator<<` in C++20 or later, so this usage should not
compile. It only did so because the `operator<<` for `Duration` was in
the `libcamera` namespace and `Duration` has an implicit constructor from
any chrono duration type.
This will cease to work when that operator is moved into the `utils` namespace
for ADL purposes. So fix it by making the cast to `Duration` explicit.
Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Naushir Patuck <naush@raspberrypi.com>
There is no real need for a function template. It is not defined in a
header file, so it has limited availability, and there exists only a
single instantion.
So convert it to use `std::ostream` directly, like most `operator<<`
in the code base.
Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
gcc 14.3.0, cross-compiling from amd64 to arm64, warns about a possibly
uninitialized variable in YamlObject::Getter<>::get():
In file included from ../../include/libcamera/internal/yaml_parser.h:12,
from ../../src/libcamera/yaml_parser.cpp:8:
In constructor ‘constexpr std::_Optional_payload_base<_Tp>::_Storage<_Up, <anonymous> >::_Storage(std::in_place_t, _Args&& ...) [with _Args = {unsigned char}; _Up = unsigned char; bool <anonymous> = true; _Tp = unsigned char]’,
inlined from ‘constexpr std::_Optional_payload_base<_Tp>::_Optional_payload_base(std::in_place_t, _Args&& ...) [with _Args = {unsigned char}; _Tp = unsigned char]’ at include/c++/14.3.0/optional:122:4,
inlined from ‘constexpr std::_Optional_payload<unsigned char, true, true, true>::_Optional_payload(std::in_place_t, _Args&& ...) [with _Args = {unsigned char}][inherited from std::_Optional_payload_base<unsigned char>]’ at include/c++/14.3.0/optional:337:42,
inlined from ‘constexpr std::_Optional_base<_Tp, true, true>::_Optional_base(std::in_place_t, _Args&& ...) [with _Args = {unsigned char}; typename std::enable_if<is_constructible_v<_Tp, _Args ...>, bool>::type <anonymous> = false; _Tp = unsigned char]’ at include/c++/14.3.0/optional:648:4,
inlined from ‘constexpr std::optional<_Tp>::optional(_Up&&) [with _Up = unsigned char; typename std::enable_if<__and_v<std::__not_<std::is_same<std::optional<_Tp>, typename std::remove_cv<typename std::remove_reference<_Up>::type>::type> >, std::__not_<std::is_same<std::in_place_t, typename std::remove_cv<typename std::remove_reference<_Up>::type>::type> >, std::is_constructible<_T1, _U1>, std::is_convertible<_Iter, _Iterator> >, bool>::type <anonymous> = true; _Tp = unsigned char]’ at include/c++/14.3.0/optional:747:47,
inlined from ‘std::optional<_Tp> libcamera::YamlObject::Getter<T, typename std::enable_if<(((((is_same_v<signed char, T> || is_same_v<unsigned char, T>) || is_same_v<short int, T>) || is_same_v<short unsigned int, T>) || is_same_v<int, T>) || is_same_v<unsigned int, T>), void>::type>::get(const libcamera::YamlObject&) const [with T = unsigned char]’ at ../../src/libcamera/yaml_parser.cpp:172:10:
include/c++/14.3.0/optional:210:15: error: ‘value’ may be used uninitialized [-Werror=maybe-uninitialized]
210 | : _M_value(std::forward<_Args>(__args)...)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../../src/libcamera/yaml_parser.cpp: In member function ‘std::optional<_Tp> libcamera::YamlObject::Getter<T, typename std::enable_if<(((((is_same_v<signed char, T> || is_same_v<unsigned char, T>) || is_same_v<short int, T>) || is_same_v<short unsigned int, T>) || is_same_v<int, T>) || is_same_v<unsigned int, T>), void>::type>::get(const libcamera::YamlObject&) const [with T = unsigned char]’:
../../src/libcamera/yaml_parser.cpp:165:19: note: ‘value’ was declared here
165 | T value;
| ^~~~~
This appears to be a false positive, as the std::from_chars() function
should set value when it returns without an error. Commit bb1d216113
("libcamera: base: log: Fix uninitialized variable warning") fixed a
similar warning with gcc 13.3.0.
The warning is easy to work around by initializing the variable, and
doing so shouldn't be too costly as the type T is restricted to being an
integer. Fix the build by doing so.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
Introduce a LensShadingCorrectionEnable control to enable and disable
LSC. This is useful to assess the working and quality of the lens
shading correction at runtime.
While at it drop the reference to the tuning file in the description of
the LensDewarpEnable control, as that information doesn't belong to the
controls.
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
The lens shading correction is always applied based on the sensor crop
bounds. This leads to incorrect lens shading correction for analog crops
that do not cover the whole sensor.
To fix that, we need to adapt the lens shading table for the selected
analog crop at configure time. Introduce an abstract ShadingDescriptor
class that holds the lens shading information that can then be sampled
at configure time for a specific crop rectangle.
Resampling for a specific crop is only implemented for polynomial lsc
data. For tabular data, a warning is logged and the unmodified table is
returned. This matches the current functionality for tabular data and is
a huge improvement for polynomial data.
Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
There is no need to recalculate the sampling positions over and over.
Pass them as parameter into the sampling function. The vectors are still
kept inside the loop as this is also a preparatory change for the
upcoming refactoring.
Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
The quantization of the interpolation key was only used by the LSC
algorithm. There it lead to difficult to read code was removed. As there
is no remaining user of it, drop it from the Interpolator class.
While at it, cleanup the includes.
Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
The quantization functionality in the Interpolator type hinders in
writing nice code. Don't use it and implement the functionality directly
in the algorithm.
While at it, reduce the threshold to half of the quantization step size,
otherwise it might happen that we skip a full quantization step. Rename
the kColourTemperatureChangeThreshhold to kColourTemperatureQuantization
to better express the usecase.
Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
Move the function definitions out of the related classes. This was noted
in review after the series was already merged. After trying it out I
must admit that it really improves readability and reduces the
indentation level by one.
Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
Reviewed-by: Rui Wang <rui.wang@ideasonboard.com>
The default CCM in uncalibrated.yaml is just an identity transformation
and has been enabled by default only to always provide a correction
matrix to GPU ISP. It slows down CPU ISP when CCM is not used.
Now, when a default correction matrix is always provided to GPU ISP, we
can disable the Ccm algorithm in uncalibrated.yaml again. The check for
ccmEnabled in GPU ISP is no longer needed and it must be removed in
order not to fail when Ccm algorithm is not enabled. ccmEnabled flag is
still needed in CPU ISP where the processing differs based on whether
CCM is present or not.
Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
Reviewed-by: Robert Mader <robert.mader@collabora.com>
Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
The Lut algorithm is not really an algorithm. Moreover, algorithms may
be enabled or disabled but with Lut disabled, nothing will work.
Let's move the construction of lookup tables to CPU debayering, where it
is used. The implied and related changes are:
- DebayerParams is changed to contain the real params rather than lookup
tables.
- contrastExp parameter introduced by GPU ISP is used for CPU ISP too.
- The params must be initialised so that debayering gets meaningful
parameter values even when some algorithms are disabled.
- combinedMatrix must be put to params everywhere where it is modified.
- Matrix changes needn't be tracked in the algorithms any more.
- CPU debayering must watch for changes of the corresponding parameters
to update the lookup tables when and only when needed.
- Swapping red and blue is integrated into lookup table constructions.
- gpuIspEnabled flags are removed as they are not needed any more.
Reviewed-by: Robert Mader <robert.mader@collabora.com>
Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
Acked-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
control_ids.h defines the contrast type as float, let's use the same in
simple IPA, instead of double. Saturation and gamma already use float,
except for the knobs initializers, let's use float for the knobs too.
Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
Reviewed-by: Robert Mader <robert.mader@collabora.com>
Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Saturation adjustments are implemented using matrix operations. They
are currently applied to the colour correction matrix. Let's move them
to a newly introduced separate "Adjust" algorithm.
This separation has the following advantages:
- It allows disabling general colour adjustments algorithms without
disabling the CCM algorithm.
- It keeps the CCM separated from other corrections.
- It's generally cleaner.
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Robert Mader <robert.mader@collabora.com>
Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
The combined matrix must be reset to the initial value before each frame
is prepared. This must be done outside algorithms because any of the
algorithms may be disabled while the matrix must be always initialised.
Let's initialise the combined matrix to the identity matrix (which keeps
the pixel values unchanged) in software ISP just before calling
`prepare' on the algorithms.
Matrix updates can no longer be skipped in ccm.cpp, otherwise the CCM
won't be applied if there is no temperature or saturation change. We
explicitly track whether the CCM has been set up completely rather than
relying on the frame number, to avoid missing the initialisation in case
the first frame is skipped due to some error.
Reviewed-by: Robert Mader <robert.mader@collabora.com>
Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
Acked-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>