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