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