xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/algos/anr/rk_aiq_anr_algo_uvnr.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 #include "rk_aiq_anr_algo_uvnr.h"
2 
3 RKAIQ_BEGIN_DECLARE
4 
uvnr_get_mode_cell_idx_by_name(CalibDb_UVNR_2_t * pCalibdb,char * name,int * mode_idx)5 ANRresult_t uvnr_get_mode_cell_idx_by_name(CalibDb_UVNR_2_t *pCalibdb, char *name, int *mode_idx)
6 {
7     int i = 0;
8     ANRresult_t res = ANR_RET_SUCCESS;
9 
10     if(pCalibdb == NULL) {
11         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
12         return ANR_RET_NULL_POINTER;
13     }
14 
15     if(name == NULL) {
16         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
17         return ANR_RET_NULL_POINTER;
18     }
19 
20     if(mode_idx == NULL) {
21         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
22         return ANR_RET_NULL_POINTER;
23     }
24 
25     if(pCalibdb->mode_num < 1) {
26         LOGE_ANR("%s(%d): uvnr mode cell num is zero\n", __FUNCTION__, __LINE__);
27         return ANR_RET_NULL_POINTER;
28     }
29 
30     for(i = 0; i < pCalibdb->mode_num; i++) {
31         if(strncmp(name, pCalibdb->mode_cell[i].name, sizeof(pCalibdb->mode_cell[i].name)) == 0) {
32             break;
33         }
34     }
35 
36     if(i < pCalibdb->mode_num) {
37         *mode_idx = i;
38         res = ANR_RET_SUCCESS;
39     } else {
40         *mode_idx = 0;
41         res = ANR_RET_FAILURE;
42     }
43 
44     LOGD_ANR("%s:%d mode_name:%s  mode_idx:%d i:%d \n", __FUNCTION__, __LINE__, name, *mode_idx, i);
45     return res;
46 
47 }
48 
uvnr_get_setting_idx_by_name(CalibDb_UVNR_2_t * pCalibdb,char * name,int mode_idx,int * setting_idx)49 ANRresult_t uvnr_get_setting_idx_by_name(CalibDb_UVNR_2_t *pCalibdb, char *name, int mode_idx, int *setting_idx)
50 {
51     int i = 0;
52     ANRresult_t res = ANR_RET_SUCCESS;
53 
54     if(pCalibdb == NULL) {
55         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
56         return ANR_RET_NULL_POINTER;
57     }
58 
59     if(name == NULL) {
60         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
61         return ANR_RET_NULL_POINTER;
62     }
63 
64     if(setting_idx == NULL) {
65         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
66         return ANR_RET_NULL_POINTER;
67     }
68 
69     for(i = 0; i < CALIBDB_NR_SHARP_SETTING_LEVEL; i++) {
70         if(strncmp(name, pCalibdb->mode_cell[mode_idx].setting[i].snr_mode, sizeof(pCalibdb->mode_cell[mode_idx].setting[i].snr_mode)) == 0) {
71             break;
72         }
73     }
74 
75     if(i < CALIBDB_NR_SHARP_SETTING_LEVEL) {
76         *setting_idx = i;
77         res = ANR_RET_SUCCESS;
78     } else {
79         *setting_idx = 0;
80         res = ANR_RET_FAILURE;
81     }
82 
83     LOGD_ANR("%s:%d snr_name:%s  snr_idx:%d i:%d \n", __FUNCTION__, __LINE__, name, * setting_idx, i);
84     return res;
85 
86 }
87 
uvnr_config_setting_param(RKAnr_Uvnr_Params_t * pParams,CalibDb_UVNR_2_t * pCalibdb,char * param_mode,char * snr_name)88 ANRresult_t uvnr_config_setting_param(RKAnr_Uvnr_Params_t *pParams, CalibDb_UVNR_2_t *pCalibdb, char* param_mode, char * snr_name)
89 {
90     ANRresult_t res = ANR_RET_SUCCESS;
91     int mode_idx = 0;
92     int setting_idx = 0;
93 
94     if(pParams == NULL) {
95         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
96         return ANR_RET_NULL_POINTER;
97     }
98 
99     if(pCalibdb == NULL) {
100         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
101         return ANR_RET_NULL_POINTER;
102     }
103 
104     res = uvnr_get_mode_cell_idx_by_name(pCalibdb, param_mode, &mode_idx);
105     if(res != ANR_RET_SUCCESS) {
106         LOGW_ANR("%s(%d): error!!!  can't find mode cell in iq files, use 0 instead\n", __FUNCTION__, __LINE__);
107     }
108 
109     res = uvnr_get_setting_idx_by_name(pCalibdb, snr_name, mode_idx, &setting_idx);
110     if(res != ANR_RET_SUCCESS) {
111         LOGW_ANR("%s(%d): error!!!  can't find setting in iq files, use 0 instead\n", __FUNCTION__, __LINE__);
112     }
113 
114     res = init_uvnr_params(pParams, pCalibdb, mode_idx, setting_idx);
115 
116     return res;
117 
118 }
119 
init_uvnr_params(RKAnr_Uvnr_Params_t * pParams,CalibDb_UVNR_2_t * pCalibdb,int mode_idx,int setting_idx)120 ANRresult_t init_uvnr_params(RKAnr_Uvnr_Params_t *pParams, CalibDb_UVNR_2_t *pCalibdb, int mode_idx, int setting_idx)
121 {
122     ANRresult_t res = ANR_RET_SUCCESS;
123     int i = 0;
124     int j = 0;
125 
126     if(pParams == NULL) {
127         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
128         return ANR_RET_NULL_POINTER;
129     }
130 
131     if(pCalibdb == NULL) {
132         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
133         return ANR_RET_NULL_POINTER;
134     }
135 
136     CalibDb_UVNR_Params_t *pSetting = &pCalibdb->mode_cell[mode_idx].setting[setting_idx];
137     for(i = 0; i < MAX_ISO_STEP; i++) {
138 #ifndef RK_SIMULATOR_HW
139         pParams->iso[i] = pSetting->ISO[i];
140 #endif
141         pParams->ratio[i] = pSetting->step0_uvgrad_ratio[i];
142         pParams->offset[i] = pSetting->step0_uvgrad_offset[i];
143 
144         pParams->wStep1[i] = pSetting->step1_downSample_w[i];
145         pParams->hStep1[i] = pSetting->step1_downSample_h[i];
146         pParams->meanSize1[i] = pSetting->step1_downSample_meansize[i];
147 
148         pParams->medSize1[i] = pSetting->step1_median_size[i];
149         pParams->medRatio1[i] = pSetting->step1_median_ratio[i];
150         pParams->isMedIIR1[i] = pSetting->step1_median_IIR[i];
151 
152         pParams->bfSize1[i] = pSetting->step1_bf_size[i];
153         pParams->sigmaR1[i] = pSetting->step1_bf_sigmaR[i];
154         pParams->sigmaD1[i] = pSetting->step1_bf_sigmaD[i];
155         pParams->uvgain1[i] = pSetting->step1_bf_uvgain[i];
156         pParams->bfRatio1[i] = pSetting->step1_bf_ratio[i];
157         pParams->isRowIIR1[i] = pSetting->step1_bf_isRowIIR[i];
158         pParams->isYcopy1[i] = pSetting->step1_bf_isYcopy[i];
159 
160         pParams->wStep2[i] = pSetting->step2_downSample_w[i];
161         pParams->hStep2[i] = pSetting->step2_downSample_h[i];
162         pParams->meanSize2[i] = pSetting->step2_downSample_meansize[i];
163 
164         pParams->medSize2[i] = pSetting->step2_median_size[i];
165         pParams->medRatio2[i] = pSetting->step2_median_ratio[i];
166         pParams->isMedIIR2[i] = pSetting->step2_median_IIR[i];
167 
168         pParams->bfSize3[i] = pSetting->step2_bf_size[i];
169         pParams->sigmaR2[i] = pSetting->step2_bf_sigmaR[i];
170         pParams->sigmaD2[i] = pSetting->step2_bf_sigmaD[i];
171         pParams->uvgain2[i] = pSetting->step2_bf_uvgain[i];
172         pParams->bfRatio2[i] = pSetting->step2_bf_ratio[i];
173         pParams->isRowIIR2[i] = pSetting->step2_bf_isRowIIR[i];
174         pParams->isYcopy2[i] = pSetting->step2_bf_isYcopy[i];
175 
176         pParams->bfSize3[i] = pSetting->step3_bf_size[i];
177         pParams->sigmaR3[i] = pSetting->step3_bf_sigmaR[i];
178         pParams->sigmaD3[i] = pSetting->step3_bf_sigmaD[i];
179         pParams->uvgain3[i] = pSetting->step3_bf_uvgain[i];
180         pParams->bfRatio3[i] = pSetting->step3_bf_ratio[i];
181         pParams->isRowIIR3[i] = pSetting->step3_bf_isRowIIR[i];
182         pParams->isYcopy3[i] = pSetting->step3_bf_isYcopy[i];
183 
184     }
185 
186     for(i = 0; i < 4; i++) {
187         pParams->nonMed1[i] = pSetting->step1_nonMed1[i];
188         pParams->nonBf1[i] = pSetting->step1_nonBf1[i];
189         pParams->block2_ext[i] = pSetting->step2_nonExt_block[i];
190         pParams->nonMed2[i] = pSetting->step2_nonMed[i];
191         pParams->nonBf2[i] = pSetting->step2_nonBf[i];
192         pParams->nonBf3[i] = pSetting->step3_nonBf3[i];
193     }
194 
195     for(i = 0; i < 3; i++) {
196         pParams->kernel_3x3_table[i] = pSetting->kernel_3x3[i];
197     }
198 
199     for(i = 0; i < 5; i++) {
200         pParams->kernel_5x5_talbe[i] = pSetting->kernel_5x5[i];
201     }
202 
203     for(i = 0; i < 8; i++) {
204         pParams->kernel_9x9_table[i] = pSetting->kernel_9x9[i];
205     }
206 
207     pParams->kernel_9x9_num = pSetting->kernel_9x9_num;
208 
209     for(i = 0; i < 9; i++) {
210         pParams->sigmaAdj_x[i] = pSetting->sigma_adj_luma[i];
211         pParams->sigamAdj_y[i] = pSetting->sigma_adj_ratio[i];
212 
213         pParams->threAdj_x[i] = pSetting->threshold_adj_luma[i];
214         pParams->threAjd_y[i] = pSetting->threshold_adj_thre[i];
215     }
216 
217     return ANR_RET_SUCCESS;
218 
219 }
220 
uvnr_get_setting_idx_by_name_json(CalibDbV2_UVNR_t * pCalibdb,char * name,int * tuning_idx)221 ANRresult_t uvnr_get_setting_idx_by_name_json(CalibDbV2_UVNR_t *pCalibdb, char *name, int *tuning_idx)
222 {
223     int i = 0;
224     ANRresult_t res = ANR_RET_SUCCESS;
225 
226     if(pCalibdb == NULL) {
227         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
228         return ANR_RET_NULL_POINTER;
229     }
230 
231     if(name == NULL) {
232         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
233         return ANR_RET_NULL_POINTER;
234     }
235 
236     if(tuning_idx == NULL) {
237         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
238         return ANR_RET_NULL_POINTER;
239     }
240 
241     for(i = 0; i < pCalibdb->TuningPara.Setting_len; i++) {
242         if(strncmp(name, pCalibdb->TuningPara.Setting[i].SNR_Mode, strlen(name)*sizeof(char)) == 0) {
243             break;
244         }
245     }
246 
247     if(i < pCalibdb->TuningPara.Setting_len) {
248         *tuning_idx = i;
249         res = ANR_RET_SUCCESS;
250     } else {
251         *tuning_idx = 0;
252         res = ANR_RET_FAILURE;
253     }
254 
255     LOGD_ANR("%s:%d snr_name:%s  snr_idx:%d i:%d \n", __FUNCTION__, __LINE__, name, *tuning_idx, i);
256     return res;
257 
258 }
259 
260 
init_uvnr_params_json(RKAnr_Uvnr_Params_t * pParams,CalibDbV2_UVNR_t * pCalibdb,int setting_idx)261 ANRresult_t init_uvnr_params_json(RKAnr_Uvnr_Params_t *pParams, CalibDbV2_UVNR_t *pCalibdb,  int setting_idx)
262 {
263     ANRresult_t res = ANR_RET_SUCCESS;
264     int i = 0;
265     int j = 0;
266     float luma[9] = {0.0000, 32.0000, 64.0000, 96.0000, 128.0000, 160.0000, 192.0000, 224.0000, 256.0000 };
267 
268     if(pParams == NULL) {
269         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
270         return ANR_RET_NULL_POINTER;
271     }
272 
273     if(pCalibdb == NULL) {
274         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
275         return ANR_RET_NULL_POINTER;
276     }
277 
278     CalibDbV2_UVNR_T_Set_t *pSetting = &pCalibdb->TuningPara.Setting[setting_idx];
279     CalibDbV2_UVNR_T_ISO_t *pTuning_ISO = NULL;
280     for(i = 0; i < pSetting->Tuning_ISO_len; i++) {
281         pTuning_ISO = &pSetting->Tuning_ISO[i];
282 #ifndef RK_SIMULATOR_HW
283         pParams->iso[i] = pTuning_ISO->iso;
284 #endif
285         pParams->ratio[i] = pTuning_ISO->step0_uvgrad_ratio;
286         pParams->offset[i] = pTuning_ISO->step0_uvgrad_offset;
287 
288         pParams->wStep1[i] = 4;
289         pParams->hStep1[i] = 4;
290         pParams->meanSize1[i] = 4;
291 
292         pParams->medSize1[i] = 3;
293         pParams->medRatio1[i] = pTuning_ISO->step1_median_ratio;
294         pParams->isMedIIR1[i] = 0;
295 
296         pParams->bfSize1[i] = 5;
297         pParams->sigmaR1[i] = pTuning_ISO->step1_bf_sigmaR;
298         pParams->sigmaD1[i] = 16;
299         pParams->uvgain1[i] = pTuning_ISO->step1_bf_uvgain;
300         pParams->bfRatio1[i] = pTuning_ISO->step1_bf_ratio;
301         pParams->isRowIIR1[i] = 0;
302         pParams->isYcopy1[i] = 1;
303 
304         pParams->wStep2[i] = 32;
305         pParams->hStep2[i] = 32;
306         pParams->meanSize2[i] = 8;
307 
308         pParams->medSize2[i] = 3;
309         pParams->medRatio2[i] = pTuning_ISO->step2_median_ratio;
310         pParams->isMedIIR2[i] = 0;
311 
312         pParams->bfSize3[i] = 5;
313         pParams->sigmaR2[i] = pTuning_ISO->step2_bf_sigmaR;
314         pParams->sigmaD2[i] = 128;
315         pParams->uvgain2[i] = pTuning_ISO->step2_bf_uvgain;
316         pParams->bfRatio2[i] = pTuning_ISO->step2_bf_ratio;
317         pParams->isRowIIR2[i] = 0;
318         pParams->isYcopy2[i] = 1;
319 
320         pParams->bfSize3[i] = 3;
321         pParams->sigmaR3[i] = pTuning_ISO->step3_bf_sigmaR;
322         pParams->sigmaD3[i] = 8;
323         pParams->uvgain3[i] = pTuning_ISO->step3_bf_uvgain;
324         pParams->bfRatio3[i] = pTuning_ISO->step3_bf_ratio;
325         pParams->isRowIIR3[i] = 0;
326         pParams->isYcopy3[i] = 1;
327 
328     }
329 
330     for(i = 0; i < 4; i++) {
331         pParams->nonMed1[i] = 3;
332         pParams->nonBf1[i] = 31;
333         pParams->block2_ext[i] = 7;
334         pParams->nonMed2[i] = 1;
335         pParams->nonBf2[i] = 3;
336         pParams->nonBf3[i] = 32;
337     }
338 
339     for(i = 0; i < 3; i++) {
340         pParams->kernel_3x3_table[i] = pCalibdb->TuningPara.Kernel_Coeff.kernel_3x3[i];
341     }
342 
343     for(i = 0; i < 5; i++) {
344         pParams->kernel_5x5_talbe[i] = pCalibdb->TuningPara.Kernel_Coeff.kernel_5x5[i];
345     }
346 
347     for(i = 0; i < 8; i++) {
348         pParams->kernel_9x9_table[i] = pCalibdb->TuningPara.Kernel_Coeff.kernel_9x9[i];
349     }
350 
351     pParams->kernel_9x9_num = pCalibdb->TuningPara.Kernel_Coeff.kernel_9x9_num;
352 
353     for(i = 0; i < 9; i++) {
354         pParams->sigmaAdj_x[i] = luma[i];
355         pParams->sigamAdj_y[i] = 1;
356 
357         pParams->threAdj_x[i] = luma[i];
358         pParams->threAjd_y[i] = 10;
359     }
360 
361     uvnr_algo_param_printf(pParams);
362     return ANR_RET_SUCCESS;
363 
364 }
365 
uvnr_algo_param_printf(RKAnr_Uvnr_Params_t * pParams)366 ANRresult_t uvnr_algo_param_printf(RKAnr_Uvnr_Params_t *pParams)
367 {
368     int i, j;
369 
370     if(pParams != NULL) {
371         for(i = 0; i < MAX_ISO_STEP; i++) {
372 #ifndef RK_SIMULATOR_HW
373             LOGD_ANR("uvnr iso:%f\n",
374                      pParams->iso[i]);
375 #endif
376             LOGD_ANR(" ratio:%f, offset:%f medRatio1\n",
377                      pParams->ratio[i],
378                      pParams->offset[i]);
379 
380             LOGD_ANR("step1_median_ratio:%f  step1_bf_sigmaR:%f step1_bf_uvgain:%f step1_bf_ratio:%f\n",
381                      pParams->medRatio1[i],
382                      pParams->sigmaR1[i],
383                      pParams->uvgain1[i],
384                      pParams->bfRatio1[i]);
385 
386             LOGD_ANR("step2_median_ratio:%f  step2_bf_sigmaR:%f step2_bf_uvgain:%f step2_bf_ratio:%f\n",
387                      pParams->medRatio2[i],
388                      pParams->sigmaR2[i],
389                      pParams->uvgain2[i],
390                      pParams->bfRatio2[i]);
391 
392             LOGD_ANR(" step3_bf_sigmaR:%f step3_bf_uvgain:%f step3_bf_ratio:%f\n",
393                      pParams->sigmaR3[i],
394                      pParams->uvgain3[i],
395                      pParams->bfRatio3[i]);
396 
397             LOGD_ANR(" kernel3x3: %f %f %f\n",
398                      pParams->kernel_3x3_table[0],
399                      pParams->kernel_3x3_table[1],
400                      pParams->kernel_3x3_table[2]);
401 
402             LOGD_ANR(" kernel5x5: %f %f %f %f %f\n",
403                      pParams->kernel_5x5_talbe[0],
404                      pParams->kernel_5x5_talbe[1],
405                      pParams->kernel_5x5_talbe[2],
406                      pParams->kernel_5x5_talbe[3],
407                      pParams->kernel_5x5_talbe[4]);
408 
409             LOGD_ANR(" kernel9x9: %f %f %f %f %f %f %f %f\n",
410                      pParams->kernel_9x9_table[0],
411                      pParams->kernel_9x9_table[1],
412                      pParams->kernel_9x9_table[2],
413                      pParams->kernel_9x9_table[3],
414                      pParams->kernel_9x9_table[4],
415                      pParams->kernel_9x9_table[5],
416                      pParams->kernel_9x9_table[6],
417                      pParams->kernel_9x9_table[7]);
418 
419             LOGD_ANR("kernel_num:%d\n\n", pParams->kernel_9x9_num);
420 
421 
422         }
423     }
424 
425     return ANR_RET_SUCCESS;
426 }
427 
428 
uvnr_config_setting_param_json(RKAnr_Uvnr_Params_t * pParams,CalibDbV2_UVNR_t * pCalibdb,char * param_mode,char * snr_name)429 ANRresult_t uvnr_config_setting_param_json(RKAnr_Uvnr_Params_t *pParams, CalibDbV2_UVNR_t *pCalibdb, char* param_mode, char * snr_name)
430 {
431     ANRresult_t res = ANR_RET_SUCCESS;
432     int tuning_idx = 0;
433 
434     if(pParams == NULL) {
435         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
436         return ANR_RET_NULL_POINTER;
437     }
438 
439     if(pCalibdb == NULL) {
440         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
441         return ANR_RET_NULL_POINTER;
442     }
443 
444     res = uvnr_get_setting_idx_by_name_json(pCalibdb, snr_name,  &tuning_idx);
445     if(res != ANR_RET_SUCCESS) {
446         LOGW_ANR("%s(%d): error!!!  can't find setting in iq files, use 0 instead\n", __FUNCTION__, __LINE__);
447     }
448 
449     res = init_uvnr_params_json(pParams, pCalibdb, tuning_idx);
450 
451     return res;
452 
453 }
454 
interpISO(int ISO_low,int ISO_high,float value_low,float value_high,int ISO,float value)455 float interpISO(int ISO_low, int ISO_high, float value_low, float value_high, int ISO, float value)
456 {
457     if (ISO <= ISO_low)
458     {
459         value = value_low;
460     }
461     else if (ISO >= ISO_high)
462     {
463         value = value_high;
464     }
465     else
466     {
467         value = float(ISO - ISO_low) / float(ISO_high - ISO_low) * (value_high - value_low) + value_low;
468     }
469     return value;
470 }
471 
472 
select_uvnr_params_by_ISO(RKAnr_Uvnr_Params_t * stRKUVNrParams,RKAnr_Uvnr_Params_Select_t * stRKUVNrParamsSelected,ANRExpInfo_t * pExpInfo)473 ANRresult_t select_uvnr_params_by_ISO(RKAnr_Uvnr_Params_t *stRKUVNrParams, RKAnr_Uvnr_Params_Select_t *stRKUVNrParamsSelected, ANRExpInfo_t *pExpInfo)
474 {
475     ANRresult_t res = ANR_RET_SUCCESS;
476     int iso = 50;
477     if(stRKUVNrParams == NULL) {
478         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
479         return ANR_RET_NULL_POINTER;
480     }
481 
482     if(stRKUVNrParamsSelected == NULL) {
483         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
484         return ANR_RET_NULL_POINTER;
485     }
486 
487     if(pExpInfo == NULL) {
488         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
489         return ANR_RET_NULL_POINTER;
490     }
491 
492     if(pExpInfo->mfnr_mode_3to1) {
493         iso = pExpInfo->preIso[pExpInfo->hdr_mode];
494     } else {
495         iso = pExpInfo->arIso[pExpInfo->hdr_mode];
496     }
497     //ȷ��iso�ȼ�
498     //rkuvnriso@50 100 200 400 800 1600 3200  6400 12800
499     //      isogain: 1  2   4   8   16  32   64    128  256
500     //     isoindex: 0  1   2   3   4   5    6     7    8
501 
502     int isoIndex = 0;
503     int isoGainLow = 0;
504     int isoGainHigh = 0;
505     int isoIndexLow = 0;
506     int isoIndexHigh = 0;
507     int iso_div         = 50;
508     int max_iso_step  = MAX_ISO_STEP;
509     int i = 0;
510 
511 #ifndef RK_SIMULATOR_HW
512     for ( i = 0; i < max_iso_step - 1 ; i++)
513     {
514         if (iso >=  stRKUVNrParams->iso[i]  &&  iso <= stRKUVNrParams->iso[i + 1])
515         {
516             isoGainLow =  stRKUVNrParams->iso[i] ;
517             isoGainHigh = stRKUVNrParams->iso[i + 1];
518             isoIndexLow = i;
519             isoIndexHigh = i + 1;
520             isoIndex = isoIndexLow;
521             break;
522         }
523     }
524 
525     if(i == max_iso_step - 1) {
526         if(iso < stRKUVNrParams->iso[0] ) {
527             isoGainLow =  stRKUVNrParams->iso[0];
528             isoGainHigh = stRKUVNrParams->iso[1];
529             isoIndexLow = 0;
530             isoIndexHigh = 1;
531             isoIndex = 0;
532         }
533 
534         if(iso >  stRKUVNrParams->iso[max_iso_step - 1] ) {
535             isoGainLow =  stRKUVNrParams->iso[max_iso_step - 2] ;
536             isoGainHigh = stRKUVNrParams->iso[max_iso_step - 1];
537             isoIndexLow = max_iso_step - 2;
538             isoIndexHigh = max_iso_step - 1;
539             isoIndex = max_iso_step - 1;
540         }
541     }
542 #else
543     isoIndex = int(log(float(iso / iso_div)) / log(2.0f));
544 
545     for (i = max_iso_step - 1; i >= 0; i--)
546     {
547         if (iso < iso_div * (2 << i))
548         {
549             isoGainLow = iso_div * (2 << (i)) / 2;
550             isoGainHigh = iso_div * (2 << i);
551         }
552     }
553 
554     isoGainLow      = MIN(isoGainLow, iso_div * (2 << max_iso_step));
555     isoGainHigh     = MIN(isoGainHigh, iso_div * (2 << max_iso_step));
556 
557     isoIndexHigh    = (int)(log((float)isoGainHigh / iso_div) / log((float)2));
558     isoIndexLow     = (int)(log((float)isoGainLow / iso_div) / log((float)2));
559 
560     isoIndexLow     = MIN(MAX(isoIndexLow, 0), max_iso_step - 1);
561     isoIndexHigh    = MIN(MAX(isoIndexHigh, 0), max_iso_step - 1);
562 #endif
563 
564     LOGD_ANR("%s:%d iso:%d high:%d low:%d \n",
565              __FUNCTION__, __LINE__,
566              iso, isoGainHigh, isoGainLow);
567 
568     //ȡ��
569     memcpy(stRKUVNrParamsSelected->select_iso, stRKUVNrParams->rkuvnrISO, sizeof(char) * 256);
570     //step0:uvgainԤ����
571     stRKUVNrParamsSelected->ratio = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->ratio[isoIndexLow],
572                                     stRKUVNrParams->ratio[isoIndexHigh], iso, stRKUVNrParamsSelected->ratio);
573     stRKUVNrParamsSelected->offset = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->offset[isoIndexLow],
574                                      stRKUVNrParams->offset[isoIndexHigh], iso, stRKUVNrParamsSelected->offset);
575     //step1-�²���1
576     //��ֵ1
577     stRKUVNrParamsSelected->wStep1 = stRKUVNrParams->wStep1[isoIndex];
578     stRKUVNrParamsSelected->hStep1 = stRKUVNrParams->hStep1[isoIndex];
579     stRKUVNrParamsSelected->meanSize1 = stRKUVNrParams->meanSize1[isoIndex];
580     //��ֵ1
581     memcpy(stRKUVNrParamsSelected->nonMed1, stRKUVNrParams->nonMed1, sizeof(int) * 4);
582     stRKUVNrParamsSelected->medSize1 = stRKUVNrParams->medSize1[isoIndex];
583     stRKUVNrParamsSelected->medRatio1 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->medRatio1[isoIndexLow],
584                                         stRKUVNrParams->medRatio1[isoIndexHigh], iso, stRKUVNrParamsSelected->medRatio1);
585     stRKUVNrParamsSelected->isMedIIR1 = stRKUVNrParams->isMedIIR1[isoIndex];
586     //˫��1
587     memcpy(stRKUVNrParamsSelected->nonBf1, stRKUVNrParams->nonBf1, sizeof(int) * 4);
588     stRKUVNrParamsSelected->bfSize1 = stRKUVNrParams->bfSize1[isoIndex];
589     stRKUVNrParamsSelected->sigmaR1 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->sigmaR1[isoIndexLow],
590                                       stRKUVNrParams->sigmaR1[isoIndexHigh], iso, stRKUVNrParamsSelected->sigmaR1);
591     stRKUVNrParamsSelected->sigmaD1 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->sigmaD1[isoIndexLow],
592                                       stRKUVNrParams->sigmaD1[isoIndexHigh], iso, stRKUVNrParamsSelected->sigmaD1);
593     stRKUVNrParamsSelected->uvgain1 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->uvgain1[isoIndexLow],
594                                       stRKUVNrParams->uvgain1[isoIndexHigh], iso, stRKUVNrParamsSelected->uvgain1);
595     stRKUVNrParamsSelected->bfRatio1 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->bfRatio1[isoIndexLow],
596                                        stRKUVNrParams->bfRatio1[isoIndexHigh], iso, stRKUVNrParamsSelected->bfRatio1);
597     stRKUVNrParamsSelected->isRowIIR1 = stRKUVNrParams->isRowIIR1[isoIndex];
598     stRKUVNrParamsSelected->isYcopy1 = stRKUVNrParams->isYcopy1[isoIndex];
599 
600     //step2-�²���2
601     memcpy(stRKUVNrParamsSelected->block2_ext, stRKUVNrParams->block2_ext, sizeof(int) * 4);
602     //��ֵ2
603     stRKUVNrParamsSelected->wStep2 = stRKUVNrParams->wStep2[isoIndex];
604     stRKUVNrParamsSelected->hStep2 = stRKUVNrParams->hStep2[isoIndex];
605     stRKUVNrParamsSelected->meanSize2 = stRKUVNrParams->meanSize2[isoIndex];
606     //��ֵ2
607     memcpy(stRKUVNrParamsSelected->nonMed2, stRKUVNrParams->nonMed2, sizeof(int) * 4);
608     stRKUVNrParamsSelected->medSize2 = stRKUVNrParams->medSize2[isoIndex];
609     stRKUVNrParamsSelected->medRatio2 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->medRatio2[isoIndexLow],
610                                         stRKUVNrParams->medRatio2[isoIndexHigh], iso, stRKUVNrParamsSelected->medRatio2);
611     stRKUVNrParamsSelected->isMedIIR2 = stRKUVNrParams->isMedIIR2[isoIndex];
612     //˫��2
613     memcpy(stRKUVNrParamsSelected->nonBf2, stRKUVNrParams->nonBf2, sizeof(int) * 4);
614     stRKUVNrParamsSelected->bfSize2 = stRKUVNrParams->bfSize2[isoIndex];
615     stRKUVNrParamsSelected->sigmaR2 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->sigmaR2[isoIndexLow],
616                                       stRKUVNrParams->sigmaR2[isoIndexHigh], iso, stRKUVNrParamsSelected->sigmaR2);
617     stRKUVNrParamsSelected->sigmaD2 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->sigmaD2[isoIndexLow],
618                                       stRKUVNrParams->sigmaD2[isoIndexHigh], iso, stRKUVNrParamsSelected->sigmaD2);
619     stRKUVNrParamsSelected->uvgain2 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->uvgain2[isoIndexLow],
620                                       stRKUVNrParams->uvgain2[isoIndexHigh], iso, stRKUVNrParamsSelected->uvgain2);
621     stRKUVNrParamsSelected->bfRatio2 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->bfRatio2[isoIndexLow],
622                                        stRKUVNrParams->bfRatio2[isoIndexHigh], iso, stRKUVNrParamsSelected->bfRatio2);
623     stRKUVNrParamsSelected->isRowIIR2 = stRKUVNrParams->isRowIIR2[isoIndex];
624     stRKUVNrParamsSelected->isYcopy2 = stRKUVNrParams->isYcopy2[isoIndex];
625 
626     //step3
627     memcpy(stRKUVNrParamsSelected->nonBf3, stRKUVNrParams->nonBf3, sizeof(int) * 4);
628     //˫��3
629     stRKUVNrParamsSelected->bfSize3 = stRKUVNrParams->bfSize3[isoIndex];
630     stRKUVNrParamsSelected->sigmaR3 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->sigmaR3[isoIndexLow],
631                                       stRKUVNrParams->sigmaR3[isoIndexHigh], iso, stRKUVNrParamsSelected->sigmaR3);
632     stRKUVNrParamsSelected->sigmaD3 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->sigmaD3[isoIndexLow],
633                                       stRKUVNrParams->sigmaD3[isoIndexHigh], iso, stRKUVNrParamsSelected->sigmaD3);
634     stRKUVNrParamsSelected->uvgain3 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->uvgain3[isoIndexLow],
635                                       stRKUVNrParams->uvgain3[isoIndexHigh], iso, stRKUVNrParamsSelected->uvgain3);
636     stRKUVNrParamsSelected->bfRatio3 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->bfRatio3[isoIndexLow],
637                                        stRKUVNrParams->bfRatio3[isoIndexHigh], iso, stRKUVNrParamsSelected->bfRatio3);
638     stRKUVNrParamsSelected->isRowIIR3 = stRKUVNrParams->isRowIIR3[isoIndex];
639     stRKUVNrParamsSelected->isYcopy3 = stRKUVNrParams->isYcopy3[isoIndex];
640 
641     //kernels
642     memcpy(stRKUVNrParamsSelected->kernel_3x3_table, stRKUVNrParams->kernel_3x3_table, sizeof(float) * 3);
643     memcpy(stRKUVNrParamsSelected->kernel_5x5_table, stRKUVNrParams->kernel_5x5_talbe, sizeof(float) * 5);
644     memcpy(stRKUVNrParamsSelected->kernel_9x9_table, stRKUVNrParams->kernel_9x9_table, sizeof(float) * 8);
645     stRKUVNrParamsSelected->kernel_9x9_num = stRKUVNrParams->kernel_9x9_num;
646 
647     //curves
648     memcpy(stRKUVNrParamsSelected->sigmaAdj_x, stRKUVNrParams->sigmaAdj_x, sizeof(int) * 9);
649     memcpy(stRKUVNrParamsSelected->sigmaAdj_y, stRKUVNrParams->sigamAdj_y, sizeof(float) * 9);
650     memcpy(stRKUVNrParamsSelected->threAdj_x, stRKUVNrParams->threAdj_x, sizeof(int) * 9);
651     memcpy(stRKUVNrParamsSelected->threAdj_y, stRKUVNrParams->threAjd_y, sizeof(int) * 9);
652 
653     return ANR_RET_SUCCESS;
654 
655 }
656 
657 
uvnr_fix_transfer(RKAnr_Uvnr_Params_Select_t * uvnr,RKAnr_Uvnr_Fix_t * pNrCfg,ANRExpInfo_t * pExpInfo,float gain_ratio,float fStrength)658 ANRresult_t uvnr_fix_transfer(RKAnr_Uvnr_Params_Select_t *uvnr, RKAnr_Uvnr_Fix_t *pNrCfg, ANRExpInfo_t *pExpInfo, float gain_ratio, float fStrength)
659 {
660     LOGI_ANR("%s:(%d) enter \n", __FUNCTION__, __LINE__);
661 
662     int i = 0;
663     ANRresult_t res = ANR_RET_SUCCESS;
664 
665     if(uvnr == NULL) {
666         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
667         return ANR_RET_NULL_POINTER;
668     }
669 
670     if(pNrCfg == NULL) {
671         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
672         return ANR_RET_NULL_POINTER;
673     }
674 
675     if(pExpInfo == NULL) {
676         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
677         return ANR_RET_NULL_POINTER;
678     }
679 
680     int iso = pExpInfo->arIso[pExpInfo->hdr_mode] * gain_ratio;
681 
682     int log2e                       = (int)(0.8493f * (1 << RKUVNR_log2e));
683     log2e                           = log2e * (1 << RKUVNR_imgBit_set);
684 
685     //0x0080
686     pNrCfg->uvnr_step1_en = 1;
687     pNrCfg->uvnr_step2_en = 1;
688     pNrCfg->nr_gain_en = 1;
689     pNrCfg->uvnr_nobig_en = 0;
690     pNrCfg->uvnr_big_en = 0;
691 
692 
693     //0x0084
694     pNrCfg->uvnr_gain_1sigma = (unsigned char)(uvnr->ratio * (1 << RKUVNR_ratio));
695 
696     //0x0088
697     pNrCfg->uvnr_gain_offset = (unsigned char)(uvnr->offset * (1 << RKUVNR_offset));
698 
699     //0x008c
700     pNrCfg->uvnr_gain_uvgain[0] = (unsigned char)(uvnr->uvgain1 * fStrength * (1 << RKUVNR_uvgain));
701     if( pNrCfg->uvnr_gain_uvgain[0]  > 0x7f) {
702         pNrCfg->uvnr_gain_uvgain[0] = 0x7f;
703     }
704     pNrCfg->uvnr_gain_uvgain[1] = (unsigned char)(uvnr->uvgain3 * fStrength * (1 << RKUVNR_uvgain));
705     if( pNrCfg->uvnr_gain_uvgain[1]  > 0x7f) {
706         pNrCfg->uvnr_gain_uvgain[1] = 0x7f;
707     }
708     pNrCfg->uvnr_gain_t2gen = (unsigned char)(uvnr->uvgain2 *  fStrength * (1 << RKUVNR_uvgain));
709     if( pNrCfg->uvnr_gain_t2gen  > 0x7f) {
710         pNrCfg->uvnr_gain_t2gen = 0x7f;
711     }
712     pNrCfg->uvnr_gain_iso = (int)(sqrt(50.0 / (float)(iso)) * (1 << RKUVNR_gainRatio));
713     if(pNrCfg->uvnr_gain_iso > 0x80) {
714         pNrCfg->uvnr_gain_iso = 0x80;
715     }
716 
717     if(pNrCfg->uvnr_gain_iso < 0x8) {
718         pNrCfg->uvnr_gain_iso = 0x8;
719     }
720 
721     //0x0090
722     pNrCfg->uvnr_t1gen_m3alpha = (uvnr->medRatio1 * (1 << RKUVNR_medRatio));
723 
724     //0x0094
725     pNrCfg->uvnr_t1flt_mode = uvnr->kernel_9x9_num;
726 
727     //0x0098
728     pNrCfg->uvnr_t1flt_msigma = (unsigned short)(log2e / uvnr->sigmaR1);
729 
730     pNrCfg->uvnr_t1flt_msigma = MIN(pNrCfg->uvnr_t1flt_msigma, 8191);
731 
732 
733     //0x009c
734     pNrCfg->uvnr_t1flt_wtp = (unsigned char)(uvnr->bfRatio1 * (1 << RKUVNR_bfRatio));
735 
736     //0x00a0-0x00a4
737     for(i = 0; i < 8; i++) {
738         pNrCfg->uvnr_t1flt_wtq[i] = (unsigned char)(uvnr->kernel_9x9_table[i] * (1 << RKUVNR_kernels));
739     }
740 
741     //0x00a8
742     pNrCfg->uvnr_t2gen_m3alpha = (unsigned char)(uvnr->medRatio2 * (1 << RKUVNR_medRatio));
743 
744     //0x00ac
745     pNrCfg->uvnr_t2gen_msigma = (unsigned short)(log2e / uvnr->sigmaR2);
746     pNrCfg->uvnr_t2gen_msigma = MIN(pNrCfg->uvnr_t2gen_msigma, 8191);
747 
748 
749     //0x00b0
750     pNrCfg->uvnr_t2gen_wtp = (unsigned char)(uvnr->kernel_5x5_table[0] * (1 << RKUVNR_kernels));
751 
752     //0x00b4
753     for(i = 0; i < 4; i++) {
754         pNrCfg->uvnr_t2gen_wtq[i] = (unsigned char)(uvnr->kernel_5x5_table[i + 1] * (1 << RKUVNR_kernels));
755     }
756 
757     //0x00b8
758     pNrCfg->uvnr_t2flt_msigma = (unsigned short)(log2e / uvnr->sigmaR3);
759     pNrCfg->uvnr_t2flt_msigma = MIN(pNrCfg->uvnr_t2flt_msigma, 8191);
760 
761     //0x00bc
762     pNrCfg->uvnr_t2flt_wtp = (unsigned char)(uvnr->bfRatio3 * (1 << RKUVNR_bfRatio));
763     for(i = 0; i < 3; i++) {
764         pNrCfg->uvnr_t2flt_wt[i] = (unsigned char)(uvnr->kernel_3x3_table[i] * (1 << RKUVNR_kernels));
765     }
766 
767 #if UVNR_FIX_VALUE_PRINTF
768     uvnr_fix_Printf(pNrCfg);
769 #endif
770 
771     LOGI_ANR("%s:(%d) exit \n", __FUNCTION__, __LINE__);
772 
773     return ANR_RET_SUCCESS;
774 }
775 
776 
uvnr_fix_Printf(RKAnr_Uvnr_Fix_t * pNrCfg)777 ANRresult_t uvnr_fix_Printf(RKAnr_Uvnr_Fix_t  * pNrCfg)
778 {
779     int i = 0;
780     LOGI_ANR("%s:(%d) enter \n", __FUNCTION__, __LINE__);
781 
782     ANRresult_t res = ANR_RET_SUCCESS;
783 
784     if(pNrCfg == NULL) {
785         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
786         return ANR_RET_NULL_POINTER;
787     }
788 
789     //0x0080
790     LOGD_ANR("(0x0080) uvnr_step1_en:%d uvnr_step2_en:%d nr_gain_en:%d uvnr_nobig_en:%d uvnr_big_en:%d\n",
791              pNrCfg->uvnr_step1_en,
792              pNrCfg->uvnr_step2_en,
793              pNrCfg->nr_gain_en,
794              pNrCfg->uvnr_nobig_en,
795              pNrCfg->uvnr_big_en);
796 
797     //0x0084
798     LOGD_ANR("(0x0084) uvnr_gain_1sigma:%d \n",
799              pNrCfg->uvnr_gain_1sigma);
800 
801     //0x0088
802     LOGD_ANR("(0x0088) uvnr_gain_offset:%d \n",
803              pNrCfg->uvnr_gain_offset);
804 
805     //0x008c
806     LOGD_ANR("uvnr: (0x008c) uvnr_gain_uvgain:%d uvnr_step2_en:%d uvnr_gain_t2gen:%d uvnr_gain_iso:%d\n",
807              pNrCfg->uvnr_gain_uvgain[0],
808              pNrCfg->uvnr_gain_uvgain[1],
809              pNrCfg->uvnr_gain_t2gen,
810              pNrCfg->uvnr_gain_iso);
811 
812 
813     //0x0090
814     LOGD_ANR("(0x0090) uvnr_t1gen_m3alpha:%d \n",
815              pNrCfg->uvnr_t1gen_m3alpha);
816 
817     //0x0094
818     LOGD_ANR("(0x0094) uvnr_t1flt_mode:%d \n",
819              pNrCfg->uvnr_t1flt_mode);
820 
821     //0x0098
822     LOGD_ANR("(0x0098) uvnr_t1flt_msigma:%d \n",
823              pNrCfg->uvnr_t1flt_msigma);
824 
825     //0x009c
826     LOGD_ANR("(0x009c) uvnr_t1flt_wtp:%d \n",
827              pNrCfg->uvnr_t1flt_wtp);
828 
829     //0x00a0-0x00a4
830     for(i = 0; i < 8; i++) {
831         LOGD_ANR("(0x00a0-0x00a4) uvnr_t1flt_wtq[%d]:%d \n",
832                  i, pNrCfg->uvnr_t1flt_wtq[i]);
833     }
834 
835     //0x00a8
836     LOGD_ANR("(0x00a8) uvnr_t2gen_m3alpha:%d \n",
837              pNrCfg->uvnr_t2gen_m3alpha);
838 
839     //0x00ac
840     LOGD_ANR("(0x00ac) uvnr_t2gen_msigma:%d \n",
841              pNrCfg->uvnr_t2gen_msigma);
842 
843     //0x00b0
844     LOGD_ANR("(0x00b0) uvnr_t2gen_wtp:%d \n",
845              pNrCfg->uvnr_t2gen_wtp);
846 
847     //0x00b4
848     for(i = 0; i < 4; i++) {
849         LOGD_ANR("(0x00b4) uvnr_t2gen_wtq[%d]:%d \n",
850                  i, pNrCfg->uvnr_t2gen_wtq[i]);
851     }
852 
853     //0x00b8
854     LOGD_ANR("(0x00b8) uvnr_t2flt_msigma:%d \n",
855              pNrCfg->uvnr_t2flt_msigma);
856 
857     //0x00bc
858     LOGD_ANR("(0x00bc) uvnr_t2flt_wtp:%d \n",
859              pNrCfg->uvnr_t2flt_wtp);
860     for(i = 0; i < 3; i++) {
861         LOGD_ANR("(0x00bc) uvnr_t2flt_wt[%d]:%d \n",
862                  i, pNrCfg->uvnr_t2flt_wt[i]);
863     }
864 
865 
866     LOGD_ANR("%s:(%d) exit \n", __FUNCTION__, __LINE__);
867 
868     return ANR_RET_SUCCESS;
869 }
870 
871 
uvnr_calibdbV2_assign(CalibDbV2_UVNR_t * pDst,CalibDbV2_UVNR_t * pSrc)872 ANRresult_t uvnr_calibdbV2_assign(CalibDbV2_UVNR_t *pDst, CalibDbV2_UVNR_t *pSrc)
873 {
874     ANRresult_t res = ANR_RET_SUCCESS;
875     CalibDbV2_UVNR_Tuning_t *pSrcTuningParaV2 = NULL;
876     CalibDbV2_UVNR_Tuning_t *pDstTuningParaV2 = NULL;
877     int setting_len = 0;
878     int iso_len = 0;
879 
880 
881     if(pDst == NULL) {
882         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
883         return ANR_RET_NULL_POINTER;
884     }
885 
886     if(pSrc == NULL) {
887         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
888         return ANR_RET_NULL_POINTER;
889     }
890 
891     uvnr_calibdbV2_free(pDst);
892 
893     pSrcTuningParaV2 = &pSrc->TuningPara;
894     pDstTuningParaV2 = &pDst->TuningPara;
895 
896     //assign the value
897     pDst->Version = strdup(pSrc->Version);
898     pDstTuningParaV2->enable = pSrcTuningParaV2->enable;
899 
900     //malloc iso size
901     setting_len = pSrcTuningParaV2->Setting_len;
902     pDstTuningParaV2->Setting = (CalibDbV2_UVNR_T_Set_t *)malloc(setting_len * sizeof(CalibDbV2_UVNR_T_Set_t));
903     memset(pDstTuningParaV2->Setting, 0x00, setting_len * sizeof(CalibDbV2_UVNR_T_Set_t));
904     pDstTuningParaV2->Setting_len = setting_len;
905 
906     for(int i = 0; i < setting_len; i++) {
907         iso_len = pSrcTuningParaV2->Setting[i].Tuning_ISO_len;
908         pDstTuningParaV2->Setting[i].Tuning_ISO = (CalibDbV2_UVNR_T_ISO_t *)malloc(iso_len * sizeof(CalibDbV2_UVNR_T_ISO_t));
909         memset(pDstTuningParaV2->Setting[i].Tuning_ISO, 0x00, iso_len * sizeof(CalibDbV2_UVNR_T_ISO_t));
910         pDstTuningParaV2->Setting[i].Tuning_ISO_len = iso_len;
911     }
912 
913     for(int i = 0; i < setting_len; i++) {
914         iso_len = pSrcTuningParaV2->Setting[i].Tuning_ISO_len;
915         pDstTuningParaV2->Setting[i].SNR_Mode = strdup(pSrcTuningParaV2->Setting[i].SNR_Mode);
916         pDstTuningParaV2->Setting[i].Sensor_Mode = strdup(pSrcTuningParaV2->Setting[i].Sensor_Mode);
917 
918         for(int j = 0; j < iso_len; j++) {
919             pDstTuningParaV2->Setting[i].Tuning_ISO[j] = pSrcTuningParaV2->Setting[i].Tuning_ISO[j];
920         }
921     }
922 
923     pDstTuningParaV2->Kernel_Coeff = pSrcTuningParaV2->Kernel_Coeff;
924 
925     return res;
926 
927 }
928 
929 
930 
uvnr_calibdbV2_free(CalibDbV2_UVNR_t * pCalibdbV2)931 void uvnr_calibdbV2_free(CalibDbV2_UVNR_t *pCalibdbV2)
932 {
933     if(pCalibdbV2) {
934         if(pCalibdbV2->Version) {
935             free(pCalibdbV2->Version);
936         }
937 
938         if(pCalibdbV2->TuningPara.Setting) {
939             for(int i = 0; i < pCalibdbV2->TuningPara.Setting_len; i++) {
940                 if(pCalibdbV2->TuningPara.Setting[i].SNR_Mode) {
941                     free(pCalibdbV2->TuningPara.Setting[i].SNR_Mode);
942                 }
943                 if(pCalibdbV2->TuningPara.Setting[i].Sensor_Mode) {
944                     free(pCalibdbV2->TuningPara.Setting[i].Sensor_Mode);
945                 }
946                 if(pCalibdbV2->TuningPara.Setting[i].Tuning_ISO) {
947                     free(pCalibdbV2->TuningPara.Setting[i].Tuning_ISO);
948                 }
949             }
950             free(pCalibdbV2->TuningPara.Setting);
951         }
952 
953     }
954 }
955 
956 
957 RKAIQ_END_DECLARE
958 
959 
960 
961 
962