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_abayertnr_itf_v23.h"
21 #include "rk_aiq_algo_camgroup_types.h"
22 #include "rk_aiq_types_camgroup_abayertnr_prvt_v23.h"
23 #include "abayertnrV23/rk_aiq_abayertnr_algo_itf_v23.h"
24 #include "abayertnrV23/rk_aiq_abayertnr_algo_v23.h"
25 
26 
27 
28 RKAIQ_BEGIN_DECLARE
29 
30 
groupAbayertnrV23CreateCtx(RkAiqAlgoContext ** context,const AlgoCtxInstanceCfg * cfg)31 static XCamReturn groupAbayertnrV23CreateCtx(RkAiqAlgoContext **context, const AlgoCtxInstanceCfg* cfg)
32 {
33     LOGI_ANR("%s enter \n", __FUNCTION__ );
34 
35     XCamReturn ret = XCAM_RETURN_NO_ERROR;
36     CamGroup_AbayertnrV23_Contex_t *abayertnr_group_contex = NULL;
37     AlgoCtxInstanceCfgCamGroup *cfgInt = (AlgoCtxInstanceCfgCamGroup*)cfg;
38 
39 
40     if(CHECK_ISP_HW_V32() || CHECK_ISP_HW_V32_LITE()) {
41         abayertnr_group_contex = (CamGroup_AbayertnrV23_Contex_t*)malloc(sizeof(CamGroup_AbayertnrV23_Contex_t));
42 #if ABAYERTNR_USE_JSON_FILE_V23
43         Abayertnr_result_V23_t ret_v23 = ABAYERTNRV23_RET_SUCCESS;
44         ret_v23 = Abayertnr_Init_V23(&(abayertnr_group_contex->abayertnr_contex_v23), (void *)cfgInt->s_calibv2);
45         if(ret_v23 != ABAYERTNRV23_RET_SUCCESS) {
46             ret = XCAM_RETURN_ERROR_FAILED;
47             LOGE_ANR("%s: Initializaion ANR failed (%d)\n", __FUNCTION__, ret);
48         }
49 #endif
50     } else {
51         ret = XCAM_RETURN_ERROR_FAILED;
52         LOGE_ANR("module_hw_version of abayertnr  is invalid!!!!");
53     }
54 
55     if(ret != XCAM_RETURN_NO_ERROR) {
56         LOGE_ANR("%s: Initializaion group bayertnr failed (%d)\n", __FUNCTION__, ret);
57     } else {
58         // to do got abayertnrSurrViewClib and initinal paras for for surround view
59         abayertnr_group_contex->group_CalibV23.groupMethod = CalibDbV2_CAMGROUP_ABAYERTNRV23_METHOD_MEAN;// to do from json
60         abayertnr_group_contex->camera_Num = cfgInt->camIdArrayLen;
61 
62         *context = (RkAiqAlgoContext *)(abayertnr_group_contex);
63 
64         LOGI_ANR("%s:%d surrViewMethod(1-mean):%d, cameraNum %d \n",
65                  __FUNCTION__, __LINE__,
66                  abayertnr_group_contex->group_CalibV23.groupMethod,
67                  abayertnr_group_contex->camera_Num);
68     }
69 
70     LOGI_ANR("%s exit ret:%d\n", __FUNCTION__, ret);
71     return ret;
72 
73 }
74 
groupAbayertnrV23DestroyCtx(RkAiqAlgoContext * context)75 static XCamReturn groupAbayertnrV23DestroyCtx(RkAiqAlgoContext *context)
76 {
77     LOGI_ANR("%s enter \n", __FUNCTION__ );
78 
79     XCamReturn ret = XCAM_RETURN_NO_ERROR;
80 
81     CamGroup_AbayertnrV23_Contex_t *abayertnr_group_contex = (CamGroup_AbayertnrV23_Contex_t*)context;
82 
83     if(CHECK_ISP_HW_V32() || CHECK_ISP_HW_V32_LITE()) {
84         Abayertnr_result_V23_t ret_v23 = ABAYERTNRV23_RET_SUCCESS;
85         ret_v23 = Abayertnr_Release_V23(abayertnr_group_contex->abayertnr_contex_v23);
86         if(ret_v23 != ABAYERTNRV23_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 abayertnr is isvalid!!!!");
94     }
95 
96     if(ret != XCAM_RETURN_NO_ERROR) {
97         LOGE_ANR("%s: release abayertnr failed (%d)\n", __FUNCTION__, ret);
98     } else {
99         free(abayertnr_group_contex);
100     }
101 
102 
103     LOGI_ANR("%s exit ret:%d\n", __FUNCTION__, ret);
104     return ret;
105 }
106 
groupAbayertnrV23Prepare(RkAiqAlgoCom * params)107 static XCamReturn groupAbayertnrV23Prepare(RkAiqAlgoCom* params)
108 {
109     LOGI_ANR("%s enter \n", __FUNCTION__ );
110 
111     XCamReturn ret = XCAM_RETURN_NO_ERROR;
112 
113     CamGroup_AbayertnrV23_Contex_t * abayertnr_group_contex = (CamGroup_AbayertnrV23_Contex_t *)params->ctx;
114     RkAiqAlgoCamGroupPrepare* para = (RkAiqAlgoCamGroupPrepare*)params;
115 
116     if(CHECK_ISP_HW_V32() || CHECK_ISP_HW_V32_LITE()) {
117         Abayertnr_Context_V23_t * abayertnr_contex_v23 = abayertnr_group_contex->abayertnr_contex_v23;
118         if(!!(params->u.prepare.conf_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB )) {
119             // todo  update calib pars for surround view
120 #if ABAYERTNR_USE_JSON_FILE_V23
121             void *pCalibdbV23 = (void*)(para->s_calibv2);
122 #if (RKAIQ_HAVE_BAYERTNR_V23)
123             CalibDbV2_BayerTnrV23_t* bayertnr_v23 =
124                 (CalibDbV2_BayerTnrV23_t*)(CALIBDBV2_GET_MODULE_PTR((void*)pCalibdbV23,
125                                                                     bayertnr_v23));
126 #else
127             CalibDbV2_BayerTnrV23Lite_t* bayertnr_v23 =
128                 (CalibDbV2_BayerTnrV23Lite_t*)(CALIBDBV2_GET_MODULE_PTR((void*)pCalibdbV23,
129                                                                         bayertnr_v23));
130 #endif
131 
132             abayertnr_contex_v23->bayertnr_v23   = *bayertnr_v23;
133             abayertnr_contex_v23->isIQParaUpdate = true;
134             abayertnr_contex_v23->isReCalculate |= 1;
135 #endif
136         }
137         Abayertnr_Config_V23_t stAbayertnrConfigV23;
138         Abayertnr_result_V23_t ret_v23 = ABAYERTNRV23_RET_SUCCESS;
139         ret_v23 = Abayertnr_Prepare_V23(abayertnr_contex_v23, &stAbayertnrConfigV23);
140         if(ret_v23 != ABAYERTNRV23_RET_SUCCESS) {
141             ret = XCAM_RETURN_ERROR_FAILED;
142             LOGE_ANR("%s: config ANR failed (%d)\n", __FUNCTION__, ret);
143         }
144     }
145     else {
146         ret = XCAM_RETURN_ERROR_FAILED;
147         LOGE_ANR("module_hw_version of abayertnr is isvalid!!!!");
148     }
149 
150     LOGI_ANR("%s exit ret:%d\n", __FUNCTION__, ret);
151     return ret;
152 }
153 
groupAbayertnrV23Processing(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)154 static XCamReturn groupAbayertnrV23Processing(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
155 {
156     LOGI_ANR("%s enter \n", __FUNCTION__ );
157     LOGI_ANR("----------------------------------------------frame_id (%d)----------------------------------------------\n", inparams->frame_id);
158 
159     XCamReturn ret = XCAM_RETURN_NO_ERROR;
160     RkAiqAlgoCamGroupProcIn* procParaGroup = (RkAiqAlgoCamGroupProcIn*)inparams;
161     RkAiqAlgoCamGroupProcOut* procResParaGroup = (RkAiqAlgoCamGroupProcOut*)outparams;
162     CamGroup_AbayertnrV23_Contex_t * abayertnr_group_contex = (CamGroup_AbayertnrV23_Contex_t *)inparams->ctx;
163     int deltaIso = 0;
164 
165     //method error
166     if (abayertnr_group_contex->group_CalibV23.groupMethod <= CalibDbV2_CAMGROUP_ABAYERTNRV23_METHOD_MIN
167             ||  abayertnr_group_contex->group_CalibV23.groupMethod >=  CalibDbV2_CAMGROUP_ABAYERTNRV23_METHOD_MAX) {
168         return (ret);
169     }
170 
171     //group empty
172     if(procParaGroup->camgroupParmasArray == nullptr) {
173         LOGE_ANR("camgroupParmasArray is null");
174         return(XCAM_RETURN_ERROR_FAILED);
175     }
176 
177     //get cur ae exposure
178     Abayertnr_ExpInfo_V23_t stExpInfoV23;
179     memset(&stExpInfoV23, 0x00, sizeof(stExpInfoV23));
180     stExpInfoV23.hdr_mode = 0; //pAnrProcParams->hdr_mode;
181     stExpInfoV23.snr_mode = 0;
182     for(int i = 0; i < 3; i++) {
183         stExpInfoV23.arIso[i] = 50;
184         stExpInfoV23.arAGain[i] = 1.0;
185         stExpInfoV23.arDGain[i] = 1.0;
186         stExpInfoV23.arTime[i] = 0.01;
187     }
188 
189     stExpInfoV23.blc_ob_predgain = 1.0f;
190     if(procParaGroup != NULL) {
191         LOGD_ANR(" predgain:%f\n",
192                  procParaGroup->stAblcV32_proc_res.isp_ob_predgain);
193         stExpInfoV23.blc_ob_predgain = procParaGroup->stAblcV32_proc_res.isp_ob_predgain;
194 
195     }
196 
197     //merge ae result, iso mean value
198     rk_aiq_singlecam_3a_result_t* scam_3a_res = procParaGroup->camgroupParmasArray[0];
199     if(scam_3a_res->aec._bEffAecExpValid) {
200         RKAiqAecExpInfo_t* pCurExp = &scam_3a_res->aec._effAecExpInfo;
201         stExpInfoV23.snr_mode = pCurExp->CISFeature.SNR;
202         if((rk_aiq_working_mode_t)procParaGroup->working_mode == RK_AIQ_WORKING_MODE_NORMAL) {
203             stExpInfoV23.hdr_mode = 0;
204             stExpInfoV23.arAGain[0] = pCurExp->LinearExp.exp_real_params.analog_gain;
205             stExpInfoV23.arDGain[0] = pCurExp->LinearExp.exp_real_params.digital_gain;
206             stExpInfoV23.arTime[0] = pCurExp->LinearExp.exp_real_params.integration_time;
207             if(stExpInfoV23.arAGain[0] < 1.0) {
208                 stExpInfoV23.arAGain[0] = 1.0;
209             }
210             if(stExpInfoV23.arDGain[0] < 1.0) {
211                 stExpInfoV23.arDGain[0] = 1.0;
212             }
213             if(stExpInfoV23.blc_ob_predgain < 1.0) {
214                 stExpInfoV23.blc_ob_predgain = 1.0;
215             }
216             stExpInfoV23.arIso[0] = stExpInfoV23.arAGain[0] * stExpInfoV23.arDGain[0] * stExpInfoV23.blc_ob_predgain * 50;
217 
218         } else {
219             if(procParaGroup->working_mode == RK_AIQ_ISP_HDR_MODE_2_FRAME_HDR
220                     || procParaGroup->working_mode == RK_AIQ_ISP_HDR_MODE_2_LINE_HDR)
221                 stExpInfoV23.hdr_mode = 1;
222             else if (procParaGroup->working_mode == RK_AIQ_ISP_HDR_MODE_3_FRAME_HDR
223                      || procParaGroup->working_mode == RK_AIQ_ISP_HDR_MODE_3_LINE_HDR)
224                 stExpInfoV23.hdr_mode = 2;
225             else {
226                 stExpInfoV23.hdr_mode = 0;
227                 LOGE_ANR("mode error\n");
228             }
229 
230             for(int i = 0; i < 3; i++) {
231                 stExpInfoV23.arAGain[i] = pCurExp->HdrExp[i].exp_real_params.analog_gain;
232                 stExpInfoV23.arDGain[i] = pCurExp->HdrExp[i].exp_real_params.digital_gain;
233                 stExpInfoV23.arTime[i] = pCurExp->HdrExp[i].exp_real_params.integration_time;
234                 if(stExpInfoV23.arAGain[i] < 1.0) {
235                     stExpInfoV23.arAGain[i] = 1.0;
236                 }
237                 if(stExpInfoV23.arDGain[i] < 1.0) {
238                     stExpInfoV23.arDGain[i] = 1.0;
239                 }
240                 stExpInfoV23.blc_ob_predgain = 1.0;
241                 stExpInfoV23.arIso[i] = stExpInfoV23.arAGain[i] * stExpInfoV23.arDGain[i] * 50;
242             }
243 
244         }
245     } else {
246         LOGW("fail to get sensor gain form AE module,use default value ");
247     }
248 
249 
250 
251     if(CHECK_ISP_HW_V32() || CHECK_ISP_HW_V32_LITE()) {
252         Abayertnr_Context_V23_t * abayertnr_contex_v23 = abayertnr_group_contex->abayertnr_contex_v23;
253         Abayertnr_ProcResult_V23_t stAbayertnrResultV23;
254         RK_Bayertnr_Fix_V23_t st3DFix;
255         stAbayertnrResultV23.st3DFix = &st3DFix;
256         if(stExpInfoV23.blc_ob_predgain != abayertnr_contex_v23->stExpInfo.blc_ob_predgain) {
257             abayertnr_contex_v23->isReCalculate |= 1;
258         }
259         deltaIso = abs(stExpInfoV23.arIso[stExpInfoV23.hdr_mode] - abayertnr_contex_v23->stExpInfo.arIso[stExpInfoV23.hdr_mode]);
260         if(deltaIso > ABAYERTNRV23_RECALCULATE_DELTA_ISO) {
261             abayertnr_contex_v23->isReCalculate |= 1;
262         }
263         if(abayertnr_contex_v23->isReCalculate) {
264             Abayertnr_result_V23_t ret_v23 = ABAYERTNRV23_RET_SUCCESS;
265             ret_v23 = Abayertnr_Process_V23(abayertnr_contex_v23, &stExpInfoV23);
266             if(ret_v23 != ABAYERTNRV23_RET_SUCCESS) {
267                 ret = XCAM_RETURN_ERROR_FAILED;
268                 LOGE_ANR("%s: processing ANR failed (%d)\n", __FUNCTION__, ret);
269             }
270             outparams->cfg_update = true;
271             LOGD_ANR("recalculate: %d delta_iso:%d \n ", abayertnr_contex_v23->isReCalculate, deltaIso);
272         } else {
273             outparams->cfg_update = false;
274         }
275         Abayertnr_GetProcResult_V23(abayertnr_contex_v23, &stAbayertnrResultV23);
276         for (int i = 0; i < procResParaGroup->arraySize; i++) {
277             *(procResParaGroup->camgroupParmasArray[i]->abayertnr._abayertnr_procRes_v23) = *stAbayertnrResultV23.st3DFix;
278             IS_UPDATE_MEM((procResParaGroup->camgroupParmasArray[i]->abayertnr._abayertnr_procRes_v23), procParaGroup->_offset_is_update) =
279                 outparams->cfg_update;
280         }
281         abayertnr_contex_v23->isReCalculate = 0;
282     }
283 
284 
285     else {
286         ret = XCAM_RETURN_ERROR_FAILED;
287         LOGE_ANR("module_hw_version of abayertnr is isvalid!!!!");
288     }
289 
290     LOGI_ANR("%s exit\n", __FUNCTION__);
291     return ret;
292 }
293 
294 RkAiqAlgoDescription g_RkIspAlgoDescCamgroupAbayertnrV23 = {
295     .common = {
296         .version = RKISP_ALGO_CAMGROUP_ABAYERTNRV23_VERSION,
297         .vendor  = RKISP_ALGO_CAMGROUP_ABAYERTNRV23_VENDOR,
298         .description = RKISP_ALGO_CAMGROUP_ABAYERTNRV23_DESCRIPTION,
299         .type    = RK_AIQ_ALGO_TYPE_AMFNR,
300         .id      = 0,
301         .create_context  = groupAbayertnrV23CreateCtx,
302         .destroy_context = groupAbayertnrV23DestroyCtx,
303     },
304     .prepare = groupAbayertnrV23Prepare,
305     .pre_process = NULL,
306     .processing = groupAbayertnrV23Processing,
307     .post_process = NULL,
308 };
309 
310 RKAIQ_END_DECLARE
311