Commit graph

4729 commits

Author SHA1 Message Date
Laurent Pinchart
1ca1d06d67 ipa: rkisp1: goc: Mark default gamma table as static constexpr
The values for the default gamma table are stored in an array that is
never modified. Mark it as static constexpr to facilitate optimizations.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-06-12 12:00:33 +03:00
Laurent Pinchart
1566e67f76 ipa: rkisp1: goc: Use copydoc
Use the Doygen \copydoc command instead of duplicating documentation.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-06-12 12:00:31 +03:00
Laurent Pinchart
2a253be333 ipa: rkisp1: goc: Drop incorrect [[maybe_unused]]
A few function parameters are marked with [[maybe_unused]] but are
actually used. Drop the attribute.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-06-12 12:00:28 +03:00
Laurent Pinchart
6dba3f4612 ipa: rkisp1: goc: Fix typographical issues in documentation.
Fix a few assorted typographical issues:

- Sentences should end with a period.
- Paragraphs should be separated by a blank line, and there should be no
  line break within a paragraph.
- Doxygen lists need a list marker ('-' or '*', use '-' here).

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-06-12 12:00:25 +03:00
Paul Elder
9fcc0029ec ipa: rpi: controller: Use libipa's Pwl class
To reduce code duplication, use the Pwl class from libipa. This also
removes the Pwl class from the Raspberry Pi IPA.

Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Stefan Klug <stefan.klug@ideasonboard.com>
Acked-by: David Plowman <david.plowman@raspberrypi.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-06-12 16:53:00 +09:00
Paul Elder
95fa5c40ba ipa: libipa: Copy pwl from rpi, and clean it up to match libcamera
Copy the piecewise linear function code from Raspberry Pi,
and clean it up to align it more with the libcamera style.

Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Stefan Klug <stefan.klug@ideasonboard.com>
Acked-by: David Plowman <david.plowman@raspberrypi.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2024-06-12 16:52:18 +09:00
Paul Elder
93438d1aad ipa: libipa: Add Vector class
Add a vector class to libipa. The original purpose of this is to replace
the floating-point Point class that Raspberry Pi used in their Pwl, as
that implementation of Point seemed more akin to a Vector than a Point.

This is added to libipa instead of to geometry.h to avoid public API
issues, plus this is not expected to be needed by applications.

Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2024-06-12 16:52:14 +09:00
Stefan Klug
d2a5508d0a pipeline: rkisp1: cproc: Fix default value handling
Default control values were not applied to activeState. This had no negative
side effects in the first place, as the hardware defaults were used. The issue
became visible, when only one of the controls was set at runtime. In that case
the params for the other values were overwritten with 0 (reset value of
activeState) resulting in a black image.

While at it, only add the controls to the controls map if the algorithm is
contained in the tuning file.

Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-06-11 15:42:18 +02:00
Laurent Pinchart
f305cacc9c meson: Group libipa and libipa_includes in a dependency object
Many build targets link with libipa and need libipa_includes. Group them
in a libipa_dep dependency object to simplify the users.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
2024-06-11 16:39:22 +03:00
Milan Zamazal
fceaa7f3e2 libcamera: software_isp: Fix includes ordering in simple.cpp
Let's make it conforming to the defined clang-format.

Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2024-06-11 16:27:07 +03:00
Milan Zamazal
fa52898efe clang-format: Make Qt includes matching case sensitive
Now that stable versions of all major distributions ship clang-format 12
or newer, we can use the CaseSensitive option for the Qt include
category. This fixes the problem that includes like

  #include <queue>

are put near the end.

Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2024-06-11 16:26:54 +03:00
Stefan Klug
eb41f63694 ipa: rkisp1: Add GammaOutCorrection algorithm
Add a gamma algorithm for the rkisp1. It defaults to a gamma of 2.2 which
closely resembles sRGB.  No seperate sRGB mode was implemented because the pwl
that models the gamma curve is so coarse that there is basically no difference
between srgb and gamma=2.2. The default can be overridden within the tuning
file or set at runtime using the gamma control.

