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