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