Commit Graph

482 Commits

Author SHA1 Message Date
David Plowman
91cf84fd4e ipa: raspberrypi: Reset embedded data parser on configure
When we switch camera mode following a pipeline reconfiguration, the
embedded data parser should be "reset" to discard any data that it may
have cached and that might now be invalid.

Signed-off-by: David Plowman <david.plowman@raspberrypi.com>
Reviewed-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-08-02 13:46:05 +03:00
Jacopo Mondi
69ae75b0cc ipa: raspberry: awb: Include <functional>
Building on gcc8 on Debian 10 fails with

 asyncThread_ = std::thread(std::bind(&Awb::asyncFunc, this));
../src/ipa/raspberrypi/controller/rpi/awb.cpp:177:34: note: ‘std::bind’
is defined in header ‘<functional>’; did you forget to ‘#include
<functional>’?

Fix that by including <functional> in awb.cpp.

Fixes: c1597f9896 ("ipa: raspberrypi: Use YamlParser to replace dependency on boost")
Reported-by: https://buildbot.libcamera.org/#/builders/6/builds/414
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
2022-07-29 14:22:46 +02:00
Eric Curtin
2d2196ca0d ipa: raspberrypi: Add functional include to pwl.h
The Pwl class uses std::function, defined in <functional>, without
including the header directly. This results in a compilation error with
the Fedora 36 compiler toolchain (gcc 12.1.1):

In file included from ../src/ipa/raspberrypi/controller/rpi/awb.h:14,
                 from ../src/ipa/raspberrypi/controller/rpi/awb.cpp:14:
../src/ipa/raspberrypi/controller/rpi/../pwl.h:97:18: error: 'std::function' has not been declared
   97 |         void map(std::function<void(double x, double y)> f) const;
      |                  ^~~

Fix it by including <functional>.

Fixes: c1597f9896 ("ipa: raspberrypi: Use YamlParser to replace dependency on boost")
Signed-off-by: Eric Curtin <ecurtin@redhat.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-28 18:47:17 +03:00
Naushir Patuck
c19150ea94 ipa: raspberrypi: Remove unused Controller constructor
The Controller(char const *jsonFilename) is not valid anymore since
Controller::read() can now return an error on a failure. Additionally, this
constructor is not actually used, so remove it.

Signed-off-by: Naushir Patuck <naush@raspberrypi.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>
2022-07-28 16:17:04 +03:00
Florian Sylvestre
5b07fa2003 ipa: rkisp1: Add support of ColorProcessing control
Add ColorProcessing algorithm that is in charge to manage brightness,
contrast and saturation controls.  These controls are currently based on
user controls.

Signed-off-by: Florian Sylvestre <fsylvestre@baylibre.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-28 14:55:04 +03:00
Florian Sylvestre
7a80e01b4a ipa: rkisp1: Add support of Filter control
Denoise and Sharpness filters will be applied by RkISP1 during the
demosaicing step. The denoise filter is responsible for removing noise
from the image, while the sharpness filter will enhance its acutance.

Add filter algorithm with denoise and sharpness values based on user
controls.

Signed-off-by: Florian Sylvestre <fsylvestre@baylibre.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-28 14:55:00 +03:00
Florian Sylvestre
564537a906 ipa: rkisp1: Add support of Defect Pixel Cluster Correction control
The Defect Pixel Cluster Correction algorithm is responsible to minimize
the impact of defective pixels. The on-the-fly method is actually used,
based on coefficient provided by the tuning file.

Signed-off-by: Florian Sylvestre <fsylvestre@baylibre.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-28 14:54:57 +03:00
Florian Sylvestre
b3e96411d8 ipa: rkisp1: Add support of Lens Shading Correction control
The Lens Shading Correction algorithm applies multipliers to all pixels
to compensate for the lens shading effect. The coefficients are
specified in a downscaled table in the YAML tuning file.

Signed-off-by: Florian Sylvestre <fsylvestre@baylibre.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-28 14:54:54 +03:00
Florian Sylvestre
a9bffb7222 ipa: rkisp1: Add support of Gamma Sensor Linearization control
The GammaSensorLinearization algorithm linearizes the sensor output to
compensate the sensor non-linearities by applying piecewise linear
functions to the red, green and blue channels.

