xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/algos/auvnr/rk_aiq_auvnr_algo_itf_v1.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  * rk_aiq_algo_anr_itf.c
3  *
4  *  Copyright (c) 2019 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 "auvnr/rk_aiq_auvnr_algo_itf_v1.h"
21 #include "auvnr/rk_aiq_auvnr_algo_v1.h"
22 #include "rk_aiq_algo_types.h"
23 
24 RKAIQ_BEGIN_DECLARE
25 
26 typedef struct _RkAiqAlgoContext {
27     void* place_holder[0];
28 } RkAiqAlgoContext;
29 
30 
31 static XCamReturn
create_context(RkAiqAlgoContext ** context,const AlgoCtxInstanceCfg * cfg)32 create_context(RkAiqAlgoContext **context, const AlgoCtxInstanceCfg* cfg)
33 {
34 
35     XCamReturn result = XCAM_RETURN_NO_ERROR;
36     LOGI_ANR("%s: (enter)\n", __FUNCTION__ );
37 
38 #if 1
39     Auvnr_Context_V1_t* pAuvnrCtx = NULL;
40 
41 	#if(AUVNR_USE_JSON_FILE_V1)
42 	Auvnr_result_t ret = Auvnr_Init_Json_V1(&pAuvnrCtx, cfg->calibv2);
43 	#else
44     Auvnr_result_t ret = Auvnr_Init_V1(&pAuvnrCtx, cfg->calib);
45 	#endif
46     if(ret != AUVNR_RET_SUCCESS) {
47         result = XCAM_RETURN_ERROR_FAILED;
48         LOGE_ANR("%s: Initializaion ANR failed (%d)\n", __FUNCTION__, ret);
49     } else {
50         *context = (RkAiqAlgoContext *)(pAuvnrCtx);
51     }
52 #endif
53 
54     LOGI_ANR("%s: (exit)\n", __FUNCTION__ );
55     return result;
56 }
57 
58 static XCamReturn
destroy_context(RkAiqAlgoContext * context)59 destroy_context(RkAiqAlgoContext *context)
60 {
61     XCamReturn result = XCAM_RETURN_NO_ERROR;
62 
63     LOGI_ANR("%s: (enter)\n", __FUNCTION__ );
64 
65 #if 1
66     Auvnr_Context_V1_t* pAuvnrCtx = (Auvnr_Context_V1_t*)context;
67     Auvnr_result_t ret = Auvnr_Release_V1(pAuvnrCtx);
68     if(ret != AUVNR_RET_SUCCESS) {
69         result = XCAM_RETURN_ERROR_FAILED;
70         LOGE_ANR("%s: release ANR failed (%d)\n", __FUNCTION__, ret);
71     }
72 #endif
73 
74     LOGI_ANR("%s: (exit)\n", __FUNCTION__ );
75     return result;
76 }
77 
78 static XCamReturn
prepare(RkAiqAlgoCom * params)79 prepare(RkAiqAlgoCom* params)
80 {
81     XCamReturn result = XCAM_RETURN_NO_ERROR;
82 
83     LOGI_ANR("%s: (enter)\n", __FUNCTION__ );
84 
85     Auvnr_Context_V1_t* pAuvnrCtx = (Auvnr_Context_V1_t *)params->ctx;
86     RkAiqAlgoConfigAcnr* pCfgParam = (RkAiqAlgoConfigAcnr*)params;
87 	pAuvnrCtx->prepare_type = params->u.prepare.conf_type;
88 
89 	if(!!(params->u.prepare.conf_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB )){
90 		#if AUVNR_USE_JSON_FILE_V1
91 		void *pCalibDbV2 = (void*)(pCfgParam->com.u.prepare.calibv2);
92 		CalibDbV2_UVNR_t *uvnr_v1 = (CalibDbV2_UVNR_t*)(CALIBDBV2_GET_MODULE_PTR((void*)pCalibDbV2, uvnr_v1));
93 		uvnr_calibdbV2_assign_v1(&pAuvnrCtx->uvnr_v1, uvnr_v1);
94 		CalibDbV2_MFNR_t* pCalibv2_mfnr_v1 =
95             (CalibDbV2_MFNR_t*)(CALIBDBV2_GET_MODULE_PTR(pCalibDbV2, mfnr_v1));
96 		pAuvnrCtx->mfnr_mode_3to1 = pCalibv2_mfnr_v1->TuningPara.mode_3to1;
97 		pAuvnrCtx->mfnr_local_gain_en = pCalibv2_mfnr_v1->TuningPara.local_gain_en;
98 		#else
99 	  	void *pCalibDb = (void*)(pCfgParam->com.u.prepare.calib);
100         pAuvnrCtx->stUvnrCalib=
101             *(CalibDb_UVNR_2_t*)(CALIBDB_GET_MODULE_PTR((void*)pCalibDb, uvnr));
102 		CalibDb_MFNR_2_t *pMfnrCalib=
103         (CalibDb_MFNR_2_t*)(CALIBDB_GET_MODULE_PTR((void*)pCalibDb, mfnr));
104 		pAuvnrCtx->mfnr_mode_3to1 = pMfnrCalib->mode_3to1;
105 		pAuvnrCtx->mfnr_local_gain_en = pMfnrCalib->local_gain_en;
106 		#endif
107 		pAuvnrCtx->isIQParaUpdate = true;
108 	}
109 
110     Auvnr_result_t ret = Auvnr_Prepare_V1(pAuvnrCtx, &pCfgParam->stAuvnrConfig);
111     if(ret != AUVNR_RET_SUCCESS) {
112         result = XCAM_RETURN_ERROR_FAILED;
113         LOGE_ANR("%s: config ANR failed (%d)\n", __FUNCTION__, ret);
114     }
115 
116     LOGI_ANR("%s: (exit)\n", __FUNCTION__ );
117     return result;
118 }
119 
120 static XCamReturn
pre_process(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)121 pre_process(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
122 {
123     XCamReturn result = XCAM_RETURN_NO_ERROR;
124 
125     LOGI_ANR("%s: (enter)\n", __FUNCTION__ );
126     Auvnr_Context_V1_t* pAuvnrCtx = (Auvnr_Context_V1_t *)inparams->ctx;
127 
128     RkAiqAlgoPreAcnr* pAnrPreParams = (RkAiqAlgoPreAcnr*)inparams;
129 
130     if (pAnrPreParams->com.u.proc.gray_mode) {
131         pAuvnrCtx->isGrayMode = true;
132     }else {
133         pAuvnrCtx->isGrayMode = false;
134     }
135 
136     Auvnr_result_t ret = Auvnr_PreProcess_V1(pAuvnrCtx);
137     if(ret != AUVNR_RET_SUCCESS) {
138         result = XCAM_RETURN_ERROR_FAILED;
139         LOGE_ANR("%s: ANRPreProcess failed (%d)\n", __FUNCTION__, ret);
140     }
141 
142     LOGI_ANR("%s: (exit)\n", __FUNCTION__ );
143     return result;
144 }
145 
146 static XCamReturn
processing(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)147 processing(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
148 {
149     XCamReturn result = XCAM_RETURN_NO_ERROR;
150 
151     LOGI_ANR("%s: (enter)\n", __FUNCTION__ );
152 
153 #if 1
154     RkAiqAlgoProcAcnr* pAuvnrProcParams = (RkAiqAlgoProcAcnr*)inparams;
155     RkAiqAlgoProcResAcnr* pAuvnrProcResParams = (RkAiqAlgoProcResAcnr*)outparams;
156     Auvnr_Context_V1_t* pAuvnrCtx = (Auvnr_Context_V1_t *)inparams->ctx;
157     Auvnr_ExpInfo_t stExpInfo;
158     memset(&stExpInfo, 0x00, sizeof(Auvnr_ExpInfo_t));
159 
160     LOGD_ANR("%s:%d init:%d hdr mode:%d  \n",
161              __FUNCTION__, __LINE__,
162              inparams->u.proc.init,
163              pAuvnrProcParams->hdr_mode);
164 
165     stExpInfo.hdr_mode = 0; //pAnrProcParams->hdr_mode;
166     for(int i = 0; i < 3; i++) {
167         stExpInfo.arIso[i] = 50;
168         stExpInfo.arAGain[i] = 1.0;
169         stExpInfo.arDGain[i] = 1.0;
170         stExpInfo.arTime[i] = 0.01;
171     }
172 
173     if(pAuvnrProcParams->hdr_mode == RK_AIQ_WORKING_MODE_NORMAL) {
174         stExpInfo.hdr_mode = 0;
175     } else if(pAuvnrProcParams->hdr_mode == RK_AIQ_ISP_HDR_MODE_2_FRAME_HDR
176               || pAuvnrProcParams->hdr_mode == RK_AIQ_ISP_HDR_MODE_2_LINE_HDR ) {
177         stExpInfo.hdr_mode = 1;
178     } else if(pAuvnrProcParams->hdr_mode == RK_AIQ_ISP_HDR_MODE_3_FRAME_HDR
179               || pAuvnrProcParams->hdr_mode == RK_AIQ_ISP_HDR_MODE_3_LINE_HDR ) {
180         stExpInfo.hdr_mode = 2;
181     }
182 	stExpInfo.snr_mode = 0;
183 
184 #if 1// TODO Merge
185 
186 	RKAiqAecExpInfo_t *preExp = pAuvnrProcParams->com.u.proc.preExp;
187     RKAiqAecExpInfo_t *curExp = pAuvnrProcParams->com.u.proc.curExp;
188 
189     if(preExp != NULL && curExp != NULL) {
190         stExpInfo.cur_snr_mode = curExp->CISFeature.SNR;
191         stExpInfo.pre_snr_mode = preExp->CISFeature.SNR;
192         if(pAuvnrProcParams->hdr_mode == RK_AIQ_WORKING_MODE_NORMAL) {
193             stExpInfo.hdr_mode = 0;
194             stExpInfo.arAGain[0] = curExp->LinearExp.exp_real_params.analog_gain;
195             stExpInfo.arDGain[0] = curExp->LinearExp.exp_real_params.digital_gain;
196             stExpInfo.arTime[0] = curExp->LinearExp.exp_real_params.integration_time;
197 			stExpInfo.arDcgMode[0] = curExp->LinearExp.exp_real_params.dcg_mode;
198             stExpInfo.arIso[0] = stExpInfo.arAGain[0] * stExpInfo.arDGain[0] * 50;
199 
200 			stExpInfo.preAGain[0] = preExp->LinearExp.exp_real_params.analog_gain;
201             stExpInfo.preDGain[0] = preExp->LinearExp.exp_real_params.digital_gain;
202             stExpInfo.preTime[0] = preExp->LinearExp.exp_real_params.integration_time;
203 			stExpInfo.preDcgMode[0] = preExp->LinearExp.exp_real_params.dcg_mode;
204             stExpInfo.preIso[0] = stExpInfo.preAGain[0] * stExpInfo.preDGain[0] * 50;
205             LOGD_ANR("anr: %s-%d, preExp(%f, %f, %f, %d, %d), curExp(%f, %f, %f, %d, %d)\n",
206                     __FUNCTION__, __LINE__,
207                     preExp->LinearExp.exp_real_params.analog_gain,
208                     preExp->LinearExp.exp_real_params.integration_time,
209                     preExp->LinearExp.exp_real_params.digital_gain,
210                     preExp->LinearExp.exp_real_params.dcg_mode,
211                     preExp->CISFeature.SNR,
212                     curExp->LinearExp.exp_real_params.analog_gain,
213                     curExp->LinearExp.exp_real_params.integration_time,
214                     curExp->LinearExp.exp_real_params.digital_gain,
215                     curExp->LinearExp.exp_real_params.dcg_mode,
216                     curExp->CISFeature.SNR);
217         } else {
218             for(int i = 0; i < 3; i++) {
219                 stExpInfo.arAGain[i] =  curExp->HdrExp[i].exp_real_params.analog_gain,
220                 stExpInfo.arDGain[i] = curExp->HdrExp[i].exp_real_params.digital_gain;
221                 stExpInfo.arTime[i] = curExp->HdrExp[i].exp_real_params.integration_time;
222 				stExpInfo.arDcgMode[i] = curExp->HdrExp[i].exp_real_params.dcg_mode;
223                 stExpInfo.arIso[i] = stExpInfo.arAGain[i] * stExpInfo.arDGain[i] * 50;
224 
225 				stExpInfo.preAGain[i] =  preExp->HdrExp[i].exp_real_params.analog_gain,
226                 stExpInfo.preDGain[i] = preExp->HdrExp[i].exp_real_params.digital_gain;
227                 stExpInfo.preTime[i] = preExp->HdrExp[i].exp_real_params.integration_time;
228 				stExpInfo.preDcgMode[i] = preExp->HdrExp[i].exp_real_params.dcg_mode;
229                 stExpInfo.preIso[i] = stExpInfo.preAGain[i] * stExpInfo.preDGain[i] * 50;
230 
231                 LOGD_ANR("%s:%d index:%d again:%f %f dgain:%f %f time:%f %f iso:%d %d hdr_mode:%d  \n",
232                          __FUNCTION__, __LINE__,
233                          i,
234                          stExpInfo.preAGain[i], stExpInfo.arAGain[i],
235                          stExpInfo.preDGain[i], stExpInfo.arDGain[i],
236                          stExpInfo.preTime[i], stExpInfo.arTime[i],
237                          stExpInfo.preIso[i], stExpInfo.arIso[i],
238                          stExpInfo.hdr_mode);
239             }
240         }
241     } else {
242         LOGE_ANR("%s:%d preExp(%p) or curExp(%p) is NULL, so use default instead \n",
243                  __FUNCTION__, __LINE__, preExp, curExp);
244     }
245 
246 
247 #if 0
248     static int anr_cnt = 0;
249     anr_cnt++;
250 
251     if(anr_cnt % 50 == 0) {
252         for(int i = 0; i < stExpInfo.hdr_mode + 1; i++) {
253             printf("%s:%d index:%d again:%f dgain:%f time:%f iso:%d hdr_mode:%d\n",
254                    __FUNCTION__, __LINE__,
255                    i,
256                    stExpInfo.arAGain[i],
257                    stExpInfo.arDGain[i],
258                    stExpInfo.arTime[i],
259                    stExpInfo.arIso[i],
260                    stExpInfo.hdr_mode);
261         }
262     }
263 #endif
264 
265 
266 #endif
267 
268     Auvnr_result_t ret = Auvnr_Process_V1(pAuvnrCtx, &stExpInfo);
269     if(ret != AUVNR_RET_SUCCESS) {
270         result = XCAM_RETURN_ERROR_FAILED;
271         LOGE_ANR("%s: processing ANR failed (%d)\n", __FUNCTION__, ret);
272     }
273 
274     Auvnr_GetProcResult_V1(pAuvnrCtx, &pAuvnrProcResParams->stAuvnrProcResult);
275 #endif
276 
277     LOGI_ANR("%s: (exit)\n", __FUNCTION__ );
278     return XCAM_RETURN_NO_ERROR;
279 }
280 
281 static XCamReturn
post_process(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)282 post_process(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
283 {
284     LOGI_ANR("%s: (enter)\n", __FUNCTION__ );
285 
286     //nothing todo now
287 
288     LOGI_ANR("%s: (exit)\n", __FUNCTION__ );
289     return XCAM_RETURN_NO_ERROR;
290 }
291 
292 RkAiqAlgoDescription g_RkIspAlgoDescAcnr = {
293     .common = {
294         .version = RKISP_ALGO_AUVNR_VERSION_V1,
295         .vendor  = RKISP_ALGO_AUVNR_VENDOR_V1,
296         .description = RKISP_ALGO_AUVNR_DESCRIPTION_V1,
297         .type    = RK_AIQ_ALGO_TYPE_ACNR,
298         .id      = 0,
299         .create_context  = create_context,
300         .destroy_context = destroy_context,
301     },
302     .prepare = prepare,
303     .pre_process = pre_process,
304     .processing = processing,
305     .post_process = post_process,
306 };
307 
308 RKAIQ_END_DECLARE
309