xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/algos/adrc/rk_aiq_adrc_algo_v11.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_v11.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 
DrcGetInterpRatioV11(float * pX,int lo,int hi,float CtrlValue,int length_max)43 float DrcGetInterpRatioV11(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 
AdrcV11ClipStAutoParams(AdrcContext_t * pAdrcCtx)92 void AdrcV11ClipStAutoParams(AdrcContext_t* pAdrcCtx) {
93     LOG1_ATMO("%s:enter!\n", __FUNCTION__);
94 
95     for (int i = 0; i < ADRC_ENVLV_STEP_MAX; i++) {
96         pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.DrcGain.DrcGain[i] = LIMIT_VALUE(
97             pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.DrcGain.DrcGain[i], DRCGAINMAX, DRCGAINMIN);
98         pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.DrcGain.Alpha[i] =
99             LIMIT_VALUE(pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.DrcGain.Alpha[i], NORMALIZE_MAX,
100                         NORMALIZE_MIN);
101         pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.DrcGain.Clip[i] = LIMIT_VALUE(
102             pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.DrcGain.Clip[i], CLIPMAX, CLIPMIN);
103 
104         pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.HiLight.Strength[i] =
105             LIMIT_VALUE(pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.HiLight.Strength[i],
106                         NORMALIZE_MAX, NORMALIZE_MIN);
107 
108         pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.LocalData.LocalWeit[i] = LIMIT_VALUE(
109             pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.LocalData.LocalWeit[i],
110             NORMALIZE_MAX, NORMALIZE_MIN);
111         pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.LocalData.GlobalContrast[i] =
112             LIMIT_VALUE(
113                 pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.LocalData.GlobalContrast[i],
114                 NORMALIZE_MAX, NORMALIZE_MIN);
115         pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.LocalData.LoLitContrast[i] =
116             LIMIT_VALUE(
117                 pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.LocalData.LoLitContrast[i],
118                 NORMALIZE_MAX, NORMALIZE_MIN);
119         pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.LocalData.LocalAutoEnable[i] =
120             LIMIT_VALUE(
121                 pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.LocalData.LocalAutoEnable[i],
122                 NORMALIZE_MAX, NORMALIZE_MIN);
123         pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.LocalData.LocalAutoWeit[i] =
124             LIMIT_VALUE(
125                 pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.LocalData.LocalAutoWeit[i],
126                 NORMALIZE_MAX, NORMALIZE_MIN);
127     }
128     pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.curPixWeit =
129         LIMIT_VALUE(pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.curPixWeit,
130                     NORMALIZE_MAX, NORMALIZE_MIN);
131     pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.Range_force_sgm =
132         LIMIT_VALUE(pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.Range_force_sgm,
133                     NORMALIZE_MAX, NORMALIZE_MIN);
134     pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.Range_sgm_cur =
135         LIMIT_VALUE(pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.Range_sgm_cur,
136                     NORMALIZE_MAX, NORMALIZE_MIN);
137     pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.Space_sgm_cur =
138         LIMIT_VALUE(pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.Space_sgm_cur,
139                     SPACESGMMAX, SPACESGMMIN);
140     for (int i = 0; i < ADRC_Y_NUM; i++) {
141         pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.Scale_y[i] =
142             LIMIT_VALUE(pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.Scale_y[i], SCALEYMAX, SCALEYMIN);
143         pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.CompressSetting.Manual_curve[i] =
144             LIMIT_VALUE(pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.CompressSetting.Manual_curve[i],
145                         MANUALCURVEMAX, MANUALCURVEMIN);
146     }
147     pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.ByPassThr = LIMIT_VALUE(
148         pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.ByPassThr, NORMALIZE_MAX, NORMALIZE_MIN);
149     pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.Edge_Weit = LIMIT_VALUE(
150         pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.Edge_Weit, NORMALIZE_MAX, NORMALIZE_MIN);
151     pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.IIR_frame =
152         LIMIT_VALUE(pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.IIR_frame, IIRFRAMEMAX, IIRFRAMEMIN);
153     pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.damp =
154         LIMIT_VALUE(pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.damp, NORMALIZE_MAX, NORMALIZE_MIN);
155 
156     LOG1_ATMO("%s:exit!\n", __FUNCTION__);
157 }
158 
159 /******************************************************************************
160  * CalibrateDrcGainYV11()
161  *****************************************************************************/
CalibrateDrcGainYV11(DrcProcRes_t * para,float DraGain,float alpha)162 void CalibrateDrcGainYV11(DrcProcRes_t* para, float DraGain, float alpha) {
163     LOG1_ATMO("%s:Enter!\n", __FUNCTION__);
164 
165     float tmp = 0.0f;
166     /*luma[i] = pow((1.0f - luma[i] / 4096.0f), 2.0f)*/
167     float luma[DRC_V11_Y_NUM] = {1.0f,    0.8789f, 0.7656f, 0.6602f, 0.5625f, 0.4727f,
168                                  0.3906f, 0.3164f, 0.2500f, 0.1914f, 0.1406f, 0.0977f,
169                                  0.0625f, 0.0352f, 0.0156f, 0.0039f, 0.0f};
170 
171     for (int i = 0; i < DRC_V11_Y_NUM; ++i) {
172         tmp                     = 1.0f - alpha * luma[i];
173         tmp                     = 1024.0f * pow(DraGain, tmp);
174         para->Drc_v11.gain_y[i] = (unsigned short)(tmp);
175     }
176 
177     LOG1_ATMO("%s:Eixt!\n", __FUNCTION__);
178 }
179 
180 /******************************************************************************
181  * DrcEnableSetting()
182  *
183  *****************************************************************************/
DrcEnableSetting(AdrcContext_t * pAdrcCtx,RkAiqAdrcProcResult_t * pAdrcProcRes)184 bool DrcEnableSetting(AdrcContext_t* pAdrcCtx, RkAiqAdrcProcResult_t* pAdrcProcRes) {
185     LOG1_ATMO("%s:enter!\n", __FUNCTION__);
186 
187     if (pAdrcCtx->FrameNumber == HDR_2X_NUM || pAdrcCtx->FrameNumber == HDR_3X_NUM)
188         pAdrcProcRes->bDrcEn = true;
189     else if (pAdrcCtx->FrameNumber == LINEAR_NUM) {
190         if (pAdrcCtx->drcAttrV11.opMode == DRC_OPMODE_AUTO)
191             pAdrcProcRes->bDrcEn = pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.Enable;
192         else if (pAdrcCtx->drcAttrV11.opMode == DRC_OPMODE_MANUAL)
193             pAdrcProcRes->bDrcEn = pAdrcCtx->drcAttrV11.stManual.Enable;
194         else {
195             LOGE_ATMO("%s: Drc api in WRONG MODE!!!, drc by pass!!!\n", __FUNCTION__);
196             pAdrcProcRes->bDrcEn = false;
197         }
198     }
199     // store bDrcEn for AdrcV11Params2Api
200     pAdrcCtx->NextData.bDrcEn = pAdrcProcRes->bDrcEn;
201 
202     LOG1_ATMO("%s:exit!\n", __FUNCTION__);
203     return pAdrcProcRes->bDrcEn;
204 }
205 /******************************************************************************
206  * AdrcDampingV11()
207  *****************************************************************************/
AdrcDampingV11(NextData_t * pNextData,CurrData_t * pCurrData,int FrameID,CtrlDataType_t CtrlDataType)208 bool AdrcDampingV11(NextData_t* pNextData, CurrData_t* pCurrData, int FrameID,
209                     CtrlDataType_t CtrlDataType) {
210     LOG1_ATMO("%s:Enter!\n", __FUNCTION__);
211     bool isDampStable = false;
212 
213     if (FrameID > INIT_CALC_PARAMS_NUM) {
214         bool isDampStable_DrcGain = false, isDampStable_Alpha = false, isDampStable_Clip = false,
215              isDampStable_Strength = false, isDampStable_LocalWeit = false,
216              isDampStable_LocalAutoWeit = false, isDampStable_GlobalContrast = false,
217              isDampStable_LoLitContrast = false;
218 
219         if ((pNextData->dynParams.Drc_v11.DrcGain - pCurrData->dynParams.Drc_v11.DrcGain) <=
220                 DAMP_STABLE_THR &&
221             (pNextData->dynParams.Drc_v11.DrcGain - pCurrData->dynParams.Drc_v11.DrcGain) >=
222                 -DAMP_STABLE_THR) {
223             isDampStable_DrcGain = true;
224         } else {
225             pNextData->dynParams.Drc_v11.DrcGain =
226                 pNextData->staticParams.damp * pNextData->dynParams.Drc_v11.DrcGain +
227                 (1.0f - pNextData->staticParams.damp) * pCurrData->dynParams.Drc_v11.DrcGain;
228             isDampStable_DrcGain = false;
229         }
230         if ((pNextData->dynParams.Drc_v11.Alpha - pCurrData->dynParams.Drc_v11.Alpha) <=
231                 DAMP_STABLE_THR &&
232             (pNextData->dynParams.Drc_v11.Alpha - pCurrData->dynParams.Drc_v11.Alpha) >=
233                 -DAMP_STABLE_THR) {
234             isDampStable_Alpha = true;
235         } else {
236             pNextData->dynParams.Drc_v11.Alpha =
237                 pNextData->staticParams.damp * pNextData->dynParams.Drc_v11.Alpha +
238                 (1.0f - pNextData->staticParams.damp) * pCurrData->dynParams.Drc_v11.Alpha;
239             isDampStable_Alpha = false;
240         }
241         if ((pNextData->dynParams.Drc_v11.Clip - pCurrData->dynParams.Drc_v11.Clip) <=
242                 DAMP_STABLE_THR &&
243             (pNextData->dynParams.Drc_v11.Clip - pCurrData->dynParams.Drc_v11.Clip) >=
244                 -DAMP_STABLE_THR) {
245             isDampStable_Clip = true;
246         } else {
247             pNextData->dynParams.Drc_v11.Clip =
248                 pNextData->staticParams.damp * pNextData->dynParams.Drc_v11.Clip +
249                 (1.0f - pNextData->staticParams.damp) * pCurrData->dynParams.Drc_v11.Clip;
250             isDampStable_Clip = false;
251         }
252         if ((pNextData->dynParams.Drc_v11.Strength - pCurrData->dynParams.Drc_v11.Strength) <=
253                 DAMP_STABLE_THR &&
254             (pNextData->dynParams.Drc_v11.Strength - pCurrData->dynParams.Drc_v11.Strength) >=
255                 -DAMP_STABLE_THR) {
256             isDampStable_Strength = true;
257         } else {
258             pNextData->dynParams.Drc_v11.Strength =
259                 pNextData->staticParams.damp * pNextData->dynParams.Drc_v11.Strength +
260                 (1.0f - pNextData->staticParams.damp) * pCurrData->dynParams.Drc_v11.Strength;
261             isDampStable_Strength = false;
262         }
263         if ((pNextData->dynParams.Drc_v11.LocalWeit - pCurrData->dynParams.Drc_v11.LocalWeit) <=
264                 DAMP_STABLE_THR &&
265             (pNextData->dynParams.Drc_v11.LocalWeit - pCurrData->dynParams.Drc_v11.LocalWeit) >=
266                 -DAMP_STABLE_THR) {
267             isDampStable_LocalWeit = true;
268         } else {
269             pNextData->dynParams.Drc_v11.LocalWeit =
270                 pNextData->staticParams.damp * pNextData->dynParams.Drc_v11.LocalWeit +
271                 (1.0f - pNextData->staticParams.damp) * pCurrData->dynParams.Drc_v11.LocalWeit;
272             isDampStable_LocalWeit = false;
273         }
274         if ((pNextData->dynParams.Drc_v11.LocalAutoWeit -
275              pCurrData->dynParams.Drc_v11.LocalAutoWeit) <= DAMP_STABLE_THR &&
276             (pNextData->dynParams.Drc_v11.LocalAutoWeit -
277              pCurrData->dynParams.Drc_v11.LocalAutoWeit) >= -DAMP_STABLE_THR) {
278             isDampStable_LocalAutoWeit = true;
279         } else {
280             pNextData->dynParams.Drc_v11.LocalAutoWeit =
281                 pNextData->staticParams.damp * pNextData->dynParams.Drc_v11.LocalAutoWeit +
282                 (1.0f - pNextData->staticParams.damp) * pCurrData->dynParams.Drc_v11.LocalAutoWeit;
283             isDampStable_LocalAutoWeit = false;
284         }
285         if ((pNextData->dynParams.Drc_v11.GlobalContrast -
286              pCurrData->dynParams.Drc_v11.GlobalContrast) <= DAMP_STABLE_THR &&
287             (pNextData->dynParams.Drc_v11.GlobalContrast -
288              pCurrData->dynParams.Drc_v11.GlobalContrast) >= -DAMP_STABLE_THR) {
289             isDampStable_GlobalContrast = true;
290         } else {
291             pNextData->dynParams.Drc_v11.GlobalContrast =
292                 pNextData->staticParams.damp * pNextData->dynParams.Drc_v11.GlobalContrast +
293                 (1.0f - pNextData->staticParams.damp) * pCurrData->dynParams.Drc_v11.GlobalContrast;
294             isDampStable_GlobalContrast = false;
295         }
296         if ((pNextData->dynParams.Drc_v11.LoLitContrast -
297              pCurrData->dynParams.Drc_v11.LoLitContrast) <= DAMP_STABLE_THR &&
298             (pNextData->dynParams.Drc_v11.LoLitContrast -
299              pCurrData->dynParams.Drc_v11.LoLitContrast) >= -DAMP_STABLE_THR) {
300             isDampStable_LoLitContrast = true;
301         } else {
302             pNextData->dynParams.Drc_v11.LoLitContrast =
303                 pNextData->staticParams.damp * pNextData->dynParams.Drc_v11.LoLitContrast +
304                 (1.0f - pNextData->staticParams.damp) * pCurrData->dynParams.Drc_v11.LoLitContrast;
305             isDampStable_LoLitContrast = false;
306         }
307         isDampStable = isDampStable_DrcGain && isDampStable_Alpha && isDampStable_Clip &&
308                        isDampStable_Strength && isDampStable_LocalWeit &&
309                        isDampStable_LocalAutoWeit && isDampStable_GlobalContrast &&
310                        isDampStable_LoLitContrast;
311     } else
312         isDampStable = false;
313 
314     LOG1_ATMO("%s:Eixt!\n", __FUNCTION__);
315     return isDampStable;
316 }
317 /******************************************************************************
318  * AdrcGetTuningProcResV11()
319  *****************************************************************************/
AdrcGetTuningProcResV11(AdrcContext_t * pAdrcCtx,RkAiqAdrcProcResult_t * pAdrcProcRes)320 void AdrcGetTuningProcResV11(AdrcContext_t* pAdrcCtx, RkAiqAdrcProcResult_t* pAdrcProcRes) {
321     LOG1_ATMO("%s:enter!\n", __FUNCTION__);
322 
323     pAdrcProcRes->DrcProcRes.Drc_v11.position =
324         (unsigned short)(SHIFT8BIT(pAdrcCtx->NextData.dynParams.Drc_v11.Clip) + 0.5f);
325     pAdrcProcRes->DrcProcRes.Drc_v11.hpdetail_ratio =
326         (unsigned short)(SHIFT12BIT(pAdrcCtx->NextData.dynParams.Drc_v11.LoLitContrast) + 0.5f);
327     pAdrcProcRes->DrcProcRes.Drc_v11.lpdetail_ratio =
328         (unsigned short)(SHIFT12BIT(pAdrcCtx->NextData.dynParams.Drc_v11.GlobalContrast) + 0.5f);
329     pAdrcProcRes->DrcProcRes.Drc_v11.weipre_frame =
330         LIMIT_VALUE(pAdrcProcRes->DrcProcRes.Drc_v11.weipre_frame, INT8BITMAX, 0);
331     pAdrcProcRes->DrcProcRes.Drc_v11.weig_maxl =
332         (unsigned char)(SHIFT4BIT(pAdrcCtx->NextData.dynParams.Drc_v11.Strength) + 0.5f);
333     pAdrcProcRes->DrcProcRes.Drc_v11.weig_bilat =
334         (unsigned char)(SHIFT4BIT(pAdrcCtx->NextData.dynParams.Drc_v11.LocalWeit) + 0.5f);
335     pAdrcProcRes->DrcProcRes.Drc_v11.enable_soft_thd =
336         pAdrcCtx->NextData.dynParams.Drc_v11.LocalAutoEnable;
337     pAdrcProcRes->DrcProcRes.Drc_v11.bilat_soft_thd =
338         (unsigned short)(SHIFT14BIT(pAdrcCtx->NextData.dynParams.Drc_v11.LocalAutoWeit) + 0.5f);
339     pAdrcProcRes->DrcProcRes.Drc_v11.bilat_soft_thd =
340         LIMIT_VALUE(pAdrcProcRes->DrcProcRes.Drc_v11.bilat_soft_thd, INT14BITMAX, 0);
341     // get sw_drc_gain_y
342     CalibrateDrcGainYV11(&pAdrcProcRes->DrcProcRes, pAdrcCtx->NextData.dynParams.Drc_v11.DrcGain,
343                          pAdrcCtx->NextData.dynParams.Drc_v11.Alpha);
344 
345     pAdrcProcRes->DrcProcRes.Drc_v11.bilat_wt_off =
346         SW_DRC_BILAT_WT_OFF_FIX;  // LIMIT_VALUE(pAdrcCtx->NextData.dynParams.Drc_v11.MotionStr
347                                   // *INT8BITMAX, INT8BITMAX, 0);
348     pAdrcProcRes->DrcProcRes.Drc_v11.weicur_pix =
349         (unsigned char)(SHIFT8BIT(pAdrcCtx->NextData.staticParams.curPixWeit) + 0.5f);
350     pAdrcProcRes->DrcProcRes.Drc_v11.weipre_frame =
351         (unsigned char)(SHIFT8BIT(pAdrcCtx->NextData.staticParams.preFrameWeit) + 0.5f);
352     pAdrcProcRes->DrcProcRes.Drc_v11.force_sgm_inv0 =
353         (unsigned short)(SHIFT13BIT(pAdrcCtx->NextData.staticParams.Range_force_sgm) + 0.5f);
354     pAdrcProcRes->DrcProcRes.Drc_v11.edge_scl =
355         (unsigned char)(SHIFT8BIT(pAdrcCtx->NextData.staticParams.Edge_Weit) + 0.5f);
356     pAdrcProcRes->DrcProcRes.Drc_v11.space_sgm_inv1 =
357         (unsigned short)(pAdrcCtx->NextData.staticParams.Space_sgm_cur);
358     pAdrcProcRes->DrcProcRes.Drc_v11.space_sgm_inv0 =
359         (unsigned short)(pAdrcCtx->NextData.staticParams.Space_sgm_pre);
360     pAdrcProcRes->DrcProcRes.Drc_v11.range_sgm_inv1 =
361         (unsigned short)(SHIFT13BIT(pAdrcCtx->NextData.staticParams.Range_sgm_cur) + 0.5f);
362     pAdrcProcRes->DrcProcRes.Drc_v11.range_sgm_inv0 =
363         (unsigned short)(SHIFT13BIT(pAdrcCtx->NextData.staticParams.Range_sgm_pre) + 0.5f);
364     for (int i = 0; i < DRC_V11_Y_NUM; ++i) {
365         pAdrcProcRes->DrcProcRes.Drc_v11.scale_y[i] =
366             (unsigned short)(pAdrcCtx->NextData.staticParams.Scale_y[i]);
367     }
368     float iir_frame =
369         (float)(MIN(pAdrcCtx->FrameID + 1, (uint32_t)pAdrcCtx->NextData.staticParams.IIR_frame));
370     pAdrcProcRes->DrcProcRes.Drc_v11.iir_weight =
371         (unsigned short)(SHIFT6BIT((iir_frame - 1.0f) / iir_frame) + 0.5f);
372     // set FIX reg
373     pAdrcProcRes->DrcProcRes.Drc_v11.bypass_en     = FUNCTION_DISABLE;
374     pAdrcProcRes->DrcProcRes.Drc_v11.offset_pow2   = SW_DRC_OFFSET_POW2_FIX;
375     pAdrcProcRes->DrcProcRes.Drc_v11.delta_scalein = DELTA_SCALEIN_FIX;
376     pAdrcProcRes->DrcProcRes.Drc_v11.wr_cycle      = FUNCTION_DISABLE;
377     pAdrcProcRes->DrcProcRes.Drc_v11.motion_scl    = SW_DRC_MOTION_SCL_FIX;
378 
379     LOG1_ATMO("%s:exit!\n", __FUNCTION__);
380 }
381 
AdrcV11Params2Api(AdrcContext_t * pAdrcCtx,DrcInfoV11_t * pDrcInfo)382 void AdrcV11Params2Api(AdrcContext_t* pAdrcCtx, DrcInfoV11_t* pDrcInfo) {
383     LOG1_ATMO("%s:enter!\n", __FUNCTION__);
384 
385     // ctrl info
386     pDrcInfo->CtrlInfo.ISO   = pAdrcCtx->NextData.AEData.ISO;
387     pDrcInfo->CtrlInfo.EnvLv = pAdrcCtx->NextData.AEData.EnvLv;
388 
389     // params
390     pDrcInfo->ValidParams.Enable           = pAdrcCtx->NextData.bDrcEn;
391     pDrcInfo->ValidParams.DrcGain.Alpha    = pAdrcCtx->NextData.dynParams.Drc_v11.Alpha;
392     pDrcInfo->ValidParams.DrcGain.DrcGain  = pAdrcCtx->NextData.dynParams.Drc_v11.DrcGain;
393     pDrcInfo->ValidParams.DrcGain.Clip     = pAdrcCtx->NextData.dynParams.Drc_v11.Clip;
394     pDrcInfo->ValidParams.HiLight.Strength = pAdrcCtx->NextData.dynParams.Drc_v11.Strength;
395     pDrcInfo->ValidParams.LocalSetting.LocalData.LocalWeit =
396         pAdrcCtx->NextData.dynParams.Drc_v11.LocalWeit;
397     pDrcInfo->ValidParams.LocalSetting.LocalData.LocalAutoEnable =
398         pAdrcCtx->NextData.dynParams.Drc_v11.LocalAutoEnable;
399     pDrcInfo->ValidParams.LocalSetting.LocalData.LocalAutoWeit =
400         pAdrcCtx->NextData.dynParams.Drc_v11.LocalAutoWeit;
401     pDrcInfo->ValidParams.LocalSetting.LocalData.GlobalContrast =
402         pAdrcCtx->NextData.dynParams.Drc_v11.GlobalContrast;
403     pDrcInfo->ValidParams.LocalSetting.LocalData.LoLitContrast =
404         pAdrcCtx->NextData.dynParams.Drc_v11.LoLitContrast;
405     pDrcInfo->ValidParams.LocalSetting.curPixWeit   = pAdrcCtx->NextData.staticParams.curPixWeit;
406     pDrcInfo->ValidParams.LocalSetting.preFrameWeit = pAdrcCtx->NextData.staticParams.preFrameWeit;
407     pDrcInfo->ValidParams.LocalSetting.Range_force_sgm =
408         pAdrcCtx->NextData.staticParams.Range_force_sgm;
409     pDrcInfo->ValidParams.LocalSetting.Range_sgm_cur =
410         pAdrcCtx->NextData.staticParams.Range_sgm_cur;
411     pDrcInfo->ValidParams.LocalSetting.Range_sgm_pre =
412         pAdrcCtx->NextData.staticParams.Range_sgm_pre;
413     pDrcInfo->ValidParams.LocalSetting.Space_sgm_cur =
414         pAdrcCtx->NextData.staticParams.Space_sgm_cur;
415     pDrcInfo->ValidParams.LocalSetting.Space_sgm_pre =
416         pAdrcCtx->NextData.staticParams.Space_sgm_pre;
417     pDrcInfo->ValidParams.Edge_Weit            = pAdrcCtx->NextData.staticParams.Edge_Weit;
418     pDrcInfo->ValidParams.OutPutLongFrame      = pAdrcCtx->NextData.staticParams.OutPutLongFrame;
419     pDrcInfo->ValidParams.IIR_frame            = pAdrcCtx->NextData.staticParams.IIR_frame;
420     pDrcInfo->ValidParams.CompressSetting.Mode = pAdrcCtx->NextData.staticParams.CompressMode;
421     for (int i = 0; i < ADRC_Y_NUM; i++) {
422         pDrcInfo->ValidParams.CompressSetting.Manual_curve[i] =
423             pAdrcCtx->NextData.staticParams.compresManuCurve[i];
424         pDrcInfo->ValidParams.Scale_y[i] = pAdrcCtx->NextData.staticParams.Scale_y[i];
425     }
426 
427     LOG1_ATMO("%s:exit!\n", __FUNCTION__);
428 }
429 /******************************************************************************
430  * AdrcTuningParaProcessing()
431  *get handle para by config and current variate
432  *****************************************************************************/
AdrcTuningParaProcessing(AdrcContext_t * pAdrcCtx,RkAiqAdrcProcResult_t * pAdrcProcRes)433 void AdrcTuningParaProcessing(AdrcContext_t* pAdrcCtx, RkAiqAdrcProcResult_t* pAdrcProcRes) {
434     LOG1_ATMO("%s:enter!\n", __FUNCTION__);
435 
436     // para setting
437     if (pAdrcCtx->drcAttrV11.opMode == DRC_OPMODE_AUTO) {
438         int lo = 0, hi = 0;
439         float ratio     = 0.0f;
440         float CtrlValue = pAdrcCtx->NextData.AEData.EnvLv;
441         if (pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.CtrlDataType == CTRLDATATYPE_ISO)
442             CtrlValue = pAdrcCtx->NextData.AEData.ISO;
443 
444         // get Drc gain
445         ratio = DrcGetInterpRatioV11(pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.DrcGain.CtrlData, lo,
446                                      hi, CtrlValue, ADRC_ENVLV_STEP_MAX);
447         pAdrcCtx->NextData.dynParams.Drc_v11.DrcGain =
448             ratio * (pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.DrcGain.DrcGain[hi] -
449                      pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.DrcGain.DrcGain[lo]) +
450             pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.DrcGain.DrcGain[lo];
451         pAdrcCtx->NextData.dynParams.Drc_v11.Alpha =
452             ratio * (pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.DrcGain.Alpha[hi] -
453                      pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.DrcGain.Alpha[lo]) +
454             pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.DrcGain.Alpha[lo];
455         pAdrcCtx->NextData.dynParams.Drc_v11.Clip =
456             ratio * (pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.DrcGain.Clip[hi] -
457                      pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.DrcGain.Clip[lo]) +
458             pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.DrcGain.Clip[lo];
459 
460         // get hi lit
461         ratio = DrcGetInterpRatioV11(pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.HiLight.CtrlData, lo,
462                                      hi, CtrlValue, ADRC_ENVLV_STEP_MAX);
463         pAdrcCtx->NextData.dynParams.Drc_v11.Strength =
464             ratio * (pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.HiLight.Strength[hi] -
465                      pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.HiLight.Strength[lo]) +
466             pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.HiLight.Strength[lo];
467 
468         // get local
469         ratio = DrcGetInterpRatioV11(
470             pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.LocalData.CtrlData, lo, hi,
471             CtrlValue, ADRC_ENVLV_STEP_MAX);
472         pAdrcCtx->NextData.dynParams.Drc_v11.LocalWeit =
473             ratio *
474                 (pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.LocalData.LocalWeit[hi] -
475                  pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.LocalData.LocalWeit[lo]) +
476             pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.LocalData.LocalWeit[lo];
477         pAdrcCtx->NextData.dynParams.Drc_v11.GlobalContrast =
478             ratio * (pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.LocalData
479                          .GlobalContrast[hi] -
480                      pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.LocalData
481                          .GlobalContrast[lo]) +
482             pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.LocalData.GlobalContrast[lo];
483         pAdrcCtx->NextData.dynParams.Drc_v11.LoLitContrast =
484             ratio * (pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.LocalData
485                          .LoLitContrast[hi] -
486                      pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.LocalData
487                          .LoLitContrast[lo]) +
488             pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.LocalData.LoLitContrast[lo];
489         pAdrcCtx->NextData.dynParams.Drc_v11.LocalAutoEnable =
490             pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.LocalData.LocalAutoEnable[lo];
491         pAdrcCtx->NextData.dynParams.Drc_v11.LocalAutoWeit =
492             ratio * (pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.LocalData
493                          .LocalAutoWeit[hi] -
494                      pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.LocalData
495                          .LocalAutoWeit[lo]) +
496             pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.LocalData.LocalAutoWeit[lo];
497         // compress
498         pAdrcCtx->NextData.staticParams.CompressMode =
499             pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.CompressSetting.Mode;
500         for (int i = 0; i < ADRC_Y_NUM; i++)
501             pAdrcCtx->NextData.staticParams.compresManuCurve[i] =
502                 pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.CompressSetting.Manual_curve[i];
503         pAdrcCtx->NextData.staticParams.curPixWeit =
504             pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.curPixWeit;
505         pAdrcCtx->NextData.staticParams.preFrameWeit =
506             pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.preFrameWeit;
507         pAdrcCtx->NextData.staticParams.Range_force_sgm =
508             pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.Range_force_sgm;
509         pAdrcCtx->NextData.staticParams.Range_sgm_cur =
510             pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.Range_sgm_cur;
511         pAdrcCtx->NextData.staticParams.Range_sgm_pre =
512             pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.Range_sgm_pre;
513         pAdrcCtx->NextData.staticParams.Space_sgm_cur =
514             pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.Space_sgm_cur;
515         pAdrcCtx->NextData.staticParams.Space_sgm_pre =
516             pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.LocalSetting.Space_sgm_pre;
517         // scale y
518         for (int i = 0; i < ADRC_Y_NUM; i++)
519             pAdrcProcRes->DrcProcRes.Drc_v11.scale_y[i] =
520                 pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.Scale_y[i];
521         pAdrcCtx->NextData.staticParams.ByPassThr =
522             pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.ByPassThr;
523         pAdrcCtx->NextData.staticParams.Edge_Weit =
524             pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.Edge_Weit;
525         pAdrcCtx->NextData.staticParams.IIR_frame =
526             pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.IIR_frame;
527         pAdrcCtx->NextData.staticParams.damp = pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.damp;
528         pAdrcCtx->NextData.staticParams.OutPutLongFrame =
529             pAdrcCtx->NextData.AEData.LongFrmMode ||
530             pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.OutPutLongFrame;
531 
532         // damp
533         pAdrcCtx->isDampStable =
534             AdrcDampingV11(&pAdrcCtx->NextData, &pAdrcCtx->CurrData, pAdrcCtx->FrameID,
535                            pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.CtrlDataType);
536     } else if (pAdrcCtx->drcAttrV11.opMode == DRC_OPMODE_MANUAL) {
537         // update drc gain
538         pAdrcCtx->NextData.dynParams.Drc_v11.DrcGain =
539             LIMIT_VALUE(pAdrcCtx->drcAttrV11.stManual.DrcGain.DrcGain, DRCGAINMAX, DRCGAINMIN);
540         pAdrcCtx->NextData.dynParams.Drc_v11.Alpha =
541             LIMIT_VALUE(pAdrcCtx->drcAttrV11.stManual.DrcGain.Alpha, NORMALIZE_MAX, NORMALIZE_MIN);
542         pAdrcCtx->NextData.dynParams.Drc_v11.Clip =
543             LIMIT_VALUE(pAdrcCtx->drcAttrV11.stManual.DrcGain.Clip, CLIPMAX, CLIPMIN);
544 
545         // update hight light
546         pAdrcCtx->NextData.dynParams.Drc_v11.Strength = LIMIT_VALUE(
547             pAdrcCtx->drcAttrV11.stManual.HiLight.Strength, NORMALIZE_MAX, NORMALIZE_MIN);
548 
549         // update local
550         pAdrcCtx->NextData.dynParams.Drc_v11.LocalWeit =
551             LIMIT_VALUE(pAdrcCtx->drcAttrV11.stManual.LocalSetting.LocalData.LocalWeit,
552                         NORMALIZE_MAX, NORMALIZE_MIN);
553         pAdrcCtx->NextData.dynParams.Drc_v11.LocalAutoEnable =
554             LIMIT_VALUE(pAdrcCtx->drcAttrV11.stManual.LocalSetting.LocalData.LocalAutoEnable,
555                         ADRCNORMALIZEINTMAX, ADRCNORMALIZEINTMIN);
556         pAdrcCtx->NextData.dynParams.Drc_v11.LocalAutoWeit =
557             LIMIT_VALUE(pAdrcCtx->drcAttrV11.stManual.LocalSetting.LocalData.LocalAutoWeit,
558                         NORMALIZE_MAX, NORMALIZE_MIN);
559         pAdrcCtx->NextData.dynParams.Drc_v11.GlobalContrast =
560             LIMIT_VALUE(pAdrcCtx->drcAttrV11.stManual.LocalSetting.LocalData.GlobalContrast,
561                         NORMALIZE_MAX, NORMALIZE_MIN);
562         pAdrcCtx->NextData.dynParams.Drc_v11.LoLitContrast =
563             LIMIT_VALUE(pAdrcCtx->drcAttrV11.stManual.LocalSetting.LocalData.LoLitContrast,
564                         NORMALIZE_MAX, NORMALIZE_MIN);
565 
566         // compress
567         pAdrcCtx->NextData.staticParams.CompressMode =
568             pAdrcCtx->drcAttrV11.stManual.CompressSetting.Mode;
569         for (int i = 0; i < ADRC_Y_NUM; i++)
570             pAdrcCtx->NextData.staticParams.compresManuCurve[i] =
571                 LIMIT_VALUE(pAdrcCtx->drcAttrV11.stManual.CompressSetting.Manual_curve[i],
572                             MANUALCURVEMAX, MANUALCURVEMIN);
573 
574         // others
575         pAdrcCtx->NextData.staticParams.OutPutLongFrame =
576             pAdrcCtx->NextData.AEData.LongFrmMode || pAdrcCtx->drcAttrV11.stManual.OutPutLongFrame;
577         pAdrcCtx->NextData.staticParams.curPixWeit = LIMIT_VALUE(
578             pAdrcCtx->drcAttrV11.stManual.LocalSetting.curPixWeit, NORMALIZE_MAX, NORMALIZE_MIN);
579         pAdrcCtx->NextData.staticParams.preFrameWeit = LIMIT_VALUE(
580             pAdrcCtx->drcAttrV11.stManual.LocalSetting.preFrameWeit, NORMALIZE_MAX, NORMALIZE_MIN);
581         pAdrcCtx->NextData.staticParams.Range_force_sgm =
582             LIMIT_VALUE(pAdrcCtx->drcAttrV11.stManual.LocalSetting.Range_force_sgm, NORMALIZE_MAX,
583                         NORMALIZE_MIN);
584         pAdrcCtx->NextData.staticParams.Range_sgm_cur = LIMIT_VALUE(
585             pAdrcCtx->drcAttrV11.stManual.LocalSetting.Range_sgm_cur, NORMALIZE_MAX, NORMALIZE_MIN);
586         pAdrcCtx->NextData.staticParams.Range_sgm_pre = LIMIT_VALUE(
587             pAdrcCtx->drcAttrV11.stManual.LocalSetting.Range_sgm_pre, NORMALIZE_MAX, NORMALIZE_MIN);
588         pAdrcCtx->NextData.staticParams.Space_sgm_cur = LIMIT_VALUE(
589             pAdrcCtx->drcAttrV11.stManual.LocalSetting.Space_sgm_cur, SPACESGMMAX, SPACESGMMIN);
590         pAdrcCtx->NextData.staticParams.Space_sgm_pre = LIMIT_VALUE(
591             pAdrcCtx->drcAttrV11.stManual.LocalSetting.Space_sgm_pre, SPACESGMMAX, SPACESGMMIN);
592         for (int i = 0; i < ADRC_Y_NUM; i++)
593             pAdrcProcRes->DrcProcRes.Drc_v11.scale_y[i] =
594                 LIMIT_VALUE(pAdrcCtx->drcAttrV11.stManual.Scale_y[i], SCALEYMAX, SCALEYMIN);
595         pAdrcCtx->NextData.staticParams.Edge_Weit =
596             LIMIT_VALUE(pAdrcCtx->drcAttrV11.stManual.Edge_Weit, NORMALIZE_MAX, NORMALIZE_MIN);
597         pAdrcCtx->NextData.staticParams.IIR_frame =
598             LIMIT_VALUE(pAdrcCtx->drcAttrV11.stManual.IIR_frame, IIRFRAMEMAX, IIRFRAMEMIN);
599 
600         // damp
601         pAdrcCtx->isDampStable = true;
602     }
603 
604     // clip drc gain
605     if (pAdrcCtx->NextData.AEData.L2S_Ratio * pAdrcCtx->NextData.dynParams.Drc_v11.DrcGain >
606         MAX_AE_DRC_GAIN) {
607         LOGE_ATMO("%s:  AERatio*DrcGain > 256!!!\n", __FUNCTION__);
608         pAdrcCtx->NextData.dynParams.Drc_v11.DrcGain =
609             MAX(MAX_AE_DRC_GAIN / pAdrcCtx->NextData.AEData.L2S_Ratio, GAINMIN);
610     }
611 
612     LOGD_ATMO("%s: Current Enable:%d DrcGain:%f Alpha:%f Clip:%f Strength:%f CompressMode:%d\n",
613               __FUNCTION__, pAdrcProcRes->bDrcEn, pAdrcCtx->NextData.dynParams.Drc_v11.DrcGain,
614               pAdrcCtx->NextData.dynParams.Drc_v11.Alpha, pAdrcCtx->NextData.dynParams.Drc_v11.Clip,
615               pAdrcCtx->NextData.dynParams.Drc_v11.Strength,
616               pAdrcCtx->NextData.staticParams.CompressMode);
617     LOGD_ATMO(
618         "%s: Current LocalWeit:%f LocalAutoEnable:%d LocalAutoWeit:%f GlobalContrast:%f "
619         "LoLitContrast:%f\n",
620         __FUNCTION__, pAdrcCtx->NextData.dynParams.Drc_v11.LocalWeit,
621         pAdrcCtx->NextData.dynParams.Drc_v11.LocalAutoEnable,
622         pAdrcCtx->NextData.dynParams.Drc_v11.LocalAutoWeit,
623         pAdrcCtx->NextData.dynParams.Drc_v11.GlobalContrast,
624         pAdrcCtx->NextData.dynParams.Drc_v11.LoLitContrast);
625 
626     // get io data
627     AdrcGetTuningProcResV11(pAdrcCtx, pAdrcProcRes);
628 
629     // store current handle data to pre data for next loop
630     pAdrcCtx->CurrData.AEData.EnvLv = pAdrcCtx->NextData.AEData.EnvLv;
631     pAdrcCtx->CurrData.AEData.ISO   = pAdrcCtx->NextData.AEData.ISO;
632     pAdrcCtx->CurrData.MotionCoef   = pAdrcCtx->NextData.MotionCoef;
633     pAdrcCtx->CurrData.ApiMode      = pAdrcCtx->drcAttrV11.opMode;
634     if (pAdrcCtx->drcAttrV11.opMode == DRC_OPMODE_AUTO && !pAdrcCtx->isDampStable) {
635         pAdrcCtx->CurrData.dynParams.Drc_v11.DrcGain = pAdrcCtx->NextData.dynParams.Drc_v11.DrcGain;
636         pAdrcCtx->CurrData.dynParams.Drc_v11.Alpha   = pAdrcCtx->NextData.dynParams.Drc_v11.Alpha;
637         pAdrcCtx->CurrData.dynParams.Drc_v11.Clip    = pAdrcCtx->NextData.dynParams.Drc_v11.Clip;
638         pAdrcCtx->CurrData.dynParams.Drc_v11.Strength =
639             pAdrcCtx->NextData.dynParams.Drc_v11.Strength;
640         pAdrcCtx->CurrData.dynParams.Drc_v11.LocalWeit =
641             pAdrcCtx->NextData.dynParams.Drc_v11.LocalWeit;
642         pAdrcCtx->CurrData.dynParams.Drc_v11.LocalAutoWeit =
643             pAdrcCtx->NextData.dynParams.Drc_v11.LocalAutoWeit;
644         pAdrcCtx->CurrData.dynParams.Drc_v11.GlobalContrast =
645             pAdrcCtx->NextData.dynParams.Drc_v11.GlobalContrast;
646         pAdrcCtx->CurrData.dynParams.Drc_v11.LoLitContrast =
647             pAdrcCtx->NextData.dynParams.Drc_v11.LoLitContrast;
648     }
649 
650     LOG1_ATMO("%s:exit!\n", __FUNCTION__);
651 }
652 
653 /******************************************************************************
654  * AdrcExpoParaProcessing()
655  *get handle para by config and current variate
656  *****************************************************************************/
AdrcExpoParaProcessing(AdrcContext_t * pAdrcCtx,RkAiqAdrcProcResult_t * pAdrcProcRes)657 void AdrcExpoParaProcessing(AdrcContext_t* pAdrcCtx, RkAiqAdrcProcResult_t* pAdrcProcRes) {
658     LOG1_ATMO("%s:enter!\n", __FUNCTION__);
659 
660     // get sw_drc_compres_scl
661     float adrc_gain      = pAdrcCtx->NextData.dynParams.Drc_v11.DrcGain;
662     float log_ratio2     = log(pAdrcCtx->NextData.AEData.L2S_Ratio * adrc_gain) / log(2.0f) + 12.0f;
663     float offsetbits_int = (float)(pAdrcProcRes->DrcProcRes.Drc_v11.offset_pow2);
664     float offsetbits     = offsetbits_int * (1 << MFHDR_LOG_Q_BITS);
665     float hdrbits        = log_ratio2 * (1 << MFHDR_LOG_Q_BITS);
666     float hdrvalidbits   = hdrbits - offsetbits;
667     float compres_scl    = (12.0f * (1 << (MFHDR_LOG_Q_BITS * 2))) / hdrvalidbits;
668     pAdrcProcRes->DrcProcRes.Drc_v11.compres_scl = (unsigned short)(compres_scl);
669 
670     // get sw_drc_min_ogain
671     if (pAdrcCtx->NextData.staticParams.OutPutLongFrame)
672         pAdrcProcRes->DrcProcRes.Drc_v11.min_ogain = 1 << 15;
673     else {
674         float sw_drc_min_ogain = 1.0f / (pAdrcCtx->NextData.AEData.L2S_Ratio * adrc_gain);
675         pAdrcProcRes->DrcProcRes.Drc_v11.min_ogain =
676             (unsigned short)(sw_drc_min_ogain * (1 << 15) + 0.5f);
677     }
678 
679     // get sw_drc_compres_y
680     if (pAdrcCtx->NextData.staticParams.CompressMode == COMPRESS_AUTO) {
681         float curveparam, curveparam2, curveparam3, tmp;
682         float luma2[DRC_V11_Y_NUM] = {0.0f,     1024.0f,  2048.0f,  3072.0f,  4096.0f,  5120.0f,
683                                       6144.0f,  7168.0f,  8192.0f,  10240.0f, 12288.0f, 14336.0f,
684                                       16384.0f, 18432.0f, 20480.0f, 22528.0f, 24576.0f};
685         float curveTable;
686         float dstbits   = ISP_RAW_BIT * (1 << MFHDR_LOG_Q_BITS);
687         float validbits = dstbits - offsetbits;
688         for (int i = 0; i < DRC_V11_Y_NUM; ++i) {
689             curveparam =
690                 (float)(validbits - 0.0f) / (hdrvalidbits - validbits + DRC_COMPRESS_Y_OFFSET);
691             curveparam2 = validbits * (1.0f + curveparam);
692             curveparam3   = hdrvalidbits * curveparam;
693             tmp           = luma2[i] * hdrvalidbits / 24576.0f;
694             curveTable    = (tmp * curveparam2 / (tmp + curveparam3));
695             pAdrcProcRes->DrcProcRes.Drc_v11.compres_y[i] = (unsigned short)(curveTable);
696         }
697     } else if (pAdrcCtx->NextData.staticParams.CompressMode == COMPRESS_MANUAL) {
698         for (int i = 0; i < DRC_V11_Y_NUM; ++i)
699             pAdrcProcRes->DrcProcRes.Drc_v11.compres_y[i] =
700                 (unsigned short)(pAdrcCtx->NextData.staticParams.compresManuCurve[i]);
701     }
702 
703     LOGV_ATMO("%s: nextRatioLS:%f sw_drc_position:%d sw_drc_compres_scl:%d sw_drc_offset_pow2:%d\n",
704               __FUNCTION__, pAdrcCtx->NextData.AEData.L2S_Ratio,
705               pAdrcProcRes->DrcProcRes.Drc_v11.position,
706               pAdrcProcRes->DrcProcRes.Drc_v11.compres_scl,
707               pAdrcProcRes->DrcProcRes.Drc_v11.offset_pow2);
708     LOGV_ATMO("%s: sw_drc_lpdetail_ratio:%d sw_drc_hpdetail_ratio:%d sw_drc_delta_scalein:%d\n",
709               __FUNCTION__, pAdrcProcRes->DrcProcRes.Drc_v11.lpdetail_ratio,
710               pAdrcProcRes->DrcProcRes.Drc_v11.hpdetail_ratio,
711               pAdrcProcRes->DrcProcRes.Drc_v11.delta_scalein);
712     LOGV_ATMO("%s: sw_drc_bilat_wt_off:%d sw_drc_weipre_frame:%d sw_drc_weicur_pix:%d\n",
713               __FUNCTION__, pAdrcProcRes->DrcProcRes.Drc_v11.bilat_wt_off,
714               pAdrcProcRes->DrcProcRes.Drc_v11.weipre_frame,
715               pAdrcProcRes->DrcProcRes.Drc_v11.weicur_pix);
716     LOGV_ATMO("%s: sw_drc_edge_scl:%d sw_drc_motion_scl:%d sw_drc_force_sgm_inv0:%d\n",
717               __FUNCTION__, pAdrcProcRes->DrcProcRes.Drc_v11.edge_scl,
718               pAdrcProcRes->DrcProcRes.Drc_v11.motion_scl,
719               pAdrcProcRes->DrcProcRes.Drc_v11.force_sgm_inv0);
720     LOGV_ATMO("%s: sw_drc_space_sgm_inv0:%d sw_drc_space_sgm_inv1:%d\n", __FUNCTION__,
721               pAdrcProcRes->DrcProcRes.Drc_v11.space_sgm_inv0,
722               pAdrcProcRes->DrcProcRes.Drc_v11.space_sgm_inv1);
723     LOGV_ATMO("%s: sw_drc_range_sgm_inv0:%d sw_drc_range_sgm_inv1:%d\n", __FUNCTION__,
724               pAdrcProcRes->DrcProcRes.Drc_v11.range_sgm_inv0,
725               pAdrcProcRes->DrcProcRes.Drc_v11.range_sgm_inv1);
726     LOGV_ATMO(
727         "%s: sw_drc_weig_bilat:%d sw_drc_weig_maxl:%d sw_drc_bilat_soft_thd:%d "
728         "sw_drc_enable_soft_thd:%d\n",
729         __FUNCTION__, pAdrcProcRes->DrcProcRes.Drc_v11.weig_bilat,
730         pAdrcProcRes->DrcProcRes.Drc_v11.weig_maxl, pAdrcProcRes->DrcProcRes.Drc_v11.bilat_soft_thd,
731         pAdrcProcRes->DrcProcRes.Drc_v11.enable_soft_thd);
732     LOGV_ATMO("%s: sw_drc_min_ogain:%d sw_drc_iir_weight:%d\n", __FUNCTION__,
733               pAdrcProcRes->DrcProcRes.Drc_v11.min_ogain,
734               pAdrcProcRes->DrcProcRes.Drc_v11.iir_weight);
735     LOGV_ATMO(
736         "%s: sw_drc_gain_y: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", __FUNCTION__,
737         pAdrcProcRes->DrcProcRes.Drc_v11.gain_y[0], pAdrcProcRes->DrcProcRes.Drc_v11.gain_y[1],
738         pAdrcProcRes->DrcProcRes.Drc_v11.gain_y[2], pAdrcProcRes->DrcProcRes.Drc_v11.gain_y[3],
739         pAdrcProcRes->DrcProcRes.Drc_v11.gain_y[4], pAdrcProcRes->DrcProcRes.Drc_v11.gain_y[5],
740         pAdrcProcRes->DrcProcRes.Drc_v11.gain_y[6], pAdrcProcRes->DrcProcRes.Drc_v11.gain_y[7],
741         pAdrcProcRes->DrcProcRes.Drc_v11.gain_y[8], pAdrcProcRes->DrcProcRes.Drc_v11.gain_y[9],
742         pAdrcProcRes->DrcProcRes.Drc_v11.gain_y[10], pAdrcProcRes->DrcProcRes.Drc_v11.gain_y[11],
743         pAdrcProcRes->DrcProcRes.Drc_v11.gain_y[12], pAdrcProcRes->DrcProcRes.Drc_v11.gain_y[13],
744         pAdrcProcRes->DrcProcRes.Drc_v11.gain_y[14], pAdrcProcRes->DrcProcRes.Drc_v11.gain_y[15],
745         pAdrcProcRes->DrcProcRes.Drc_v11.gain_y[16]);
746     LOGV_ATMO(
747         "%s: sw_drc_scale_y: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", __FUNCTION__,
748         pAdrcProcRes->DrcProcRes.Drc_v11.scale_y[0], pAdrcProcRes->DrcProcRes.Drc_v11.scale_y[1],
749         pAdrcProcRes->DrcProcRes.Drc_v11.scale_y[2], pAdrcProcRes->DrcProcRes.Drc_v11.scale_y[3],
750         pAdrcProcRes->DrcProcRes.Drc_v11.scale_y[4], pAdrcProcRes->DrcProcRes.Drc_v11.scale_y[5],
751         pAdrcProcRes->DrcProcRes.Drc_v11.scale_y[6], pAdrcProcRes->DrcProcRes.Drc_v11.scale_y[7],
752         pAdrcProcRes->DrcProcRes.Drc_v11.scale_y[8], pAdrcProcRes->DrcProcRes.Drc_v11.scale_y[9],
753         pAdrcProcRes->DrcProcRes.Drc_v11.scale_y[10], pAdrcProcRes->DrcProcRes.Drc_v11.scale_y[11],
754         pAdrcProcRes->DrcProcRes.Drc_v11.scale_y[12], pAdrcProcRes->DrcProcRes.Drc_v11.scale_y[13],
755         pAdrcProcRes->DrcProcRes.Drc_v11.scale_y[14], pAdrcProcRes->DrcProcRes.Drc_v11.scale_y[15],
756         pAdrcProcRes->DrcProcRes.Drc_v11.scale_y[16]);
757     LOGV_ATMO(
758         "%s: CompressMode:%d sw_drc_compres_y: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d "
759         "%d\n",
760         __FUNCTION__, pAdrcCtx->NextData.staticParams.CompressMode,
761         pAdrcProcRes->DrcProcRes.Drc_v11.compres_y[0],
762         pAdrcProcRes->DrcProcRes.Drc_v11.compres_y[1],
763         pAdrcProcRes->DrcProcRes.Drc_v11.compres_y[2],
764         pAdrcProcRes->DrcProcRes.Drc_v11.compres_y[3],
765         pAdrcProcRes->DrcProcRes.Drc_v11.compres_y[4],
766         pAdrcProcRes->DrcProcRes.Drc_v11.compres_y[5],
767         pAdrcProcRes->DrcProcRes.Drc_v11.compres_y[6],
768         pAdrcProcRes->DrcProcRes.Drc_v11.compres_y[7],
769         pAdrcProcRes->DrcProcRes.Drc_v11.compres_y[8],
770         pAdrcProcRes->DrcProcRes.Drc_v11.compres_y[9],
771         pAdrcProcRes->DrcProcRes.Drc_v11.compres_y[10],
772         pAdrcProcRes->DrcProcRes.Drc_v11.compres_y[11],
773         pAdrcProcRes->DrcProcRes.Drc_v11.compres_y[12],
774         pAdrcProcRes->DrcProcRes.Drc_v11.compres_y[13],
775         pAdrcProcRes->DrcProcRes.Drc_v11.compres_y[14],
776         pAdrcProcRes->DrcProcRes.Drc_v11.compres_y[15],
777         pAdrcProcRes->DrcProcRes.Drc_v11.compres_y[16]);
778 
779     LOG1_ATMO("%s:exit!\n", __FUNCTION__);
780 }
781 
782 /******************************************************************************
783  * AdrcByPassTuningProcessing()
784  *get handle para by config and current variate
785  *****************************************************************************/
AdrcByPassTuningProcessing(AdrcContext_t * pAdrcCtx)786 bool AdrcByPassTuningProcessing(AdrcContext_t* pAdrcCtx) {
787     LOG1_ATMO("%s:enter!\n", __FUNCTION__);
788 
789     bool bypass = false;
790     float diff  = 0.0f;
791 
792     if (pAdrcCtx->FrameID <= INIT_CALC_PARAMS_NUM)
793         bypass = false;
794     else if (pAdrcCtx->drcAttrV11.opMode != pAdrcCtx->CurrData.ApiMode)
795         bypass = false;
796     else if (pAdrcCtx->drcAttrV11.opMode == DRC_OPMODE_MANUAL)
797         bypass = !pAdrcCtx->ifReCalcStManual;
798     else if (pAdrcCtx->drcAttrV11.opMode == DRC_OPMODE_AUTO) {
799         if (pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.CtrlDataType == CTRLDATATYPE_ENVLV) {
800             diff = pAdrcCtx->CurrData.AEData.EnvLv - pAdrcCtx->NextData.AEData.EnvLv;
801             if (pAdrcCtx->CurrData.AEData.EnvLv <= FLT_EPSILON) {
802                 diff = pAdrcCtx->NextData.AEData.EnvLv;
803                 if (diff <= FLT_EPSILON)
804                     bypass = true;
805                 else
806                     bypass = false;
807             } else {
808                 diff /= pAdrcCtx->CurrData.AEData.EnvLv;
809                 if (diff >= pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.ByPassThr ||
810                     diff <= -pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.ByPassThr)
811                     bypass = false;
812                 else
813                     bypass = true;
814             }
815         } else if (pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.CtrlDataType == CTRLDATATYPE_ISO) {
816             diff = pAdrcCtx->CurrData.AEData.ISO - pAdrcCtx->NextData.AEData.ISO;
817             diff /= pAdrcCtx->CurrData.AEData.ISO;
818             if (diff >= pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.ByPassThr ||
819                 diff <= -pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.ByPassThr)
820                 bypass = false;
821             else
822                 bypass = true;
823         }
824         bypass = bypass && !pAdrcCtx->ifReCalcStAuto;
825     }
826 
827     LOGD_ATMO(
828         "%s: FrameID:%d HDRFrameNum:%d LongFrmMode:%d DRCApiMode:%d ifReCalcStAuto:%d "
829         "ifReCalcStManual:%d CtrlDataType:%d EnvLv:%f "
830         "ISO:%f bypass:%d\n",
831         __FUNCTION__, pAdrcCtx->FrameID, pAdrcCtx->FrameNumber,
832         pAdrcCtx->NextData.AEData.LongFrmMode, pAdrcCtx->drcAttrV11.opMode,
833         pAdrcCtx->ifReCalcStAuto, pAdrcCtx->ifReCalcStManual,
834         pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.CtrlDataType, pAdrcCtx->NextData.AEData.EnvLv,
835         pAdrcCtx->NextData.AEData.ISO, bypass);
836 
837     LOG1_ATMO(
838         "%s: NextEnvLv:%f CurrEnvLv:%f NextISO:%f CurrISO:%f diff:%f ByPassThr:%f opMode:%d "
839         "bypass:%d!\n",
840         __FUNCTION__, pAdrcCtx->NextData.AEData.EnvLv, pAdrcCtx->CurrData.AEData.EnvLv,
841         pAdrcCtx->NextData.AEData.ISO, pAdrcCtx->CurrData.AEData.ISO, diff,
842         pAdrcCtx->drcAttrV11.stAuto.DrcTuningPara.ByPassThr, pAdrcCtx->drcAttrV11.opMode, bypass);
843 
844     LOG1_ATMO("%s:exit!\n", __FUNCTION__);
845     return bypass;
846 }
847 
848 /******************************************************************************
849  * AdrcInit()
850  *****************************************************************************/
AdrcInit(AdrcContext_t ** ppAdrcCtx,CamCalibDbV2Context_t * pCalibDb)851 XCamReturn AdrcInit(AdrcContext_t** ppAdrcCtx, CamCalibDbV2Context_t* pCalibDb) {
852     LOG1_ATMO("%s:enter!\n", __FUNCTION__);
853     XCamReturn result = XCAM_RETURN_NO_ERROR;
854 
855     AdrcContext_t* pAdrcCtx;
856     pAdrcCtx = (AdrcContext_t*)malloc(sizeof(AdrcContext_t));
857     if (pAdrcCtx == NULL) {
858         LOGE_ATMO("%s(%d): invalid inputparams\n", __FUNCTION__, __LINE__);
859         return XCAM_RETURN_ERROR_MEM;
860     }
861     *ppAdrcCtx      = pAdrcCtx;
862     pAdrcCtx->state = ADRC_STATE_INITIALIZED;
863 
864     CalibDbV2_drc_V11_t* calibv2_adrc_calib =
865         (CalibDbV2_drc_V11_t*)(CALIBDBV2_GET_MODULE_PTR(pCalibDb, adrc_calib));
866     memcpy(&pAdrcCtx->drcAttrV11.stAuto, calibv2_adrc_calib, sizeof(CalibDbV2_drc_V11_t));
867     pAdrcCtx->drcAttrV11.opMode = DRC_OPMODE_AUTO;
868     pAdrcCtx->ifReCalcStAuto    = true;
869     pAdrcCtx->ifReCalcStManual  = false;
870     pAdrcCtx->isCapture         = false;
871     pAdrcCtx->isDampStable      = true;
872 
873     LOG1_ATMO("%s:exit!\n", __FUNCTION__);
874     return (XCAM_RETURN_NO_ERROR);
875 }
876 /******************************************************************************
877  * AhdrRelease()
878  *****************************************************************************/
AdrcRelease(AdrcContext_t * pAdrcCtx)879 XCamReturn AdrcRelease(AdrcContext_t* pAdrcCtx) {
880     LOG1_ATMO("%s:enter!\n", __FUNCTION__);
881     XCamReturn result = XCAM_RETURN_NO_ERROR;
882 
883     // initial checks
884     if (NULL == pAdrcCtx) {
885         return (XCAM_RETURN_ERROR_PARAM);
886     }
887 
888     result = AdrcStop(pAdrcCtx);
889     if (result != XCAM_RETURN_NO_ERROR) {
890         LOGE_ATMO("%s: AHDRStop() failed!\n", __FUNCTION__);
891         return (result);
892     }
893 
894     // check state
895     if ((ADRC_STATE_RUNNING == pAdrcCtx->state) || (ADRC_STATE_LOCKED == pAdrcCtx->state)) {
896         return (XCAM_RETURN_ERROR_MEM);
897     }
898 
899     free(pAdrcCtx);
900     pAdrcCtx = NULL;
901 
902     LOG1_ATMO("%s:exit!\n", __FUNCTION__);
903 
904     return (XCAM_RETURN_NO_ERROR);
905 }
906