Signed-off-by: Florian Sylvestre <fsylvestre@baylibre.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-28 14:54:50 +03:00
Laurent Pinchart
c13f86704b ipa: raspberrypi: agc: Use YamlObject::getList()
Replace the manual implementation of the readList() functions with
YamlObject::getList().

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Naushir Patuck <naush@raspberrypi.com>
Tested-by: Naushir Patuck <naush@raspberrypi.com>
2022-07-28 13:48:54 +03:00
Naushir Patuck
b4cbb5c388 ipa: raspberrypi: Convert existing cameara tuning files to version 2.0
Use the convert_tuning.py script to convert all existing tuning files to
version 2.0.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Tested-by: Naushir Patuck <naush@raspberrypi.com>
2022-07-28 13:48:54 +03:00
Naushir Patuck
2ef6eafb6f ipa: raspberrypi: Introduce version 2.0 format for the camera tuning file
The existing tuning file format (version 1.0) requires the controller algorithms
to run in the same order as listed in the JSON structure. The JSON specification
does not mandate any such ordering, but the Boost JSON parser would maintain
this order.

In order to remove this reliance on the parser to provide ordering, introduce a
new version 2.0 format for the camera tuning file. In this version, the
algorithms are specified in a top level list node ("algorithms"), which does
require strict ordering of the elements.

A "version" node is added to distinguish between the version 1.0 and 2.0
formats. The absence of the "version" node implies version 1.0.

A "target" node is also added to specify the target platform for this
configuration.

Update the controller to support either version of the tuning file by looking
at the version node. CreateAlgorithm member function to now load and configure
each algorithm. Additionally, make CreateAlgorithm a private member, it does not
get called externally.

If a version 1.0 format tuning file is used, throw a warning message indicating
it will be soon deprecated.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Tested-by: Naushir Patuck <naush@raspberrypi.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-28 13:47:51 +03:00
Laurent Pinchart
c1597f9896 ipa: raspberrypi: Use YamlParser to replace dependency on boost
The Raspberry Pi IPA module depends on boost only to parse the JSON
tuning data files. As libcamera depends on libyaml, use the YamlParser
class to parse those files and drop the dependency on boost.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Tested-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Naushir Patuck <naush@raspberrypi.com>
2022-07-28 13:47:50 +03:00
Laurent Pinchart
735f0ffeaa ipa: raspberrypi: Replace Fatal log by error propagation
Replace the Fatal log messages that cause an abort during tuning data
read with Error messages and proper error propagation to the caller.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Naushir Patuck <naush@raspberrypi.com>
Tested-by: Naushir Patuck <naush@raspberrypi.com>
2022-07-28 13:47:50 +03:00
Laurent Pinchart
0821497ddd ipa: raspberrypi: Propagate errors from AGC metering tuning data read
Update the AGC metering functions that deal with reading tuning data to
propagate errors to the caller, using std::tie and std::tuple to group
the error code and return value.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Naushir Patuck <naush@raspberrypi.com>
Tested-by: Naushir Patuck <naush@raspberrypi.com>
2022-07-28 13:47:50 +03:00
Laurent Pinchart
f357b1bf6e ipa: raspberrypi: Return an error code from Algorithm::read()
When encountering errors, the Algorithm::read() function either uses
LOG(Fatal) or throws exceptions from the boost property_tree functions.
To prepare for replacing boost JSON parse with the YamlParser class,
give the Algorithm::read() function the ability to return an error code,
and propagate it all the way to the IPA module init() function.

