1 /*
2 * rk_aiq_adehaze_algo_v11.cpp
3 *
4 * Copyright (c) 2019 Rockchip Corporation
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 */
19 #include "rk_aiq_adehaze_algo_v11.h"
20 #include <string.h>
21 #include "xcam_log.h"
22 #include "rkisp21-config.h"
23
GetInterpRatioV11(float * pX,int lo,int hi,float CtrlValue,int length_max)24 float GetInterpRatioV11(float* pX, int lo, int hi, float CtrlValue, int length_max) {
25 float ratio = 0.0f;
26
27 if (CtrlValue < pX[0]) {
28 lo = 0;
29 hi = 0;
30 ratio = 0.0f;
31 } else if (CtrlValue >= pX[length_max - 1]) {
32 lo = length_max - 1;
33 hi = length_max - 1;
34 ratio = 0.0f;
35 } else {
36 for (int i = 0; i < length_max - 1; i++) {
37 if (CtrlValue >= pX[i] && CtrlValue < pX[i + 1]) {
38 lo = i;
39 hi = i + 1;
40 ratio = (CtrlValue - pX[i]) / (pX[i + 1] - pX[i]);
41 break;
42 } else
43 continue;
44 }
45 }
46
47 return ratio;
48 }
49
ClipValueV11(float posx,int BitInt,int BitFloat)50 int ClipValueV11(float posx, int BitInt, int BitFloat) {
51 int yOutInt = 0;
52 int yOutIntMax = (int)(pow(2, (BitFloat + BitInt)) - 1);
53 int yOutIntMin = 0;
54
55 yOutInt = LIMIT_VALUE((int)(posx * pow(2, BitFloat)), yOutIntMax, yOutIntMin);
56
57 return yOutInt;
58 }
59
stManuGetDehazeParamsV11(mDehazeAttrV11_t * pStManu,RkAiqAdehazeProcResult_t * pProcRes,int rawWidth,int rawHeight,unsigned int MDehazeStrth)60 void stManuGetDehazeParamsV11(mDehazeAttrV11_t* pStManu, RkAiqAdehazeProcResult_t* pProcRes,
61 int rawWidth, int rawHeight, unsigned int MDehazeStrth) {
62 LOG1_ADEHAZE("ENTER: %s \n", __func__);
63
64 pProcRes->ProcResV11.air_lc_en =
65 pStManu->dehaze_setting.air_lc_en ? FUNCTION_ENABLE : FUNCTION_DISABLE;
66 pProcRes->ProcResV11.dc_min_th =
67 ClipValueV11(pStManu->dehaze_setting.DehazeData.dc_min_th, 8, 0);
68 pProcRes->ProcResV11.dc_max_th =
69 ClipValueV11(pStManu->dehaze_setting.DehazeData.dc_max_th, 8, 0);
70 pProcRes->ProcResV11.yhist_th = ClipValueV11(pStManu->dehaze_setting.DehazeData.yhist_th, 8, 0);
71 pProcRes->ProcResV11.yblk_th = int(pStManu->dehaze_setting.DehazeData.yblk_th *
72 ((rawWidth + 15) / 16) * ((rawHeight + 15) / 16));
73 pProcRes->ProcResV11.dark_th = ClipValueV11(pStManu->dehaze_setting.DehazeData.dark_th, 8, 0);
74 pProcRes->ProcResV11.bright_min =
75 ClipValueV11(pStManu->dehaze_setting.DehazeData.bright_min, 8, 0);
76 pProcRes->ProcResV11.bright_max =
77 ClipValueV11(pStManu->dehaze_setting.DehazeData.bright_max, 8, 0);
78 pProcRes->ProcResV11.wt_max = ClipValueV11(pStManu->dehaze_setting.DehazeData.wt_max, 0, 8);
79 pProcRes->ProcResV11.air_min = ClipValueV11(pStManu->dehaze_setting.DehazeData.air_min, 8, 0);
80 pProcRes->ProcResV11.air_max = ClipValueV11(pStManu->dehaze_setting.DehazeData.air_max, 8, 0);
81 pProcRes->ProcResV11.tmax_base =
82 ClipValueV11(pStManu->dehaze_setting.DehazeData.tmax_base, 8, 0);
83 pProcRes->ProcResV11.tmax_off =
84 ClipValueV11(pStManu->dehaze_setting.DehazeData.tmax_off, 0, 10);
85 pProcRes->ProcResV11.tmax_max =
86 ClipValueV11(pStManu->dehaze_setting.DehazeData.tmax_max, 0, 10);
87 pProcRes->ProcResV11.cfg_wt = ClipValueV11(pStManu->dehaze_setting.DehazeData.cfg_wt, 0, 8);
88 pProcRes->ProcResV11.cfg_air = ClipValueV11(pStManu->dehaze_setting.DehazeData.cfg_air, 8, 0);
89 pProcRes->ProcResV11.cfg_tmax =
90 ClipValueV11(pStManu->dehaze_setting.DehazeData.cfg_tmax, 0, 10);
91 pProcRes->ProcResV11.range_sima =
92 ClipValueV11(pStManu->dehaze_setting.DehazeData.range_sigma, 0, 8);
93 pProcRes->ProcResV11.space_sigma_cur =
94 ClipValueV11(pStManu->dehaze_setting.DehazeData.space_sigma_cur, 0, 8);
95 pProcRes->ProcResV11.space_sigma_pre =
96 ClipValueV11(pStManu->dehaze_setting.DehazeData.space_sigma_pre, 0, 8);
97 pProcRes->ProcResV11.bf_weight =
98 ClipValueV11(pStManu->dehaze_setting.DehazeData.bf_weight, 0, 8);
99 pProcRes->ProcResV11.dc_weitcur =
100 ClipValueV11(pStManu->dehaze_setting.DehazeData.dc_weitcur, 0, 8);
101 pProcRes->ProcResV11.stab_fnum = ClipValueV11(pStManu->dehaze_setting.stab_fnum, 5, 0);
102 if (pStManu->dehaze_setting.sigma)
103 pProcRes->ProcResV11.iir_sigma =
104 LIMIT_VALUE(int(256.0f / pStManu->dehaze_setting.sigma), 255, 0);
105 else
106 pProcRes->ProcResV11.iir_sigma = 0x1;
107 if (pStManu->dehaze_setting.wt_sigma >= 0.0f)
108 pProcRes->ProcResV11.iir_wt_sigma =
109 LIMIT_VALUE(int(1024.0f / (8.0f * pStManu->dehaze_setting.wt_sigma + 0.5f)), 0x7ff, 0);
110 else
111 pProcRes->ProcResV11.iir_wt_sigma = 0x7ff;
112 if (pStManu->dehaze_setting.air_sigma)
113 pProcRes->ProcResV11.iir_air_sigma =
114 LIMIT_VALUE(int(1024.0f / pStManu->dehaze_setting.air_sigma), 255, 0);
115 else
116 pProcRes->ProcResV11.iir_air_sigma = 0x8;
117 if (pStManu->dehaze_setting.tmax_sigma)
118 pProcRes->ProcResV11.iir_tmax_sigma =
119 LIMIT_VALUE(int(1.0f / pStManu->dehaze_setting.tmax_sigma), 0x7ff, 0);
120 else
121 pProcRes->ProcResV11.iir_tmax_sigma = 0x5f;
122 pProcRes->ProcResV11.iir_pre_wet =
123 LIMIT_VALUE(int(pStManu->dehaze_setting.pre_wet - 1.0f), 15, 0);
124 pProcRes->ProcResV11.gaus_h0 = DEHAZE_GAUS_H4;
125 pProcRes->ProcResV11.gaus_h1 = DEHAZE_GAUS_H1;
126 pProcRes->ProcResV11.gaus_h2 = DEHAZE_GAUS_H0;
127
128 // add for rk_aiq_uapi2_setMDehazeStrth
129 if (MDehazeStrth != DEHAZE_DEFAULT_LEVEL) {
130 pProcRes->ProcResV11.cfg_alpha = BIT_8_MAX;
131 unsigned int level_diff = MDehazeStrth > DEHAZE_DEFAULT_LEVEL
132 ? (MDehazeStrth - DEHAZE_DEFAULT_LEVEL)
133 : (DEHAZE_DEFAULT_LEVEL - MDehazeStrth);
134 bool level_up = MDehazeStrth > DEHAZE_DEFAULT_LEVEL;
135 if (level_up) {
136 pProcRes->ProcResV11.cfg_wt += level_diff * DEHAZE_DEFAULT_CFG_WT_STEP;
137 pProcRes->ProcResV11.cfg_air += level_diff * DEHAZE_DEFAULT_CFG_AIR_STEP;
138 pProcRes->ProcResV11.cfg_tmax += level_diff * DEHAZE_DEFAULT_CFG_TMAX_STEP;
139 } else {
140 pProcRes->ProcResV11.cfg_wt -= level_diff * DEHAZE_DEFAULT_CFG_WT_STEP;
141 pProcRes->ProcResV11.cfg_air -= level_diff * DEHAZE_DEFAULT_CFG_AIR_STEP;
142 pProcRes->ProcResV11.cfg_tmax -= level_diff * DEHAZE_DEFAULT_CFG_TMAX_STEP;
143 }
144 pProcRes->ProcResV11.cfg_wt = LIMIT_VALUE(pProcRes->ProcResV11.cfg_wt, BIT_8_MAX, BIT_MIN);
145 pProcRes->ProcResV11.cfg_air =
146 LIMIT_VALUE(pProcRes->ProcResV11.cfg_air, BIT_8_MAX, BIT_MIN);
147 pProcRes->ProcResV11.cfg_tmax =
148 LIMIT_VALUE(pProcRes->ProcResV11.cfg_tmax, BIT_10_MAX, BIT_MIN);
149 }
150
151 if (pProcRes->ProcResV11.dc_en && !(pProcRes->ProcResV11.enhance_en)) {
152 if (pProcRes->ProcResV11.cfg_alpha == 255) {
153 LOGD_ADEHAZE("%s cfg_alpha:1 cfg_air:%f cfg_tmax:%f cfg_wt:%f\n", __func__,
154 pProcRes->ProcResV11.cfg_air / 1.0f,
155 pProcRes->ProcResV11.cfg_tmax / 1023.0f,
156 pProcRes->ProcResV11.cfg_wt / 255.0f);
157 LOGD_ADEHAZE("%s cfg_alpha_reg:0x255 cfg_air:0x%x cfg_tmax:0x%x cfg_wt:0x%x\n",
158 __func__, pProcRes->ProcResV11.cfg_air, pProcRes->ProcResV11.cfg_tmax,
159 pProcRes->ProcResV11.cfg_wt);
160 } else if (pProcRes->ProcResV11.cfg_alpha == 0) {
161 LOGD_ADEHAZE("%s cfg_alpha:0 air_max:%f air_min:%f tmax_base:%f wt_max:%f\n", __func__,
162 pProcRes->ProcResV11.air_max / 1.0f, pProcRes->ProcResV11.air_min / 1.0f,
163 pProcRes->ProcResV11.tmax_base / 1.0f,
164 pProcRes->ProcResV11.wt_max / 255.0f);
165 LOGD_ADEHAZE(
166 "%s cfg_alpha_reg:0x0 air_max:0x%x air_min:0x%x tmax_base:0x%x wt_max:0x%x\n",
167 __func__, pProcRes->ProcResV11.air_max, pProcRes->ProcResV11.air_min,
168 pProcRes->ProcResV11.tmax_base, pProcRes->ProcResV11.wt_max);
169 }
170 }
171
172 LOG1_ADEHAZE("EIXT: %s \n", __func__);
173 }
174
stManuGetEnhanceParamsV11(mDehazeAttrV11_t * pStManu,RkAiqAdehazeProcResult_t * pProcRes,unsigned int MEnhanceStrth,unsigned int MEnhanceChromeStrth)175 void stManuGetEnhanceParamsV11(mDehazeAttrV11_t* pStManu, RkAiqAdehazeProcResult_t* pProcRes,
176 unsigned int MEnhanceStrth, unsigned int MEnhanceChromeStrth) {
177 LOG1_ADEHAZE("ENTER: %s \n", __func__);
178 bool level_up = false;
179 unsigned int level_diff = 0;
180
181 pProcRes->ProcResV11.enhance_value =
182 ClipValueV11(pStManu->enhance_setting.EnhanceData.enhance_value, 4, 10);
183 pProcRes->ProcResV11.enhance_chroma =
184 ClipValueV11(pStManu->enhance_setting.EnhanceData.enhance_chroma, 4, 10);
185
186 // add for rk_aiq_uapi2_setMEnhanceStrth
187 if (MEnhanceStrth != ENHANCE_DEFAULT_LEVEL) {
188 level_diff = MEnhanceStrth > ENHANCE_DEFAULT_LEVEL
189 ? (MEnhanceStrth - ENHANCE_DEFAULT_LEVEL)
190 : (ENHANCE_DEFAULT_LEVEL - MEnhanceStrth);
191 level_up = MEnhanceStrth > ENHANCE_DEFAULT_LEVEL;
192 if (level_up) {
193 pProcRes->ProcResV11.enhance_value += level_diff * ENHANCE_VALUE_DEFAULT_STEP;
194 } else {
195 pProcRes->ProcResV11.enhance_value -= level_diff * ENHANCE_VALUE_DEFAULT_STEP;
196 }
197 pProcRes->ProcResV11.enhance_value =
198 LIMIT_VALUE(pProcRes->ProcResV11.enhance_value, BIT_14_MAX, BIT_MIN);
199 }
200
201 // add for rk_aiq_uapi2_setMEnhanceChromeStrth
202 if (MEnhanceChromeStrth != ENHANCE_DEFAULT_LEVEL) {
203 level_diff = MEnhanceChromeStrth > ENHANCE_DEFAULT_LEVEL
204 ? (MEnhanceChromeStrth - ENHANCE_DEFAULT_LEVEL)
205 : (ENHANCE_DEFAULT_LEVEL - MEnhanceChromeStrth);
206 level_up = MEnhanceChromeStrth > ENHANCE_DEFAULT_LEVEL;
207 if (level_up) {
208 pProcRes->ProcResV11.enhance_chroma += level_diff * ENHANCE_VALUE_DEFAULT_STEP;
209 } else {
210 pProcRes->ProcResV11.enhance_chroma -= level_diff * ENHANCE_VALUE_DEFAULT_STEP;
211 }
212 pProcRes->ProcResV11.enhance_chroma =
213 LIMIT_VALUE(pProcRes->ProcResV11.enhance_chroma, BIT_14_MAX, BIT_MIN);
214 }
215
216 for (int i = 0; i < DHAZ_V11_ENHANCE_CRUVE_NUM; i++)
217 pProcRes->ProcResV11.enh_curve[i] = (int)(pStManu->enhance_setting.enhance_curve[i]);
218
219 if (pProcRes->ProcResV11.dc_en && pProcRes->ProcResV11.enhance_en) {
220 LOGD_ADEHAZE("%s enhance_value:%f enhance_chroma:%f\n", __func__,
221 pStManu->enhance_setting.EnhanceData.enhance_value / 1024.0f,
222 pStManu->enhance_setting.EnhanceData.enhance_chroma / 1024.0f);
223 LOGD_ADEHAZE("%s enhance_value_reg:0x%x enhance_chroma_reg:0x%x\n", __func__,
224 pProcRes->ProcResV11.enhance_value, pProcRes->ProcResV11.enhance_chroma);
225 }
226
227 LOG1_ADEHAZE("EIXT: %s \n", __func__);
228 }
229
stManuGetHistParamsV11(mDehazeAttrV11_t * pStManu,RkAiqAdehazeProcResult_t * pProcRes)230 void stManuGetHistParamsV11(mDehazeAttrV11_t* pStManu, RkAiqAdehazeProcResult_t* pProcRes) {
231 LOG1_ADEHAZE("ENTER: %s \n", __func__);
232
233 pProcRes->ProcResV11.hpara_en =
234 pStManu->hist_setting.hist_para_en ? FUNCTION_ENABLE : FUNCTION_DISABLE;
235 // clip hpara_en
236 pProcRes->ProcResV11.hpara_en =
237 pProcRes->ProcResV11.dc_en ? pProcRes->ProcResV11.hpara_en : FUNCTION_ENABLE;
238
239 pProcRes->ProcResV11.hist_gratio =
240 ClipValueV11(pStManu->hist_setting.HistData.hist_gratio, 5, 3);
241 pProcRes->ProcResV11.hist_th_off =
242 ClipValueV11(pStManu->hist_setting.HistData.hist_th_off, 8, 0);
243 pProcRes->ProcResV11.hist_k = ClipValueV11(pStManu->hist_setting.HistData.hist_k, 3, 2);
244 pProcRes->ProcResV11.hist_min = ClipValueV11(pStManu->hist_setting.HistData.hist_min, 1, 8);
245 pProcRes->ProcResV11.cfg_gratio = ClipValueV11(pStManu->hist_setting.HistData.cfg_gratio, 5, 8);
246 pProcRes->ProcResV11.hist_scale = ClipValueV11(pStManu->hist_setting.HistData.hist_scale, 5, 8);
247
248 if (pProcRes->ProcResV11.hist_en) {
249 LOGD_ADEHAZE(
250 "%s cfg_alpha:%f hist_para_en:%d hist_gratio:%f hist_th_off:%f hist_k:%f "
251 "hist_min:%f hist_scale:%f cfg_gratio:%f\n",
252 __func__, pProcRes->ProcResV11.cfg_alpha / 255.0f, pProcRes->ProcResV11.hpara_en,
253 pProcRes->ProcResV11.hist_gratio / 255.0f, pProcRes->ProcResV11.hist_th_off / 1.0f,
254 pProcRes->ProcResV11.hist_k / 4.0f, pProcRes->ProcResV11.hist_min / 256.0f,
255 pProcRes->ProcResV11.hist_scale / 256.0f, pProcRes->ProcResV11.cfg_gratio / 256.0f);
256 LOGD_ADEHAZE(
257 "%s cfg_alpha_reg:0x%x hist_gratio_reg:0x%x hist_th_off_reg:0x%x hist_k_reg:0x%x "
258 "hist_min_reg:0x%x hist_scale_reg:0x%x cfg_gratio_reg:0x%x\n",
259 __func__, pProcRes->ProcResV11.cfg_alpha, pProcRes->ProcResV11.hist_gratio,
260 pProcRes->ProcResV11.hist_th_off, pProcRes->ProcResV11.hist_k,
261 pProcRes->ProcResV11.hist_min, pProcRes->ProcResV11.hist_scale,
262 pProcRes->ProcResV11.cfg_gratio);
263 }
264
265 LOG1_ADEHAZE("EIXT: %s \n", __func__);
266 }
267
GetDehazeParamsV11(CalibDbDehazeV11_t * pCalibV11,RkAiqAdehazeProcResult_t * pProcRes,int rawWidth,int rawHeight,unsigned int MDehazeStrth,float CtrlValue)268 void GetDehazeParamsV11(CalibDbDehazeV11_t* pCalibV11, RkAiqAdehazeProcResult_t* pProcRes,
269 int rawWidth, int rawHeight, unsigned int MDehazeStrth, float CtrlValue) {
270 LOG1_ADEHAZE("ENTER: %s \n", __func__);
271 int lo = 0, hi = 0;
272 float ratio = GetInterpRatioV11(pCalibV11->dehaze_setting.DehazeData.CtrlData, lo, hi,
273 CtrlValue, DHAZ_CTRL_DATA_STEP_MAX);
274
275 pProcRes->ProcResV11.dc_min_th =
276 ClipValueV11(ratio * (pCalibV11->dehaze_setting.DehazeData.dc_min_th[hi] -
277 pCalibV11->dehaze_setting.DehazeData.dc_min_th[lo]) +
278 pCalibV11->dehaze_setting.DehazeData.dc_min_th[lo],
279 8, 0);
280 pProcRes->ProcResV11.dc_max_th =
281 ClipValueV11(ratio * (pCalibV11->dehaze_setting.DehazeData.dc_max_th[hi] -
282 pCalibV11->dehaze_setting.DehazeData.dc_max_th[lo]) +
283 pCalibV11->dehaze_setting.DehazeData.dc_max_th[lo],
284 8, 0);
285 pProcRes->ProcResV11.yhist_th =
286 ClipValueV11(ratio * (pCalibV11->dehaze_setting.DehazeData.yhist_th[hi] -
287 pCalibV11->dehaze_setting.DehazeData.yhist_th[lo]) +
288 pCalibV11->dehaze_setting.DehazeData.yhist_th[lo],
289 8, 0);
290 pProcRes->ProcResV11.yblk_th = (ratio * (pCalibV11->dehaze_setting.DehazeData.yblk_th[hi] -
291 pCalibV11->dehaze_setting.DehazeData.yblk_th[lo]) +
292 pCalibV11->dehaze_setting.DehazeData.yblk_th[lo]) *
293 ((rawWidth + 15) / 16) * ((rawHeight + 15) / 16);
294 pProcRes->ProcResV11.dark_th =
295 ClipValueV11(ratio * (pCalibV11->dehaze_setting.DehazeData.dark_th[hi] -
296 pCalibV11->dehaze_setting.DehazeData.dark_th[lo]) +
297 pCalibV11->dehaze_setting.DehazeData.dark_th[lo],
298 8, 0);
299
300 pProcRes->ProcResV11.bright_min =
301 ClipValueV11(ratio * (pCalibV11->dehaze_setting.DehazeData.bright_min[hi] -
302 pCalibV11->dehaze_setting.DehazeData.bright_min[lo]) +
303 pCalibV11->dehaze_setting.DehazeData.bright_min[lo],
304 8, 0);
305 pProcRes->ProcResV11.bright_max =
306 ClipValueV11(ratio * (pCalibV11->dehaze_setting.DehazeData.bright_max[hi] -
307 pCalibV11->dehaze_setting.DehazeData.bright_max[lo]) +
308 pCalibV11->dehaze_setting.DehazeData.bright_max[lo],
309 8, 0);
310 pProcRes->ProcResV11.wt_max =
311 ClipValueV11(ratio * (pCalibV11->dehaze_setting.DehazeData.wt_max[hi] -
312 pCalibV11->dehaze_setting.DehazeData.wt_max[lo]) +
313 pCalibV11->dehaze_setting.DehazeData.wt_max[lo],
314 0, 8);
315 pProcRes->ProcResV11.air_min =
316 ClipValueV11(ratio * (pCalibV11->dehaze_setting.DehazeData.air_min[hi] -
317 pCalibV11->dehaze_setting.DehazeData.air_min[lo]) +
318 pCalibV11->dehaze_setting.DehazeData.air_min[lo],
319 8, 0);
320 pProcRes->ProcResV11.air_max =
321 ClipValueV11(ratio * (pCalibV11->dehaze_setting.DehazeData.air_max[hi] -
322 pCalibV11->dehaze_setting.DehazeData.air_max[lo]) +
323 pCalibV11->dehaze_setting.DehazeData.air_max[lo],
324 8, 0);
325 pProcRes->ProcResV11.tmax_base =
326 ClipValueV11(ratio * (pCalibV11->dehaze_setting.DehazeData.tmax_base[hi] -
327 pCalibV11->dehaze_setting.DehazeData.tmax_base[lo]) +
328 pCalibV11->dehaze_setting.DehazeData.tmax_base[lo],
329 8, 0);
330 pProcRes->ProcResV11.tmax_off =
331 ClipValueV11(ratio * (pCalibV11->dehaze_setting.DehazeData.tmax_off[hi] -
332 pCalibV11->dehaze_setting.DehazeData.tmax_off[lo]) +
333 pCalibV11->dehaze_setting.DehazeData.tmax_off[lo],
334 0, 10);
335 pProcRes->ProcResV11.tmax_max =
336 ClipValueV11(ratio * (pCalibV11->dehaze_setting.DehazeData.tmax_max[hi] -
337 pCalibV11->dehaze_setting.DehazeData.tmax_max[lo]) +
338 pCalibV11->dehaze_setting.DehazeData.tmax_max[lo],
339 0, 10);
340 pProcRes->ProcResV11.cfg_wt =
341 ClipValueV11(ratio * (pCalibV11->dehaze_setting.DehazeData.cfg_wt[hi] -
342 pCalibV11->dehaze_setting.DehazeData.cfg_wt[lo]) +
343 pCalibV11->dehaze_setting.DehazeData.cfg_wt[lo],
344 0, 8);
345 pProcRes->ProcResV11.cfg_air =
346 ClipValueV11(ratio * (pCalibV11->dehaze_setting.DehazeData.cfg_air[hi] -
347 pCalibV11->dehaze_setting.DehazeData.cfg_air[lo]) +
348 pCalibV11->dehaze_setting.DehazeData.cfg_air[lo],
349 8, 0);
350 pProcRes->ProcResV11.cfg_tmax =
351 ClipValueV11(ratio * (pCalibV11->dehaze_setting.DehazeData.cfg_tmax[hi] -
352 pCalibV11->dehaze_setting.DehazeData.cfg_tmax[lo]) +
353 pCalibV11->dehaze_setting.DehazeData.cfg_tmax[lo],
354 0, 10);
355 pProcRes->ProcResV11.range_sima =
356 ClipValueV11(ratio * (pCalibV11->dehaze_setting.DehazeData.range_sigma[hi] -
357 pCalibV11->dehaze_setting.DehazeData.range_sigma[lo]) +
358 pCalibV11->dehaze_setting.DehazeData.range_sigma[lo],
359 0, 8);
360 pProcRes->ProcResV11.space_sigma_cur =
361 ClipValueV11(ratio * (pCalibV11->dehaze_setting.DehazeData.space_sigma_cur[hi] -
362 pCalibV11->dehaze_setting.DehazeData.space_sigma_cur[lo]) +
363 pCalibV11->dehaze_setting.DehazeData.space_sigma_cur[lo],
364 0, 8);
365 pProcRes->ProcResV11.space_sigma_pre =
366 ClipValueV11(ratio * (pCalibV11->dehaze_setting.DehazeData.space_sigma_pre[hi] -
367 pCalibV11->dehaze_setting.DehazeData.space_sigma_pre[lo]) +
368 pCalibV11->dehaze_setting.DehazeData.space_sigma_pre[lo],
369 0, 8);
370 pProcRes->ProcResV11.bf_weight =
371 ClipValueV11(ratio * (pCalibV11->dehaze_setting.DehazeData.bf_weight[hi] -
372 pCalibV11->dehaze_setting.DehazeData.bf_weight[lo]) +
373 pCalibV11->dehaze_setting.DehazeData.bf_weight[lo],
374 0, 8);
375 pProcRes->ProcResV11.dc_weitcur =
376 ClipValueV11(ratio * (pCalibV11->dehaze_setting.DehazeData.dc_weitcur[hi] -
377 pCalibV11->dehaze_setting.DehazeData.dc_weitcur[lo]) +
378 pCalibV11->dehaze_setting.DehazeData.dc_weitcur[lo],
379 0, 8);
380 pProcRes->ProcResV11.air_lc_en =
381 pCalibV11->dehaze_setting.air_lc_en ? FUNCTION_ENABLE : FUNCTION_DISABLE;
382 pProcRes->ProcResV11.stab_fnum = ClipValueV11(pCalibV11->dehaze_setting.stab_fnum, 5, 0);
383 if (pCalibV11->dehaze_setting.sigma)
384 pProcRes->ProcResV11.iir_sigma =
385 LIMIT_VALUE(int(256.0f / pCalibV11->dehaze_setting.sigma), 255, 0);
386 else
387 pProcRes->ProcResV11.iir_sigma = 0x1;
388 if (pCalibV11->dehaze_setting.wt_sigma >= 0.0f)
389 pProcRes->ProcResV11.iir_wt_sigma = LIMIT_VALUE(
390 int(1024.0f / (8.0f * pCalibV11->dehaze_setting.wt_sigma + 0.5f)), 0x7ff, 0);
391 else
392 pProcRes->ProcResV11.iir_wt_sigma = 0x7ff;
393 if (pCalibV11->dehaze_setting.air_sigma)
394 pProcRes->ProcResV11.iir_air_sigma =
395 LIMIT_VALUE(int(1024.0f / pCalibV11->dehaze_setting.air_sigma), 255, 0);
396 else
397 pProcRes->ProcResV11.iir_air_sigma = 0x8;
398 if (pCalibV11->dehaze_setting.tmax_sigma)
399 pProcRes->ProcResV11.iir_tmax_sigma =
400 LIMIT_VALUE(int(1.0f / pCalibV11->dehaze_setting.tmax_sigma), 0x7ff, 0);
401 else
402 pProcRes->ProcResV11.iir_tmax_sigma = 0x5f;
403 pProcRes->ProcResV11.iir_pre_wet =
404 LIMIT_VALUE(int(pCalibV11->dehaze_setting.pre_wet - 1.0f), 15, 0);
405 pProcRes->ProcResV11.gaus_h0 = DEHAZE_GAUS_H4;
406 pProcRes->ProcResV11.gaus_h1 = DEHAZE_GAUS_H1;
407 pProcRes->ProcResV11.gaus_h2 = DEHAZE_GAUS_H0;
408
409 // add for rk_aiq_uapi2_setMDehazeStrth
410 if (MDehazeStrth != DEHAZE_DEFAULT_LEVEL) {
411 pProcRes->ProcResV11.cfg_alpha = BIT_8_MAX;
412 unsigned int level_diff = MDehazeStrth > DEHAZE_DEFAULT_LEVEL
413 ? (MDehazeStrth - DEHAZE_DEFAULT_LEVEL)
414 : (DEHAZE_DEFAULT_LEVEL - MDehazeStrth);
415 bool level_up = MDehazeStrth > DEHAZE_DEFAULT_LEVEL;
416 if (level_up) {
417 pProcRes->ProcResV11.cfg_wt += level_diff * DEHAZE_DEFAULT_CFG_WT_STEP;
418 pProcRes->ProcResV11.cfg_air += level_diff * DEHAZE_DEFAULT_CFG_AIR_STEP;
419 pProcRes->ProcResV11.cfg_tmax += level_diff * DEHAZE_DEFAULT_CFG_TMAX_STEP;
420 } else {
421 pProcRes->ProcResV11.cfg_wt -= level_diff * DEHAZE_DEFAULT_CFG_WT_STEP;
422 pProcRes->ProcResV11.cfg_air -= level_diff * DEHAZE_DEFAULT_CFG_AIR_STEP;
423 pProcRes->ProcResV11.cfg_tmax -= level_diff * DEHAZE_DEFAULT_CFG_TMAX_STEP;
424 }
425 pProcRes->ProcResV11.cfg_wt = LIMIT_VALUE(pProcRes->ProcResV11.cfg_wt, BIT_8_MAX, BIT_MIN);
426 pProcRes->ProcResV11.cfg_air =
427 LIMIT_VALUE(pProcRes->ProcResV11.cfg_air, BIT_8_MAX, BIT_MIN);
428 pProcRes->ProcResV11.cfg_tmax =
429 LIMIT_VALUE(pProcRes->ProcResV11.cfg_tmax, BIT_10_MAX, BIT_MIN);
430 }
431
432 if (pProcRes->ProcResV11.dc_en && !(pProcRes->ProcResV11.enhance_en)) {
433 if (pProcRes->ProcResV11.cfg_alpha == 255) {
434 LOGD_ADEHAZE("%s cfg_alpha:1 CtrlValue:%f cfg_air:%f cfg_tmax:%f cfg_wt:%f\n", __func__,
435 CtrlValue, pProcRes->ProcResV11.cfg_air / 1.0f,
436 pProcRes->ProcResV11.cfg_tmax / 1023.0f,
437 pProcRes->ProcResV11.cfg_wt / 255.0f);
438 LOGD_ADEHAZE("%s cfg_alpha_reg:0x255 cfg_air:0x%x cfg_tmax:0x%x cfg_wt:0x%x\n",
439 __func__, pProcRes->ProcResV11.cfg_air, pProcRes->ProcResV11.cfg_tmax,
440 pProcRes->ProcResV11.cfg_wt);
441 } else if (pProcRes->ProcResV11.cfg_alpha == 0) {
442 LOGD_ADEHAZE(
443 "%s cfg_alpha:0 CtrlValue:%f air_max:%f air_min:%f tmax_base:%f wt_max:%f\n",
444 __func__, CtrlValue, pProcRes->ProcResV11.air_max / 1.0f,
445 pProcRes->ProcResV11.air_min / 1.0f, pProcRes->ProcResV11.tmax_base / 1.0f,
446 pProcRes->ProcResV11.wt_max / 255.0f);
447 LOGD_ADEHAZE(
448 "%s cfg_alpha_reg:0x0 air_max:0x%x air_min:0x%x tmax_base:0x%x wt_max:0x%x\n",
449 __func__, pProcRes->ProcResV11.air_max, pProcRes->ProcResV11.air_min,
450 pProcRes->ProcResV11.tmax_base, pProcRes->ProcResV11.wt_max);
451 }
452 }
453
454 LOG1_ADEHAZE("EIXT: %s \n", __func__);
455 }
456
GetEnhanceParamsV11(CalibDbDehazeV11_t * pCalibV11,RkAiqAdehazeProcResult_t * pProcRes,unsigned int MEnhanceStrth,unsigned int MEnhanceChromeStrth,float CtrlValue)457 void GetEnhanceParamsV11(CalibDbDehazeV11_t* pCalibV11, RkAiqAdehazeProcResult_t* pProcRes,
458 unsigned int MEnhanceStrth, unsigned int MEnhanceChromeStrth,
459 float CtrlValue) {
460 LOG1_ADEHAZE("ENTER: %s \n", __func__);
461 bool level_up = false;
462 unsigned int level_diff = 0;
463 int lo = 0, hi = 0;
464 float ratio = GetInterpRatioV11(pCalibV11->enhance_setting.EnhanceData.CtrlData, lo, hi,
465 CtrlValue, DHAZ_CTRL_DATA_STEP_MAX);
466
467 pProcRes->ProcResV11.enhance_value =
468 ClipValueV11(ratio * (pCalibV11->enhance_setting.EnhanceData.enhance_value[hi] -
469 pCalibV11->enhance_setting.EnhanceData.enhance_value[lo]) +
470 pCalibV11->enhance_setting.EnhanceData.enhance_value[lo],
471 4, 10);
472 pProcRes->ProcResV11.enhance_chroma =
473 ClipValueV11(ratio * (pCalibV11->enhance_setting.EnhanceData.enhance_chroma[hi] -
474 pCalibV11->enhance_setting.EnhanceData.enhance_chroma[lo]) +
475 pCalibV11->enhance_setting.EnhanceData.enhance_chroma[lo],
476 4, 10);
477
478 // add for rk_aiq_uapi2_setMEnhanceStrth
479 if (MEnhanceStrth != ENHANCE_DEFAULT_LEVEL) {
480 level_diff = MEnhanceStrth > ENHANCE_DEFAULT_LEVEL
481 ? (MEnhanceStrth - ENHANCE_DEFAULT_LEVEL)
482 : (ENHANCE_DEFAULT_LEVEL - MEnhanceStrth);
483 level_up = MEnhanceStrth > ENHANCE_DEFAULT_LEVEL;
484 if (level_up) {
485 pProcRes->ProcResV11.enhance_value += level_diff * ENHANCE_VALUE_DEFAULT_STEP;
486 } else {
487 pProcRes->ProcResV11.enhance_value -= level_diff * ENHANCE_VALUE_DEFAULT_STEP;
488 }
489 pProcRes->ProcResV11.enhance_value =
490 LIMIT_VALUE(pProcRes->ProcResV11.enhance_value, BIT_14_MAX, BIT_MIN);
491 }
492
493 // add for rk_aiq_uapi2_setMEnhanceChromeStrth
494 if (MEnhanceChromeStrth != ENHANCE_DEFAULT_LEVEL) {
495 level_diff = MEnhanceChromeStrth > ENHANCE_DEFAULT_LEVEL
496 ? (MEnhanceChromeStrth - ENHANCE_DEFAULT_LEVEL)
497 : (ENHANCE_DEFAULT_LEVEL - MEnhanceChromeStrth);
498 level_up = MEnhanceChromeStrth > ENHANCE_DEFAULT_LEVEL;
499 if (level_up) {
500 pProcRes->ProcResV11.enhance_chroma += level_diff * ENHANCE_VALUE_DEFAULT_STEP;
501 } else {
502 pProcRes->ProcResV11.enhance_chroma -= level_diff * ENHANCE_VALUE_DEFAULT_STEP;
503 }
504 pProcRes->ProcResV11.enhance_chroma =
505 LIMIT_VALUE(pProcRes->ProcResV11.enhance_chroma, BIT_14_MAX, BIT_MIN);
506 }
507
508 for (int i = 0; i < DHAZ_V11_ENHANCE_CRUVE_NUM; i++)
509 pProcRes->ProcResV11.enh_curve[i] = (int)(pCalibV11->enhance_setting.enhance_curve[i]);
510
511 if (pProcRes->ProcResV11.dc_en && pProcRes->ProcResV11.enhance_en) {
512 LOGD_ADEHAZE("%s CtrlValue:%f enhance_value:%f enhance_chroma:%f\n", __func__, CtrlValue,
513 pProcRes->ProcResV11.enhance_value / 1024.0f,
514 pProcRes->ProcResV11.enhance_chroma / 1024.0f);
515 LOGD_ADEHAZE("%s enhance_value_reg:0x%x enhance_chroma_reg:0x%x\n", __func__,
516 pProcRes->ProcResV11.enhance_value, pProcRes->ProcResV11.enhance_chroma);
517 }
518
519 LOG1_ADEHAZE("EIXT: %s \n", __func__);
520 }
521
GetHistParamsV11(CalibDbDehazeV11_t * pCalibV11,RkAiqAdehazeProcResult_t * pProcRes,float CtrlValue)522 void GetHistParamsV11(CalibDbDehazeV11_t* pCalibV11, RkAiqAdehazeProcResult_t* pProcRes,
523 float CtrlValue) {
524 LOG1_ADEHAZE("ENTER: %s \n", __func__);
525 int lo = 0, hi = 0;
526 float ratio = GetInterpRatioV11(pCalibV11->hist_setting.HistData.CtrlData, lo, hi, CtrlValue,
527 DHAZ_CTRL_DATA_STEP_MAX);
528
529 pProcRes->ProcResV11.hist_gratio =
530 ClipValueV11(ratio * (pCalibV11->hist_setting.HistData.hist_gratio[hi] -
531 pCalibV11->hist_setting.HistData.hist_gratio[lo]) +
532 pCalibV11->hist_setting.HistData.hist_gratio[lo],
533 5, 3);
534 pProcRes->ProcResV11.hist_th_off =
535 ClipValueV11(ratio * (pCalibV11->hist_setting.HistData.hist_th_off[hi] -
536 pCalibV11->hist_setting.HistData.hist_th_off[lo]) +
537 pCalibV11->hist_setting.HistData.hist_th_off[lo],
538 8, 0);
539 pProcRes->ProcResV11.hist_k =
540 ClipValueV11(ratio * (pCalibV11->hist_setting.HistData.hist_k[hi] -
541 pCalibV11->hist_setting.HistData.hist_k[lo]) +
542 pCalibV11->hist_setting.HistData.hist_k[lo],
543 3, 2);
544 pProcRes->ProcResV11.hist_min =
545 ClipValueV11(ratio * (pCalibV11->hist_setting.HistData.hist_min[hi] -
546 pCalibV11->hist_setting.HistData.hist_min[lo]) +
547 pCalibV11->hist_setting.HistData.hist_min[lo],
548 1, 8);
549 pProcRes->ProcResV11.cfg_gratio =
550 ClipValueV11(ratio * (pCalibV11->hist_setting.HistData.cfg_gratio[hi] -
551 pCalibV11->hist_setting.HistData.cfg_gratio[lo]) +
552 pCalibV11->hist_setting.HistData.cfg_gratio[lo],
553 5, 8);
554 pProcRes->ProcResV11.hist_scale =
555 ClipValueV11(ratio * (pCalibV11->hist_setting.HistData.hist_scale[hi] -
556 pCalibV11->hist_setting.HistData.hist_scale[lo]) +
557 pCalibV11->hist_setting.HistData.hist_scale[lo],
558 5, 8);
559 pProcRes->ProcResV11.hpara_en =
560 pCalibV11->hist_setting.hist_para_en ? FUNCTION_ENABLE : FUNCTION_DISABLE;
561 // clip hpara_en
562 pProcRes->ProcResV11.hpara_en = pProcRes->ProcResV11.dc_en
563 ? pProcRes->ProcResV11.hpara_en
564 : FUNCTION_ENABLE; // dc en �رգ�hpara���迪
565
566 if (pProcRes->ProcResV11.hist_en) {
567 LOGD_ADEHAZE(
568 "%s cfg_alpha:%f CtrlValue:%f hist_para_en:%d hist_gratio:%f hist_th_off:%f hist_k:%f "
569 "hist_min:%f hist_scale:%f cfg_gratio:%f\n",
570 __func__, pProcRes->ProcResV11.cfg_alpha / 255.0f, CtrlValue,
571 pProcRes->ProcResV11.hpara_en, pProcRes->ProcResV11.hist_gratio / 255.0f,
572 pProcRes->ProcResV11.hist_th_off / 1.0f, pProcRes->ProcResV11.hist_k / 4.0f,
573 pProcRes->ProcResV11.hist_min / 256.0f, pProcRes->ProcResV11.hist_scale / 256.0f,
574 pProcRes->ProcResV11.cfg_gratio / 256.0f);
575 LOGD_ADEHAZE(
576 "%s cfg_alpha_reg:0x%x hist_gratio_reg:0x%x hist_th_off_reg:0x%x hist_k_reg:0x%x "
577 "hist_min_reg:0x%x hist_scale_reg:0x%x cfg_gratio_reg:0x%x\n",
578 __func__, pProcRes->ProcResV11.cfg_alpha, pProcRes->ProcResV11.hist_gratio,
579 pProcRes->ProcResV11.hist_th_off, pProcRes->ProcResV11.hist_k,
580 pProcRes->ProcResV11.hist_min, pProcRes->ProcResV11.hist_scale,
581 pProcRes->ProcResV11.cfg_gratio);
582 }
583
584 LOG1_ADEHAZE("EIXT: %s \n", __func__);
585 }
586
587 #ifdef RKAIQ_ENABLE_CAMGROUP
AdehazeGetCurrDataGroup(AdehazeHandle_t * pAdehazeCtx,rk_aiq_singlecam_3a_result_t * pCamgrpParams)588 XCamReturn AdehazeGetCurrDataGroup(AdehazeHandle_t* pAdehazeCtx,
589 rk_aiq_singlecam_3a_result_t* pCamgrpParams) {
590 LOG1_ADEHAZE("%s:enter!\n", __FUNCTION__);
591 XCamReturn ret = XCAM_RETURN_NO_ERROR;
592
593 if (pCamgrpParams) {
594 // get EnvLv
595 if (pCamgrpParams->aec._aePreRes) {
596 RkAiqAlgoPreResAe* pAEPreRes =
597 (RkAiqAlgoPreResAe*)pCamgrpParams->aec._aePreRes->map(pCamgrpParams->aec._aePreRes);
598
599 if (pAEPreRes) {
600 switch (pAdehazeCtx->FrameNumber) {
601 case LINEAR_NUM:
602 pAdehazeCtx->CurrDataV11.EnvLv = pAEPreRes->ae_pre_res_rk.GlobalEnvLv[0];
603 break;
604 case HDR_2X_NUM:
605 pAdehazeCtx->CurrDataV11.EnvLv = pAEPreRes->ae_pre_res_rk.GlobalEnvLv[1];
606 break;
607 case HDR_3X_NUM:
608 pAdehazeCtx->CurrDataV11.EnvLv = pAEPreRes->ae_pre_res_rk.GlobalEnvLv[1];
609 break;
610 default:
611 LOGE_ADEHAZE("%s: Wrong frame number in HDR mode!!!\n", __FUNCTION__);
612 break;
613 }
614
615 // Normalize the current envLv for AEC
616 pAdehazeCtx->CurrDataV11.EnvLv =
617 (pAdehazeCtx->CurrDataV11.EnvLv - MIN_ENV_LV) / (MAX_ENV_LV - MIN_ENV_LV);
618 pAdehazeCtx->CurrDataV11.EnvLv =
619 LIMIT_VALUE(pAdehazeCtx->CurrDataV11.EnvLv, ENVLVMAX, ENVLVMIN);
620 } else {
621 pAdehazeCtx->CurrDataV11.EnvLv = ENVLVMIN;
622 LOGW_ADEHAZE("%s:_aePreRes Res is NULL!\n", __FUNCTION__);
623 }
624 } else {
625 pAdehazeCtx->CurrDataV11.EnvLv = ENVLVMIN;
626 LOGW_ADEHAZE("%s:_aePreRes Res is NULL!\n", __FUNCTION__);
627 }
628
629 // get iso
630 if (pAdehazeCtx->FrameNumber == LINEAR_NUM) {
631 pAdehazeCtx->CurrDataV11.ISO =
632 pCamgrpParams->aec._effAecExpInfo.LinearExp.exp_real_params.analog_gain *
633 pCamgrpParams->aec._effAecExpInfo.LinearExp.exp_real_params.digital_gain *
634 pCamgrpParams->aec._effAecExpInfo.LinearExp.exp_real_params.isp_dgain * ISOMIN;
635 } else if (pAdehazeCtx->FrameNumber == HDR_2X_NUM ||
636 pAdehazeCtx->FrameNumber == HDR_3X_NUM) {
637 pAdehazeCtx->CurrDataV11.ISO =
638 pCamgrpParams->aec._effAecExpInfo.HdrExp[1].exp_real_params.analog_gain *
639 pCamgrpParams->aec._effAecExpInfo.HdrExp[1].exp_real_params.digital_gain *
640 pCamgrpParams->aec._effAecExpInfo.HdrExp[1].exp_real_params.isp_dgain * ISOMIN;
641 }
642 } else {
643 pAdehazeCtx->CurrDataV11.EnvLv = ENVLVMIN;
644 pAdehazeCtx->CurrDataV11.ISO = ISOMIN;
645 LOGW_ADEHAZE("%s: camgroupParmasArray[0] Res is NULL!\n", __FUNCTION__);
646 }
647
648 LOG1_ADEHAZE("%s:exit!\n", __FUNCTION__);
649 return ret;
650 }
651 #endif
AdehazeGetCurrData(AdehazeHandle_t * pAdehazeCtx,RkAiqAlgoProcAdhaz * pProcPara)652 XCamReturn AdehazeGetCurrData(AdehazeHandle_t* pAdehazeCtx, RkAiqAlgoProcAdhaz* pProcPara) {
653 LOG1_ADEHAZE("%s:enter!\n", __FUNCTION__);
654 XCamReturn ret = XCAM_RETURN_NO_ERROR;
655
656 // get EnvLv
657 XCamVideoBuffer* xCamAePreRes = pProcPara->com.u.proc.res_comb->ae_pre_res;
658 if (xCamAePreRes) {
659 RkAiqAlgoPreResAe* pAEPreRes = (RkAiqAlgoPreResAe*)xCamAePreRes->map(xCamAePreRes);
660
661 if (pAEPreRes) {
662 switch (pAdehazeCtx->FrameNumber) {
663 case LINEAR_NUM:
664 pAdehazeCtx->CurrDataV11.EnvLv = pAEPreRes->ae_pre_res_rk.GlobalEnvLv[0];
665 break;
666 case HDR_2X_NUM:
667 pAdehazeCtx->CurrDataV11.EnvLv = pAEPreRes->ae_pre_res_rk.GlobalEnvLv[1];
668 break;
669 case HDR_3X_NUM:
670 pAdehazeCtx->CurrDataV11.EnvLv = pAEPreRes->ae_pre_res_rk.GlobalEnvLv[1];
671 break;
672 default:
673 LOGE_ADEHAZE("%s: Wrong frame number in HDR mode!!!\n", __FUNCTION__);
674 break;
675 }
676 // Normalize the current envLv for AEC
677 pAdehazeCtx->CurrDataV11.EnvLv =
678 (pAdehazeCtx->CurrDataV11.EnvLv - MIN_ENV_LV) / (MAX_ENV_LV - MIN_ENV_LV);
679 pAdehazeCtx->CurrDataV11.EnvLv =
680 LIMIT_VALUE(pAdehazeCtx->CurrDataV11.EnvLv, ENVLVMAX, ENVLVMIN);
681 } else {
682 pAdehazeCtx->CurrDataV11.EnvLv = ENVLVMIN;
683 LOGW_ADEHAZE("%s:PreResBuf is NULL!\n", __FUNCTION__);
684 }
685 } else {
686 pAdehazeCtx->CurrDataV11.EnvLv = ENVLVMIN;
687 LOGW_ADEHAZE("%s:PreResBuf is NULL!\n", __FUNCTION__);
688 }
689
690 // get ISO
691 if (pProcPara->com.u.proc.curExp) {
692 if (pAdehazeCtx->FrameNumber == LINEAR_NUM) {
693 pAdehazeCtx->CurrDataV11.ISO =
694 pProcPara->com.u.proc.curExp->LinearExp.exp_real_params.analog_gain *
695 pProcPara->com.u.proc.curExp->LinearExp.exp_real_params.digital_gain *
696 pProcPara->com.u.proc.curExp->LinearExp.exp_real_params.isp_dgain * ISOMIN;
697 } else if (pAdehazeCtx->FrameNumber == HDR_2X_NUM ||
698 pAdehazeCtx->FrameNumber == HDR_3X_NUM) {
699 pAdehazeCtx->CurrDataV11.ISO =
700 pProcPara->com.u.proc.curExp->HdrExp[1].exp_real_params.analog_gain *
701 pProcPara->com.u.proc.curExp->HdrExp[1].exp_real_params.digital_gain *
702 pProcPara->com.u.proc.curExp->HdrExp[1].exp_real_params.isp_dgain * ISOMIN;
703 }
704 } else {
705 pAdehazeCtx->CurrDataV11.ISO = ISOMIN;
706 LOGW_ADEHAZE("%s:AE cur expo is NULL!\n", __FUNCTION__);
707 }
708
709 LOG1_ADEHAZE("%s:exit!\n", __FUNCTION__);
710 return ret;
711 }
712
AdehazeInit(AdehazeHandle_t ** pAdehazeCtx,CamCalibDbV2Context_t * pCalib)713 XCamReturn AdehazeInit(AdehazeHandle_t** pAdehazeCtx, CamCalibDbV2Context_t* pCalib) {
714 LOG1_ADEHAZE("ENTER: %s \n", __func__);
715 XCamReturn ret = XCAM_RETURN_NO_ERROR;
716 AdehazeHandle_t* handle = (AdehazeHandle_t*)calloc(1, sizeof(AdehazeHandle_t));
717
718 CalibDbV2_dehaze_v11_t* calibv2_adehaze_calib_V21 =
719 (CalibDbV2_dehaze_v11_t*)(CALIBDBV2_GET_MODULE_PTR(pCalib, adehaze_calib));
720 memcpy(&handle->AdehazeAtrrV11.stAuto, calibv2_adehaze_calib_V21,
721 sizeof(CalibDbV2_dehaze_v11_t)); // set default stauto
722 handle->AdehazeAtrrV11.mode = DEHAZE_API_AUTO;
723 handle->AdehazeAtrrV11.Info.MDehazeStrth = DEHAZE_DEFAULT_LEVEL;
724 handle->AdehazeAtrrV11.Info.MEnhanceStrth = ENHANCE_DEFAULT_LEVEL;
725 handle->AdehazeAtrrV11.Info.MEnhanceChromeStrth = ENHANCE_DEFAULT_LEVEL;
726 handle->ifReCalcStAuto = true;
727 handle->ifReCalcStManual = false;
728 handle->isCapture = false;
729 handle->is_multi_isp_mode = false;
730
731 *pAdehazeCtx = handle;
732 LOG1_ADEHAZE("EXIT: %s \n", __func__);
733 return (ret);
734 }
735
AdehazeRelease(AdehazeHandle_t * pAdehazeCtx)736 XCamReturn AdehazeRelease(AdehazeHandle_t* pAdehazeCtx) {
737 LOG1_ADEHAZE("ENTER: %s \n", __func__);
738 XCamReturn ret = XCAM_RETURN_NO_ERROR;
739 if (pAdehazeCtx) free(pAdehazeCtx);
740
741 LOG1_ADEHAZE("EXIT: %s \n", __func__);
742 return (ret);
743 }
744
AdehazeProcess(AdehazeHandle_t * pAdehazeCtx,dehaze_stats_v11_t * pStats,RkAiqAdehazeProcResult_t * pAdehzeProcRes)745 XCamReturn AdehazeProcess(AdehazeHandle_t* pAdehazeCtx, dehaze_stats_v11_t* pStats,
746 RkAiqAdehazeProcResult_t* pAdehzeProcRes) {
747 XCamReturn ret = XCAM_RETURN_NO_ERROR;
748 LOG1_ADEHAZE("ENTER: %s \n", __func__);
749 LOGD_ADEHAZE(" %s: Dehaze module en:%d Dehaze en:%d, Enhance en:%d, Hist en:%d\n", __func__,
750 pAdehzeProcRes->enable,
751 (pAdehzeProcRes->ProcResV11.dc_en & FUNCTION_ENABLE) &&
752 (!(pAdehzeProcRes->ProcResV11.enhance_en & FUNCTION_ENABLE)),
753 (pAdehzeProcRes->ProcResV11.dc_en & FUNCTION_ENABLE) &&
754 (pAdehzeProcRes->ProcResV11.enhance_en & FUNCTION_ENABLE),
755 pAdehzeProcRes->ProcResV11.hist_en);
756
757 if (pAdehazeCtx->AdehazeAtrrV11.mode == DEHAZE_API_AUTO) {
758 float CtrlValue = pAdehazeCtx->CurrDataV11.EnvLv;
759 if (pAdehazeCtx->CurrDataV11.CtrlDataType == CTRLDATATYPE_ISO)
760 CtrlValue = pAdehazeCtx->CurrDataV11.ISO;
761
762 // cfg setting
763 pAdehzeProcRes->ProcResV11.cfg_alpha =
764 LIMIT_VALUE(SHIFT8BIT(pAdehazeCtx->AdehazeAtrrV11.stAuto.DehazeTuningPara.cfg_alpha),
765 BIT_8_MAX, BIT_MIN);
766
767 // dehaze setting
768 if (pAdehazeCtx->AdehazeAtrrV11.stAuto.DehazeTuningPara.dehaze_setting.en ||
769 pAdehazeCtx->AdehazeAtrrV11.stAuto.DehazeTuningPara.enhance_setting.en ||
770 (pAdehazeCtx->AdehazeAtrrV11.stAuto.DehazeTuningPara.hist_setting.en &&
771 !pAdehazeCtx->AdehazeAtrrV11.stAuto.DehazeTuningPara.hist_setting.hist_para_en))
772 GetDehazeParamsV11(&pAdehazeCtx->AdehazeAtrrV11.stAuto.DehazeTuningPara, pAdehzeProcRes,
773 pAdehazeCtx->width, pAdehazeCtx->height,
774 pAdehazeCtx->AdehazeAtrrV11.Info.MDehazeStrth, CtrlValue);
775
776 // enhance setting
777 if (pAdehazeCtx->AdehazeAtrrV11.stAuto.DehazeTuningPara.enhance_setting.en)
778 GetEnhanceParamsV11(&pAdehazeCtx->AdehazeAtrrV11.stAuto.DehazeTuningPara,
779 pAdehzeProcRes, pAdehazeCtx->AdehazeAtrrV11.Info.MEnhanceStrth,
780 pAdehazeCtx->AdehazeAtrrV11.Info.MEnhanceChromeStrth, CtrlValue);
781
782 // hist setting
783 if (pAdehazeCtx->AdehazeAtrrV11.stAuto.DehazeTuningPara.hist_setting.en)
784 GetHistParamsV11(&pAdehazeCtx->AdehazeAtrrV11.stAuto.DehazeTuningPara, pAdehzeProcRes,
785 CtrlValue);
786 } else if (pAdehazeCtx->AdehazeAtrrV11.mode == DEHAZE_API_MANUAL) {
787 // cfg setting
788 pAdehzeProcRes->ProcResV11.cfg_alpha = LIMIT_VALUE(
789 SHIFT8BIT(pAdehazeCtx->AdehazeAtrrV11.stManual.cfg_alpha), BIT_8_MAX, BIT_MIN);
790
791 // dehaze setting
792 if (pAdehazeCtx->AdehazeAtrrV11.stManual.dehaze_setting.en ||
793 pAdehazeCtx->AdehazeAtrrV11.stManual.enhance_setting.en ||
794 (pAdehazeCtx->AdehazeAtrrV11.stManual.hist_setting.en &&
795 !pAdehazeCtx->AdehazeAtrrV11.stManual.hist_setting.hist_para_en))
796 stManuGetDehazeParamsV11(&pAdehazeCtx->AdehazeAtrrV11.stManual, pAdehzeProcRes,
797 pAdehazeCtx->width, pAdehazeCtx->height,
798 pAdehazeCtx->AdehazeAtrrV11.Info.MDehazeStrth);
799
800 // enhance setting
801 if (pAdehazeCtx->AdehazeAtrrV11.stManual.enhance_setting.en)
802 stManuGetEnhanceParamsV11(&pAdehazeCtx->AdehazeAtrrV11.stManual, pAdehzeProcRes,
803 pAdehazeCtx->AdehazeAtrrV11.Info.MEnhanceStrth,
804 pAdehazeCtx->AdehazeAtrrV11.Info.MEnhanceChromeStrth);
805
806 // hist setting
807 if (pAdehazeCtx->AdehazeAtrrV11.stManual.hist_setting.en)
808 stManuGetHistParamsV11(&pAdehazeCtx->AdehazeAtrrV11.stManual, pAdehzeProcRes);
809 } else
810 LOGE_ADEHAZE("%s:Wrong Adehaze API mode!!! \n", __func__);
811
812 // store pre data
813 pAdehazeCtx->PreDataV11.EnvLv = pAdehazeCtx->CurrDataV11.EnvLv;
814 pAdehazeCtx->PreDataV11.ISO = pAdehazeCtx->CurrDataV11.ISO;
815 pAdehazeCtx->PreDataV11.ApiMode = pAdehazeCtx->CurrDataV11.ApiMode;
816
817 LOG1_ADEHAZE("EXIT: %s \n", __func__);
818 return ret;
819 }
820
AdehazeByPassProcessing(AdehazeHandle_t * pAdehazeCtx)821 bool AdehazeByPassProcessing(AdehazeHandle_t* pAdehazeCtx) {
822 LOG1_ADEHAZE("ENTER: %s \n", __func__);
823 bool byPassProc = true;
824
825 pAdehazeCtx->CurrDataV11.CtrlDataType =
826 pAdehazeCtx->AdehazeAtrrV11.stAuto.DehazeTuningPara.CtrlDataType;
827
828 if (pAdehazeCtx->FrameID <= INIT_CALC_PARAMS_NUM)
829 byPassProc = false;
830 else if (pAdehazeCtx->AdehazeAtrrV11.mode != pAdehazeCtx->PreDataV11.ApiMode)
831 byPassProc = false;
832 else if (pAdehazeCtx->AdehazeAtrrV11.mode == DEHAZE_API_MANUAL)
833 byPassProc = !pAdehazeCtx->ifReCalcStManual;
834 else if (pAdehazeCtx->AdehazeAtrrV11.mode == DEHAZE_API_AUTO) {
835 float diff = 0.0f;
836 if (pAdehazeCtx->CurrDataV11.CtrlDataType == CTRLDATATYPE_ENVLV) {
837 diff = pAdehazeCtx->PreDataV11.EnvLv - pAdehazeCtx->CurrDataV11.EnvLv;
838 if (pAdehazeCtx->PreDataV11.EnvLv <= FLT_EPSILON) {
839 diff = pAdehazeCtx->CurrDataV11.EnvLv;
840 if (diff <= FLT_EPSILON)
841 byPassProc = true;
842 else
843 byPassProc = false;
844 } else {
845 diff /= pAdehazeCtx->PreDataV11.EnvLv;
846 if (diff >= pAdehazeCtx->AdehazeAtrrV11.stAuto.DehazeTuningPara.ByPassThr ||
847 diff <= -pAdehazeCtx->AdehazeAtrrV11.stAuto.DehazeTuningPara.ByPassThr)
848 byPassProc = false;
849 else
850 byPassProc = true;
851 }
852 } else if (pAdehazeCtx->CurrDataV11.CtrlDataType == CTRLDATATYPE_ISO) {
853 diff = pAdehazeCtx->PreDataV11.ISO - pAdehazeCtx->CurrDataV11.ISO;
854 diff /= pAdehazeCtx->PreDataV11.ISO;
855 if (diff >= pAdehazeCtx->AdehazeAtrrV11.stAuto.DehazeTuningPara.ByPassThr ||
856 diff <= -pAdehazeCtx->AdehazeAtrrV11.stAuto.DehazeTuningPara.ByPassThr)
857 byPassProc = false;
858 else
859 byPassProc = true;
860 }
861 byPassProc = byPassProc && !pAdehazeCtx->ifReCalcStAuto;
862 }
863
864 LOGD_ADEHAZE(
865 "%s:FrameID:%d DehazeApiMode:%d ifReCalcStAuto:%d ifReCalcStManual:%d CtrlDataType:%d "
866 "EnvLv:%f ISO:%f byPassProc:%d\n",
867 __func__, pAdehazeCtx->FrameID, pAdehazeCtx->AdehazeAtrrV11.mode,
868 pAdehazeCtx->ifReCalcStAuto, pAdehazeCtx->ifReCalcStManual,
869 pAdehazeCtx->CurrDataV11.CtrlDataType, pAdehazeCtx->CurrDataV11.EnvLv,
870 pAdehazeCtx->CurrDataV11.ISO, byPassProc);
871
872 LOG1_ADEHAZE("EXIT: %s \n", __func__);
873 return byPassProc;
874 }
875 /******************************************************************************
876 * DehazeEnableSetting()
877 *
878 *****************************************************************************/
DehazeEnableSetting(AdehazeHandle_t * pAdehazeCtx,RkAiqAdehazeProcResult_t * pAdehzeProcRes)879 bool DehazeEnableSetting(AdehazeHandle_t* pAdehazeCtx, RkAiqAdehazeProcResult_t* pAdehzeProcRes) {
880 LOG1_ADEHAZE("%s:enter!\n", __FUNCTION__);
881
882 if (pAdehazeCtx->AdehazeAtrrV11.mode == DEHAZE_API_AUTO) {
883 pAdehzeProcRes->enable = pAdehazeCtx->AdehazeAtrrV11.stAuto.DehazeTuningPara.Enable;
884
885 if (pAdehazeCtx->AdehazeAtrrV11.stAuto.DehazeTuningPara.Enable) {
886 if (pAdehazeCtx->AdehazeAtrrV11.stAuto.DehazeTuningPara.dehaze_setting.en &&
887 pAdehazeCtx->AdehazeAtrrV11.stAuto.DehazeTuningPara.enhance_setting.en) {
888 pAdehzeProcRes->ProcResV11.dc_en = FUNCTION_ENABLE;
889 pAdehzeProcRes->ProcResV11.enhance_en = FUNCTION_ENABLE;
890 } else if (pAdehazeCtx->AdehazeAtrrV11.stAuto.DehazeTuningPara.dehaze_setting.en &&
891 !pAdehazeCtx->AdehazeAtrrV11.stAuto.DehazeTuningPara.enhance_setting.en) {
892 pAdehzeProcRes->ProcResV11.dc_en = FUNCTION_ENABLE;
893 pAdehzeProcRes->ProcResV11.enhance_en = FUNCTION_DISABLE;
894 } else if (!pAdehazeCtx->AdehazeAtrrV11.stAuto.DehazeTuningPara.dehaze_setting.en &&
895 pAdehazeCtx->AdehazeAtrrV11.stAuto.DehazeTuningPara.enhance_setting.en) {
896 pAdehzeProcRes->ProcResV11.dc_en = FUNCTION_ENABLE;
897 pAdehzeProcRes->ProcResV11.enhance_en = FUNCTION_ENABLE;
898 } else {
899 pAdehzeProcRes->ProcResV11.dc_en = FUNCTION_DISABLE;
900 pAdehzeProcRes->ProcResV11.enhance_en = FUNCTION_DISABLE;
901 }
902
903 if (pAdehazeCtx->AdehazeAtrrV11.stAuto.DehazeTuningPara.hist_setting.en)
904 pAdehzeProcRes->ProcResV11.hist_en = FUNCTION_ENABLE;
905 else
906 pAdehzeProcRes->ProcResV11.hist_en = FUNCTION_DISABLE;
907 }
908 } else if (pAdehazeCtx->AdehazeAtrrV11.mode == DEHAZE_API_MANUAL) {
909 pAdehzeProcRes->enable = pAdehazeCtx->AdehazeAtrrV11.stManual.Enable;
910
911 if (pAdehazeCtx->AdehazeAtrrV11.stManual.Enable) {
912 if (pAdehazeCtx->AdehazeAtrrV11.stManual.dehaze_setting.en &&
913 pAdehazeCtx->AdehazeAtrrV11.stManual.enhance_setting.en) {
914 pAdehzeProcRes->ProcResV11.dc_en = FUNCTION_ENABLE;
915 pAdehzeProcRes->ProcResV11.enhance_en = FUNCTION_ENABLE;
916 } else if (pAdehazeCtx->AdehazeAtrrV11.stManual.dehaze_setting.en &&
917 !pAdehazeCtx->AdehazeAtrrV11.stManual.enhance_setting.en) {
918 pAdehzeProcRes->ProcResV11.dc_en = FUNCTION_ENABLE;
919 pAdehzeProcRes->ProcResV11.enhance_en = FUNCTION_DISABLE;
920 } else if (!pAdehazeCtx->AdehazeAtrrV11.stManual.dehaze_setting.en &&
921 pAdehazeCtx->AdehazeAtrrV11.stManual.enhance_setting.en) {
922 pAdehzeProcRes->ProcResV11.dc_en = FUNCTION_ENABLE;
923 pAdehzeProcRes->ProcResV11.enhance_en = FUNCTION_ENABLE;
924 } else {
925 pAdehzeProcRes->ProcResV11.dc_en = FUNCTION_DISABLE;
926 pAdehzeProcRes->ProcResV11.enhance_en = FUNCTION_DISABLE;
927 }
928
929 if (pAdehazeCtx->AdehazeAtrrV11.stManual.hist_setting.en)
930 pAdehzeProcRes->ProcResV11.hist_en = FUNCTION_ENABLE;
931 else
932 pAdehzeProcRes->ProcResV11.hist_en = FUNCTION_DISABLE;
933 }
934 } else {
935 LOGE_ADEHAZE("%s: Dehaze api in WRONG MODE!!!, dehaze by pass!!!\n", __FUNCTION__);
936 pAdehzeProcRes->enable = false;
937 }
938
939 return pAdehzeProcRes->enable;
940 LOG1_ADEHAZE("%s:exit!\n", __FUNCTION__);
941 }
942