summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
39 hoursipa: rkisp1: awb: Ignore empty AWB statisticsStefan Klug
When the AWB engine doesn't find a valid pixel because all pixels lie outside the configured colour range it returns an AWB measurement value of 255, 255, 255. This leaves the regulation in an unrecoverable state noticeable by a completely green image. Fix that by skipping the AWB calculation in case there were no valid pixels. 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>
44 hoursgstreamer: Add GstVideoMeta supportHou Qi
GStreamer video-info calculated stride and offset may differ from those used by the camera. For stride and offset mismatch, this patch adds video meta to buffer if downstream supports VideoMeta through allocation query. Otherwise, create a internal VideoPool using the caps, and copy video frame to this system memory. Signed-off-by: Hou Qi <qi.hou@nxp.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Tested-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
6 daysapps: cam: sdl_sink: Support more single-plane formatsBarnabás Pőcze
With the newly introduced `SDLTexture1Plane` it is easy to handle any single-plane format that has an SDL equivalent. So use it for more YUV and RGB formats. The mapping of RGB formats is not entirely straightforward because `SDL_PIXELFORMAT_ZZZ...888...` defines a format where the order of the components is endian dependent, while libcamera's `ZZZ...888...` formats are derived from the matching DRM formats, and the RGB formats in question are defined to be little-endian there. So the endian-independent `SDL_PIXELFORMAT_{ZZZ24,ZZZZ32}` are used. 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>
6 daysapps: cam: sdl_texture: Add `SDLTexture1Plane`Barnabás Pőcze
`SDLTextureYUYV` uses `SDL_PIXELFORMAT_YUY2`, which is a single plane format. To support other single plane formats, replace `SDLTextureYUYV` with `SDLTexture1Plane` that can be instantiated with an arbitrary SDL pixel format and that uses `SDL_UpdateTexture()` to update the texture using exactly a single plane. 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>
6 daysapps: cam: sdl_texture: Drop `&rect_` from `SDL_Update{NV,}Texture()` callBarnabás Pőcze
If the entire texture is to be updated, there is no need to specify the target area explicitly. 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>
6 daysapps: cam: sdl_texture: Take list of buffers in spanBarnabás Pőcze
A non-owning span is sufficient, so use that instead of a vector. Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
7 dayslc-compliance: Move camera setup to CameraHolder classNícolas F. R. A. Prado
Different base classes can be used for different setups on tests, but all of them will need to setup the camera for the test. To reuse that code, move it to a separate CameraHolder class that is inherited by test classes. Signed-off-by: Nícolas F. R. A. Prado <nfraprado@collabora.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Sven Püschel <s.pueschel@pengutronix.de>
8 daysipa: rkisp1: awb: Declare ControlInfo in AWBPaul Elder
The ControlInfo information for AwbEnable and ColourGains are declared and exposed in the top-level IPA. These should instead be exposed by the AWB part of the IPA, as it doesn't make sense to support these controls when AWB is disabled, for example. Move the declaration of these controls out of the top-level IPA and into AWB. 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>
9 daysipa: Move IPA installations to a subdirKieran Bingham
IPAs are expected to live within a directory that is searched by the IPAManager. If other non-IPA so files are installed in the same location, then the user may be presented with an error message reporting that the module could not be parsed. Move IPA modules to an ipa specific subdirectory to ensure we only parse .so files that are expected to be IPA modules at load time. Bug: https://bugs.libcamera.org/show_bug.cgi?id=268 Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Isaac Scott <isaac.scott@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>
9 dayspy: Set `PYTHONPATH` in devenvBarnabás Pőcze
If the python bindings are built, then set the `PYTHONPATH` environmental variable in the meson devenv accordingly to make it easy to use. $ meson devenv -C build [libcamera] $ echo $PYTHONPATH /libcamera/build/src/py [libcamera] $ python Python 3.13.3 (main, Apr 9 2025, 07:44:25) [GCC 14.2.1 20250207] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import libcamera >>> cm = libcamera.CameraManager.singleton() [...] [129:52:33.293860558] [4133380] INFO Camera camera_manager.cpp:326 libcamera v0.5.0+169-7dbe74b5-dirty (2025-05-01) [...] Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
12 dayslibcamera: v4l2_videodevice: Log buffer count on allocation errorSven Püschel
Log the actual and requested buffers count in case of a V4L2 buffers allocation error, when the requested buffers count could not be allocated. Signed-off-by: Sven Püschel <s.pueschel@pengutronix.de> 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>
13 daysapps: qcam: Push the viewfinder role to vectorKieran Bingham
In commit ee2b011b65c6 ("apps: cam: Try raw role if default viewfinder role fails"), the viewfinder role is specified as the default if no role is yet chosen. This was unfortunately added by directly accessing the vector rather than extending the size when the vector is empty. Fix the code to push the default viewfinder role on to the back of the vector, increasing the size appropriately. Fixes: ee2b011b65c6 ("apps: cam: Try raw role if default viewfinder role fails") Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> Tested-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
13 daysutils: raspberrypi: ctt: Fix integer division error calculating LSC cell sizeDavid Plowman
The cell sizes must be cast to integers as the parameters that were passed in may be floats. Bug: https://github.com/raspberrypi/libcamera/issues/260 Signed-off-by: David Plowman <david.plowman@raspberrypi.com> Fixes: 36ba0e551507 ("utils: raspberrypi: ctt: Fix NaNs in lens shading tables") Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Naushir Patuck <naush@raspberrypi.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2025-05-05Documentation: guides: application-developer: Remove unnecessary argumentBarnabás Pőcze
`required: true` is the default for meson's `dependency()` function. Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2025-05-02Documentation: guides: pipeline-handler: Query pixel formats onceBarnabás Pőcze
There is no reason to create an entire new copy of the same thing, so use the already existing `formats` object. Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2025-05-02Documentation: guides: pipeline-handler: Simplify format collectionBarnabás Pőcze
I believe a simple range based for loop is easier to understand here than `std::transform()`. Furthermore, using a for loop enables the easy filtering of invalid pixel formats. Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2025-05-02Documentation: guides: pipeline-handler: Fix `Camera::create()` linkBarnabás Pőcze
Since 6b4771d4604c ("libcamera: camera: Hide Camera::create() from the public API") `Camera::create()` is documented in the internal documentation. Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2025-05-02Documentation: guides: pipeline-handler: Fix configuration creationBarnabás Pőcze
`PipelineHandler::generateConfiguration()` returns a `std::unique_ptr`. Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2025-05-02Documentation: guides: pipeline-handler: Fix property list file nameBarnabás Pőcze
It is `property_ids_core.yaml`. Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2025-05-02Documentation: guides: pipeline-handler: Fix camera creationBarnabás Pőcze
1. The unique_ptr containing the private data must be passed to `Camera::create()`. 2. `registerCamera()` needs only the pointer to the `Camera` Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2025-05-01README.rst: remove unnecessary dependency for qcamQuentin Schulz
The introducing commit (dff416a84b78 ("README: Add missing package for Qt5 tools"); for Qt 5 originally) stated that without the dependency we would get the following messages: Program /usr/lib/x86_64-linux-gnu/qt5/bin/lrelease found: NO Program lrelease-qt5 found: NO Program lrelease found: NO found but need: '== 5.14.2' That was the case for qt5 and is still true for qt6 but this actually is neither breaking the build nor is it doing anything to the outcome of the build (for both qt5 and qt6) as qcam is bit to bit identical with and without that package. Therefore, let's not mislead users to install an unnecessary package. Signed-off-by: Quentin Schulz <quentin.schulz@cherry.de> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2025-04-30ipa: rpi: awb: Remove "fast" parameterBarnabás Pőcze
The "fast" parameter has not been used since it first appeared in the source code. And not only is it not used, but its retrieval from the configuration since c1597f989654 ("ipa: raspberrypi: Use YamlParser to replace dependency on boost") has been incorrect. So remove it. Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: David Plowman <david.plowman@raspberrypi.com>
2025-04-29ipa: rpi: common: Avoid warnings when AeEnable control is usedDavid Plowman
The AeEnable control is now just a wrapper that is converted to ExposureTimeMode and AnalogueGainMode controls instead. Therefore, it should simply be ignored when we encounter it, without the need for any warnings. Signed-off-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2025-04-29utils: raspberrypi: ctt: Fix NaNs in chromatic aberration tablesDavid Plowman
NaNs can appear if no black dots can be found and analysed in a particular region of the calibration image. There needs to be at least one such dot in every 8x8 cell covering the image. This is now detected, and an error message issued. No CAC tables are generated, so CAC is disabled. Bug: https://github.com/raspberrypi/libcamera/issues/254 Signed-off-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Naushir Patuck <naush@raspberrypi.com> Acked-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2025-04-29utils: raspberrypi: ctt: Fix NaNs in lens shading tablesDavid Plowman
The problem occurs when the calculation could lead to a final row (or column) of grid squares with no pixels in them (and hence, NaNs). One specific case is a Pi 5 with an image width (or height) of 1364, so that's 682 Bayer quads. To give 32 grid squares it was calculating 22 quads per cell. However, 31 * 22 = 682 leaving nothing in the final column. The fix is to do a rounding-down division by the number of cells minus one, rather than a rounding-up division by the number of cells. This turns the corner case from one where the final row/column has no pixels to one where we don't quite cover the full image, which is how we have to handle these cases. Bug: https://github.com/raspberrypi/libcamera/issues/254 Signed-off-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Naushir Patuck <naush@raspberrypi.com> Acked-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2025-04-29libcamera: stream: Add color space to configuration string representationLaurent Pinchart
Extend the string representation of StreamConfiguration, as returned by the toString() and operator<<() functions, with color space information. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Milan Zamazal <mzamazal@redhat.com>
2025-04-29libcamera: pipeline: rkisp1: Convert to use MediaPipelineKieran Bingham
Use the new MediaPipeline to manage and identify all sensors connected to complex pipelines that can connect to the CSI2 receiver before the ISP. This can include chained multiplexors that supply multiple cameras, so make use of the MediaDevice::locateEntities to search for all cameras and construct a pipeline for each. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com> Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Acked-by: Stefan Klug <stefan.klug@ideasonboard.com>
2025-04-29libcamera: internal: Add MediaPipeline helperKieran Bingham
Provide a MediaPipeline class to help identifing and managing pipelines across a MediaDevice graph. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Stefan Klug <stefan.klug@ideasonboard.com>
2025-04-29libcamera: media_device: Add helper to return matching entitiesKieran Bingham
Provide a helper on the MediaDevice to return a list of all available entities which match a given function in the graph. As a drive by, also fix a whitespace error in the documentation of MediaDevice::setupLink. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Stefan Klug <stefan.klug@ideasonboard.com>
2025-04-29apps: cam: Try raw role if default viewfinder role failsPaul Elder
cam currently defaults to the viewfinder role when no role is specified. This means that on platforms that only support the raw role (such as a raw sensor with no softISP on a simple pipeline platform), generateConfiguration() would return nullptr and cam would bail out. At least this is what is supposed to happen based on the little documentation that we have written regarding generateConfiguration(), specifically in the application writer's guide, which is probably the most influential piece of documentation: The ``Camera::generateConfiguration()`` function accepts a list of desired roles and generates a ``CameraConfiguration`` with the best stream parameters configuration for each of the requested roles. If the camera can handle the requested roles, it returns an initialized ``CameraConfiguration`` and a null pointer if it can't. Currently the simple pipeline handler will return a raw configuration anyway (if it only supports raw) even if a non-raw role was requested. Thus cam receives a raw configuration instead of a nullptr when no role is specified and viewfinder is requested. However, in the near future, support for raw streams with softISP on the simple pipeline handler will be merged. This will notably change the behavior of the simple pipeline handler to return nullptr if a non-raw role was requested on a platform that only supports raw. This is proper behavior according to documentation, but changes cam's behavior as it used to capture fine with no parameters but will no longer be able to. Technically this is an issue with the roles API, as we are mixing roles in the sense of "configuration hints" (eg. viewfinder vs recording vs still capture) with roles in the sense of "platform capabilities" (raw vs everything else). In the long term the proper solution is to rework the roles API. In the meantime, fix cam so that it will try the raw role if the default viewfinder role returns no configuration. cam is an app that is capable of using the raw stream, so this is appropriate behavior. If roles are specified, then do not retry, as in this situation the user knows what streams they can use and what they want. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Milan Zamazal <mzamazal@redhat.com>
2025-04-25libcamera: controls: Disallow arrays of arraysBarnabás Pőcze
Arrays of arrays, even arrays of strings, are not supported by the current `ControlValue` mechanism, so disable them for now to trigger compile time errors if attempts are made to use them. 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>
2025-04-23gstreamer: Fixate colorimetry field during caps negotiationHou Qi
When libcamerasrc is negotiating with downstream element, it first extracts colorimetry field from downstream supported caps, then set this colorimetry to its stream configuration and propagates the colorimetry downstream. Currently libamerasrc only considers the case there is one colorimetry in colorimetry field of downstream caps. But the issue is that downstream caps may report a list of supported colorimetry, which causes libcamerasrc to set unknown colorimetry to stream configuration and negotiate fail with downstream element. In order to fix the issue, need to fixate colorimetry field before getting colorimetry string. Signed-off-by: Hou Qi <qi.hou@nxp.com> Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2025-04-22utils: ipc: Do not define variables in signal handler up frontBarnabás Pőcze
Defining the variables at the beginning of the function forces the types to be default constructible, which may not be desirable; furthermore, it also forces the move/copy assignment operator to be used when the deserialized value is retrieved. Having `T val = f()` has the advantage of benefitting from potential RVO as well as not requiring `T` to be default constructible, so generate code in that form by calling `deserialize_call()` with `declare=true`. Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2025-04-22libcamera: ipa_module: Avoid unnecessary copy when getting signatureBarnabás Pőcze
The `signature()` getter can just return a reference to the private vector member variable, and let the caller make a copy if needed. Since the return type is const qualified, this was likely the original intention. 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>
2025-04-22pipeline: rkisp1: Fix vblank delayPaul Elder
The vblank delay for delayed controls was incorrectly hardcoded to 1. Get it from the camera sensor properties instead. Fixes: f72c76eb6e06 ("rkisp1: Honor the FrameDurationLimits control") 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>
2025-04-22Revert "libcamera: rkisp1: Eliminate hard-coded resizer limits"Quentin Schulz
This reverts commit e85c7ddd38ce8456ab01c2a73baf9e788f6a462e. Linux kernel predating 6.4 (specifically commit 7cfb35d3a800 ("media: rkisp1: Implement ENUM_FRAMESIZES") do not have the ioctl in rkisp1 driver required to dynamically query the resizer limits. Because of that, maxResolution and minResolution are both {0, 0} (default value for Size objects) which means filterSensorResolution() will create an entry for the sensor in sensorSizesMap_ but because the sensor resolution cannot fit inside the min and max resolution of the rkisp1, no size is put into this entry in sensorSizesMap_. On the next call to filterSensorResolution(), sensorSizesMap_.find(sensor) will return the entry but when attempting to call back() on iter->second, it'll trigger an assert because the size array is empty. Linux kernel 6.1 is supported until December 2027, so it seems premature to get rid of those hard-coded resizer limits before this happens. Let's restore the hard-coded resizer limits as fallbacks, actual limits are still queried from the driver on recent enough kernels. Fixes: 761545407c76 ("pipeline: rkisp1: Filter out sensor sizes not supported by the pipeline") Signed-off-by: Quentin Schulz <quentin.schulz@cherry.de> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2025-04-21utils: ipc: Do not duplicate signals in proxy objectBarnabás Pőcze
The specific proxy type (see `module_ipa_proxy.h.tmpl`) inherits `IPAProxy`, the specific interface type, and `Object`. The interface type already provides public definitions of the necessary `Signal<>` objects (see `module_ipa_interface.h.tmpl`), so do not duplicate them. Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2025-04-21apps: cam: capture_script: Simplify bool array parsingBarnabás Pőcze
`std::vector<bool>` is a specialization that implements a dynamic bit vector, therefore it is not suitable to provide storage for an array of `bool`. Hence a statically sized array is used when parsing an array of boolean values. Instead, use the array overload of `std::make_unique` since the size is known beforehand. Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
2025-04-21libcamera: pipeline: imx8-isi: Remove unused variableBarnabás Pőcze
The `mbusCodes` variable in `ISICameraConfiguration::validateRaw()` has been unused since 87fed432533a ("libcamera: imx8-isi: Break out RAW format selection"), so remove it. 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>
2025-04-21libcamera: pipeline: virtual: Fix typo in log messageBarnabás Pőcze
pass -> parse 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>
2025-04-17utils: rkisp1: gen-csc-table: Support printing CCM in decimalLaurent Pinchart
Add an option to the gen-csc-table.py script to output the CCM matrix in decimal format instead of hexadecimal. This makes no functional difference, but is useful to adapt to different coding styles. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Acked-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2025-04-15doc: document libtiff dependency for camPavel Machek
DNG writing is useful when working with bayer data, but libtiff is needed for that. Signed-off-by: Pavel Machek <pavel@ucw.cz> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> [Kieran: Updated text to match other entries] Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2025-04-15libcamera: software_isp: Fix CCM multiplicationMilan Zamazal
A colour correction matrix (CCM) is applied like this to an RGB pixel vector P: CCM * P White balance must be applied before CCM. If CCM is used, software ISP makes a combined matrix by multiplying the CCM by a white balance gains CCM-like matrix (WBG). The multiplication should be as follows to do it in the correct order: CCM * (WBG * P) = (CCM * WBG) * P The multiplication order in Lut software ISP algorithm is reversed, resulting in colour casts. Let's fix the order. Signed-off-by: Milan Zamazal <mzamazal@redhat.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Tested-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2025-04-15libcamera: pipeline: uvcvideo: Expose `Gamma` controlBarnabás Pőcze
Commit 294ead848c3fa2 ("libcamera: Add gamma control id") introduced the "Gamma" control, so expose it for UVC cameras as well using the `V4L2_CID_GAMMA` control. Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> Tested-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2025-04-15libcamera: request: Avoid double map lookupBarnabás Pőcze
Use `try_emplace()` that more or less combines `find()` and `operator[]` in one function. 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>
2025-04-15apps: lc-compliance: Add multi-stream testsBarnabás Pőcze
Rename the `SingleStream` test to `SimpleCapture`, and extend it to support using multiple roles. And instantiate another test suite from the `SimpleCapture` test that tests multiple streams in one capture session. Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
2025-04-15apps: lc-compliance: Support multiple streams in helpersBarnabás Pőcze
Prepare to add a test suite for capture operations with multiple streams. Modify the Capture helper class to support multiple roles and streams in the configure() and capture() operations. The buffer count of each stream is asserted to be the same. Multi-stream support will be added in next patches. Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
2025-04-14doc: Mention right meson versionPavel Machek
Documentation says 0.60, but in fact 0.63 is required. Signed-off-by: Pavel Machek <pavel@ucw.cz> 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>
2025-04-14meson: Do not automatically build documentation if sphinx-build-3 is foundQuentin Schulz
Commit aba567338b25 ("Documentation: Move all dependencies into features") did an incomplete migration of the documentation boolean option into a documentation feature. If sphinx-build-3 binary is found on the host system, the documentation is built, regardless of the value of the feature option. This makes sure that sphinx-build-3 presence is only checked if the documentation feature is not disabled (which is the default, as it's "auto" by default). This is essential for reproducibility for build systems where sphinx-build-3 may or may not be present when libcamera is built, and also to declutter the generated package if documentation isn't desired. Fixes: aba567338b25 ("Documentation: Move all dependencies into features") Signed-off-by: Quentin Schulz <quentin.schulz@cherry.de> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Quentin Schulz <quentin.schulz@cherry.de> Tested-by: Quentin Schulz <quentin.schulz@cherry.de> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2025-04-14meson: Make the default value of "documentation" feature explicitQuentin Schulz
The meson documentation on the feature build options isn't clear if a missing "value" is legal and if it is, what its default value is ([1]). Therefore, let's make it explicit by using what is experimentally the default: auto. [1] https://mesonbuild.com/Build-options.html#features Signed-off-by: Quentin Schulz <quentin.schulz@cherry.de> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>