All algorithm classes return a hardcoded 0 value for now, subsequent
commits will change that.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Naushir Patuck <naush@raspberrypi.com>
Tested-by: Naushir Patuck <naush@raspberrypi.com>
2022-07-28 13:47:49 +03:00
Laurent Pinchart
0c84c67e39 ipa: raspberrypi: Replace tabs with spaces in tuning data files
Tuning data files mostly use spaces for indentation, with occasional
stray tabs. Use spaces consistently. This allows parsing the tuning
files with libyaml, preparing to replace the dependency on boost.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Naushir Patuck <naush@raspberrypi.com>
Tested-by: Naushir Patuck <naush@raspberrypi.com>
2022-07-28 13:47:49 +03:00
Naushir Patuck
22ffeae04d ipa: raspberrypi: agc: Fix log message prefixes
Remove "Agc:" as that gets prefixed by the logging system.
s/AgcConfig/AgcMeteringMode/ and s/AgcConfig/AgcMeteringMode where appropriate.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-27 18:12:19 +03:00
Naushir Patuck
d1c89a1824 ipa: raspberrypi: Remove #define constants
Replace all #define constant values with equivalent constexpr definitions.
As a drive-by, remove the CAMERA_MODE_NAME_LEN constant as it is unused.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-27 18:12:18 +03:00
Naushir Patuck
8757cc7c42 ipa: raspberryip: Remove all exception throw statements
Replace all exception throw statements with LOG(RPi*, Fatal) error messages.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-27 18:12:18 +03:00
Naushir Patuck
f95bae418c raspberrypi: Update Copyright statement in all Raspberry Pi source files
s/Raspberry Pi (Trading) Limited/Raspberry Pi Ltd/ to reflect the new
Raspberry Pi entity name.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-27 18:12:15 +03:00
Naushir Patuck
afd2a5dac5 ipa: raspberrypi: Rename header files from *.hpp to *.h
As per the libcamera coding guidelines, rename all .hpp header files to .h.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-27 18:12:14 +03:00
Naushir Patuck
de9e95bfcc ipa: raspberrypi: Remove extern "C" declarations
Since the controller header files are now C++ specific, remove the extern "C"
declarations.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-27 18:12:14 +03:00
Naushir Patuck
acd5d9979f ipa: raspberrypi: Change to C style code comments
As part of the on-going refactor efforts for the source files in
src/ipa/raspberrypi/, switch all C++ style comments to C style comments.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-27 18:12:13 +03:00
Naushir Patuck
177df04d2b ipa: raspberrypi: Code refactoring to match style guidelines
Refactor all the source files in src/ipa/raspberrypi/ to match the recommended
formatting guidelines for the libcamera project. The vast majority of changes
in this commit comprise of switching from snake_case to CamelCase, and starting
class member functions with a lower case character.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-27 18:12:12 +03:00
Quentin Schulz
c698473440 libcamera: Correctly report enabled ipa modules
"ipa_modules" stores the value of the ipas meson build option. IPAs are
enabled if and only if there is an enabled pipeline for an IPA listed in
"ipa_modules" array. It is basically the intersection of pipelines and
ipa_modules array.

In order to correctly report which IPAs get enabled, let's create a new
array storing this intersection.

Cc: Quentin Schulz <foss+libcamera@0leil.net>
Reported-by: Daniel Semkowicz <dse@thaumatec.com>
Signed-off-by: Quentin Schulz <quentin.schulz@theobroma-systems.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
2022-07-26 17:09:55 +02:00
Florian Sylvestre
d010a51aa4 ipa: rkisp1: Transfer queueRequest() call to each algorithm
Implement rkisp1 queueRequest() function to update each algorithm with user
controls.

Signed-off-by: Florian Sylvestre <fsylvestre@baylibre.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-22 00:52:12 +03:00
Florian Sylvestre
242191fbb6 ipa: libipa: algorithm: Add queueRequest() to the Algorithm class
Add queueRequest() function to the Algorithm class. The queueRequest() function
provides controls values coming from the application to each algorithm.
Each algorithm is responsible for retrieving the controls associated to them.

Signed-off-by: Florian Sylvestre <fsylvestre@baylibre.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-22 00:51:50 +03:00
Laurent Pinchart
cf66dee4ac ipa: rkisp1: Drop unnecessary forward declarations and includes
Forward declarations of IPACameraSensorInfo and inclusion of
linux/rkisp1-config.h are not needed in headers that use them only for
arguments to functions defined by the Algorithm base class, as inclusion
of algorithm.h will bring the necessary declarations for function
arguments. Drop them.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Florian Sylvestre <fsylvestre@baylibre.com>
Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
2022-07-20 19:55:43 +03:00
Laurent Pinchart
9caee4c662 libcamera: Remove extra ':' after '\todo'
The doxygen '\todo' directory doesn't need to be followed by a colon,
yet a few strayed occurrences have made their way in. Fix them.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
2022-07-20 12:47:08 +03:00
Christian Rauch
1c4d480185 libcamera: controls: Use std::optional to handle invalid control values
Previously, ControlList::get<T>() would use default constructed objects to
indicate that a ControlList does not have the requested Control. This has
several disadvantages: 1) It requires types to be default constructible,
2) it does not differentiate between a default constructed object and an
object that happens to have the same state as a default constructed object.

