/* * Copyright (c) 2021 Rockchip 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. * */ #ifndef _RK_AIQ_USER_API_CUSTOM_AWB_H_ #define _RK_AIQ_USER_API_CUSTOM_AWB_H_ #include "rk_aiq_types.h" /* common structs */ #include "rk_aiq_user_api2_sysctl.h" /* rk_aiq_sys_ctx_t */ #include "awb/rk_aiq_types_awb_stat_v201.h" /* include awb structs*/ RKAIQ_BEGIN_DECLARE /* all awb stats */ typedef struct rk_aiq_customAwb_stats_s { rk_aiq_awb_stat_wp_res_light_v201_t light[RK_AIQ_AWB_MAX_WHITEREGIONS_NUM]; int WpNo2[RK_AIQ_AWB_MAX_WHITEREGIONS_NUM]; rk_aiq_awb_stat_blk_res_v201_t blockResult[RK_AIQ_AWB_GRID_NUM_TOTAL]; rk_aiq_awb_stat_wp_res_light_v201_t multiwindowLightResult[4]; rk_aiq_awb_stat_wp_res_v201_t excWpRangeResult[RK_AIQ_AWB_STAT_WP_RANGE_NUM_V201]; unsigned int WpNoHist[RK_AIQ_AWB_WP_HIST_BIN_NUM]; struct rk_aiq_customAwb_stats_s* next; } rk_aiq_customAwb_stats_t; typedef struct rk_aiq_customAwb_hw_cfg_s { bool awbEnable; bool lscBypEnable; uint8_t frameChoose; unsigned short windowSet[4]; unsigned char lightNum; unsigned short maxR; unsigned short minR; unsigned short maxG; unsigned short minG; unsigned short maxB; unsigned short minB; unsigned short maxY; unsigned short minY; bool uvDetectionEnable; rk_aiq_awb_uv_range_para_t uvRange_param[RK_AIQ_AWB_MAX_WHITEREGIONS_NUM]; bool xyDetectionEnable; rk_aiq_rgb2xy_para_t rgb2xy_param; rk_aiq_awb_xy_range_para_t xyRange_param[RK_AIQ_AWB_MAX_WHITEREGIONS_NUM]; bool threeDyuvEnable; unsigned short threeDyuvIllu[RK_AIQ_AWB_YUV_LS_PARA_NUM]; short icrgb2RYuv_matrix[12]; rk_aiq_awb_rt3dyuv_range_para_t ic3Dyuv2Range_param[RK_AIQ_AWB_YUV_LS_PARA_NUM]; bool multiwindow_en; unsigned short multiwindow[RK_AIQ_AWB_MULTIWINDOW_NUM_V201][4]; rk_aiq_awb_exc_range_v201_t excludeWpRange[RK_AIQ_AWB_EXCLUDE_WP_RANGE_NUM]; bool wpDiffWeiEnable; unsigned char wpDiffwei_y[RK_AIQ_AWBWP_WEIGHT_CURVE_DOT_NUM]; unsigned char wpDiffwei_w[RK_AIQ_AWBWP_WEIGHT_CURVE_DOT_NUM]; rk_aiq_awb_xy_type_v201_t xyRangeTypeForWpHist; bool blkWeightEnable; unsigned char blkWeight[RK_AIQ_AWB_GRID_NUM_TOTAL]; rk_aiq_awb_blk_stat_mode_v201_t blkMeasureMode; rk_aiq_awb_xy_type_v201_t xyRangeTypeForBlkStatistics; rk_aiq_awb_blk_stat_realwp_ill_e illIdxForBlkStatistics; } rk_aiq_customAwb_hw_cfg_t; typedef struct rk_aiq_customAwb_single_hw_cfg_t { unsigned short windowSet[4]; bool multiwindow_en; unsigned short multiwindow[RK_AIQ_AWB_MULTIWINDOW_NUM_V201][4]; bool blkWeightEnable; unsigned char blkWeight[RK_AIQ_AWB_GRID_NUM_TOTAL]; } rk_aiq_customAwb_single_hw_cfg_t; /* different awb result for each camera */ typedef struct rk_aiq_customeAwb_single_results_s { rk_aiq_wb_gain_t awb_gain_algo;//for each camera rk_aiq_customAwb_single_hw_cfg_t awbHwConfig;//for each camera struct rk_aiq_customeAwb_single_results_s *next; } rk_aiq_customeAwb_single_results_t; /* full awb results */ typedef struct rk_aiq_customeAwb_results_s { bool IsConverged; //true: converged; false: not converged rk_aiq_wb_gain_t awb_gain_algo; float awb_smooth_factor; rk_aiq_customAwb_hw_cfg_t awbHwConfig; rk_aiq_customeAwb_single_results_t *next;//defalut vaue is nullptr,which means all cameras with the same cfg; } rk_aiq_customeAwb_results_t; typedef struct rk_aiq_customeAwb_cbs_s { /* ctx is the rk_aiq_sys_ctx_t which is corresponded to * camera, could be mapped to camera id. */ int32_t (*pfn_awb_init)(void* ctx); int32_t (*pfn_awb_run)(void* ctx, const rk_aiq_customAwb_stats_t* pstAwbInfo, rk_aiq_customeAwb_results_t* pstAwbResult); /* not used now */ int32_t (*pfn_awb_ctrl)(void* ctx, uint32_t u32Cmd, void *pValue); int32_t (*pfn_awb_exit)(void* ctx); } rk_aiq_customeAwb_cbs_t; /*! * \brief register custom Awb algo * * \param[in] ctx context * \param[in] cbs custom Awb callbacks * \note should be called after rk_aiq_uapi_sysctl_init */ XCamReturn rk_aiq_uapi2_customAWB_register(const rk_aiq_sys_ctx_t* ctx, rk_aiq_customeAwb_cbs_t* cbs); /*! * \brief enable/disable custom Awb algo * * \param[in] ctx context * \param[in] enable enable/diable custom Awb * \note should be called after rk_aiq_uapi_customAWB_register. If custom Awb was enabled, * Rk awb will be stopped, vice versa. */ XCamReturn rk_aiq_uapi2_customAWB_enable(const rk_aiq_sys_ctx_t* ctx, bool enable); /*! * \brief unregister custom Awb algo * * \param[in] ctx context * \note should be called after rk_aiq_uapi_customAWB_register. */ XCamReturn rk_aiq_uapi2_customAWB_unRegister(const rk_aiq_sys_ctx_t* ctx); RKAIQ_END_DECLARE #endif