xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/algos/adrc/rk_aiq_adrc_algo_v12.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /******************************************************************************
2  *
3  * Copyright 2019, Fuzhou Rockchip Electronics Co.Ltd. All rights reserved.
4  * No part of this work may be reproduced, modified, distributed, transmitted,
5  * transcribed, or translated into any language or computer format, in any form
6  * or by any means without written permission of:
7  * Fuzhou Rockchip Electronics Co.Ltd .
8  *
9  *
10  *****************************************************************************/
11 /**
12  * @file rk_aiq_adrc_algo_v12.cpp
13  *
14  * @brief
15  *   ADD_DESCRIPTION_HERE
16  *
17  *****************************************************************************/
18 #include "math.h"
19 #include "rk_aiq_types_adrc_algo_prvt.h"
20 #include "xcam_log.h"
21 
22 /******************************************************************************
23  * AdrcStart()
24  *****************************************************************************/
AdrcStart(AdrcContext_t * pAdrcCtx)25 XCamReturn AdrcStart(AdrcContext_t* pAdrcCtx) {
26     LOG1_ATMO("%s:enter!\n", __FUNCTION__);
27 
28     // initial checks
29     if (pAdrcCtx == NULL) {
30         return (XCAM_RETURN_ERROR_MEM);
31     }
32 
33     if ((ADRC_STATE_RUNNING == pAdrcCtx->state) || (ADRC_STATE_LOCKED == pAdrcCtx->state)) {
34         return (XCAM_RETURN_ERROR_PARAM);
35     }
36 
37     pAdrcCtx->state = ADRC_STATE_RUNNING;
38 
39     LOG1_ATMO("%s:exit!\n", __FUNCTION__);
40     return (XCAM_RETURN_NO_ERROR);
41 }
42 
DrcGetInterpRatioV12(float * pX,int lo,int hi,float CtrlValue,int length_max)43 float DrcGetInterpRatioV12(float* pX, int lo, int hi, float CtrlValue, int length_max) {
44     float ratio = 0.0f;
45 
46     if (CtrlValue < pX[0]) {
47         lo    = 0;
48         hi    = 0;
49         ratio = 0.0f;
50     } else if (CtrlValue >= pX[length_max - 1]) {
51         lo    = length_max - 1;
52         hi    = length_max - 1;
53         ratio = 0.0f;
54     } else {
55         for (int i = 0; i < length_max - 1; i++) {
56             if (CtrlValue >= pX[i] && CtrlValue < pX[i + 1]) {
57                 lo    = i;
58                 hi    = i + 1;
59                 ratio = (CtrlValue - pX[i]) / (pX[i + 1] - pX[i]);
60                 break;
61             } else
62                 continue;
63         }
64     }
65 
66     return ratio;
67 }
68 
69 /******************************************************************************
70  * AdrcStop()
71  *****************************************************************************/
AdrcStop(AdrcContext_t * pAdrcCtx)72 XCamReturn AdrcStop(AdrcContext_t* pAdrcCtx) {
73     LOG1_ATMO("%s:enter!\n", __FUNCTION__);
74 
75     // initial checks
76     if (pAdrcCtx == NULL) {
77         return (XCAM_RETURN_ERROR_MEM);
78     }
79 
80     // before stopping, unlock the AHDR if locked
81     if (ADRC_STATE_LOCKED == pAdrcCtx->state) {
82         return (XCAM_RETURN_ERROR_PARAM);
83     }
84 
85     pAdrcCtx->state = ADRC_STATE_STOPPED;
86 
87     LOG1_ATMO("%s:exit!\n", __FUNCTION__);
88 
89     return (XCAM_RETURN_NO_ERROR);
90 }
91 
AdrcV12ClipStAutoParams(AdrcContext_t * pAdrcCtx)92 void AdrcV12ClipStAutoParams(AdrcContext_t* pAdrcCtx) {
93     LOG1_ATMO("%s:enter!\n", __FUNCTION__);
94 
95     for (int i = 0; i < ADRC_ENVLV_STEP_MAX; i++) {
96         pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.DrcGain.DrcGain[i] = LIMIT_VALUE(
97             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.DrcGain.DrcGain[i], DRCGAINMAX, DRCGAINMIN);
98         pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.DrcGain.Alpha[i] =
99             LIMIT_VALUE(pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.DrcGain.Alpha[i], NORMALIZE_MAX,
100                         NORMALIZE_MIN);
101         pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.DrcGain.Clip[i] = LIMIT_VALUE(
102             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.DrcGain.Clip[i], CLIPMAX, CLIPMIN);
103 
104         pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.HiLight.HiLightData.Strength[i] =
105             LIMIT_VALUE(pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.HiLight.HiLightData.Strength[i],
106                         NORMALIZE_MAX, NORMALIZE_MIN);
107         pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.HiLight.HiLightData.gas_t[i] =
108             LIMIT_VALUE(pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.HiLight.HiLightData.gas_t[i],
109                         GAS_T_MAX, GAS_T_MIN);
110 
111         pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.LocalData.LocalWeit[i] = LIMIT_VALUE(
112             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.LocalData.LocalWeit[i],
113             NORMALIZE_MAX, NORMALIZE_MIN);
114         pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.LocalData.GlobalContrast[i] =
115             LIMIT_VALUE(
116                 pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.LocalData.GlobalContrast[i],
117                 NORMALIZE_MAX, NORMALIZE_MIN);
118         pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.LocalData.LoLitContrast[i] =
119             LIMIT_VALUE(
120                 pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.LocalData.LoLitContrast[i],
121                 NORMALIZE_MAX, NORMALIZE_MIN);
122         pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.LocalData.LocalAutoEnable[i] =
123             LIMIT_VALUE(
124                 pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.LocalData.LocalAutoEnable[i],
125                 NORMALIZE_MAX, NORMALIZE_MIN);
126         pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.LocalData.LocalAutoWeit[i] =
127             LIMIT_VALUE(
128                 pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.LocalData.LocalAutoWeit[i],
129                 NORMALIZE_MAX, NORMALIZE_MIN);
130 
131         pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.MotionData.MotionCoef[i] =
132             LIMIT_VALUE(
133                 pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.MotionData.MotionCoef[i],
134                 NORMALIZE_MAX, NORMALIZE_MIN);
135         pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.MotionData.MotionStr[i] =
136             LIMIT_VALUE(
137                 pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.MotionData.MotionStr[i],
138                 NORMALIZE_MAX, NORMALIZE_MIN);
139     }
140 
141     pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.curPixWeit =
142         LIMIT_VALUE(pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.curPixWeit,
143                     NORMALIZE_MAX, NORMALIZE_MIN);
144 
145 #if RKAIQ_HAVE_DRC_V12
146     pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.preFrameWeit =
147         LIMIT_VALUE(pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.preFrameWeit,
148                     NORMALIZE_MAX, NORMALIZE_MIN);
149     pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.Range_sgm_pre =
150         LIMIT_VALUE(pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.Range_sgm_pre,
151                     NORMALIZE_MAX, NORMALIZE_MIN);
152     pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.Space_sgm_pre =
153         LIMIT_VALUE(pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.Space_sgm_pre,
154                     SPACESGMMAX, SPACESGMMIN);
155 #endif
156     pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.Range_force_sgm =
157         LIMIT_VALUE(pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.Range_force_sgm,
158                     NORMALIZE_MAX, NORMALIZE_MIN);
159     pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.Range_sgm_cur =
160         LIMIT_VALUE(pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.Range_sgm_cur,
161                     NORMALIZE_MAX, NORMALIZE_MIN);
162     pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.Space_sgm_cur =
163         LIMIT_VALUE(pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.Space_sgm_cur,
164                     SPACESGMMAX, SPACESGMMIN);
165     for (int i = 0; i < ADRC_Y_NUM; i++) {
166         pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.CompressSetting.Manual_curve[i] =
167             LIMIT_VALUE(pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.CompressSetting.Manual_curve[i],
168                         SCALEYMAX, SCALEYMIN);
169         pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.Scale_y[i] =
170             LIMIT_VALUE(pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.Scale_y[i], SCALEYMAX, SCALEYMIN);
171     }
172 
173     pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.ByPassThr = LIMIT_VALUE(
174         pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.ByPassThr, NORMALIZE_MAX, NORMALIZE_MIN);
175     pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.Edge_Weit = LIMIT_VALUE(
176         pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.Edge_Weit, NORMALIZE_MAX, NORMALIZE_MIN);
177     pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.IIR_frame =
178         LIMIT_VALUE(pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.IIR_frame, IIRFRAMEMAX, IIRFRAMEMIN);
179     pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.damp =
180         LIMIT_VALUE(pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.damp, NORMALIZE_MAX, NORMALIZE_MIN);
181 
182     // drc v12 add
183     pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.HiLight.gas_l0 =
184         LIMIT_VALUE(pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.HiLight.gas_l0, GAS_L_MAX, GAS_L_MIN);
185     pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.HiLight.gas_l1 =
186         LIMIT_VALUE(pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.HiLight.gas_l1, GAS_L_MAX, GAS_L_MIN);
187     pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.HiLight.gas_l2 =
188         LIMIT_VALUE(pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.HiLight.gas_l2, GAS_L_MAX, GAS_L_MIN);
189     pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.HiLight.gas_l3 =
190         LIMIT_VALUE(pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.HiLight.gas_l3, GAS_L_MAX, GAS_L_MIN);
191 
192     LOG1_ATMO("%s:exit!\n", __FUNCTION__);
193 }
194 
195 /******************************************************************************
196  * CalibrateDrcGainYV12()
197  *****************************************************************************/
CalibrateDrcGainYV12(DrcProcRes_t * para,float DrcGain,bool obEnable,float predgain,float alpha)198 void CalibrateDrcGainYV12(DrcProcRes_t* para, float DrcGain, bool obEnable, float predgain,
199                           float alpha) {
200     LOG1_ATMO("%s:Enter!\n", __FUNCTION__);
201 
202     float tmp = 0.0f;
203     /*luma[i] = pow((1.0f - luma[i] / 4096.0f), 2.0f)*/
204     float luma[DRC_V12_Y_NUM] = {1.0f,    0.8789f, 0.7656f, 0.6602f, 0.5625f, 0.4727f,
205                                  0.3906f, 0.3164f, 0.2500f, 0.1914f, 0.1406f, 0.0977f,
206                                  0.0625f, 0.0352f, 0.0156f, 0.0039f, 0.0f};
207 
208     for (int i = 0; i < DRC_V12_Y_NUM; ++i) {
209         tmp = 1 - alpha * luma[i];
210         if (obEnable)
211             tmp = 1024.0f * pow(DrcGain * predgain, tmp);
212         else
213             tmp = 1024.0f * pow(DrcGain, tmp);
214         para->Drc_v12.gain_y[i] = (unsigned short)(tmp);
215     }
216 
217     LOG1_ATMO("%s:Eixt!\n", __FUNCTION__);
218 }
219 
220 /******************************************************************************
221  * DrcEnableSetting()
222  *
223  *****************************************************************************/
DrcEnableSetting(AdrcContext_t * pAdrcCtx,RkAiqAdrcProcResult_t * pAdrcProcRes)224 bool DrcEnableSetting(AdrcContext_t* pAdrcCtx, RkAiqAdrcProcResult_t* pAdrcProcRes) {
225     LOG1_ATMO("%s:enter!\n", __FUNCTION__);
226 
227     if (pAdrcCtx->FrameNumber == HDR_2X_NUM || pAdrcCtx->FrameNumber == HDR_3X_NUM)
228         pAdrcProcRes->bDrcEn = true;
229     else if (pAdrcCtx->FrameNumber == LINEAR_NUM) {
230         if (pAdrcCtx->ablcV32_proc_res.blc_ob_enable)
231             pAdrcProcRes->bDrcEn = true;
232         else {
233             if (pAdrcCtx->drcAttrV12.opMode == DRC_OPMODE_AUTO) {
234                 pAdrcProcRes->bDrcEn = pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.Enable;
235             } else if (pAdrcCtx->drcAttrV12.opMode == DRC_OPMODE_MANUAL) {
236                 pAdrcProcRes->bDrcEn = pAdrcCtx->drcAttrV12.stManual.Enable;
237             } else {
238                 LOGE_ATMO("%s: Drc api in WRONG MODE!!!, drc by pass!!!\n", __FUNCTION__);
239                 pAdrcProcRes->bDrcEn = false;
240             }
241         }
242     }
243     // store bDrcEn for AdrcV12Params2Api
244     pAdrcCtx->NextData.bDrcEn = pAdrcProcRes->bDrcEn;
245 
246     LOG1_ATMO("%s:exit!\n", __FUNCTION__);
247     return pAdrcProcRes->bDrcEn;
248 }
249 /******************************************************************************
250  * AdrcDampingV12()
251  *****************************************************************************/
AdrcDampingV12(NextData_t * pNextData,CurrData_t * pCurrData,int FrameID,CtrlDataType_t CtrlDataType)252 bool AdrcDampingV12(NextData_t* pNextData, CurrData_t* pCurrData, int FrameID,
253                     CtrlDataType_t CtrlDataType) {
254     LOG1_ATMO("%s:Enter!\n", __FUNCTION__);
255     bool isDampStable = false;
256 
257     if (FrameID > INIT_CALC_PARAMS_NUM) {
258         bool isDampStable_DrcGain = false, isDampStable_Alpha = false, isDampStable_Clip = false,
259              isDampStable_Strength = false, isDampStable_LocalWeit = false,
260              isDampStable_LocalAutoWeit = false, isDampStable_GlobalContrast = false,
261              isDampStable_LoLitContrast = false, isDampStable_gas_t = false,
262              isDampStable_MotionStr = false;
263 
264         if ((pNextData->dynParams.Drc_v12.DrcGain - pCurrData->dynParams.Drc_v12.DrcGain) <=
265                 DAMP_STABLE_THR &&
266             (pNextData->dynParams.Drc_v12.DrcGain - pCurrData->dynParams.Drc_v12.DrcGain) >=
267                 -DAMP_STABLE_THR) {
268             isDampStable_DrcGain = true;
269         } else {
270             pNextData->dynParams.Drc_v12.DrcGain =
271                 pNextData->staticParams.damp * pNextData->dynParams.Drc_v12.DrcGain +
272                 (1.0f - pNextData->staticParams.damp) * pCurrData->dynParams.Drc_v12.DrcGain;
273             isDampStable_DrcGain = false;
274         }
275         if ((pNextData->dynParams.Drc_v12.Alpha - pCurrData->dynParams.Drc_v12.Alpha) <=
276                 DAMP_STABLE_THR &&
277             (pNextData->dynParams.Drc_v12.Alpha - pCurrData->dynParams.Drc_v12.Alpha) >=
278                 -DAMP_STABLE_THR) {
279             isDampStable_Alpha = true;
280         } else {
281             pNextData->dynParams.Drc_v12.Alpha =
282                 pNextData->staticParams.damp * pNextData->dynParams.Drc_v12.Alpha +
283                 (1.0f - pNextData->staticParams.damp) * pCurrData->dynParams.Drc_v12.Alpha;
284             isDampStable_Alpha = false;
285         }
286         if ((pNextData->dynParams.Drc_v12.Clip - pCurrData->dynParams.Drc_v12.Clip) <=
287                 DAMP_STABLE_THR &&
288             (pNextData->dynParams.Drc_v12.Clip - pCurrData->dynParams.Drc_v12.Clip) >=
289                 -DAMP_STABLE_THR) {
290             isDampStable_Clip = true;
291         } else {
292             pNextData->dynParams.Drc_v12.Clip =
293                 pNextData->staticParams.damp * pNextData->dynParams.Drc_v12.Clip +
294                 (1.0f - pNextData->staticParams.damp) * pCurrData->dynParams.Drc_v12.Clip;
295             isDampStable_Clip = false;
296         }
297         if ((pNextData->dynParams.Drc_v12.Strength - pCurrData->dynParams.Drc_v12.Strength) <=
298                 DAMP_STABLE_THR &&
299             (pNextData->dynParams.Drc_v12.Strength - pCurrData->dynParams.Drc_v12.Strength) >=
300                 -DAMP_STABLE_THR) {
301             isDampStable_Strength = true;
302         } else {
303             pNextData->dynParams.Drc_v12.Strength =
304                 pNextData->staticParams.damp * pNextData->dynParams.Drc_v12.Strength +
305                 (1.0f - pNextData->staticParams.damp) * pCurrData->dynParams.Drc_v12.Strength;
306             isDampStable_Strength = false;
307         }
308         if ((pNextData->dynParams.Drc_v12.LocalWeit - pCurrData->dynParams.Drc_v12.LocalWeit) <=
309                 DAMP_STABLE_THR &&
310             (pNextData->dynParams.Drc_v12.LocalWeit - pCurrData->dynParams.Drc_v12.LocalWeit) >=
311                 -DAMP_STABLE_THR) {
312             isDampStable_LocalWeit = true;
313         } else {
314             pNextData->dynParams.Drc_v12.LocalWeit =
315                 pNextData->staticParams.damp * pNextData->dynParams.Drc_v12.LocalWeit +
316                 (1.0f - pNextData->staticParams.damp) * pCurrData->dynParams.Drc_v12.LocalWeit;
317             isDampStable_LocalWeit = false;
318         }
319         if ((pNextData->dynParams.Drc_v12.LocalAutoWeit -
320              pCurrData->dynParams.Drc_v12.LocalAutoWeit) <= DAMP_STABLE_THR &&
321             (pNextData->dynParams.Drc_v12.LocalAutoWeit -
322              pCurrData->dynParams.Drc_v12.LocalAutoWeit) >= -DAMP_STABLE_THR) {
323             isDampStable_LocalAutoWeit = true;
324         } else {
325             pNextData->dynParams.Drc_v12.LocalAutoWeit =
326                 pNextData->staticParams.damp * pNextData->dynParams.Drc_v12.LocalAutoWeit +
327                 (1.0f - pNextData->staticParams.damp) * pCurrData->dynParams.Drc_v12.LocalAutoWeit;
328             isDampStable_LocalAutoWeit = false;
329         }
330         if ((pNextData->dynParams.Drc_v12.GlobalContrast -
331              pCurrData->dynParams.Drc_v12.GlobalContrast) <= DAMP_STABLE_THR &&
332             (pNextData->dynParams.Drc_v12.GlobalContrast -
333              pCurrData->dynParams.Drc_v12.GlobalContrast) >= -DAMP_STABLE_THR) {
334             isDampStable_GlobalContrast = true;
335         } else {
336             pNextData->dynParams.Drc_v12.GlobalContrast =
337                 pNextData->staticParams.damp * pNextData->dynParams.Drc_v12.GlobalContrast +
338                 (1.0f - pNextData->staticParams.damp) * pCurrData->dynParams.Drc_v12.GlobalContrast;
339             isDampStable_GlobalContrast = false;
340         }
341         if ((pNextData->dynParams.Drc_v12.LoLitContrast -
342              pCurrData->dynParams.Drc_v12.LoLitContrast) <= DAMP_STABLE_THR &&
343             (pNextData->dynParams.Drc_v12.LoLitContrast -
344              pCurrData->dynParams.Drc_v12.LoLitContrast) >= -DAMP_STABLE_THR) {
345             isDampStable_LoLitContrast = true;
346         } else {
347             pNextData->dynParams.Drc_v12.LoLitContrast =
348                 pNextData->staticParams.damp * pNextData->dynParams.Drc_v12.LoLitContrast +
349                 (1.0f - pNextData->staticParams.damp) * pCurrData->dynParams.Drc_v12.LoLitContrast;
350             isDampStable_LoLitContrast = false;
351         }
352         // drc v12
353         if ((pNextData->dynParams.Drc_v12.gas_t - pCurrData->dynParams.Drc_v12.gas_t) <=
354                 DAMP_STABLE_THR &&
355             (pNextData->dynParams.Drc_v12.gas_t - pCurrData->dynParams.Drc_v12.gas_t) >=
356                 -DAMP_STABLE_THR) {
357             isDampStable_gas_t = true;
358         } else {
359             pNextData->dynParams.Drc_v12.gas_t =
360                 pNextData->staticParams.damp * pNextData->dynParams.Drc_v12.gas_t +
361                 (1.0f - pNextData->staticParams.damp) * pCurrData->dynParams.Drc_v12.gas_t;
362             isDampStable_gas_t = false;
363         }
364         if ((pNextData->dynParams.Drc_v12.MotionStr - pCurrData->dynParams.Drc_v12.MotionStr) <=
365                 DAMP_STABLE_THR &&
366             (pNextData->dynParams.Drc_v12.MotionStr - pCurrData->dynParams.Drc_v12.MotionStr) >=
367                 -DAMP_STABLE_THR) {
368             isDampStable_MotionStr = true;
369         } else {
370             pNextData->dynParams.Drc_v12.MotionStr =
371                 pNextData->staticParams.damp * pNextData->dynParams.Drc_v12.MotionStr +
372                 (1.0f - pNextData->staticParams.damp) * pCurrData->dynParams.Drc_v12.MotionStr;
373             isDampStable_MotionStr = false;
374         }
375         isDampStable = isDampStable_DrcGain && isDampStable_Alpha && isDampStable_Clip &&
376                        isDampStable_Strength && isDampStable_LocalWeit &&
377                        isDampStable_LocalAutoWeit && isDampStable_GlobalContrast &&
378                        isDampStable_LoLitContrast && isDampStable_gas_t && isDampStable_MotionStr;
379     } else
380         isDampStable = false;
381 
382     LOG1_ATMO("%s:Eixt!\n", __FUNCTION__);
383     return isDampStable;
384 }
385 
386 /******************************************************************************
387  * AdrcGetTuningProcResV12()
388  *****************************************************************************/
AdrcGetTuningProcResV12(AdrcContext_t * pAdrcCtx,RkAiqAdrcProcResult_t * pAdrcProcRes)389 void AdrcGetTuningProcResV12(AdrcContext_t* pAdrcCtx, RkAiqAdrcProcResult_t* pAdrcProcRes) {
390     LOG1_ATMO("%s:enter!\n", __FUNCTION__);
391 
392     pAdrcProcRes->DrcProcRes.Drc_v12.gas_t =
393         (unsigned short)(SHIFT11BIT(pAdrcCtx->NextData.dynParams.Drc_v12.gas_t) + 0.5);
394     pAdrcProcRes->DrcProcRes.Drc_v12.gas_t =
395         LIMIT_VALUE_UNSIGNED(pAdrcProcRes->DrcProcRes.Drc_v12.gas_t, INT13BITMAX);
396     pAdrcProcRes->DrcProcRes.Drc_v12.position =
397         (unsigned short)(SHIFT8BIT(pAdrcCtx->NextData.dynParams.Drc_v12.Clip) + 0.5f);
398     pAdrcProcRes->DrcProcRes.Drc_v12.hpdetail_ratio = LIMIT_VALUE_UNSIGNED(
399         pAdrcCtx->NextData.dynParams.Drc_v12.LoLitContrast * INT12BITMAX, INT12BITMAX);
400     pAdrcProcRes->DrcProcRes.Drc_v12.lpdetail_ratio = LIMIT_VALUE_UNSIGNED(
401         pAdrcCtx->NextData.dynParams.Drc_v12.GlobalContrast * INT12BITMAX, INT12BITMAX);
402     pAdrcProcRes->DrcProcRes.Drc_v12.bilat_wt_off = LIMIT_VALUE_UNSIGNED(
403         pAdrcCtx->NextData.dynParams.Drc_v12.MotionStr * INT8BITMAX, INT8BITMAX);
404     pAdrcProcRes->DrcProcRes.Drc_v12.weig_maxl =
405         (unsigned char)(SHIFT4BIT(pAdrcCtx->NextData.dynParams.Drc_v12.Strength) + 0.5f);
406     pAdrcProcRes->DrcProcRes.Drc_v12.weig_bilat = LIMIT_VALUE_UNSIGNED(
407         pAdrcCtx->NextData.dynParams.Drc_v12.LocalWeit * (INT4BITMAX + 1), INT4BITMAX + 1);
408     pAdrcProcRes->DrcProcRes.Drc_v12.enable_soft_thd =
409         pAdrcCtx->NextData.dynParams.Drc_v12.LocalAutoEnable;
410     pAdrcProcRes->DrcProcRes.Drc_v12.bilat_soft_thd = LIMIT_VALUE_UNSIGNED(
411         pAdrcCtx->NextData.dynParams.Drc_v12.LocalAutoWeit * INT14BITMAX, INT14BITMAX);
412     pAdrcProcRes->DrcProcRes.Drc_v12.bilat_soft_thd =
413         LIMIT_VALUE_UNSIGNED(pAdrcProcRes->DrcProcRes.Drc_v12.bilat_soft_thd, INT14BITMAX);
414     // get sw_drc_gain_y
415     CalibrateDrcGainYV12(&pAdrcProcRes->DrcProcRes, pAdrcCtx->NextData.dynParams.Drc_v12.DrcGain,
416                          pAdrcCtx->ablcV32_proc_res.blc_ob_enable,
417                          pAdrcCtx->ablcV32_proc_res.isp_ob_predgain,
418                          pAdrcCtx->NextData.dynParams.Drc_v12.Alpha);
419 
420     pAdrcProcRes->DrcProcRes.Drc_v12.gas_l0 = (unsigned char)pAdrcCtx->NextData.staticParams.gas_l0;
421     pAdrcProcRes->DrcProcRes.Drc_v12.gas_l1 = (unsigned char)pAdrcCtx->NextData.staticParams.gas_l1;
422     pAdrcProcRes->DrcProcRes.Drc_v12.gas_l2 = (unsigned char)pAdrcCtx->NextData.staticParams.gas_l2;
423     pAdrcProcRes->DrcProcRes.Drc_v12.gas_l3 = (unsigned char)pAdrcCtx->NextData.staticParams.gas_l3;
424     pAdrcProcRes->DrcProcRes.Drc_v12.weicur_pix =
425         LIMIT_VALUE_UNSIGNED(pAdrcCtx->NextData.staticParams.curPixWeit * INT8BITMAX, INT8BITMAX);
426     pAdrcProcRes->DrcProcRes.Drc_v12.weipre_frame =
427         LIMIT_VALUE_UNSIGNED(pAdrcCtx->NextData.staticParams.preFrameWeit * INT8BITMAX, INT8BITMAX);
428 
429     pAdrcProcRes->DrcProcRes.Drc_v12.force_sgm_inv0 =
430         (unsigned short)(SHIFT13BIT(pAdrcCtx->NextData.staticParams.Range_force_sgm) + 0.5f);
431     pAdrcProcRes->DrcProcRes.Drc_v12.edge_scl =
432         LIMIT_VALUE_UNSIGNED(pAdrcCtx->NextData.staticParams.Edge_Weit * INT8BITMAX, INT8BITMAX);
433     pAdrcProcRes->DrcProcRes.Drc_v12.motion_scl = SW_DRC_MOTION_SCL_FIX;
434     pAdrcProcRes->DrcProcRes.Drc_v12.space_sgm_inv1 =
435         (unsigned short)(pAdrcCtx->NextData.staticParams.Space_sgm_cur);
436     pAdrcProcRes->DrcProcRes.Drc_v12.space_sgm_inv0 =
437         (unsigned short)(pAdrcCtx->NextData.staticParams.Space_sgm_pre);
438     pAdrcProcRes->DrcProcRes.Drc_v12.range_sgm_inv1 =
439         (unsigned short)(SHIFT13BIT(pAdrcCtx->NextData.staticParams.Range_sgm_cur) + 0.5f);
440     pAdrcProcRes->DrcProcRes.Drc_v12.range_sgm_inv0 =
441         (unsigned short)(SHIFT13BIT(pAdrcCtx->NextData.staticParams.Range_sgm_pre) + 0.5f);
442     for (int i = 0; i < DRC_V12_Y_NUM; ++i) {
443         pAdrcProcRes->DrcProcRes.Drc_v12.scale_y[i] =
444             (unsigned short)(pAdrcCtx->NextData.staticParams.Scale_y[i]);
445     }
446     float iir_frame =
447         (float)(MIN(pAdrcCtx->FrameID + 1, (uint32_t)pAdrcCtx->NextData.staticParams.IIR_frame));
448     pAdrcProcRes->DrcProcRes.Drc_v12.iir_weight =
449         (unsigned char)(SHIFT6BIT((iir_frame - 1.0f) / iir_frame) + 0.5f);
450     // set FIX reg
451     pAdrcProcRes->DrcProcRes.Drc_v12.delta_scalein = DELTA_SCALEIN_FIX;
452     pAdrcProcRes->DrcProcRes.Drc_v12.bypass_en     = FUNCTION_DISABLE;
453     pAdrcProcRes->DrcProcRes.Drc_v12.offset_pow2   = SW_DRC_OFFSET_POW2_FIX;
454 
455     LOG1_ATMO("%s:exit!\n", __FUNCTION__);
456 }
457 #if RKAIQ_HAVE_DRC_V12
AdrcV12Params2Api(AdrcContext_t * pAdrcCtx,DrcInfoV12_t * pDrcInfo)458 void AdrcV12Params2Api(AdrcContext_t* pAdrcCtx, DrcInfoV12_t* pDrcInfo) {
459     LOG1_ATMO("%s:enter!\n", __FUNCTION__);
460 
461     // ctrl info
462     pDrcInfo->CtrlInfo.ISO   = pAdrcCtx->NextData.AEData.ISO;
463     pDrcInfo->CtrlInfo.EnvLv = pAdrcCtx->NextData.AEData.EnvLv;
464 
465     // paras
466     pDrcInfo->ValidParams.Enable          = pAdrcCtx->NextData.bDrcEn;
467     pDrcInfo->ValidParams.DrcGain.Alpha   = pAdrcCtx->NextData.dynParams.Drc_v12.Alpha;
468     pDrcInfo->ValidParams.DrcGain.DrcGain = pAdrcCtx->NextData.dynParams.Drc_v12.DrcGain;
469     pDrcInfo->ValidParams.DrcGain.Clip    = pAdrcCtx->NextData.dynParams.Drc_v12.Clip;
470     pDrcInfo->ValidParams.HiLight.HiLightData.Strength =
471         pAdrcCtx->NextData.dynParams.Drc_v12.Strength;
472     pDrcInfo->ValidParams.HiLight.HiLightData.gas_t = pAdrcCtx->NextData.dynParams.Drc_v12.gas_t;
473     pDrcInfo->ValidParams.HiLight.gas_l0            = pAdrcCtx->NextData.staticParams.gas_l0;
474     pDrcInfo->ValidParams.HiLight.gas_l1            = pAdrcCtx->NextData.staticParams.gas_l1;
475     pDrcInfo->ValidParams.HiLight.gas_l2            = pAdrcCtx->NextData.staticParams.gas_l2;
476     pDrcInfo->ValidParams.HiLight.gas_l3            = pAdrcCtx->NextData.staticParams.gas_l3;
477     pDrcInfo->ValidParams.LocalSetting.LocalData.LocalWeit =
478         pAdrcCtx->NextData.dynParams.Drc_v12.LocalWeit;
479     pDrcInfo->ValidParams.LocalSetting.LocalData.LocalAutoEnable =
480         pAdrcCtx->NextData.dynParams.Drc_v12.LocalAutoEnable;
481     pDrcInfo->ValidParams.LocalSetting.LocalData.LocalAutoWeit =
482         pAdrcCtx->NextData.dynParams.Drc_v12.LocalAutoWeit;
483     pDrcInfo->ValidParams.LocalSetting.LocalData.GlobalContrast =
484         pAdrcCtx->NextData.dynParams.Drc_v12.GlobalContrast;
485     pDrcInfo->ValidParams.LocalSetting.LocalData.LoLitContrast =
486         pAdrcCtx->NextData.dynParams.Drc_v12.LoLitContrast;
487     pDrcInfo->ValidParams.LocalSetting.MotionData.MotionStr =
488         pAdrcCtx->NextData.dynParams.Drc_v12.MotionStr;
489     pDrcInfo->ValidParams.LocalSetting.curPixWeit   = pAdrcCtx->NextData.staticParams.curPixWeit;
490     pDrcInfo->ValidParams.LocalSetting.preFrameWeit = pAdrcCtx->NextData.staticParams.preFrameWeit;
491     pDrcInfo->ValidParams.LocalSetting.Range_sgm_pre =
492         pAdrcCtx->NextData.staticParams.Range_sgm_pre;
493     pDrcInfo->ValidParams.LocalSetting.Space_sgm_pre =
494         pAdrcCtx->NextData.staticParams.Space_sgm_pre;
495     pDrcInfo->ValidParams.LocalSetting.Range_force_sgm =
496         pAdrcCtx->NextData.staticParams.Range_force_sgm;
497     pDrcInfo->ValidParams.LocalSetting.Range_sgm_cur =
498         pAdrcCtx->NextData.staticParams.Range_sgm_cur;
499     pDrcInfo->ValidParams.LocalSetting.Space_sgm_cur =
500         pAdrcCtx->NextData.staticParams.Space_sgm_cur;
501     pDrcInfo->ValidParams.Edge_Weit            = pAdrcCtx->NextData.staticParams.Edge_Weit;
502     pDrcInfo->ValidParams.OutPutLongFrame      = pAdrcCtx->NextData.staticParams.OutPutLongFrame;
503     pDrcInfo->ValidParams.IIR_frame            = pAdrcCtx->NextData.staticParams.IIR_frame;
504     pDrcInfo->ValidParams.CompressSetting.Mode = pAdrcCtx->NextData.staticParams.CompressMode;
505     for (int i = 0; i < ADRC_Y_NUM; i++) {
506         pDrcInfo->ValidParams.CompressSetting.Manual_curve[i] =
507             pAdrcCtx->NextData.staticParams.compresManuCurve[i];
508         pDrcInfo->ValidParams.Scale_y[i] = pAdrcCtx->NextData.staticParams.Scale_y[i];
509     }
510 
511     LOG1_ATMO("%s:exit!\n", __FUNCTION__);
512 }
513 #endif
514 #if RKAIQ_HAVE_DRC_V12_LITE
AdrcV12LiteParams2Api(AdrcContext_t * pAdrcCtx,DrcInfoV12Lite_t * pDrcInfo)515 void AdrcV12LiteParams2Api(AdrcContext_t* pAdrcCtx, DrcInfoV12Lite_t* pDrcInfo) {
516     LOG1_ATMO("%s:enter!\n", __FUNCTION__);
517 
518     // ctrl info
519     pDrcInfo->CtrlInfo.ISO   = pAdrcCtx->NextData.AEData.ISO;
520     pDrcInfo->CtrlInfo.EnvLv = pAdrcCtx->NextData.AEData.EnvLv;
521 
522     // params
523     pDrcInfo->ValidParams.Enable          = pAdrcCtx->NextData.bDrcEn;
524     pDrcInfo->ValidParams.DrcGain.Alpha   = pAdrcCtx->NextData.dynParams.Drc_v12.Alpha;
525     pDrcInfo->ValidParams.DrcGain.DrcGain = pAdrcCtx->NextData.dynParams.Drc_v12.DrcGain;
526     pDrcInfo->ValidParams.DrcGain.Clip    = pAdrcCtx->NextData.dynParams.Drc_v12.Clip;
527     pDrcInfo->ValidParams.HiLight.HiLightData.Strength =
528         pAdrcCtx->NextData.dynParams.Drc_v12.Strength;
529     pDrcInfo->ValidParams.HiLight.HiLightData.gas_t = pAdrcCtx->NextData.dynParams.Drc_v12.gas_t;
530     pDrcInfo->ValidParams.HiLight.gas_l0            = pAdrcCtx->NextData.staticParams.gas_l0;
531     pDrcInfo->ValidParams.HiLight.gas_l1            = pAdrcCtx->NextData.staticParams.gas_l1;
532     pDrcInfo->ValidParams.HiLight.gas_l2            = pAdrcCtx->NextData.staticParams.gas_l2;
533     pDrcInfo->ValidParams.HiLight.gas_l3            = pAdrcCtx->NextData.staticParams.gas_l3;
534     pDrcInfo->ValidParams.LocalSetting.LocalData.LocalWeit =
535         pAdrcCtx->NextData.dynParams.Drc_v12.LocalWeit;
536     pDrcInfo->ValidParams.LocalSetting.LocalData.LocalAutoEnable =
537         pAdrcCtx->NextData.dynParams.Drc_v12.LocalAutoEnable;
538     pDrcInfo->ValidParams.LocalSetting.LocalData.LocalAutoWeit =
539         pAdrcCtx->NextData.dynParams.Drc_v12.LocalAutoWeit;
540     pDrcInfo->ValidParams.LocalSetting.LocalData.GlobalContrast =
541         pAdrcCtx->NextData.dynParams.Drc_v12.GlobalContrast;
542     pDrcInfo->ValidParams.LocalSetting.LocalData.LoLitContrast =
543         pAdrcCtx->NextData.dynParams.Drc_v12.LoLitContrast;
544     pDrcInfo->ValidParams.LocalSetting.MotionData.MotionStr =
545         pAdrcCtx->NextData.dynParams.Drc_v12.MotionStr;
546     pDrcInfo->ValidParams.LocalSetting.curPixWeit = pAdrcCtx->NextData.staticParams.curPixWeit;
547     pDrcInfo->ValidParams.LocalSetting.Range_force_sgm =
548         pAdrcCtx->NextData.staticParams.Range_force_sgm;
549     pDrcInfo->ValidParams.LocalSetting.Range_sgm_cur =
550         pAdrcCtx->NextData.staticParams.Range_sgm_cur;
551     pDrcInfo->ValidParams.LocalSetting.Space_sgm_cur =
552         pAdrcCtx->NextData.staticParams.Space_sgm_cur;
553     pDrcInfo->ValidParams.Edge_Weit            = pAdrcCtx->NextData.staticParams.Edge_Weit;
554     pDrcInfo->ValidParams.OutPutLongFrame      = pAdrcCtx->NextData.staticParams.OutPutLongFrame;
555     pDrcInfo->ValidParams.IIR_frame            = pAdrcCtx->NextData.staticParams.IIR_frame;
556     pDrcInfo->ValidParams.CompressSetting.Mode = pAdrcCtx->NextData.staticParams.CompressMode;
557     for (int i = 0; i < ADRC_Y_NUM; i++) {
558         pDrcInfo->ValidParams.CompressSetting.Manual_curve[i] =
559             pAdrcCtx->NextData.staticParams.compresManuCurve[i];
560         pDrcInfo->ValidParams.Scale_y[i] = pAdrcCtx->NextData.staticParams.Scale_y[i];
561     }
562 
563     LOG1_ATMO("%s:exit!\n", __FUNCTION__);
564 }
565 #endif
566 /******************************************************************************
567  * AdrcTuningParaProcessing()
568  *get handle para by config and current variate
569  *****************************************************************************/
AdrcTuningParaProcessing(AdrcContext_t * pAdrcCtx,RkAiqAdrcProcResult_t * pAdrcProcRes)570 void AdrcTuningParaProcessing(AdrcContext_t* pAdrcCtx, RkAiqAdrcProcResult_t* pAdrcProcRes) {
571     LOG1_ATMO("%s:enter!\n", __FUNCTION__);
572 
573     // para setting
574     if (pAdrcCtx->drcAttrV12.opMode == DRC_OPMODE_AUTO) {
575         int lo = 0, hi = 0;
576         float ratio     = 0.0f;
577         float CtrlValue = pAdrcCtx->NextData.AEData.EnvLv;
578         if (pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.CtrlDataType == CTRLDATATYPE_ISO)
579             CtrlValue = pAdrcCtx->NextData.AEData.ISO;
580 
581         // get Drc gain
582         ratio = DrcGetInterpRatioV12(pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.DrcGain.CtrlData, lo,
583                                      hi, CtrlValue, ADRC_ENVLV_STEP_MAX);
584         pAdrcCtx->NextData.dynParams.Drc_v12.DrcGain =
585             ratio * (pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.DrcGain.DrcGain[hi] -
586                      pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.DrcGain.DrcGain[lo]) +
587             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.DrcGain.DrcGain[lo];
588         pAdrcCtx->NextData.dynParams.Drc_v12.Alpha =
589             ratio * (pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.DrcGain.Alpha[hi] -
590                      pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.DrcGain.Alpha[lo]) +
591             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.DrcGain.Alpha[lo];
592         pAdrcCtx->NextData.dynParams.Drc_v12.Clip =
593             ratio * (pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.DrcGain.Clip[hi] -
594                      pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.DrcGain.Clip[lo]) +
595             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.DrcGain.Clip[lo];
596 
597         // get hi lit
598         ratio = DrcGetInterpRatioV12(
599             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.HiLight.HiLightData.CtrlData, lo, hi,
600             CtrlValue, ADRC_ENVLV_STEP_MAX);
601         pAdrcCtx->NextData.dynParams.Drc_v12.Strength =
602             ratio * (pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.HiLight.HiLightData.Strength[hi] -
603                      pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.HiLight.HiLightData.Strength[lo]) +
604             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.HiLight.HiLightData.Strength[lo];
605         pAdrcCtx->NextData.dynParams.Drc_v12.gas_t =
606             ratio * (pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.HiLight.HiLightData.gas_t[hi] -
607                      pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.HiLight.HiLightData.gas_t[lo]) +
608             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.HiLight.HiLightData.gas_t[lo];
609 
610         // get local
611         ratio = DrcGetInterpRatioV12(
612             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.LocalData.CtrlData, lo, hi,
613             CtrlValue, ADRC_ENVLV_STEP_MAX);
614         pAdrcCtx->NextData.dynParams.Drc_v12.LocalWeit =
615             ratio *
616                 (pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.LocalData.LocalWeit[hi] -
617                  pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.LocalData.LocalWeit[lo]) +
618             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.LocalData.LocalWeit[lo];
619         pAdrcCtx->NextData.dynParams.Drc_v12.GlobalContrast =
620             ratio * (pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.LocalData
621                          .GlobalContrast[hi] -
622                      pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.LocalData
623                          .GlobalContrast[lo]) +
624             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.LocalData.GlobalContrast[lo];
625         pAdrcCtx->NextData.dynParams.Drc_v12.LoLitContrast =
626             ratio * (pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.LocalData
627                          .LoLitContrast[hi] -
628                      pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.LocalData
629                          .LoLitContrast[lo]) +
630             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.LocalData.LoLitContrast[lo];
631         pAdrcCtx->NextData.dynParams.Drc_v12.LocalAutoEnable =
632             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.LocalData.LocalAutoEnable[lo];
633         pAdrcCtx->NextData.dynParams.Drc_v12.LocalAutoWeit =
634             ratio * (pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.LocalData
635                          .LocalAutoWeit[hi] -
636                      pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.LocalData
637                          .LocalAutoWeit[lo]) +
638             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.LocalData.LocalAutoWeit[lo];
639         // get MotionStr
640         pAdrcCtx->NextData.dynParams.Drc_v12.MotionStr =
641             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.MotionData.MotionStr[0];
642         // compress
643         pAdrcCtx->NextData.staticParams.CompressMode =
644             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.CompressSetting.Mode;
645         for (int i = 0; i < ADRC_Y_NUM; i++)
646             pAdrcCtx->NextData.staticParams.compresManuCurve[i] =
647                 pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.CompressSetting.Manual_curve[i];
648         pAdrcCtx->NextData.staticParams.curPixWeit =
649             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.curPixWeit;
650 #if RKAIQ_HAVE_DRC_V12
651         pAdrcCtx->NextData.staticParams.preFrameWeit =
652             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.preFrameWeit;
653         pAdrcCtx->NextData.staticParams.Range_sgm_pre =
654             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.Range_sgm_pre;
655         pAdrcCtx->NextData.staticParams.Space_sgm_pre =
656             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.Space_sgm_pre;
657 #else
658         pAdrcCtx->NextData.staticParams.preFrameWeit  = 0x0;
659         pAdrcCtx->NextData.staticParams.Range_sgm_pre = 0x0;
660         pAdrcCtx->NextData.staticParams.Space_sgm_pre = 0x0;
661 #endif
662         pAdrcCtx->NextData.staticParams.Range_force_sgm =
663             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.Range_force_sgm;
664         pAdrcCtx->NextData.staticParams.Range_sgm_cur =
665             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.Range_sgm_cur;
666         pAdrcCtx->NextData.staticParams.Space_sgm_cur =
667             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.LocalSetting.Space_sgm_cur;
668         // scale y
669         for (int i = 0; i < ADRC_Y_NUM; i++)
670             pAdrcCtx->NextData.staticParams.Scale_y[i] =
671                 (unsigned short)pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.Scale_y[i];
672 
673         pAdrcCtx->NextData.staticParams.ByPassThr =
674             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.ByPassThr;
675         pAdrcCtx->NextData.staticParams.Edge_Weit =
676             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.Edge_Weit;
677         pAdrcCtx->NextData.staticParams.IIR_frame =
678             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.IIR_frame;
679         pAdrcCtx->NextData.staticParams.damp = pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.damp;
680         // drc v12 add
681         pAdrcCtx->NextData.staticParams.gas_l0 =
682             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.HiLight.gas_l0;
683         pAdrcCtx->NextData.staticParams.gas_l1 =
684             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.HiLight.gas_l1;
685         pAdrcCtx->NextData.staticParams.gas_l2 =
686             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.HiLight.gas_l2;
687         pAdrcCtx->NextData.staticParams.gas_l3 =
688             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.HiLight.gas_l3;
689         pAdrcCtx->NextData.staticParams.OutPutLongFrame =
690             pAdrcCtx->NextData.AEData.LongFrmMode ||
691             pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.OutPutLongFrame;
692 
693         // damp
694         pAdrcCtx->isDampStable =
695             AdrcDampingV12(&pAdrcCtx->NextData, &pAdrcCtx->CurrData, pAdrcCtx->FrameID,
696                            pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.CtrlDataType);
697     } else if (pAdrcCtx->drcAttrV12.opMode == DRC_OPMODE_MANUAL) {
698         // update drc gain
699         pAdrcCtx->NextData.dynParams.Drc_v12.DrcGain =
700             LIMIT_VALUE(pAdrcCtx->drcAttrV12.stManual.DrcGain.DrcGain, DRCGAINMAX, DRCGAINMIN);
701         pAdrcCtx->NextData.dynParams.Drc_v12.Alpha =
702             LIMIT_VALUE(pAdrcCtx->drcAttrV12.stManual.DrcGain.Alpha, NORMALIZE_MAX, NORMALIZE_MIN);
703         pAdrcCtx->NextData.dynParams.Drc_v12.Clip =
704             LIMIT_VALUE(pAdrcCtx->drcAttrV12.stManual.DrcGain.Clip, CLIPMAX, CLIPMIN);
705 
706         // update hight light
707         pAdrcCtx->NextData.dynParams.Drc_v12.Strength =
708             LIMIT_VALUE(pAdrcCtx->drcAttrV12.stManual.HiLight.HiLightData.Strength, NORMALIZE_MAX,
709                         NORMALIZE_MIN);
710         pAdrcCtx->NextData.dynParams.Drc_v12.gas_t = LIMIT_VALUE(
711             pAdrcCtx->drcAttrV12.stManual.HiLight.HiLightData.gas_t, GAS_T_MAX, GAS_T_MIN);
712 
713         // update local
714         pAdrcCtx->NextData.dynParams.Drc_v12.LocalWeit =
715             LIMIT_VALUE(pAdrcCtx->drcAttrV12.stManual.LocalSetting.LocalData.LocalWeit,
716                         NORMALIZE_MAX, NORMALIZE_MIN);
717         pAdrcCtx->NextData.dynParams.Drc_v12.LocalAutoEnable =
718             LIMIT_VALUE(pAdrcCtx->drcAttrV12.stManual.LocalSetting.LocalData.LocalAutoEnable,
719                         ADRCNORMALIZEINTMAX, ADRCNORMALIZEINTMIN);
720         pAdrcCtx->NextData.dynParams.Drc_v12.LocalAutoWeit =
721             LIMIT_VALUE(pAdrcCtx->drcAttrV12.stManual.LocalSetting.LocalData.LocalAutoWeit,
722                         NORMALIZE_MAX, NORMALIZE_MIN);
723         pAdrcCtx->NextData.dynParams.Drc_v12.GlobalContrast =
724             LIMIT_VALUE(pAdrcCtx->drcAttrV12.stManual.LocalSetting.LocalData.GlobalContrast,
725                         NORMALIZE_MAX, NORMALIZE_MIN);
726         pAdrcCtx->NextData.dynParams.Drc_v12.LoLitContrast =
727             LIMIT_VALUE(pAdrcCtx->drcAttrV12.stManual.LocalSetting.LocalData.LoLitContrast,
728                         NORMALIZE_MAX, NORMALIZE_MIN);
729         pAdrcCtx->NextData.dynParams.Drc_v12.LoLitContrast =
730             LIMIT_VALUE(pAdrcCtx->drcAttrV12.stManual.LocalSetting.MotionData.MotionStr,
731                         NORMALIZE_MAX, NORMALIZE_MIN);
732 
733         // damp
734         pAdrcCtx->isDampStable = true;
735 
736         // others
737         // compress
738         pAdrcCtx->NextData.staticParams.CompressMode =
739             pAdrcCtx->drcAttrV12.stManual.CompressSetting.Mode;
740         for (int i = 0; i < ADRC_Y_NUM; i++)
741             pAdrcCtx->NextData.staticParams.compresManuCurve[i] = LIMIT_VALUE_UNSIGNED(
742                 pAdrcCtx->drcAttrV12.stManual.CompressSetting.Manual_curve[i], MANUALCURVEMAX);
743 
744         pAdrcCtx->NextData.staticParams.OutPutLongFrame =
745             pAdrcCtx->NextData.AEData.LongFrmMode || pAdrcCtx->drcAttrV12.stManual.OutPutLongFrame;
746         pAdrcCtx->NextData.staticParams.curPixWeit = LIMIT_VALUE(
747             pAdrcCtx->drcAttrV12.stManual.LocalSetting.curPixWeit, NORMALIZE_MAX, NORMALIZE_MIN);
748 #if RKAIQ_HAVE_DRC_V12
749         pAdrcCtx->NextData.staticParams.preFrameWeit = LIMIT_VALUE(
750             pAdrcCtx->drcAttrV12.stManual.LocalSetting.preFrameWeit, NORMALIZE_MAX, NORMALIZE_MIN);
751         pAdrcCtx->NextData.staticParams.Range_sgm_pre = LIMIT_VALUE(
752             pAdrcCtx->drcAttrV12.stManual.LocalSetting.Range_sgm_pre, NORMALIZE_MAX, NORMALIZE_MIN);
753         pAdrcCtx->NextData.staticParams.Space_sgm_pre = LIMIT_VALUE(
754             pAdrcCtx->drcAttrV12.stManual.LocalSetting.Space_sgm_pre, SPACESGMMAX, SPACESGMMIN);
755 #else
756         pAdrcCtx->NextData.staticParams.preFrameWeit = 0x0;
757         pAdrcCtx->NextData.staticParams.Range_sgm_pre = 0x0;
758         pAdrcCtx->NextData.staticParams.Space_sgm_pre = 0x0;
759 #endif
760         pAdrcCtx->NextData.staticParams.Range_force_sgm =
761             LIMIT_VALUE(pAdrcCtx->drcAttrV12.stManual.LocalSetting.Range_force_sgm, NORMALIZE_MAX,
762                         NORMALIZE_MIN);
763         pAdrcCtx->NextData.staticParams.Range_sgm_cur = LIMIT_VALUE(
764             pAdrcCtx->drcAttrV12.stManual.LocalSetting.Range_sgm_cur, NORMALIZE_MAX, NORMALIZE_MIN);
765 
766         pAdrcCtx->NextData.staticParams.Space_sgm_cur = LIMIT_VALUE(
767             pAdrcCtx->drcAttrV12.stManual.LocalSetting.Space_sgm_cur, SPACESGMMAX, SPACESGMMIN);
768         for (int i = 0; i < ADRC_Y_NUM; i++)
769             pAdrcCtx->NextData.staticParams.Scale_y[i] =
770                 LIMIT_VALUE(pAdrcCtx->drcAttrV12.stManual.Scale_y[i], SCALEYMAX, SCALEYMIN);
771         pAdrcCtx->NextData.staticParams.Edge_Weit =
772             LIMIT_VALUE(pAdrcCtx->drcAttrV12.stManual.Edge_Weit, NORMALIZE_MAX, NORMALIZE_MIN);
773         pAdrcCtx->NextData.staticParams.IIR_frame =
774             LIMIT_VALUE(pAdrcCtx->drcAttrV12.stManual.IIR_frame, IIRFRAMEMAX, IIRFRAMEMIN);
775 
776         // drc v12 add
777         pAdrcCtx->NextData.staticParams.gas_l0 =
778             LIMIT_VALUE(pAdrcCtx->drcAttrV12.stManual.HiLight.gas_l0, GAS_L_MAX, GAS_L_MIN);
779         pAdrcCtx->NextData.staticParams.gas_l1 =
780             LIMIT_VALUE(pAdrcCtx->drcAttrV12.stManual.HiLight.gas_l1, GAS_L_MAX, GAS_L_MIN);
781         pAdrcCtx->NextData.staticParams.gas_l2 =
782             LIMIT_VALUE(pAdrcCtx->drcAttrV12.stManual.HiLight.gas_l2, GAS_L_MAX, GAS_L_MIN);
783         pAdrcCtx->NextData.staticParams.gas_l3 =
784             LIMIT_VALUE(pAdrcCtx->drcAttrV12.stManual.HiLight.gas_l3, GAS_L_MAX, GAS_L_MIN);
785     }
786 
787     // clip drc gain
788     if (pAdrcCtx->FrameNumber == HDR_2X_NUM || pAdrcCtx->FrameNumber == HDR_3X_NUM) {
789         if (pAdrcCtx->NextData.AEData.L2S_Ratio * pAdrcCtx->NextData.dynParams.Drc_v12.DrcGain >
790             MAX_AE_DRC_GAIN) {
791             LOGE_ATMO("%s:  AERatio*DrcGain > 256!!!\n", __FUNCTION__);
792             pAdrcCtx->NextData.dynParams.Drc_v12.DrcGain =
793                 MAX(MAX_AE_DRC_GAIN / pAdrcCtx->NextData.AEData.L2S_Ratio, GAINMIN);
794         }
795     } else if (pAdrcCtx->FrameNumber == LINEAR_NUM) {
796         if (pAdrcCtx->ablcV32_proc_res.isp_ob_predgain *
797                 pAdrcCtx->NextData.dynParams.Drc_v12.DrcGain >
798             MAX_AE_DRC_GAIN) {
799             LOGE_ATMO("%s:  predgain*DrcGain > 256!!!\n", __FUNCTION__);
800             if (pAdrcCtx->ablcV32_proc_res.isp_ob_predgain > MAX_AE_DRC_GAIN)
801                 LOGE_ATMO("%s:  predgain > 256!!!\n", __FUNCTION__);
802             else
803                 pAdrcCtx->NextData.dynParams.Drc_v12.DrcGain =
804                     MAX(MAX_AE_DRC_GAIN / pAdrcCtx->ablcV32_proc_res.isp_ob_predgain, GAINMIN);
805         }
806     }
807     // clip gas_l0~3
808     if (pAdrcCtx->NextData.staticParams.gas_l0 == GAS_L_MAX) {
809         LOGE_ATMO("%s: gas_l0 equals %d, use default value\n", __FUNCTION__, GAS_L_MAX);
810         pAdrcCtx->NextData.staticParams.gas_l0 = GAS_L0_DEFAULT;
811         pAdrcCtx->NextData.staticParams.gas_l1 = GAS_L1_DEFAULT;
812         pAdrcCtx->NextData.staticParams.gas_l2 = GAS_L2_DEFAULT;
813         pAdrcCtx->NextData.staticParams.gas_l3 = GAS_L3_DEFAULT;
814     }
815     if ((pAdrcCtx->NextData.staticParams.gas_l0 + 2 * pAdrcCtx->NextData.staticParams.gas_l1 +
816          pAdrcCtx->NextData.staticParams.gas_l2 + 2 * pAdrcCtx->NextData.staticParams.gas_l3) !=
817         GAS_L_MAX) {
818         LOGE_ATMO("%s: gas_l0 + gas_l1 + gas_l2 + gas_l3 DO NOT equal %d, use default value\n",
819                   __FUNCTION__, GAS_L_MAX);
820         pAdrcCtx->NextData.staticParams.gas_l0 = GAS_L0_DEFAULT;
821         pAdrcCtx->NextData.staticParams.gas_l1 = GAS_L1_DEFAULT;
822         pAdrcCtx->NextData.staticParams.gas_l2 = GAS_L2_DEFAULT;
823         pAdrcCtx->NextData.staticParams.gas_l3 = GAS_L3_DEFAULT;
824     }
825 
826     LOGD_ATMO("%s: Current ob_on:%d predgain:%f DrcGain:%f Alpha:%f Clip:%f CompressMode:%d\n",
827               __FUNCTION__, pAdrcCtx->ablcV32_proc_res.blc_ob_enable,
828               pAdrcCtx->ablcV32_proc_res.isp_ob_predgain,
829               pAdrcCtx->NextData.dynParams.Drc_v12.DrcGain,
830               pAdrcCtx->NextData.dynParams.Drc_v12.Alpha, pAdrcCtx->NextData.dynParams.Drc_v12.Clip,
831               pAdrcCtx->NextData.staticParams.CompressMode);
832     LOGD_ATMO("%s: Current HiLight Strength:%f gas_t:%f\n", __FUNCTION__,
833               pAdrcCtx->NextData.dynParams.Drc_v12.Strength,
834               pAdrcCtx->NextData.dynParams.Drc_v12.gas_t);
835     LOGD_ATMO(
836         "%s: Current LocalWeit:%f LocalAutoEnable:%d LocalAutoWeit:%f GlobalContrast:%f "
837         "LoLitContrast:%f MotionStr:%f\n",
838         __FUNCTION__, pAdrcCtx->NextData.dynParams.Drc_v12.LocalWeit,
839         pAdrcCtx->NextData.dynParams.Drc_v12.LocalAutoEnable,
840         pAdrcCtx->NextData.dynParams.Drc_v12.LocalAutoWeit,
841         pAdrcCtx->NextData.dynParams.Drc_v12.GlobalContrast,
842         pAdrcCtx->NextData.dynParams.Drc_v12.LoLitContrast,
843         pAdrcCtx->NextData.dynParams.Drc_v12.MotionStr);
844 
845     // get io data
846     AdrcGetTuningProcResV12(pAdrcCtx, pAdrcProcRes);
847 
848     // store current handle data to pre data for next loop
849     pAdrcCtx->CurrData.AEData.EnvLv = pAdrcCtx->NextData.AEData.EnvLv;
850     pAdrcCtx->CurrData.AEData.ISO   = pAdrcCtx->NextData.AEData.ISO;
851     pAdrcCtx->CurrData.MotionCoef   = pAdrcCtx->NextData.MotionCoef;
852     pAdrcCtx->CurrData.ApiMode      = pAdrcCtx->drcAttrV12.opMode;
853     if (pAdrcCtx->drcAttrV12.opMode == DRC_OPMODE_AUTO && !pAdrcCtx->isDampStable) {
854         pAdrcCtx->CurrData.dynParams.Drc_v12.DrcGain = pAdrcCtx->NextData.dynParams.Drc_v12.DrcGain;
855         pAdrcCtx->CurrData.dynParams.Drc_v12.Alpha   = pAdrcCtx->NextData.dynParams.Drc_v12.Alpha;
856         pAdrcCtx->CurrData.dynParams.Drc_v12.Clip    = pAdrcCtx->NextData.dynParams.Drc_v12.Clip;
857         pAdrcCtx->CurrData.dynParams.Drc_v12.Strength =
858             pAdrcCtx->NextData.dynParams.Drc_v12.Strength;
859         pAdrcCtx->CurrData.dynParams.Drc_v12.LocalWeit =
860             pAdrcCtx->NextData.dynParams.Drc_v12.LocalWeit;
861         pAdrcCtx->CurrData.dynParams.Drc_v12.LocalAutoWeit =
862             pAdrcCtx->NextData.dynParams.Drc_v12.LocalAutoWeit;
863         pAdrcCtx->CurrData.dynParams.Drc_v12.GlobalContrast =
864             pAdrcCtx->NextData.dynParams.Drc_v12.GlobalContrast;
865         pAdrcCtx->CurrData.dynParams.Drc_v12.LoLitContrast =
866             pAdrcCtx->NextData.dynParams.Drc_v12.LoLitContrast;
867         pAdrcCtx->CurrData.dynParams.Drc_v12.gas_t = pAdrcCtx->NextData.dynParams.Drc_v12.gas_t;
868         pAdrcCtx->CurrData.dynParams.Drc_v12.MotionStr =
869             pAdrcCtx->NextData.dynParams.Drc_v12.MotionStr;
870     }
871 
872     LOG1_ATMO("%s:exit!\n", __FUNCTION__);
873 }
874 
875 /******************************************************************************
876  * AdrcExpoParaProcessing()
877  *get handle para by config and current variate
878  *****************************************************************************/
AdrcExpoParaProcessing(AdrcContext_t * pAdrcCtx,RkAiqAdrcProcResult_t * pAdrcProcRes)879 void AdrcExpoParaProcessing(AdrcContext_t* pAdrcCtx, RkAiqAdrcProcResult_t* pAdrcProcRes) {
880     LOG1_ATMO("%s:enter!\n", __FUNCTION__);
881 
882     // get sw_drc_compres_scl
883     float adrc_gain = 1.0f;
884     if (pAdrcCtx->FrameNumber == LINEAR_NUM && pAdrcCtx->ablcV32_proc_res.blc_ob_enable)
885         adrc_gain = pAdrcCtx->NextData.dynParams.Drc_v12.DrcGain *
886                     pAdrcCtx->ablcV32_proc_res.isp_ob_predgain;
887     else
888         adrc_gain = pAdrcCtx->NextData.dynParams.Drc_v12.DrcGain;
889     float log_ratio2     = log(pAdrcCtx->NextData.AEData.L2S_Ratio * adrc_gain) / log(2.0f) + 12.0f;
890     float offsetbits_int = (float)(pAdrcProcRes->DrcProcRes.Drc_v12.offset_pow2);
891     float offsetbits     = offsetbits_int * (1 << MFHDR_LOG_Q_BITS);
892     float hdrbits        = log_ratio2 * (1 << MFHDR_LOG_Q_BITS);
893     float hdrvalidbits   = hdrbits - offsetbits;
894     float compres_scl    = (12.0f * (1 << (MFHDR_LOG_Q_BITS * 2))) / hdrvalidbits;
895     pAdrcProcRes->DrcProcRes.Drc_v12.compres_scl = (unsigned short)(compres_scl);
896 
897     // get sw_drc_min_ogain
898     if (pAdrcCtx->NextData.staticParams.OutPutLongFrame)
899         pAdrcProcRes->DrcProcRes.Drc_v12.min_ogain = 1 << 15;
900     else {
901         float sw_drc_min_ogain = 1.0f / (pAdrcCtx->NextData.AEData.L2S_Ratio * adrc_gain);
902         pAdrcProcRes->DrcProcRes.Drc_v12.min_ogain =
903             (unsigned short)(sw_drc_min_ogain * (1 << 15) + 0.5f);
904     }
905 
906     // get sw_drc_compres_y
907     if (pAdrcCtx->NextData.staticParams.CompressMode == COMPRESS_AUTO) {
908         float curveparam, curveparam2, curveparam3, tmp;
909         float luma2[DRC_V12_Y_NUM] = {0.0f,     1024.0f,  2048.0f,  3072.0f,  4096.0f,  5120.0f,
910                                       6144.0f,  7168.0f,  8192.0f,  10240.0f, 12288.0f, 14336.0f,
911                                       16384.0f, 18432.0f, 20480.0f, 22528.0f, 24576.0f};
912         float curveTable;
913         float dstbits   = ISP_RAW_BIT * (1 << MFHDR_LOG_Q_BITS);
914         float validbits = dstbits - offsetbits;
915         for (int i = 0; i < DRC_V12_Y_NUM; ++i) {
916             curveparam =
917                 (float)(validbits - 0.0f) / (hdrvalidbits - validbits + DRC_COMPRESS_Y_OFFSET);
918             curveparam2 = validbits * (1.0f + curveparam);
919             curveparam3   = hdrvalidbits * curveparam;
920             tmp           = luma2[i] * hdrvalidbits / 24576.0f;
921             curveTable    = (tmp * curveparam2 / (tmp + curveparam3));
922             pAdrcProcRes->DrcProcRes.Drc_v12.compres_y[i] = (unsigned short)(curveTable);
923         }
924     } else if (pAdrcCtx->NextData.staticParams.CompressMode == COMPRESS_MANUAL) {
925         for (int i = 0; i < DRC_V12_Y_NUM; ++i)
926             pAdrcProcRes->DrcProcRes.Drc_v12.compres_y[i] =
927                 (unsigned short)(pAdrcCtx->NextData.staticParams.compresManuCurve[i]);
928     }
929 
930     LOGV_ATMO("%s: nextRatioLS:%f sw_drc_position:%d sw_drc_compres_scl:%d sw_drc_offset_pow2:%d\n",
931               __FUNCTION__, pAdrcCtx->NextData.AEData.L2S_Ratio,
932               pAdrcProcRes->DrcProcRes.Drc_v12.position,
933               pAdrcProcRes->DrcProcRes.Drc_v12.compres_scl,
934               pAdrcProcRes->DrcProcRes.Drc_v12.offset_pow2);
935     LOGV_ATMO("%s: blc_ob_enable:%d OB_predgain:%f DrcGain:%f TotalDgain:%f\n", __FUNCTION__,
936               pAdrcCtx->ablcV32_proc_res.blc_ob_enable, pAdrcCtx->ablcV32_proc_res.isp_ob_predgain,
937               pAdrcCtx->NextData.dynParams.Drc_v12.DrcGain, adrc_gain);
938     LOGV_ATMO("%s: sw_drc_lpdetail_ratio:%d sw_drc_hpdetail_ratio:%d sw_drc_delta_scalein:%d\n",
939               __FUNCTION__, pAdrcProcRes->DrcProcRes.Drc_v12.lpdetail_ratio,
940               pAdrcProcRes->DrcProcRes.Drc_v12.hpdetail_ratio,
941               pAdrcProcRes->DrcProcRes.Drc_v12.delta_scalein);
942     LOGV_ATMO("%s: sw_drc_bilat_wt_off:%d sw_drc_weipre_frame:%d sw_drc_weicur_pix:%d\n",
943               __FUNCTION__, pAdrcProcRes->DrcProcRes.Drc_v12.bilat_wt_off,
944               pAdrcProcRes->DrcProcRes.Drc_v12.weipre_frame,
945               pAdrcProcRes->DrcProcRes.Drc_v12.weicur_pix);
946     LOGV_ATMO("%s: sw_drc_edge_scl:%d sw_drc_motion_scl:%d sw_drc_force_sgm_inv0:%d\n",
947               __FUNCTION__, pAdrcProcRes->DrcProcRes.Drc_v12.edge_scl,
948               pAdrcProcRes->DrcProcRes.Drc_v12.motion_scl,
949               pAdrcProcRes->DrcProcRes.Drc_v12.force_sgm_inv0);
950     LOGV_ATMO("%s: sw_drc_space_sgm_inv0:%d sw_drc_space_sgm_inv1:%d\n", __FUNCTION__,
951               pAdrcProcRes->DrcProcRes.Drc_v12.space_sgm_inv0,
952               pAdrcProcRes->DrcProcRes.Drc_v12.space_sgm_inv1);
953     LOGV_ATMO("%s: sw_drc_range_sgm_inv0:%d sw_drc_range_sgm_inv1:%d\n", __FUNCTION__,
954               pAdrcProcRes->DrcProcRes.Drc_v12.range_sgm_inv0,
955               pAdrcProcRes->DrcProcRes.Drc_v12.range_sgm_inv1);
956     LOGV_ATMO(
957         "%s: sw_drc_weig_bilat:%d sw_drc_weig_maxl:%d sw_drc_bilat_soft_thd:%d "
958         "sw_drc_enable_soft_thd:%d\n",
959         __FUNCTION__, pAdrcProcRes->DrcProcRes.Drc_v12.weig_bilat,
960         pAdrcProcRes->DrcProcRes.Drc_v12.weig_maxl, pAdrcProcRes->DrcProcRes.Drc_v12.bilat_soft_thd,
961         pAdrcProcRes->DrcProcRes.Drc_v12.enable_soft_thd);
962     LOGV_ATMO("%s: sw_drc_min_ogain:%d sw_drc_iir_weight:%d\n", __FUNCTION__,
963               pAdrcProcRes->DrcProcRes.Drc_v12.min_ogain,
964               pAdrcProcRes->DrcProcRes.Drc_v12.iir_weight);
965     LOGV_ATMO("%s: gas_t:%d gas_l0:%d gas_l1:%d gas_l2:%d gas_l3:%d\n", __FUNCTION__,
966               pAdrcProcRes->DrcProcRes.Drc_v12.gas_t, pAdrcProcRes->DrcProcRes.Drc_v12.gas_l0,
967               pAdrcProcRes->DrcProcRes.Drc_v12.gas_l1, pAdrcProcRes->DrcProcRes.Drc_v12.gas_l2,
968               pAdrcProcRes->DrcProcRes.Drc_v12.gas_l3);
969     LOGV_ATMO(
970         "%s: sw_drc_gain_y: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", __FUNCTION__,
971         pAdrcProcRes->DrcProcRes.Drc_v12.gain_y[0], pAdrcProcRes->DrcProcRes.Drc_v12.gain_y[1],
972         pAdrcProcRes->DrcProcRes.Drc_v12.gain_y[2], pAdrcProcRes->DrcProcRes.Drc_v12.gain_y[3],
973         pAdrcProcRes->DrcProcRes.Drc_v12.gain_y[4], pAdrcProcRes->DrcProcRes.Drc_v12.gain_y[5],
974         pAdrcProcRes->DrcProcRes.Drc_v12.gain_y[6], pAdrcProcRes->DrcProcRes.Drc_v12.gain_y[7],
975         pAdrcProcRes->DrcProcRes.Drc_v12.gain_y[8], pAdrcProcRes->DrcProcRes.Drc_v12.gain_y[9],
976         pAdrcProcRes->DrcProcRes.Drc_v12.gain_y[10], pAdrcProcRes->DrcProcRes.Drc_v12.gain_y[11],
977         pAdrcProcRes->DrcProcRes.Drc_v12.gain_y[12], pAdrcProcRes->DrcProcRes.Drc_v12.gain_y[13],
978         pAdrcProcRes->DrcProcRes.Drc_v12.gain_y[14], pAdrcProcRes->DrcProcRes.Drc_v12.gain_y[15],
979         pAdrcProcRes->DrcProcRes.Drc_v12.gain_y[16]);
980     LOGV_ATMO(
981         "%s: sw_drc_scale_y: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", __FUNCTION__,
982         pAdrcProcRes->DrcProcRes.Drc_v12.scale_y[0], pAdrcProcRes->DrcProcRes.Drc_v12.scale_y[1],
983         pAdrcProcRes->DrcProcRes.Drc_v12.scale_y[2], pAdrcProcRes->DrcProcRes.Drc_v12.scale_y[3],
984         pAdrcProcRes->DrcProcRes.Drc_v12.scale_y[4], pAdrcProcRes->DrcProcRes.Drc_v12.scale_y[5],
985         pAdrcProcRes->DrcProcRes.Drc_v12.scale_y[6], pAdrcProcRes->DrcProcRes.Drc_v12.scale_y[7],
986         pAdrcProcRes->DrcProcRes.Drc_v12.scale_y[8], pAdrcProcRes->DrcProcRes.Drc_v12.scale_y[9],
987         pAdrcProcRes->DrcProcRes.Drc_v12.scale_y[10], pAdrcProcRes->DrcProcRes.Drc_v12.scale_y[11],
988         pAdrcProcRes->DrcProcRes.Drc_v12.scale_y[12], pAdrcProcRes->DrcProcRes.Drc_v12.scale_y[13],
989         pAdrcProcRes->DrcProcRes.Drc_v12.scale_y[14], pAdrcProcRes->DrcProcRes.Drc_v12.scale_y[15],
990         pAdrcProcRes->DrcProcRes.Drc_v12.scale_y[16]);
991     LOGV_ATMO(
992         "%s: CompressMode:%d sw_drc_compres_y: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d "
993         "%d\n",
994         __FUNCTION__, pAdrcCtx->NextData.staticParams.CompressMode,
995         pAdrcProcRes->DrcProcRes.Drc_v12.compres_y[0],
996         pAdrcProcRes->DrcProcRes.Drc_v12.compres_y[1],
997         pAdrcProcRes->DrcProcRes.Drc_v12.compres_y[2],
998         pAdrcProcRes->DrcProcRes.Drc_v12.compres_y[3],
999         pAdrcProcRes->DrcProcRes.Drc_v12.compres_y[4],
1000         pAdrcProcRes->DrcProcRes.Drc_v12.compres_y[5],
1001         pAdrcProcRes->DrcProcRes.Drc_v12.compres_y[6],
1002         pAdrcProcRes->DrcProcRes.Drc_v12.compres_y[7],
1003         pAdrcProcRes->DrcProcRes.Drc_v12.compres_y[8],
1004         pAdrcProcRes->DrcProcRes.Drc_v12.compres_y[9],
1005         pAdrcProcRes->DrcProcRes.Drc_v12.compres_y[10],
1006         pAdrcProcRes->DrcProcRes.Drc_v12.compres_y[11],
1007         pAdrcProcRes->DrcProcRes.Drc_v12.compres_y[12],
1008         pAdrcProcRes->DrcProcRes.Drc_v12.compres_y[13],
1009         pAdrcProcRes->DrcProcRes.Drc_v12.compres_y[14],
1010         pAdrcProcRes->DrcProcRes.Drc_v12.compres_y[15],
1011         pAdrcProcRes->DrcProcRes.Drc_v12.compres_y[16]);
1012 
1013     LOG1_ATMO("%s:exit!\n", __FUNCTION__);
1014 }
1015 
1016 /******************************************************************************
1017  * AdrcByPassTuningProcessing()
1018  *get handle para by config and current variate
1019  *****************************************************************************/
AdrcByPassTuningProcessing(AdrcContext_t * pAdrcCtx)1020 bool AdrcByPassTuningProcessing(AdrcContext_t* pAdrcCtx) {
1021     LOG1_ATMO("%s:enter!\n", __FUNCTION__);
1022 
1023     bool bypass = false;
1024     float diff  = 0.0f;
1025 
1026     if (pAdrcCtx->FrameID <= INIT_CALC_PARAMS_NUM)
1027         bypass = false;
1028     else if (pAdrcCtx->drcAttrV12.opMode != pAdrcCtx->CurrData.ApiMode)
1029         bypass = false;
1030     else if (pAdrcCtx->drcAttrV12.opMode == DRC_OPMODE_MANUAL)
1031         bypass = !pAdrcCtx->ifReCalcStManual;
1032     else if (pAdrcCtx->drcAttrV12.opMode == DRC_OPMODE_AUTO) {
1033         if (pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.CtrlDataType == CTRLDATATYPE_ENVLV) {
1034             diff = pAdrcCtx->CurrData.AEData.EnvLv - pAdrcCtx->NextData.AEData.EnvLv;
1035             if (pAdrcCtx->CurrData.AEData.EnvLv <= FLT_EPSILON) {
1036                 diff = pAdrcCtx->NextData.AEData.EnvLv;
1037                 if (diff <= FLT_EPSILON)
1038                     bypass = true;
1039                 else
1040                     bypass = false;
1041             } else {
1042                 diff /= pAdrcCtx->CurrData.AEData.EnvLv;
1043                 if (diff >= pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.ByPassThr ||
1044                     diff <= -pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.ByPassThr)
1045                     bypass = false;
1046                 else
1047                     bypass = true;
1048             }
1049         } else if (pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.CtrlDataType == CTRLDATATYPE_ISO) {
1050             diff = pAdrcCtx->CurrData.AEData.ISO - pAdrcCtx->NextData.AEData.ISO;
1051             diff /= pAdrcCtx->CurrData.AEData.ISO;
1052             if (diff >= pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.ByPassThr ||
1053                 diff <= -pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.ByPassThr)
1054                 bypass = false;
1055             else
1056                 bypass = true;
1057         }
1058         bypass = bypass && !pAdrcCtx->ifReCalcStAuto;
1059     }
1060 
1061     LOGD_ATMO(
1062         "%s: FrameID:%d HDRFrameNum:%d LongFrmMode:%d DRCApiMode:%d ifReCalcStAuto:%d "
1063         "ifReCalcStManual:%d CtrlDataType:%d EnvLv:%f "
1064         "ISO:%f bypass:%d\n",
1065         __FUNCTION__, pAdrcCtx->FrameID, pAdrcCtx->FrameNumber,
1066         pAdrcCtx->NextData.AEData.LongFrmMode, pAdrcCtx->drcAttrV12.opMode,
1067         pAdrcCtx->ifReCalcStAuto, pAdrcCtx->ifReCalcStManual,
1068         pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.CtrlDataType, pAdrcCtx->NextData.AEData.EnvLv,
1069         pAdrcCtx->NextData.AEData.ISO, bypass);
1070 
1071     LOG1_ATMO(
1072         "%s: NextEnvLv:%f CurrEnvLv:%f NextISO:%f CurrISO:%f diff:%f ByPassThr:%f opMode:%d "
1073         "bypass:%d!\n",
1074         __FUNCTION__, pAdrcCtx->NextData.AEData.EnvLv, pAdrcCtx->CurrData.AEData.EnvLv,
1075         pAdrcCtx->NextData.AEData.ISO, pAdrcCtx->CurrData.AEData.ISO, diff,
1076         pAdrcCtx->drcAttrV12.stAuto.DrcTuningPara.ByPassThr, pAdrcCtx->drcAttrV12.opMode, bypass);
1077 
1078     LOG1_ATMO("%s:exit!\n", __FUNCTION__);
1079     return bypass;
1080 }
1081 /******************************************************************************
1082  * AdrcInit()
1083  *****************************************************************************/
AdrcInit(AdrcContext_t ** ppAdrcCtx,CamCalibDbV2Context_t * pCalibDb)1084 XCamReturn AdrcInit(AdrcContext_t** ppAdrcCtx, CamCalibDbV2Context_t* pCalibDb) {
1085     LOG1_ATMO("%s:enter!\n", __FUNCTION__);
1086     XCamReturn result = XCAM_RETURN_NO_ERROR;
1087 
1088     AdrcContext_t* pAdrcCtx;
1089     pAdrcCtx = (AdrcContext_t*)malloc(sizeof(AdrcContext_t));
1090     if (pAdrcCtx == NULL) {
1091         LOGE_ATMO("%s(%d): invalid inputparams\n", __FUNCTION__, __LINE__);
1092         return XCAM_RETURN_ERROR_MEM;
1093     }
1094 
1095     *ppAdrcCtx      = pAdrcCtx;
1096     pAdrcCtx->state = ADRC_STATE_INITIALIZED;
1097 
1098 #if RKAIQ_HAVE_DRC_V12
1099     CalibDbV2_drc_V12_t* calibv2_adrc_calib =
1100         (CalibDbV2_drc_V12_t*)(CALIBDBV2_GET_MODULE_PTR(pCalibDb, adrc_calib));
1101     memcpy(&pAdrcCtx->drcAttrV12.stAuto, calibv2_adrc_calib, sizeof(CalibDbV2_drc_V12_t));
1102     pAdrcCtx->drcAttrV12.opMode = DRC_OPMODE_AUTO;
1103 #endif
1104 #if RKAIQ_HAVE_DRC_V12_LITE
1105     CalibDbV2_drc_v12_lite_t* calibv2_adrc_calib =
1106         (CalibDbV2_drc_v12_lite_t*)(CALIBDBV2_GET_MODULE_PTR(pCalibDb, adrc_calib));
1107     memcpy(&pAdrcCtx->drcAttrV12.stAuto, calibv2_adrc_calib, sizeof(CalibDbV2_drc_v12_lite_t));
1108     pAdrcCtx->drcAttrV12.opMode = DRC_OPMODE_AUTO;
1109 #endif
1110     pAdrcCtx->ifReCalcStAuto   = true;
1111     pAdrcCtx->ifReCalcStManual = false;
1112     pAdrcCtx->isCapture        = false;
1113     pAdrcCtx->isDampStable     = true;
1114 
1115     LOG1_ATMO("%s:exit!\n", __FUNCTION__);
1116     return (XCAM_RETURN_NO_ERROR);
1117 }
1118 /******************************************************************************
1119  * AhdrRelease()
1120  *****************************************************************************/
AdrcRelease(AdrcContext_t * pAdrcCtx)1121 XCamReturn AdrcRelease(AdrcContext_t* pAdrcCtx) {
1122     LOG1_ATMO("%s:enter!\n", __FUNCTION__);
1123     XCamReturn result = XCAM_RETURN_NO_ERROR;
1124 
1125     // initial checks
1126     if (NULL == pAdrcCtx) {
1127         return (XCAM_RETURN_ERROR_PARAM);
1128     }
1129 
1130     result = AdrcStop(pAdrcCtx);
1131     if (result != XCAM_RETURN_NO_ERROR) {
1132         LOGE_ATMO("%s: DRC Stop() failed!\n", __FUNCTION__);
1133         return (result);
1134     }
1135 
1136     // check state
1137     if ((ADRC_STATE_RUNNING == pAdrcCtx->state) || (ADRC_STATE_LOCKED == pAdrcCtx->state)) {
1138         return (XCAM_RETURN_ERROR_MEM);
1139     }
1140 
1141     free(pAdrcCtx);
1142     pAdrcCtx = NULL;
1143 
1144     LOG1_ATMO("%s:exit!\n", __FUNCTION__);
1145 
1146     return (XCAM_RETURN_NO_ERROR);
1147 }
1148