std::optional<T> additionally stores the information if the object is valid
or not, and therefore is more expressive than a default constructed object.

Signed-off-by: Christian Rauch <Rauch.Christian@gmx.de>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-07-19 14:21:54 +03:00
Florian Sylvestre
3fa79cc688 ipa: rkisp1: Add support of Black Level Correction tuning
Get the Black Level Correction algorithm parameters from YAML tuning
data.

Signed-off-by: Florian Sylvestre <fsylvestre@baylibre.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-06-29 17:21:15 +03:00
Florian Sylvestre
e7ec7d4de1 ipa: rkisp1: Add OV5640 tuning file
Add the OV5640 tuning file containing default values for 'black level
correction' algorithm.

Signed-off-by: Florian Sylvestre <fsylvestre@baylibre.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-06-29 17:21:14 +03:00
Laurent Pinchart
f2869a4167 ipa: rkisp1: Add IMX219 tuning file
Add a skeleton for the IMX219 tuning file, with data for the BLC
algorithm.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
2022-06-29 17:21:13 +03:00
Florian Sylvestre
ad57d2c51d ipa: rkisp1: Add YAML tuning file support
Retrieve root node in YAML tuning file and provide to
each algorithm this YamlObject to allow them to grab their default
parameters by calling init() function.

Signed-off-by: Florian Sylvestre <fsylvestre@baylibre.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-06-29 17:21:12 +03:00
Laurent Pinchart
d22c0020ef ipa: rkisp1: Register algorithms
To prepare for dynamic instantiation of algorithms from the tuning file,
register the algorithms with the Module class.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
2022-06-29 17:21:12 +03:00
Florian Sylvestre
011a4668fb pipeline: rkisp1: Support IPA tuning file
Pass the path name of the YAML IPA tuning file to the IPA module. The
file name is derived from the sensor name ("${sensor_name}.yaml"), with
a fallback to "uncalibrated.yaml".

The tuning file name can be manually overridden with the
LIBCAMERA_RKISP1_TUNING_FILE environment variable.

Signed-off-by: Florian Sylvestre <fsylvestre@baylibre.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-06-29 17:21:11 +03:00
Laurent Pinchart
e9c53ac4d8 ipa: libipa: module: Make the Module class Loggable
To help attribute messages logged by the Module class to a particular
IPA module, make the class loggable. The logPrefix() function must be
implemented by the IPA module-specific derived class.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
2022-06-29 17:21:06 +03:00
Laurent Pinchart
7a5e23585f ipa: libipa: module: Add support for instantiation from YAML
Add a Module::createAlgorithms() function to instantiate algorithms from
a YamlObject. The instantiated algorithms are stored in a private member
variable list, exposed through the Module::algorithms() function.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
2022-06-29 17:21:05 +03:00
Florian Sylvestre
575ca88544 ipa: libipa: algorithm: Add init() function to the Algorithm class
Add the init() function that will be called during algorithm initialization
to provide each algorithm the list of algorithms tuning data.

