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