1 /*
2  * rk_aiq_algo_camgroup_accm_itf.c
3  *
4  *  Copyright (c) 2021 Rockchip Corporation
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  */
19 
20 #include "accm/rk_aiq_accm_algo.h"
21 #include "accm/rk_aiq_algo_accm_itf.h"
22 #include "misc/rk_aiq_algo_camgroup_misc_itf.h"
23 #include "rk_aiq_algo_camgroup_types.h"
24 #include "xcam_log.h"
25 
26 RKAIQ_BEGIN_DECLARE
27 
28 static XCamReturn
create_context(RkAiqAlgoContext ** context,const AlgoCtxInstanceCfg * cfg)29 create_context(RkAiqAlgoContext **context, const AlgoCtxInstanceCfg* cfg)
30 {
31     LOG1_ACCM( "%s: (enter)\n", __FUNCTION__);
32 
33     AlgoCtxInstanceCfgCamGroup *cfgInt = (AlgoCtxInstanceCfgCamGroup*)cfg;
34     RkAiqAlgoContext *ctx = new RkAiqAlgoContext();
35     if (ctx == NULL) {
36         LOGE_ACCM( "%s: create camgroup accm context fail!\n", __FUNCTION__);
37         return XCAM_RETURN_ERROR_MEM;
38     }
39     AccmInit(&ctx->accm_para, cfgInt->s_calibv2);
40     *context = ctx;
41     LOG1_ACCM( "%s: (exit)\n", __FUNCTION__);
42     return XCAM_RETURN_NO_ERROR;
43 }
44 
45 static XCamReturn
destroy_context(RkAiqAlgoContext * context)46 destroy_context(RkAiqAlgoContext *context)
47 {
48     LOG1_ACCM( "%s: (enter)\n", __FUNCTION__);
49 
50     AccmRelease((accm_handle_t)context->accm_para);
51     delete context;
52     context = NULL;
53     LOG1_ACCM( "%s: (exit)\n", __FUNCTION__);
54     return XCAM_RETURN_NO_ERROR;
55 }
56 
57 static XCamReturn
prepare(RkAiqAlgoCom * params)58 prepare(RkAiqAlgoCom* params)
59 {
60     LOG1_ACCM( "%s: (enter)\n", __FUNCTION__);
61     accm_handle_t hAccm = (accm_handle_t)(params->ctx->accm_para);
62 
63     RkAiqAlgoCamGroupPrepare *para = (RkAiqAlgoCamGroupPrepare *)params;
64     hAccm->accmSwInfo.prepare_type = params->u.prepare.conf_type;
65     if(!!(params->u.prepare.conf_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB )) {
66 #if RKAIQ_HAVE_CCM_V1
67         hAccm->ccm_v1 = (CalibDbV2_Ccm_Para_V2_t*)(CALIBDBV2_GET_MODULE_PTR(
68                             (CamCalibDbV2Context_t*)(para->s_calibv2), ccm_calib));
69 #endif
70 
71 #if RKAIQ_HAVE_CCM_V2
72         hAccm->ccm_v2 = (CalibDbV2_Ccm_Para_V32_t*)(CALIBDBV2_GET_MODULE_PTR(
73                             (CamCalibDbV2Context_t*)(para->s_calibv2), ccm_calib_v2));
74 #endif
75     }
76     AccmPrepare((accm_handle_t)(params->ctx->accm_para));
77 
78     LOG1_ACCM( "%s: (exit)\n", __FUNCTION__);
79     return XCAM_RETURN_NO_ERROR;
80 }
81 
82 static XCamReturn
processing(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)83 processing(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
84 {
85     LOG1_ACCM( "%s: (enter)\n", __FUNCTION__);
86 
87     RkAiqAlgoCamGroupProcIn* procParaGroup = (RkAiqAlgoCamGroupProcIn*)inparams;
88     RkAiqAlgoCamGroupProcOut* procResParaGroup = (RkAiqAlgoCamGroupProcOut*)outparams;
89     accm_handle_t hAccm = (accm_handle_t)(inparams->ctx->accm_para);
90 
91     hAccm->isReCal_ = hAccm->isReCal_ ||
92             (hAccm->accmSwInfo.grayMode != procParaGroup->_gray_mode);
93     hAccm->accmSwInfo.grayMode = procParaGroup->_gray_mode;
94 
95     if (!procParaGroup->arraySize) {
96         LOG1_ACCM( "%s: do nothing \n", __FUNCTION__);
97         return XCAM_RETURN_NO_ERROR;
98     }
99 
100     rk_aiq_singlecam_3a_result_t* scam_3a_res = procParaGroup->camgroupParmasArray[0];
101     XCamVideoBuffer* awb_proc_res = scam_3a_res->awb._awbProcRes;
102     if (awb_proc_res) {
103         RkAiqAlgoProcResAwbShared_t* awb_res = (RkAiqAlgoProcResAwbShared_t*)awb_proc_res->map(awb_proc_res);
104         if(awb_res) {
105             if(awb_res->awb_gain_algo.grgain < DIVMIN ||
106                     awb_res->awb_gain_algo.gbgain < DIVMIN ) {
107                 LOGW_ACCM("get wrong awb gain from AWB module ,use default value ");
108             } else {
109                 hAccm->accmSwInfo.awbGain[0] =
110                     awb_res->awb_gain_algo.rgain / awb_res->awb_gain_algo.grgain;
111 
112                 hAccm->accmSwInfo.awbGain[1] =
113                     awb_res->awb_gain_algo.bgain / awb_res->awb_gain_algo.gbgain;
114             }
115             hAccm->accmSwInfo.awbIIRDampCoef = awb_res->awb_smooth_factor;
116             hAccm->accmSwInfo.varianceLuma = awb_res->varianceLuma;
117             hAccm->accmSwInfo.awbConverged = awb_res->awbConverged;
118         } else {
119             LOGW_ACCM("fail to get awb gain form AWB module,use default value ");
120         }
121     } else {
122         LOGW_ACCM("fail to get awb gain form AWB module,use default value ");
123     }
124 
125     if(scam_3a_res->aec._bEffAecExpValid) {
126         RKAiqAecExpInfo_t* pCurExp = &scam_3a_res->aec._effAecExpInfo;
127         if((rk_aiq_working_mode_t)procParaGroup->working_mode == RK_AIQ_WORKING_MODE_NORMAL) {
128             hAccm->accmSwInfo.sensorGain = pCurExp->LinearExp.exp_real_params.analog_gain
129                                            * pCurExp->LinearExp.exp_real_params.digital_gain
130                                            * pCurExp->LinearExp.exp_real_params.isp_dgain;
131         } else if((rk_aiq_working_mode_t)procParaGroup->working_mode >= RK_AIQ_WORKING_MODE_ISP_HDR2
132                   && (rk_aiq_working_mode_t)procParaGroup->working_mode < RK_AIQ_WORKING_MODE_ISP_HDR3)  {
133             LOGD_ACCM("sensor gain choose from second hdr frame for accm");
134             hAccm->accmSwInfo.sensorGain = pCurExp->HdrExp[1].exp_real_params.analog_gain
135                                            * pCurExp->HdrExp[1].exp_real_params.digital_gain
136                                            * pCurExp->HdrExp[1].exp_real_params.isp_dgain;
137         } else if((rk_aiq_working_mode_t)procParaGroup->working_mode >= RK_AIQ_WORKING_MODE_ISP_HDR2
138                   && (rk_aiq_working_mode_t)procParaGroup->working_mode >= RK_AIQ_WORKING_MODE_ISP_HDR3)  {
139             LOGD_ACCM("sensor gain choose from third hdr frame for accm");
140             hAccm->accmSwInfo.sensorGain = pCurExp->HdrExp[2].exp_real_params.analog_gain
141                                            * pCurExp->HdrExp[2].exp_real_params.digital_gain
142                                            * pCurExp->HdrExp[2].exp_real_params.isp_dgain;
143         } else {
144             LOGW_ACCM("working_mode (%d) is invaild ,fail to get sensor gain form AE module,use default value ",
145                       procParaGroup->working_mode);
146         }
147     } else {
148         LOGW_ACCM("fail to get sensor gain form AE module,use default value ");
149     }
150 
151     //LOGI_ACCM( "%s accm_proc_com.u.init:%d \n", __FUNCTION__, inparams->u.proc.init);
152     LOGD_ACCM( "%s: awbIIRDampCoef:%f\n", __FUNCTION__, hAccm->accmSwInfo.awbIIRDampCoef);
153 
154     AccmConfig(hAccm);
155     outparams->cfg_update = hAccm->isReCal_;
156     for (int i = 0; i < procResParaGroup->arraySize; i++) {
157 #if defined(ISP_HW_V32) || defined(ISP_HW_V32_LITE)
158         if (outparams->cfg_update) {
159             *(procResParaGroup->camgroupParmasArray[i]->accm._ccmCfg_v2) =
160                 hAccm->ccmHwConf_v2;
161         }
162         //TODO
163         IS_UPDATE_MEM((procResParaGroup->camgroupParmasArray[i]->accm._ccmCfg_v2), procParaGroup->_offset_is_update) =
164             outparams->cfg_update;
165 #else
166         if (outparams->cfg_update) {
167             *(procResParaGroup->camgroupParmasArray[i]->accm._ccmCfg) =
168                 hAccm->ccmHwConf;
169         }
170         //TODO
171         IS_UPDATE_MEM((procResParaGroup->camgroupParmasArray[i]->accm._ccmCfg), procParaGroup->_offset_is_update) =
172             outparams->cfg_update;
173 #endif
174     }
175     hAccm->isReCal_ = false;
176     LOG1_ACCM( "%s: (exit)\n", __FUNCTION__);
177     return XCAM_RETURN_NO_ERROR;
178 }
179 
180 RkAiqAlgoDescription g_RkIspAlgoDescCamgroupAccm = {
181     .common = {
182         .version = RKISP_ALGO_ACCM_VERSION,
183         .vendor  = RKISP_ALGO_ACCM_VENDOR,
184         .description = RKISP_ALGO_ACCM_DESCRIPTION,
185         .type    = RK_AIQ_ALGO_TYPE_ACCM,
186         .id      = 0,
187         .create_context  = create_context,
188         .destroy_context = destroy_context,
189     },
190     .prepare = prepare,
191     .pre_process = NULL,
192     .processing = processing,
193     .post_process = NULL,
194 };
195 
196 RKAIQ_END_DECLARE
197