xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/algos/anr/rk_aiq_anr_algo_bayernr.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 
2 
3 #include "rk_aiq_anr_algo_bayernr.h"
4 
5 RKAIQ_BEGIN_DECLARE
6 
bayernr_get_mode_cell_idx_by_name(CalibDb_BayerNr_2_t * pCalibdb,char * name,int * mode_idx)7 ANRresult_t bayernr_get_mode_cell_idx_by_name(CalibDb_BayerNr_2_t *pCalibdb, char *name, int *mode_idx)
8 {
9     int i = 0;
10     ANRresult_t res = ANR_RET_SUCCESS;
11 
12     if(pCalibdb == NULL) {
13         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
14         return ANR_RET_NULL_POINTER;
15     }
16 
17     if(name == NULL) {
18         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
19         return ANR_RET_NULL_POINTER;
20     }
21 
22     if(mode_idx == NULL) {
23         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
24         return ANR_RET_NULL_POINTER;
25     }
26 
27     if(pCalibdb->mode_num < 1) {
28         LOGE_ANR("%s(%d): bayerne mode cell is zero\n", __FUNCTION__, __LINE__);
29         return ANR_RET_NULL_POINTER;
30     }
31 
32     for(i = 0; i < pCalibdb->mode_num; i++) {
33         if(strncmp(name, pCalibdb->mode_cell[i].name, sizeof(pCalibdb->mode_cell[i].name)) == 0) {
34             break;
35         }
36     }
37 
38     if(i < pCalibdb->mode_num) {
39         *mode_idx = i;
40         res = ANR_RET_SUCCESS;
41     } else {
42         *mode_idx = 0;
43         res = ANR_RET_FAILURE;
44     }
45 
46     LOGD_ANR("%s:%d mode_name:%s  mode_idx:%d i:%d \n", __FUNCTION__, __LINE__, name, *mode_idx, i);
47     return res;
48 
49 }
50 
bayernr_get_setting_idx_by_name(CalibDb_BayerNr_2_t * pCalibdb,char * name,int mode_idx,int * setting_idx)51 ANRresult_t bayernr_get_setting_idx_by_name(CalibDb_BayerNr_2_t *pCalibdb, char *name, int mode_idx, int *setting_idx)
52 {
53     int i = 0;
54     ANRresult_t res = ANR_RET_SUCCESS;
55 
56     if(pCalibdb == NULL) {
57         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
58         return ANR_RET_NULL_POINTER;
59     }
60 
61     if(name == NULL) {
62         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
63         return ANR_RET_NULL_POINTER;
64     }
65 
66     if(setting_idx == NULL) {
67         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
68         return ANR_RET_NULL_POINTER;
69     }
70 
71     for(i = 0; i < CALIBDB_NR_SHARP_SETTING_LEVEL; i++) {
72         if(strncmp(name, pCalibdb->mode_cell[mode_idx].setting[i].snr_mode, sizeof(pCalibdb->mode_cell[mode_idx].setting[i].snr_mode)) == 0) {
73             break;
74         }
75     }
76 
77     if(i < CALIBDB_NR_SHARP_SETTING_LEVEL) {
78         *setting_idx = i;
79         res = ANR_RET_SUCCESS;
80     } else {
81         *setting_idx = 0;
82         res = ANR_RET_FAILURE;
83     }
84 
85     LOGD_ANR("%s:%d snr_name:%s  snr_idx:%d i:%d \n", __FUNCTION__, __LINE__, name, *setting_idx, i);
86     return res;
87 
88 }
89 
bayernr_config_setting_param(RKAnr_Bayernr_Params_t * pParams,CalibDb_BayerNr_2_t * pCalibdb,char * param_mode,char * snr_name)90 ANRresult_t bayernr_config_setting_param(RKAnr_Bayernr_Params_t *pParams, CalibDb_BayerNr_2_t *pCalibdb, char* param_mode, char * snr_name)
91 {
92     ANRresult_t res = ANR_RET_SUCCESS;
93     int mode_idx = 0;
94     int setting_idx = 0;
95 
96     res = bayernr_get_mode_cell_idx_by_name(pCalibdb, param_mode, &mode_idx);
97     if(res != ANR_RET_SUCCESS) {
98         LOGW_ANR("%s(%d): error!!!  can't find mode name in iq files, use 0 instead\n", __FUNCTION__, __LINE__);
99     }
100 
101     res = bayernr_get_setting_idx_by_name(pCalibdb, snr_name, mode_idx, &setting_idx);
102     if(res != ANR_RET_SUCCESS) {
103         LOGW_ANR("%s(%d): error!!!  can't find setting in iq files, use 0 instead\n", __FUNCTION__, __LINE__);
104     }
105 
106     res = init_bayernr_params(pParams, pCalibdb, mode_idx, setting_idx);
107 
108     return res;
109 
110 }
111 
init_bayernr_params(RKAnr_Bayernr_Params_t * pParams,CalibDb_BayerNr_2_t * pCalibdb,int mode_idx,int setting_idx)112 ANRresult_t init_bayernr_params(RKAnr_Bayernr_Params_t *pParams, CalibDb_BayerNr_2_t *pCalibdb, int mode_idx, int setting_idx)
113 {
114     ANRresult_t res = ANR_RET_SUCCESS;
115     int i = 0;
116     int j = 0;
117 
118     LOGI_ANR("%s:(%d) oyyf bayerner xml config start\n", __FUNCTION__, __LINE__);
119     if(pParams == NULL) {
120         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
121         return ANR_RET_NULL_POINTER;
122     }
123 
124     if(pCalibdb == NULL) {
125         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
126         return ANR_RET_NULL_POINTER;
127     }
128 
129     //RKAnr_Bayernr_Params_t *pParams = &pANRCtx->stAuto.stBayernrParams;
130     //CalibDb_BayerNr_t *pCalibdb = &pANRConfig->stBayernrCalib;
131 
132     CalibDb_BayerNR_Params_t *pSetting = &pCalibdb->mode_cell[mode_idx].setting[setting_idx];
133 
134     for(i = 0; i < MAX_ISO_STEP; i++) {
135 #ifndef RK_SIMULATOR_HW
136         pParams->iso[i] = pSetting->iso[i];
137 #endif
138         pParams->a[i] = pSetting->iso[i];
139         pParams->b[i] = pSetting->iso[i];
140         pParams->filtpar[i] = pSetting->filtPara[i];
141         LOGI_ANR("a[%d]:%f filtpar[%d]:%f\n",
142                  i, pParams->a[i],
143                  i, pParams->filtpar[i]);
144     }
145 
146     pParams->halfpatch = 1;
147     pParams->halfblock = 1;
148 
149     for(i = 0; i < 7; i++) {
150         pParams->ctrPit[i] = 1.0;
151     }
152 
153     for(i = 0; i < 8; i++) {
154         pParams->luLevel[i] = pSetting->luLevelVal[i];
155         LOGI_ANR("luLevel[%d]:%f \n",
156                  i, pParams->luLevel[i]);
157     }
158 
159     for(i = 0; i < MAX_ISO_STEP; i++) {
160         for(j = 0; j < 8; j++) {
161             pParams->luRatio[i][j] = pSetting->luRatio[j][i];
162         }
163     }
164 
165     for(i = 0; i < MAX_ISO_STEP; i++) {
166         for(j = 0; j < 4; j++) {
167             pParams->w[i][j] = pSetting->fixW[j][i];
168         }
169     }
170 
171     pParams->peaknoisesigma = pSetting->lamda;
172     pParams->sw_rawnr_gauss_en = pSetting->gauss_en;
173     pParams->rgain_offs = pSetting->RGainOff;
174     pParams->rgain_filp = pSetting->RGainFilp;
175     pParams->bgain_offs = pSetting->BGainOff;
176     pParams->bgain_filp = pSetting->BGainFilp;
177     pParams->bayernr_edgesoftness = pSetting->edgeSoftness;
178     pParams->bayernr_gauss_weight0 = 0;
179     pParams->bayernr_gauss_weight1 = 0;
180 
181     memcpy(pParams->bayernr_ver_char,  pCalibdb->version, sizeof(pParams->bayernr_ver_char));
182 
183     LOGI_ANR("%s:(%d) oyyf bayerner xml config end!  ver:%s \n", __FUNCTION__, __LINE__, pParams->bayernr_ver_char);
184 
185     return res;
186 }
187 
188 
189 
bayernr_get_setting_idx_by_name_json(CalibDbV2_BayerNrV1_t * pCalibdb,char * name,int * calib_idx,int * tuning_idx)190 ANRresult_t bayernr_get_setting_idx_by_name_json(CalibDbV2_BayerNrV1_t *pCalibdb, char *name,  int *calib_idx,  int * tuning_idx)
191 {
192     int i = 0;
193     ANRresult_t res = ANR_RET_SUCCESS;
194 
195     if(pCalibdb == NULL) {
196         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
197         return ANR_RET_NULL_POINTER;
198     }
199 
200     if(name == NULL) {
201         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
202         return ANR_RET_NULL_POINTER;
203     }
204 
205     if(calib_idx == NULL) {
206         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
207         return ANR_RET_NULL_POINTER;
208     }
209 
210     if(tuning_idx == NULL) {
211         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
212         return ANR_RET_NULL_POINTER;
213     }
214 
215     for(i = 0; i < pCalibdb->TuningPara.Setting_len; i++) {
216         if(strncmp(name, pCalibdb->TuningPara.Setting[i].SNR_Mode, strlen(name)*sizeof(char)) == 0) {
217             break;
218         }
219     }
220 
221     if(i < pCalibdb->TuningPara.Setting_len) {
222         *tuning_idx = i;
223     } else {
224         *tuning_idx = 0;
225     }
226 
227     for(i = 0; i < pCalibdb->CalibPara.Setting_len; i++) {
228         if(strncmp(name, pCalibdb->CalibPara.Setting[i].SNR_Mode, strlen(name)*sizeof(char)) == 0) {
229             break;
230         }
231     }
232 
233     if(i < pCalibdb->CalibPara.Setting_len) {
234         *calib_idx = i;
235     } else {
236         *calib_idx = 0;
237     }
238 
239     LOGD_ANR("%s:%d snr_name:%s  snr_idx:%d i:%d \n", __FUNCTION__, __LINE__, name, *calib_idx, i);
240     return res;
241 
242 }
243 
244 
init_bayernr_params_json(RKAnr_Bayernr_Params_t * pParams,CalibDbV2_BayerNrV1_t * pCalibdb,int calib_idx,int tuning_idx)245 ANRresult_t init_bayernr_params_json(RKAnr_Bayernr_Params_t *pParams, CalibDbV2_BayerNrV1_t *pCalibdb, int calib_idx, int tuning_idx)
246 {
247     ANRresult_t res = ANR_RET_SUCCESS;
248     int i = 0;
249     int j = 0;
250 
251     LOGI_ANR("%s:(%d) oyyf bayerner xml config start\n", __FUNCTION__, __LINE__);
252     if(pParams == NULL) {
253         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
254         return ANR_RET_NULL_POINTER;
255     }
256 
257     if(pCalibdb == NULL) {
258         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
259         return ANR_RET_NULL_POINTER;
260     }
261 
262     CalibDbV2_BayerNrV1_C_Set_t *pCalibSetting =  &pCalibdb->CalibPara.Setting[calib_idx];
263     CalibDbV2_BayerNrV1_T_Set_t *pTuningSetting = &pCalibdb->TuningPara.Setting[tuning_idx];
264 
265     CalibDbV2_BayerNrV1_C_ISO_t *pCalib_ISO = NULL;
266     CalibDbV2_BayerNrV1_T_ISO_t *pTuning_ISO = NULL;
267 
268 
269     for(i = 0; i < pTuningSetting->Tuning_ISO_len; i++) {
270         pTuning_ISO = &pTuningSetting->Tuning_ISO[i];
271 
272 #ifndef RK_SIMULATOR_HW
273         pParams->iso[i] = pTuning_ISO->iso;
274 #endif
275         pParams->a[i] = pTuning_ISO->iso;
276         pParams->b[i] = pTuning_ISO->iso;
277         pParams->filtpar[i] = pTuning_ISO->filtPara;
278         LOGI_ANR("a[%d]:%f filtpar[%d]:%f\n",
279                  i, pParams->a[i],
280                  i, pParams->filtpar[i]);
281     }
282 
283     pParams->halfpatch = 1;
284     pParams->halfblock = 1;
285 
286     for(i = 0; i < 7; i++) {
287         pParams->ctrPit[i] = 1.0;
288     }
289 
290     for(i = 0; i < 8; i++) {
291         pParams->luLevel[i] = pCalibSetting->Calib_ISO[0].luLevelVal[i];
292         LOGI_ANR("luLevel[%d]:%f \n",
293                  i, pParams->luLevel[i]);
294     }
295 
296     for(i = 0; i < pCalibSetting->Calib_ISO_len; i++) {
297         for(j = 0; j < 8; j++) {
298             pParams->luRatio[i][j] = pCalibSetting->Calib_ISO[i].luRatio[j];
299         }
300     }
301 
302     for(i = 0; i < pTuningSetting->Tuning_ISO_len; i++) {
303         pParams->w[i][0] = pTuningSetting->Tuning_ISO[i].fixW0;
304         pParams->w[i][1] = pTuningSetting->Tuning_ISO[i].fixW1;
305         pParams->w[i][2] = pTuningSetting->Tuning_ISO[i].fixW2;
306         pParams->w[i][3] = pTuningSetting->Tuning_ISO[i].fixW3;
307     }
308 
309     pParams->peaknoisesigma = pTuningSetting->Tuning_ISO[0].lamda;
310     pParams->sw_rawnr_gauss_en = pTuningSetting->Tuning_ISO[0].gauss_en;
311     pParams->rgain_offs = pTuningSetting->Tuning_ISO[0].RGainOff;
312     pParams->rgain_filp = pTuningSetting->Tuning_ISO[0].RGainFilp;
313     pParams->bgain_offs = pTuningSetting->Tuning_ISO[0].BGainOff;
314     pParams->bgain_filp = pTuningSetting->Tuning_ISO[0].BGainFilp;
315 
316     pParams->bayernr_edgesoftness = 0;
317     pParams->bayernr_gauss_weight0 = 0;
318     pParams->bayernr_gauss_weight1 = 0;
319 
320     strncpy(pParams->bayernr_ver_char,  pCalibdb->Version, sizeof(pParams->bayernr_ver_char)-1);
321 
322     LOGI_ANR("%s:(%d) oyyf bayerner xml config end!  ver:%s \n", __FUNCTION__, __LINE__, pParams->bayernr_ver_char);
323 
324     bayernr_algo_param_printf(pParams);
325 
326     return res;
327 }
328 
bayernr_algo_param_printf(RKAnr_Bayernr_Params_t * pParams)329 ANRresult_t bayernr_algo_param_printf(RKAnr_Bayernr_Params_t *pParams)
330 {
331     int i, j;
332 
333     if(pParams == NULL) {
334         LOGE_ANR("NULL pointer\n");
335         return ANR_RET_NULL_POINTER;
336     }
337 
338     for(i = 0; i < MAX_ISO_STEP; i++) {
339 #ifndef RK_SIMULATOR_HW
340         LOGD_ANR("bayernr: iso:%f\n",
341                  pParams->iso[i]);
342 #endif
343 
344         LOGD_ANR("a[%d]:%f filtpar[%d]:%f\n",
345                  i, pParams->a[i],
346                  i, pParams->filtpar[i]);
347     }
348 
349     for(i = 0; i < 8; i++) {
350         LOGD_ANR("luLevel[%d]:%f \n",
351                  i, pParams->luLevel[i]);
352     }
353 
354     for(i = 0; i < MAX_ISO_STEP; i++) {
355         for(j = 0; j < 8; j++) {
356             LOGD_ANR("luLevel[%d][%d]:%f \n",
357                      i, j, pParams->luRatio[i][j]);
358         }
359 
360         LOGD_ANR("fixw[%d]:%f %f %f %f \n",
361                  i, pParams->w[i][0], pParams->w[i][1], pParams->w[i][2], pParams->w[i][3]);
362     }
363 
364     LOGD_ANR(" lamda:%f gauss_en:%d\n",
365              pParams->peaknoisesigma, pParams->sw_rawnr_gauss_en);
366 
367     return ANR_RET_SUCCESS;
368 }
369 
bayernr_config_setting_param_json(RKAnr_Bayernr_Params_t * pParams,CalibDbV2_BayerNrV1_t * pCalibdb,char * param_mode,char * snr_name)370 ANRresult_t bayernr_config_setting_param_json(RKAnr_Bayernr_Params_t *pParams, CalibDbV2_BayerNrV1_t *pCalibdb, char* param_mode, char * snr_name)
371 {
372     ANRresult_t res = ANR_RET_SUCCESS;
373     int calib_idx = 0;
374     int tuning_idx = 0;
375 
376     res = bayernr_get_setting_idx_by_name_json(pCalibdb, snr_name,  &calib_idx, &tuning_idx);
377     if(res != ANR_RET_SUCCESS) {
378         LOGW_ANR("%s(%d): error!!!  can't find setting in iq files, use 0 instead\n", __FUNCTION__, __LINE__);
379     }
380 
381     res = init_bayernr_params_json(pParams, pCalibdb, calib_idx, tuning_idx);
382 
383     return res;
384 
385 }
386 
selsec_hdr_parmas_by_ISO(RKAnr_Bayernr_Params_t * stBayerNrParams,RKAnr_Bayernr_Params_Select_t * stBayerNrParamsSelected,ANRExpInfo_t * pExpInfo)387 ANRresult_t selsec_hdr_parmas_by_ISO(RKAnr_Bayernr_Params_t *stBayerNrParams, RKAnr_Bayernr_Params_Select_t *stBayerNrParamsSelected, ANRExpInfo_t *pExpInfo)
388 {
389     float frameiso[3];
390     float frameEt[3];
391     float fdgain[3];
392     int i = 0;
393 
394     if(stBayerNrParams == NULL) {
395         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
396         return ANR_RET_NULL_POINTER;
397     }
398 
399     if(stBayerNrParamsSelected == NULL) {
400         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
401         return ANR_RET_NULL_POINTER;
402     }
403 
404     if(pExpInfo == NULL) {
405         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
406         return ANR_RET_NULL_POINTER;
407     }
408 
409     int framenum = pExpInfo->hdr_mode + 1;
410 
411     frameiso[0] = pExpInfo->arAGain[0] * pExpInfo->arDGain[0];
412     frameiso[1] = pExpInfo->arAGain[1] * pExpInfo->arDGain[1];
413     frameiso[2] = pExpInfo->arAGain[2] * pExpInfo->arDGain[2];
414 
415     frameEt[0] = pExpInfo->arTime[0];
416     frameEt[1] = pExpInfo->arTime[1];
417     frameEt[2] = pExpInfo->arTime[2];
418 
419     for(int j = 0; j < framenum; j++)
420     {
421         ////降噪参数获取
422         //确定iso等级
423         //共有7个iso等级:50 100 200 400 800 1600 3200  6400 12800
424         //       isogain: 1   2   4   8   16   32  64  128  256
425         //      isolevel: 0   1   2   3   4    5   6   7    8
426         int isoGainStd[MAX_ISO_STEP];
427         int isoGain = int(frameiso[j]);
428         int isoGainLow = 0; //向下一个isoGain,用做参数插值:y=float(isoGainHig-isoGain)/float(isoGainHig-isoGainLow)*y[isoLevelLow]
429         //                                  +float(isoGain-isoGainLow)/float(isoGainHig-isoGainLow)*y[isoLevelHig];
430         int isoGainHig = 0; //向上一个isoGain
431         int isoGainCorrect = 1; //选择最近的一档iso的配置
432 
433         int isoLevelLow = 0;
434         int isoLevelHig = 0;
435         int isoLevelCorrect = 0;
436 
437 #ifndef RK_SIMULATOR_HW
438         for(int i = 0; i < MAX_ISO_STEP; i++) {
439             isoGainStd[i] = stBayerNrParams->iso[i] / 50;
440         }
441 #else
442         for(int i = 0; i < MAX_ISO_STEP; i++) {
443             isoGainStd[i] = 1 * (1 << i);
444         }
445 #endif
446 
447         for (i = 0; i < MAX_ISO_STEP - 1; i++)
448         {
449             if (isoGain >= isoGainStd[i] && isoGain <= isoGainStd[i + 1])
450             {
451                 isoGainLow = isoGainStd[i];
452                 isoGainHig = isoGainStd[i + 1];
453                 isoLevelLow = i;
454                 isoLevelHig = i + 1;
455                 isoGainCorrect = ((isoGain - isoGainStd[i]) <= (isoGainStd[i + 1] - isoGain)) ? isoGainStd[i] : isoGainStd[i + 1];
456                 isoLevelCorrect = ((isoGain - isoGainStd[i]) <= (isoGainStd[i + 1] - isoGain)) ? i : (i + 1);
457             }
458         }
459 
460         //VST变换参数, bilinear
461         stBayerNrParamsSelected->a[j] = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->a[isoLevelLow]
462                                         + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->a[isoLevelHig];
463 
464         stBayerNrParamsSelected->b[j] = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->b[isoLevelLow]
465                                         + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->b[isoLevelHig];
466 
467         stBayerNrParamsSelected->b[j] = 0;
468         stBayerNrParamsSelected->t0[j] = 0;
469 
470         stBayerNrParamsSelected->filtPar[j] = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->filtpar[isoLevelLow]
471                                               + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->filtpar[isoLevelHig];
472 
473     }
474 
475     for (i = 0; i < framenum; i++) {
476         frameiso[i] = frameiso[i] * 50;
477         fdgain[i] = frameiso[i] * frameEt[i];
478     }
479 
480     for (i = 0; i < framenum; i++) {
481         fdgain[i] = fdgain[framenum - 1] / fdgain[i];
482 #if 0
483         stBayerNrParamsSelected->sw_dgain[i] = fdgain[i];
484 #else
485         stBayerNrParamsSelected->sw_dgain[i] = sqrt(fdgain[i]);
486 #endif
487     }
488 
489     float filtParDiscount = (float)0.1;
490     for (i = 0; i < framenum; i++)
491     {
492         float gainsqrt = sqrt(fdgain[i]);
493 #if 0
494         float par = (stBayerNrParamsSelected->filtPar[i] * filtParDiscount);
495 
496         LOGD_ANR("gainsqrt:%f filtpar:%f, total:%f\n",
497                  gainsqrt, stBayerNrParamsSelected->filtPar[i], par * gainsqrt);
498         stBayerNrParamsSelected->filtPar[i] = par * gainsqrt;
499 #else
500         stBayerNrParamsSelected->filtPar[i] = stBayerNrParamsSelected->filtPar[i] * gainsqrt;
501 #endif
502     }
503 
504     if(framenum <= 1 ) {
505         stBayerNrParamsSelected->gausskparsq = int((1 * 1) * float(1 << (FIXNLMCALC)));// * (1 << 7);
506     } else {
507         stBayerNrParamsSelected->gausskparsq = int((1 * 1) * float(1 << (FIXNLMCALC)));
508     }
509     stBayerNrParamsSelected->sigmaPar = 0 * (1 << FIXNLMCALC);
510     stBayerNrParamsSelected->thld_diff = (int(LUTMAXM1_FIX * LUTPRECISION_FIX));
511     stBayerNrParamsSelected->thld_chanelw = int(0.1 * float(1 << FIXNLMCALC));
512     stBayerNrParamsSelected->pix_diff = FIXDIFMAX - 1;
513     stBayerNrParamsSelected->log_bypass = 0;    //0 is none, 1 is G and RB all en,  2 only en G, 3 only RB;
514 
515     if(framenum <= 1 ) {
516         stBayerNrParamsSelected->filtPar[1] = stBayerNrParamsSelected->filtPar[0];
517         stBayerNrParamsSelected->filtPar[2] = stBayerNrParamsSelected->filtPar[0];
518         stBayerNrParamsSelected->sw_dgain[1] = stBayerNrParamsSelected->sw_dgain[0];
519         stBayerNrParamsSelected->sw_dgain[2] = stBayerNrParamsSelected->sw_dgain[0];
520     }
521     return ANR_RET_SUCCESS;
522 }
523 
select_bayernr_params_by_ISO(RKAnr_Bayernr_Params_t * stBayerNrParams,RKAnr_Bayernr_Params_Select_t * stBayerNrParamsSelected,ANRExpInfo_t * pExpInfo)524 ANRresult_t select_bayernr_params_by_ISO(RKAnr_Bayernr_Params_t *stBayerNrParams, RKAnr_Bayernr_Params_Select_t *stBayerNrParamsSelected, ANRExpInfo_t *pExpInfo)
525 {
526     ANRresult_t res = ANR_RET_SUCCESS;
527     int iso = 50;
528 
529     if(stBayerNrParams == NULL) {
530         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
531         return ANR_RET_NULL_POINTER;
532     }
533 
534     if(stBayerNrParamsSelected == NULL) {
535         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
536         return ANR_RET_NULL_POINTER;
537     }
538 
539     if(pExpInfo == NULL) {
540         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
541         return ANR_RET_NULL_POINTER;
542     }
543 
544     iso = pExpInfo->arIso[pExpInfo->hdr_mode];
545 
546     LOGD_ANR("%s:%d iso:%d \n", __FUNCTION__, __LINE__, iso);
547 
548     int isoGainStd[MAX_ISO_STEP];
549     int isoGain = MAX(int(iso / 50), 1);
550     int isoGainLow = 0;
551     int isoGainHig = 0;
552     int isoGainCorrect = 1;
553     int isoLevelLow = 0;
554     int isoLevelHig = 0;
555     int isoLevelCorrect = 0;
556     int i, j;
557 
558 #ifndef RK_SIMULATOR_HW
559     for(int i = 0; i < MAX_ISO_STEP; i++) {
560         isoGainStd[i] = stBayerNrParams->iso[i] / 50;
561     }
562 #else
563     for(int i = 0; i < MAX_ISO_STEP; i++) {
564         isoGainStd[i] = 1 * (1 << i);
565     }
566 #endif
567 
568 
569     for (i = 0; i < MAX_ISO_STEP - 1; i++)
570     {
571         if (isoGain >= isoGainStd[i] && isoGain <= isoGainStd[i + 1])
572         {
573             isoGainLow = isoGainStd[i];
574             isoGainHig = isoGainStd[i + 1];
575             isoLevelLow = i;
576             isoLevelHig = i + 1;
577             isoGainCorrect = ((isoGain - isoGainStd[i]) <= (isoGainStd[i + 1] - isoGain)) ? isoGainStd[i] : isoGainStd[i + 1];
578             isoLevelCorrect = ((isoGain - isoGainStd[i]) <= (isoGainStd[i + 1] - isoGain)) ? i : (i + 1);
579             break;
580         }
581     }
582 
583     if(i == MAX_ISO_STEP - 1) {
584         if(isoGain < isoGainStd[0]) {
585             isoGainLow = isoGainStd[0];
586             isoGainHig = isoGainStd[1];
587             isoLevelLow = 0;
588             isoLevelHig = 1;
589             isoGainCorrect = ((isoGain - isoGainStd[0]) <= (isoGainStd[1] - isoGain)) ? isoGainStd[0] : isoGainStd[1];
590             isoLevelCorrect = ((isoGain - isoGainStd[0]) <= (isoGainStd[1] - isoGain)) ? 0 : (1);
591         }
592 
593         if(isoGain > isoGainStd[MAX_ISO_STEP - 1]) {
594             isoGainLow = isoGainStd[MAX_ISO_STEP - 2];
595             isoGainHig = isoGainStd[MAX_ISO_STEP - 1];
596             isoLevelLow = MAX_ISO_STEP - 2;
597             isoLevelHig = MAX_ISO_STEP - 1;
598             isoGainCorrect = ((isoGain - isoGainStd[MAX_ISO_STEP - 2]) <= (isoGainStd[MAX_ISO_STEP - 1] - isoGain)) ? isoGainStd[MAX_ISO_STEP - 2] : isoGainStd[MAX_ISO_STEP - 1];
599             isoLevelCorrect = ((isoGain - isoGainStd[MAX_ISO_STEP - 2]) <= (isoGainStd[MAX_ISO_STEP - 1] - isoGain)) ? (MAX_ISO_STEP - 2) : (MAX_ISO_STEP - 1);
600         }
601     }
602 
603     LOGD_ANR("%s:%d iso:%d high:%d low:%d\n",
604              __FUNCTION__, __LINE__,
605              isoGain, isoGainHig, isoGainLow);
606 
607     //VST变换参数, bilinear
608     stBayerNrParamsSelected->a[0] = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->a[isoLevelLow]
609                                     + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->a[isoLevelHig];
610 
611     stBayerNrParamsSelected->b[0] = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->b[isoLevelLow]
612                                     + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->b[isoLevelHig];
613 
614     stBayerNrParamsSelected->b[0] = 0;
615     stBayerNrParamsSelected->t0[0] = 0;
616 
617     //领域halfBlock、搜索halfBlock、降噪系数filtPar,其中halfPatch和halfBlock都是对单通道而言
618     stBayerNrParamsSelected->halfPatch = stBayerNrParams->halfpatch;
619     stBayerNrParamsSelected->halfBlock = stBayerNrParams->halfblock;
620 
621     stBayerNrParamsSelected->filtPar[0] = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->filtpar[isoLevelLow]
622                                           + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->filtpar[isoLevelHig];
623 
624 #ifdef BAYER_NR_DEBUG
625     LOGD_ANR("Patch=%d*%d\n", stBayerNrParamsSelected->halfPatch * 2 + 1, stBayerNrParamsSelected->halfPatch * 2 + 1);
626     LOGD_ANR("Block=%d*%d\n", stBayerNrParamsSelected->halfBlock * 2 + 1, stBayerNrParamsSelected->halfBlock * 2 + 1);
627     LOGD_ANR("filPar=%f\n", stBayerNrParamsSelected->filtPar);
628 #endif
629 
630     for (i = 0; i < 7; i++)
631     {
632         stBayerNrParamsSelected->ctrPit[i] = stBayerNrParams->ctrPit[i];
633     }
634 
635     for (i = 0; i < 8; i++)
636     {
637         stBayerNrParamsSelected->luLevel[i] = stBayerNrParams->luLevel[i];
638         stBayerNrParamsSelected->luRatio[i] = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->luRatio[isoLevelLow][i]
639                                               + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->luRatio[isoLevelHig][i];
640     }
641 
642     stBayerNrParamsSelected->peaknoisesigma = stBayerNrParams->peaknoisesigma;
643     stBayerNrParamsSelected->sw_rawnr_gauss_en = stBayerNrParams->sw_rawnr_gauss_en;
644     for (i = 0; i < 4; i++)
645     {
646         stBayerNrParamsSelected->w[i] = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->w[isoLevelLow][i]
647                                         + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->w[isoLevelHig][i];
648     }
649     stBayerNrParamsSelected->bayernr_edgesoftness = stBayerNrParams->bayernr_edgesoftness;
650 
651     stBayerNrParamsSelected->sw_bayernr_edge_filter_en = stBayerNrParams->sw_bayernr_edge_filter_en;
652     for (i = 0; i < 8; i++)
653     {
654         stBayerNrParamsSelected->sw_bayernr_edge_filter_lumapoint[i] = stBayerNrParams->sw_bayernr_edge_filter_lumapoint[i];
655         stBayerNrParamsSelected->sw_bayernr_edge_filter_wgt[i] = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->sw_bayernr_edge_filter_wgt[isoLevelLow][i]
656                 + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->sw_bayernr_edge_filter_wgt[isoLevelHig][i];
657     }
658     stBayerNrParamsSelected->sw_bayernr_filter_strength = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->sw_bayernr_filter_strength[isoLevelLow]
659             + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->sw_bayernr_filter_strength[isoLevelHig];
660     for (i = 0; i < 16; i++)
661     {
662         stBayerNrParamsSelected->sw_bayernr_filter_lumapoint[i] = stBayerNrParams->sw_bayernr_filter_lumapoint[i];
663         stBayerNrParamsSelected->sw_bayernr_filter_sigma[i] = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->sw_bayernr_filter_sigma[isoLevelLow][i]
664                 + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->sw_bayernr_filter_sigma[isoLevelHig][i];
665     }
666     stBayerNrParamsSelected->sw_bayernr_filter_edgesofts = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->sw_bayernr_filter_edgesofts[isoLevelLow]
667             + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->sw_bayernr_filter_edgesofts[isoLevelHig];
668     stBayerNrParamsSelected->sw_bayernr_filter_soft_threshold_ratio = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->sw_bayernr_filter_soft_threshold_ratio[isoLevelLow]
669             + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->sw_bayernr_filter_soft_threshold_ratio[isoLevelHig];
670     stBayerNrParamsSelected->sw_bayernr_filter_out_wgt = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->sw_bayernr_filter_out_wgt[isoLevelLow]
671             + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->sw_bayernr_filter_out_wgt[isoLevelHig];
672 
673     //oyyf: add some fix params select
674     memcpy(stBayerNrParamsSelected->bayernr_ver_char, stBayerNrParams->bayernr_ver_char, sizeof(stBayerNrParams->bayernr_ver_char));
675     stBayerNrParamsSelected->rgain_offs = stBayerNrParams->rgain_offs;
676     stBayerNrParamsSelected->rgain_filp = stBayerNrParams->rgain_filp;
677     stBayerNrParamsSelected->bgain_offs = stBayerNrParams->bgain_offs;
678     stBayerNrParamsSelected->bgain_filp = stBayerNrParams->bgain_filp;
679 
680     stBayerNrParamsSelected->bayernr_gauss_weight0 = stBayerNrParams->bayernr_gauss_weight0;
681     stBayerNrParamsSelected->bayernr_gauss_weight1 = stBayerNrParams->bayernr_gauss_weight1;
682 
683     stBayerNrParamsSelected->gausskparsq = int((1.15 * 1.15) * float(1 << (FIXNLMCALC)));
684     stBayerNrParamsSelected->sigmaPar = 0 * (1 << FIXNLMCALC);
685     stBayerNrParamsSelected->thld_diff = (int(LUTMAXM1_FIX * LUTPRECISION_FIX));
686     stBayerNrParamsSelected->thld_chanelw = int(0.1 * float(1 << FIXNLMCALC));
687     stBayerNrParamsSelected->pix_diff = FIXDIFMAX - 1;
688     stBayerNrParamsSelected->log_bypass = 0;    //0 is none, 1 is G and RB all en,  2 only en G, 3 only RB;
689 
690     //oyyf: if hdr open
691     selsec_hdr_parmas_by_ISO(stBayerNrParams, stBayerNrParamsSelected, pExpInfo);
692 
693     return res;
694 }
695 
696 
bayernr_get_trans(int tmpfix)697 unsigned short bayernr_get_trans(int tmpfix)
698 {
699     int logtablef[65] = {0, 1465, 2909, 4331, 5731, 7112, 8472, 9813, 11136, 12440,
700                          13726, 14995, 16248, 17484, 18704, 19908, 21097, 22272, 23432, 24578, 25710,
701                          26829, 27935, 29028, 30109, 31177, 32234, 33278, 34312, 35334, 36345, 37346,
702                          38336, 39315, 40285, 41245, 42195, 43136, 44068, 44990, 45904, 46808, 47704,
703                          48592, 49472, 50343, 51207, 52062, 52910, 53751, 54584, 55410, 56228, 57040,
704                          57844, 58642, 59433, 60218, 60996, 61768, 62534, 63293, 64047, 64794, 65536
705                         };
706     int logprecision = 6;
707     int logfixbit = 16;
708     int logtblbit = 16;
709     int logscalebit = 12;
710     int logfixmul = (1 << logfixbit);
711     long long x8, one = 1;
712     long long gx, n = 0, ix1, ix2, dp;
713     long long lt1, lt2, dx, fx;
714     int i, j = 1;
715 
716     x8 = tmpfix + (1 << 8);
717     // find highest bit
718     for (i = 0; i < 32; i++)
719     {
720         if (x8 & j)
721         {
722             n = i;
723         }
724         j = j << 1;
725     }
726 
727     gx = x8 - (one << n);
728     gx = gx * (one << logprecision) * logfixmul;
729     gx = gx / (one << n);
730 
731     ix1 = gx >> logfixbit;
732     dp = gx - ix1 * logfixmul;
733 
734     ix2 = ix1 + 1;
735 
736     lt1 = logtablef[ix1];
737     lt2 = logtablef[ix2];
738 
739     dx = lt1 * (logfixmul - dp) + lt2 * dp;
740 
741     fx = dx + (n - 8) * (one << (logfixbit + logtblbit));
742     fx = fx + (one << (logfixbit + logtblbit - logscalebit - 1));
743     fx = fx >> (logfixbit + logtblbit - logscalebit);
744 
745     return fx;
746 }
747 
bayernr_fix_tranfer(RKAnr_Bayernr_Params_Select_t * rawnr,RKAnr_Bayernr_Fix_t * pRawnrCfg,float fStrength)748 ANRresult_t bayernr_fix_tranfer(RKAnr_Bayernr_Params_Select_t* rawnr, RKAnr_Bayernr_Fix_t *pRawnrCfg, float fStrength)
749 {
750     ANRresult_t res = ANR_RET_SUCCESS;
751     int rawbit = 12;//rawBit;
752     float tmp;
753 
754     LOGI_ANR("%s:(%d) enter \n", __FUNCTION__, __LINE__);
755 
756     if(rawnr == NULL) {
757         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
758         return ANR_RET_NULL_POINTER;
759     }
760 
761     if(pRawnrCfg == NULL) {
762         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
763         return ANR_RET_NULL_POINTER;
764     }
765 
766     if(fStrength <= 0.0f) {
767         fStrength = 0.000001;
768     }
769 
770     LOGD_ANR("%s(%d): strength:%f \n", __FUNCTION__, __LINE__, fStrength);
771 
772     //(0x0004)
773     pRawnrCfg->gauss_en = rawnr->sw_rawnr_gauss_en;
774     pRawnrCfg->log_bypass = rawnr->log_bypass;
775 
776     //(0x0008 - 0x00010)
777     pRawnrCfg->filtpar0 = (unsigned short)(rawnr->filtPar[0] * fStrength * (1 << FIXNLMCALC));
778     pRawnrCfg->filtpar1 = (unsigned short)(rawnr->filtPar[1] * fStrength * (1 << FIXNLMCALC));
779     pRawnrCfg->filtpar2 = (unsigned short)(rawnr->filtPar[2] * fStrength * (1 << FIXNLMCALC));
780     if(pRawnrCfg->filtpar0 > 0x3fff) {
781         pRawnrCfg->filtpar0 =  0x3fff;
782     }
783     if(pRawnrCfg->filtpar1 > 0x3fff) {
784         pRawnrCfg->filtpar1 =  0x3fff;
785     }
786     if(pRawnrCfg->filtpar2 > 0x3fff) {
787         pRawnrCfg->filtpar2 =  0x3fff;
788     }
789 
790     //(0x0014 - 0x0001c)
791     pRawnrCfg->dgain0 = (unsigned int)(rawnr->sw_dgain[0] * (1 << FIXNLMCALC));
792     pRawnrCfg->dgain1 = (unsigned int)(rawnr->sw_dgain[1] * (1 << FIXNLMCALC));
793     pRawnrCfg->dgain2 = (unsigned int)(rawnr->sw_dgain[2] * (1 << FIXNLMCALC));
794     if(pRawnrCfg->dgain0 > 0x3ffff) {
795         pRawnrCfg->dgain0 =  0x3ffff;
796     }
797     if(pRawnrCfg->dgain1 > 0x3ffff) {
798         pRawnrCfg->dgain1 =  0x3ffff;
799     }
800     if(pRawnrCfg->dgain2 > 0x3ffff) {
801         pRawnrCfg->dgain2 =  0x3ffff;
802     }
803 
804 
805     //(0x0020 - 0x0002c)
806     for(int i = 0; i < 8; i++) {
807         pRawnrCfg->luration[i] = (unsigned short)(rawnr->luRatio[i] * (1 << FIXNLMCALC));
808     }
809 
810     //(0x0030 - 0x0003c)
811     for(int i = 0; i < 8; i++) {
812         tmp = rawnr->luLevel[i] * ( 1 << (rawbit - 8) );
813         pRawnrCfg->lulevel[i] = bayernr_get_trans((int)tmp);
814     }
815     tmp = (float)((1 << rawbit) - 1);
816     pRawnrCfg->lulevel[8 - 1] = bayernr_get_trans((int)tmp);
817 
818     //(0x0040)
819     pRawnrCfg->gauss = rawnr->gausskparsq;
820 
821     //(0x0044)
822     pRawnrCfg->sigma = rawnr->sigmaPar;
823 
824 
825     //(0x0048)
826     pRawnrCfg->pix_diff = rawnr->pix_diff;
827 
828 
829     //(0x004c)
830     pRawnrCfg->thld_diff = rawnr->thld_diff;
831 
832 
833     //(0x0050)
834     pRawnrCfg->gas_weig_scl1 = rawnr->bayernr_gauss_weight0 * (1 << 8);
835     pRawnrCfg->gas_weig_scl2 = rawnr->bayernr_gauss_weight1 * (1 << 8);
836     pRawnrCfg->thld_chanelw = rawnr->thld_chanelw;
837 
838 
839 
840     //(0x0054)
841     pRawnrCfg->lamda = rawnr->peaknoisesigma;
842 
843 
844     //(0x0058 - 0x0005c)
845     tmp = (rawnr->w[0] / fStrength * (1 << FIXNLMCALC));
846     if(tmp > 0x3ff) {
847         tmp = 0x3ff;
848     }
849     pRawnrCfg->fixw0 = (unsigned short)tmp;
850     tmp = (rawnr->w[1] / fStrength * (1 << FIXNLMCALC));
851     if(tmp > 0x3ff) {
852         tmp = 0x3ff;
853     }
854     pRawnrCfg->fixw1 = (unsigned short)tmp;;
855     tmp = (rawnr->w[2] / fStrength * (1 << FIXNLMCALC));
856     if(tmp > 0x3ff) {
857         tmp = 0x3ff;
858     }
859     pRawnrCfg->fixw2 = (unsigned short)tmp;
860     tmp = (rawnr->w[3] / fStrength * (1 << FIXNLMCALC));
861     if(tmp > 0x3ff) {
862         tmp = 0x3ff;
863     }
864     pRawnrCfg->fixw3 = (unsigned short)tmp;
865 
866 
867     //(0x0060 - 0x00068)
868     pRawnrCfg->wlamda0 = (pRawnrCfg->fixw0 * pRawnrCfg->lamda) >> FIXNLMCALC;
869     pRawnrCfg->wlamda1 = (pRawnrCfg->fixw1 * pRawnrCfg->lamda) >> FIXNLMCALC;
870     pRawnrCfg->wlamda2 = (pRawnrCfg->fixw2 * pRawnrCfg->lamda) >> FIXNLMCALC;
871 
872 
873     //(0x006c)
874     pRawnrCfg->rgain_filp = rawnr->rgain_filp;
875     pRawnrCfg->bgain_filp = rawnr->bgain_filp;
876 
877 #if BAYERNR_FIX_VALUE_PRINTF
878     bayernr_fix_printf(pRawnrCfg);
879 #endif
880 
881     LOGI_ANR("%s:(%d) exit \n", __FUNCTION__, __LINE__);
882 
883     return res;
884 
885 }
886 
bayernr_fix_printf(RKAnr_Bayernr_Fix_t * pRawnrCfg)887 ANRresult_t bayernr_fix_printf(RKAnr_Bayernr_Fix_t * pRawnrCfg)
888 {
889     //FILE *fp = fopen("bayernr_regsiter.dat", "wb+");
890     ANRresult_t res = ANR_RET_SUCCESS;
891 
892     if(pRawnrCfg == NULL) {
893         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
894         return ANR_RET_NULL_POINTER;
895     }
896 
897     LOGD_ANR("%s:(%d) ############# rawnr enter######################## \n", __FUNCTION__, __LINE__);
898 
899     //(0x0004)
900     LOGD_ANR("gauss_en:%d log_bypass:%d \n",
901              pRawnrCfg->gauss_en,
902              pRawnrCfg->log_bypass);
903 
904     //(0x0008 - 0x00010)
905     LOGD_ANR("filtpar0-2:%d %d %d \n",
906              pRawnrCfg->filtpar0,
907              pRawnrCfg->filtpar1,
908              pRawnrCfg->filtpar2);
909 
910     //(0x0014 - 0x0001c)
911     LOGD_ANR("bayernr (0x0014 - 0x0001c)dgain0-2:%d %d %d \n",
912              pRawnrCfg->dgain0,
913              pRawnrCfg->dgain1,
914              pRawnrCfg->dgain2);
915 
916     //(0x0020 - 0x0002c)
917     for(int i = 0; i < 8; i++) {
918         LOGD_ANR("luration[%d]:%d \n", i, pRawnrCfg->luration[i]);
919     }
920 
921     //(0x0030 - 0x0003c)
922     for(int i = 0; i < 8; i++) {
923         LOGD_ANR("lulevel[%d]:%d \n", i, pRawnrCfg->lulevel[i]);
924     }
925 
926     //(0x0040)
927     LOGD_ANR("gauss:%d \n", pRawnrCfg->gauss);
928 
929     //(0x0044)
930     LOGD_ANR("sigma:%d \n", pRawnrCfg->sigma);
931 
932     //(0x0048)
933     LOGD_ANR("pix_diff:%d \n", pRawnrCfg->pix_diff);
934 
935     //(0x004c)
936     LOGD_ANR("thld_diff:%d \n", pRawnrCfg->thld_diff);
937 
938     //(0x0050)
939     LOGD_ANR("gas_weig_scl1:%d gas_weig_scl2:%d thld_chanelw:%d \n",
940              pRawnrCfg->gas_weig_scl1,
941              pRawnrCfg->gas_weig_scl2,
942              pRawnrCfg->thld_chanelw);
943 
944     //(0x0054)
945     LOGD_ANR("lamda:%d \n", pRawnrCfg->lamda);
946 
947     //(0x0058 - 0x0005c)
948     LOGD_ANR("fixw0-3:%d %d %d %d\n",
949              pRawnrCfg->fixw0,
950              pRawnrCfg->fixw1,
951              pRawnrCfg->fixw2,
952              pRawnrCfg->fixw3);
953 
954     //(0x0060 - 0x00068)
955     LOGD_ANR("wlamda0-2:%d %d %d \n",
956              pRawnrCfg->wlamda0,
957              pRawnrCfg->wlamda1,
958              pRawnrCfg->wlamda2);
959 
960     //(0x006c)
961     LOGD_ANR("rgain_filp:%d bgain_filp:%d \n",
962              pRawnrCfg->rgain_filp,
963              pRawnrCfg->bgain_filp);
964 
965     LOGD_ANR("%s:(%d) ############# rawnr exit ######################## \n", __FUNCTION__, __LINE__);
966     LOGD_ANR("%s:(%d) exit \n", __FUNCTION__, __LINE__);
967 
968     return res;
969 }
970 
bayernr_calibdbV2_assign(CalibDbV2_BayerNrV1_t * pDst,CalibDbV2_BayerNrV1_t * pSrc)971 ANRresult_t bayernr_calibdbV2_assign(CalibDbV2_BayerNrV1_t *pDst, CalibDbV2_BayerNrV1_t *pSrc)
972 {
973     ANRresult_t res = ANR_RET_SUCCESS;
974     CalibDbV2_BayerNrV1_Calib_t *pSrcCalibParaV2 = NULL;
975     CalibDbV2_BayerNrV1_Tuning_t *pSrcTuningParaV2 = NULL;
976     CalibDbV2_BayerNrV1_Calib_t *pDstCalibParaV2 = NULL;
977     CalibDbV2_BayerNrV1_Tuning_t *pDstTuningParaV2 = NULL;
978     int setting_len = 0;
979     int iso_len = 0;
980 
981 
982     if(pDst == NULL) {
983         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
984         return ANR_RET_NULL_POINTER;
985     }
986 
987     if(pSrc == NULL) {
988         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
989         return ANR_RET_NULL_POINTER;
990     }
991 
992     bayernr_calibdbV2_free(pDst);
993 
994     pSrcCalibParaV2 = &pSrc->CalibPara;
995     pSrcTuningParaV2 = &pSrc->TuningPara;
996     pDstCalibParaV2 = &pDst->CalibPara;
997     pDstTuningParaV2 = &pDst->TuningPara;
998 
999     //assign the value
1000     pDst->Version = strdup(pSrc->Version);
1001     pDstTuningParaV2->enable = pSrcTuningParaV2->enable;
1002 
1003 
1004     //malloc iso size
1005     setting_len = pSrcCalibParaV2->Setting_len;
1006     pDstCalibParaV2->Setting = (CalibDbV2_BayerNrV1_C_Set_t *)malloc(setting_len * sizeof(CalibDbV2_BayerNrV1_C_Set_t));
1007     memset(pDstCalibParaV2->Setting,  0x00, setting_len * sizeof(CalibDbV2_BayerNrV1_C_Set_t));
1008     pDstCalibParaV2->Setting_len = setting_len;
1009 
1010     for(int i = 0; i < setting_len; i++) {
1011         iso_len = pSrcCalibParaV2->Setting[i].Calib_ISO_len;
1012         pDstCalibParaV2->Setting[i].Calib_ISO =  (CalibDbV2_BayerNrV1_C_ISO_t *)malloc(iso_len * sizeof(CalibDbV2_BayerNrV1_C_ISO_t));
1013         memset(pDstCalibParaV2->Setting[i].Calib_ISO, 0x00, iso_len * sizeof(CalibDbV2_BayerNrV1_C_ISO_t));
1014         pDstCalibParaV2->Setting[i].Calib_ISO_len = iso_len;
1015     }
1016 
1017     for(int i = 0; i < setting_len; i++) {
1018         iso_len = pSrcCalibParaV2->Setting[i].Calib_ISO_len;
1019         pDstCalibParaV2->Setting[i].SNR_Mode = strdup(pSrcTuningParaV2->Setting[i].SNR_Mode);
1020         pDstCalibParaV2->Setting[i].Sensor_Mode = strdup(pSrcTuningParaV2->Setting[i].Sensor_Mode);
1021 
1022         for(int j = 0; j < iso_len; j++) {
1023             pDstCalibParaV2->Setting[i].Calib_ISO[j] = pSrcCalibParaV2->Setting[i].Calib_ISO[j];
1024         }
1025     }
1026 
1027     setting_len = pSrcTuningParaV2->Setting_len;
1028     pDstTuningParaV2->Setting = (CalibDbV2_BayerNrV1_T_Set_t *)malloc(setting_len * sizeof(CalibDbV2_BayerNrV1_T_Set_t));
1029     memset(pDstTuningParaV2->Setting, 0x00, setting_len * sizeof(CalibDbV2_BayerNrV1_T_Set_t));
1030     pDstTuningParaV2->Setting_len = setting_len;
1031 
1032     for(int i = 0; i < setting_len; i++) {
1033         iso_len = pSrcTuningParaV2->Setting[i].Tuning_ISO_len;
1034         pDstTuningParaV2->Setting[i].Tuning_ISO = (CalibDbV2_BayerNrV1_T_ISO_t *)malloc(iso_len * sizeof(CalibDbV2_BayerNrV1_T_ISO_t));
1035         memset(pDstTuningParaV2->Setting[i].Tuning_ISO, 0x00, iso_len * sizeof(CalibDbV2_BayerNrV1_T_ISO_t));
1036         pDstTuningParaV2->Setting[i].Tuning_ISO_len = iso_len;
1037     }
1038 
1039     for(int i = 0; i < setting_len; i++) {
1040         iso_len = pSrcTuningParaV2->Setting[i].Tuning_ISO_len;
1041         pDstTuningParaV2->Setting[i].SNR_Mode = strdup(pSrcTuningParaV2->Setting[i].SNR_Mode);
1042         pDstTuningParaV2->Setting[i].Sensor_Mode = strdup(pSrcTuningParaV2->Setting[i].Sensor_Mode);
1043 
1044         for(int j = 0; j < iso_len; j++) {
1045             pDstTuningParaV2->Setting[i].Tuning_ISO[j] = pSrcTuningParaV2->Setting[i].Tuning_ISO[j];
1046         }
1047     }
1048 
1049     return res;
1050 }
1051 
1052 
1053 
bayernr_calibdbV2_free(CalibDbV2_BayerNrV1_t * pCalibdbV2)1054 void bayernr_calibdbV2_free(CalibDbV2_BayerNrV1_t *pCalibdbV2)
1055 {
1056     if(pCalibdbV2 != NULL) {
1057         if(pCalibdbV2->CalibPara.Setting != NULL) {
1058             for(int i = 0; i < pCalibdbV2->CalibPara.Setting_len; i++) {
1059                 if(pCalibdbV2->CalibPara.Setting[i].Calib_ISO != NULL) {
1060                     free(pCalibdbV2->CalibPara.Setting[i].Calib_ISO );
1061                 }
1062                 if(pCalibdbV2->CalibPara.Setting[i].Sensor_Mode != NULL) {
1063                     free(pCalibdbV2->CalibPara.Setting[i].Sensor_Mode);
1064                 }
1065                 if(pCalibdbV2->CalibPara.Setting[i].SNR_Mode != NULL) {
1066                     free(pCalibdbV2->CalibPara.Setting[i].SNR_Mode);
1067                 }
1068             }
1069             free(pCalibdbV2->CalibPara.Setting);
1070         }
1071 
1072         if(pCalibdbV2->TuningPara.Setting != NULL) {
1073             for(int i = 0; i < pCalibdbV2->TuningPara.Setting_len; i++) {
1074                 if(pCalibdbV2->TuningPara.Setting[i].Tuning_ISO != NULL) {
1075                     free(pCalibdbV2->TuningPara.Setting[i].Tuning_ISO );
1076                 }
1077                 if(pCalibdbV2->TuningPara.Setting[i].Sensor_Mode != NULL) {
1078                     free(pCalibdbV2->TuningPara.Setting[i].Sensor_Mode);
1079                 }
1080                 if(pCalibdbV2->TuningPara.Setting[i].SNR_Mode != NULL) {
1081                     free(pCalibdbV2->TuningPara.Setting[i].SNR_Mode);
1082                 }
1083             }
1084             free(pCalibdbV2->TuningPara.Setting);
1085         }
1086 
1087         if(pCalibdbV2->Version != NULL) {
1088             free(pCalibdbV2->Version);
1089         }
1090 
1091     }
1092 
1093 }
1094 
1095 
1096 RKAIQ_END_DECLARE
1097 
1098