Signed-off-by: Florian Sylvestre <fsylvestre@baylibre.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2022-06-29 17:21:04 +03:00
Laurent Pinchart
d1934c6490 ipa: libipa: algorithm: Add an algorithm registration mechanism
In order to allow dynamic instantiation of algorithms based on tuning
data files, add a mechanism to register algorithms with the IPA module.
The implementation relies on an AlgorithmFactory class and a
registration macro, similar to the pipeline handler registration
mechanism. The main difference is that the algorithm registration and
instantiation are implemented in the Module class instead of the
AlgorithmFactory class, making the factory an internal implementation
detail.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
2022-06-29 17:21:03 +03:00
Laurent Pinchart
5f94b262da ipa: libipa: Move ipa namespace documentation to module.cpp
The libipa.cpp file exists for the sole purpose of documentating the ipa
namespace. As we now have a top-level module.cpp file in libipa, move
the documentation there, and drop libipa.cpp.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
2022-06-29 17:21:02 +03:00
Laurent Pinchart
83df785493 ipa: libipa: Introduce a Module class template
libipa defines an abstract Algorithm class template that is specialized
by IPA modules. IPA modules then instantiate and manage algorithms
internally, without help from libipa. With ongoing work on tuning data
support for the RkISP1, and future similar work for the IPU3, more code
duplication for algorithms management is expected.

To address this and share code between multiple IPA modules, introduce a
new Module class template that will define and manage top-level concepts
for the IPA module.

The Module class template needs to be specialized with the same types as
the Algorithm class. To avoid manual specialization of both classes,
store the types in the Module class, and replace the template arguments
of the Algorithm class with a single Module argument from which the
other types are retrieved.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
2022-06-29 17:20:59 +03:00
Naushir Patuck
ac955c425d pipeline: ipa: raspberrypi: Correctly report available control limits
The ipa currently advertises a static ControlInfoMap to specify the available
controls and their limits. Fix this limitation by having the IPA populate a new
ControlInfoMap with updated limits for ExposureTime, AnalogueGain, and
FrameDurationLimits controls based on the current sensor mode. This new
ControlInfoMap is then returned back to the pipeline handler and available to
the application after a successful Camera::configure() call.

Before the first call to Camera::configure(), this ControlInfoMap provides some
reasonable default limits for ExposureTime, AnalogueGain, and
FrameDurationLimits. However, applications must not rely on these values, but
obtain the correct limits after the call to Camera::configure().

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>
2022-06-29 13:55:17 +01:00
Naushir Patuck
53ada24e63 pipeline: ipa: raspberrypi: Move ControlInfoMap to the IPA
Currently the pipeline handler advertises controls handled by the IPA from a
static ControlInfoMap defined in the raspberrypi.h header. This change removes
this header file, and instead the IPA returns the ControlInfoMap to the pipeline
handler from the ipa::init() function. This is done to allow the IPA to adjust
the limits of the controls based on the sensor mode in a subsequent change.

Bug: https://bugs.libcamera.org/show_bug.cgi?id=83
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>
2022-06-29 13:54:51 +01:00
Naushir Patuck
8acfb8494c ipa: raspberrypi: Use std::optional in DeviceStatus
Switch the aperture, lens_position, and flash_intensity fields in the
DeviceStatus structure to use std::optional instead of using invalid default
values.

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>
2022-06-29 12:12:07 +01:00
Naushir Patuck
95151dd06f ipa: raspberrypi: imx477: Get sensor temperature from embedded data
Fetch the sensor temperature value from the embedded data buffer and add it to
the DeviceStatus structure in CamHelperImx477::PopulateMetadata().

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>
2022-06-29 12:12:07 +01:00
Naushir Patuck
2a321be376 ipa: raspberrypi: Add sensor temperature to DeviceStatus
Add an optional sensor_temperature field to the DeviceStatus structure. If a
temperature measurement is available for a frame, the value is returned out
through the SensorTemperature control in the Request metadata.

Additionally, provide the sensor temperature value from the std::ostream &operator<<
overload.

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>
2022-06-29 12:12:07 +01:00
Jean-Michel Hautbois
4bb284e0fa ipa: ipu3: awb: Correct the gains calculation
The factor used right now in the IPU3 is 8192, as a multiplier of the
estimated gain. This is wrong, as the isp is adding 1.0 to the gain
applied, ie Pout = { Pin * (1 + Gx) }.

Fix it, and to ease the reading, introduce a small helper function.

Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2022-06-18 18:31:49 +02:00
Laurent Pinchart
5517ffbff6 libcamera: Use "..." instead of <...> consistently for internal headers
libcamera uses double quotes for #include directives for internal
headers. A few <...> have found their way in the code base over time.
Fix them.

While at it, move an Android header include to the right location.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
2022-06-01 12:08:36 +03:00