xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/algos/acnrV30/rk_aiq_acnr_algo_cnr_v30.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 #include "rk_aiq_acnr_algo_cnr_v30.h"
2 
3 
4 RKAIQ_BEGIN_DECLARE
5 
6 #define Math_LOG2(x)    (log((double)x)   / log((double)2))
7 #define interp_cnr_v30(value_low, value_high, ratio) (ratio * ((value_high) - (value_low)) + value_low)
8 
9 
10 
cnr_select_params_by_ISO_V30(RK_CNR_Params_V30_t * pParams,RK_CNR_Params_V30_Select_t * pSelect,AcnrV30_ExpInfo_t * pExpInfo)11 AcnrV30_result_t cnr_select_params_by_ISO_V30(RK_CNR_Params_V30_t *pParams, RK_CNR_Params_V30_Select_t *pSelect, AcnrV30_ExpInfo_t *pExpInfo)
12 {
13     AcnrV30_result_t res = ACNRV30_RET_SUCCESS;
14     int iso = 50;
15     if(pParams == NULL) {
16         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
17         return ACNRV30_RET_NULL_POINTER;
18     }
19 
20     if(pSelect == NULL) {
21         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
22         return ACNRV30_RET_NULL_POINTER;
23     }
24 
25     if(pExpInfo == NULL) {
26         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
27         return ACNRV30_RET_NULL_POINTER;
28     }
29 
30     iso = pExpInfo->arIso[pExpInfo->hdr_mode];
31 
32     //ȷ��iso�ȼ�
33     //rkuvnriso@50 100 200 400 800 1600 3200  6400 12800
34     //      isogain: 1  2   4   8   16  32   64    128  256
35     //     isoindex: 0  1   2   3   4   5    6     7    8
36 
37     int isoIndex = 0;
38     int isoGainLow = 0;
39     int isoGainHigh = 0;
40     int isoIndexLow = 0;
41     int isoIndexHigh = 0;
42     int iso_div = 50;
43     int max_iso_step = RK_CNR_V30_MAX_ISO_NUM;
44 
45 #ifndef RK_SIMULATOR_HW
46     for (int i = 0; i < max_iso_step - 1 ; i++) {
47         if (iso >= pParams->iso[i]  &&  iso <= pParams->iso[i + 1]) {
48             isoGainLow = pParams->iso[i] ;
49             isoGainHigh = pParams->iso[i + 1];
50             isoIndexLow = i;
51             isoIndexHigh = i + 1;
52             isoIndex = isoIndexLow;
53         }
54     }
55 
56     if(iso < pParams->iso[0] ) {
57         isoGainLow = pParams->iso[0];
58         isoGainHigh = pParams->iso[1];
59         isoIndexLow = 0;
60         isoIndexHigh = 1;
61         isoIndex = 0;
62     }
63 
64     if(iso > pParams->iso[max_iso_step - 1] ) {
65         isoGainLow = pParams->iso[max_iso_step - 2] ;
66         isoGainHigh = pParams->iso[max_iso_step - 1];
67         isoIndexLow = max_iso_step - 2;
68         isoIndexHigh = max_iso_step - 1;
69         isoIndex = max_iso_step - 1;
70     }
71 #else
72     isoIndex = int(log(float(iso / iso_div)) / log(2.0f));
73 
74     for (int i = max_iso_step - 1; i >= 0; i--) {
75         if (iso < iso_div * (2 << i)) {
76             isoGainLow = iso_div * (2 << (i)) / 2;
77             isoGainHigh = iso_div * (2 << i);
78         }
79     }
80 
81     isoGainLow = MIN(isoGainLow, iso_div * (2 << max_iso_step));
82     isoGainHigh = MIN(isoGainHigh, iso_div * (2 << max_iso_step));
83 
84     isoIndexHigh = (int)(log((float)isoGainHigh / iso_div) / log((float)2));
85     isoIndexLow = (int)(log((float)isoGainLow / iso_div) / log((float)2));
86 
87     isoIndexLow = MIN(MAX(isoIndexLow, 0), max_iso_step - 1);
88     isoIndexHigh = MIN(MAX(isoIndexHigh, 0), max_iso_step - 1);
89 #endif
90 
91     pSelect->enable = pParams->enable;
92 
93     LOGD_ANR("%s:%d iso:%d high:%d low:%d \n",
94              __FUNCTION__, __LINE__,
95              iso, isoGainHigh, isoGainLow);
96 
97     pExpInfo->isoLevelLow = isoIndexLow;
98     pExpInfo->isoLevelHig = isoIndexHigh;
99     RK_CNR_Params_V30_Select_t *pLowISO = &pParams->CnrParamsISO[isoIndexLow];
100     RK_CNR_Params_V30_Select_t *pHighISO = &pParams->CnrParamsISO[isoIndexHigh];
101 
102     if ((isoGainHigh - iso) < (iso - isoGainLow))   {
103         pSelect->down_scale_x = pHighISO->down_scale_x;
104         pSelect->down_scale_y = pHighISO->down_scale_y;
105         pSelect->bf_wgt0_sel = pHighISO->bf_wgt0_sel;
106 
107         for(int i = 0; i < 4; i++) {
108             pSelect->thumb_filter_wgt_coeff[i] = pHighISO->thumb_filter_wgt_coeff[i];
109         }
110 
111         for(int i = 0; i < 6; i++) {
112             pSelect->gaus_coeff[i] = pHighISO->gaus_coeff[i];
113         }
114     }
115     else {
116         pSelect->down_scale_x = pLowISO->down_scale_x;
117         pSelect->down_scale_y = pLowISO->down_scale_y;
118         pSelect->bf_wgt0_sel  = pLowISO->bf_wgt0_sel;
119 
120         for(int i = 0; i < 4; i++) {
121             pSelect->thumb_filter_wgt_coeff[i] = pLowISO->thumb_filter_wgt_coeff[i];
122         }
123 
124         for(int i = 0; i < 6; i++) {
125             pSelect->gaus_coeff[i] = pLowISO->gaus_coeff[i];
126         }
127     }
128 
129     float ratio = float(iso - isoGainLow) / float(isoGainHigh - isoGainLow);
130 
131     pSelect->thumb_sigma = interp_cnr_v30( pLowISO->thumb_sigma, pHighISO->thumb_sigma, ratio);
132     pSelect->thumb_bf_ratio = interp_cnr_v30(pLowISO->thumb_bf_ratio, pHighISO->thumb_bf_ratio, ratio);
133 
134     pSelect->chroma_filter_strength = interp_cnr_v30(pLowISO->chroma_filter_strength, pHighISO->chroma_filter_strength, ratio);
135     pSelect->chroma_filter_wgt_clip = interp_cnr_v30(pLowISO->chroma_filter_wgt_clip, pHighISO->chroma_filter_wgt_clip, ratio);
136     pSelect->anti_chroma_ghost = interp_cnr_v30(pLowISO->anti_chroma_ghost, pHighISO->anti_chroma_ghost, ratio);
137     pSelect->chroma_filter_uv_gain = interp_cnr_v30(pLowISO->chroma_filter_uv_gain, pHighISO->chroma_filter_uv_gain, ratio);
138     pSelect->wgt_slope = interp_cnr_v30(pLowISO->wgt_slope, pHighISO->wgt_slope, ratio);
139 
140     pSelect->gaus_ratio = interp_cnr_v30(pLowISO->gaus_ratio, pHighISO->gaus_ratio, ratio);
141 
142     pSelect->bf_sigmaR = interp_cnr_v30(pLowISO->bf_sigmaR, pHighISO->bf_sigmaR, ratio);
143     pSelect->bf_uvgain = interp_cnr_v30(pLowISO->bf_uvgain, pHighISO->bf_uvgain, ratio);
144     pSelect->bf_ratio = interp_cnr_v30(pLowISO->bf_ratio, pHighISO->bf_ratio, ratio);
145     pSelect->hbf_wgt_clip = interp_cnr_v30(pLowISO->hbf_wgt_clip, pHighISO->hbf_wgt_clip, ratio);
146     pSelect->global_alpha = interp_cnr_v30(pLowISO->global_alpha, pHighISO->global_alpha, ratio);
147 
148     pSelect->saturation_adj_offset = interp_cnr_v30(pLowISO->saturation_adj_offset, pHighISO->saturation_adj_offset, ratio);
149     pSelect->saturation_adj_ratio = interp_cnr_v30(pLowISO->saturation_adj_ratio, pHighISO->saturation_adj_ratio, ratio);
150 
151     pSelect->global_gain = interp_cnr_v30(pLowISO->global_gain, pHighISO->global_gain, ratio);
152     pSelect->global_gain_alpha = interp_cnr_v30(pLowISO->global_gain_alpha, pHighISO->global_gain_alpha, ratio);
153     pSelect->local_gain_scale = interp_cnr_v30(pLowISO->local_gain_scale, pHighISO->local_gain_scale, ratio);
154     pSelect->global_gain_thumb = interp_cnr_v30(pLowISO->global_gain_thumb, pHighISO->global_gain_thumb, ratio);
155     pSelect->global_gain_alpha_thumb = interp_cnr_v30(pLowISO->global_gain_alpha_thumb, pHighISO->global_gain_alpha_thumb, ratio);
156 
157     for (int i = 0; i < 13; i++)
158     {
159         pSelect->gain_adj_strength_ratio[i] = interp_cnr_v30(pLowISO->gain_adj_strength_ratio[i], pHighISO->gain_adj_strength_ratio[i], ratio);
160     }
161 
162     return ACNRV30_RET_SUCCESS;
163 
164 }
165 
166 
cnr_fix_transfer_V30(RK_CNR_Params_V30_Select_t * pSelect,RK_CNR_Fix_V30_t * pFix,AcnrV30_ExpInfo_t * pExpInfo,rk_aiq_cnr_strength_v30_t * pStrength)167 AcnrV30_result_t cnr_fix_transfer_V30(RK_CNR_Params_V30_Select_t *pSelect, RK_CNR_Fix_V30_t *pFix, AcnrV30_ExpInfo_t *pExpInfo, rk_aiq_cnr_strength_v30_t* pStrength)
168 {
169     LOGI_ANR("%s:(%d) enter \n", __FUNCTION__, __LINE__);
170 
171     int i = 0;
172     AcnrV30_result_t res = ACNRV30_RET_SUCCESS;
173     int tmp = 0;
174 
175     if(pSelect == NULL) {
176         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
177         return ACNRV30_RET_NULL_POINTER;
178     }
179 
180     if(pFix == NULL) {
181         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
182         return ACNRV30_RET_NULL_POINTER;
183     }
184 
185     if(pExpInfo == NULL) {
186         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
187         return ACNRV30_RET_NULL_POINTER;
188     }
189 
190     if(pStrength == NULL) {
191         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
192         return ACNRV30_RET_NULL_POINTER;
193     }
194 
195     float fStrength = 1.0;
196 
197     if(pStrength->strength_enable) {
198         fStrength = pStrength->percent;
199     }
200     if(fStrength <= 0.0) {
201         fStrength = 0.000001;
202     }
203 
204     LOGD_ANR("strength_enable:%d fStrength: %f \n", pStrength->strength_enable, fStrength);
205 
206     // CNR_CTRL
207     pFix->bf3x3_wgt0_sel = pSelect->bf_wgt0_sel;
208 #if RKAIQ_HAVE_CNR_V30
209     if(pSelect->down_scale_x == 2 && pSelect->down_scale_y == 2) {
210         pFix->thumb_mode = 0;
211     } else if(pSelect->down_scale_x == 4 && pSelect->down_scale_y == 4) {
212         pFix->thumb_mode = 1;
213     } else if(pSelect->down_scale_x == 8 && pSelect->down_scale_y == 6) {
214         pFix->thumb_mode = 2;
215     } else {
216         pFix->thumb_mode = 2;
217     }
218 #else
219     if (pSelect->down_scale_x == 4 && pSelect->down_scale_y == 4) {
220         pFix->thumb_mode = 1;
221     } else if (pSelect->down_scale_x == 8 && pSelect->down_scale_y == 4) {
222         pFix->thumb_mode = 3;
223     } else {
224         pFix->thumb_mode = 1;
225     }
226 #endif
227     pFix->yuv422_mode = 0;
228     pFix->exgain_bypass = 0;
229     pFix->cnr_en = pSelect->enable;
230 
231 
232     // CNR_EXGAIN
233     tmp = pSelect->local_gain_scale * (1 << RKCNR_V30_GAIN_ISO_FIX_BITS);
234     pFix->gain_iso = CLIP(tmp, 0, 0xff);
235     tmp = pSelect->global_gain_alpha * (1 << RKCNR_V30_G_GAIN_ALPHA_FIX_BITS);
236     pFix->global_gain_alpha = CLIP(tmp, 0, 0x8);
237     tmp = pSelect->global_gain * (1 << RKCNR_V30_G_GAIN_FIX_BITS);
238     pFix->global_gain = CLIP(tmp, 0, 0x3ff);
239 
240 
241     /* CNR_THUMB1 */
242     int yuvBit = 10;
243     int scale  = (1 << yuvBit) - 1;
244     int log2e = (int)(0.8493f * (1 << (RKCNR_V30_log2e + RKCNR_V30_SIGMA_FIX_BIT)));
245     int rkcnr_chroma_filter_uv_gain =
246         ROUND_F((1 << RKCNR_V30_uvgain) * pSelect->chroma_filter_uv_gain);
247     int thumbBFilterSigma = ROUND_F(pSelect->thumb_sigma * scale * fStrength);
248     LOGD_ANR("scale:%d thumbBFilterSigma:%d\n", log2e, thumbBFilterSigma);
249     thumbBFilterSigma = (int)(0.8493f * (1 << RKCNR_V30_FIX_BIT_INV_SIGMA) / thumbBFilterSigma);
250     tmp = thumbBFilterSigma * ((1 << RKCNR_V30_uvgain) - rkcnr_chroma_filter_uv_gain * 2);
251     LOGD_ANR("thumbBFilterSigma:%d sigmaY:%d\n", thumbBFilterSigma, tmp);
252     tmp                 = ROUND_INT(tmp, 6);
253     pFix->thumb_sigma_y = CLIP(tmp, 0, 0x3fff);
254     tmp                 = thumbBFilterSigma * rkcnr_chroma_filter_uv_gain;
255     tmp = ROUND_INT(tmp, 6); // (diff * sigma) >> tmp = (diff * (sigma >> 6))
256     pFix->thumb_sigma_c = CLIP(tmp, 0, 0x3fff);
257 
258 
259     /* CNR_THUMB_BF_RATIO */
260     uint16_t thumb_bf_ratio;
261     tmp = ROUND_F((1 << RKCNR_V30_FIX_BIT_BF_RATIO) * pSelect->thumb_bf_ratio * fStrength);
262     pFix->thumb_bf_ratio = CLIP(tmp, 0, 0x7ff);
263 
264     /* CNR_LBF_WEITD */
265     for(int i = 0; i < RKCNR_V30_THUMB_BF_RADIUS + 1; i++) {
266         tmp = ROUND_F(pSelect->thumb_filter_wgt_coeff[i] * (1 << RKCNR_V30_exp2_lut_y));
267         pFix->lbf1x7_weit_d[i] = CLIP(tmp, 0, 0xff);
268     }
269 
270     /* CNR_IIR_PARA1 */
271     tmp = ROUND_F((1 << RKCNR_V30_FIX_BIT_SLOPE) * pSelect->wgt_slope);
272     pFix->wgt_slope = CLIP(tmp, 0, 0x3ff);
273 
274     tmp = ROUND_F(1.2011 * (1 << RKCNR_V30_FIX_BIT_INV_SIGMA) / (pSelect->chroma_filter_strength * scale * fStrength));
275     int tmptmp = tmp * pFix->wgt_slope;
276     int shiftBit = Math_LOG2(tmptmp) - RKCNR_V30_FIX_BIT_INT_TO_FLOAT;
277     LOGD_ANR("tmp:%d tmptmp:%d shiftBit:%d\n", tmp, tmptmp, shiftBit);
278     shiftBit = MAX(shiftBit, 0);
279 
280     tmp = RKCNR_V30_FIX_BIT_INV_SIGMA - shiftBit;
281     if (tmp < 0) {
282         tmp = ABS(tmp) + (1 << 5);
283     }
284     pFix->exp_shift = CLIP(tmp, 0, 0x3f);
285 
286     tmp = ROUND_F((float)tmptmp / (1 << shiftBit));
287     pFix->iir_strength = CLIP(tmp, 0, 0xff);
288 
289     tmp = ROUND_F((1 << RKCNR_V30_uvgain) * pSelect->chroma_filter_uv_gain);
290     pFix->iir_uvgain = CLIP(tmp, 0, 0xf);
291 
292     /* CNR_IIR_PARA2 */
293     tmp = ROUND_F((1 << RKCNR_V30_FIX_BIT_IIR_WGT) * pSelect->anti_chroma_ghost);
294     pFix->chroma_ghost = CLIP(tmp, 0, 0x3f);
295     tmp = ROUND_F((1 << 3) * pSelect->chroma_filter_wgt_clip);
296     pFix->iir_uv_clip = CLIP(tmp, 0, 0x7f);
297 
298     /* CNR_GAUS_COE */
299     for(int i = 0; i < 6; i++) {
300         tmp = pSelect->gaus_coeff[5 - i];
301         pFix->gaus_coe[i] = CLIP(tmp, 0, 0x7f);
302     }
303 
304     /* CNR_GAUS_RATIO */
305     tmp = ROUND_F((1 << RKCNR_V30_FIX_BIT_GAUS_RATIO) * pSelect->gaus_ratio);
306     pFix->gaus_ratio = CLIP(tmp, 0, 0x7ff);
307     tmp = ROUND_F((1 << RKCNR_V30_exp2_lut_y) * pSelect->hbf_wgt_clip);
308     pFix->bf_wgt_clip = CLIP(tmp, 0, 0xff);
309     tmp = ROUND_F((1 << RKCNR_V30_FIX_BIT_GLOBAL_ALPHA) * pSelect->global_alpha);
310     pFix->global_alpha = CLIP(tmp, 0, 0x7ff);
311 
312     /* CNR_BF_PARA1 */
313     tmp = ROUND_F((1 << RKCNR_V30_uvgain) * pSelect->bf_uvgain);
314     pFix->uv_gain = CLIP(tmp, 0, 0x7f);
315     tmp = (int)(log2e / (pSelect->bf_sigmaR * scale * fStrength));
316     pFix->sigma_r = CLIP(tmp, 0, 0x3ff);
317     tmp = ROUND_F((1 << RKCNR_V30_bfRatio) * pSelect->bf_ratio / fStrength);
318     pFix->bf_ratio = CLIP(tmp, 0, 0xff);
319 
320     /* CNR_BF_PARA2 */
321     tmp =  pSelect->saturation_adj_offset;
322     pFix->adj_offset = CLIP(tmp, 0, 0x1ff);
323     tmp = ROUND_F((1 << RKCNR_V30_FIX_BIT_SATURATION) * pSelect->saturation_adj_ratio);
324     pFix->adj_ratio = CLIP(tmp, 0, 0x7fff);
325 
326     /* CNR_SIGMA */
327     uint8_t  sigma_y[13];
328     for(int i = 0; i < 13; i++) {
329         tmp = ROUND_F(pSelect->gain_adj_strength_ratio[i] * (1 << RKCNR_V30_sgmRatio));
330         pFix->sigma_y[i] = CLIP(tmp, 0, 0xff);
331     }
332 
333     /* CNR_IIR_GLOBAL_GAIN */
334     //tmp = pSelect->global_gain_alpha_thumb * (1 << RKCNR_V30_G_GAIN_ALPHA_FIX_BITS);
335     pFix->iir_gain_alpha = 8;    //ic suggest must be 8                                // CLIP(tmp, 0, 0xf);
336     tmp = pSelect->global_gain_thumb * (1 << RKCNR_V30_sgmRatio);//(1 << RKCNR_V30_G_GAIN_FIX_BITS);
337     pFix->iir_global_gain = CLIP(tmp, 0, 0xff);
338 
339     cnr_fix_printf_V30(pFix);
340 
341     LOGI_ANR("%s:(%d) exit \n", __FUNCTION__, __LINE__);
342 
343     return ACNRV30_RET_SUCCESS;
344 }
345 
346 
cnr_fix_printf_V30(RK_CNR_Fix_V30_t * pFix)347 AcnrV30_result_t cnr_fix_printf_V30(RK_CNR_Fix_V30_t  * pFix)
348 {
349     int i = 0;
350     LOGI_ANR("%s:(%d) enter \n", __FUNCTION__, __LINE__);
351 
352     AcnrV30_result_t res = ACNRV30_RET_SUCCESS;
353 
354     if(pFix == NULL) {
355         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
356         return ACNRV30_RET_NULL_POINTER;
357     }
358 
359 
360     //CNR_CTRL (0x0000)
361     LOGD_ANR("(0x0000) bf3x3_wgt0_sel:0x%x thumb_mode:0x%x yuv422_mode:0x%x exgain_bypass:0x%x cnr_en:0x%x\n",
362              pFix->bf3x3_wgt0_sel,
363              pFix->thumb_mode,
364              pFix->yuv422_mode,
365              pFix->exgain_bypass,
366              pFix->cnr_en);
367 
368     // CNR_EXGAIN  (0x0004)
369     LOGD_ANR("(0x0004) global_gain:0x%x  global_gain_alpha:0x%x  gain_iso:0x%x \n",
370              pFix->global_gain,
371              pFix->global_gain_alpha,
372              pFix->gain_iso);
373 
374     // CNR_THUMB1  (0x0008)
375     LOGD_ANR("(0x0008) thumb_sigma_c:0x%x thumb_sigma_y:0x%x \n",
376              pFix->thumb_sigma_c,
377              pFix->thumb_sigma_y);
378 
379     // CNR_THUMB_BF_RATIO (0x000c)
380     LOGD_ANR("(0x000c) thumb_bf_ratio:0x%x \n",
381              pFix->thumb_bf_ratio);
382 
383     // CNR_LBF_WEITD (0x0010)
384     LOGD_ANR("(0x0010) lbf1x7_weit_d:0x%x  0x%x  0x%x  0x%x \n",
385              pFix->lbf1x7_weit_d[0],
386              pFix->lbf1x7_weit_d[1],
387              pFix->lbf1x7_weit_d[2],
388              pFix->lbf1x7_weit_d[3]);
389 
390     // CNR_IIR_PARA1 (0x0014)
391     LOGD_ANR("(0x0014) iir_uvgain:0x%x  iir_strength:0x%x  exp_shift:0x%x  wgt_slope:0x%x \n",
392              pFix->iir_uvgain,
393              pFix->iir_strength,
394              pFix->exp_shift,
395              pFix->wgt_slope);
396 
397 
398     // CNR_IIR_PARA2 (0x0018)
399     LOGD_ANR("(0x0018) chroma_ghost:0x%x iir_uv_clip:0x%x \n",
400              pFix->chroma_ghost,
401              pFix->iir_uv_clip);
402 
403     // CNR_GAUS_COE (0x001c - 0x0020)
404     for(int i = 0; i < 6; i++) {
405         LOGD_ANR("(0x001c - 0x0020) gaus_coe[%d]:0x%x \n",
406                  i, pFix->gaus_coe[i]);
407     }
408 
409     // CNR_GAUS_RATIO  (0x0024)
410     LOGD_ANR("(0x0024) gaus_ratio:0x%x  bf_wgt_clip:0x%x  global_alpha:0x%x \n",
411              pFix->gaus_ratio,
412              pFix->bf_wgt_clip,
413              pFix->global_alpha);
414 
415     // CNR_BF_PARA1  (0x0028)
416     LOGD_ANR("(0x0028) uv_gain:0x%x  sigma_r:0x%x  bf_ratio:0x%x \n",
417              pFix->uv_gain,
418              pFix->sigma_r,
419              pFix->bf_ratio);
420 
421     // CNR_BF_PARA2 (0x002c)
422     LOGD_ANR("(0x002c) adj_offset:0x%x adj_ratio:0x%x \n",
423              pFix->adj_offset,
424              pFix->adj_ratio);
425 
426     // CNR_SIGMA (0x0030 - 0x003c)
427     for(int i = 0; i < 13; i++) {
428         LOGD_ANR("(0x0030 - 0x003c) sigma_y[%d]:0x%x \n", i, pFix->sigma_y[i]);
429     }
430 
431     // CNR_IIR_GLOBAL_GAIN (0x0040)
432     LOGD_ANR("(0x0040) iir_gain_alpha:0x%x iir_global_gain:0x%x \n",
433              pFix->iir_gain_alpha,
434              pFix->iir_global_gain);
435 
436 
437     return res;
438 }
439 
cnr_get_setting_by_name_json_V30(CalibDbV2_CNRV30_t * pCalibdbV2,char * name,int * tuning_idx)440 AcnrV30_result_t cnr_get_setting_by_name_json_V30(CalibDbV2_CNRV30_t* pCalibdbV2, char* name,
441         int* tuning_idx) {
442     int i                = 0;
443     AcnrV30_result_t res = ACNRV30_RET_SUCCESS;
444 
445     if (pCalibdbV2 == NULL || name == NULL || tuning_idx == NULL) {
446         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
447         return ACNRV30_RET_NULL_POINTER;
448     }
449 
450     for (i = 0; i < pCalibdbV2->TuningPara.Setting_len; i++) {
451         if (strncmp(name, pCalibdbV2->TuningPara.Setting[i].SNR_Mode,
452                     strlen(name) * sizeof(char)) == 0) {
453             break;
454         }
455     }
456 
457     if (i < pCalibdbV2->TuningPara.Setting_len) {
458         *tuning_idx = i;
459     } else {
460         *tuning_idx = 0;
461     }
462 
463     LOGD_ANR("%s:%d snr_name:%s  snr_idx:%d i:%d \n", __FUNCTION__, __LINE__, name, *tuning_idx, i);
464 
465     return res;
466 }
467 
cnr_init_params_json_V30(RK_CNR_Params_V30_t * pParams,CalibDbV2_CNRV30_t * pCalibdbV2,int tuning_idx)468 AcnrV30_result_t cnr_init_params_json_V30(RK_CNR_Params_V30_t *pParams, CalibDbV2_CNRV30_t *pCalibdbV2, int tuning_idx)
469 {
470     AcnrV30_result_t res = ACNRV30_RET_SUCCESS;
471     CalibDbV2_CNRV30_T_ISO_t *pTuningISO = NULL;
472 
473     if(pParams == NULL || pCalibdbV2 == NULL) {
474         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
475         return ACNRV30_RET_NULL_POINTER;
476     }
477 
478     pParams->enable = pCalibdbV2->TuningPara.enable;
479 
480     for(int i = 0; i < pCalibdbV2->TuningPara.Setting[tuning_idx].Tuning_ISO_len && i < RK_CNR_V30_MAX_ISO_NUM; i++ ) {
481         pTuningISO = &pCalibdbV2->TuningPara.Setting[tuning_idx].Tuning_ISO[i];
482 
483         pParams->iso[i] = pTuningISO->iso;
484         pParams->CnrParamsISO[i].enable = pCalibdbV2->TuningPara.enable;
485         pParams->CnrParamsISO[i].down_scale_x = pTuningISO->down_scale_x;
486         pParams->CnrParamsISO[i].down_scale_y = pTuningISO->down_scale_y;
487 
488         pParams->CnrParamsISO[i].thumb_sigma = pTuningISO->thumb_sigma;
489         pParams->CnrParamsISO[i].thumb_bf_ratio = pTuningISO->thumb_bf_ratio;
490 
491         pParams->CnrParamsISO[i].chroma_filter_strength = pTuningISO->chroma_filter_strength;
492         pParams->CnrParamsISO[i].chroma_filter_wgt_clip = pTuningISO->chroma_filter_wgt_clip;
493         pParams->CnrParamsISO[i].anti_chroma_ghost = pTuningISO->anti_chroma_ghost;
494         pParams->CnrParamsISO[i].chroma_filter_uv_gain = pTuningISO->chroma_filter_uv_gain;
495         pParams->CnrParamsISO[i].wgt_slope = pTuningISO->wgt_slope;
496 
497         pParams->CnrParamsISO[i].gaus_ratio = pTuningISO->gaus_ratio;
498 
499         pParams->CnrParamsISO[i].bf_sigmaR = pTuningISO->bf_sigmaR;
500         pParams->CnrParamsISO[i].bf_uvgain = pTuningISO->bf_uvgain;
501         pParams->CnrParamsISO[i].bf_ratio = pTuningISO->bf_ratio;
502         pParams->CnrParamsISO[i].hbf_wgt_clip = pTuningISO->hbf_wgt_clip;
503         pParams->CnrParamsISO[i].bf_wgt0_sel = pTuningISO->bf_wgt0_sel;
504         pParams->CnrParamsISO[i].global_alpha = pTuningISO->global_alpha;
505 
506         pParams->CnrParamsISO[i].saturation_adj_offset = pTuningISO->saturation_adj_offset;
507         pParams->CnrParamsISO[i].saturation_adj_ratio = pTuningISO->saturation_adj_ratio;
508 
509         pParams->CnrParamsISO[i].global_gain = pTuningISO->global_gain;
510         pParams->CnrParamsISO[i].global_gain_alpha = pTuningISO->global_gain_alpha;
511         pParams->CnrParamsISO[i].local_gain_scale = pTuningISO->local_gain_scale;
512         pParams->CnrParamsISO[i].global_gain_thumb = pTuningISO->global_gain_thumb;
513         pParams->CnrParamsISO[i].global_gain_alpha_thumb = pTuningISO->global_gain_alpha_thumb;
514 
515         for(int j = 0; j < RKCNR_V30_SGM_ADJ_TABLE_LEN; j++) {
516             pParams->CnrParamsISO[i].gain_adj_strength_ratio[j] = pTuningISO->gain_adj_strength_ratio[j];
517         }
518 
519         for(int j = 0; j < 4; j++) {
520             pParams->CnrParamsISO[i].thumb_filter_wgt_coeff[j] = pTuningISO->thumb_filter_wgt_coeff[j];
521         }
522 
523         for(int j = 0; j < 6; j++) {
524             pParams->CnrParamsISO[i].gaus_coeff[j] = pTuningISO->gaus_coeff[j];
525         }
526     }
527 
528     return ACNRV30_RET_SUCCESS;
529 
530 }
531 
cnr_config_setting_param_json_V30(RK_CNR_Params_V30_t * pParams,CalibDbV2_CNRV30_t * pCalibdbV2,char * param_mode,char * snr_name)532 AcnrV30_result_t cnr_config_setting_param_json_V30(RK_CNR_Params_V30_t *pParams, CalibDbV2_CNRV30_t *pCalibdbV2, char* param_mode, char * snr_name)
533 {
534     AcnrV30_result_t res = ACNRV30_RET_SUCCESS;
535     int tuning_idx;
536 
537     if(pParams == NULL || pCalibdbV2 == NULL || param_mode == NULL || snr_name == NULL) {
538         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
539         return ACNRV30_RET_NULL_POINTER;
540     }
541 
542     res = cnr_get_setting_by_name_json_V30(pCalibdbV2, snr_name, &tuning_idx);
543     if(res != ACNRV30_RET_SUCCESS) {
544         LOGW_ANR("%s(%d): error!!!  can't find setting in iq files, use 0 instead\n", __FUNCTION__, __LINE__);
545     }
546 
547     res = cnr_init_params_json_V30(pParams, pCalibdbV2, tuning_idx);
548     pParams->enable = pCalibdbV2->TuningPara.enable;
549     return res;
550 
551 }
552 
553 
554 RKAIQ_END_DECLARE
555 
556 
557 
558 
559