1 /*
2 * rk_aiq_algo_camgroup_awb_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 "rk_aiq_algo_camgroup_acnr_itf_v30.h"
21 #include "rk_aiq_algo_camgroup_types.h"
22 #include "rk_aiq_types_camgroup_acnr_prvt_v30.h"
23 #include "acnrV30/rk_aiq_acnr_algo_itf_v30.h"
24 #include "acnrV30/rk_aiq_acnr_algo_v30.h"
25
26
27 RKAIQ_BEGIN_DECLARE
28
29
groupAcnrV30CreateCtx(RkAiqAlgoContext ** context,const AlgoCtxInstanceCfg * cfg)30 static XCamReturn groupAcnrV30CreateCtx(RkAiqAlgoContext **context, const AlgoCtxInstanceCfg* cfg)
31 {
32 LOGI_ANR("%s enter \n", __FUNCTION__ );
33
34 XCamReturn ret = XCAM_RETURN_NO_ERROR;
35 CamGroup_AcnrV30_Contex_t *acnr_group_contex = NULL;
36 AlgoCtxInstanceCfgCamGroup *cfgInt = (AlgoCtxInstanceCfgCamGroup*)cfg;
37
38
39 if(CHECK_ISP_HW_V32() || CHECK_ISP_HW_V32_LITE()) {
40 acnr_group_contex = (CamGroup_AcnrV30_Contex_t*)malloc(sizeof(CamGroup_AcnrV30_Contex_t));
41 #if ACNR_USE_JSON_FILE_V30
42 AcnrV30_result_t ret_v30 = ACNRV30_RET_SUCCESS;
43 ret_v30 = Acnr_Init_V30(&(acnr_group_contex->acnr_contex_v30), (void *)cfgInt->s_calibv2);
44 if(ret_v30 != ACNRV30_RET_SUCCESS) {
45 ret = XCAM_RETURN_ERROR_FAILED;
46 LOGE_ANR("%s: Initializaion ANR failed (%d)\n", __FUNCTION__, ret);
47 }
48 #endif
49 }
50 else {
51 ret = XCAM_RETURN_ERROR_FAILED;
52 LOGE_ANR("module_hw_version of acnr is invalid!!!!");
53 }
54
55 if(ret != XCAM_RETURN_NO_ERROR) {
56 LOGE_ANR("%s: Initializaion group cnr failed (%d)\n", __FUNCTION__, ret);
57 } else {
58 // to do got acnrSurrViewClib and initinal paras for for surround view
59 acnr_group_contex->group_CalibV30.groupMethod = CalibDbV2_CAMGROUP_ACNRV30_METHOD_MEAN;// to do from json
60 acnr_group_contex->camera_Num = cfgInt->camIdArrayLen;
61
62 *context = (RkAiqAlgoContext *)(acnr_group_contex);
63
64 LOGI_ANR("%s:%d surrViewMethod(1-mean):%d, cameraNum %d \n",
65 __FUNCTION__, __LINE__,
66 acnr_group_contex->group_CalibV30.groupMethod,
67 acnr_group_contex->camera_Num);
68 }
69
70 LOGI_ANR("%s exit ret:%d\n", __FUNCTION__, ret);
71 return ret;
72
73 }
74
groupAcnrV30DestroyCtx(RkAiqAlgoContext * context)75 static XCamReturn groupAcnrV30DestroyCtx(RkAiqAlgoContext *context)
76 {
77 LOGI_ANR("%s enter \n", __FUNCTION__ );
78
79 XCamReturn ret = XCAM_RETURN_NO_ERROR;
80
81 CamGroup_AcnrV30_Contex_t *acnr_group_contex = (CamGroup_AcnrV30_Contex_t*)context;
82
83 if(CHECK_ISP_HW_V32() || CHECK_ISP_HW_V32_LITE()) {
84 AcnrV30_result_t ret_v30 = ACNRV30_RET_SUCCESS;
85 ret_v30 = Acnr_Release_V30(acnr_group_contex->acnr_contex_v30);
86 if(ret_v30 != ACNRV30_RET_SUCCESS) {
87 ret = XCAM_RETURN_ERROR_FAILED;
88 LOGE_ANR("%s: Initializaion ANR failed (%d)\n", __FUNCTION__, ret);
89 }
90 }
91 else {
92 ret = XCAM_RETURN_ERROR_FAILED;
93 LOGE_ANR("module_hw_version of acr is isvalid!!!!");
94 }
95
96 if(ret != XCAM_RETURN_NO_ERROR) {
97 LOGE_ANR("%s: release ANR failed (%d)\n", __FUNCTION__, ret);
98 } else {
99 free(acnr_group_contex);
100 }
101
102
103 LOGI_ANR("%s exit ret:%d\n", __FUNCTION__, ret);
104 return ret;
105 }
106
groupAcnrV30Prepare(RkAiqAlgoCom * params)107 static XCamReturn groupAcnrV30Prepare(RkAiqAlgoCom* params)
108 {
109 LOGI_ANR("%s enter \n", __FUNCTION__ );
110
111 XCamReturn ret = XCAM_RETURN_NO_ERROR;
112
113 CamGroup_AcnrV30_Contex_t * acnr_group_contex = (CamGroup_AcnrV30_Contex_t *)params->ctx;
114 RkAiqAlgoCamGroupPrepare* para = (RkAiqAlgoCamGroupPrepare*)params;
115
116 if(CHECK_ISP_HW_V32() || CHECK_ISP_HW_V32_LITE()) {
117 Acnr_Context_V30_t * acnr_contex_v30 = acnr_group_contex->acnr_contex_v30;
118 if(!!(params->u.prepare.conf_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB )) {
119 // todo update calib pars for surround view
120 #if ACNR_USE_JSON_FILE_V30
121 void *pCalibdbV30 = (void*)(para->s_calibv2);
122 CalibDbV2_CNRV30_t *cnr_v30 = (CalibDbV2_CNRV30_t*)(CALIBDBV2_GET_MODULE_PTR((void*)pCalibdbV30, cnr_v30));
123 acnr_contex_v30->cnr_v30 = *cnr_v30;
124 acnr_contex_v30->isIQParaUpdate = true;
125 acnr_contex_v30->isReCalculate |= 1;
126 #endif
127 }
128 Acnr_Config_V30_t stAcnrV30ConfigV30;
129 stAcnrV30ConfigV30.rawHeight = params->u.prepare.sns_op_height;
130 stAcnrV30ConfigV30.rawWidth = params->u.prepare.sns_op_width;
131 AcnrV30_result_t ret_v30 = ACNRV30_RET_SUCCESS;
132 ret_v30 = Acnr_Prepare_V30(acnr_contex_v30, &stAcnrV30ConfigV30);
133 if(ret_v30 != ACNRV30_RET_SUCCESS) {
134 ret = XCAM_RETURN_ERROR_FAILED;
135 LOGE_ANR("%s: config ANR failed (%d)\n", __FUNCTION__, ret);
136 }
137 }
138 else {
139 ret = XCAM_RETURN_ERROR_FAILED;
140 LOGE_ANR("module_hw_version of acnr (%d) is isvalid!!!!");
141 }
142
143 LOGI_ANR("%s exit ret:%d\n", __FUNCTION__, ret);
144 return ret;
145 }
146
groupAcnrV30Processing(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)147 static XCamReturn groupAcnrV30Processing(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
148 {
149 LOGI_ANR("%s enter \n", __FUNCTION__ );
150 LOGI_ANR("----------------------------------------------frame_id (%d)----------------------------------------------\n", inparams->frame_id);
151
152 XCamReturn ret = XCAM_RETURN_NO_ERROR;
153 RkAiqAlgoCamGroupProcIn* procParaGroup = (RkAiqAlgoCamGroupProcIn*)inparams;
154 RkAiqAlgoCamGroupProcOut* procResParaGroup = (RkAiqAlgoCamGroupProcOut*)outparams;
155 CamGroup_AcnrV30_Contex_t * acnr_group_contex = (CamGroup_AcnrV30_Contex_t *)inparams->ctx;
156 int deltaIso = 0;
157
158 //method error
159 if (acnr_group_contex->group_CalibV30.groupMethod <= CalibDbV2_CAMGROUP_ACNRV30_METHOD_MIN
160 || acnr_group_contex->group_CalibV30.groupMethod >= CalibDbV2_CAMGROUP_ACNRV30_METHOD_MAX) {
161 return (ret);
162 }
163
164 //group empty
165 if(procParaGroup->camgroupParmasArray == nullptr) {
166 LOGE_ANR("camgroupParmasArray is null");
167 return(XCAM_RETURN_ERROR_FAILED);
168 }
169
170 //get cur ae exposure
171 AcnrV30_ExpInfo_t stExpInfoV30;
172 memset(&stExpInfoV30, 0x00, sizeof(AcnrV30_ExpInfo_t));
173 stExpInfoV30.hdr_mode = 0; //pAnrProcParams->hdr_mode;
174 stExpInfoV30.snr_mode = 0;
175 for(int i = 0; i < 3; i++) {
176 stExpInfoV30.arIso[i] = 50;
177 stExpInfoV30.arAGain[i] = 1.0;
178 stExpInfoV30.arDGain[i] = 1.0;
179 stExpInfoV30.arTime[i] = 0.01;
180 }
181
182 stExpInfoV30.blc_ob_predgain = 1.0f;
183 if(procParaGroup != NULL) {
184 LOGD_ANR(" predgain:%f\n",
185 procParaGroup->stAblcV32_proc_res.isp_ob_predgain);
186 stExpInfoV30.blc_ob_predgain = procParaGroup->stAblcV32_proc_res.isp_ob_predgain;
187
188 }
189
190 //merge ae result, iso mean value
191 rk_aiq_singlecam_3a_result_t* scam_3a_res = procParaGroup->camgroupParmasArray[0];
192 if(scam_3a_res->aec._bEffAecExpValid) {
193 RKAiqAecExpInfo_t* pCurExp = &scam_3a_res->aec._effAecExpInfo;
194 stExpInfoV30.snr_mode = pCurExp->CISFeature.SNR;
195 if((rk_aiq_working_mode_t)procParaGroup->working_mode == RK_AIQ_WORKING_MODE_NORMAL) {
196 stExpInfoV30.hdr_mode = 0;
197 stExpInfoV30.arAGain[0] = pCurExp->LinearExp.exp_real_params.analog_gain;
198 stExpInfoV30.arDGain[0] = pCurExp->LinearExp.exp_real_params.digital_gain;
199 stExpInfoV30.arTime[0] = pCurExp->LinearExp.exp_real_params.integration_time;
200 if(stExpInfoV30.arAGain[0] < 1.0) {
201 stExpInfoV30.arAGain[0] = 1.0;
202 }
203 if(stExpInfoV30.arDGain[0] < 1.0) {
204 stExpInfoV30.arDGain[0] = 1.0;
205 }
206 if(stExpInfoV30.blc_ob_predgain < 1.0) {
207 stExpInfoV30.blc_ob_predgain = 1.0;
208 }
209 stExpInfoV30.arIso[0] = stExpInfoV30.arAGain[0] * stExpInfoV30.arDGain[0] * stExpInfoV30.blc_ob_predgain * 50;
210
211 } else {
212 if(procParaGroup->working_mode == RK_AIQ_ISP_HDR_MODE_2_FRAME_HDR
213 || procParaGroup->working_mode == RK_AIQ_ISP_HDR_MODE_2_LINE_HDR)
214 stExpInfoV30.hdr_mode = 1;
215 else if (procParaGroup->working_mode == RK_AIQ_ISP_HDR_MODE_3_FRAME_HDR
216 || procParaGroup->working_mode == RK_AIQ_ISP_HDR_MODE_3_LINE_HDR)
217 stExpInfoV30.hdr_mode = 2;
218 else {
219 stExpInfoV30.hdr_mode = 0;
220 LOGE_ANR("mode error\n");
221 }
222 stExpInfoV30.blc_ob_predgain = 1.0;
223 for(int i = 0; i < 3; i++) {
224 stExpInfoV30.arAGain[i] = pCurExp->HdrExp[i].exp_real_params.analog_gain > 1.0f ?
225 pCurExp->HdrExp[i].exp_real_params.analog_gain : 1.0f;
226 stExpInfoV30.arDGain[i] = pCurExp->HdrExp[i].exp_real_params.digital_gain > 1.0f ?
227 pCurExp->HdrExp[i].exp_real_params.digital_gain : 1.0f;
228 stExpInfoV30.arTime[i] = pCurExp->HdrExp[i].exp_real_params.integration_time;
229 stExpInfoV30.arIso[i] = stExpInfoV30.arAGain[i] * stExpInfoV30.arDGain[i] * 50;
230 }
231
232 }
233 } else {
234 LOGW("fail to get sensor gain form AE module,use default value ");
235 }
236
237
238
239 if(CHECK_ISP_HW_V32() || CHECK_ISP_HW_V32_LITE()) {
240 Acnr_Context_V30_t * acnr_contex_v30 = acnr_group_contex->acnr_contex_v30;
241 Acnr_ProcResult_V30_t stAcnrResultV30;
242 RK_CNR_Fix_V30_t stFix;
243 stAcnrResultV30.stFix = &stFix;
244
245 deltaIso = abs(stExpInfoV30.arIso[stExpInfoV30.hdr_mode] - acnr_contex_v30->stExpInfo.arIso[stExpInfoV30.hdr_mode]);
246 if(deltaIso > ACNRV30_RECALCULATE_DELTA_ISO) {
247 acnr_contex_v30->isReCalculate |= 1;
248 }
249 if(stExpInfoV30.blc_ob_predgain != acnr_contex_v30->stExpInfo.blc_ob_predgain) {
250 acnr_contex_v30->isReCalculate |= 1;
251 }
252 if(acnr_contex_v30->isReCalculate) {
253 AcnrV30_result_t ret_v30 = ACNRV30_RET_SUCCESS;
254 ret_v30 = Acnr_Process_V30(acnr_contex_v30, &stExpInfoV30);
255 if(ret_v30 != ACNRV30_RET_SUCCESS) {
256 ret = XCAM_RETURN_ERROR_FAILED;
257 LOGE_ANR("%s: processing ANR failed (%d)\n", __FUNCTION__, ret);
258 }
259 outparams->cfg_update = true;
260 LOGD_ANR("recalculate: %d delta_iso:%d \n ", acnr_contex_v30->isReCalculate, deltaIso);
261 } else {
262 outparams->cfg_update = false;
263 }
264 Acnr_GetProcResult_V30(acnr_contex_v30, &stAcnrResultV30);
265 for (int i = 0; i < procResParaGroup->arraySize; i++) {
266 *(procResParaGroup->camgroupParmasArray[i]->acnr._acnr_procRes_v30) = *stAcnrResultV30.stFix;
267 IS_UPDATE_MEM((procResParaGroup->camgroupParmasArray[i]->acnr._acnr_procRes_v30), procParaGroup->_offset_is_update) =
268 outparams->cfg_update;
269 }
270 acnr_contex_v30->isReCalculate = 0;
271 }
272 else {
273 ret = XCAM_RETURN_ERROR_FAILED;
274 LOGE_ANR("module_hw_version of acnr is isvalid!!!!");
275 }
276
277 LOGI_ANR("%s exit\n", __FUNCTION__);
278 return ret;
279 }
280
281 RkAiqAlgoDescription g_RkIspAlgoDescCamgroupAcnrV30 = {
282 .common = {
283 .version = RKISP_ALGO_CAMGROUP_ACNRV30_VERSION,
284 .vendor = RKISP_ALGO_CAMGROUP_ACNRV30_VENDOR,
285 .description = RKISP_ALGO_CAMGROUP_ACNRV30_DESCRIPTION,
286 .type = RK_AIQ_ALGO_TYPE_ACNR,
287 .id = 0,
288 .create_context = groupAcnrV30CreateCtx,
289 .destroy_context = groupAcnrV30DestroyCtx,
290 },
291 .prepare = groupAcnrV30Prepare,
292 .pre_process = NULL,
293 .processing = groupAcnrV30Processing,
294 .post_process = NULL,
295 };
296
297 RKAIQ_END_DECLARE
298