summaryrefslogtreecommitdiff
path: root/include/ia_imaging/ia_aiq.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/ia_imaging/ia_aiq.h')
-rw-r--r--include/ia_imaging/ia_aiq.h626
1 files changed, 626 insertions, 0 deletions
diff --git a/include/ia_imaging/ia_aiq.h b/include/ia_imaging/ia_aiq.h
new file mode 100644
index 0000000..10c9372
--- /dev/null
+++ b/include/ia_imaging/ia_aiq.h
@@ -0,0 +1,626 @@
+/*
+ * Copyright (C) 2015 - 2018 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+ * \mainpage IA AIQ API documentation
+ *
+ * Browse Files and Classes tabs for details.
+ *
+ * \section general General info
+ *
+ * AIQ API has been designed to be re-entrant. Each algorithm function can be called multiple times per frame.
+ * Input parameters for the algorithms define what is the output ie. running an algorithm with same input parameters
+ * and same statistics produce the same output. For example one can run AE multiple times with different EV compensations
+ * to get parameters for exposure bracketing.
+ *
+ * AIQ (Algorithms and Image Quality) library contains several algorithm which are used to modify RAW image.
+ * Currently following features and algorithms are supported:
+ * - \ref aec (Automatic Exposure Control)
+ * - \ref awb (Automatic White Balance)
+ * - \ref af (Automatic Focus)
+ * - \ref sa (Shading Adaptor)
+ * - \ref pa (Parameter Adaptor)
+ * - \ref dsd (Discrete Scene Detection)
+ * - \ref gbce (Global Brightness and Contrast Enhancement)
+ *
+ * AIQ also supports calculation of parameters for multiframe bracketing cases:
+ * - \ref afbracket (Automatic Focus Bracket)
+ * - \ref aebracket (Automatic Exposure Bracket)
+ *
+ * Running AIQ algorithms requires following steps:
+ * - \ref init
+ * - \ref stats
+ * - \ref running
+ * - \ref deinit
+ *
+ * Some AIQ algorithms require coordinates as inputs to specify a certain area in the image. Coordinates are relative to
+ * the statistics thus not necessarily the whole sensor area. Coordinates are not absolute but relative. See \link ia_coordinate.h \endlink
+ * for detailed description of the used coordinate system.
+ * <br><hr><br>
+ *
+ * \section init Initialization of AIQ library
+ *
+ * \copybrief ia_aiq_init
+ * To create an instance of AIQ library one must call function:
+ * \code ia_aiq_init \endcode
+ * \copydetails ia_aiq_init
+ *
+ * <br><hr><br>
+ *
+ * \section stats Setting of frame statistics
+ *
+ * Algorithms depend on statistics collected from the RAW image. Some or all of the statistics are
+ * calculated by the ISP after RAW image capture from camera sensor. These statistics are always collected from
+ * captured image data. To convert statistics from ISP specific format to AIQ format, a helper function can be used:
+ * \code ia_isp_XXX_statistics_convert \endcode
+ * See ia_isp documentation for details.
+ *
+ * \copybrief ia_aiq_statistics_set
+ * To set statistics for algorithms AIQ library, one must call function:
+ * \code ia_aiq_statistics_set \endcode
+ * \copydetails ia_aiq_statistics_set
+ *
+ * Algorithms can also utilize external sensor data for making better decisions. For example external light sensor
+ * can be used by AEC to determine correct cold start exposure parameters when AEC is called the first time without
+ * statistics.
+ *
+ * \copybrief ia_aiq_sensor_events_set
+ * To set external sensor data statistics for algorithms AIQ library, one must call function:
+ * \code ia_aiq_sensor_events_set \endcode
+ * \copydetails ia_aiq_sensor_events_set
+ *
+ * <br><hr><br>
+ *
+ * \section running Running AIQ algorithms
+ *
+ * Once the AIQ instance is initialized and statistics are set, algorithms can be run in any order.
+ * \subsection af AF
+ * \copybrief ia_aiq_af_run
+ * \code ia_aiq_af_run \endcode
+ * \copydetails ia_aiq_af_run
+ *
+ * \subsection aec AEC
+ * \copybrief ia_aiq_ae_run
+ * \code ia_aiq_ae_run \endcode
+ * \copydetails ia_aiq_ae_run
+ *
+ * \subsection awb AWB
+ * \copybrief ia_aiq_awb_run
+ * \code ia_aiq_awb_run \endcode
+ * \copydetails ia_aiq_awb_run
+ *
+ * \subsection sa SA
+ * \copybrief ia_aiq_sa_run
+ * \code ia_aiq_sa_run \endcode
+ * \copydetails ia_aiq_sa_run
+ *
+ * \subsection pa PA
+ * \copybrief ia_aiq_pa_run
+ * \code ia_aiq_pa_run \endcode
+ * \copydetails ia_aiq_pa_run
+ *
+ * \subsection dsd DSD
+ * \copybrief ia_aiq_dsd_run
+ * \code ia_aiq_dsd_run \endcode
+ * \copydetails ia_aiq_dsd_run
+ *
+ * \subsection gbce GBCE
+ * \copybrief ia_aiq_gbce_run
+ * \code ia_aiq_gbce_run \endcode
+ * \copydetails ia_aiq_gbce_run
+ *
+ * \subsection afbracket AF Bracket
+ * \copybrief ia_aiq_af_bracket
+ * \code ia_aiq_af_bracket \endcode
+ * \copydetails ia_aiq_af_bracket
+ *
+ * \subsection aebracket AE Bracket & HDR
+ * AEC supports outputting of multiple exposure results. By setting the "num_exposures" parameter >1 in ia_aiq_ae_input_params, AEC determines
+ * the best exposure parameters to cover as much as possible of the sensor's dynamic range. AIQ's client can then queue the exposure parameters
+ * to the sensor for consecutive frames for best speed.
+ *
+ * HDR support in AEC works the same way. Client requests >1 "num_exposures" but also gives AIQ the resulting statistics from all requested
+ * exposures. AEC uses the given (multiple) statistics to calculate new exposure parameters.
+ *
+ *
+ * <br><hr><br>
+ *
+ * \section deinit De-initialization of AIQ library
+ *
+ * To de-initialize and free memory AIQ library instance has allocated, one must call function:
+ * \code
+ * ia_aiq_deinit
+ * \endcode
+ *
+ * After this call AIQ library instance is destroyed and can't be used.
+ */
+
+/*!
+ * \file ia_aiq.h
+ * \brief Definitions and declarations of Intel 3A library.
+ */
+
+#ifndef _IA_AIQ_H_
+#define _IA_AIQ_H_
+
+#include "ia_aiq_types.h"
+#include "ia_types.h"
+#include "ia_face.h"
+#include "ia_mkn_types.h"
+#include "ia_cmc_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*!
+ * \brief Initialize IA_AIQ and its submodules.
+ * This function must be called before any other function in the library. It allocates memories for all AIQ algorithms based on input parameters
+ * given by the user. AIQB (from CPFF) and NVM data are parsed and combined resulting camera module specific tuning parameters which the
+ * AIQ algorithms use. Initialization returns a handle to the AIQ instance, which is given as input parameter for all the
+ * algorithms. Therefore, multiple instances of AIQ library can running simultaneously. For example one instance per camera.
+ *
+ * \param[in] aiqb_data Mandatory although function will not return error, if it not given.\n
+ * Contains tuning parameters for AIQ algorithms.
+ * \param[in] nvm_data Optional.\n
+ * NVM (Non Volatile Memory) containing sensor unit specific calibration data.
+ * AIC uses camera unit specific calibration data, if given.
+ * \param[in] aiqd_data Optional.\n
+ * AIQ generic input data, provided by the host. Contains various AIQ related information, collected
+ * during run-time and stored in a host file system. AIQ will parse this data in to internal storage.
+ * \param[in] stats_max_width Mandatory.\n
+ * Maximum width of RGBS and AF statistics grids from ISP. Used to calculate size of
+ * memory buffers for the IA_AIQ algorithms. The same maximum width will be used for all RGBS
+ * and AF statistics grid allocations.
+ * \param[in] stats_max_height Mandatory.\n
+ * Maximum height of RGBS and AF statistics grids from ISP. Used to calculate size of
+ * memory buffers for the IA_AIQ algorithms. The same maximum height will be used for all RGBS
+ * and AF statistics grid allocations.
+ * \param[in] max_num_stats_in Mandatory.\n
+ * The maximum number of input statistics for one frame. Each statistics is related to different exposure.
+ * Used especially for sensors that support two or more simultaneous exposures (HDR).
+ * \param[in] ia_cmc Mandatory.\n
+ * Parsed camera module characterization structure. ia_cmc structure needs to be kept available by client for
+ * the lifetime of AIQ component.
+ * \param[in,out] ia_mkn Optional.\n
+ * Makernote handle which can be initialized with ia_mkn library. If debug data from AIQ is needed
+ * to be stored into EXIF, this parameter is needed. Algorithms will update records inside this makernote instance.
+ * Client writes the data into Makernote section in EXIF.
+ * return IA_AIQ handle. Use the returned handle as input parameter for the consequent IA_AIQ calls.
+ */
+LIBEXPORT ia_aiq*
+ia_aiq_init(const ia_binary_data *aiqb_data,
+ const ia_binary_data *nvm_data,
+ const ia_binary_data *aiqd_data,
+ unsigned int stats_max_width,
+ unsigned int stats_max_height,
+ unsigned int max_num_stats_in,
+ ia_cmc_t *ia_cmc,
+ ia_mkn *ia_mkn);
+
+/*!
+ * \brief Set tuning to an existing AIQ instance.
+ * This function can be used to switch tunings on-the-fly in a way that 3A preserves its state and offers smooth transition from one tuning to another.
+ */
+LIBEXPORT ia_err
+ia_aiq_set_tuning(ia_aiq *ia_aiq,
+ const ia_binary_data *aiqb_data);
+
+/*!
+ * \brief De-initialize IA_AIQ and its submodules.
+ * All memory allocated by AIQ algoriths are freed. AIQ handle can no longer be used.
+ *
+ * \param[in] ia_aiq Mandatory.\n
+ * AIQ instance handle.
+ */
+LIBEXPORT void
+ia_aiq_deinit(ia_aiq *ia_aiq);
+
+/*!
+ * \brief Manual AEC limit parameters.
+ */
+typedef struct
+{
+ int manual_exposure_time_min; /*!< Optional. Minimum exposure time in microseconds. -1 if NA. */
+ int manual_exposure_time_max; /*!< Optional. Maximum exposure time in microseconds. -1 if NA. */
+ int manual_frame_time_us_min; /*!< Optional. Manual minimum frame length in microseconds. Defines maximum frame rate -1 if NA. */
+ int manual_frame_time_us_max; /*!< Optional. Manual maximum frame length in microseconds. Defines minimum frame rate. -1 if NA. */
+ short manual_iso_min; /*!< Optional. Manual minimum ISO. -1 if NA. */
+ short manual_iso_max; /*!< Optional. Manual maximum ISO. -1 if NA. */
+} ia_aiq_ae_manual_limits;
+
+/*!
+ * \brief Input parameter structure for AE algorithm.
+ */
+typedef struct
+{
+ unsigned int num_exposures; /*!< Mandatory. The number of exposure outputs to have. Must be positive. One for LDR, two or more for HDR/exposure bracketing. */
+ ia_aiq_frame_use frame_use; /*!< Mandatory. Target frame type of the AEC calculations (Preview, Still, video etc.). */
+ ia_aiq_flash_mode flash_mode; /*!< Mandatory. Manual flash mode. If AEC should make flash decision, set mode to ia_aiq_flash_mode_auto. */
+ ia_aiq_ae_operation_mode operation_mode; /*!< Mandatory. AEC operation mode. */
+ ia_aiq_ae_metering_mode metering_mode; /*!< Mandatory. AEC metering mode. */
+ ia_aiq_ae_priority_mode priority_mode; /*!< Mandatory. AEC priority mode. */
+ ia_aiq_ae_flicker_reduction flicker_reduction_mode; /*!< Mandatory. AEC flicker reduction mode. */
+ ia_aiq_exposure_sensor_descriptor *sensor_descriptor; /*!< Mandatory although function will not return error, if not given.
+ Sensor specific descriptor and limits of the used sensor mode for target frame use.
+ AEC will not limit and calculate sensor specific parameters, if not given */
+ ia_rectangle *exposure_window; /*!< Optional. Rectangle of area which AEC uses to to calculate new exposure parameters. */
+ ia_coordinate *exposure_coordinate; /*!< Optional. Coordinate for a point in which the exposure should be prioritized.
+ AEC increases weight of given point in final AEC results. */
+ float ev_shift; /*!< Optional. Exposure Value shift [-4,4]. */
+ long *manual_exposure_time_us; /*!< Optional. Manual exposure time in microseconds. NULL if NA. Otherwise, array of values
+ of num_exposures length. Order of exposure times corresponds to exposure_index of ae_results,
+ e.g., manual_exposure_time_us[ae_results->exposures[0].exposure_index] = 33000; */
+ float *manual_analog_gain; /*!< Optional. Manual analog gain. NULL if NA. Otherwise, array of values of num_exposures length.
+ Order of gain values corresponds to exposure_index of ae_results,
+ e.g., manual_analog_gain[ae_results->exposures[0].exposure_index] = 4.0f; */
+ short *manual_iso; /*!< Optional. Manual ISO. Overrides manual_analog_gain. NULL if NA. Otherwise, array of values
+ of num_exposures length. Order of ISO values corresponds to exposure_index of ae_results,
+ e.g., manual_iso[ae_results->exposures[0].exposure_index] = 100; */
+ ia_aiq_ae_features *aec_features; /*!< Optional. AEC features in use when calculating new exposure parameters. */
+ ia_aiq_ae_manual_limits *manual_limits; /*!< Optional. Manual limits which override limits defined in AEC tunings. */
+ float manual_aperture_fn; /*!< Optional. Manual f-number of aperture (e.g. 2.8), -1.0 for N/A. Used only with P iris. */
+ ia_aiq_aperture_control_dc_iris_command manual_dc_iris_command; /*!< Optional. Used only with DC iris. 0 (auto) for N/A. */
+ ia_aiq_ae_exposure_distribution_priority exposure_distribution_priority; /*!< Mandatory. AEC exposure distribution priority mode. */
+ float manual_convergence_time; /*!< Optional. Manual AEC convergence speed in seconds. -1.0 if NA. Overrides convergence speed from tunings. */
+} ia_aiq_ae_input_params;
+
+/*!
+ * \brief AEC calculation based on input parameters and frame statistics.
+ * AE calculates new exposure parameters to be used for the next frame based on previously given statistics and user parameters.
+ *
+ * \param[in] ia_aiq Mandatory.\n
+ * AIQ instance handle.
+ * \param[in] ae_input_params Mandatory.\n
+ * Input parameters for AEC calculations.
+ * \param[out] ae_results Mandatory.\n
+ * Pointer's pointer where address of ISP parameters are stored.
+ * Results from AEC calculations. Results can be used directly as input for AIC.
+ * \return Error code.
+ */
+LIBEXPORT ia_err
+ia_aiq_ae_run(ia_aiq *ia_aiq,
+ const ia_aiq_ae_input_params *ae_input_params,
+ ia_aiq_ae_results **ae_results);
+
+/*!
+ * \brief Input parameter structure for AF algorithm.
+ */
+typedef struct
+{
+ ia_aiq_frame_use frame_use; /*!< Mandatory. Target frame type of the AF calculations (Preview, Still, video etc.). */
+ int lens_position; /*!< Mandatory. Current lens position. */
+ unsigned long long lens_movement_start_timestamp; /*!< Mandatory. Lens movement start timestamp in us. Timestamp is compared against statistics timestamp
+ to determine if lens was moving during statistics collection. */
+ ia_aiq_af_operation_mode focus_mode; /*!< Mandatory. Focusing mode. */
+ ia_aiq_af_range focus_range; /*!< Mandatory. Focusing range. Only valid when focus_mode is ia_aiq_af_operation_mode_auto. */
+ ia_aiq_af_metering_mode focus_metering_mode; /*!< Mandatory. Metering mode (multispot, touch). */
+ ia_aiq_flash_mode flash_mode; /*!< Mandatory. User setting for flash. */
+ ia_rectangle *focus_rect; /*!< Optional. */
+ ia_aiq_manual_focus_parameters *manual_focus_parameters; /*!< Optional. Manual focus parameters (manual lens position, manual focusing distance). Used only if
+ focus mode 'ia_aiq_af_operation_mode_manual' is used. */
+ bool trigger_new_search; /*!< TRUE if new AF search is needed, FALSE otherwise. Host is responsible for flag cleaning. */
+} ia_aiq_af_input_params;
+
+/*!
+ * \brief AF calculation based on input parameters and frame statistics.
+ * AF calculates new lens position based on statistics and given input parameters.
+ *
+ * \param[in] ia_aiq Mandatory.\n
+ * AIQ instance handle.
+ * \param[in] af_input_params Mandatory.\n
+ * Input parameters for AF calculations.
+ * \param[out] af_results Mandatory.\n
+ * Pointer's pointer where address of AF results are stored.
+ * Results from AF calculations.
+ * \return Error code.
+ */
+LIBEXPORT ia_err
+ia_aiq_af_run(ia_aiq *ia_aiq,
+ const ia_aiq_af_input_params *af_input_params,
+ ia_aiq_af_results **af_results);
+
+/*!
+ * \brief Input parameter structure for AWB algorithm.
+ */
+typedef struct
+{
+ ia_aiq_frame_use frame_use; /*!< Mandatory. Target frame type of the AWB calculations (Preview, Still, video etc.). */
+ ia_aiq_awb_operation_mode scene_mode; /*!< Mandatory. AWB scene mode. */
+ ia_aiq_awb_manual_cct_range *manual_cct_range; /*!< Optional. Manual CCT range. Used only if AWB scene mode 'ia_aiq_awb_operation_manual_cct_range' is used. */
+ ia_coordinate *manual_white_coordinate; /*!< Optional. Manual white point coordinate relative to the full FOV of the scene. Used only if AWB scene mode 'ia_aiq_awb_operation_manual_white' is used. */
+ float manual_convergence_time; /*!< Optional. Manual AWB convergence speed in seconds. -1.0 if NA. Overrides convergence speed from tunings. */
+} ia_aiq_awb_input_params;
+
+/*!
+ * \brief AWB calculation based on input parameters and frame statistics.
+ *
+ * \param[in] ia_aiq Mandatory.\n
+ * AIQ instance handle.
+ * \param[in] awb_input_params Mandatory.\n
+ * Input parameters for AWB calculations.
+ * \param[out] awb_results Mandatory.\n
+ * Pointer's pointer where address of AWB results are stored.
+ * Results from AWB calculations. Results can be used directly as input for ia_isp.
+ * \return Error code.
+ */
+LIBEXPORT ia_err
+ia_aiq_awb_run(ia_aiq *ia_aiq,
+ const ia_aiq_awb_input_params *awb_input_params,
+ ia_aiq_awb_results **awb_results);
+
+
+/*!
+ * \brief Input parameter structure for GBCE algorithm.
+ */
+typedef struct
+{
+ ia_aiq_gbce_level gbce_level; /*!< Mandatory. GBCE level. -1 to use tuning defaults.*/
+ ia_aiq_tone_map_level tone_map_level; /*!< Mandatory. Tone Map level. -1 to use tuning defaults.*/
+ ia_aiq_frame_use frame_use; /*!< Mandatory. Target frame type of the GBCE calculations (Preview, Still, video etc.). */
+ float ev_shift; /*!< Optional. Exposure Value shift [-4,4]. */
+} ia_aiq_gbce_input_params;
+
+/*!
+ * \brief GBCE calculation based on input parameters and frame statistics.
+ * Computes gamma
+ *
+ * \param[in] ia_aiq Mandatory.\n
+ * AIQ instance handle.
+ * \param[in] gbce_input_params Mandatory.\n
+ * Input parameters for GBCE calculations.
+ * \param[out] gbce_results Mandatory.\n
+ * Pointer's pointer where address of GBCE results are stored.
+ * Results contain GBCE Gamma table. Results can be used directly as input for AIC.
+ * \return Error code.
+ */
+LIBEXPORT ia_err
+ia_aiq_gbce_run(ia_aiq *ia_aiq,
+ const ia_aiq_gbce_input_params *gbce_input_params,
+ ia_aiq_gbce_results **gbce_results);
+
+/*!
+ * \brief Input parameter structure for DSD algorithm.
+ */
+typedef struct
+{
+ ia_aiq_af_results *af_results; /*!< Mandatory although function will not return error, if not given.
+ DSD will not return all scene modes, if not given. */
+ ia_aiq_scene_mode scene_modes_selection; /*!<configure which scene modes should be detected by DSD*/
+} ia_aiq_dsd_input_params;
+
+/*!
+ * \brief DSD based on statistics analysis.
+ * Determine scene (DSD) the given image.
+ *
+ * \param[in] ia_aiq Mandatory.\n
+ * AIQ instance handle.
+ * \param[in] dsd_input_params Mandatory.\n
+ * Input parameters for DSD calculations.
+ * \param[out] dsd_scene Mandatory.\n
+ * Detected scene mode.
+ * \return Error code.
+ */
+LIBEXPORT ia_err
+ia_aiq_dsd_run(ia_aiq *ia_aiq,
+ const ia_aiq_dsd_input_params *dsd_input_params,
+ ia_aiq_scene_mode *dsd_scene);
+
+/*!
+ * \brief Input parameter structure for Parameter adaptor.
+ */
+typedef struct
+{
+ ia_aiq_awb_results *awb_results; /*!< Mandatory. WB results which are to be used to calculate next ISP parameters (WB gains, color matrix,etc). */
+ ia_aiq_exposure_parameters *exposure_params; /*!< Mandatory. Analog gain and exposure time. */
+ ia_aiq_color_channels *color_gains; /*!< Optional. RGB gains for each color channels. These gain will be applied on top of RGB gains calculated from WB results. */
+} ia_aiq_pa_input_params;
+
+/*!
+ * \brief Parameter adaptor calculations for the next frame.
+ * Compute generic parameters (Color Correction Matrix and Black Level Correction),
+ * which should be used to correct the next frame. Calculations are based on previously calculated AIQ algorithm results.
+ * These generic results are converted to ISP specific parameters by ia_isp component.
+ *
+ * \param[in] ia_aiq Mandatory.\n
+ * AIQ instance handle.
+ * \param[in] pa_input_params Mandatory.\n
+ * Input parameters for PA calculations.
+ * \param[out] pa_results Mandatory.\n
+ * Pointer's pointer where address of parameter adaptor results are stored.
+
+ * \return Error code.
+ */
+LIBEXPORT ia_err
+ia_aiq_pa_run(ia_aiq *ia_aiq,
+ const ia_aiq_pa_input_params *pa_input_params,
+ ia_aiq_pa_results **pa_results);
+
+/*!
+ * \brief Input parameter structure for Shading Adaptor.
+ */
+typedef struct
+{
+ ia_aiq_frame_use frame_use; /*!< Mandatory. Target frame type of the AIC calculations (Preview, Still, video etc.). */
+ ia_aiq_frame_params *sensor_frame_params; /*!< Mandatory. Sensor frame parameters. Describe frame scaling/cropping done in sensor. */
+ ia_aiq_awb_results *awb_results; /*!< Mandatory. WB results which are to be used to calculate next ISP parameters (WB gains, color matrix,etc). */
+} ia_aiq_sa_input_params;
+
+/*!
+ * \brief Shading Adaptor calculations for the next frame.
+ * Compute shading correction parameters.
+ * which should be used to correct the next frame. Calculations are based on previously calculated AIQ algorithm results.
+ * These generic results are converted to ISP specific parameters by ia_isp component.
+ *
+ * \param[in] ia_aiq Mandatory.\n
+ * AIQ instance handle.
+ * \param[in] sa_input_params Mandatory.\n
+ * Input parameters for SA calculations.
+ * \param[out] sa_results Mandatory.\n
+ * Pointer's pointer where address of shading adaptor results are stored.
+
+ * \return Error code.
+ */
+LIBEXPORT ia_err
+ia_aiq_sa_run(ia_aiq *ia_aiq,
+ const ia_aiq_sa_input_params *sa_input_params,
+ ia_aiq_sa_results **sa_results);
+
+/*!
+ * \brief Input parameter structure for setting the statistics.
+ */
+typedef struct
+{
+ unsigned long long frame_id; /*!< The frame identifier which identifies to which frame the given statistics correspond. Must be positive. */
+ unsigned long long frame_timestamp; /*!< Mandatory although function will not return error, if not given.
+ Start of frame timestamp in microseconds. This value is used in conjunction with timestamps
+ provided in the AIQ algorithms function calls to calculate the convergence
+ speed of AIQ algorithms.
+ AEC, AWB and AF will not converge, if not given. */
+ const ia_aiq_ae_results *frame_ae_parameters; /*!< Mandatory although function will not return error, if not given.
+ Exposure results from AEC which were used to capture this frame.
+ AEC depends on this parameters. AEC will return cold start values if not given.*/
+ const ia_aiq_af_results *frame_af_parameters; /*!< Mandatory although function will not return error, if not given.
+ Focus results from AF which were used to capture this frame.
+ AEC with AF assist light and flash usage in macro functionalities depend on these parameters. */
+ const ia_aiq_rgbs_grid **rgbs_grids; /*!< Mandatory. Almost all AIQ algorithms require RGBS grid statistics. */
+ unsigned int num_rgbs_grids; /*!< The number of RGBS grids. */
+ const ia_aiq_hdr_rgbs_grid* hdr_rgbs_grid; /*!< Optional. HDR statistics grid. */
+ const ia_aiq_af_grid **af_grids; /*!< Mandatory although function will not return error, if not given.
+ AF will return a NULL pointer, if not given.
+ DSD will not return all scene modes, if not given. */
+ unsigned int num_af_grids; /*!< The number of AF grids. */
+ const ia_aiq_histogram **external_histograms; /*!< Optional. If ISP calculates histogram, if can be given. If external histogram is not given,
+ AIQ internally calculates the histogram from the RGBS grid statistics and given AWB parameters. */
+ unsigned int num_external_histograms; /*!< The number of external histograms. */
+ const ia_aiq_pa_results *frame_pa_parameters; /*!< Optional (Mandatory if external_histogram is not given).
+ AWB results used in the frame from where the statistics are collected.
+ GBCE will give default gamma table if external histogram or AWB results are not available. */
+ const ia_face_state *faces; /*!< Mandatory although function will not return error, if not given.
+ Face coordinates from external face detector.
+ DSD will not return all scene modes, if not given.
+ AWB will not take face information into account, if not given. */
+ ia_aiq_camera_orientation camera_orientation; /*!< The orientation of the camera. Currently unused. */
+
+ const ia_aiq_awb_results *awb_results; /*!< Optional. Estimated AWB results from the previous run of AWB */
+ const ia_aiq_sa_results *frame_sa_parameters; /*!< Optional. LSC results used in the frame for statistics collected. */
+ const ia_aiq_depth_grid **depth_grids; /*!< Optional. Depth grid statistics */
+ unsigned int num_depth_grids; /*!< Optional. Number of depth grid statistics */
+} ia_aiq_statistics_input_params;
+
+/*!
+ * \brief Set input statistics and information about the captured image.
+ * AIQ algorithms need various information about the conditions in which the frame and statistics were captured in order to
+ * calculate new parameters.
+ *
+ * \param[in] ia_aiq Mandatory.\n
+ * AIQ instance handle.
+ * \param[in] statistics_input_params Mandatory.\n
+ * Input parameters containing statistics and information about a frame.
+ * \return Error code.
+ */
+LIBEXPORT ia_err
+ia_aiq_statistics_set(ia_aiq *ia_aiq,
+ const ia_aiq_statistics_input_params *statistics_input_params);
+
+/*!
+ * \brief Focus bracketing parameters.
+ */
+typedef struct
+{
+ unsigned char focus_positions; /*!< Number of focus positions */
+ ia_aiq_af_results af_results; /*!< Autofocus results */
+ ia_aiq_af_bracket_mode af_bracket_mode; /*!< Focus bracketing mode */
+} ia_aiq_af_bracket_input_params;
+
+/*!
+ * \brief Calculates the list of lens positions for focus bracketing.
+ *
+ * \param[in] ia_aiq Mandatory.\n
+ * AIQ instance handle.
+ * \param[in] af_bracket_input_params Mandatory.\n
+ * Autofocus bracketing parameters.
+ * \param[out] af_bracket_results Mandatory.\n
+ * Pointer's pointer where address of focus bracketing results are stored.
+ * \return Error code.
+ */
+LIBEXPORT ia_err
+ia_aiq_af_bracket(ia_aiq *ia_aiq,
+ const ia_aiq_af_bracket_input_params *af_bracket_input_params,
+ ia_aiq_af_bracket_results **af_bracket_results);
+
+/*!
+ * \param[in] ia_aiq Mandatory.\n
+ * AIQ instance handle.
+ * \param[out] out_ia_aiq_data Mandatory.\n
+ * Contains various AIQ related information, collected during run-time and subject to
+ * be stored in a host file system. Host will copy this data, if ia_aiq_data->size > 0
+ * and ia_aiq_data->data != NULL; AIQ is responsible to deallocate data buffer
+ * during ia_aiq_deinit().
+ * \return Error code.
+ */
+LIBEXPORT ia_err
+ia_aiq_get_aiqd_data(ia_aiq *ia_aiq,
+ ia_binary_data *out_ia_aiq_data);
+
+
+
+/*!
+* \brief Data from external sensors
+*/
+typedef struct
+{
+ ia_aiq_sensor_data *accelerometer_events; /*!< The data holds information on the acceleration of the device in mg/sec (miligravity per second).
+ Acceleration = Gravity + Linear Acceleration*/
+ unsigned int num_accelerometer_events; /*!< Number of accelerometer events */
+ ia_aiq_sensor_data *gravity_events; /*!< The data holds information on the gravitation of the device in mg/sec (miligravity per second) */
+ unsigned int num_gravity_events; /*!< Number of gravity events */
+ ia_aiq_sensor_data *gyroscope_events; /*!< The data holds information on the angular velocity of the device in rad/sec */
+ unsigned int num_gyroscope_events; /*!< Number of gyroscope events */
+ ia_aiq_ambient_light_events *ambient_light_events; /*!< The data holds information on the ambient light */
+ unsigned int num_ambient_light_events; /*!< Number of ambient light events */
+} ia_aiq_sensor_events;
+
+/*!
+ * \brief Set event statistics.
+ * Some of the AIQ algorithms benefit from sensor information which tells about the conditions in which the device is in use
+ *
+ * \param[in] ia_aiq Mandatory.\n
+ * AIQ instance handle.
+ * \param[in] sensor_events_input Mandatory.\n
+ * Sensor events input holds data from libsensorhub.
+ * \return Error code.
+ */
+LIBEXPORT ia_err
+ia_aiq_sensor_events_set(ia_aiq *ia_aiq,
+ const ia_aiq_sensor_events *sensor_events_input);
+
+
+
+/*!
+ * \brief Get version.
+ * Get version from version header.
+ *
+ * \return Version string.
+ */
+LIBEXPORT const char* ia_aiq_get_version(void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _IA_AIQ_H_ */