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