xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/algos/agic/rk_aiq_algo_agic_v1.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  * Copyright (c) 2019-2022 Rockchip Eletronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #include "algos/agic/rk_aiq_types_algo_agic_prvt.h"
17 
18 #define INTERPOLATION(ratio, hi, lo)    (((ratio) * ((hi) - (lo)) + (lo) * (1 << 4) + (1 << 3)) >> 4)
19 #define INTERPOLATION_F(ratioF, hi, lo) ((ratioF) * ((hi) - (lo)) + (lo))
20 
GicV1CalibToAttr(CalibDbV2_Gic_V20_t * calib,rkaiq_gic_v1_api_attr_t * attr)21 void GicV1CalibToAttr(CalibDbV2_Gic_V20_t* calib, rkaiq_gic_v1_api_attr_t* attr) {
22     CalibDbV2_Gic_V20_t* db = calib;
23     Gic_setting_v20_t* settings = &db->GicTuningPara.GicData;
24     XCAM_ASSERT(RKAIQ_GIC_MAX_ISO_CNT >= settings->ISO_len);
25     attr->gic_en       = db->GicTuningPara.enable;
26     attr->edge_open    = db->GicTuningPara.edge_en;
27     attr->noise_cut_en = db->GicTuningPara.noise_cut_en;
28     attr->iso_cnt      = settings->ISO_len;
29 
30     for (int i = 0; i < settings->ISO_len; i++) {
31         attr->auto_params[i].bypass             = 0;
32         attr->auto_params[i].iso                = settings->ISO[i];
33         attr->auto_params[i].gr_ratio           = db->GicTuningPara.gr_ration;
34         attr->auto_params[i].min_busy_thre      = settings->min_busy_thre[i];
35         attr->auto_params[i].min_grad_thr1      = settings->min_grad_thr1[i];
36         attr->auto_params[i].min_grad_thr2      = settings->min_grad_thr2[i];
37         attr->auto_params[i].k_grad1            = settings->k_grad1[i];
38         attr->auto_params[i].k_grad2            = settings->k_grad2[i];
39         attr->auto_params[i].gb_thre            = settings->gb_thre[i];
40         attr->auto_params[i].maxCorV            = settings->maxCorV[i];
41         attr->auto_params[i].maxCorVboth        = settings->maxCorVboth[i];
42         attr->auto_params[i].dark_thre          = settings->dark_thre[i];
43         attr->auto_params[i].dark_threHi        = settings->dark_threHi[i];
44         attr->auto_params[i].k_grad1_dark       = settings->k_grad1_dark[i];
45         attr->auto_params[i].k_grad2_dark       = settings->k_grad2_dark[i];
46         attr->auto_params[i].min_grad_thr_dark1 = settings->min_grad_thr_dark1[i];
47         attr->auto_params[i].min_grad_thr_dark2 = settings->min_grad_thr_dark2[i];
48         attr->auto_params[i].noiseCurve_0       = settings->noiseCurve_0[i];
49         attr->auto_params[i].noiseCurve_1       = settings->noiseCurve_1[i];
50         attr->auto_params[i].GValueLimitLo      = settings->GValueLimitLo[i];
51         attr->auto_params[i].GValueLimitHi      = settings->GValueLimitHi[i];
52         attr->auto_params[i].textureStrength    = settings->textureStrength[i];
53         attr->auto_params[i].ScaleLo            = settings->ScaleLo[i];
54         attr->auto_params[i].ScaleHi            = settings->ScaleHi[i];
55         attr->auto_params[i].globalStrength     = settings->globalStrength[i];
56         attr->auto_params[i].diff_clip          = settings->diff_clip[i];
57     }
58 }
59 
60 #if 0
61 void GicV1SelectParam(rkaiq_gic_v1_param_selected_t* selected, int ratio, int index,
62                       const rkaiq_gic_v1_param_selected_t* auto_params, int iso_cnt) {
63     float ratioF                            = ratio / 16.0f;
64     const rkaiq_gic_v1_param_selected_t* lo = &auto_params[index];
65     const rkaiq_gic_v1_param_selected_t* hi = &auto_params[index + 1];
66 
67     selected->iso           = lo->iso;
68     selected->bypass        = lo->bypass;
69     selected->gr_ratio      = lo->gr_ratio;
70     selected->min_busy_thre = INTERPOLATION(ratio, hi->min_busy_thre, lo->min_busy_thre);
71     selected->min_grad_thr1 = INTERPOLATION(ratio, hi->min_grad_thr1, lo->min_grad_thr1);
72     selected->min_grad_thr2 = INTERPOLATION(ratio, hi->min_grad_thr2, lo->min_grad_thr2);
73     selected->k_grad1       = INTERPOLATION(ratio, hi->k_grad1, lo->k_grad1);
74     selected->k_grad2       = INTERPOLATION(ratio, hi->k_grad2, lo->k_grad1);
75     selected->gb_thre       = INTERPOLATION(ratio, hi->gb_thre, lo->gb_thre);
76     selected->maxCorV       = INTERPOLATION(ratio, hi->maxCorV, lo->maxCorV);
77     selected->maxCorVboth   = INTERPOLATION(ratio, hi->maxCorVboth, lo->maxCorVboth);
78     selected->dark_thre     = INTERPOLATION(ratio, hi->dark_thre, lo->dark_thre);
79     selected->dark_threHi   = INTERPOLATION(ratio, hi->dark_threHi, lo->dark_threHi);
80     selected->k_grad1_dark  = INTERPOLATION(ratio, hi->k_grad1_dark, lo->k_grad1_dark);
81     selected->k_grad2_dark  = INTERPOLATION(ratio, hi->k_grad2_dark, lo->k_grad2_dark);
82     selected->min_grad_thr_dark1 =
83         INTERPOLATION(ratio, hi->min_grad_thr_dark1, lo->min_grad_thr_dark1);
84     selected->min_grad_thr_dark2 =
85         INTERPOLATION(ratio, hi->min_grad_thr_dark2, lo->min_grad_thr_dark2);
86     selected->GValueLimitLo   = INTERPOLATION_F(ratioF, hi->GValueLimitLo, lo->GValueLimitLo);
87     selected->GValueLimitHi   = INTERPOLATION_F(ratioF, hi->GValueLimitHi, lo->GValueLimitHi);
88     selected->textureStrength = INTERPOLATION_F(ratioF, hi->textureStrength, lo->textureStrength);
89     selected->ScaleLo         = INTERPOLATION_F(ratioF, hi->ScaleLo, lo->ScaleLo);
90     selected->ScaleHi         = INTERPOLATION_F(ratioF, hi->ScaleHi, lo->ScaleHi);
91     selected->globalStrength  = INTERPOLATION_F(ratioF, hi->globalStrength, lo->globalStrength);
92     selected->noiseCurve_0    = INTERPOLATION_F(ratioF, hi->noiseCurve_0, lo->noiseCurve_0);
93     selected->noiseCurve_1    = INTERPOLATION_F(ratioF, hi->noiseCurve_1, lo->noiseCurve_1);
94 }
95 #else
GicV1SelectParam(AgicConfigV20_t * selected,int ratio,int index,const rkaiq_gic_v1_param_selected_t * auto_params,int iso_cnt)96 void GicV1SelectParam(AgicConfigV20_t* selected, int ratio, int index,
97                       const rkaiq_gic_v1_param_selected_t* auto_params, int iso_cnt) {
98     float ratioF                            = ratio / 16.0f;
99     const rkaiq_gic_v1_param_selected_t* lo = &auto_params[index];
100     const rkaiq_gic_v1_param_selected_t* hi = &auto_params[index + 1];
101 
102     selected->gr_ratio       = lo->gr_ratio;
103     selected->regminbusythre = INTERPOLATION(ratio, hi->min_busy_thre, lo->min_busy_thre);
104     selected->regmingradthr1 = INTERPOLATION(ratio, hi->min_grad_thr1, lo->min_grad_thr1);
105     selected->regmingradthr2 = INTERPOLATION(ratio, hi->min_grad_thr2, lo->min_grad_thr2);
106     selected->regkgrad1      = INTERPOLATION(ratio, hi->k_grad1, lo->k_grad1);
107     selected->regkgrad2      = INTERPOLATION(ratio, hi->k_grad2, lo->k_grad1);
108     selected->reggbthre      = INTERPOLATION(ratio, hi->gb_thre, lo->gb_thre);
109     selected->regmaxcorv     = INTERPOLATION(ratio, hi->maxCorV, lo->maxCorV);
110     selected->regmaxcorvboth = INTERPOLATION(ratio, hi->maxCorVboth, lo->maxCorVboth);
111     selected->regdarkthre    = INTERPOLATION(ratio, hi->dark_thre, lo->dark_thre);
112     selected->regdarktthrehi = INTERPOLATION(ratio, hi->dark_threHi, lo->dark_threHi);
113     selected->regkgrad1dark  = INTERPOLATION(ratio, hi->k_grad1_dark, lo->k_grad1_dark);
114     selected->regkgrad2dark  = INTERPOLATION(ratio, hi->k_grad2_dark, lo->k_grad2_dark);
115     selected->regmingradthrdark1 =
116         INTERPOLATION(ratio, hi->min_grad_thr_dark1, lo->min_grad_thr_dark1);
117     selected->regmingradthrdark2 =
118         INTERPOLATION(ratio, hi->min_grad_thr_dark2, lo->min_grad_thr_dark2);
119     selected->gvaluelimitlo   = INTERPOLATION_F(ratioF, hi->GValueLimitLo, lo->GValueLimitLo);
120     selected->gvaluelimithi   = INTERPOLATION_F(ratioF, hi->GValueLimitHi, lo->GValueLimitHi);
121     selected->textureStrength = INTERPOLATION_F(ratioF, hi->textureStrength, lo->textureStrength);
122     selected->dnloscale       = INTERPOLATION_F(ratioF, hi->ScaleLo, lo->ScaleLo);
123     selected->dnhiscale       = INTERPOLATION_F(ratioF, hi->ScaleHi, lo->ScaleHi);
124     selected->globalStrength  = INTERPOLATION_F(ratioF, hi->globalStrength, lo->globalStrength);
125     selected->noiseCurve_0    = INTERPOLATION_F(ratioF, hi->noiseCurve_0, lo->noiseCurve_0);
126     selected->noiseCurve_1    = INTERPOLATION_F(ratioF, hi->noiseCurve_1, lo->noiseCurve_1);
127 }
128 #endif
129 
GicV1SetManualParam(AgicConfigV20_t * selected,const rkaiq_gic_v1_param_selected_t * manual_param)130 void GicV1SetManualParam(AgicConfigV20_t* selected,
131                          const rkaiq_gic_v1_param_selected_t* manual_param) {
132     selected->gr_ratio           = manual_param->gr_ratio;
133     selected->regminbusythre     = manual_param->min_busy_thre;
134     selected->regmingradthr1     = manual_param->min_grad_thr1;
135     selected->regmingradthr2     = manual_param->min_grad_thr2;
136     selected->regkgrad1          = manual_param->k_grad1;
137     selected->regkgrad2          = manual_param->k_grad2;
138     selected->reggbthre          = manual_param->gb_thre;
139     selected->regmaxcorv         = manual_param->maxCorV;
140     selected->regmaxcorvboth     = manual_param->maxCorVboth;
141     selected->regdarkthre        = manual_param->dark_thre;
142     selected->regdarktthrehi     = manual_param->dark_threHi;
143     selected->regkgrad1dark      = manual_param->k_grad1_dark;
144     selected->regkgrad2dark      = manual_param->k_grad2_dark;
145     selected->regmingradthrdark1 = manual_param->min_grad_thr_dark1;
146     selected->regmingradthrdark2 = manual_param->min_grad_thr_dark2;
147 
148     selected->gvaluelimitlo   = manual_param->GValueLimitLo;
149     selected->gvaluelimithi   = manual_param->GValueLimitHi;
150     selected->textureStrength = manual_param->textureStrength;
151     selected->dnloscale       = manual_param->ScaleLo;
152     selected->dnhiscale       = manual_param->ScaleHi;
153     selected->globalStrength  = manual_param->globalStrength;
154     selected->noiseCurve_0    = manual_param->noiseCurve_0;
155     selected->noiseCurve_1    = manual_param->noiseCurve_1;
156 }
157 
GicV1DumpReg(const rkaiq_gic_v1_hw_param_t * hw_param)158 void GicV1DumpReg(const rkaiq_gic_v1_hw_param_t* hw_param) {
159 #ifdef NDEBUG
160     (void)(hw_param);
161 #endif
162     LOG1_AGIC(
163         " GIC V1 reg values: "
164         " regmingradthrdark2 %d"
165         " regmingradthrdark1 %d"
166         " regminbusythre %d"
167         " regdarkthre %d"
168         " regmaxcorvboth %d"
169         " regdarktthrehi %d"
170         " regkgrad2dark %d"
171         " regkgrad1dark %d"
172         " regstrengthglobal_fix %d"
173         " regdarkthrestep %d"
174         " regkgrad2 %d"
175         " regkgrad1 %d"
176         " reggbthre %d"
177         " regmaxcorv %d"
178         " regmingradthr2 %d"
179         " regmingradthr1 %d"
180         " gr_ratio %d"
181         " dnloscale %d"
182         " dnhiscale %d"
183         " reglumapointsstep %d"
184         " gvaluelimitlo %d"
185         " gvaluelimithi %d"
186         " fusionratiohilimt1 %d"
187         " regstrength_fix %d"
188         " noise_cut_en %d"
189         " noise_coe_a %d"
190         " noise_coe_b %d"
191         " diff_clip %d",
192         hw_param->regmingradthrdark2, hw_param->regmingradthrdark1, hw_param->regminbusythre,
193         hw_param->regdarkthre, hw_param->regmaxcorvboth, hw_param->regdarktthrehi,
194         hw_param->regkgrad2dark, hw_param->regkgrad1dark, hw_param->regstrengthglobal_fix,
195         hw_param->regdarkthrestep, hw_param->regkgrad2, hw_param->regkgrad1, hw_param->reggbthre,
196         hw_param->regmaxcorv, hw_param->regmingradthr2, hw_param->regmingradthr1,
197         hw_param->gr_ratio, hw_param->dnloscale, hw_param->dnhiscale, hw_param->reglumapointsstep,
198         hw_param->gvaluelimitlo, hw_param->gvaluelimithi, hw_param->fusionratiohilimt1,
199         hw_param->regstrength_fix, hw_param->noise_cut_en, hw_param->noise_coe_a,
200         hw_param->noise_coe_b, hw_param->diff_clip);
201 }
202 
AgicInit(AgicContext_t * pAgicCtx,CamCalibDbV2Context_t * calib)203 XCamReturn AgicInit(AgicContext_t* pAgicCtx, CamCalibDbV2Context_t* calib) {
204     LOG1_AGIC("enter!");
205 
206     memset(pAgicCtx, 0, sizeof(AgicContext_t));
207     pAgicCtx->state = AGIC_STATE_INITIALIZED;
208 
209     CalibDbV2_Gic_V20_t* calibv2_agic_calib_V20 =
210         (CalibDbV2_Gic_V20_t*)(CALIBDBV2_GET_MODULE_PTR(calib, agic_calib_v20));
211     GicV1CalibToAttr(calibv2_agic_calib_V20, &pAgicCtx->attr.v1);
212     pAgicCtx->attr.v1.op_mode = RKAIQ_GIC_API_OPMODE_AUTO;
213 
214     pAgicCtx->calib_changed = true;
215     pAgicCtx->state         = AGIC_STATE_RUNNING;
216 
217     LOG1_AGIC("exit!");
218     return XCAM_RETURN_NO_ERROR;
219 }
220 
AgicRelease(AgicContext_t * pAgicCtx)221 XCamReturn AgicRelease(AgicContext_t* pAgicCtx) {
222     LOG1_AGIC("enter!");
223 
224     AgicStop(pAgicCtx);
225 
226     LOG1_AGIC("exit!");
227     return XCAM_RETURN_NO_ERROR;
228 }
229 
AgicStop(AgicContext_t * pAgicCtx)230 XCamReturn AgicStop(AgicContext_t* pAgicCtx) {
231     LOG1_AGIC("enter!");
232 
233     pAgicCtx->state = AGIC_STATE_STOPPED;
234 
235     LOG1_AGIC("exit!");
236     return XCAM_RETURN_NO_ERROR;
237 }
238 
AgicPreProcess(AgicContext_t * pAgicCtx)239 XCamReturn AgicPreProcess(AgicContext_t* pAgicCtx) {
240     return XCAM_RETURN_NO_ERROR;
241 }
242 
AgicGetProcResultV20(AgicContext_t * pAgicCtx,AgicProcResult_t * pAgicRes)243 void AgicGetProcResultV20(AgicContext_t* pAgicCtx, AgicProcResult_t* pAgicRes) {
244     LOG1_AGIC("enter!");
245 
246     pAgicRes->gic_en = pAgicCtx->ConfigData.ConfigV20.gic_en == 0 ? false : true;
247     pAgicRes->ProcResV20.edge_open = pAgicCtx->ConfigData.ConfigV20.edge_open;
248     pAgicRes->ProcResV20.regmingradthrdark2 =
249         pAgicCtx->ConfigData.ConfigV20.regmingradthrdark2;
250     pAgicRes->ProcResV20.regmingradthrdark1 =
251         pAgicCtx->ConfigData.ConfigV20.regmingradthrdark1;
252     pAgicRes->ProcResV20.regminbusythre = pAgicCtx->ConfigData.ConfigV20.regminbusythre;
253     pAgicRes->ProcResV20.regdarkthre    = pAgicCtx->ConfigData.ConfigV20.regdarkthre;
254     pAgicRes->ProcResV20.regmaxcorvboth = pAgicCtx->ConfigData.ConfigV20.regmaxcorvboth;
255     pAgicRes->ProcResV20.regdarktthrehi = pAgicCtx->ConfigData.ConfigV20.regdarktthrehi;
256     pAgicRes->ProcResV20.regkgrad2dark =
257         (int)(log(double(pAgicCtx->ConfigData.ConfigV20.regkgrad2dark)) / log((double)2) + 0.5f);
258     pAgicRes->ProcResV20.regkgrad1dark =
259         (int)(log(double(pAgicCtx->ConfigData.ConfigV20.regkgrad1dark)) / log((double)2) + 0.5f);
260 
261     pAgicRes->ProcResV20.regstrengthglobal_fix =
262         (int)(pAgicCtx->ConfigData.ConfigV20.globalStrength * (1 << 7));
263     if (pAgicRes->ProcResV20.regstrengthglobal_fix > (1 << 7) - 1)
264         pAgicRes->ProcResV20.regstrengthglobal_fix = 7 + 1;
265     else
266         pAgicRes->ProcResV20.regstrengthglobal_fix =
267             int(log(double((1 << 7) - pAgicRes->ProcResV20.regstrengthglobal_fix)) /
268                 log((double)2) +
269                 0.5f);
270 
271     pAgicRes->ProcResV20.regdarkthrestep =
272         int(log(double(pAgicCtx->ConfigData.ConfigV20.regdarktthrehi -
273                        pAgicCtx->ConfigData.ConfigV20.regdarkthre)) /
274             log((double)2) +
275             0.5f);
276     pAgicRes->ProcResV20.regkgrad2 =
277         (int)(log(double(pAgicCtx->ConfigData.ConfigV20.regkgrad2)) / log((double)2) + 0.5f);
278     pAgicRes->ProcResV20.regkgrad1 =
279         (int)(log(double(pAgicCtx->ConfigData.ConfigV20.regkgrad1)) / log((double)2) + 0.5f);
280     pAgicRes->ProcResV20.reggbthre =
281         int(log(double(pAgicCtx->ConfigData.ConfigV20.reggbthre)) / log((double)2) + 0.5f);
282     pAgicRes->ProcResV20.regmaxcorv     = pAgicCtx->ConfigData.ConfigV20.regmaxcorv;
283     pAgicRes->ProcResV20.regmingradthr1 = pAgicCtx->ConfigData.ConfigV20.regmingradthr1;
284     pAgicRes->ProcResV20.regmingradthr2 = pAgicCtx->ConfigData.ConfigV20.regmingradthr2;
285     pAgicRes->ProcResV20.gr_ratio       = pAgicCtx->ConfigData.ConfigV20.gr_ratio;
286     pAgicRes->ProcResV20.dnloscale =
287         (int)(pAgicCtx->ConfigData.ConfigV20.dnloscale * (1 << 7));
288     pAgicRes->ProcResV20.dnhiscale =
289         (int)(pAgicCtx->ConfigData.ConfigV20.dnhiscale * (1 << 7));
290     pAgicRes->ProcResV20.reglumapointsstep =
291         pAgicCtx->ConfigData.ConfigV20.reglumapointsstep;
292     pAgicRes->ProcResV20.gvaluelimitlo = (int)pAgicCtx->ConfigData.ConfigV20.gvaluelimitlo;
293     pAgicRes->ProcResV20.gvaluelimithi = (int)pAgicCtx->ConfigData.ConfigV20.gvaluelimithi;
294     pAgicRes->ProcResV20.fusionratiohilimt1 =
295         (int)(pAgicCtx->ConfigData.ConfigV20.fusionratiohilimt1 * (1 << 7));
296     pAgicRes->ProcResV20.regstrength_fix =
297         (int)(pAgicCtx->ConfigData.ConfigV20.textureStrength * (1 << 7));
298 
299     for (int i = 0; i < 15; i++) {
300         pAgicRes->ProcResV20.sigma_y[i] =
301             (int)(pAgicCtx->ConfigData.ConfigV20.sigma_y[i] * (1 << 7));
302     }
303 
304     pAgicRes->ProcResV20.noise_cut_en = pAgicCtx->ConfigData.ConfigV20.noise_cut_en;
305     pAgicRes->ProcResV20.noise_coe_a  = pAgicCtx->ConfigData.ConfigV20.noise_coe_a;
306     pAgicRes->ProcResV20.noise_coe_b  = pAgicCtx->ConfigData.ConfigV20.noise_coe_b;
307     pAgicRes->ProcResV20.diff_clip    = pAgicCtx->ConfigData.ConfigV20.diff_clip;
308 
309     if (pAgicRes->ProcResV20.regkgrad2dark < pAgicRes->ProcResV20.regkgrad2)
310         GIC_SWAP(int, pAgicRes->ProcResV20.regkgrad2dark,
311                  pAgicRes->ProcResV20.regkgrad2);
312 
313     if (pAgicRes->ProcResV20.regmingradthrdark1 <
314             pAgicRes->ProcResV20.regmingradthr1)
315         GIC_SWAP(int, pAgicRes->ProcResV20.regmingradthrdark1,
316                  pAgicRes->ProcResV20.regmingradthr1);
317 
318     if (pAgicRes->ProcResV20.regmingradthrdark2 <
319             pAgicRes->ProcResV20.regmingradthr2)
320         GIC_SWAP(int, pAgicRes->ProcResV20.regmingradthrdark2,
321                  pAgicRes->ProcResV20.regmingradthr2);
322 
323     if (pAgicRes->ProcResV20.regdarktthrehi < pAgicRes->ProcResV20.regdarkthre)
324         GIC_SWAP(int, pAgicRes->ProcResV20.regdarktthrehi,
325                  pAgicRes->ProcResV20.regdarkthre);
326 
327     GicV1DumpReg(&pAgicRes->ProcResV20);
328 
329     LOG1_AGIC("exit!");
330 }
331 
AgicProcessV20(AgicContext_t * pAgicCtx,int ISO)332 void AgicProcessV20(AgicContext_t* pAgicCtx, int ISO) {
333     LOG1_AGIC("enter!");
334 
335     float ave1 = 0.0f, noiseSigma = 0.0f;
336     int ratio  = 0;
337     int iso_lo = 50, iso_hi = 50;
338     int index          = 0;
339     short LumaPoints[] = {0,    128,  256,  384,  512,  640,  768, 896,
340                           1024, 1536, 2048, 2560, 3072, 3584, 4096
341                          };
342 
343     LOGD_AGIC("enter, ISO=%d", ISO);
344 
345     if (pAgicCtx == NULL) LOGE_AGIC("null pointer");
346 
347     if (ISO <= 50) {
348         index = 0;
349         ratio = 0;
350     } else if (ISO > 12800) {
351         index = pAgicCtx->attr.v2.iso_cnt - 2;
352         ratio = (1 << 4);
353     } else {
354         int i = 0;
355         for (i = 0; i < int(pAgicCtx->attr.v1.iso_cnt - 2); i++) {
356             iso_lo = (int)(pAgicCtx->attr.v1.auto_params[i].iso);
357             iso_hi = (int)(pAgicCtx->attr.v1.auto_params[i + 1].iso);
358             LOGD_AGIC("index=%d,  iso_lo=%d, iso_hi=%d", index, iso_lo, iso_hi);
359             if (ISO > iso_lo && ISO <= iso_hi) {
360                 break;
361             }
362         }
363         ratio = ((ISO - iso_lo) * (1 << 4)) / (iso_hi - iso_lo);
364         index = i;
365     }
366 
367     if (pAgicCtx->attr.v1.op_mode == RKAIQ_GIC_API_OPMODE_AUTO) {
368         GicV1SelectParam(&pAgicCtx->ConfigData.ConfigV20, ratio, index,
369                          pAgicCtx->attr.v1.auto_params, pAgicCtx->attr.v1.iso_cnt);
370     } else {
371         GicV1SetManualParam(&pAgicCtx->ConfigData.ConfigV20, &pAgicCtx->attr.v1.manual_param);
372     }
373     pAgicCtx->ConfigData.ConfigV20.gic_en             = pAgicCtx->attr.v1.gic_en;
374     pAgicCtx->ConfigData.ConfigV20.edge_open          = pAgicCtx->attr.v1.edge_open;
375     pAgicCtx->ConfigData.ConfigV20.noise_cut_en       = pAgicCtx->attr.v1.noise_cut_en;
376     pAgicCtx->ConfigData.ConfigV20.reglumapointsstep  = 7;
377     pAgicCtx->ConfigData.ConfigV20.fusionratiohilimt1 = 0.75;
378 
379     for (int i = 0; i < 15; i++) {
380         ave1       = LumaPoints[i];
381         noiseSigma = pAgicCtx->ConfigData.ConfigV20.noiseCurve_0 * sqrt(ave1) +
382                      pAgicCtx->ConfigData.ConfigV20.noiseCurve_1;
383         if (noiseSigma < 0) {
384             noiseSigma = 0;
385         }
386         pAgicCtx->ConfigData.ConfigV20.sigma_y[i] = noiseSigma;
387     }
388 
389     short mulBit = 0;
390     int bitValue = pAgicCtx->raw_bits;
391     if (bitValue > 10) {
392         mulBit = 1 << (bitValue - 10);
393     } else {
394         mulBit = 1;
395     }
396     pAgicCtx->ConfigData.ConfigV20.regminbusythre *= mulBit;
397     pAgicCtx->ConfigData.ConfigV20.regmingradthr1 *= mulBit;
398     pAgicCtx->ConfigData.ConfigV20.regmingradthr2 *= mulBit;
399     pAgicCtx->ConfigData.ConfigV20.reggbthre *= mulBit;
400     pAgicCtx->ConfigData.ConfigV20.regmaxcorv *= mulBit;
401     pAgicCtx->ConfigData.ConfigV20.regmaxcorvboth *= mulBit;
402     pAgicCtx->ConfigData.ConfigV20.regdarkthre *= mulBit;
403     pAgicCtx->ConfigData.ConfigV20.regdarktthrehi *= mulBit;
404     pAgicCtx->ConfigData.ConfigV20.regmingradthrdark1 *= mulBit;
405     pAgicCtx->ConfigData.ConfigV20.regmingradthrdark2 *= mulBit;
406 
407     LOG1_AGIC("exit!");
408 }
409 
AgicProcess(AgicContext_t * pAgicCtx,int ISO,int mode)410 XCamReturn AgicProcess(AgicContext_t* pAgicCtx, int ISO, int mode) {
411     (void)(mode);
412 
413     LOG1_AGIC("enter!");
414 
415     AgicProcessV20(pAgicCtx, ISO);
416 
417     LOG1_AGIC("exit!");
418     return XCAM_RETURN_NO_ERROR;
419 }
420 
AgicGetProcResult(AgicContext_t * pAgicCtx,AgicProcResult_t * pAgicRes)421 XCamReturn AgicGetProcResult(AgicContext_t* pAgicCtx, AgicProcResult_t* pAgicRes) {
422     LOG1_AGIC("enter!");
423 
424     if (pAgicCtx == NULL) {
425         LOGE_AGIC("null pointer");
426         return XCAM_RETURN_ERROR_PARAM;
427     }
428 
429     AgicGetProcResultV20(pAgicCtx, pAgicRes);
430 
431     LOG1_AGIC("exit!");
432     return XCAM_RETURN_NO_ERROR;
433 }
434 
435