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