The gamma algorithm is not enabled by default. This will be done in future
tuning file updates.

Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
2024-06-11 15:11:11 +02:00
Stefan Klug
acfd602767 ipa: rkisp1: Fix algorithm controls vanish after configure
std::unordered_map::merge(source) has the side effect of actually moving items
from source to target. In this case the controls were removed from the source
maps on the first call to updateControls() and on the second call to
updateControls() they were missing in the source maps and therefore also
removed from the camera. Fix this by using insert() instead of merge(). This is
most likely cheaper than copy-contructing the source map.

Fixes: 4c5152843a ("ipa: rkisp1: Derive rkisp1::algorithms::Agc from AgcMeanLuminance")
Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
2024-06-11 15:11:11 +02:00
Stefan Klug
294ead848c libcamera: Add gamma control id
A camera gamma of roughly 2.2 is necessary to produce correct output
images on a standard monitor. Add a control for that.

Further information is available here:
https://en.wikipedia.org/wiki/SRGB
https://www.cambridgeincolour.com/tutorials/gamma-correction.htm

Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
2024-06-11 15:11:11 +02:00
Paul Elder
f3caea0ff7 test: ipa: rkisp1: utils: Fix floating and fixed point conversion test
There was an issue where using map to store the test cases meant that
the test for ignoring unused bits was skipped because of clashing keys.
Fix this by moving the offending test out of the loop.

While at it, also change the arbitrary floating comparison precision to
be more precise.

Also fix a missing documentation brief.

Fixes: 9d152e9c66 ("ipa: rkisp1: Add a helper to convert floating-point to fixed-point")
Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-06-10 22:05:52 +09:00
Laurent Pinchart
48cb731d72 libcamera: dma_buf_allocator: Work around lack of file seals in uClibc
uClibc doesn't provide the macros defining parameters for the file
sealing API. Define them manually as a work around.

Fixes: ea4baaacc3 ("libcamera: DmaBufAllocator: Support allocating from /dev/udmabuf")
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2024-06-05 15:11:45 +03:00
Laurent Pinchart
9f0d88695e libcamera: dma_buf_allocator: Work around lack of memfd_create() in uClibc
uClibc doesn't provide a memfd_create() implementation. Fix it by using
a direct syscall when the function isn't available.

Fixes: ea4baaacc3 ("libcamera: DmaBufAllocator: Support allocating from /dev/udmabuf")
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
2024-06-05 15:11:21 +03:00
Laurent Pinchart
9c2ca46391 libcamera: dma_buf_allocator: Create memfd with CLOEXEC
Ensure that the memfd file descriptor won't be leaked to child processes
by creating it with MFD_CLOEXEC.

Fixes: ea4baaacc3 ("libcamera: DmaBufAllocator: Support allocating from /dev/udmabuf")
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-06-05 12:23:52 +03:00
Naushir Patuck
98071d3109 ipa: rpi: Disable StatsOutputEnable control by default
Set the default value of controls::rpi::StatsOutputEnable to false,
disabling the functionality. This stops unnecessary copies of the
statistics output ending up in the Request metdata if not needed.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: David Plowman <david.plowman@raspberrypi.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-06-04 17:01:11 +01:00
Hans de Goede
d284ac2d59 libcamera: software_isp: Allow using dma-buffers from /dev/udmabuf
Allow the DmaBufAllocator used by the software ISP to use memfd() +
/dev/udmabuf for the software ISP destination buffers.

