xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/algos/arawnr/rk_aiq_abayernr_algo_v1.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 
2 #include "rk_aiq_abayernr_algo_v1.h"
3 #include "rk_aiq_abayernr_algo_itf_v1.h"
4 
5 RKAIQ_BEGIN_DECLARE
6 
Abayernr_Start_V1(Abayernr_Context_V1_t * pAbayernrCtx)7 Abayernr_result_v1_t Abayernr_Start_V1(Abayernr_Context_V1_t *pAbayernrCtx)
8 {
9     LOGI_ANR( "%s:enter!\n", __FUNCTION__);
10 
11     // initial checks
12     if (pAbayernrCtx == NULL) {
13         return (ABAYERNR_RET_V1_NULL_POINTER);
14     }
15 
16     if ((ABAYERNR_STATE_V1_RUNNING == pAbayernrCtx->eState)
17             || (ABAYERNR_STATE_V1_LOCKED == pAbayernrCtx->eState)) {
18         return (ABAYERNR_RET_V1_FAILURE);
19     }
20 
21     pAbayernrCtx->eState = ABAYERNR_STATE_V1_RUNNING;
22 
23     LOGI_ANR( "%s:exit!\n", __FUNCTION__);
24     return (ABAYERNR_RET_V1_SUCCESS);
25 }
26 
27 
Abayernr_Stop_V1(Abayernr_Context_V1_t * pAbayernrCtx)28 Abayernr_result_v1_t Abayernr_Stop_V1(Abayernr_Context_V1_t *pAbayernrCtx)
29 {
30     LOGI_ANR( "%s:enter!\n", __FUNCTION__);
31 
32     // initial checks
33     if (pAbayernrCtx == NULL) {
34         return (ABAYERNR_RET_V1_NULL_POINTER);
35     }
36 
37     if (ABAYERNR_STATE_V1_LOCKED == pAbayernrCtx->eState) {
38         return (ABAYERNR_RET_V1_FAILURE);
39     }
40 
41     pAbayernrCtx->eState = ABAYERNR_STATE_V1_STOPPED;
42 
43     LOGI_ANR( "%s:exit!\n", __FUNCTION__);
44     return (ABAYERNR_RET_V1_SUCCESS);
45 }
46 
47 #if ABAYERNR_USE_JSON_FILE_V1
48 
49 //anr inint
Abayernr_Init_Json_V1(Abayernr_Context_V1_t ** ppAbayernrCtx,CamCalibDbV2Context_t * pCalibDbV2)50 Abayernr_result_v1_t Abayernr_Init_Json_V1(Abayernr_Context_V1_t **ppAbayernrCtx, CamCalibDbV2Context_t *pCalibDbV2)
51 {
52     Abayernr_Context_V1_t * pAbayernrCtx;
53 
54     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
55 
56     pAbayernrCtx = (Abayernr_Context_V1_t *)malloc(sizeof(Abayernr_Context_V1_t));
57     if(pAbayernrCtx == NULL) {
58         LOGE_ANR("%s(%d): malloc fail\n", __FUNCTION__, __LINE__);
59         return ABAYERNR_RET_V1_NULL_POINTER;
60     }
61 
62     memset(pAbayernrCtx, 0x00, sizeof(Abayernr_Context_V1_t));
63 
64     //gain state init
65     pAbayernrCtx->fRawnr_SF_Strength = 1.0;
66 
67     pAbayernrCtx->eState = ABAYERNR_STATE_V1_INITIALIZED;
68     *ppAbayernrCtx = pAbayernrCtx;
69 
70     pAbayernrCtx->eMode = ABAYERNR_OP_MODE_V1_AUTO;
71     pAbayernrCtx->isIQParaUpdate = false;
72     pAbayernrCtx->isGrayMode = false;
73 
74 #if ABAYERNR_USE_JSON_FILE_V1
75     //read v1 params from xml
76     CalibDbV2_BayerNrV1_t* calibv2_bayernr_v1 =
77         (CalibDbV2_BayerNrV1_t*)(CALIBDBV2_GET_MODULE_PTR(pCalibDbV2, bayernr_v1));
78     bayernrV1_calibdbV2_assign(&pAbayernrCtx->bayernr_v1, calibv2_bayernr_v1);
79 
80 #endif
81 
82 #if RK_SIMULATOR_HW
83     //just for v2 params from html
84 
85 #endif
86 
87 #if ABAYERNR_USE_JSON_FILE_V1
88     pAbayernrCtx->stExpInfo.snr_mode = 1;
89     pAbayernrCtx->eParamMode = ABAYERNR_PARAM_MODE_V1_NORMAL;
90     Abayernr_ConfigSettingParam_V1(pAbayernrCtx, pAbayernrCtx->eParamMode, pAbayernrCtx->stExpInfo.snr_mode);
91 #endif
92 
93     LOGD_ANR("%s(%d): bayernr %f %f %f %d %d %f", __FUNCTION__, __LINE__);
94 
95 
96     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
97     return ABAYERNR_RET_V1_SUCCESS;
98 }
99 
100 #else
101 
102 //anr inint
Abayernr_Init_V1(Abayernr_Context_V1_t ** ppAbayernrCtx,CamCalibDbContext_t * pCalibDb)103 Abayernr_result_v1_t Abayernr_Init_V1(Abayernr_Context_V1_t **ppAbayernrCtx, CamCalibDbContext_t *pCalibDb)
104 {
105     Abayernr_Context_V1_t * pAbayernrCtx;
106 
107     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
108 
109     pAbayernrCtx = (Abayernr_Context_V1_t *)malloc(sizeof(Abayernr_Context_V1_t));
110     if(pAbayernrCtx == NULL) {
111         LOGE_ANR("%s(%d): malloc fail\n", __FUNCTION__, __LINE__);
112         return ABAYERNR_RET_V1_NULL_POINTER;
113     }
114 
115     memset(pAbayernrCtx, 0x00, sizeof(Abayernr_Context_V1_t));
116 
117     //gain state init
118     pAbayernrCtx->fRawnr_SF_Strength = 1.0;
119 
120     pAbayernrCtx->eState = ABAYERNR_STATE_V1_INITIALIZED;
121     *ppAbayernrCtx = pAbayernrCtx;
122 
123     pAbayernrCtx->eMode = ABAYERNR_OP_MODE_V1_AUTO;
124     pAbayernrCtx->isIQParaUpdate = false;
125     pAbayernrCtx->isGrayMode = false;
126 
127 #if ABAYERNR_USE_XML_FILE_V1
128     //read v1 params from xml
129     pAbayernrCtx->stBayernrCalib = *(CalibDb_BayerNr_2_t*)(CALIBDB_GET_MODULE_PTR((void*)pCalibDb, bayerNr));
130 #endif
131 
132 #if RK_SIMULATOR_HW
133     //just for v2 params from html
134 
135 #endif
136 
137 #if ABAYERNR_USE_XML_FILE_V1
138     pAbayernrCtx->stExpInfo.snr_mode = 1;
139     pAbayernrCtx->eParamMode = ABAYERNR_PARAM_MODE_V1_NORMAL;
140     Abayernr_ParamModeProcess_V1(pAbayernrCtx, &pAbayernrCtx->stExpInfo, &pAbayernrCtx->eParamMode);
141 #endif
142 
143     LOGD_ANR("%s(%d): bayernr %f %f %f %d %d %f", __FUNCTION__, __LINE__);
144 
145 
146     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
147     return ABAYERNR_RET_V1_SUCCESS;
148 }
149 #endif
150 
151 //anr release
Abayernr_Release_V1(Abayernr_Context_V1_t * pAbayernrCtx)152 Abayernr_result_v1_t Abayernr_Release_V1(Abayernr_Context_V1_t *pAbayernrCtx)
153 {
154     Abayernr_result_v1_t result = ABAYERNR_RET_V1_SUCCESS;
155     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
156     if(pAbayernrCtx == NULL) {
157         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
158         return ABAYERNR_RET_V1_NULL_POINTER;
159     }
160 
161     result = Abayernr_Stop_V1(pAbayernrCtx);
162     if (result != ABAYERNR_RET_V1_SUCCESS) {
163         LOGE_ANR( "%s: ANRStop() failed!\n", __FUNCTION__);
164         return (result);
165     }
166 
167     // check state
168     if ((ABAYERNR_STATE_V1_RUNNING == pAbayernrCtx->eState)
169             || (ABAYERNR_STATE_V1_LOCKED == pAbayernrCtx->eState)) {
170         return (ABAYERNR_RET_V1_BUSY);
171     }
172 
173 #if ABAYERNR_USE_JSON_FILE_V1
174     bayernrV1_calibdbV2_release(&pAbayernrCtx->bayernr_v1);
175 #endif
176 
177     memset(pAbayernrCtx, 0x00, sizeof(Abayernr_Context_V1_t));
178     free(pAbayernrCtx);
179 
180     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
181     return ABAYERNR_RET_V1_SUCCESS;
182 }
183 
184 //anr config
Abayernr_Prepare_V1(Abayernr_Context_V1_t * pAbayernrCtx,Abayernr_Config_V1_t * pAbayernrConfig)185 Abayernr_result_v1_t Abayernr_Prepare_V1(Abayernr_Context_V1_t *pAbayernrCtx, Abayernr_Config_V1_t* pAbayernrConfig)
186 {
187     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
188 
189     if(pAbayernrCtx == NULL) {
190         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
191         return ABAYERNR_RET_V1_INVALID_PARM;
192     }
193 
194     if(pAbayernrConfig == NULL) {
195         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
196         return ABAYERNR_RET_V1_INVALID_PARM;
197     }
198 
199     if(!!(pAbayernrCtx->prepare_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB)) {
200         Abayernr_IQParaUpdate_V1(pAbayernrCtx);
201     }
202 
203     Abayernr_Start_V1(pAbayernrCtx);
204 
205     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
206     return ABAYERNR_RET_V1_SUCCESS;
207 }
208 
209 //anr reconfig
Abayernr_ReConfig_V1(Abayernr_Context_V1_t * pAbayernrCtx,Abayernr_Config_V1_t * pAbayernrConfig)210 Abayernr_result_v1_t Abayernr_ReConfig_V1(Abayernr_Context_V1_t *pAbayernrCtx, Abayernr_Config_V1_t* pAbayernrConfig)
211 {
212     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
213     //need todo what?
214 
215     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
216     return ABAYERNR_RET_V1_SUCCESS;
217 }
218 
219 //anr reconfig
Abayernr_IQParaUpdate_V1(Abayernr_Context_V1_t * pAbayernrCtx)220 Abayernr_result_v1_t Abayernr_IQParaUpdate_V1(Abayernr_Context_V1_t *pAbayernrCtx)
221 {
222     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
223     //need todo what?
224 
225     if(pAbayernrCtx->isIQParaUpdate) {
226         LOGD_ANR("IQ data reconfig\n");
227         Abayernr_ConfigSettingParam_V1(pAbayernrCtx, pAbayernrCtx->eParamMode, pAbayernrCtx->stExpInfo.snr_mode);
228         pAbayernrCtx->isIQParaUpdate = false;
229     }
230 
231     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
232     return ABAYERNR_RET_V1_SUCCESS;
233 }
234 
235 
236 //anr preprocess
Abayernr_PreProcess_V1(Abayernr_Context_V1_t * pAbayernrCtx)237 Abayernr_result_v1_t Abayernr_PreProcess_V1(Abayernr_Context_V1_t *pAbayernrCtx)
238 {
239     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
240     //need todo what?
241 
242     Abayernr_IQParaUpdate_V1(pAbayernrCtx);
243 
244     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
245     return ABAYERNR_RET_V1_SUCCESS;
246 }
247 
248 //anr process
Abayernr_Process_V1(Abayernr_Context_V1_t * pAbayernrCtx,Abayernr_ExpInfo_V1_t * pExpInfo)249 Abayernr_result_v1_t Abayernr_Process_V1(Abayernr_Context_V1_t *pAbayernrCtx, Abayernr_ExpInfo_V1_t *pExpInfo)
250 {
251     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
252     Abayernr_ParamMode_V1_t mode = ABAYERNR_PARAM_MODE_V1_INVALID;
253 
254     if(pAbayernrCtx == NULL) {
255         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
256         return ABAYERNR_RET_V1_INVALID_PARM;
257     }
258 
259     if(pExpInfo == NULL) {
260         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
261         return ABAYERNR_RET_V1_INVALID_PARM;
262     }
263 
264     if(pAbayernrCtx->eState != ABAYERNR_STATE_V1_RUNNING) {
265         return ABAYERNR_RET_V1_SUCCESS;
266     }
267 
268 
269     Abayernr_ParamModeProcess_V1(pAbayernrCtx, pExpInfo, &mode);
270 
271     if(pAbayernrCtx->eMode == ABAYERNR_OP_MODE_V1_AUTO) {
272 
273         LOGD_ANR("%s(%d): \n", __FUNCTION__, __LINE__);
274 
275 #if ABAYERNR_USE_XML_FILE_V1
276         if(pExpInfo->snr_mode != pAbayernrCtx->stExpInfo.snr_mode || pAbayernrCtx->eParamMode != mode) {
277             LOGD_ANR("param mode:%d snr_mode:%d\n", mode, pExpInfo->snr_mode);
278             pAbayernrCtx->eParamMode = mode;
279             Abayernr_ConfigSettingParam_V1(pAbayernrCtx, pAbayernrCtx->eParamMode, pExpInfo->snr_mode);
280         }
281 #endif
282 
283         //select param
284         select_bayernrV1_params_by_ISO(&pAbayernrCtx->stAuto.stParams, &pAbayernrCtx->stAuto.stSelect, pExpInfo);
285 
286     } else if(pAbayernrCtx->eMode == ABAYERNR_OP_MODE_V1_MANUAL) {
287         //TODO
288     }
289 
290     memcpy(&pAbayernrCtx->stExpInfo, pExpInfo, sizeof(Abayernr_ExpInfo_V1_t));
291 
292     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
293     return ABAYERNR_RET_V1_SUCCESS;
294 
295 }
296 
297 
298 
299 //anr get result
Abayernr_GetProcResult_V1(Abayernr_Context_V1_t * pAbayernrCtx,Abayernr_ProcResult_V1_t * pAbayernrResult)300 Abayernr_result_v1_t Abayernr_GetProcResult_V1(Abayernr_Context_V1_t *pAbayernrCtx, Abayernr_ProcResult_V1_t* pAbayernrResult)
301 {
302     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
303 
304     if(pAbayernrCtx == NULL) {
305         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
306         return ABAYERNR_RET_V1_INVALID_PARM;
307     }
308 
309     if(pAbayernrResult == NULL) {
310         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
311         return ABAYERNR_RET_V1_INVALID_PARM;
312     }
313 
314     if(pAbayernrCtx->eMode == ABAYERNR_OP_MODE_V1_AUTO) {
315         pAbayernrResult->stSelect = pAbayernrCtx->stAuto.stSelect;
316         pAbayernrResult->bayernrEn = pAbayernrCtx->stAuto.bayernrEn;
317 
318     } else if(pAbayernrCtx->eMode == ABAYERNR_OP_MODE_V1_MANUAL) {
319         //TODO
320         pAbayernrResult->stSelect = pAbayernrCtx->stManual.stSelect;
321         pAbayernrResult->bayernrEn = pAbayernrCtx->stManual.bayernrEn;
322         pAbayernrCtx->fRawnr_SF_Strength = 1.0;
323     }
324 
325     //transfer to reg value
326     bayernrV1_fix_tranfer(&pAbayernrResult->stSelect, &pAbayernrResult->stFix, pAbayernrCtx->fRawnr_SF_Strength);
327     pAbayernrResult->stFix.rawnr_en = pAbayernrResult->bayernrEn;
328 
329     LOGD_ANR("%s:%d xml:local:%d mode:%d  reg: local gain:%d  mfnr gain:%d mode:%d\n",
330              __FUNCTION__, __LINE__);
331 
332     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
333     return ABAYERNR_RET_V1_SUCCESS;
334 }
335 
Abayernr_ConfigSettingParam_V1(Abayernr_Context_V1_t * pAbayernrCtx,Abayernr_ParamMode_V1_t eParamMode,int snr_mode)336 Abayernr_result_v1_t Abayernr_ConfigSettingParam_V1(Abayernr_Context_V1_t *pAbayernrCtx, Abayernr_ParamMode_V1_t eParamMode, int snr_mode)
337 {
338     char snr_name[CALIBDB_NR_SHARP_NAME_LENGTH];
339     char param_mode_name[CALIBDB_MAX_MODE_NAME_LENGTH];
340     memset(param_mode_name, 0x00, sizeof(param_mode_name));
341     memset(snr_name, 0x00, sizeof(snr_name));
342 
343     if(pAbayernrCtx == NULL) {
344         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
345         return ABAYERNR_RET_V1_INVALID_PARM;
346     }
347 
348     //select param mode first
349     if(eParamMode == ABAYERNR_PARAM_MODE_V1_NORMAL) {
350         sprintf(param_mode_name, "%s", "normal");
351     } else if(eParamMode == ABAYERNR_PARAM_MODE_V1_HDR) {
352         sprintf(param_mode_name, "%s", "hdr");
353     } else if(eParamMode == ABAYERNR_PARAM_MODE_V1_GRAY) {
354         sprintf(param_mode_name, "%s", "gray");
355     } else {
356         LOGE_ANR("%s(%d): not support param mode!\n", __FUNCTION__, __LINE__);
357         sprintf(param_mode_name, "%s", "normal");
358     }
359 
360 
361     //then select snr mode next
362     if(snr_mode == 1) {
363         sprintf(snr_name, "%s", "HSNR");
364     } else if(snr_mode == 0) {
365         sprintf(snr_name, "%s", "LSNR");
366     } else {
367         LOGE_ANR("%s(%d): not support snr mode!\n", __FUNCTION__, __LINE__);
368         sprintf(snr_name, "%s", "HSNR");
369     }
370 
371 #if ABAYERNR_USE_JSON_FILE_V1
372     pAbayernrCtx->stAuto.bayernrEn = pAbayernrCtx->bayernr_v1.TuningPara.enable;
373     bayernrV1_config_setting_param_json(&pAbayernrCtx->stAuto.stParams, &pAbayernrCtx->bayernr_v1, param_mode_name, snr_name);
374 #else
375     pAbayernrCtx->stAuto.bayernrEn = pAbayernrCtx->stBayernrCalib.enable;
376     bayernrV1_config_setting_param(&pAbayernrCtx->stAuto.stParams, &pAbayernrCtx->stBayernrCalib, param_mode_name, snr_name);
377 #endif
378 
379     return ABAYERNR_RET_V1_SUCCESS;
380 }
381 
Abayernr_ParamModeProcess_V1(Abayernr_Context_V1_t * pAbayernrCtx,Abayernr_ExpInfo_V1_t * pExpInfo,Abayernr_ParamMode_V1_t * mode)382 Abayernr_result_v1_t Abayernr_ParamModeProcess_V1(Abayernr_Context_V1_t *pAbayernrCtx, Abayernr_ExpInfo_V1_t *pExpInfo, Abayernr_ParamMode_V1_t *mode) {
383     Abayernr_result_v1_t res  = ABAYERNR_RET_V1_SUCCESS;
384     *mode = pAbayernrCtx->eParamMode;
385 
386     if(pAbayernrCtx == NULL) {
387         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
388         return ABAYERNR_RET_V1_INVALID_PARM;
389     }
390 
391     if(pAbayernrCtx->isGrayMode) {
392         *mode = ABAYERNR_PARAM_MODE_V1_GRAY;
393     } else if(pExpInfo->hdr_mode == 0) {
394         *mode = ABAYERNR_PARAM_MODE_V1_NORMAL;
395     } else if(pExpInfo->hdr_mode >= 1) {
396         *mode = ABAYERNR_PARAM_MODE_V1_HDR;
397     } else {
398         *mode = ABAYERNR_PARAM_MODE_V1_NORMAL;
399     }
400 
401     return res;
402 }
403 
404 
405 RKAIQ_END_DECLARE
406 
407 
408