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