This is useful on Linux distributions where normal users are not allowed
to access /dev/dma_heap/* while they are allowed to access /dev/udmabuf.

Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Tested-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> # Lenovo-x13s
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-06-04 16:19:33 +01:00
Hans de Goede
ea4baaacc3 libcamera: DmaBufAllocator: Support allocating from /dev/udmabuf
The dma-buf allocator currently allocates from CMA and system heaps.

Extend the dma-buf allocator to support allocating dma-buffers by creating
memfd-s and turning those into dma-buffers using /dev/udmabuf.

The buffers allocated through memfd/udmabuf are not suitable for zero-copy
buffer sharing with other devices.

Co-developed-by: Harvey Yang <chenghaoyang@chromium.org>
Signed-off-by: Harvey Yang <chenghaoyang@chromium.org>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Tested-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> # Lenovo-x13s
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-06-04 16:19:33 +01:00
Hans de Goede
447da4a11f libcamera: Rename DmaHeap class to DmaBufAllocator
Users of the DmaHeap class really just want some way to allocate
dma-buffers from userspace. This can also be done by using /dev/udmabuf
instead of using /dev/dma_heap/*.

Rename DmaHeap class to DmaBufAllocator in preparation of adding
/dev/udmabuf support.

And update the DmaHeap class docs to match including replacing references
to "dma-heap type" with "dma-buf provider".

This is a pure automated rename on the code ('s/DmaHeap/DmaBufAllocator/')
+ file renames + doc updates. There are no functional changes.

The DmaBufAllocator objects in vc4.cpp and software_isp.cpp are left named
dmaHeap_ to keep the changes to those 2 files to a minimum.

Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Tested-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> # Lenovo-x13s
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-06-04 16:19:33 +01:00
Laurent Pinchart
6cd17515ff libcamera: v4l2_subdevice: Update to the new kernel routing API
The subdev embedded data support series includes a change to the
VIDIOC_SUBDEV_G_ROUTING and VIDIOC_SUBDEV_S_ROUTING ioctls that impacts
the userspace API.

Update to the new API, while preserving backward compatibility to ease
the transition. Document the backward compatibility to only be supported
for two kernel releases. As the routing API isn't enabled in any
upstream kernel yet, users of the API need kernel patches, and are
expected to be able to upgrade quickly.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-06-03 12:18:25 +03:00
Hans de Goede
70d553812e include: linux: Update kernel headers to version v6.10-rc1
Updated kernel headers to v6.10-rc1 using utils/update-kernel-headers.sh
and re-instating libcamera local modifications.

This includes adding include/linux/udmabuf.h which was not part
of libcamera's include/linux headers before.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2024-06-03 12:14:33 +03:00
Hans de Goede
f6aa63acad update-kernel-headers: Add linux/udmabuf.h to headers to sync
linux/udmabuf.h will be used by upcoming DmaBufAllocator changes and it
is not available on some older kernels.

Add it to the headers to sync.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2024-06-03 12:14:33 +03:00
Laurent Pinchart
1020b6be51 test: ipa: rkisp1-utils: Fix coding style for template arguments
The coding style names template arguments using CamelCase with an
uppercase initial letter. Fix the template arguments in the rkisp1-utils
test.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-06-03 11:59:45 +03:00
Laurent Pinchart
f7d7a5e294 pipeline: vimc: Don't hardcode scaling factor with recent kernels
Starting in kernel v5.16, the vimc driver stopped hardcoding the scaler
factor. Use this to lift constraints on the camera configuration, and in
particular on the exotic output size alignment to a multiple of 6. As a
result, vimc-based cameras can more easily match common display
resolutions.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com>
2024-06-03 11:53:12 +03:00
Laurent Pinchart
73f18f32c9 test: v4l2_videodevice: Increase timeout for vimc capture tests
On slower machines, a 10s timeout to capture frames with vimc can be too
short and cause test failures. Make the timeout proportional to the
number of frames expected to be captured, using a conservative low
estimate of the frame rate at 2fps. This does not increase the test time
if the vimc driver is fast enough to produce frames.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com>
2024-06-03 11:53:10 +03:00
Laurent Pinchart
dedf9cf264 test: fence: Increase timeout for fence test
On slower machines, a 1s timeout to capture frames with vimc can be too
short and cause test failures. Make the timeout proportional to the
number of frames expected to be captured, using a conservative low
estimate of the frame rate at 2fps.

By itself, that change could increase the test time quite substantially
on fast platforms, so break from the capture loop as soon as we capture
enough frames.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-06-03 11:53:07 +03:00
Laurent Pinchart
13dcc7fc5f test: fence: Fix race condition
The fence test is racy, as it relies on the main loop being executed
between completion of request signalledRequestId_ and
signalledRequestId_ + 1. This usually happens, but is not guaranteed.

To fix the race condition, change the request identification logic by
replacing usage of the cookie value, which is zero-based and wraps
around at nbuffers_ - 1, with a completed request counter that is
one-based and doesn't wrap. The completedRequestId_, expiredRequestId_
and signalledRequestId_ variables now track the identifier of the last
request that has completed, the request whose fence will time out, and
the request whose fence will be signalled.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-06-03 11:53:04 +03:00
Laurent Pinchart
c44457957e test: fence: Turn class member variable into local variable
The fence_ class member variable is only used locally in the
FenceTest::run() function. Make it a local variable.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com>
2024-06-03 11:53:02 +03:00
Laurent Pinchart
0554a55427 test: camera: Increase timeout for vimc capture tests
On slower machines, a 1s timeout to capture frames with vimc can be too
short and cause test failures. Make the timeout proportional to the
number of frames expected to be captured, using a conservative low
estimate of the frame rate at 2fps.

By itself, that change could increase the test time quite substantially
on fast platforms, so break from the capture loop as soon as we capture
enough frames. To do so, interrupt the dispatcher at every request
completion, or it will only get interrupted after the timer times out.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com>
2024-06-03 11:53:01 +03:00
Milan Zamazal
a52d818e2b libcamera: software_isp: Remove TODO about internal representation
TODO #4 was recorded at a time where the IPA module computed gain values
and the ISP computed the look up tables.  The gains were higher-level
parameters.  Now that the look up tables are computed in the IPA module,
the IPA and ISP are more tightly coupled and the TODO item is less
relevant.

Let's drop the TODO item.  We may or may not need to switch to a
different representation in future but there is currently no good need
for this and the conversion of the values would be just waste of CPU
cycles.

Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2024-06-02 02:00:08 +03:00
Milan Zamazal
f5b7921e0a libcamera: software_isp: Remove DebayerParams::kGain10
The constant is used in a single place internally and doesn't belong to
DebayerParams anymore.  Let's use 256 directly.

Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
Reviewed-by: Andrei Konovalov <andrey.konovalov.ynk@gmail.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2024-06-02 01:59:24 +03:00
Milan Zamazal
539c62ff8e libcamera: software_isp: Move color mappings out of debayering
Constructing the color mapping tables is related to stats rather than
debayering, where they are applied.  Let's move the corresponding code
to stats processing.

The same applies to the auxiliary gamma table.  As the gamma value is
currently fixed and used in a single place, with the temporary exception
mentioned below, there is no need to share it anywhere anymore.

It's necessary to initialize SoftwareIsp::debayerParams_ to default
values.  These initial values are used for the first two frames, before
they are changed based on determined stats.  To avoid sharing the gamma
value constant in artificial ways, we use 0.5 directly in the
initialization.  This all is not a particularly elegant thing to do,
such a code belongs conceptually to the similar code in stats
processing, but doing better is left for larger refactoring.

This is a preliminary step towards building this functionality on top of
libipa/algorithm.h, which should follow.

Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
Reviewed-by: Andrei Konovalov <andrey.konovalov.ynk@gmail.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2024-06-02 01:54:20 +03:00
Milan Zamazal
4e13c6f55b libcamera: software_isp: Honor black level in AWB
The white balance computation didn't consider black level.  This is
wrong because then the computed ratios are off when they are computed
from the whole brightness range rather than the sensor range.

This patch adjusts white balance computation for the black level.  There
is no need to change white balance application in debayering as this is
already applied after black level correction.

Exposure computation already subtracts black level, no changes are
needed there.

Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
Reviewed-by: Andrei Konovalov <andrey.konovalov.ynk@gmail.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2024-06-02 01:47:40 +03:00
Milan Zamazal
738bd37905 libcamera: software_isp: Use a specific integer type for black level
The documented range of values corresponds to uint8_t, so let's use that
type.

Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Andrei Konovalov <andrey.konovalov.ynk@gmail.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2024-06-02 01:47:24 +03:00
Laurent Pinchart
aad5837d70 utils: checkstyle.py: Show location of coding style issue within line
The issue checkers display the line number and line content of each
offending line, but don't show the location of the issue within a line.
Improve checkstyle by adding a marker that points to the exact location.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-05-31 20:07:12 +03:00
Laurent Pinchart
4a7c9ce467 utils: checkstyle.py: Add a check for hex values
libcamera uses lowercase hex values. Add a corresponding checker.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Tested-by: Milan Zamazal <mzamazal@redhat.com>
2024-05-31 20:05:25 +03:00
Laurent Pinchart
5d2c8fa11b utils: checkstyle.py: Extend IncludeChecker to cover math.h
math.h is an exception to the C compatibility header rule, as we prefer
using cmath. Extend the IncludeCheck to warn about it.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-05-31 20:05:10 +03:00
Laurent Pinchart
b8b24c5b5e utils: checkstyle.py: Refactor IncludeChecker
The IncludeCheck warns when code uses C++ standard library headers where
corresponding C compatibility headers are preferred. We have an
exception to that rule for math.h, where cmath is prefered. In order to
prepare for extending checkstyle.py to enforce that rule, refactor the
way the IncludeChecker identifies headers. No functional change is
intended.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-05-31 20:04:53 +03:00
Paul Elder
9b29eba7a2 test: ipa: rkisp1-utils: Fix capitalization of hex numbers
Fix capitalization of the hexdecimal numbers in the test for conversion
between floating point and fixed point numbers.

Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2024-05-31 23:29:41 +09:00
Paul Elder
9d152e9c66 ipa: rkisp1: Add a helper to convert floating-point to fixed-point
Add helper functions for converting between floating point and fixed
point numbers. Also add tests for them.

Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-05-31 17:12:48 +09:00
Barnabás Pőcze
c79fa47aac android: camera_capabilities: Fix GCC 14 warning
GCC 14 thinks `rects` is a "possibly dangling reference to a temporary":

/libcamera/src/android/camera_capabilities.cpp: In member function ‘int CameraCapabilities::initializeStaticMetadata()’:
/libcamera/src/android/camera_capabilities.cpp:1084:46: error: possibly dangling reference to a temporary [-Werror=dangling-reference]
 1084 |                 const Span<const Rectangle>& rects =
      |                                              ^~~~~
/libcamera/src/android/camera_capabilities.cpp:1085:83: note: the temporary was destroyed at the end of the full expression ‘(& properties)->libcamera::ControlList::get<libcamera::Span<const libcamera::Rectangle> >(libcamera::properties::PixelArrayActiveAreas).std::optional<libcamera::Span<const libcamera::Rectangle> >::value_or<libcamera::Span<const libcamera::Rectangle> >(libcamera::Span<const libcamera::Rectangle>())’
 1085 |                         properties.get(properties::PixelArrayActiveAreas).value_or(Span<const Rectangle>{});
      |                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~

The return value of `value_or()` is indeed a temporary, but binding it
to a reference extends its lifetime. Avoid the warning by not using a
reference; this does not make much difference since `value_or()` does
not return a reference.

Signed-off-by: Barnabás Pőcze <pobrn@protonmail.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2024-05-27 23:53:59 +03:00
Laurent Pinchart
807119d1e0 ipa: rpi: Make monoSensor() accessor const
The ipa::RPi::IpaBase::monoSensor() function doesn't modify the class.
Make it const.

Fixes: 2031e2f290 ("ipa: rpi: Add accessor function for monoSensor_")
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
2024-05-27 14:34:38 +03:00
Barnabás Pőcze
168bb3c97c libcamera: yaml_parser: Avoid double lookup in operator[]
`YamlObject::contains()` does the same search, doing the lookup twice is
unnecessary.

Signed-off-by: Barnabás Pőcze <pobrn@protonmail.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-05-21 13:23:12 +01:00
Barnabás Pőcze
e77a275110 treewide: Query list of cameras just once
This is more efficient since only a single vector will be constructed,
and furthermore, it prevents the TOCTOU issue that might arise when
the list of cameras changes between the two queries.

Signed-off-by: Barnabás Pőcze <pobrn@protonmail.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-05-21 13:22:33 +01:00
Kieran Bingham
aee16c0691 libcamera v0.3.0
abi-compliance checker reports 99.7% binary compatibility and 99.9% source
compatibility between v0.2.0 and v0.3.0. The SONAME has been updated
accordingly and applications must be relinked against this version of
libcamera.

 Total binary compatibility problems: 2, warnings: 0
 Total source compatibility problems: 2, warnings: 0

Specifically, the symbol
  - ControlList::merge(struct ControlList const& source )
 has been replaced with the new symbol:
  - ControlList::merge ( struct ControlList const& source, enum ControlList::MergePolicy policy )

The following commits in this release relate to either a bug fix or improvement
to existing commit.

 - utils: ipc: extract-docs: Fix escape characters in regex
   - Reported-by: Nicolas Dufresne <nicolas@ndufresne.ca>
 - libcamera: Remove empty formats.c
   - Fixes: e0a51061bc ("libcamera: formats: Add 14-bits Bayer RAW formats")
 - libcamera: bayer_format: Add Y12 to bayerToFormat
   - Fixes: ec63095716 ("libcamera: bayer_format: Add unpacked mono 12-bit format to the conversion table")
 - apps: common: dng_writer: Add a default case for switch-case on a modulo
   - Bug: https://bugs.libcamera.org/show_bug.cgi?id=207
 - utils: mojom: Fix build error caused by the mojom tool update
   - Fixes: d17de86904 ("utils: ipc: Update mojo")
 - libcamera: formats: Fix planes bounds check
   - Fixes: e83727a194 ("libcamera: PixelFormatInfo: Add functions stride and frameSize")
 - utils: ipu3: Fix return value check on file output
   - Fixes: 23ac77dc4a ("utils: ipu3: Add IPU3 raw capture unpack utility")
 - ipa: libipa: histogram: Fix documentation of constructor
   - Fixes: 1dc01bc9e6 ("ipa: libipa: histogram: Add transform parameter to constructor")
 - gstreamer: Fix string memory leak
   - Fixes: fc9783acc6 ("gstreamer: Provide colorimetry <> ColorSpace mappings")
 - gstreamer: Use copied camera name
   - Fixes: 58feb69f85 ("gst: libcamerasrc: Implement selection and acquisition")

core:
 - include: linux: Update kernel headers to version v6.7
 - libcamera: v4l2_subdevice: Enable streams API when supported
 - libcamera: base: signal: Update Qt documentation link to Qt 6
 - Documentation: Update Qt documentation links to Qt 6
 - test: gstreamer: Use env instead of registry edit
 - libcamera: Remove empty formats.c
 - libcamera: formats: Add 16-bit mono format
 - libcamera: formats: Fix sort ordering of R10_CSI2P
 - libcamera: bayer_format: Add Y12 to bayerToFormat
 - libcamera: v4l2_subdevice: Explain sort order of formatInfoMap
 - libcamera: object: Fix thread-bound reference in documentation
 - libcamera: signal: Replace object.h inclusion with forward declatation
 - test: object-delete: Test deferred delete just before thread stops
 - libcamera: thread: Ensure deferred deletion of all objects before stopping
 - test: event-thread: Destroy Object from correct thread context
 - test: message: Remove incorrect slow receiver test
 - test: message: Destroy Object from correct thread context
 - test: signal-threads: Destroy Object from correct thread context
 - test: timer-thread: Move timer start from wrong thread to separate test
 - test: timer-thread: Destroy Object from correct thread context
 - libcamera: object: Document and ensure Object deletion constraints
 - libcamera: object: Add and use thread-bound assertion
 - utils: mojom: Fix build error caused by the mojom tool update
 - include: linux: Add RKISP1_V_IMX8MP version
 - libcamera: utils: Add to_underlying() helper function
 - libcamera: Use utils::to_underlying()
 - libcamera: formats: Fix typos in PixelFormatInfo documentation
 - utils: checkstyle.py: Don't presume python3 location
 - utils: checkstyle.py: Update LogCategoryChecker regexp
 - utils: rkisp1: gen-csc-table.py: Don't presume python3 location
 - libcamera: formats: Fix planes bounds check
 - utils: ipu3: Fix return value check on file output
 - README.rst: Report py dependencies
 - meson_options: Autodetect pycamera support
 - libcamera: controls: Fix typo on thermal
 - guides: pipeline-handler: Fix controlInfo_ initialization
 - libcamera: v4l2_subdevice: Add 14-bit Bayer formats
 - utils: checkstyle.py: Add Co-developed-by to known_trailers
 - utils: checkstyle.py: Fix known_trailers sort order
 - libcamera: framebuffer_allocator: Move from argument in constructor
 - libcamera: framebuffer_allocator: Use default destructor
 - libcamera: framebuffer_allocator: Remove entry if allocation fails
 - libcamera: controls: Add policy parameter to ControlList::merge()
 - libcamera: v4l2_subdevice: Rename V4L2SubdeviceFormatInfo
 - libcamera: v4l2_subdevice: Add code member to MediaBusFormatInfo
 - libcamera: v4l2_subdevice: Expose media bus format info as internal API
 - libcamera: v4l2_subdevice: Extend MediaBusFormatInfo with metadata formats
 - libcamera: v4l2_subdevice: Drop V4L2SubdeviceFormat::bitsPerPixel()
 - libcamera: v4l2_subdevice: Rename V4L2SubdeviceFormat::mbus_code to code
 - libcamera: v4l2_subdevice: Add stream support to get/set functions
 - libcamera: v4l2_subdevice: Replace Routing::toString() with operator<<()
 - libcamera: v4l2_subdevice: Add V4L2Subdevice::Route structure
 - libcamera: camera_sensor: Move related classes to subdirectory
 - libcamera: camera_sensor: Drop updateControlInfo() function
 - libcamera: camera_sensor: Reorder functions
 - libcamera: camera_sensor: Test for read-only HBLANK with READ_ONLY flag
 - libcamera: camera_sensor: Expose the Bayer order
 - checkstyle: Work around bug in difflib
 - utils: tuning: readme: Improve names of dependency packages
 - libcamera: internal: Move dma_heaps.[h, cpp] to common directories
 - libcamera: dma_heaps: extend DmaHeap class to support system heap
 - libcamera: internal: Move SharedMemObject class to a common directory
 - libcamera: shared_mem_object: Rename SIZE constant to `size'
 - libcamera: shared_mem_object: Reorganize the code and document the SharedMemObject class
 - libcamera: software_isp: Add SwStatsCpu class
 - libcamera: software_isp: Add Debayer base class
 - libcamera: software_isp: Add DebayerCpu class
 - libcamera: Introduce SoftwareIsp
 - libcamera: swstats_cpu: Add support for 8, 10 and 12 bpp unpacked bayer input
 - libcamera: debayer_cpu: Add support for 8, 10 and 12 bpp unpacked bayer input
 - libcamera: debayer_cpu: Add BGR888 output support
 - libcamera: Add "Software ISP benchmarking" documentation
 - libcamera: software_isp: Apply black level compensation
 - Documentation: coding-style: Clean up header guard style
 - utils: checkstyle.py: Use r'' strings for regular expressions
 - utils: checkstyle.py: Drop period at end of Doxygen one liners
 - libcamera: device_enumerator: Fix spell error
 - libcamera: Fix output spelling error
 - libcamera: utils: Avoid infinite recursion with strtod()
 - libcamera: shared_mem_object: Fix compilation with uClibc
 - meson: Deprecate bitwise operations between different enumeration type
 - Revert "meson: Deprecate bitwise operations between different enumeration type"
 - test: Don't add current build directory to include path
 - libcamera: controls: Generate enum value-name maps
 - libcamera: Drop file name from header comment blocks
 - libcamera: Drop file name from header comment blocks in templates
 - libcamera: Drop remaining file name from header comment blocks
 - test: gstreamer: Simplify single stream test
 - Documentation: Add option to treat Doxygen warnings as errors
 - libcamera: camera_manager: Add environment variable to order pipelines match
 - include: linux: Add RGB48 formats
 - libcamera: formats: Add RGB48 formats
 - include: linux: Add PiSP specific image and config buffer formats
 - libcamera: formats: Add PiSP specific image and config buffer formats
 - libcamera: v4l2_subdevice: Add missing MEDIA_BUS_FMT_xxxx16_1X16 info

pipeline:
 - pipeline: rpi: Always initialize the embedded buffer in tryRunPipeline
 - pipeline: rpi: vc4: Use an unpacked format if no packed one is available
 - pipeline: simple: Add support for MediaTek MT8365 platforms
 - libcamera: pipeline: Add Mali-C55 ISP pipeline
 - libcamera: pipeline: simple: fix size adjustment in validate()
 - libcamera: pipeline: simple: Rename converterBuffers_ and related vars
 - libcamera: pipeline: simple: Enable use of Soft ISP and Soft IPA
 - ipu3: Use posix basename
 - pipeline: rpi: Avoid duplicating size range for the same pixel format
 - libcamera: pipeline: Rename pipelines to a shorter name
 - libcamera: pipeline: Add a get factory by name helper

ipa:
 - libipa: camera_sensor_helper: Mark createInstance() with override
 - utils: ipc: extract-docs: Fix escape characters in regex
 - ipa: rkisp1: agc: Wrap variable length C arrays in spans
 - ipa: rkisp1: Store hardware parameters in IPA context
 - ipa: rkisp1: Fix histogram weights configuration
 - ipa: rkisp1: Support the i.MX8MP ISP version
 - ipa: rpi: cam_helper: Extend embedded data parsing to RAW14 modes
 - utils: ipc: Fix event functions with no parameters
 - utils: ipc: Fix async main interface functions with no parameters
 - libcamera: ipa: Add Soft IPA
 - libcamera: libipa: camera_sensor: Add Sony IMX283 sensor properties
 - libcamera: libipa: camera_sensor: Add Sony IMX335 sensor properties
 - libcamera: libipa: camera_sensor: Add Sony IMX415 sensor properties
 - ipa: libipa: Allow creation of empty Histogram
 - ipa: libipa: Add ExposureModeHelper
 - ipa: libipa: Add AgcMeanLuminance base class
 - ipa: ipu3: Derive ipu3::algorithms::Agc from AgcMeanLuminance
 - ipa: ipu3: Remove bespoke AGC functions from IPU3
 - ipa: rkisp1: Derive rkisp1::algorithms::Agc from AgcMeanLuminance
 - ipa: rkisp1: Remove bespoke Agc functions
 - ipa: libipa: histogram: Add transform parameter to constructor
 - ipa: rpi: Fix for incorrectly reported max shutter speed
 - ipa: rkisp1: agc: Fix histogram construction
 - ipa: libipa: histogram: Fix documentation of constructor
 - ipa: rpi: Add HDR support
 - ipa: rpi: Add accessor function for monoSensor_

apps:
 - gstreamer: Add meson devenv support
 - apps: common: dng_writer: Add a default case for switch-case on a modulo
 - doc: gstreamer: Add missing queues
 - gstreamer: Map R8/R16 pixel format
 - gstreamer: Map 10/12/14/16 bayer formats supports
 - cam: capture_script: Make parseRectangles work for non-array
 - apps: lc-compliance: Check that requests complete successfully
 - apps: lc-compliance: Fix typo in comment
 - apps: lc-compliance: Re-organize source directory
 - android: camera_device: Save capture settings unconditionally
 - v4l2: Unset _TIME_BITS in addition to _FILE_OFFSET_BITS
 - v4l2: meson: Keep defines sorted alphabetically
 - apps: cam: Add support for PPM output format
 - android: camera_device: Always clear descriptors_ in stop()
 - apps: cam: Fix C++20 deprecation warning
 - apps: qcam: Use standard key sequence for quit action
 - gstreamer: Fix string memory leak
 - gstreamer: Use copied camera name

Acked-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-05-19 16:54:11 +01:00
Naushir Patuck
2031e2f290 ipa: rpi: Add accessor function for monoSensor_
The monoSensor_ member variable will be used by the derived IPAs in an
upcoming commit, so add an accessor function for it.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-05-16 16:11:06 +01:00
Naushir Patuck
706578ecc8 ipa: rpi: Add HDR support
Add support for the following HDR modes in the Raspberry Pi IPA:
- Night mode
- Single exposure mode
- Multi-exposure (merged and unmerged)

The algorithm is updated to expect the HDR short channel to meter
explicitly for highlights. This means that it will not in general
under-expose the short channel more than is actually necessary.

When images don't have much saturation, it's good to detect this so
that some of the boost we want to apply to the dark areas can be
implemented as regular gain. This means we can then adjust the tone
curve less, leading to less flat looking images.

The impact on the HDR algorithm is then that this determines how we
build tonemaps dynamically. The highlights are more-or-less correct
now, so we have to build a power-type curve that gives us the
appropriately configured targets in the lower part of the histogram.

We allow the tuning file to supply the maximum spatial gain value,
rather than the whole curve (though it can supply this if it
wants). Some parameter defaults are tweaked to be generally better
across the range of our cameras.

Signed-off-by: David Plowman <david.plowman@raspberrypi.com>
Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: David Plowman <david.plowman@raspberrypi.com>
Reviewed-by: Naushir Patuck <naush@raspberrypi.com>
Acked-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-05-16 16:11:06 +01:00