xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/algos/acnr/rk_aiq_acnr_algo_cnr_v1.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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