summaryrefslogtreecommitdiff
path: root/include/ia_imaging/ia_aiq_types.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/ia_imaging/ia_aiq_types.h')
-rw-r--r--include/ia_imaging/ia_aiq_types.h784
1 files changed, 784 insertions, 0 deletions
diff --git a/include/ia_imaging/ia_aiq_types.h b/include/ia_imaging/ia_aiq_types.h
new file mode 100644
index 0000000..f6b7344
--- /dev/null
+++ b/include/ia_imaging/ia_aiq_types.h
@@ -0,0 +1,784 @@
+/*
+ * Copyright (C) 2015 - 2017 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.
+ */
+
+/*!
+ * \file ia_aiq_types.h
+ * \brief Definitions of input/output structures of the Intel 3A library.
+ */
+
+#ifndef _IA_AIQ_TYPES_H_
+#define _IA_AIQ_TYPES_H_
+
+#include "ia_types.h"
+#include "ia_cmc_types.h"
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define MAX_COLOR_CONVERSION_MATRIX 3
+typedef struct ia_aiq_t ia_aiq;
+
+/*!
+ * \brief Target (frame use) for the analysis algorithms calculations.
+ */
+typedef enum
+{
+ ia_aiq_frame_use_preview,
+ ia_aiq_frame_use_still,
+ ia_aiq_frame_use_continuous,
+ ia_aiq_frame_use_video,
+} ia_aiq_frame_use;
+
+/*!
+ * \brief Camera orientations.
+ */
+typedef enum
+{
+ ia_aiq_camera_orientation_unknown, /*!< Orientation not known. */
+ ia_aiq_camera_orientation_rotate_0, /*!< Non-rotated landscape. */
+ ia_aiq_camera_orientation_rotate_90, /*!< Portrait i.e. rotated 90 degrees clockwise. */
+ ia_aiq_camera_orientation_rotate_180, /*!< Landscape (upside down) i.e. rotated 180 degrees clockwise. */
+ ia_aiq_camera_orientation_rotate_270 /*!< Portrait (upside down) i.e. rotated 270 degrees clockwise. */
+} ia_aiq_camera_orientation;
+
+/*!
+ * \brief AEC flicker reduction modes.
+ */
+typedef enum
+{
+ ia_aiq_ae_flicker_reduction_off, /*!< Disables flicker detection and reduction. */
+ ia_aiq_ae_flicker_reduction_50hz, /*!< Manual flicker reduction for 50Hz mains frequency. */
+ ia_aiq_ae_flicker_reduction_60hz, /*!< Manual flicker reduction for 60Hz mains frequency. */
+ ia_aiq_ae_flicker_reduction_auto, /*!< Detects flicker frequency and applies detected reduction. */
+ ia_aiq_ae_flicker_reduction_detect, /*!< Detects only flicker frequency but doesn't apply reduction. */
+} ia_aiq_ae_flicker_reduction;
+
+/*!
+ * \brief AEC operation modes.
+ */
+typedef enum {
+ ia_aiq_ae_operation_mode_automatic, /*!< Automatic mode. */
+ ia_aiq_ae_operation_mode_long_exposure, /*!< AEC produces exposure parameters with long exposure (low light & static) scene. */
+ ia_aiq_ae_operation_mode_action, /*!< AEC produces exposure parameters for fast moving scene. */
+ ia_aiq_ae_operation_mode_video_conference, /*!< AEC produces exposure parameters which can be used in video conferencing scene. */
+ ia_aiq_ae_operation_mode_production_test, /*!< AEC produces exposure parameters which are used in production test environment. */
+ ia_aiq_ae_operation_mode_ultra_low_light, /*!< AEC produces exposure parameters which are used in ultra low light scene. */
+ ia_aiq_ae_operation_mode_fireworks, /*!< AEC produces exposure parameters which are used in fireworks scene. */
+ ia_aiq_ae_operation_mode_hdr, /*!< AEC produces exposure parameters which are used for HDR imaging (vHDR or exposure bracketing). */
+ ia_aiq_ae_operation_mode_custom_1, /*!< AEC produces exposure parameters for a specialized custom scene 1. */
+ ia_aiq_ae_operation_mode_custom_2, /*!< AEC produces exposure parameters for a specialized custom scene 2. */
+ ia_aiq_ae_operation_mode_custom_3, /*!< AEC produces exposure parameters for a specialized custom scene 3. */
+} ia_aiq_ae_operation_mode;
+
+/*!
+ * \brief AEC metering modes.
+ */
+typedef enum {
+ ia_aiq_ae_metering_mode_evaluative, /*!< Exposure is evaluated from the whole frame. */
+ ia_aiq_ae_metering_mode_center, /*!< Exposure is evaluated center weighted. */
+} ia_aiq_ae_metering_mode;
+
+/*!
+ * \brief AEC priority modes.
+ */
+typedef enum {
+ ia_aiq_ae_priority_mode_normal, /*!< All areas are equally important. */
+ ia_aiq_ae_priority_mode_highlight, /*!< Highlights must be preserved even if it means that dark parts become very dark. */
+ ia_aiq_ae_priority_mode_shadow, /*!< Shadow areas are more important. */
+} ia_aiq_ae_priority_mode;
+
+/*!
+ * \brief AEC exposure distribution priority modes
+ *
+ * This enumeration values are used to control distribution of AEC exposure parameters. For example in some situation user may want to keep
+ * aperture at smallest value (in order to have large DOF) as long as possible in expense of motion blur (caused by long exposure time) and
+ * noise (caused by high ISO).
+ *
+ * Note. Manual priority modes as understood by SLRs are achieved by using manual exposure parameters when running AEC:
+ * Shutter priority: Set manual_exposure_time_us in ia_aiq_ae_input_params.
+ * ISO priority: Set manual_iso in ia_aiq_ae_input_params.
+ * Aperture priority: Set manual_aperture_fn in ia_aiq_ae_input_params.
+ */
+typedef enum
+{
+ ia_aiq_ae_exposure_distribution_auto, /*!< AEC internally prioritizes between exposure time, aperture and ISO when calculating distribution. */
+ ia_aiq_ae_exposure_distribution_shutter, /*!< AEC tries to keep the exposure time at minimum until ISO and aperture are at maximum. */
+ ia_aiq_ae_exposure_distribution_iso, /*!< AEC tries to keep the ISO at minimum until exposure time and aperture are at maximum. */
+ ia_aiq_ae_exposure_distribution_aperture, /*!< AEC tries to keep the aperture at minimum until exposure time and ISO are at maximum. */
+} ia_aiq_ae_exposure_distribution_priority;
+
+/*!
+ * \brief AEC feature setting.
+ */
+typedef enum {
+ ia_aiq_ae_feature_setting_tuning, /*!< Feature setting is taken from tuning data. */
+ ia_aiq_ae_feature_setting_disabled, /*!< Feature setting is disabled. */
+ ia_aiq_ae_feature_setting_enabled, /*!< Feature setting is enabled. */
+} ia_aiq_ae_feature_setting;
+
+
+/*!
+ * \brief Autofocus states
+ */
+typedef enum
+{
+ ia_aiq_af_status_idle, /*!< Focus is idle */
+ ia_aiq_af_status_local_search, /*!< Focus is in local search state */
+ ia_aiq_af_status_extended_search, /*!< Focus is in extended search state */
+ ia_aiq_af_status_success, /*!< Focus has succeeded */
+ ia_aiq_af_status_fail, /*!< Focus has failed */
+ ia_aiq_af_status_depth_search /*!< Focus in depth search mode */
+} ia_aiq_af_status;
+
+/*!
+ * \brief Action for the lens driver
+ */
+typedef enum
+{
+ ia_aiq_lens_driver_action_none,
+ ia_aiq_lens_driver_action_move_to_unit,
+ ia_aiq_lens_driver_action_move_by_units
+} ia_aiq_lens_driver_action;
+
+/*!
+ * \brief Autofocus modes
+ */
+typedef enum
+{
+ ia_aiq_af_operation_mode_auto, /*!< Auto mode */
+ ia_aiq_af_operation_mode_infinity, /*!< Inifinity mode */
+ ia_aiq_af_operation_mode_hyperfocal, /*!< Hyperfocal mode */
+ ia_aiq_af_operation_mode_manual, /*!< Manual mode */
+ ia_aiq_af_operation_mode_production_test, /*!< Production test mode. */
+ ia_aiq_af_operation_mode_depth_map, /*!< Depth-map generation mode. */
+ ia_aiq_af_operation_mode_depth, /*!< Automatic focusing based on depth measurements only. */
+ ia_aiq_af_operation_mode_contrast /*!< Automatic focusing based on contrast measurements only. */
+} ia_aiq_af_operation_mode;
+
+/*!
+ * \brief Autofocus range
+ */
+typedef enum
+{
+ ia_aiq_af_range_normal, /*!< Normal range */
+ ia_aiq_af_range_macro, /*!< Macro range */
+ ia_aiq_af_range_extended, /*!< Extended/full range */
+} ia_aiq_af_range;
+
+
+/*!
+ * \brief Autofocus metering modes
+ */
+typedef enum
+{
+ ia_aiq_af_metering_mode_auto, /*!< Auto metering mode */
+ ia_aiq_af_metering_mode_touch /*!< Touch metering mode */
+} ia_aiq_af_metering_mode;
+
+/*!
+ * \brief Lens actuator status
+ */
+typedef enum
+{
+ ia_aiq_lens_status_stopped, /*!< Lens has not moved during the frame integration*/
+ ia_aiq_lens_status_moving /*!< Lens has been moving during the frame integration */
+} ia_aiq_lens_status;
+
+/*!
+ * \brief Action for the manual focus
+ */
+typedef enum
+{
+ ia_aiq_manual_focus_action_none, /*!< No action for the manual focus is required */
+ ia_aiq_manual_focus_action_set_distance, /*!< Set manual focus distance */
+ ia_aiq_manual_focus_action_set_lens_position, /*!< Set manual lens position */
+ ia_aiq_manual_focus_action_set_focal_distance /*!< Set manual focal distance in um (distance between the lens and the sensor plane, e.g. 4390) */
+} ia_aiq_manual_focus_action;
+
+/*!
+ * \brief Focus bracketing mode.
+ */
+typedef enum
+{
+ ia_aiq_af_bracket_mode_symmetric, /*!< Symmetric focus bracketing around the reference lens position*/
+ ia_aiq_af_bracket_mode_towards_near, /*!< One side focus bracketing. Images are taken towards NEAR end (macro) */
+ ia_aiq_af_bracket_mode_towards_far /*!< One side focus bracketing. Images are taken towards FAR end (infinity)*/
+} ia_aiq_af_bracket_mode;
+
+/*!
+ * \brief Detected scene mode.
+ */
+typedef enum
+{
+ ia_aiq_scene_mode_none = 0,
+ ia_aiq_scene_mode_close_up_portrait = (1 << 0),
+ ia_aiq_scene_mode_portrait = (1 << 1),
+ ia_aiq_scene_mode_lowlight_portrait = (1 << 2),
+ ia_aiq_scene_mode_low_light = (1 << 3),
+ ia_aiq_scene_mode_action = (1 << 4),
+ ia_aiq_scene_mode_backlight = (1 << 5),
+ ia_aiq_scene_mode_landscape = (1 << 6),
+ ia_aiq_scene_mode_document = (1 << 7),
+ ia_aiq_scene_mode_firework = (1 << 8),
+ ia_aiq_scene_mode_lowlight_action = (1 << 9),
+ ia_aiq_scene_mode_baby = (1 << 10),
+ ia_aiq_scene_mode_barcode = (1 << 11)
+} ia_aiq_scene_mode;
+
+/*!
+* \brief Mode for calculating AE bracketing.
+*/
+typedef enum
+{
+ ia_aiq_bracket_mode_none, /*!< No bracketing used. */
+ ia_aiq_bracket_mode_ull = (1 << 0), /*!< Ultra Low Light bracketing used. */
+ ia_aiq_bracket_mode_hdr = (1 << 1) /*!< High Dynamic Range bracketing used. */
+} ia_aiq_bracket_mode;
+
+/*!
+ * \brief Manual focus parameters.
+ */
+typedef struct
+{
+ unsigned int manual_focus_distance; /*!< Manual focus distance in mm*/
+ int manual_lens_position; /*!< Manual lens position */
+ unsigned int manual_focal_distance; /*!< Manual focal_distance in um (e.g. 4390) */
+ ia_aiq_manual_focus_action manual_focus_action; /*!< Manual focus action */
+} ia_aiq_manual_focus_parameters;
+
+/*!
+ * \brief Exposure parameters in terms of generic units.
+ * Structure can be used as input or output from AEC.
+ */
+typedef struct
+{
+ int exposure_time_us; /*!< Exposure time in microseconds, -1 if N/A. */
+ float analog_gain; /*!< Analog gain as a multiplier (e.g. 1.0), -1.0 if N/A. */
+ float digital_gain; /*!< Digital gain as a multiplier (e.g. 1.0), -1.0 if N/A. */
+ float aperture_fn; /*!< f-number of aperture (e.g. 2.8), -1.0 for N/A. TODO: Move to ia_aiq_aperture_control structure. */
+ int total_target_exposure; /*!< Total exposure ie. combination of Et, Ag, Dg, Aperture gain and ND gain, -1 if N/A. */
+ bool nd_filter_enabled; /*!< true or false, false for N/A. */
+ int iso; /*!< ISO value corresponding to the analog gain. -1 if N/A. */
+} ia_aiq_exposure_parameters;
+
+/*!
+ * \brief Exposure parameters in terms of sensor units.
+ * Structure can be used as input or output from AEC.
+ */
+typedef struct
+{
+ unsigned short fine_integration_time; /*!< Integration time specified as a number of pixel clocks added on top of coarse_integration_time. */
+ unsigned short coarse_integration_time; /*!< Integration time specified in multiples of pixel_periods_per_line.*/
+ unsigned short analog_gain_code_global; /*!< Global analog gain code. */
+ unsigned short digital_gain_global; /*!< Global digital gain code. */
+ unsigned short line_length_pixels; /*!< The number of pixels in one row. This includes visible lines and horizontal blanking lines. */
+ unsigned short frame_length_lines; /*!< The number of complete lines (rows) in the output frame. This includes visible lines and vertical blanking lines. */
+} ia_aiq_exposure_sensor_parameters;
+
+/*!
+ * \brief Exposure related restrictions and constants in terms of sensor units.
+ * Camera driver fills and updates these parameters whenever they are changed (for example in mode change).
+ */
+typedef struct
+{
+ float pixel_clock_freq_mhz; /*!< Video timing pixel clock frequency. */
+ unsigned short pixel_periods_per_line; /*!< The number of pixel clock periods in one line (row) time. This includes visible pixels and horizontal blanking time. */
+ unsigned short line_periods_per_field; /*!< The number of complete lines (rows) in the output frame. This includes visible lines and vertical blanking lines. */
+ unsigned short line_periods_vertical_blanking; /*!< Number of vertical blanking lines. Visible lines can be calculated using this and line_periods_per_field (above) value. */
+ unsigned short fine_integration_time_min; /*!< The minimum allowed value for fine_integration_time in AEC outputs. */
+ unsigned short fine_integration_time_max_margin; /*!< fine_integration_time_max = pixel_periods_per_line - fine_integration_time_max_margin. */
+ unsigned short coarse_integration_time_min; /*!< The minimum allowed value for coarse_integration_time in AEC outputs. */
+ unsigned short coarse_integration_time_max_margin; /*!< coarse_integration_time_max = line_periods_per_field - coarse_integration_time_max_margin */
+} ia_aiq_exposure_sensor_descriptor;
+
+/*!
+ * AEC features.
+ * Parameters for enabling/disabling AEC features. Setting ia_aiq_ae_feature_setting_tuning takes feature definitions from CPF.
+ */
+typedef struct {
+
+ ia_aiq_ae_feature_setting motion_blur_control; /*!< AEC modifies exposure time/analog gain ratio based on movement in the image. */
+ ia_aiq_ae_feature_setting backlight_compensation; /*!< AEC analyzes and modifies exposure parameters based on backlight detection algorithm. */
+ ia_aiq_ae_feature_setting face_utilization; /*!< AEC uses face coordinates in exposure calculations for next frame. */
+ ia_aiq_ae_feature_setting red_eye_reduction_flash; /*!< AEC will propose flashes before pre-flashes to reduce red eye effect. */
+ ia_aiq_ae_feature_setting fill_in_flash; /*!< AEC will propose flash in back light situations, where target is close enough. */
+} ia_aiq_ae_features;
+
+
+/*!
+ * \brief Flash modes from the user.
+ */
+typedef enum
+{
+ ia_aiq_flash_mode_auto,
+ ia_aiq_flash_mode_on,
+ ia_aiq_flash_mode_off,
+} ia_aiq_flash_mode;
+
+/*!
+ * \brief Flash status.
+ */
+typedef enum
+{
+ ia_aiq_flash_status_no, /*!< No flash use. */
+ ia_aiq_flash_status_torch, /*!< Torch flash use. */
+ ia_aiq_flash_status_pre, /*!< Pre-flash use. */
+ ia_aiq_flash_status_main, /*!< Main flash use. */
+ ia_aiq_flash_status_red_eye_reduction, /*!< Red Eye Reduction flash use. */
+} ia_aiq_flash_status;
+
+/*!
+ * \brief Depth data type.
+ */
+typedef enum
+{
+ ia_aiq_depth_data_type_vcm, /*!< VCM units */
+ ia_aiq_depth_data_type_mm, /*!< Distance to the object in mm */
+} ia_aiq_depth_data_type;
+
+/*!
+ * \brief Flash parameters.
+ * Structure can be used as input or output from AEC.
+ */
+typedef struct
+{
+ ia_aiq_flash_status status; /*!< Flash status. */
+ char power_prc; /*!< Flash power [0,100] value range maps 0% to 100%, 0 if off. */
+} ia_aiq_flash_parameters;
+
+
+/*!
+ * \brief Grid for weighted histograms.
+ * Pixel values of certain area can be weighted differently based of specified grid.
+ * Weight grid should be passed and used by the component which is calculating the histograms from the frame data. If no pixel accurate
+ * histograms are calculated, the weight map should be given back to AIQ library along with the statistics so that AIQ library can
+ * calculate the weighted histograms itself from the RGBS statistics.
+ * This structure is output as part of AEC results but it can be replaced with custom weight map.
+ */
+typedef struct
+{
+ unsigned short width; /*!< Width of the weight grid. */
+ unsigned short height; /*!< Height of the weight grid. */
+ unsigned char *weights; /*!< Multipliers (weight) of RGB values in the grid. Values range [0, 15]. */
+} ia_aiq_hist_weight_grid;
+
+/*!
+ * \brief Histogram.
+ * AIQ uses internally histogram, which are calculated from RGBS statistics:
+ * - "RAW" frame data i.e. RGBS statistics (corrected BLC + LSC).
+ * - "Color corrected" frame data (corrected BLC + LSC + CCM + WB)
+ * - "Color corrected and weighted" frame data (corrected BLC + LSC + CCM + WB + Weight Map)
+ * If histograms are calculated outside AIQ from frame pixel data (more accurate), it is expected to be "Color corrected and weighted".
+ * Size of histogram data arrays behind the pointers depends on value of num_bins variable in the structure.
+ */
+typedef struct
+{
+ unsigned int num_bins; /*!< Number of histogram bins. */
+ unsigned int *r; /*!< R histogram. */
+ unsigned int *g; /*!< G (both Gr and Gb values) histogram. */
+ unsigned int *b; /*!< B histogram. */
+ unsigned int *rgb; /*!< Combined RGB histogram (all pixel values of R, G and B together) TODO: Remove?. Used in percentile calculation but if GW AWB is done always, the same values are calculated. */
+ unsigned int *rgb_ch; /*!< RGB channel-independent histogram where all channels are treated as grayscale intensities and combined into one histogram. */
+ unsigned int *y; /*!< Luminance histogram. */
+ unsigned int num_r_elements; /*!< Number of elements in the R histogram. */
+ unsigned int num_g_elements; /*!< Number of elements in the G histogram. */
+ unsigned int num_b_elements; /*!< Number of elements in the B histogram. */
+ unsigned int num_rgb_elements; /*!< Number of elements in the combined RGB histogram. */
+ unsigned int num_rgb_ch_elements; /*!< Number of elements in the RGB channel-independent histogram. */
+ unsigned int num_y_elements; /*!< Number of elements in the luminance histogram. */
+} ia_aiq_histogram;
+
+/*!
+ * \brief Grid block
+ * As defined in the AIQ statistics specification.
+ * Ranges of all parameters are [0, 255].
+ */
+typedef struct
+{
+ unsigned char avg_gr; /*!< Average Gr value in the grid. */
+ unsigned char avg_r; /*!< Average R value in the grid. */
+ unsigned char avg_b; /*!< Average B value in the grid. */
+ unsigned char avg_gb; /*!< Average Gb value in the grid. */
+ unsigned char sat; /*!< Percentage of saturated pixels in the block [0, 255]. */
+} rgbs_grid_block;
+
+/*!
+ * \brief R, G, B and Saturation grid block.
+ * As defined in the AIQ statistics specification.
+ * RGBS grid covers the full Field Of View (FOV) of the sensor.
+ */
+typedef struct
+{
+ rgbs_grid_block *blocks_ptr; /*!< RGBS blocks. */
+ unsigned short grid_width; /*!< Grid width. */
+ unsigned short grid_height; /*!< Grid height. */
+} ia_aiq_rgbs_grid; /* ia_aiq_rgbs_grid owns this */
+
+/*!
+ * \brief Grid block for 32-bit HDR.
+ * As defined in the AIQ statistics specification.
+ * Ranges of all parameters are [0, 255].
+ */
+typedef struct
+{
+ unsigned int avg_gr; /*!< Average Gr value in the grid. */
+ unsigned int avg_r; /*!< Average R value in the grid. */
+ unsigned int avg_b; /*!< Average B value in the grid. */
+ unsigned int avg_gb; /*!< Average Gb value in the grid. */
+ unsigned int sat; /*!< Percentage of saturated pixels in the block [0, 255]. */
+} hdr_rgbs_grid_block;
+
+/*!
+ * \brief R, G, B and Saturation grid block for 32-bit HDR statistics.
+ * As defined in the AIQ statistics specification.
+ * HDR RGBS grid covers the full Field Of View (FOV) of the sensor.
+ */
+typedef struct
+{
+ hdr_rgbs_grid_block *blocks_ptr; /*!< HDR RGBS blocks. */
+ unsigned int grid_width; /*!< Grid width. */
+ unsigned int grid_height; /*!< Grid height. */
+ unsigned int grid_data_bit_depth; /*!< Bit depth of data in channel data. */
+} ia_aiq_hdr_rgbs_grid;
+
+/*!
+ * \brief AF statistics
+ * As defined in the AIQ statistics specification.
+ * AF grid covers the full Field Of View (FOV) of the sensor.
+ */
+typedef struct
+{
+ unsigned short grid_width; /*!< Number of block elements horizontally in a grid. */
+ unsigned short grid_height; /*!< Number of block elements vertically in a grid. */
+ unsigned short block_width; /*!< Block width (bq per block element). */
+ unsigned short block_height; /*!< Block height (bq per grid element). */
+ int *filter_response_1; /*!< Filter response of filter 1 (e.g. low pass, used by auto focus). */
+ int *filter_response_2; /*!< Filter response of filter 2 (e.g. high pass, used by auto focus). */
+} ia_aiq_af_grid; /* ia_aiq_af_grid owns filter_response_1 and filter_response_2 */
+
+/*!
+ * \brief Depth grid statistics
+ */
+typedef struct
+{
+ ia_aiq_depth_data_type type; /*!< Data type (VCM units/mm)*/
+ ia_rectangle *grid_rect; /*!< ROI for the grid */
+ int *depth_data; /*!< Depth data (type of data is defined by ia_aiq_depth_data_type) */
+ unsigned char *confidence; /*!< Confidence level */
+ unsigned short grid_width; /*!< Number of grid elements horizontally */
+ unsigned short grid_height; /*!< Number of grid elements vertically */
+} ia_aiq_depth_grid;
+
+/*!
+ * \brief AWB scene modes
+ * Used in AWB as input to restrict White Point between certain CCT range.
+ * Note that not in all cases only CCT range is used to restrict White Point but more intelligent estimation may be used.
+ */
+typedef enum
+{
+ ia_aiq_awb_operation_mode_auto,
+ ia_aiq_awb_operation_mode_daylight, /*!< Restrict CCT range to [5000, 7000]. */
+ ia_aiq_awb_operation_mode_partly_overcast, /*!< Restrict CCT range to [5500, 9000]. */
+ ia_aiq_awb_operation_mode_fully_overcast, /*!< Restrict CCT range to [6000, 7000]. */
+ ia_aiq_awb_operation_mode_fluorescent, /*!< Restrict CCT range to [2700, 5500]. */
+ ia_aiq_awb_operation_mode_incandescent, /*!< Restrict CCT range to [2700, 3100]. */
+ ia_aiq_awb_operation_mode_sunset,
+ ia_aiq_awb_operation_mode_video_conference,
+ ia_aiq_awb_operation_mode_manual_cct_range, /*!< Use given CCT range (see ia_aiq_awb_manual_cct_range). */
+ ia_aiq_awb_operation_mode_manual_white, /*!< Use coordinate (see ia_coordinate) relative to full FOV which should be used as white point. */
+ ia_aiq_awb_operation_mode_production_test,
+ ia_aiq_awb_operation_mode_candlelight,
+ ia_aiq_awb_operation_mode_flash,
+ ia_aiq_awb_operation_mode_snow,
+ ia_aiq_awb_operation_mode_beach,
+} ia_aiq_awb_operation_mode;
+
+/*!
+ * \brief Manual CCT range
+ */
+typedef struct
+{
+ unsigned int min_cct;
+ unsigned int max_cct;
+} ia_aiq_awb_manual_cct_range;
+
+/*!
+ * \brief Frame parameters which describe cropping and scaling (need to be filled by AIQ client for every frame)
+ */
+typedef struct
+{
+ unsigned short horizontal_crop_offset; /*!< Read out offset horizontal. */
+ unsigned short vertical_crop_offset; /*!< Read out offset vertical. */
+ unsigned short cropped_image_width; /*!< Width of cropped area in native resolution. */
+ unsigned short cropped_image_height; /*!< Height of cropped area in native resolution. */
+ unsigned char horizontal_scaling_numerator; /*!< Horizontal scaling factor applied to the cropped image. Horizontal scaling factor = horizontal_scaling_numerator / horizontal_scaling_denominator. */
+ unsigned char horizontal_scaling_denominator; /*!< Horizontal scaling factor applied to the cropped image. Horizontal scaling factor = horizontal_scaling_numerator / horizontal_scaling_denominator. */
+ unsigned char vertical_scaling_numerator; /*!< Vertical scaling factor applied to the cropped image. Vertical scaling factor = vertical_scaling_numerator / vertical_scaling_denominator. */
+ unsigned char vertical_scaling_denominator; /*!< Vertical scaling factor applied to the cropped image. Vertical scaling factor = vertical_scaling_numerator / vertical_scaling_denominator. */
+} ia_aiq_frame_params;
+
+/*!
+ * \brief DC iris control.
+ * When using DC iris, there are no distinct aperture steps. Use these commands to increase or decrease aperture size.
+ */
+typedef enum
+{
+ ia_aiq_aperture_control_dc_iris_auto, /*!< State of the iris is selected automatically. */
+ ia_aiq_aperture_control_dc_iris_hold, /*!< Iris should hold current aperture. */
+ ia_aiq_aperture_control_dc_iris_open, /*!< Iris should open. */
+ ia_aiq_aperture_control_dc_iris_close, /*!< Iris should close. */
+} ia_aiq_aperture_control_dc_iris_command;
+
+/*!
+ * \brief Aperture control parameters.
+ * Aperture controls for both P (where iris has discrete amount of apertures) and DC (where iris has indefinite amount of possible apertures) iris.
+ */
+typedef struct
+{
+ float aperture_fn; /*!< 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 dc_iris_command; /*!< Used only with DC iris. */
+ int code; /*!< Iris module HW register value. */
+} ia_aiq_aperture_control;
+
+/*!
+ * \brief Exposure data for all exposures.
+ */
+typedef struct
+{
+ unsigned int exposure_index; /*!< Exposure index which identifies the exposure. */
+ ia_aiq_exposure_parameters* exposure; /*!< Exposure parameters to be used in the next frame in generic format. */
+ ia_aiq_exposure_sensor_parameters* sensor_exposure; /*!< Exposure parameters to be used in the next frame in sensor specific format. */
+ float distance_from_convergence; /*!< Distance of convergence as an EV shift value. Negative is underexposure, positive is overexposure */
+ bool converged; /*!< Indicates that AE has converged. */
+ unsigned int num_exposure_plan; /*!< Size of the exposure plan. Indicates how many exposure and sensor_exposure parameter structures are in the arrays above. */
+ unsigned int *exposure_plan_ids; /*!< Exposure plan IDs. Used to identify and sync what parameters were changed in the exposure plan. */
+} ia_aiq_ae_exposure_result;
+
+/*!
+ * \brief AEC results.
+ */
+typedef struct
+{
+ ia_aiq_ae_exposure_result* exposures; /*!< Results for each exposure to be used in the next frame. */
+ unsigned int num_exposures; /*!< The number of calculated exposures. */
+ ia_aiq_hist_weight_grid* weight_grid; /*!< Weight map to be used in the next frame histogram calculation. */
+ ia_aiq_flash_parameters* flashes; /*!< Array of flash parameters for each flashes to be used in the next frame. */
+ unsigned int num_flashes; /*!< Number of independent flashes. */
+ unsigned int lux_level_estimate; /*!< Lux level estimate. */
+ ia_aiq_bracket_mode multiframe; /*!< AEC may propose to use multiframe for optimal results. */
+ ia_aiq_ae_flicker_reduction flicker_reduction_mode; /*!< Flicker reduction mode proposed by the AEC algorithm */
+ ia_aiq_aperture_control *aperture_control; /*!< Aperture control parameters. */
+} ia_aiq_ae_results;
+
+/*!
+ * \brief Autofocus algorithm results
+ */
+typedef struct
+{
+ ia_aiq_af_status status; /*!< Focus status */
+ unsigned short current_focus_distance; /*!< Current focusing distance in mm */
+ int next_lens_position; /*!< Next lens position */
+ ia_aiq_lens_driver_action lens_driver_action; /*!< Lens driver action*/
+ bool use_af_assist; /*!< True if the af assist light is to be used at half press, false otherwise */
+ bool final_lens_position_reached; /*!< Lens has reached the final lens position */
+} ia_aiq_af_results;
+
+/*!
+ * \brief Results from AWB.
+ */
+typedef struct
+{
+ float accurate_r_per_g; /*!< Accurate White Point for the image. */
+ float accurate_b_per_g; /*!< Accurate White Point for the image. */
+ float final_r_per_g; /*!< Final White Point, including color appearance modeling. */
+ float final_b_per_g; /*!< Final White Point, including color appearance modeling.*/
+ unsigned int cct_estimate; /*!< Correlated Color Temperature estimate calculated from the accurate WP. */
+ float distance_from_convergence; /*!< Range [0.0f, 1.0f]. Distance from convergence. Value 0.0f means converged. */
+} ia_aiq_awb_results;
+
+/*!
+ * \brief GBCE level.
+ * Allows to override GBCE level defined in the tuning.
+ */
+typedef enum
+{
+ ia_aiq_gbce_level_use_tuning = -1, /*!< Use GBCE level defined in the tuning. */
+ ia_aiq_gbce_level_bypass = 0, /*!< Use the default gamma table without stretching. This level should be used when manual AE parameters are set. */
+ ia_aiq_gbce_level_gamma_stretch, /*!< Apply histogram stretching. */
+ ia_aiq_gbce_level_gamma_stretch_and_power_adaptation, /*!< Histogram stretching & gamma power adaptation. */
+} ia_aiq_gbce_level;
+
+/*!
+* \brief Tone Map level.
+* Allows to override Tone Map level defined in the tuning.
+*/
+
+typedef enum
+{
+ ia_aiq_tone_map_level_use_tuning = -1, /*!< Use Tone Map level defined in the tuning. */
+ ia_aiq_tone_map_level_bypass = 0, /*!< Bypass TM LUT (i.e. legacy GBCE behavior) */
+ ia_aiq_tone_map_level_default, /*!< Put the gains in TM LUT (gamma LUT will have sRGB gamma only) */
+ ia_aiq_tone_map_level_dynamic, /*!< Force dynamic calculation of TM LUT */
+} ia_aiq_tone_map_level;
+
+/*!
+ * \brief Results from GBCE.
+ */
+typedef struct {
+ float* r_gamma_lut; /*!< Gamma LUT for R channel. Range [0.0, 1.0]. */
+ float* b_gamma_lut; /*!< Gamma LUT for B channel. Range [0.0, 1.0]. */
+ float* g_gamma_lut; /*!< Gamma LUT for G channel. Range [0.0, 1.0]. */
+ unsigned int gamma_lut_size; /*!< Number of elements in each gamma LUT. */
+ float* tone_map_lut; /*!< Tone Mapping Gain LUT. Range [0.0 FLT_MAX] */
+ unsigned int tone_map_lut_size; /*!< Number of elements in tone mapping LUT. */
+} ia_aiq_gbce_results;
+
+/*!
+ * \brief Values used in various operations for each color channels.
+ * Value range depends on algorithm output.
+ */
+typedef struct
+{
+ float gr; /*!< A value affecting Gr color channel. */
+ float r; /*!< A value affecting R color channel. */
+ float b; /*!< A value affecting B color channel. */
+ float gb; /*!< A value affecting Gb color channel. */
+} ia_aiq_color_channels;
+
+/*!
+ * \brief LUTs for each color channel.
+ */
+typedef struct
+{
+ float *gr; /*!< LUT for Gr color channel. Range [0.0, 1.0].*/
+ float *r; /*!< LUT for R color channel. Range [0.0, 1.0]. */
+ float *b; /*!< LUT for B color channel. Range [0.0, 1.0]. */
+ float *gb; /*!< LUT for Gb color channel. Range [0.0, 1.0]. */
+ unsigned int size; /*!< Number of elements in each LUT. */
+} ia_aiq_color_channels_lut;
+
+/*!
+ * \brief Shading Adaptor light source weight and its type.
+ */
+typedef struct {
+ float weight;
+ cmc_light_source source_type;
+} light_source_t;
+
+/*!
+* \brief Advanced Color Correction Matrix Structure Returned by Parameter Adaptor.
+*/
+typedef struct {
+ unsigned int sector_count; /*!< Number of color matrix sectors. */
+ unsigned int *hue_of_sectors; /*!< Starting hues of sectors. */
+ float (*advanced_color_conversion_matrices)[3][3]; /*!< Advanced CC matrices. Array of color matrices. Each color matrix optimized using a certain sector. Array size is sector_count*/
+}
+ia_aiq_advanced_ccm_t;
+
+
+
+/*!
+* \brief IR Weight Grid.
+*/
+typedef struct {
+ unsigned int width; /*!< IR Weight grid width */
+ unsigned int height; /*!< IR Weight grid height */
+ unsigned short *ir_weight_grid_R; /*!< Interpolated IR Weight for R channel */
+ unsigned short *ir_weight_grid_G; /*!< Interpolated IR Weight for G channel */
+ unsigned short *ir_weight_grid_B; /*!< Interpolated IR Weight for B channel */
+}
+ia_aiq_ir_weight_t;
+
+/*!
+ * \brief Shading Adaptor results.
+ */
+typedef struct {
+ float *channel_gr; /*!< Pointer to the LSC table for Gr color channel. */
+ float *channel_r; /*!< Pointer to the LSC table for R color channel. */
+ float *channel_b; /*!< Pointer to the LSC table for B color channel. */
+ float *channel_gb; /*!< Pointer to the LSC table for Gb color channel. */
+ unsigned short width; /*!< Width of LSC table. */
+ unsigned short height; /*!< Height of LSC table. */
+ bool lsc_update; /*!< Indicates if LSC table has been modified and shall be updated in ISP. false - no change, true - new LSC. */
+ light_source_t light_source[CMC_NUM_LIGHTSOURCES];/*!< Weights per light source type used in calculation of the LSC tables. */
+ float scene_difficulty; /*!< Weighted cumulative confidence within selected patches (normalized against num_patches). */
+ unsigned short num_patches; /*!< Number of patches that were used to make decision. */
+ float covered_area; /*!< Statistics area covered by selected patches (%). */
+ ia_aiq_frame_params frame_params; /*!< Frame parameters that describe cropped area size and its position under LSC grid. */
+} ia_aiq_sa_results; /* ia_aiq_sa_results owns lsc_grid */
+
+/*!
+ * \brief Results from Parameter Adaptor.
+ */
+typedef struct {
+ float color_conversion_matrix[MAX_COLOR_CONVERSION_MATRIX][MAX_COLOR_CONVERSION_MATRIX]; /*!< CC matrix. */
+ ia_aiq_color_channels black_level; /*!< Black level coefficients of each Bayer channel (absolute level). */
+ ia_aiq_color_channels color_gains; /*!< RGB gains for each color channels including given (in ia_aiq_pa_input_params) color gains and gains calculated from AWB results. */
+ ia_aiq_color_channels_lut linearization; /*!< LUTs for linearization of each color channel after black level correction. */
+ float saturation_factor; /*!< Saturation factor to increase/decrease saturation.*/
+ float brightness_level; /*!< Range [0.0, 1.0]. Indicates level of brightness in the image. */
+ ia_aiq_advanced_ccm_t *preferred_acm; /*!< Advanced CC matrix. */
+ ia_aiq_ir_weight_t *ir_weight; /*!< IR Weight. */
+} ia_aiq_pa_results;
+
+/*!
+ * \brief Autofocus bracketing results
+ */
+typedef struct
+{
+ unsigned short *distances_bracketing; /*!< Ordered array of distances in mm for focus bracketing. Distances are ordered from Infinity to close up.*/
+ int *lens_positions_bracketing; /*!< Ordered array of lens positions for focus bracketing. Order is from FAR and to NEAR end. */
+} ia_aiq_af_bracket_results;
+
+/*!
+ * \brief Accelerometer Events
+ * Gravity Events
+ * Gyroscope Events
+ */
+typedef struct
+{
+ unsigned long long ts; /*!< Time stamp in usec (microseconds) */
+ float x; /*!< Sensor Data in X direction depending on the type of the sensor */
+ float y; /*!< Sensor Data in Y direction depending on the type of the sensor */
+ float z; /*!< Sensor Data in Z direction depending on the type of the sensor */
+ float sensitivity; /*!< Sensitivity of the sensor */
+ unsigned long long fs; /*!< Frame stamp in usec (microseconds) */
+} ia_aiq_sensor_data;
+
+
+/* TODO: Update the structure according to the API */
+/*!
+ * \brief Ambient Light EventsLIGHT_AMBIENTLIGHT
+ * NOTE: This should always match to libsensorhub API
+ */
+typedef struct
+{
+ unsigned long long ts; /*!< Time stamp in usec (microseconds) */
+ float data; /*!< Ambient Light data ? */
+ float sensitivity; /*!< Sensitivity of Ambient Light sensor */
+ unsigned long long fs; /*!< Frame stamp in usec (microseconds) */
+} ia_aiq_ambient_light_events;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _IA_AIQ_TYPES_H_ */
+
+