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_abayernr_itf_v2.h"
21 #include "rk_aiq_algo_camgroup_types.h"
22 #include "rk_aiq_types_camgroup_abayernr_prvt_v2.h"
23 #include "arawnr2/rk_aiq_abayernr_algo_itf_v2.h"
24 #include "arawnr2/rk_aiq_abayernr_algo_v2.h"
25
26
27
28 RKAIQ_BEGIN_DECLARE
29
groupAbayernrV2CreateCtx(RkAiqAlgoContext ** context,const AlgoCtxInstanceCfg * cfg)30 static XCamReturn groupAbayernrV2CreateCtx(RkAiqAlgoContext **context, const AlgoCtxInstanceCfg* cfg)
31 {
32 LOGI_ANR("%s enter \n", __FUNCTION__ );
33
34 XCamReturn ret = XCAM_RETURN_NO_ERROR;
35 CamGroup_AbayernrV2_Contex_t *abayernr_group_contex = NULL;
36 AlgoCtxInstanceCfgCamGroup *cfgInt = (AlgoCtxInstanceCfgCamGroup*)cfg;
37
38
39 if(CHECK_ISP_HW_V21()) {
40 abayernr_group_contex = (CamGroup_AbayernrV2_Contex_t*)malloc(sizeof(CamGroup_AbayernrV2_Contex_t));
41 #if (ABAYERNR_USE_JSON_FILE_V2)
42 Abayernr_result_t ret_v1 = ABAYERNR_RET_SUCCESS;
43 ret_v1 = Abayernr_Init_V2(&(abayernr_group_contex->abayernr_contex_v2), (void *)cfgInt->s_calibv2);
44 if(ret_v1 != ABAYERNR_RET_SUCCESS) {
45 ret = XCAM_RETURN_ERROR_FAILED;
46 LOGE_ANR("%s: Initializaion ANR failed (%d)\n", __FUNCTION__, ret);
47 }
48 #endif
49 } else {
50 ret = XCAM_RETURN_ERROR_FAILED;
51 LOGE_ANR("module_hw_version of abayernr is invalid!!!!");
52 }
53
54 if(ret != XCAM_RETURN_NO_ERROR) {
55 LOGE_ANR("%s: Initializaion group bayernr failed (%d)\n", __FUNCTION__, ret);
56 } else {
57 // to do got abayernrSurrViewClib and initinal paras for for surround view
58 abayernr_group_contex->group_CalibV2.groupMethod = CalibDbV2_CAMGROUP_ABAYERNRV2_METHOD_MEAN;// to do from json
59 abayernr_group_contex->camera_Num = cfgInt->camIdArrayLen;
60
61 *context = (RkAiqAlgoContext *)(abayernr_group_contex);
62
63 LOGI_ANR("%s:%d surrViewMethod(1-mean):%d, cameraNum %d \n",
64 __FUNCTION__, __LINE__,
65 abayernr_group_contex->group_CalibV2.groupMethod,
66 abayernr_group_contex->camera_Num);
67 }
68
69 LOGI_ANR("%s exit ret:%d\n", __FUNCTION__, ret);
70 return ret;
71
72 }
73
groupAbayernrV2DestroyCtx(RkAiqAlgoContext * context)74 static XCamReturn groupAbayernrV2DestroyCtx(RkAiqAlgoContext *context)
75 {
76 LOGI_ANR("%s enter \n", __FUNCTION__ );
77
78 XCamReturn ret = XCAM_RETURN_NO_ERROR;
79
80 CamGroup_AbayernrV2_Contex_t *abayernr_group_contex = (CamGroup_AbayernrV2_Contex_t*)context;
81
82 if(CHECK_ISP_HW_V21()) {
83 Abayernr_result_t ret_v1 = ABAYERNR_RET_SUCCESS;
84 ret_v1 = Abayernr_Release_V2(abayernr_group_contex->abayernr_contex_v2);
85 if(ret_v1 != ABAYERNR_RET_SUCCESS) {
86 ret = XCAM_RETURN_ERROR_FAILED;
87 LOGE_ANR("%s: Initializaion ANR failed (%d)\n", __FUNCTION__, ret);
88 }
89 }
90 else {
91 ret = XCAM_RETURN_ERROR_FAILED;
92 LOGE_ANR("module_hw_version of abayernr is isvalid!!!!");
93 }
94
95 if(ret != XCAM_RETURN_NO_ERROR) {
96 LOGE_ANR("%s: release ANR failed (%d)\n", __FUNCTION__, ret);
97 } else {
98 free(abayernr_group_contex);
99 }
100
101
102 LOGI_ANR("%s exit ret:%d\n", __FUNCTION__, ret);
103 return ret;
104 }
105
groupAbayernrV2Prepare(RkAiqAlgoCom * params)106 static XCamReturn groupAbayernrV2Prepare(RkAiqAlgoCom* params)
107 {
108 LOGI_ANR("%s enter \n", __FUNCTION__ );
109
110 XCamReturn ret = XCAM_RETURN_NO_ERROR;
111
112 CamGroup_AbayernrV2_Contex_t * abayernr_group_contex = (CamGroup_AbayernrV2_Contex_t *)params->ctx;
113 RkAiqAlgoCamGroupPrepare* para = (RkAiqAlgoCamGroupPrepare*)params;
114
115 if(CHECK_ISP_HW_V21()) {
116 Abayernr_Context_V2_t * abayernr_contex_v2 = abayernr_group_contex->abayernr_contex_v2;
117 abayernr_contex_v2->prepare_type = params->u.prepare.conf_type;
118 if(!!(params->u.prepare.conf_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB )) {
119 // todo update calib pars for surround view
120 #if ABAYERNR_USE_JSON_FILE_V2
121 void *pCalibdbV2 = (void*)(para->s_calibv2);
122 CalibDbV2_BayerNrV2_t *bayernr_v2 = (CalibDbV2_BayerNrV2_t*)(CALIBDBV2_GET_MODULE_PTR((void*)pCalibdbV2, bayernr_v2));
123 abayernr_contex_v2->bayernr_v2 = *bayernr_v2;
124 abayernr_contex_v2->isIQParaUpdate = true;
125 abayernr_contex_v2->isReCalculate |= 1;
126 #endif
127 }
128 Abayernr_Config_V2_t stAbayernrConfigV2;
129 Abayernr_result_t ret_v1 = ABAYERNR_RET_SUCCESS;
130 ret_v1 = Abayernr_Prepare_V2(abayernr_contex_v2, &stAbayernrConfigV2);
131 if(ret_v1 != ABAYERNR_RET_SUCCESS) {
132 ret = XCAM_RETURN_ERROR_FAILED;
133 LOGE_ANR("%s: config ANR failed (%d)\n", __FUNCTION__, ret);
134 }
135 }
136 else {
137 ret = XCAM_RETURN_ERROR_FAILED;
138 LOGE_ANR("module_hw_version of abayernr is isvalid!!!!");
139 }
140
141 LOGI_ANR("%s exit ret:%d\n", __FUNCTION__, ret);
142 return ret;
143 }
144
groupAbayernrV2Processing(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)145 static XCamReturn groupAbayernrV2Processing(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
146 {
147 LOGI_ANR("%s enter \n", __FUNCTION__ );
148 LOGI_ANR("----------------------------------------------frame_id (%d)----------------------------------------------\n", inparams->frame_id);
149
150 XCamReturn ret = XCAM_RETURN_NO_ERROR;
151 RkAiqAlgoCamGroupProcIn* procParaGroup = (RkAiqAlgoCamGroupProcIn*)inparams;
152 RkAiqAlgoCamGroupProcOut* procResParaGroup = (RkAiqAlgoCamGroupProcOut*)outparams;
153 CamGroup_AbayernrV2_Contex_t * abayernr_group_contex = (CamGroup_AbayernrV2_Contex_t *)inparams->ctx;
154 int deltaIso = 0;
155
156 //method error
157 if (abayernr_group_contex->group_CalibV2.groupMethod <= CalibDbV2_CAMGROUP_ABAYERNRV2_METHOD_MIN
158 || abayernr_group_contex->group_CalibV2.groupMethod >= CalibDbV2_CAMGROUP_ABAYERNRV2_METHOD_MAX) {
159 return (ret);
160 }
161
162 //group empty
163 if(procParaGroup->camgroupParmasArray == nullptr) {
164 LOGE_ANR("camgroupParmasArray is null");
165 return(XCAM_RETURN_ERROR_FAILED);
166 }
167
168 //get cur ae exposure
169 Abayernr_ExpInfo_t stExpInfoV2;
170 memset(&stExpInfoV2, 0x00, sizeof(stExpInfoV2));
171 stExpInfoV2.hdr_mode = 0; //pAnrProcParams->hdr_mode;
172 stExpInfoV2.snr_mode = 0;
173 for(int i = 0; i < 3; i++) {
174 stExpInfoV2.arIso[i] = 50;
175 stExpInfoV2.arAGain[i] = 1.0;
176 stExpInfoV2.arDGain[i] = 1.0;
177 stExpInfoV2.arTime[i] = 0.01;
178 }
179
180
181 //merge ae result, iso mean value
182 rk_aiq_singlecam_3a_result_t* scam_3a_res = procParaGroup->camgroupParmasArray[0];
183 if(scam_3a_res->aec._bEffAecExpValid) {
184 RKAiqAecExpInfo_t* pCurExp = &scam_3a_res->aec._effAecExpInfo;
185 stExpInfoV2.snr_mode = pCurExp->CISFeature.SNR;
186 if((rk_aiq_working_mode_t)procParaGroup->working_mode == RK_AIQ_WORKING_MODE_NORMAL) {
187 stExpInfoV2.hdr_mode = 0;
188 stExpInfoV2.arAGain[0] = pCurExp->LinearExp.exp_real_params.analog_gain;
189 stExpInfoV2.arDGain[0] = pCurExp->LinearExp.exp_real_params.digital_gain *
190 pCurExp->LinearExp.exp_real_params.isp_dgain;
191 stExpInfoV2.arTime[0] = pCurExp->LinearExp.exp_real_params.integration_time;
192 stExpInfoV2.arIso[0] = stExpInfoV2.arAGain[0] * stExpInfoV2.arDGain[0] * 50;
193
194 } else {
195 if(procParaGroup->working_mode == RK_AIQ_ISP_HDR_MODE_2_FRAME_HDR
196 || procParaGroup->working_mode == RK_AIQ_ISP_HDR_MODE_2_LINE_HDR)
197 stExpInfoV2.hdr_mode = 1;
198 else if (procParaGroup->working_mode == RK_AIQ_ISP_HDR_MODE_3_FRAME_HDR
199 || procParaGroup->working_mode == RK_AIQ_ISP_HDR_MODE_3_LINE_HDR)
200 stExpInfoV2.hdr_mode = 2;
201 else {
202 stExpInfoV2.hdr_mode = 0;
203 LOGE_ANR("mode error\n");
204 }
205
206 for(int i = 0; i < 3; i++) {
207 stExpInfoV2.arAGain[i] = pCurExp->HdrExp[i].exp_real_params.analog_gain;
208 stExpInfoV2.arDGain[i] = pCurExp->HdrExp[i].exp_real_params.digital_gain;
209 stExpInfoV2.arTime[i] = pCurExp->HdrExp[i].exp_real_params.integration_time;
210 stExpInfoV2.arIso[i] = stExpInfoV2.arAGain[i] * stExpInfoV2.arDGain[i] * 50;
211 }
212
213 }
214 } else {
215 LOGW("fail to get sensor gain form AE module,use default value ");
216 }
217
218
219
220 if(CHECK_ISP_HW_V21()) {
221 Abayernr_Context_V2_t * abayernr_contex_v2 = abayernr_group_contex->abayernr_contex_v2;
222 Abayernr_ProcResult_V2_t stAbayernrResultV2;
223 RK_Bayernr_2D_Fix_V2_t st2DFix;
224 RK_Bayernr_3D_Fix_V2_t st3DFix;
225 stAbayernrResultV2.st2DFix = &st2DFix;
226 stAbayernrResultV2.st3DFix = &st3DFix;
227
228 deltaIso = abs(stExpInfoV2.arIso[stExpInfoV2.hdr_mode] - abayernr_contex_v2->stExpInfo.arIso[stExpInfoV2.hdr_mode]);
229 if(deltaIso > ABAYERNRV2_DELTA_ISO) {
230 abayernr_contex_v2->isReCalculate |= 1;
231 }
232 if(abayernr_contex_v2->isReCalculate) {
233 Abayernr_result_t ret_v1 = ABAYERNR_RET_SUCCESS;
234 ret_v1 = Abayernr_Process_V2(abayernr_contex_v2, &stExpInfoV2);
235 if(ret_v1 != ABAYERNR_RET_SUCCESS) {
236 ret = XCAM_RETURN_ERROR_FAILED;
237 LOGE_ANR("%s: processing ANR failed (%d)\n", __FUNCTION__, ret);
238 }
239 outparams->cfg_update = true;
240 LOGD_ANR("recalculate: %d delta_iso:%d \n ", abayernr_contex_v2->isReCalculate, deltaIso);
241 } else {
242 outparams->cfg_update = true;
243 }
244 Abayernr_GetProcResult_V2(abayernr_contex_v2, &stAbayernrResultV2);
245 for (int i = 0; i < procResParaGroup->arraySize; i++) {
246 procResParaGroup->camgroupParmasArray[i]->abayernr._abayernr_procRes_v1->st2DParam = *stAbayernrResultV2.st2DFix;
247 procResParaGroup->camgroupParmasArray[i]->abayernr._abayernr_procRes_v1->st3DParam = *stAbayernrResultV2.st3DFix;
248 IS_UPDATE_MEM((procResParaGroup->camgroupParmasArray[i]->abayernr._abayernr_procRes_v1), procParaGroup->_offset_is_update) =
249 outparams->cfg_update;
250 }
251 abayernr_contex_v2->isReCalculate = 0;
252
253 }
254 else {
255 ret = XCAM_RETURN_ERROR_FAILED;
256 LOGE_ANR("module_hw_version of abayernr is isvalid!!!!");
257 }
258
259 LOGI_ANR("%s exit\n", __FUNCTION__);
260 return ret;
261 }
262
263 RkAiqAlgoDescription g_RkIspAlgoDescCamgroupAbayernrV2 = {
264 .common = {
265 .version = RKISP_ALGO_CAMGROUP_ABAYERNRV2_VERSION,
266 .vendor = RKISP_ALGO_CAMGROUP_ABAYERNRV2_VENDOR,
267 .description = RKISP_ALGO_CAMGROUP_ABAYERNRV2_DESCRIPTION,
268 .type = RK_AIQ_ALGO_TYPE_ARAWNR,
269 .id = 0,
270 .create_context = groupAbayernrV2CreateCtx,
271 .destroy_context = groupAbayernrV2DestroyCtx,
272 },
273 .prepare = groupAbayernrV2Prepare,
274 .pre_process = NULL,
275 .processing = groupAbayernrV2Processing,
276 .post_process = NULL,
277 };
278
279 RKAIQ_END_DECLARE
280