1 #include "rk_aiq_acnr_algo_cnr_v1.h"
2
3
4 RKAIQ_BEGIN_DECLARE
5
cnr_get_mode_by_name_V1(struct list_head * pCalibdbList,char * name,Calibdb_Cnr_V1_t ** ppProfile)6 Acnr_result_t cnr_get_mode_by_name_V1(struct list_head* pCalibdbList, char *name, Calibdb_Cnr_V1_t** ppProfile)
7 {
8 int i = 0;
9 Acnr_result_t res = ACNR_RET_SUCCESS;
10
11 if(pCalibdbList == NULL) {
12 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
13 return ACNR_RET_NULL_POINTER;
14 }
15
16 if(name == NULL) {
17 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
18 return ACNR_RET_NULL_POINTER;
19 }
20
21 if(ppProfile == NULL) {
22 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
23 return ACNR_RET_NULL_POINTER;
24 }
25
26 #if 1
27 *ppProfile = NULL;
28 struct list_head* p;
29 p = pCalibdbList->next;
30 while (p != pCalibdbList)
31 {
32 Calibdb_Cnr_V1_t* pProfile = container_of(p, Calibdb_Cnr_V1_t, listItem);
33 LOGD_ANR("%s:%d %s %p \n",
34 __FUNCTION__, __LINE__, pProfile->modeName, p);
35 if (!strncmp(pProfile->modeName, name, sizeof(pProfile->modeName))) {
36 *ppProfile = pProfile;
37 return res;
38 }
39 p = p->next;
40 }
41
42 Calibdb_Cnr_V1_t* pProfile = container_of(pCalibdbList->next, Calibdb_Cnr_V1_t, listItem);
43 *ppProfile = pProfile;
44 #else
45
46
47 #endif
48
49 return res;
50
51 }
52
53
54
cnr_get_setting_by_name_V1(struct list_head * pSettingList,char * name,Calibdb_Cnr_params_V1_t ** ppSetting)55 Acnr_result_t cnr_get_setting_by_name_V1(struct list_head *pSettingList, char *name, Calibdb_Cnr_params_V1_t** ppSetting)
56 {
57 int i = 0;
58 Acnr_result_t res = ACNR_RET_SUCCESS;
59
60 if(pSettingList == NULL) {
61 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
62 return ACNR_RET_NULL_POINTER;
63 }
64
65 if(name == NULL) {
66 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
67 return ACNR_RET_NULL_POINTER;
68 }
69
70 if(ppSetting == NULL) {
71 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
72 return ACNR_RET_NULL_POINTER;
73 }
74
75 *ppSetting = NULL;
76
77 struct list_head* p;
78 p = pSettingList->next;
79 while (p != pSettingList)
80 {
81 Calibdb_Cnr_params_V1_t* pSetting = container_of(p, Calibdb_Cnr_params_V1_t, listItem);
82 LOGD_ANR("%s:%d: %s %p \n",
83 __FUNCTION__, __LINE__, pSetting->snr_mode, p);
84 if (!strncmp(pSetting->snr_mode, name, sizeof(pSetting->snr_mode))) {
85 *ppSetting = pSetting;
86 return res;
87 }
88 p = p->next;
89 }
90
91 Calibdb_Cnr_params_V1_t* pSetting = container_of(pSettingList->next, Calibdb_Cnr_params_V1_t, listItem);
92 *ppSetting = pSetting;
93 return res;
94 }
95
96
cnr_config_setting_param_V1(RK_CNR_Params_V1_t * pParams,struct list_head * pCalibdbList,char * param_mode,char * snr_name)97 Acnr_result_t cnr_config_setting_param_V1(RK_CNR_Params_V1_t *pParams, struct list_head *pCalibdbList, char* param_mode, char * snr_name)
98 {
99 Acnr_result_t res = ACNR_RET_SUCCESS;
100 Calibdb_Cnr_V1_t *pProfile;
101 Calibdb_Cnr_params_V1_t *pCalibParms;
102
103 if(pParams == NULL) {
104 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
105 return ACNR_RET_NULL_POINTER;
106 }
107
108 if(pCalibdbList == NULL) {
109 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
110 return ACNR_RET_NULL_POINTER;
111 }
112
113 if(param_mode == NULL) {
114 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
115 return ACNR_RET_NULL_POINTER;
116 }
117
118 if(snr_name == NULL) {
119 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
120 return ACNR_RET_NULL_POINTER;
121 }
122
123 res = cnr_get_mode_by_name_V1(pCalibdbList, param_mode, &pProfile);
124 if(res != ACNR_RET_SUCCESS) {
125 LOGW_ANR("%s(%d): error!!! can't find mode name in iq files, use 0 instead\n", __FUNCTION__, __LINE__);
126 }
127
128 res = cnr_get_setting_by_name_V1(&pProfile->listHead, snr_name, &pCalibParms);
129 if(res != ACNR_RET_SUCCESS) {
130 LOGW_ANR("%s(%d): error!!! can't find setting in iq files, use 0 instead\n", __FUNCTION__, __LINE__);
131 }
132
133 res = cnr_init_params_V1(pParams, pCalibParms);
134 pParams->enable = pProfile->enable;
135 return res;
136
137 }
138
139
cnr_init_params_V1(RK_CNR_Params_V1_t * pParams,Calibdb_Cnr_params_V1_t * pCalibParms)140 Acnr_result_t cnr_init_params_V1(RK_CNR_Params_V1_t *pParams, Calibdb_Cnr_params_V1_t* pCalibParms)
141 {
142 Acnr_result_t res = ACNR_RET_SUCCESS;
143 int i = 0;
144 int j = 0;
145
146 if(pParams == NULL) {
147 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
148 return ACNR_RET_NULL_POINTER;
149 }
150
151 if(pCalibParms == NULL) {
152 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
153 return ACNR_RET_NULL_POINTER;
154 }
155
156 pParams->enable = pCalibParms->enable;
157
158 for(i = 0; i < RK_CNR_V1_MAX_ISO_NUM; i++ ) {
159 pParams->iso[i] = pCalibParms->iso[i];
160 pParams->rkcnr_hq_bila_bypass[i] = pCalibParms->rkcnr_hq_bila_bypass[i];
161 pParams->rkcnr_lq_bila_bypass[i] = pCalibParms->rkcnr_lq_bila_bypass[i];
162 pParams->rkcnr_exgain[i] = pCalibParms->rkcnr_exgain[i];
163 pParams->rkcnr_g_gain[i] = pCalibParms->rkcnr_g_gain[i];
164 pParams->ratio[i] = pCalibParms->ratio[i];
165 pParams->offset[i] = pCalibParms->offset[i];
166 pParams->medRatio1[i] = pCalibParms->medRatio1[i];
167 pParams->sigmaR1[i] = pCalibParms->sigmaR1[i];
168 pParams->uvgain1[i] = pCalibParms->uvgain1[i];
169 pParams->bfRatio1[i] = pCalibParms->bfRatio1[i];
170 pParams->hbf_wgt_clip[i] = pCalibParms->hbf_wgt_clip[i];
171 pParams->medRatio2[i] = pCalibParms->medRatio2[i];
172 pParams->sigmaR2[i] = pCalibParms->sigmaR2[i];
173 pParams->uvgain2[i] = pCalibParms->uvgain2[i];
174 pParams->sigmaR3[i] = pCalibParms->sigmaR3[i];
175 pParams->uvgain3[i] = pCalibParms->uvgain3[i];
176 pParams->bfRatio3[i] = pCalibParms->bfRatio3[i];
177 }
178
179
180 memcpy(pParams->kernel_5x5_table, pCalibParms->kernel_5x5_table, sizeof(float) * 5);
181
182 return ACNR_RET_SUCCESS;
183
184 }
185
186
interp_cnr_v1(int ISO_low,int ISO_high,float value_low,float value_high,int ISO,float value)187 float interp_cnr_v1(int ISO_low, int ISO_high, float value_low, float value_high, int ISO, float value)
188 {
189 if (ISO <= ISO_low) {
190 value = value_low;
191 }
192 else if (ISO >= ISO_high) {
193 value = value_high;
194 }
195 else {
196 value = float(ISO - ISO_low) / float(ISO_high - ISO_low) * (value_high - value_low) + value_low;
197 }
198
199 return value;
200 }
201
202
cnr_select_params_by_ISO_V1(RK_CNR_Params_V1_t * pParams,RK_CNR_Params_V1_Select_t * pSelect,Acnr_ExpInfo_t * pExpInfo)203 Acnr_result_t cnr_select_params_by_ISO_V1(RK_CNR_Params_V1_t *pParams, RK_CNR_Params_V1_Select_t *pSelect, Acnr_ExpInfo_t *pExpInfo)
204 {
205 Acnr_result_t res = ACNR_RET_SUCCESS;
206 int iso = 50;
207 if(pParams == NULL) {
208 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
209 return ACNR_RET_NULL_POINTER;
210 }
211
212 if(pSelect == NULL) {
213 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
214 return ACNR_RET_NULL_POINTER;
215 }
216
217 if(pExpInfo == NULL) {
218 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
219 return ACNR_RET_NULL_POINTER;
220 }
221
222 iso = pExpInfo->arIso[pExpInfo->hdr_mode];
223
224 //ȷ��iso�ȼ�
225 //rkuvnriso@50 100 200 400 800 1600 3200 6400 12800
226 // isogain: 1 2 4 8 16 32 64 128 256
227 // isoindex: 0 1 2 3 4 5 6 7 8
228
229 int isoIndex = 0;
230 int isoGainLow = 0;
231 int isoGainHigh = 0;
232 int isoIndexLow = 0;
233 int isoIndexHigh = 0;
234 int iso_div = 50;
235 int max_iso_step = RK_CNR_V1_MAX_ISO_NUM;
236
237 #ifndef RK_SIMULATOR_HW
238 for (int i = 0; i < max_iso_step - 1 ; i++) {
239 if (iso >= pParams->iso[i] && iso <= pParams->iso[i + 1]) {
240 isoGainLow = pParams->iso[i] ;
241 isoGainHigh = pParams->iso[i + 1];
242 isoIndexLow = i;
243 isoIndexHigh = i + 1;
244 isoIndex = isoIndexLow;
245 }
246 }
247
248 if(iso < pParams->iso[0] ) {
249 isoGainLow = pParams->iso[0];
250 isoGainHigh = pParams->iso[1];
251 isoIndexLow = 0;
252 isoIndexHigh = 1;
253 isoIndex = 0;
254 }
255
256 if(iso > pParams->iso[max_iso_step - 1] ) {
257 isoGainLow = pParams->iso[max_iso_step - 2] ;
258 isoGainHigh = pParams->iso[max_iso_step - 1];
259 isoIndexLow = max_iso_step - 2;
260 isoIndexHigh = max_iso_step - 1;
261 isoIndex = max_iso_step - 1;
262 }
263 #else
264 isoIndex = int(log(float(iso / iso_div)) / log(2.0f));
265
266 for (int i = max_iso_step - 1; i >= 0; i--) {
267 if (iso < iso_div * (2 << i)) {
268 isoGainLow = iso_div * (2 << (i)) / 2;
269 isoGainHigh = iso_div * (2 << i);
270 }
271 }
272
273 isoGainLow = MIN(isoGainLow, iso_div * (2 << max_iso_step));
274 isoGainHigh = MIN(isoGainHigh, iso_div * (2 << max_iso_step));
275
276 isoIndexHigh = (int)(log((float)isoGainHigh / iso_div) / log((float)2));
277 isoIndexLow = (int)(log((float)isoGainLow / iso_div) / log((float)2));
278
279 isoIndexLow = MIN(MAX(isoIndexLow, 0), max_iso_step - 1);
280 isoIndexHigh = MIN(MAX(isoIndexHigh, 0), max_iso_step - 1);
281 #endif
282
283 LOGD_ANR("%s:%d iso:%d high:%d low:%d \n",
284 __FUNCTION__, __LINE__,
285 iso, isoGainHigh, isoGainLow);
286
287 pSelect->enable = pParams->enable;
288 // bypass
289 pSelect->rkcnr_hq_bila_bypass = pParams->rkcnr_hq_bila_bypass[isoIndex];
290 pSelect->rkcnr_lq_bila_bypass = pParams->rkcnr_lq_bila_bypass[isoIndex];
291
292 // gain
293 pSelect->rkcnr_exgain = interp_cnr_v1(isoGainLow, isoGainHigh, pParams->rkcnr_exgain[isoIndexLow], pParams->rkcnr_exgain[isoIndexHigh], iso, pSelect->rkcnr_exgain);
294 pSelect->rkcnr_g_gain = interp_cnr_v1(isoGainLow, isoGainHigh, pParams->rkcnr_g_gain[isoIndexLow], pParams->rkcnr_g_gain[isoIndexHigh], iso, pSelect->rkcnr_g_gain);
295
296
297 //
298 pSelect->ratio = interp_cnr_v1(isoGainLow, isoGainHigh, pParams->ratio[isoIndexLow], pParams->ratio[isoIndexHigh], iso, pSelect->ratio);
299 pSelect->offset = interp_cnr_v1(isoGainLow, isoGainHigh, pParams->offset[isoIndexLow], pParams->offset[isoIndexHigh], iso, pSelect->offset);
300
301 // step1
302 // median filter
303 pSelect->medRatio1 = interp_cnr_v1(isoGainLow, isoGainHigh, pParams->medRatio1[isoIndexLow], pParams->medRatio1[isoIndexHigh], iso, pSelect->medRatio1);
304
305 // bilateral filter
306 pSelect->sigmaR1 = interp_cnr_v1(isoGainLow, isoGainHigh, pParams->sigmaR1[isoIndexLow], pParams->sigmaR1[isoIndexHigh], iso, pSelect->sigmaR1);
307 pSelect->uvgain1 = interp_cnr_v1(isoGainLow, isoGainHigh, pParams->uvgain1[isoIndexLow], pParams->uvgain1[isoIndexHigh], iso, pSelect->uvgain1);
308 pSelect->bfRatio1 = interp_cnr_v1(isoGainLow, isoGainHigh, pParams->bfRatio1[isoIndexLow], pParams->bfRatio1[isoIndexHigh], iso, pSelect->bfRatio1);
309 pSelect->hbf_wgt_clip = pParams->hbf_wgt_clip[isoIndex];
310
311 // step2
312 // median filter
313 pSelect->medRatio2 = interp_cnr_v1(isoGainLow, isoGainHigh, pParams->medRatio2[isoIndexLow], pParams->medRatio2[isoIndexHigh], iso, pSelect->medRatio2);
314
315 // bilateral filter
316 pSelect->sigmaR2 = interp_cnr_v1(isoGainLow, isoGainHigh, pParams->sigmaR2[isoIndexLow], pParams->sigmaR2[isoIndexHigh], iso, pSelect->sigmaR2);
317 pSelect->uvgain2 = interp_cnr_v1(isoGainLow, isoGainHigh, pParams->uvgain2[isoIndexLow], pParams->uvgain2[isoIndexHigh], iso, pSelect->uvgain2);
318
319 // step3
320 // bilateral filter
321 pSelect->sigmaR3 = interp_cnr_v1(isoGainLow, isoGainHigh, pParams->sigmaR3[isoIndexLow], pParams->sigmaR3[isoIndexHigh], iso, pSelect->sigmaR3);
322 pSelect->uvgain3 = interp_cnr_v1(isoGainLow, isoGainHigh, pParams->uvgain3[isoIndexLow], pParams->uvgain3[isoIndexHigh], iso, pSelect->uvgain3);
323 pSelect->bfRatio3 = interp_cnr_v1(isoGainLow, isoGainHigh, pParams->bfRatio3[isoIndexLow], pParams->bfRatio3[isoIndexHigh], iso, pSelect->bfRatio3);
324
325 // bilateral filter kernels
326 memcpy(pSelect->kernel_5x5_table, pParams->kernel_5x5_table, sizeof(float) * 5);
327
328 return ACNR_RET_SUCCESS;
329
330 }
331
332
cnr_fix_transfer_V1(RK_CNR_Params_V1_Select_t * pSelect,RK_CNR_Fix_V1_t * pFix,Acnr_ExpInfo_t * pExpInfo,float fStrength)333 Acnr_result_t cnr_fix_transfer_V1(RK_CNR_Params_V1_Select_t *pSelect, RK_CNR_Fix_V1_t *pFix, Acnr_ExpInfo_t *pExpInfo, float fStrength)
334 {
335 LOGI_ANR("%s:(%d) enter \n", __FUNCTION__, __LINE__);
336
337 int i = 0;
338 Acnr_result_t res = ACNR_RET_SUCCESS;
339 int tmp = 0;
340
341 if(pSelect == NULL) {
342 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
343 return ACNR_RET_NULL_POINTER;
344 }
345
346 if(pFix == NULL) {
347 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
348 return ACNR_RET_NULL_POINTER;
349 }
350
351 if(pExpInfo == NULL) {
352 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
353 return ACNR_RET_NULL_POINTER;
354 }
355
356
357 if(fStrength <= 0.0) {
358 fStrength = 0.000001;
359 }
360
361 // fix bit : RK_CNR_V1_log2e + RK_CNR_V1_SIGMA_FIX_BIT, msigma = (1 / sigma) * (1 << RK_CNR_V1_SIGMA_FIX_BIT) * log2e * (1 << RK_CNR_V1_log2e);
362 int log2e = (int)(0.8493f * (1 << (RK_CNR_V1_log2e + RK_CNR_V1_SIGMA_FIX_BIT)));
363
364 //ISP_CNR_2800_CTRL
365 pFix->cnr_thumb_mix_cur_en = 0;
366 pFix->cnr_exgain_bypass = 1;
367 pFix->cnr_hq_bila_bypass = pSelect->rkcnr_hq_bila_bypass;
368 pFix->cnr_lq_bila_bypass = pSelect->rkcnr_lq_bila_bypass;
369 pFix->cnr_en_i = pSelect->enable;
370
371 // ISP_CNR_2800_EXGAIN
372 tmp = pSelect->rkcnr_exgain * (1 << RK_CNR_V1_sgmGain);
373 pFix->cnr_exgain_mux = CLIP(tmp, 0, 255);
374
375 // ISP_CNR_2800_GAIN_PARA
376 tmp = pSelect->rkcnr_g_gain * (1 << RK_CNR_V1_gainRatio);
377 pFix->cnr_gain_iso = CLIP(tmp, 0, 128);
378 tmp = (int)(pSelect->offset * (1 << RK_CNR_V1_offset));
379 pFix->cnr_gain_offset = CLIP(tmp, 0, 16);
380 tmp = (int)(pSelect->ratio * (1 << RK_CNR_V1_ratio));
381 pFix->cnr_gain_1sigma = CLIP(tmp, 0, 255);
382
383 // ISP_CNR_2800_GAIN_UV_PARA
384 tmp = (int)(pSelect->uvgain1 / fStrength * (1 << RK_CNR_V1_uvgain));
385 pFix->cnr_gain_uvgain0 = CLIP(tmp, 0, (1 << 7) - 1);
386 tmp = (int)(pSelect->uvgain3 / fStrength * (1 << RK_CNR_V1_uvgain));
387 pFix->cnr_gain_uvgain1 = CLIP(tmp, 0, (1 << 7) - 1);
388
389 // ISP_CNR_2800_LMED3
390 tmp = (int)(pSelect->medRatio2 * (1 << RK_CNR_V1_medRatio));
391 pFix->cnr_lmed3_alpha = CLIP(tmp, 0, 16);
392
393 // ISP_CNR_2800_LBF5_GAIN
394 int rkcnr_sigmaR2 = (int)(log2e / pSelect->sigmaR2 / fStrength);
395 int rkcnr_uvgain2 = (int)(pSelect->uvgain2 / fStrength * (1 << RK_CNR_V1_uvgain));
396 int tmpBit = 10 + RK_CNR_V1_log2e + RK_CNR_V1_uvgain - 6;
397 int sgmRatio = 1 << RK_CNR_V1_sgmRatio;
398 int ky = sgmRatio * (1 << RK_CNR_V1_uvgain) >> RK_CNR_V1_sgmRatio;
399 int kuv = sgmRatio * rkcnr_uvgain2 >> RK_CNR_V1_sgmRatio;
400 ky = MIN2(ky, (1 << (4 + RK_CNR_V1_uvgain)) - 1);
401 kuv = MIN2(kuv, (1 << (4 + RK_CNR_V1_uvgain)) - 1);
402 tmp = ((rkcnr_sigmaR2 * ky + (1 << (tmpBit - 1))) >> tmpBit);
403 pFix->cnr_lbf5_gain_y = CLIP(tmp, 0, 15);
404 tmp = ((rkcnr_sigmaR2 * kuv + (1 << (tmpBit - 1))) >> tmpBit);
405 pFix->cnr_lbf5_gain_c = CLIP(tmp, 0, 63);
406
407 // ISP_CNR_2800_LBF5_WEITD0_3
408 // bilateral filter kernels
409 for (int i = 0; i < 5; i++) {
410 tmp = (int)(pSelect->kernel_5x5_table[i] * (1 << RK_CNR_V1_kernels));
411 pFix->cnr_lbf5_weit_d[i] = CLIP(tmp, 0, 128);
412 }
413
414 // ISP_CNR_2800_HMED3
415 tmp = (int)(pSelect->medRatio1 * (1 << RK_CNR_V1_medRatio));
416 pFix->cnr_hmed3_alpha = CLIP(tmp, 0, 16);
417
418 // ISP_CNR_2800_HBF5
419 tmp = (int)(log2e / pSelect->sigmaR1 / fStrength);
420 pFix->cnr_hbf5_sigma = CLIP(tmp, 0, (1 << 13) - 1);
421 tmp = (int)(pSelect->bfRatio1 * (1 << RK_CNR_V1_bfRatio));
422 pFix->cnr_hbf5_weit_src = CLIP(tmp, 0, 128);
423 tmp = pSelect->hbf_wgt_clip;
424 pFix->cnr_hbf5_min_wgt = CLIP(tmp, 0, (1 << 8) - 1);
425
426 // ISP_CNR_2800_LBF3
427 // step3
428 // bilateral filter
429 tmp = (int)(log2e / pSelect->sigmaR3 / fStrength);
430 pFix->cnr_lbf3_sigma = CLIP(tmp, 0, (1 << 13) - 1);
431 tmp = (int)(pSelect->bfRatio3 * (1 << RK_CNR_V1_bfRatio));
432 pFix->cnr_lbf5_weit_src = CLIP(tmp, 0, 128);
433
434 cnr_fix_printf_V1(pFix);
435
436 LOGI_ANR("%s:(%d) exit \n", __FUNCTION__, __LINE__);
437
438 return ACNR_RET_SUCCESS;
439 }
440
441
cnr_fix_printf_V1(RK_CNR_Fix_V1_t * pFix)442 Acnr_result_t cnr_fix_printf_V1(RK_CNR_Fix_V1_t * pFix)
443 {
444 int i = 0;
445 LOGI_ANR("%s:(%d) enter \n", __FUNCTION__, __LINE__);
446
447 Acnr_result_t res = ACNR_RET_SUCCESS;
448
449 if(pFix == NULL) {
450 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
451 return ACNR_RET_NULL_POINTER;
452 }
453
454 //ISP_CNR_2800_CTRL (0x0000)
455 LOGD_ANR("(0x0000) thumb_mix_cur_en:0x%x lq_bila_bypass:0x%x hq_bila_bypass:0x%x exgain_bypass:0x%x cnr_en_i:0x%x\n",
456 pFix->cnr_thumb_mix_cur_en,
457 pFix->cnr_lq_bila_bypass,
458 pFix->cnr_hq_bila_bypass,
459 pFix->cnr_exgain_bypass,
460 pFix->cnr_en_i);
461
462 // ISP_CNR_2800_EXGAIN (0x0004)
463 LOGD_ANR("(0x0004) cnr_exgain_mux:0x%x \n",
464 pFix->cnr_exgain_mux);
465
466 // ISP_CNR_2800_GAIN_PARA (0x0008)
467 LOGD_ANR("(0x0008) gain_iso:0x%x gain_offset:0x%x gain_1sigma:0x%x \n",
468 pFix->cnr_gain_iso,
469 pFix->cnr_gain_offset,
470 pFix->cnr_gain_1sigma);
471
472 // ISP_CNR_2800_GAIN_UV_PARA (0x000c)
473 LOGD_ANR("(0x000c) gain_uvgain1:0x%x gain_uvgain0:0x%x \n",
474 pFix->cnr_gain_uvgain1,
475 pFix->cnr_gain_uvgain0);
476
477 // ISP_CNR_2800_LMED3 (0x0010)
478 LOGD_ANR("(0x0010) lmed3_alpha:0x%x \n",
479 pFix->cnr_lmed3_alpha);
480
481 // ISP_CNR_2800_LBF5_GAIN (0x0014)
482 LOGD_ANR("(0x0014) lbf5_gain_y:0x%x lbf5_gain_c:0x%x \n",
483 pFix->cnr_lbf5_gain_y,
484 pFix->cnr_lbf5_gain_c);
485
486 // ISP_CNR_2800_LBF5_WEITD0_4 (0x0018 - 0x001c)
487 for(int i = 0; i < 5; i++) {
488 LOGD_ANR("(0x0018 - 0x001c) lbf5_weit_d[%d]:0x%x \n",
489 i, pFix->cnr_lbf5_weit_d[i]);
490 }
491
492 // ISP_CNR_2800_HMED3 (0x0020)
493 LOGD_ANR("(0x0020) hmed3_alpha:0x%x \n",
494 pFix->cnr_hmed3_alpha);
495
496 // ISP_CNR_2800_HBF5 (0x0024)
497 LOGD_ANR("(0x0024) hbf5_weit_src:0x%x hbf5_min_wgt:0x%x hbf5_sigma:0x%x \n",
498 pFix->cnr_hbf5_weit_src,
499 pFix->cnr_hbf5_min_wgt,
500 pFix->cnr_hbf5_sigma);
501
502 // ISP_CNR_2800_LBF3 (0x0028)
503 LOGD_ANR("(0x0028) lbf5_weit_src:0x%x lbf3_sigma:0x%x \n",
504 pFix->cnr_lbf5_weit_src,
505 pFix->cnr_lbf3_sigma);
506
507 LOGD_ANR("%s:(%d) exit \n", __FUNCTION__, __LINE__);
508
509 return ACNR_RET_SUCCESS;
510 }
511
512
513
514
cnr_get_setting_by_name_json_V1(CalibDbV2_CNR_t * pCalibdbV2,char * name,int * tuning_idx)515 Acnr_result_t cnr_get_setting_by_name_json_V1(CalibDbV2_CNR_t *pCalibdbV2, char *name, int *tuning_idx)
516 {
517 int i = 0;
518 Acnr_result_t res = ACNR_RET_SUCCESS;
519
520 if(pCalibdbV2 == NULL || name == NULL || tuning_idx == NULL) {
521 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
522 return ACNR_RET_NULL_POINTER;
523 }
524
525 for(i = 0; i < pCalibdbV2->TuningPara.Setting_len; i++) {
526 if(strncmp(name, pCalibdbV2->TuningPara.Setting[i].SNR_Mode, strlen(name)*sizeof(char)) == 0) {
527 break;
528 }
529 }
530
531 if(i < pCalibdbV2->TuningPara.Setting_len) {
532 *tuning_idx = i;
533 } else {
534 *tuning_idx = 0;
535 }
536
537 LOGD_ANR("%s:%d snr_name:%s snr_idx:%d i:%d \n",
538 __FUNCTION__, __LINE__,
539 name, *tuning_idx, i);
540
541 return res;
542 }
543
544
545
cnr_init_params_json_V1(RK_CNR_Params_V1_t * pParams,CalibDbV2_CNR_t * pCalibdbV2,int tuning_idx)546 Acnr_result_t cnr_init_params_json_V1(RK_CNR_Params_V1_t *pParams, CalibDbV2_CNR_t *pCalibdbV2, int tuning_idx)
547 {
548 Acnr_result_t res = ACNR_RET_SUCCESS;
549 CalibDbV2_CNR_T_ISO_t *pTuningISO = NULL;
550
551 if(pParams == NULL || pCalibdbV2 == NULL) {
552 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
553 return ACNR_RET_NULL_POINTER;
554 }
555
556 pParams->enable = pCalibdbV2->TuningPara.enable;
557
558 for(int i = 0; i < pCalibdbV2->TuningPara.Setting[tuning_idx].Tuning_ISO_len && i < RK_CNR_V1_MAX_ISO_NUM; i++ ) {
559 pTuningISO = &pCalibdbV2->TuningPara.Setting[tuning_idx].Tuning_ISO[i];
560
561 pParams->iso[i] = pTuningISO->iso;
562 pParams->rkcnr_hq_bila_bypass[i] = pTuningISO->hf_bypass;
563 pParams->rkcnr_lq_bila_bypass[i] = pTuningISO->lf_bypass;
564 pParams->rkcnr_exgain[i] = pTuningISO->cnr_exgain;
565 pParams->rkcnr_g_gain[i] = pTuningISO->cnr_g_gain;
566 pParams->ratio[i] = pTuningISO->color_sat_adj;
567 pParams->offset[i] = pTuningISO->color_sat_adj_alpha;
568 pParams->medRatio1[i] = pTuningISO->hf_spikes_reducion_strength;
569 pParams->sigmaR1[i] = pTuningISO->hf_denoise_strength;
570 pParams->uvgain1[i] = pTuningISO->hf_color_sat;
571 pParams->bfRatio1[i] = pTuningISO->hf_denoise_alpha;
572 pParams->hbf_wgt_clip[i] = pTuningISO->hf_bf_wgt_clip;
573 pParams->medRatio2[i] = pTuningISO->thumb_spikes_reducion_strength;
574 pParams->sigmaR2[i] = pTuningISO->thumb_denoise_strength;
575 pParams->uvgain2[i] = pTuningISO->thumb_color_sat;
576 pParams->sigmaR3[i] = pTuningISO->lf_denoise_strength;
577 pParams->uvgain3[i] = pTuningISO->lf_color_sat;
578 pParams->bfRatio3[i] = pTuningISO->lf_denoise_alpha;
579 }
580
581
582 memcpy(pParams->kernel_5x5_table, pCalibdbV2->TuningPara.Kernel_Coeff.kernel_5x5, sizeof(float) * 5);
583
584 return ACNR_RET_SUCCESS;
585
586 }
587
cnr_config_setting_param_json_V1(RK_CNR_Params_V1_t * pParams,CalibDbV2_CNR_t * pCalibdbV2,char * param_mode,char * snr_name)588 Acnr_result_t cnr_config_setting_param_json_V1(RK_CNR_Params_V1_t *pParams, CalibDbV2_CNR_t *pCalibdbV2, char* param_mode, char * snr_name)
589 {
590 Acnr_result_t res = ACNR_RET_SUCCESS;
591 int tuning_idx;
592
593 if(pParams == NULL || pCalibdbV2 == NULL || param_mode == NULL || snr_name == NULL) {
594 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
595 return ACNR_RET_NULL_POINTER;
596 }
597
598 res = cnr_get_setting_by_name_json_V1(pCalibdbV2, snr_name, &tuning_idx);
599 if(res != ACNR_RET_SUCCESS) {
600 LOGW_ANR("%s(%d): error!!! can't find setting in iq files, use 0 instead\n", __FUNCTION__, __LINE__);
601 }
602
603 res = cnr_init_params_json_V1(pParams, pCalibdbV2, tuning_idx);
604 pParams->enable = pCalibdbV2->TuningPara.enable;
605 return res;
606
607 }
608
609
610 RKAIQ_END_DECLARE
611
612
613
614
615