From a5eb54435e1638357ac446d418a46103f775f06c Mon Sep 17 00:00:00 2001 From: Arturo Buzarra Date: Tue, 17 Mar 2026 15:04:36 +0100 Subject: [PATCH] stm-st-stm32mp: evision: add evision libraries These libraries are required by libcamera when IPA support is enabled. Import them from the meta-OpenSTLinux layer at the openstlinux-6.6-yocto-scarthgap-mpu-v26.02.18 tag. https://onedigi.atlassian.net/browse/DEL-10021 Signed-off-by: Arturo Buzarra --- .../evision/evision-libs_1.0.7.bb | 61 ++ .../evision/files/evision-libs/LICENSE | 81 +++ .../files/evision-libs/evision-api-awb.h | 548 ++++++++++++++++++ .../files/evision-libs/evision-api-st-ae.h | 228 ++++++++ .../files/evision-libs/evision-api-utils.h | 326 +++++++++++ .../evision-libs/libevision-awb.so.1.0.7 | Bin 0 -> 91320 bytes .../evision-libs/libevision-st-ae.so.1.0.7 | Bin 0 -> 82536 bytes 7 files changed, 1244 insertions(+) create mode 100644 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/evision/evision-libs_1.0.7.bb create mode 100644 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/evision/files/evision-libs/LICENSE create mode 100644 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/evision/files/evision-libs/evision-api-awb.h create mode 100644 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/evision/files/evision-libs/evision-api-st-ae.h create mode 100644 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/evision/files/evision-libs/evision-api-utils.h create mode 100755 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/evision/files/evision-libs/libevision-awb.so.1.0.7 create mode 100755 meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/evision/files/evision-libs/libevision-st-ae.so.1.0.7 diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/evision/evision-libs_1.0.7.bb b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/evision/evision-libs_1.0.7.bb new file mode 100644 index 000000000..4aace0fd6 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/evision/evision-libs_1.0.7.bb @@ -0,0 +1,61 @@ +# Copyright (C) 2024, STMicroelectronics - All Rights Reserved +SUMMARY = "evision package to install AE an AWB algorithm libraries" +LICENSE = "SLA0044" +LIC_FILES_CHKSUM = "file://evision-libs/LICENSE;md5=91fc08c2e8dfcd4229b69819ef52827c" + +NO_GENERIC_LICENSE[SLA0044] = "evision-libs/LICENSE" +LICENSE:${PN} = "SLA0044" + +SRC_URI = "file://evision-libs/;subdir=${BPN}-${PV} \ +" + +COMPATIBLE_MACHINE = "^(aarch64)" + +# Configure evision output library dir +ST_SPECIFIC_OUTPUT_LIBDIR ??= "${libdir}" + +EVISION_LDCONF ?= "evision.conf" + +S = "${WORKDIR}/${BPN}-${PV}" + +do_configure[noexec] = "1" + +do_compile() { + # Generate specific conf file if required + if [ "${ST_SPECIFIC_OUTPUT_LIBDIR}" = "${libdir}" ]; then + bbnote "evision output libdir is default one (${libdir})" + echo "" > ${B}/${EVISION_LDCONF} + else + bbnote "evision output libdir set to ${ST_SPECIFIC_OUTPUT_LIBDIR}: generate specific conf file for ldconfig" + echo ${ST_SPECIFIC_OUTPUT_LIBDIR} > ${B}/${EVISION_LDCONF} + fi +} + +do_install() { + # includes + install -m 0755 -d ${D}${includedir}/evision + install -m 0644 ${S}/evision-libs/*.h ${D}${includedir}/evision + install -m 0644 ${S}/evision-libs/LICENSE ${D}${includedir}/evision + + # libraries + install -m 0755 -d ${D}${ST_SPECIFIC_OUTPUT_LIBDIR} + install -m 0755 ${S}/evision-libs/*.so.* ${D}${ST_SPECIFIC_OUTPUT_LIBDIR}/ + + # ldconfig file + if [ -s "${B}/${EVISION_LDCONF}" ]; then + install -d ${D}${sysconfdir}/ld.so.conf.d/ + install -m 0644 "${B}/${EVISION_LDCONF}" ${D}${sysconfdir}/ld.so.conf.d/ + fi +} + + +PACKAGES += "\ + evision-ldconf \ + " +FILES:${PN} = "${ST_SPECIFIC_OUTPUT_LIBDIR}/*.so.*" +FILES:evision-ldconf = "${sysconfdir}/ld.so.conf.d/*" +ALLOW_EMPTY:${evision-ldconf} = "1" + +RDEPENDS:${PN} += "\ + evision-ldconf \ + " diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/evision/files/evision-libs/LICENSE b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/evision/files/evision-libs/LICENSE new file mode 100644 index 000000000..8e9a4be2d --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/evision/files/evision-libs/LICENSE @@ -0,0 +1,81 @@ +SLA0044 Rev5/February 2018 + +Software license agreement + +ULTIMATE LIBERTY SOFTWARE LICENSE AGREEMENT + +BY INSTALLING, COPYING, DOWNLOADING, ACCESSING OR OTHERWISE USING THIS SOFTWARE +OR ANY PART THEREOF (AND THE RELATED DOCUMENTATION) FROM STMICROELECTRONICS +INTERNATIONAL N.V, SWISS BRANCH AND/OR ITS AFFILIATED COMPANIES +(STMICROELECTRONICS), THE RECIPIENT, ON BEHALF OF HIMSELF OR HERSELF, OR ON +BEHALF OF ANY ENTITY BY WHICH SUCH RECIPIENT IS EMPLOYED AND/OR ENGAGED AGREES +TO BE BOUND BY THIS SOFTWARE LICENSE AGREEMENT. + +Under STMicroelectronics’ intellectual property rights, the redistribution, +reproduction and use in source and binary forms of the software or any part +thereof, with or without modification, are permitted provided that the following +conditions are met: + +1. Redistribution of source code (modified or not) must retain any copyright +notice, this list of conditions and the disclaimer set forth below as items 10 +and 11. + +2. Redistributions in binary form, except as embedded into microcontroller or +microprocessor device manufactured by or for STMicroelectronics or a software +update for such device, must reproduce any copyright notice provided with the +binary code, this list of conditions, and the disclaimer set forth below as +items 10 and 11, in documentation and/or other materials provided with the +distribution. + +3. Neither the name of STMicroelectronics nor the names of other contributors to +this software may be used to endorse or promote products derived from this +software or part thereof without specific written permission. + +4. This software or any part thereof, including modifications and/or derivative +works of this software, must be used and execute solely and exclusively on or in +combination with a microcontroller or microprocessor device manufactured by or +for STMicroelectronics. + +5. No use, reproduction or redistribution of this software partially or totally +may be done in any manner that would subject this software to any Open Source +Terms. “Open Source Terms” shall mean any open source license which requires as +part of distribution of software that the source code of such software is +distributed therewith or otherwise made available, or open source license that +substantially complies with the Open Source definition specified at +www.opensource.org and any other comparable open source license such as for +example GNU General Public License (GPL), Eclipse Public License (EPL), Apache +Software License, BSD license or MIT license. + +6. STMicroelectronics has no obligation to provide any maintenance, support or +updates for the software. + +7. The software is and will remain the exclusive property of STMicroelectronics +and its licensors. The recipient will not take any action that jeopardizes +STMicroelectronics and its licensors' proprietary rights or acquire any rights +in the software, except the limited rights specified hereunder. + +8. The recipient shall comply with all applicable laws and regulations affecting +the use of the software or any part thereof including any applicable export +control law or regulation. + +9. Redistribution and use of this software or any part thereof other than as +permitted under this license is void and will automatically terminate your +rights under this license. + +10. THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY RIGHTS, WHICH ARE +DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT SHALL +STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +11. EXCEPT AS EXPRESSLY PERMITTED HEREUNDER, NO LICENSE OR OTHER RIGHTS, WHETHER +EXPRESS OR IMPLIED, ARE GRANTED UNDER ANY PATENT OR OTHER INTELLECTUAL PROPERTY +RIGHTS OF STMICROELECTRONICS OR ANY THIRD PARTY. + diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/evision/files/evision-libs/evision-api-awb.h b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/evision/files/evision-libs/evision-api-awb.h new file mode 100644 index 000000000..2fb028069 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/evision/files/evision-libs/evision-api-awb.h @@ -0,0 +1,548 @@ +/** + ****************************************************************************** + * @file evision-api-awb.h + * @author LACROIX - Impulse + * @brief eVision Auto White Balance algorithm public header. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 LACROIX - Impulse. + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +#ifndef EVISION_API_AWB_H_ +#define EVISION_API_AWB_H_ + +/************************************************************************ + * Includes + ************************************************************************/ + +#include +#include + +#include "evision-api-utils.h" + +/************************************************************************ + * Public Defines + ************************************************************************/ + +/*! @brief Maximum number of supported sensor configurations. */ +#define EVISION_AWB_MAX_SENSOR_CONFIGS (2u) +/*! @brief Default sensor configuration index. */ +#define EVISION_AWB_DEFAULT_SENSOR_CONFIG_INDEX (0u) +/*! @brief Default number of ROIs for AWB. */ +#define EVISION_AWB_DEFAULT_NB_ROI (1u) +/*! @brief Maximum number of AWB profiles. */ +#define EVISION_AWB_MAX_PROFILE_COUNT (5u) + +/*! @brief Number of CFA digital gains for AWB */ +#define EVISION_AWB_NB_DG_CFA_GAINS (4u) +/*! @brief Number of rows / columns of CCM for AWB */ +#define EVISION_AWB_CCM_SIZE (3u) +/*! @brief Size of estimated color temperatures history. Restrictions: >= 3. */ +#define EVISION_AWB_HIST_SIZE (3u) +/*! @brief Number of components for external measurements */ +#define EVISION_AWB_EXT_MEAS_SIZE (3u) + +/*! @brief Flag value to indicate the use of profile selection based AWB operation mode. */ +#define EVISION_AWB_USE_PROFILE_SELECTION_AWB (1u) + +/************************************************************************ + * Public Structures + ************************************************************************/ + +/** + * @typedef evision_awb_priv_param_runtime_t + * @brief AWB algorithm private run-time parameters, member of #evision_awb_estimator_t. + * + * @struct evision_awb_priv_param_runtime + * @brief AWB algorithm private run-time parameters, member of #evision_awb_estimator_t. + */ +typedef struct evision_awb_priv_param_runtime { + /*! @brief + * Current convergence speed.
+ * Restrictions: Internal algorithm parameter. Must not be changed!
+ * Default value: 1.0 + */ + double speed_p_value; + /*! @brief + * Flag to indicate change in estimated AWB color temperature.
+ * Restrictions: Internal algorithm parameter. Must not be changed!
+ * Default value: 0 + */ + uint8_t temp_changed; + /*! @brief + * AWB internal color temperature.
+ * Restrictions: Internal algorithm parameter. Must not be changed!
+ * Default value: -1.0 + */ + double int_temp; + /*! @brief + * T value parameter.
+ * Restrictions: Internal algorithm parameter. Must not be changed!
+ * Default value: 0.1 */ + double t_value; + + /*! @brief + * Flag to indicate the estimator has entered an oscillatory state.
+ * Restrictions: >=0 AND < #EVISION_AWB_HIST_SIZE + */ + uint8_t oscillation; + /*! @brief + * History of selected profile color temperatures.
+ */ + double hist_temp_current[EVISION_AWB_HIST_SIZE]; + /*! @brief + * History of computed color temperatures.
+ */ + double hist_temp_estim[EVISION_AWB_HIST_SIZE]; + /*! @brief + * History of computed chromaticity stats.
+ */ + double hist_stats[EVISION_AWB_HIST_SIZE][2u]; + /*! @brief + * Counter for the current number of items in history.
+ * Restrictions: >=0 AND < #EVISION_AWB_HIST_SIZE + */ + uint16_t cnt_hist; + +} evision_awb_priv_param_runtime_t; + +/** + * @typedef evision_awb_profile_t + * @brief AWB algorithm profile definition. + * + * @struct evision_awb_profile + * @brief AWB algorithm profile definition. + */ +typedef struct evision_awb_profile { + /*! @brief + * The color temperature of the illumination for which the profile is defined. + * Positive value, typical range of values is between 2000 and 10000 °Kelvin.
+ * Restrictions: Internal algorithm parameter set during initialization, must not be changed during run-time.
+ */ + float color_temperature; + /*! @brief + * The sensor/ISP channel gains.
+ * Note: The individual gain values are stored using the float type. + * The gains can be stored as ratios or as floating point representations of integer values. + * It is up to the user to convert the values to the format expected by the sensor/ISP. + */ + float gain_values[EVISION_AWB_NB_DG_CFA_GAINS]; + /*! @brief + * The ISP color correction matrix coefficients.
+ * Note: The individual color correction matrix coefficients are stored using the float type. + * The coefficients can be stored as ratios or as a floating point representation of integer values. + * It is up to the user to convert the values to the format expected by the sensor/ISP. + */ + float ccm_coefficients[EVISION_AWB_CCM_SIZE][EVISION_AWB_CCM_SIZE]; + /*! @brief + * The ISP color correction matrix offset coefficients.
+ * Note: The individual color correction matrix offset coefficients are stored using the float type. + * The coefficients can be stored as ratios or as a floating point representation of integer values. + * It is up to the user to convert the values to the format expected by the sensor/ISP. + */ + float ccm_offsets[EVISION_AWB_CCM_SIZE]; +} evision_awb_profile_t; + +/** + * @typedef evision_awb_calib_data_t + * @brief Sensor specific AWB calibration data, member of #evision_awb_estimator_t. + * + * @struct evision_awb_calib_data + * @brief Sensor specific AWB calibration data, member of #evision_awb_estimator_t. + * + * Contains sensor specific AWB calibration data for accurate color rendering. + * Support for both continious AWB and profile selection based AWB. + * + */ +typedef struct evision_awb_calib_data { + /*! @brief + * Minimum supported color temperature.
+ * Restrictions: Internal algorithm parameter, positive valued. Set during estimator initialization. + */ + double min_temp; + /*! @brief + * Maximum supported color temperature.
+ * Restrictions: Internal algorithm parameter, positive valued and > #min_temp. Set during estimator initialization. + */ + double max_temp; + + /* ############################## + Parameters for continuous AWB + */ + + /* ################################# + Parameters for profile based AWB + */ + + /*! @brief + * Counter for the actual number of specified profiles.
+ * Restrictions: Internal algorithm parameter set during initialization. Must not be changed during runtime. + * Range of possible values: > 0 and < #EVISION_AWB_MAX_PROFILE_COUNT + */ + uint16_t profiles_count; + + /*! @brief + * Array containing the color temperatures of the defined profiles.
+ * Restrictions: Internal algorithm parameter set during initialization. Must not be changed during runtime. + */ + float temperatures[EVISION_AWB_MAX_PROFILE_COUNT]; + + /*! @brief + * Array containing the decision thresholds between the different profiles for profile selection.
+ * Restrictions: Internal algorithm parameter set during initialization. Must not be changed during runtime. + */ + float decision_thresholds[EVISION_AWB_MAX_PROFILE_COUNT - 1]; + + /*! @brief + * Array containing the different AWB profiles.
+ * Restrictions: Internal algorithm parameter set during initialization. Must not be changed during runtime. + */ + evision_awb_profile_t profiles[EVISION_AWB_MAX_PROFILE_COUNT]; + + /*! @brief + * Pointer to the active profile.
+ * Restrictions: Internal algorithm parameter updated during runtime. Code outside of the library must not alter its value. + */ + evision_awb_profile_t* active_profile; + +} evision_awb_calib_data_t; + +/** + * @typedef evision_awb_hyper_param_t + * @brief AWB algorithm hyper-parameters, member of #evision_awb_estimator_t. + * + * @struct evision_awb_hyper_param + * @brief AWB algorithm hyper-parameters, member of #evision_awb_estimator_t. + * + */ +typedef struct evision_awb_hyper_param { + /*! @brief + * Ratio of pixels to be processed for AWB when using the SW statistics extraction block, direct impact on processing time. + * (Ex. A value of 2 will process 1 pixel every 2*2 pixel block in the entire ROI).
+ * Restrictions: >= 1 AND < image_size.
+ * Default value: 1 */ + uint16_t awb_process_ratio; + + /*! @brief + * AWB low luminance threshold value when using the SW statistics extraction block. + * Skip pixel from AWB stats if luminance value below the threshold.
+ * Restrictions: >= 0 AND < #y_thresh_high.
+ * Default value: 0 */ + double y_thresh_low; + /*! @brief + * AWB high luminance threshold value when using the SW statistics extraction block. + * Skip pixel from AWB stats if luminance value above the threshold.
+ * Restrictions: > #y_thresh_low AND <= 255.
+ * Default value: 0 */ + double y_thresh_high; + + /*! @brief + * Convergence speed increment.
+ * Restrictions: > 0 AND < #speed_p_max.
+ * Default value: 0.1 */ + double speed_p_increment; + /*! @brief + * Minimum convergence speed.
+ * Restrictions: > 0 AND < #speed_p_max.
+ * Default value: 1.0 */ + double speed_p_min; + /*! @brief + * Maximum convergence speed.
+ * Restrictions: > #speed_p_min.
+ * Default value: 3.0 */ + double speed_p_max; + + /*! @brief + * AWB color temperature estimation precision.
+ * Default value: 1 °K */ + double precision_temp; + + /*! @brief + * Offset around the decision threshold for hysteresis based decision for profile selection.
+ * Default value: 50 °K */ + float hysteresis_offset; + + /*! @brief + * Threshold of acceptable chromatic deviation around neutrality for convergence.
+ * Restrictions: > 0.
+ * Default value: 1.0. */ + float conv_criterion; + + /*! @brief + * Threshold of acceptable chromatic deviation along the green-magenta axis. + * Inhibit profile switch if the green or magenta component is higher than this threshold.
+ * Restrictions: > 0.
+ * Default value: 0.5. */ + float gm_tolerance; + + /*! @brief + * Tolerance parameter to assess color temperature similarity: assume same colour temperature if absolute difference smaller than this value. + * Parameter of the profile selection oscillation detection logic.
+ * Restrictions: > 0 and >= 2 * #hysteresis_offset
+ * Default value: 175 K. */ + float ct_tolerance; + + /*! @brief + * Tolerance parameter to assess similarity of AWB statistics: assume identical statistics if euclidean norm smaller than this value. + * Parameter of the profile selection oscillation detection logic.
+ * Restrictions: > 0.
+ * Default value: 1.5. */ + float stats_tolerance; + +} evision_awb_hyper_param_t; + +/** + * @typedef evision_awb_estimator_t + * @brief AWB estimator structure. + * + * @struct evision_awb_estimator + * @brief AWB estimator structure. + * + * Set of all data structures required for the functioning of the AWB algorithm. + */ +typedef struct evision_awb_estimator { + /*! @brief + * Indicates the state of the AWB algorithm.
+ * Restrictions: Internal algorithm parameter. Must not be changed!
+ * Possible values: see #evision_state_t */ + evision_state_t state; + + /*! @brief + * Computed sensor/ISP gain values stored as float values. + * To be applied to the sensor/ISP after conversion to the format expected by the sensor/ISP.
+ * Restrictions: Internal algorithm parameter. Must not be changed!
+ * Note: Storing values as floats provides the required flexibility to support different sensors and ISPs. + * Converting the float value to the specific sensor/ISP format is to be performed at application level. + */ + float dg_cf[EVISION_AWB_NB_DG_CFA_GAINS]; + /*! @brief + * Computed ISP CCM coefficients stored as float values. + * To be applied to the sensor/ISP after conversion to the format expected by the sensor/ISP.
+ * Restrictions: Internal algorithm parameter. Must not be changed!
+ * Note: Storing values as floats provides the required flexibility to support different sensors and ISPs. + * Converting the float value to the specific sensor/ISP format is to be performed at application level. + */ + float ccm[EVISION_AWB_CCM_SIZE][EVISION_AWB_CCM_SIZE]; + /*! @brief + * Computed ISP CCM offset coefficients stored as float values. + * To be applied to the sensor/ISP after conversion to the format expected by the sensor/ISP.
+ * Restrictions: Internal algorithm parameter. Must not be changed!
+ * Note: Storing values as floats provides the required flexibility to support different sensors and ISPs. + * Converting the float value to the specific sensor/ISP format is to be performed at application level. + */ + float ccm_offsets[EVISION_AWB_CCM_SIZE]; + + /*! @brief + * Estimated color temperature.
+ * Restrictions: Internal algorithm parameter. Must not be changed!
+ * Default value: 5000 °K + */ + double out_temp; + + /*! @brief + * Select the AWB operating mode.
+ * Restrictions: Only profile selection AWB is currently supported. + */ + uint8_t awb_mode; + + /*! @brief + * The set of run-time variables.
+ * Restrictions: Internal algorithm parameters. + * Must not be changed! */ + evision_awb_priv_param_runtime_t runtime_vars; + + /*! @brief + * AWB calibration data.
+ * Restrictions: Internal algorithm parameter. + * Must be set during initialization using the provided functions! + * Must not be changed during runtime! */ + evision_awb_calib_data_t calib_data; + + /*! @brief + * The set of AWB algorithm hyper-parameters. Set to default values during initialization!
+ * As a general note, the hyper-parameters can be updated from their default values. + * Care must be taken as in such a case there is no guarantee of proper functioning of the estimator!
+ * Restrictions: Must not be updated during runtime! + */ + evision_awb_hyper_param_t hyper_params; + + /*! @brief + * Handler to output logs.
*/ + evision_api_log_callback log_cb; + +} evision_awb_estimator_t; + +/************************************************************************ + * Public Variables + ************************************************************************/ + +/************************************************************************ + * Public Function Prototypes + ************************************************************************/ + +/************************************************************************ + * Public Function Definitions + ************************************************************************/ + +/** + * @fn evision_awb_estimator_t* evision_api_awb_new(void); + * @brief Create a new #evision_awb_estimator_t instance. + * + * @param[in] log_cb Callback to output logs. + * @return The address of the created instance. NULL if it failed. + * + * This function performs dynamic memory allocations for the AWB estimator. + * If the process fails, NULL is returned. + * + * @warning Allocates memory. Free memory with evision_api_awb_delete(). + */ +evision_awb_estimator_t* evision_api_awb_new(evision_api_log_callback log_cb); + +/** + * @fn evision_return_t evision_api_awb_delete(evision_awb_estimator_t* self); + * @brief Releases the memory allocated for the #evision_awb_estimator_t estimator instance. + * + * @param[in, out] self Concerned estimator instance address. + * @return + * - EVISION_RET_SUCCESS + * - EVISION_RET_PARAM_ERR + * + * This function releases the memory allocated for an AWB estimator. + * To be called when the estimator is no longer required. + */ +evision_return_t evision_api_awb_delete(evision_awb_estimator_t* self); + +/** + * @brief Set the parameters of the input AWB profile structure. + * + * @param[in, out] awb_profile AWB profile structure. + * @param[in] color_temperature Color temperature of the illumination used to derive the profile parameters. + * @param[in] cfa_gains Array containing the sensor/ISP channel gains. + * @param[in] ccm_coefficients Matrix containing the color correction matrix coefficients. + * @param[in] ccm_offsets Array containing the color correction matrix offsets. + * + */ +void evision_api_awb_set_profile(evision_awb_profile_t* awb_profile, + float color_temperature, const float cfa_gains[EVISION_AWB_NB_DG_CFA_GAINS], + const float ccm_coefficients[EVISION_AWB_CCM_SIZE][EVISION_AWB_CCM_SIZE], + const float ccm_offsets[EVISION_AWB_CCM_SIZE]); + +/** + * @brief Initialize the AWB profiles from user supplied data. + * The library supports a variable number of profiles from a minimum of 1 up to a max number of #EVISION_AWB_MAX_PROFILE_COUNT. + * + * @param[in, out] self AWB estimator to be initialized. + * @param[in] min_temp Minimum supported color temperature, positive value. + * @param[in] max_temp Maximum supported color temperature, positive value and greater than min_temp. + * @param[in] nb_profiles The number of defined profiles, between 1 and #EVISION_AWB_MAX_PROFILE_COUNT. + * @param[in] decision_thresholds The decision thresholds between profiles in degrees Kelvin. A total of nb_profiles - 1 decision thresholds must be provided. + * @param[in] awb_profiles Array of profile data, a total of nb_profiles must be provided. + * @return + * - EVISION_RET_SUCCESS + * - EVISION_RET_PARAM_ERR + * - EVISION_RET_FAILURE + * + * The min_temp parameter must be at most equal to the smallest color temperature of the defined profiles. + * The max_temp parameter must be at least equal to the highest color temperature of the defined profiles. + * + * The profiles must be unique with respect to the color temperature of the illumination and must be specified in ascending order. + * The choice of the actual number of profiles and the color temperature of the illumination for each profile is + * generally dependent on the intended application and/or the available hardware equipement for generating the calibration data. + * They must be complete in the sense that they must contain all the required fields (channel gains and color correction coefficients). + * It is the user's responsibility to ensure that this is indeed the case. + * + * The decision thresholds must be unique and specified in ascending order. + * Between each pair of adjacent profiles there must be exactly one decision threshold. + * The exact strategy for choosing the decision thresholds between adjacent thresholds (e.g. halfway, 1/3 - 2/3, etc.) + * is a tuning strategy which generally depends on the intended application and the choice of the profiles. + * + */ +evision_return_t evision_api_awb_init_profiles(evision_awb_estimator_t* const self, + double min_temp, double max_temp, + uint16_t nb_profiles, float decision_thresholds[EVISION_AWB_MAX_PROFILE_COUNT - 1], + evision_awb_profile_t awb_profiles[EVISION_AWB_MAX_PROFILE_COUNT]); + +/** + * @brief Run the AWB estimator on the full frame data. + * + * @param[in] self Concerned estimator instance address. + * @param[in] image Current frame. + * @param[in] use_ext_meas Flag to indicate the use of external AWB measurement: 0 - use internal AWB measurement, > 0 - use external measurement. + * @param[in] ext_meas External measurement vector, contains average R, G, B values. + * @return + * - EVISION_RET_INVALID_VALUE + * - EVISION_RET_SUCCESS + * - EVISION_RET_PARAM_ERROR + * - EVISION_RET_FAILURE + * + * Run an execution of the control loop on the current camera setup and frame. + * The parameters #evision_awb_estimator_t.ccm and #evision_awb_estimator_t.dg_cf are updated to reflect the new CCMs and channel gains to apply. + * + * The software statistics extraction block, if used, will consider the entire data frame in the extraction of the AWB statistics. + * The parameter #evision_awb_hyper_param_t.awb_process_ratio defines a ratio of pixels to check PER row and PER column. + * It serves to reduce the computational requirements for AWB statistics extraction. + * For example: a process_ratio of 4 means that for every 4 pixels per row and per column, (block of 16 pixels) only 1 is considered. + * For small to moderate values, the loss in accuracy is mostly negligeable with non-negligeable improvements in computational time. + * + * The average R, G, and B values provided by the external \[hardware\] measurement block must be in the range \[0, 255\]. + * If the data is in a different range, the average values must be converted to this range before being passed as parameters to the function. + * + * The switch at run-time between using the internal software measurements and the external \[hardware\] measurements is not supported. + * + * Raises: + * - EVISION_LOGSEV_INFO + * - EVISION_LOGSEV_WARNING + * - EVISION_LOGSEV_ERROR + */ +evision_return_t evision_api_awb_run_average(evision_awb_estimator_t* const self, const evision_image_t* const image, + uint8_t use_ext_meas, double ext_meas[EVISION_AWB_EXT_MEAS_SIZE]); + +#ifdef ALGO_SW_STATISTICS +/** + * @brief Run the AWB estimator on the selected ROIs. + * + * @param[in] self Concerned estimator instance address. + * @param[in] image Current frame. + * @param[in] roi_array Set of ROIs where the process will be applied, other regions will not be considered. + * @param[in] use_ext_meas Flag to indicate the use of external AWB measurement: 0 - use internal AWB measurement, > 0 - use external measurement. + * @param[in] ext_meas External measurement vector, contains average R, G, B values. + * @return + * - EVISION_RET_INVALID_VALUE + * - EVISION_RET_SUCCESS + * - EVISION_RET_PARAM_ERROR + * - EVISION_RET_FAILURE + * + * Run an execution of the control loop on the current camera setup and frame. + * The parameters #evision_awb_estimator_t.ccm and #evision_awb_estimator_t.dg_cf are updated to reflect the new CCMs and channel gains to apply. + * + * The software statistics extraction block, if used, will only considered the pixels within the specified ROIs. + * The parameter #evision_awb_hyper_param_t.awb_process_ratio defines, within the ROI to check, a portion of pixels to check PER row and PER column. + * It serves to reduce the computational requirements for AWB statistics extraction. + * For example: a process_ratio of 4 means that for every 4 pixels per row and per column, (block of 16 pixels) only 1 is considered. + * For small to moderate values, the loss in accuracy is mostly negligeable with non-negligeable improvements in computational time. + * + * The average R, G, and B values provided by the external \[hardware\] measurement block must be in the range \[0, 255\]. + * If the data is in a different range, the average values must be converted to this range before being passed as parameters to the function. + * + * The switch at run-time between using the internal software measurements and the external \[hardware\] measurements is not supported. + * + * Raises: + * - EVISION_LOGSEV_INFO + * - EVISION_LOGSEV_WARNING + * - EVISION_LOGSEV_ERROR + */ +evision_return_t evision_api_awb_run_roi(evision_awb_estimator_t* const self, + const evision_image_t* const image, const evision_roi_array_t* const roi_array, + uint8_t use_ext_meas, double ext_meas[EVISION_AWB_EXT_MEAS_SIZE]); +#endif + +#endif /* EVISION_API_AWB_H_ */ diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/evision/files/evision-libs/evision-api-st-ae.h b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/evision/files/evision-libs/evision-api-st-ae.h new file mode 100644 index 000000000..3d34f2268 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/evision/files/evision-libs/evision-api-st-ae.h @@ -0,0 +1,228 @@ +/** + ****************************************************************************** + * @file evision-api-st-ae.h + * @author STMicroelectronics / LACROIX - Impulse + * @brief ST eVision Auto Exposure algorithm public header. + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * Copyright (c) 2023 LACROIX - Impulse. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef EVISION_API_ST_AE_H_ +#define EVISION_API_ST_AE_H_ + +/* Includes ------------------------------------------------------------------*/ +#include +#include +#include "evision-api-utils.h" + +/* Exported types ------------------------------------------------------------*/ +typedef struct evision_st_ae_hyper_param { + /*! @brief + * Target exposure to reach.
+ * Restrictions: >= 0 AND < 256.
+ * Default value: 56 */ + uint32_t target; + /*! @brief + * Max delta between lum stat and target in convergence region
+ * Restrictions: >= 0 AND < 256.
+ * Default value: 10 */ + uint32_t tolerance; + /*! @brief + * Factor applied to increment gain update
+ * Restrictions: >= 0 AND < 1000.
+ * Default value: 100 */ + uint32_t gain_increment_coeff; + /*! @brief + * Max delta value between lum stat and target in low delta region
+ * Restrictions: >= 0 AND < 256.
+ * Default value: 45 */ + uint32_t gain_low_delta; + /*! @brief + * Min delta value between lum stat and target in high delta region
+ * Restrictions: >= 0 AND < 256.
+ * Default value: 120 */ + uint32_t gain_high_delta; + /*! @brief + * Maximum gain update value in luminance low delta region
+ * Restrictions: >= #gain_min AND < #gain_max.
+ * Default value: 1500 */ + uint32_t gain_low_increment_max; + /*! @brief + * Maximum gain update value in luminance medium delta region
+ * Restrictions: >= #gain_min AND < #gain_max.
+ * Default value: 6000 */ + uint32_t gain_medium_increment_max; + /*! @brief + * Maximum gain update value in luminance high delta region
+ * Restrictions: >= #gain_min AND < #gain_max.
+ * Default value: 12000 */ + uint32_t gain_high_increment_max; + /*! @brief + * Factor applied to increment exposure
+ * Restrictions: >= 0.0 AND < 1.
+ * Default value: 0.020*/ + double exposure_up_ratio; + /*! @brief + * Minimum value accepted for exposure time.
+ * Restrictions: >= 0.0 AND < 1.
+ * Default value: 0.004*/ + double exposure_down_ratio; + /*! @brief + * Minimum value accepted for exposure time.
+ * Restrictions: >= 0.0 AND < #exposure_max.
+ * Default value: 0.0*/ + uint32_t exposure_min; + /*! @brief + * Maximum value accepted for exposure time.
+ * Restrictions: > 0.0 AND >= #exposure_min.
+ * Default value: 1.0 */ + uint32_t exposure_max; + /*! @brief + * Minimum possible gain value.
+ * Restrictions: > 1 AND < #gain_max.
+ * Default value: 1 */ + uint32_t gain_min; + /*! @brief + * Maximum possible gain value.
+ * Restrictions: >= 1 AND > #gain_min.
+ * Default value: 1 */ + uint32_t gain_max; + /*! @brief + * Luminance limit where we consider the frame as dark.
+ * Restrictions: >= 0 AND < 256.
+ * Default value: 5 */ + uint32_t dark_zone_lum_limit; + /*! @brief + * Compatible light frequency in Hz to avoid flickering effect.
+ * Restrictions: >= 0 (None) AND < 256.
+ * Default value: 0 (None) */ + uint32_t compat_freq; + +} evision_st_ae_hyper_param_t; + +/** + * @typedef evision_ae_estimator_t + * @brief AE estimator structure. + * + * @struct evision_ae_estimator + * @brief AE estimator structure. + * + * Set of all data structures required for the functioning of the AE algorithm. + */ +typedef struct evision_st_ae_process_t { + /*! @brief + * Indicates the state of the AE algorithm.
+ * Restrictions: Internal algorithm parameter. Must not be changed!
+ * Possible values: see #evision_state_t */ + evision_state_t state; + /*! @brief + * Computed exposure time to apply to sensor.
+ * Restrictions: Internal algorithm parameter. Must not be changed! */ + uint32_t new_exposure; + + /*! @brief + * Computed gain value to apply to sensor.
+ * Restrictions: Internal algorithm parameter. Must not be changed! */ + uint32_t new_gain; + + /*! @brief + * The set of AE algorithm hyper-parameters. Set to default values at creation!
+ * #evision_ae_hyper_param_t.exposure_min, #evision_ae_hyper_param_t.exposure_max, + * #evision_ae_hyper_param_t.gain_min and #evision_ae_hyper_param_t.gain_max hyper-parameters + * must be updated before running the ae process with respect to the sensor in use.
+ * As a general note, the hyper-parameters can be updated from their default values. + * Care must be taken as in such a case there is no guarantee of proper functioning of the process!
+ * Restrictions: Must not be updated during runtime! + */ + evision_st_ae_hyper_param_t hyper_params; + + /*! @brief + * Handler to output logs.
*/ + evision_api_log_callback log_cb; + +} evision_st_ae_process_t; + +/* Exported constants --------------------------------------------------------*/ +#define EVISION_ST_AEC_LUM_TARGET 56 /* Default luminance value targeted by the AE algorithm */ +#define EVISION_ST_AEC_TOLERANCE 10 /* Max delta between lum stat and target in convergence region */ +#define EVISION_ST_AEC_GAIN_INCREMENT_COEFF 100 /* Factor applied to increment gain update */ +#define EVISION_ST_AEC_GAIN_LOW_DELTA 45 /* Max delta value between lum stat and target in low delta region */ +#define EVISION_ST_AEC_GAIN_HIGH_DELTA 120 /* Min delta value between lum stat and target in high delta region */ +#define EVISION_ST_AEC_GAIN_LOW_INC_MAX 1500 /* Maximum gain update value in luminance low delta region */ +#define EVISION_ST_AEC_GAIN_MEDIUM_INC_MAX 6000 /* Maximum gain update value in luminance medium delta region */ +#define EVISION_ST_AEC_GAIN_HIGH_INC_MAX 12000 /* Maximum gain update value in luminance high delta region */ +#define EVISION_ST_AEC_EXPOSURE_UP_RATIO 0.020F /* Factor applied to increment exposure */ +#define EVISION_ST_AEC_EXPOSURE_DOWN_RATIO 0.004F /* Factor applied to decrement exposure */ +#define EVISION_ST_AEC_DARKZONE_LUM_LIMIT 5 /* Default value for dark zone luminance limit */ +#define EVISION_ST_DEFAULT_EXPOSURE_MIN 0 /* Default value for exposure min */ +#define EVISION_ST_DEFAULT_EXPOSURE_MAX 33000 /* Default value for expsoure max */ +#define EVISION_ST_DEFAULT_GAIN_MIN 1 /* Default value for gain min */ +#define EVISION_ST_DEFAULT_GAIN_MAX 100 /* Default value for gain max */ +#define EVISION_ST_DEFAULT_COMPAT_FREQ 0 /* Default value for compatible frequency */ + + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +/** + * @fn evision_st_ae_process_t* evision_api_st_ae_new(void); + * @brief Create a new #evision_st_ae_process_t instance. + * + * @param[in] log_cb Callback to output logs. + * @return The address of the created instance. NULL if it failed. + */ +evision_st_ae_process_t* evision_api_st_ae_new(evision_api_log_callback log_cb); + +/** + * @fn evision_return_t evision_api_st_ae_delete(evision_st_ae_process_t* self); + * @brief Releases the memory allocated for the #evision_st_ae_process_t ae process instance. + * + * @param[in, out] ae process instance address. + * @return + * - EVISION_RET_SUCCESS + * - EVISION_RET_PARAM_ERR + + */ +evision_return_t evision_api_st_ae_delete(evision_st_ae_process_t* self); + +/** + * @fn evision_return_t evision_api_st_ae_init(evision_st_ae_process_t* const self) + * @brief Initialize the AE process structure. + * + * @param[in, out] self AE process to be initialized. + * @return + * - EVISION_RET_SUCCESS + * - EVISION_RET_PARAM_ERROR + * + * Initializes the AE process structure. Hyper params can later be modified. + */ +evision_return_t evision_api_st_ae_init(evision_st_ae_process_t* const self); + +/** + * @fn evision_return_t evision_api_st_ae_process(evision_st_ae_process_t* const self, uint32t_t current_gain, uint32_t current_exposure, uint8_t average_lum) + * @brief Run the ae process to calculate new gain and expsoure + * + * @param[in, out] self Concerned process instance address. + * @param[in] current_gain Current sensor gain in mdB. + * @param[in] current_exposure Current sensor exposure microsecond. + * @param[in] average_lum Average luminance measurement value. Range should normally be between 0 (completely dark image) and 255 (completely white image). + * + * @return + * - EVISION_RET_SUCCESS + * - EVISION_RET_FAILURE + */ +evision_return_t evision_api_st_ae_process(evision_st_ae_process_t* const self, uint32_t current_gain, uint32_t current_exposure, uint8_t average_lum); + +/* Exported variables --------------------------------------------------------*/ + +#endif /* EVISION_API_ST_AE_H_ */ diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/evision/files/evision-libs/evision-api-utils.h b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/evision/files/evision-libs/evision-api-utils.h new file mode 100644 index 000000000..4a4d9f121 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/evision/files/evision-libs/evision-api-utils.h @@ -0,0 +1,326 @@ +/** + ****************************************************************************** + * @file evision-api-utils.h + * @author LACROIX - Impulse + * @brief eVision utilitary public header. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 LACROIX - Impulse. + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +#ifndef EVISION_API_UTILS_H_ +#define EVISION_API_UTILS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/************************************************************************ + * Includes + ************************************************************************/ + +#include + +/************************************************************************ + * Public Defines + ************************************************************************/ + +/** + * @def EVISION_MIN + * @brief Determine the lowest value between a and b + */ +#define EVISION_MIN(a, b) ((a) < (b) ? (a) : (b)) + +/** + * @def EVISION_MAX + * @brief Determine the greatest value between a and b + */ +#define EVISION_MAX(a, b) ((a) > (b) ? (a) : (b)) + +/** + * @def EVISION_SIGN + * @brief Determine the sign of a number. + */ +#define EVISION_SIGN(x) ((x) > 0.0f ? 1.0f : -1.0f) + +#ifdef ALGO_SW_STATISTICS +/* YUV parameters */ +/*! @brief Minimum of Y value due to ISP RGB 2 YUV conversion formula */ +#define EVISION_YUV_MIN_Y_VAL (16.0) +/*! @brief Maximum of Y value due to ISP RGB 2 YUV conversion formula */ +#define EVISION_YUV_MAX_Y_VAL (235.140625) +/*! @brief YUV factor value due to ISP RGB 2 YUV conversion formula */ +#define EVISION_YUV_FACTOR (256) +/*! @brief YUV maximum value due to ISP RGB 2 YUV conversion formula */ +#define EVISION_YUV_MAX_VAL (255) +/*! @brief range of Y value due to ISP RGB 2 YUV conversion formula */ +#define EVISION_YUV_RANGE_Y_VAL (EVISION_YUV_MAX_Y_VAL - EVISION_YUV_MIN_Y_VAL) +#endif + +/** + * @typedef evision_return_t + * @brief Return type for functions. + * + * @enum evision_return + * @brief Return type for functions. + * + * Return code that must be checked to be sure the output of the function is valid. + */ +typedef enum evision_return { + EVISION_RET_INVALID_VALUE = 2, /*!< The process succeeded but the output value is invalid and should not be used.*/ + EVISION_RET_SUCCESS = 1, /*!< the process succeeded. */ + EVISION_RET_FAILURE = 0, /*!< Error: There was a failure. */ + EVISION_RET_PARAM_ERR = -1, /*!< Error: A parameter is invalid. */ + EVISION_RET_DIMENSION_ERR = -2, /*!< Error: A dimension is incompatible with the process. */ + EVISION_RET_MEMORY_ERR = -3, /*!< Error: Could not allocate memory. */ + EVISION_RET_FILE_ERR = -4, /*!< Error: A file could not be opened */ + EVISION_RET_FORMAT_ERR = -5, /*!< Error: the specified format is invalid. */ +} evision_return_t; + +/** + * @typedef evision_state_t + * @brief Describes the state of the estimator. + * + * @enum evision_state + * @brief Describes the state of the estimator. + */ +typedef enum evision_state { + /*! @brief + * The estimator exists. + */ + EVISION_STATE_NONE = 0u, + /*! @brief + * The estimator was initialized and is ready to run. + */ + EVISION_STATE_INIT = 1u, + /*! @brief + * The estimator is running. + */ + EVISION_STATE_RUN = 2u, +} evision_state_t; + +/** + * @typedef evision_image_format_t + * @brief Specify the format under which the image is stored. + * + * @enum evision_image_format + * @brief Specify the format under which the image is stored. + * + * Those formats are as the ones defined by V4L2. + */ +typedef enum evision_image_format { + /*! @brief + * 8 bit gray-level. + */ + EVISION_IMAGE_FORMAT_GRAY8 = 0u, + /*! @brief + * 8 bit gray-level. + */ + EVISION_IMAGE_FORMAT_GREY8 = 1u, + /*! @brief + * RGB interleaved, 8 bit per channel, 24 bit per pixel.. + */ + EVISION_IMAGE_FORMAT_RGB8 = 2u, + /*! @brief + * BGR interleaved, 8 bit per channel, 24 bit per pixel.. + */ + EVISION_IMAGE_FORMAT_BGR8 = 3u, + /*! @brief + * 8 bit YUV 422 SP format. + */ + EVISION_IMAGE_FORMAT_YUV422SP = 4u, + /*! @brief + * RGGB Bayer format, 8 bit per channel, Red compound first. + */ + EVISION_IMAGE_FORMAT_RGGB8 = 5u, + /*! @brief + * BGGR Bayer format, 8 bit per channel, Blue compound first. + */ + EVISION_IMAGE_FORMAT_BGGR8 = 6u, + /*! @brief + * GRBG Bayer format, 16 bit per channel, each coded on 16 bits inverted (0xFF, 0x0F). + */ + EVISION_IMAGE_FORMAT_GRBG12 = 7u, + /*! @brief + * RGGB Bayer format, 16 bit per channel, each coded on 16 bits inverted (0xFF, 0x0F). + */ + EVISION_IMAGE_FORMAT_RGGB12 = 8u +} evision_image_format_t; + +/************************************************************************ + * Public Functions Signatures + ************************************************************************/ + +/** + * @brief Callback function to output logs. + * + * @param[in] msg Received message. + * + * If the user wants to handle the log and messages yielded by the estimator, + * a function with this signature must be specified. + * + */ +typedef void (*evision_api_log_callback)(const char* const msg); + +/************************************************************************ + * Public Structures + ************************************************************************/ + +/** + * @typedef evision_image_t + * @brief Structure to hold frame data and metadata for eVision AE and AWB algorithms. + * + * @struct evision_image + * @brief Structure to hold frame data and metadata for eVision AE and AWB algorithms. + * + */ +typedef struct evision_image { + /*! @brief + * Frame data. + */ + uint8_t* pdata; + /*! @brief + * Number of pixels columns in the image. + */ + uint16_t width; + /*! @brief + * Number of pixels rows in the image. + */ + uint16_t height; + /*! @brief + * The format of the image. + */ + evision_image_format_t format; +} evision_image_t; + +#ifdef ALGO_SW_STATISTICS +/** + * @typedef evision_roi_t + * @brief Represents a Region Of Interest (aka a rectangle of pixels in an image). + * + * @struct evision_roi + * @brief Represents a Region Of Interest (aka a rectangle of pixels in an image). + * + * A ROI serves to limit the statistics extraction to a specific zone inside the frame. + * Several ROIs can be defined and for each ROI a weight must be defined. + * The aggregated statistic is the weighted average of individual ROI statistics. + * Setting all weights equal results in the aggregated statistic to be the arithmetic average of the individual statistics. + * + */ +typedef struct evision_roi { + /*! @brief + * Horizontal pixel coordinate of the Top-Left corner of the ROI. + */ + uint16_t x0; + /*! @brief + * Vertical pixel coordinate of the Top-Left corner of the ROI. + */ + uint16_t y0; + /*! @brief + * Horizontal pixel coordinate of the Bottom-Right corner of the ROI. + */ + uint16_t x1; + /*! @brief + * Vertical pixel coordinate of the Bottom-Right corner of the ROI. + */ + uint16_t y1; + /*! @brief + * Weight associated to the ROI. + */ + double weight; +} evision_roi_t; + +/** + * @typedef evision_roi_array_t + * @brief Represents an array of evision_roi. + * + * @struct evision_roi_array + * @brief Represents an array of evision_roi. + * + * Represents the collection of all the defined ROIs for the estimator. Must contain at least one ROI. + * + */ +typedef struct evision_roi_array { + /*! @brief + * Pointer to the beginning of the array. + */ + evision_roi_t* parray; + /*! @brief + * Number of elements in the array. + */ + uint16_t len; +} evision_roi_array_t; +#endif + + +/************************************************************************ + * Private Structure Declaration + ************************************************************************/ + +/************************************************************************ + * Public Variables + ************************************************************************/ + +/************************************************************************ + * Public Function Prototypes + ************************************************************************/ + +/* Library management functions */ +#ifdef ALGO_SW_STATISTICS +/* ROI array management */ + +/** + * @fn evision_roi_array_t* evision_api_roi_array_new(const uint16_t length) + * @brief Create and allocate the memory for a new array of #evision_roi_array_t elements. + * + * @param[in] length Size of the array to create + * @return Address of the created #evision_roi_array_t. NULL if something went wrong. + */ +evision_roi_array_t* evision_api_roi_array_new(const uint16_t length); + +/** + * @fn evision_roi_array_t* evision_api_roi_array_new_grid(const uint16_t frame_width, const uint16_t frame_height, const uint16_t roi_width, const uint16_t roi_height, const uint16_t nb_roi_col, const uint16_t nb_roi_row) + * @brief Create and allocate the memory for a new array of #evision_roi_array_t with pre filled ROIs positioned as a grid. + * + * In the end, the number of ROIs will be nb_roi_col * nb_roi_row + * + * @param[in] frame_width Number of pixels column in the frame where the ROIs will be placed. + * @param[in] frame_height Number of pixels rows in the frame where the ROIs will be placed. + * @param[in] roi_width Size (columns) of each ROI. + * @param[in] roi_height Size (rows) of each ROI. + * @param[in] nb_roi_col Number of ROIs to be placed in the horizontal dimension. + * @param[in] nb_roi_row Number of ROIs to be placed in the vertical dimension. + * @return Address of the created #evision_roi_array_t. NULL if something went wrong. + */ +evision_roi_array_t* evision_api_roi_array_new_grid(const uint16_t frame_width, const uint16_t frame_height, const uint16_t roi_width, const uint16_t roi_height, const uint16_t nb_roi_col, const uint16_t nb_roi_row); + +/** + * @fn evision_return_t evision_api_roi_array_delete(evision_roi_array_t* self) + * @brief Free the memory allocated to an #evision_roi_array_t. + * + * @param[in, out] self Address of the concerned ROI array instance to be deleted, cannot be used after. + * @return + * - EVISION_RET_SUCCESS + * - EVISION_RET_PARAM_ERR + */ +evision_return_t evision_api_roi_array_delete(evision_roi_array_t* self); +#endif + +/************************************************************************ + * Public Function Definitions + ************************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* EVISION_API_UTILS_H_ */ diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/evision/files/evision-libs/libevision-awb.so.1.0.7 b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/evision/files/evision-libs/libevision-awb.so.1.0.7 new file mode 100755 index 0000000000000000000000000000000000000000..6b64a3aea06eb6b5f59a1b81efd8deb1e2734668 GIT binary patch literal 91320 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

}77ebm!*| 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 CtbwKg literal 0 HcmV?d00001 diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/evision/files/evision-libs/libevision-st-ae.so.1.0.7 b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/evision/files/evision-libs/libevision-st-ae.so.1.0.7 new file mode 100755 index 0000000000000000000000000000000000000000..d9ab248b2e61ae57288df73a97d0ffe7bf75ad07 GIT binary patch literal 82536 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 fO?keKfW^_3