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_aynr_itf_v3.h"
21 #include "rk_aiq_algo_camgroup_types.h"
22 #include "rk_aiq_types_camgroup_aynr_prvt_v3.h"
23 #include "aynr3/rk_aiq_aynr_algo_itf_v3.h"
24 #include "aynr3/rk_aiq_aynr_algo_v3.h"
25
26
27
28 RKAIQ_BEGIN_DECLARE
29
30
groupAynrV3CreateCtx(RkAiqAlgoContext ** context,const AlgoCtxInstanceCfg * cfg)31 static XCamReturn groupAynrV3CreateCtx(RkAiqAlgoContext **context, const AlgoCtxInstanceCfg* cfg)
32 {
33 LOGI_ANR("%s enter \n", __FUNCTION__ );
34
35 XCamReturn ret = XCAM_RETURN_NO_ERROR;
36 CamGroup_AynrV3_Contex_t *aynr_group_contex = NULL;
37 AlgoCtxInstanceCfgCamGroup *cfgInt = (AlgoCtxInstanceCfgCamGroup*)cfg;
38
39 if(CHECK_ISP_HW_V30()) {
40 aynr_group_contex = (CamGroup_AynrV3_Contex_t*)malloc(sizeof(CamGroup_AynrV3_Contex_t));
41 #if AYNR_USE_JSON_FILE_V3
42 Aynr_result_V3_t ret_v3 = AYNRV3_RET_SUCCESS;
43 ret_v3 = Aynr_Init_V3(&(aynr_group_contex->aynr_contex_v3), (void *)cfgInt->s_calibv2);
44 if(ret_v3 != AYNRV3_RET_SUCCESS) {
45 ret = XCAM_RETURN_ERROR_FAILED;
46 LOGE_ANR("%s: Initializaion ynr group v3 failed (%d)\n", __FUNCTION__, ret);
47 }
48 #endif
49 }
50 else {
51 ret = XCAM_RETURN_ERROR_FAILED;
52 LOGE_ANR("module_hw_version of aynr is invalid!!!!");
53 }
54
55 if(ret != XCAM_RETURN_NO_ERROR) {
56 LOGE_ANR("%s: Initializaion group ynr failed (%d)\n", __FUNCTION__, ret);
57 } else {
58 // to do got aynrSurrViewClib and initinal paras for for surround view
59 aynr_group_contex->group_CalibV2.groupMethod = CalibDbV2_CAMGROUP_AYNRV3_METHOD_MEAN;// to do from json
60 aynr_group_contex->camera_Num = cfgInt->camIdArrayLen;
61
62 *context = (RkAiqAlgoContext *)(aynr_group_contex);
63
64 LOGI_ANR("%s:%d surrViewMethod(1-mean):%d, cameraNum %d \n",
65 __FUNCTION__, __LINE__,
66 aynr_group_contex->group_CalibV2.groupMethod,
67 aynr_group_contex->camera_Num);
68 }
69
70 LOGI_ANR("%s exit ret:%d\n", __FUNCTION__, ret);
71 return ret;
72
73 }
74
groupAynrV3DestroyCtx(RkAiqAlgoContext * context)75 static XCamReturn groupAynrV3DestroyCtx(RkAiqAlgoContext *context)
76 {
77 LOGI_ANR("%s enter \n", __FUNCTION__ );
78
79 XCamReturn ret = XCAM_RETURN_NO_ERROR;
80
81 CamGroup_AynrV3_Contex_t *aynr_group_contex = (CamGroup_AynrV3_Contex_t*)context;
82
83 if(CHECK_ISP_HW_V30()) {
84 Aynr_result_V3_t ret_v3 = AYNRV3_RET_SUCCESS;
85 ret_v3 = Aynr_Release_V3(aynr_group_contex->aynr_contex_v3);
86 if(ret_v3 != AYNRV3_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 aynr 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(aynr_group_contex);
100 }
101
102
103 LOGI_ANR("%s exit ret:%d\n", __FUNCTION__, ret);
104 return ret;
105 }
106
groupAynrV3Prepare(RkAiqAlgoCom * params)107 static XCamReturn groupAynrV3Prepare(RkAiqAlgoCom* params)
108 {
109 LOGI_ANR("%s enter \n", __FUNCTION__ );
110
111 XCamReturn ret = XCAM_RETURN_NO_ERROR;
112
113 CamGroup_AynrV3_Contex_t * aynr_group_contex = (CamGroup_AynrV3_Contex_t *)params->ctx;
114 RkAiqAlgoCamGroupPrepare* para = (RkAiqAlgoCamGroupPrepare*)params;
115
116 if(CHECK_ISP_HW_V30()) {
117 Aynr_Context_V3_t * aynr_contex_v3 = aynr_group_contex->aynr_contex_v3;
118 aynr_contex_v3->prepare_type = params->u.prepare.conf_type;
119 if(!!(params->u.prepare.conf_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB )) {
120 // todo update calib pars for surround view
121 #if AYNR_USE_JSON_FILE_V3
122 void *pCalibdbV2 = (void*)(para->s_calibv2);
123 CalibDbV2_YnrV3_t *ynr_v3 = (CalibDbV2_YnrV3_t*)(CALIBDBV2_GET_MODULE_PTR((void*)pCalibdbV2, ynr_v3));
124 aynr_contex_v3->ynr_v3 = *ynr_v3;
125 aynr_contex_v3->isIQParaUpdate = true;
126 aynr_contex_v3->isReCalculate |= 1;
127 #endif
128 }
129 Aynr_Config_V3_t stAynrConfigV3;
130 stAynrConfigV3.rawHeight = params->u.prepare.sns_op_height;
131 stAynrConfigV3.rawWidth = params->u.prepare.sns_op_width;
132 Aynr_result_V3_t ret_v3 = AYNRV3_RET_SUCCESS;
133 ret_v3 = Aynr_Prepare_V3(aynr_contex_v3, &stAynrConfigV3);
134 if(ret_v3 != AYNRV3_RET_SUCCESS) {
135 ret = XCAM_RETURN_ERROR_FAILED;
136 LOGE_ANR("%s: config ANR failed (%d)\n", __FUNCTION__, ret);
137 }
138 }
139 else {
140 ret = XCAM_RETURN_ERROR_FAILED;
141 LOGE_ANR("module_hw_version of aynr is isvalid!!!!");
142 }
143
144 LOGI_ANR("%s exit ret:%d\n", __FUNCTION__, ret);
145 return ret;
146 }
147
groupAynrV3Processing(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)148 static XCamReturn groupAynrV3Processing(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
149 {
150 LOGI_ANR("%s enter \n", __FUNCTION__ );
151 LOGI_ANR("----------------------------------------------frame_id (%d)----------------------------------------------\n", inparams->frame_id);
152
153 XCamReturn ret = XCAM_RETURN_NO_ERROR;
154 RkAiqAlgoCamGroupProcIn* procParaGroup = (RkAiqAlgoCamGroupProcIn*)inparams;
155 RkAiqAlgoCamGroupProcOut* procResParaGroup = (RkAiqAlgoCamGroupProcOut*)outparams;
156 CamGroup_AynrV3_Contex_t * aynr_group_contex = (CamGroup_AynrV3_Contex_t *)inparams->ctx;
157 int deltaIso = 0;
158
159 //method error
160 if (aynr_group_contex->group_CalibV2.groupMethod <= CalibDbV2_CAMGROUP_AYNRV3_METHOD_MIN
161 || aynr_group_contex->group_CalibV2.groupMethod >= CalibDbV2_CAMGROUP_AYNRV3_METHOD_MAX) {
162 return (ret);
163 }
164
165 //group empty
166 if(procParaGroup->camgroupParmasArray == nullptr) {
167 LOGE_ANR("camgroupParmasArray is null");
168 return(XCAM_RETURN_ERROR_FAILED);
169 }
170
171 //get cur ae exposure
172 Aynr_ExpInfo_V3_t stExpInfoV3;
173 memset(&stExpInfoV3, 0x00, sizeof(Aynr_ExpInfo_V3_t));
174 stExpInfoV3.hdr_mode = 0; //pAnrProcParams->hdr_mode;
175 stExpInfoV3.snr_mode = 0;
176 for(int i = 0; i < 3; i++) {
177 stExpInfoV3.arIso[i] = 50;
178 stExpInfoV3.arAGain[i] = 1.0;
179 stExpInfoV3.arDGain[i] = 1.0;
180 stExpInfoV3.arTime[i] = 0.01;
181 }
182
183
184 //merge ae result, iso mean value
185 rk_aiq_singlecam_3a_result_t* scam_3a_res = procParaGroup->camgroupParmasArray[0];
186 if(scam_3a_res->aec._bEffAecExpValid) {
187 RKAiqAecExpInfo_t* pCurExp = &scam_3a_res->aec._effAecExpInfo;
188 stExpInfoV3.snr_mode = pCurExp->CISFeature.SNR;
189 if((rk_aiq_working_mode_t)procParaGroup->working_mode == RK_AIQ_WORKING_MODE_NORMAL) {
190 stExpInfoV3.hdr_mode = 0;
191 stExpInfoV3.arAGain[0] = pCurExp->LinearExp.exp_real_params.analog_gain;
192 stExpInfoV3.arDGain[0] = pCurExp->LinearExp.exp_real_params.digital_gain * pCurExp->LinearExp.exp_real_params.isp_dgain;
193 stExpInfoV3.arTime[0] = pCurExp->LinearExp.exp_real_params.integration_time;
194 stExpInfoV3.arIso[0] = stExpInfoV3.arAGain[0] * stExpInfoV3.arDGain[0] * 50;
195
196 } else {
197 if(procParaGroup->working_mode == RK_AIQ_ISP_HDR_MODE_2_FRAME_HDR
198 || procParaGroup->working_mode == RK_AIQ_ISP_HDR_MODE_2_LINE_HDR)
199 stExpInfoV3.hdr_mode = 1;
200 else if (procParaGroup->working_mode == RK_AIQ_ISP_HDR_MODE_3_FRAME_HDR
201 || procParaGroup->working_mode == RK_AIQ_ISP_HDR_MODE_3_LINE_HDR)
202 stExpInfoV3.hdr_mode = 2;
203 else {
204 stExpInfoV3.hdr_mode = 0;
205 LOGE_ANR("mode error\n");
206 }
207
208 for(int i = 0; i < 3; i++) {
209 stExpInfoV3.arAGain[i] = pCurExp->HdrExp[i].exp_real_params.analog_gain;
210 stExpInfoV3.arDGain[i] = pCurExp->HdrExp[i].exp_real_params.digital_gain;
211 stExpInfoV3.arTime[i] = pCurExp->HdrExp[i].exp_real_params.integration_time;
212 stExpInfoV3.arIso[i] = stExpInfoV3.arAGain[i] * stExpInfoV3.arDGain[i] * 50;
213 }
214
215 }
216 } else {
217 LOGW("fail to get sensor gain form AE module,use default value ");
218 }
219
220
221
222 if(CHECK_ISP_HW_V30()) {
223 Aynr_Context_V3_t * aynr_contex_v3 = aynr_group_contex->aynr_contex_v3;
224 Aynr_ProcResult_V3_t stAynrResultV3;
225 RK_YNR_Fix_V3_t stFix;
226 stAynrResultV3.stFix = &stFix;
227
228 deltaIso = abs(stExpInfoV3.arIso[stExpInfoV3.hdr_mode] - aynr_contex_v3->stExpInfo.arIso[stExpInfoV3.hdr_mode]);
229 if(deltaIso > AYNRV3_RECALCULATE_DELTA_ISO) {
230 aynr_contex_v3->isReCalculate |= 1;
231 }
232 if(aynr_contex_v3->isReCalculate) {
233 Aynr_result_V3_t ret_v3 = AYNRV3_RET_SUCCESS;
234 ret_v3 = Aynr_Process_V3(aynr_contex_v3, &stExpInfoV3);
235 if(ret_v3 != AYNRV3_RET_SUCCESS) {
236 ret = XCAM_RETURN_ERROR_FAILED;
237 LOGE_ANR("%s: processing ANR failed (%d)\n", __FUNCTION__, ret);
238 }
239 Aynr_GetProcResult_V3(aynr_contex_v3, &stAynrResultV3);
240 outparams->cfg_update = true;
241 LOGD_ANR("recalculate: %d delta_iso:%d \n ", aynr_contex_v3->isReCalculate, deltaIso);
242 } else {
243 outparams->cfg_update = false;
244 }
245
246 for (int i = 0; i < procResParaGroup->arraySize; i++) {
247 if (aynr_contex_v3->isReCalculate) {
248 *(procResParaGroup->camgroupParmasArray[i]->aynr._aynr_procRes_v3._stFix) = *stAynrResultV3.stFix;
249 memcpy(procResParaGroup->camgroupParmasArray[i]->aynr_sigma._aynr_sigma_v3,
250 stAynrResultV3.stSelect->sigma, sizeof(stAynrResultV3.stSelect->sigma));
251 }
252 IS_UPDATE_MEM((procResParaGroup->camgroupParmasArray[i]->aynr._aynr_procRes_v3._stFix), procParaGroup->_offset_is_update) =
253 outparams->cfg_update;
254 }
255 aynr_contex_v3->isReCalculate = 0;
256 }
257 else {
258 ret = XCAM_RETURN_ERROR_FAILED;
259 LOGE_ANR("module_hw_version of aynr is isvalid!!!!");
260 }
261
262 LOGI_ANR("%s exit\n", __FUNCTION__);
263 return ret;
264 }
265
266 RkAiqAlgoDescription g_RkIspAlgoDescCamgroupAynrV3 = {
267 .common = {
268 .version = RKISP_ALGO_CAMGROUP_AYNRV3_VERSION,
269 .vendor = RKISP_ALGO_CAMGROUP_AYNRV3_VENDOR,
270 .description = RKISP_ALGO_CAMGROUP_AYNRV3_DESCRIPTION,
271 .type = RK_AIQ_ALGO_TYPE_AYNR,
272 .id = 0,
273 .create_context = groupAynrV3CreateCtx,
274 .destroy_context = groupAynrV3DestroyCtx,
275 },
276 .prepare = groupAynrV3Prepare,
277 .pre_process = NULL,
278 .processing = groupAynrV3Processing,
279 .post_process = NULL,
280 };
281
282 RKAIQ_END_DECLARE
283