/* * 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. */ #pragma once #include "ia_aiq_types.h" #include "ia_isp_types.h" #include "InterpMachine.h" #include "Pipe.h" #include "cpffData.h" #include #include "ia_dpc.h" #include #include "dpc_public.h" #include "bds_public.h" #include "obgrid_public.h" #include "ia_css_lin_types.h" #include "shd_public.h" #include "bnr_public.h" #include "anr_public.h" #include "dm_public.h" #include "ia_css_tnr3_types.h" #include "yuvp1_b0_public.h" #include "yuvp1_c0_public.h" #include "yuvp2_public.h" #include "rgbpp_public.h" #include "ia_css_xnr3_types.h" #ifdef MACRO_KBL_AIC #include "ia_css_rgbir_types.h" #endif #define BypassPowerSaveMode 1 #define OBG_TILE_SIZE 16 #define __AIC_UNUSED(x) (void)(x) typedef struct ia_aiq_output_frame_parameters{ //output_resolution resolution; unsigned short width; unsigned short height; bool fix_flip_x; // fix the x flipping if was done in sensor bool fix_flip_y; // fix the y flipping if was done in sensor } ia_aiq_output_frame_parameters_t; typedef struct aic_input_frame_parameters{ ia_aiq_frame_params sensor_frame_params; /*!< Mandatory. Sensor frame parameters. Describe frame scaling/cropping done in sensor. */ bool fix_flip_x; // fix the x flipping if was done in sensor bool fix_flip_y; // fix the y flipping if was done in sensor } aic_input_frame_parameters_t; typedef struct aic_resolution_config_parameters{ uint16_t horizontal_IF_crop; uint16_t vertical_IF_crop; uint16_t BDSin_img_width; uint16_t BDSin_img_height; uint16_t BDSout_img_width; //without padding uint16_t BDSout_img_height; //without padding //float horizontal_BDS_scale;=BDSout_img_width/BDSin_img_width //float vertical_BDS_scale;=BDSout_img_height/BDSin_img_height uint16_t BDS_horizontal_padding; } aic_resolution_config_parameters_t; //Note that effective_img_width+horizontal_padding= image_output_resolution_width //Note that effective_img_height+vertical_padding= image_output_resolution_height class Array2DInterpMachine { size_t m_size; int m_frameNum, m_modeNum; std::vector m_data; public: Array2DInterpMachine() : m_size(0), m_frameNum(2), m_modeNum(0), m_data(1) {} Array2DInterpMachine(int frames, int modes) : m_size(0), m_frameNum(frames), m_modeNum(modes), m_data((frames + 1)*(modes + 1)) { __AIC_UNUSED(m_modeNum); } void Set(InterpMachine* intMach, int frame_index, int mode_index) { if ((mode_index*m_frameNum + frame_index) >= (int)m_data.size()) m_data.resize(mode_index*m_frameNum + m_frameNum); m_data.at(mode_index*m_frameNum + frame_index) = intMach; m_size++; //std::vector::pointer ptr = &m_data[0]; } void Push(InterpMachine* intMach) { m_data.push_back(intMach); m_size++; } size_t GetSize() { return m_size; } void Clear() { for(unsigned i=0;i (mode_index*m_frameNum + frame_index))) return m_data.at(mode_index*m_frameNum + frame_index); return 0; } const InterpMachine* const operator()(const int frame_index, const int mode_index) const { if ((0 != m_data.size()) && ((int)m_data.size() > (mode_index*m_frameNum + frame_index))) return m_data.at(mode_index*m_frameNum + frame_index); return 0; } }; class Array2DInt { size_t m_size; size_t m_width, m_height; std::vector m_data; public: Array2DInt() : m_size(0), m_width(2), m_height(0), m_data(10) {} Array2DInt(size_t x, size_t y, int init = 0) : m_size(0), m_width(x), m_height(y), m_data(x*y, init) { __AIC_UNUSED(m_height); } void Set(int domNum, int x, int y) { if ((int)m_data.size() <= (int)(y*m_width + x)) m_data.resize(y*m_width + m_width); m_data.at(y*m_width + x) = domNum; m_size++; } void Push(int domNum) { m_data.push_back(domNum); m_size++; } size_t GetSize() { return m_size; } }; ////////////////////////////// // IPU3AICRuntimeParams - gathers all the IPU3 AIC runtime parameters together // (former IPU3AICRuntimeParams) struct IPU3AICRuntimeParams { long long time_stamp; ia_aiq_frame_use frame_use; int mode_index; const aic_input_frame_parameters_t *input_frame_params; /*!< Mandatory. Inputr frame parameters. Describe frame scaling/cropping done in sensor. */ const aic_resolution_config_parameters_t *frame_resolution_parameters; const ia_aiq_output_frame_parameters_t *output_frame_params; /*!< Mandatory. Output frame parameters. */ const ia_aiq_exposure_parameters *exposure_results; /*!< Mandatory. Exposure parameters which are to be used to calculate next ISP parameters. */ const ia_aiq_hist_weight_grid *weight_grid; const ia_aiq_awb_results *awb_results; /*!< Mandatory. WB results which are to be used to calculate next ISP parameters (WB gains, color matrix,etc). */ const ia_aiq_gbce_results *gbce_results; /*!< Mandatory. GBCE Gamma tables which are to be used to calculate next ISP parameters. If NULL pointer is passed, AIC will use static gamma table from the CPF. */ const ia_aiq_pa_results *pa_results; /*!< Mandatory. Parameter adaptor results from AIQ. */ const ia_aiq_sa_results *sa_results; /*!< Mandatory. Shading adaptor results from AIQ. */ uint32_t isp_vamem_type; /*!< Mandatory. ISP vamem type. */ char manual_brightness; /*!< Optional. Manual brightness value range [-128,127]. */ char manual_contrast; /*!< Optional. Manual contrast value range [-128,127]. */ char manual_hue; /*!< Optional. Manual hue value range [-128,127]. */ char manual_saturation; /*!< Optional. Manual saturation value range [-128,127]. */ char manual_sharpness; /*!< Optional. Manual setting for sharpness [-128,127]. */ ia_isp_effect effects; /*!< Optional. Manual setting for special effects. Combination of ia_aiq_effect enums.*/ ia_rectangle *focus_rect; sd_dpc_output *scdpc_data; bool disable_gamma; /*!< Optional. disable gamma for VHDR.*/ bool preserve_color; /*!< Optional. use previous calibration for color processing blocks for VHDR.*/ bool ull_on; /*!< Optional. Flag that is true in the system will run ULL2 after the ISP */ }; /* IPU3AICRuntimeParams owns all pointer variables */ typedef struct aic_inputs { const ia_cmc_t *CMCParsed; ISPPipe *SkyCamPipe; std::vector cpf_in; } aic_inputs_t; #ifdef MACRO_KBL_AIC typedef struct ISP_adjustment { bool adjust_denoise_sharpening; float denoise_power; float sharpening_power; } ISP_adjustment_t; #endif typedef struct aic_parameters { aic_inputs_t inputs; Array2DInterpMachine domain_interp_list; Array2DInt domain_num; unsigned int dump_aic_parameters; bool rgbs_af_grid_valid; bool awbfr_grid_valid; bool ae_grid_valid; #ifdef MACRO_KBL_AIC ISP_adjustment_t isp_adjustment; #endif } aic_parameters_t; typedef struct aic_config { struct ia_css_2500_lin_kernel_config lin_2500_config; /**< Skylake: Linearization config */ struct ia_css_2500_obgrid_kernel_config obgrid_2500_config; /**< Skylake: OBGRID config */ struct ia_css_2500_bnr_kernel_config bnr_2500_config; /**< Skylake: bayer denoise config */ struct ia_css_2500_shd_kernel_config shd_2500_config; /**< Skylake: shading config */ struct ia_css_2500_dm_kernel_config dm_2500_config; /**< Skylake: demosaic config */ struct ia_css_2500_rgbpp_kernel_config rgbpp_2500_config; /**< Skylake: RGBPP config */ struct ia_css_2500_yuvp1_b0_kernel_config yuvp1_2500_config; /**< Skylake: yuvp1 config */ struct ia_css_2500_yuvp1_c0_kernel_config yuvp1_c0_2500_config; /**< Skylake: yuvp1_c0 config */ struct ia_css_2500_yuvp2_kernel_config yuvp2_2500_config; /**< Skylake: yuvp2 config */ struct ia_css_tnr3_kernel_config tnr3_2500_config; /**< Skylake: TNR3 config */ struct ia_css_2500_dpc_kernel_config dpc_2500_config; /**< Skylake: DPC config */ struct ia_css_2500_awb_kernel_config awb_2500_config; /**< Skylake: auto white balance config */ struct ia_css_2500_awb_fr_kernel_config awb_fr_2500_config; /**< Skylake: auto white balance filter response config */ struct ia_css_2500_anr_kernel_config anr_2500_config; /**< Skylake: ANR config */ struct ia_css_2500_af_kernel_config af_2500_config; /**< Skylake: auto focus config */ struct ia_css_2500_ae_kernel_config ae_2500_config; /**< Skylake: auto exposure config */ struct ia_css_2500_bds_kernel_config bds_2500_config; /**< Skylake: bayer downscaler config */ struct ia_css_xnr3_config xnr_2500_config; /**< Skylake: XNR3 config */ #ifdef MACRO_KBL_AIC struct ia_css_2500_rgbir_kernel_config rgbir_2500_config; /**< Skylake: rgbir config */ #endif } aic_config_t; #ifdef MACRO_KBL_AIC struct ia_cp_config { ia_vhdr_config vhdr_config; /**< KBL: vHDR config */ }; #endif