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