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_amerge_algo_v10.cpp
13 *
14 * @brief
15 * ADD_DESCRIPTION_HERE
16 *
17 *****************************************************************************/
18 #include "math.h"
19 #include "rk_aiq_types_amerge_algo_int.h"
20 #include "rk_aiq_types_amerge_algo_prvt.h"
21 #include "xcam_log.h"
22
23 /******************************************************************************
24 * AmergeStart()
25 *****************************************************************************/
AmergeStart(AmergeContext_t * pAmergeCtx)26 XCamReturn AmergeStart(AmergeContext_t* pAmergeCtx) {
27 LOG1_AMERGE("%s:enter!\n", __FUNCTION__);
28
29 // initial checks
30 if (pAmergeCtx == NULL) {
31 return (XCAM_RETURN_ERROR_MEM);
32 }
33
34 if ((AMERGE_STATE_RUNNING == pAmergeCtx->state) || (AMERGE_STATE_LOCKED == pAmergeCtx->state)) {
35 return (XCAM_RETURN_ERROR_FAILED);
36 }
37
38 pAmergeCtx->state = AMERGE_STATE_RUNNING;
39
40 LOG1_AMERGE("%s:exit!\n", __FUNCTION__);
41 return (XCAM_RETURN_NO_ERROR);
42 }
43 /******************************************************************************
44 * AmergeStop()
45 *****************************************************************************/
AmergeStop(AmergeContext_t * pAmergeCtx)46 XCamReturn AmergeStop(AmergeContext_t* pAmergeCtx) {
47 LOG1_AMERGE("%s:enter!\n", __FUNCTION__);
48
49 // initial checks
50 if (pAmergeCtx == NULL) {
51 return (XCAM_RETURN_ERROR_MEM);
52 }
53
54 // before stopping, unlock the AHDR if locked
55 if (AMERGE_STATE_LOCKED == pAmergeCtx->state) {
56 return (XCAM_RETURN_ERROR_FAILED);
57 }
58
59 pAmergeCtx->state = AMERGE_STATE_STOPPED;
60
61 LOG1_AMERGE("%s:exit!\n", __FUNCTION__);
62
63 return (XCAM_RETURN_NO_ERROR);
64 }
65
MergeGetInterpRatioV10(float * pX,int lo,int hi,float CtrlValue,int length_max)66 float MergeGetInterpRatioV10(float* pX, int lo, int hi, float CtrlValue, int length_max) {
67 float ratio = 0.0f;
68
69 if (CtrlValue < pX[0]) {
70 lo = 0;
71 hi = 0;
72 ratio = 0.0f;
73 } else if (CtrlValue >= pX[length_max - 1]) {
74 lo = length_max - 1;
75 hi = length_max - 1;
76 ratio = 0.0f;
77 } else {
78 for (int i = 0; i < length_max - 1; i++) {
79 if (CtrlValue >= pX[i] && CtrlValue < pX[i + 1]) {
80 lo = i;
81 hi = i + 1;
82 ratio = (CtrlValue - pX[i]) / (pX[i + 1] - pX[i]);
83 break;
84 } else
85 continue;
86 }
87 }
88
89 return ratio;
90 }
91
92 /******************************************************************************
93 * CalibrateOECurveV10()
94 *****************************************************************************/
CalibrateOECurveV10(float smooth,float offset,unsigned short * OECurve)95 void CalibrateOECurveV10(float smooth, float offset, unsigned short* OECurve) {
96 LOG1_AMERGE("%s:Enter!\n", __FUNCTION__);
97
98 int step = 32;
99 float curve = 0.0f;
100 float k = 511.0f;
101
102 for (int i = 0; i < HDRMGE_V10_OE_CURVE_NUM; ++i) {
103 curve = 1.0f + exp(-smooth * OECURVESMOOTHMAX * (k / 1023.0f - offset / 256.0f));
104 curve = 1024.0f / curve;
105 OECurve[i] = round(curve);
106 OECurve[i] = MIN(OECurve[i], 1023);
107 k += step;
108 }
109
110 LOG1_AMERGE("%s:Eixt!\n", __FUNCTION__);
111 }
112 /******************************************************************************
113 * CalibrateMDCurveV10()
114 *****************************************************************************/
CalibrateMDCurveV10(float smooth,float offset,unsigned short * MDCurve)115 void CalibrateMDCurveV10(float smooth, float offset, unsigned short* MDCurve) {
116 LOG1_AMERGE("%s:Enter!\n", __FUNCTION__);
117
118 int step = 16;
119 float curve = 0.0f;
120 float k = 0.0f;
121
122 for (int i = 0; i < HDRMGE_V10_OE_CURVE_NUM; ++i) {
123 curve = 1.0f + exp(-smooth * MDCURVESMOOTHMAX *
124 (k / 1023.0f - offset * MDCURVEOFFSETMAX / 256.0f));
125 curve = 1024.0f / curve;
126 MDCurve[i] = round(curve);
127 MDCurve[i] = MIN(MDCurve[i], 1023);
128 k += step;
129 }
130
131 LOG1_AMERGE("%s:Eixt!\n", __FUNCTION__);
132 }
133
134 /******************************************************************************
135 * AmergeGetTuningProcResV10()
136 *****************************************************************************/
AmergeGetTuningProcResV10(AmergeContext_t * pAmergeCtx,RkAiqAmergeProcResult_t * pAmergeProcRes)137 void AmergeGetTuningProcResV10(AmergeContext_t* pAmergeCtx,
138 RkAiqAmergeProcResult_t* pAmergeProcRes) {
139 LOG1_AMERGE("%s:Enter!\n", __FUNCTION__);
140
141 pAmergeProcRes->Merge_v10.sw_hdrmge_mode = pAmergeCtx->NextData.HandleData.Merge_v10.MergeMode;
142 if (CHECK_ISP_HW_V21())
143 pAmergeProcRes->Merge_v10.sw_hdrmge_mode =
144 LIMIT_VALUE(pAmergeProcRes->Merge_v10.sw_hdrmge_mode, 1, 0);
145 pAmergeProcRes->Merge_v10.sw_hdrmge_lm_dif_0p9 = SW_HDRMGE_LM_DIF_0P9_FIX;
146 pAmergeProcRes->Merge_v10.sw_hdrmge_ms_dif_0p8 = SW_HDRMGE_MS_DIF_0P8_FIX;
147 pAmergeProcRes->Merge_v10.sw_hdrmge_lm_dif_0p15 =
148 (unsigned char)(pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveLM_offset *
149 MDCURVEOFFSETMAX);
150 pAmergeProcRes->Merge_v10.sw_hdrmge_ms_dif_0p15 =
151 (unsigned char)(pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveMS_offset *
152 MDCURVEOFFSETMAX);
153
154 if (pAmergeCtx->NextData.CtrlData.ExpoData.LongFrmMode) {
155 for (int i = 0; i < HDRMGE_V10_OE_CURVE_NUM; i++)
156 pAmergeProcRes->Merge_v10.sw_hdrmge_e_y[i] = HDR_LONG_FRMAE_MODE_OECURVE;
157 } else {
158 if ((pAmergeCtx->NextData.HandleData.Merge_v10.OECurve_smooth -
159 pAmergeCtx->CurrData.HandleData.Merge_v10.OECurve_smooth) > FLT_EPSILON ||
160 (pAmergeCtx->NextData.HandleData.Merge_v10.OECurve_smooth -
161 pAmergeCtx->CurrData.HandleData.Merge_v10.OECurve_smooth) < -FLT_EPSILON ||
162 (pAmergeCtx->NextData.HandleData.Merge_v10.OECurve_offset -
163 pAmergeCtx->CurrData.HandleData.Merge_v10.OECurve_offset) > FLT_EPSILON ||
164 (pAmergeCtx->NextData.HandleData.Merge_v10.OECurve_offset -
165 pAmergeCtx->CurrData.HandleData.Merge_v10.OECurve_offset) < -FLT_EPSILON)
166 CalibrateOECurveV10(pAmergeCtx->NextData.HandleData.Merge_v10.OECurve_smooth,
167 pAmergeCtx->NextData.HandleData.Merge_v10.OECurve_offset,
168 pAmergeProcRes->Merge_v10.sw_hdrmge_e_y);
169 if ((pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveLM_smooth -
170 pAmergeCtx->CurrData.HandleData.Merge_v10.MDCurveLM_smooth) > FLT_EPSILON ||
171 (pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveLM_smooth -
172 pAmergeCtx->CurrData.HandleData.Merge_v10.MDCurveLM_smooth) > FLT_EPSILON ||
173 (pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveLM_offset -
174 pAmergeCtx->CurrData.HandleData.Merge_v10.MDCurveLM_offset) > FLT_EPSILON ||
175 (pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveLM_offset -
176 pAmergeCtx->CurrData.HandleData.Merge_v10.MDCurveLM_offset) > FLT_EPSILON)
177 CalibrateMDCurveV10(pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveLM_smooth,
178 pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveLM_offset,
179 pAmergeProcRes->Merge_v10.sw_hdrmge_l1_y);
180 if ((pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveMS_smooth -
181 pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveMS_smooth) > FLT_EPSILON ||
182 (pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveMS_smooth -
183 pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveMS_smooth) > FLT_EPSILON ||
184 (pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveMS_offset -
185 pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveMS_offset) > FLT_EPSILON ||
186 (pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveMS_offset -
187 pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveMS_offset) > FLT_EPSILON)
188 CalibrateMDCurveV10(pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveMS_smooth,
189 pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveMS_offset,
190 pAmergeProcRes->Merge_v10.sw_hdrmge_l0_y);
191 }
192
193 LOG1_AMERGE("%s:Eixt!\n", __FUNCTION__);
194 }
195
196 /******************************************************************************
197 * MergeDampingV10()
198 *****************************************************************************/
MergeDampingV10(AmergeContext_t * pAmergeCtx)199 void MergeDampingV10(AmergeContext_t* pAmergeCtx) {
200 LOG1_AMERGE("%s:Enter!\n", __FUNCTION__);
201
202 if (pAmergeCtx->FrameID && (pAmergeCtx->NextData.HandleData.Merge_v10.MergeMode ==
203 pAmergeCtx->CurrData.HandleData.Merge_v10.MergeMode)) {
204 pAmergeCtx->NextData.HandleData.Merge_v10.OECurve_smooth =
205 pAmergeCtx->NextData.CtrlData.MergeOEDamp *
206 pAmergeCtx->NextData.HandleData.Merge_v10.OECurve_smooth +
207 (1.0f - pAmergeCtx->NextData.CtrlData.MergeOEDamp) *
208 pAmergeCtx->CurrData.HandleData.Merge_v10.OECurve_smooth;
209 pAmergeCtx->NextData.HandleData.Merge_v10.OECurve_offset =
210 pAmergeCtx->NextData.CtrlData.MergeOEDamp *
211 pAmergeCtx->NextData.HandleData.Merge_v10.OECurve_offset +
212 (1.0f - pAmergeCtx->NextData.CtrlData.MergeOEDamp) *
213 pAmergeCtx->CurrData.HandleData.Merge_v10.OECurve_offset;
214 pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveLM_smooth =
215 pAmergeCtx->NextData.CtrlData.MergeMDDampLM *
216 pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveLM_smooth +
217 (1.0f - pAmergeCtx->NextData.CtrlData.MergeMDDampLM) *
218 pAmergeCtx->CurrData.HandleData.Merge_v10.MDCurveLM_smooth;
219 pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveLM_offset =
220 pAmergeCtx->NextData.CtrlData.MergeMDDampLM *
221 pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveLM_offset +
222 (1.0f - pAmergeCtx->NextData.CtrlData.MergeMDDampLM) *
223 pAmergeCtx->CurrData.HandleData.Merge_v10.MDCurveLM_offset;
224 pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveMS_smooth =
225 pAmergeCtx->NextData.CtrlData.MergeMDDampMS *
226 pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveMS_smooth +
227 (1.0f - pAmergeCtx->NextData.CtrlData.MergeMDDampMS) *
228 pAmergeCtx->CurrData.HandleData.Merge_v10.MDCurveMS_smooth;
229 pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveMS_offset =
230 pAmergeCtx->NextData.CtrlData.MergeMDDampMS *
231 pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveMS_offset +
232 (1.0f - pAmergeCtx->NextData.CtrlData.MergeMDDampMS) *
233 pAmergeCtx->CurrData.HandleData.Merge_v10.MDCurveMS_offset;
234 }
235
236 LOG1_AMERGE("%s:Eixt!\n", __FUNCTION__);
237 }
238
239 /******************************************************************************
240 * AmergeTuningProcessing()
241 *get handle para by config and current variate
242 *****************************************************************************/
AmergeTuningProcessing(AmergeContext_t * pAmergeCtx,RkAiqAmergeProcResult_t * pAmergeProcRes)243 void AmergeTuningProcessing(AmergeContext_t* pAmergeCtx, RkAiqAmergeProcResult_t* pAmergeProcRes) {
244 LOG1_AMERGE("%s:enter!\n", __FUNCTION__);
245
246 if (pAmergeCtx->mergeAttrV10.opMode == MERGE_OPMODE_AUTO) {
247 int lo = 0, hi = 0;
248 float ratio = 0.0f;
249 float CtrlValue = pAmergeCtx->NextData.CtrlData.ExpoData.EnvLv;
250 if (pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.CtrlDataType == CTRLDATATYPE_ISO)
251 CtrlValue = pAmergeCtx->NextData.CtrlData.ExpoData.ISO;
252
253 // get Current merge OECurve
254 ratio =
255 MergeGetInterpRatioV10(pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.OECurve.CtrlData,
256 lo, hi, CtrlValue, MERGE_ENVLV_STEP_MAX);
257 pAmergeCtx->NextData.HandleData.Merge_v10.OECurve_smooth =
258 ratio * (pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.OECurve.Smooth[hi] -
259 pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.OECurve.Smooth[lo]) +
260 pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.OECurve.Smooth[lo];
261 pAmergeCtx->NextData.HandleData.Merge_v10.OECurve_offset =
262 ratio * (pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.OECurve.Offset[hi] -
263 pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.OECurve.Offset[lo]) +
264 pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.OECurve.Offset[lo];
265
266 // get Current merge MDCurve
267 ratio = MergeGetInterpRatioV10(
268 pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.MDCurve.MoveCoef, lo, hi,
269 pAmergeCtx->NextData.CtrlData.MoveCoef, MERGE_ENVLV_STEP_MAX);
270 pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveLM_smooth =
271 ratio * (pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.MDCurve.LM_smooth[hi] -
272 pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.MDCurve.LM_smooth[lo]) +
273 pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.MDCurve.LM_smooth[lo];
274 pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveLM_offset =
275 ratio * (pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.MDCurve.LM_offset[hi] -
276 pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.MDCurve.LM_offset[lo]) +
277 pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.MDCurve.LM_offset[lo];
278 pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveMS_smooth =
279 ratio * (pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.MDCurve.MS_smooth[hi] -
280 pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.MDCurve.MS_smooth[lo]) +
281 pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.MDCurve.MS_smooth[lo];
282 pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveMS_offset =
283 ratio * (pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.MDCurve.MS_offset[hi] -
284 pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.MDCurve.MS_offset[lo]) +
285 pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.MDCurve.MS_offset[lo];
286
287 // others
288 pAmergeCtx->NextData.CtrlData.MergeOEDamp =
289 pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.OECurve_damp;
290 pAmergeCtx->NextData.CtrlData.MergeMDDampLM =
291 pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.MDCurveLM_damp;
292 pAmergeCtx->NextData.CtrlData.MergeMDDampMS =
293 pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.MDCurveMS_damp;
294
295 // merge damp
296 MergeDampingV10(pAmergeCtx);
297 } else if (pAmergeCtx->mergeAttrV10.opMode == MERGE_OPMODE_MANUAL) {
298 pAmergeCtx->NextData.HandleData.Merge_v10.OECurve_smooth =
299 pAmergeCtx->mergeAttrV10.stManual.OECurve.Smooth;
300 pAmergeCtx->NextData.HandleData.Merge_v10.OECurve_offset =
301 pAmergeCtx->mergeAttrV10.stManual.OECurve.Offset;
302
303 // get Current merge MDCurve
304 pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveLM_smooth =
305 pAmergeCtx->mergeAttrV10.stManual.MDCurve.LM_smooth;
306 pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveLM_offset =
307 pAmergeCtx->mergeAttrV10.stManual.MDCurve.LM_offset;
308 pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveMS_smooth =
309 pAmergeCtx->mergeAttrV10.stManual.MDCurve.MS_smooth;
310 pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveMS_offset =
311 pAmergeCtx->mergeAttrV10.stManual.MDCurve.MS_offset;
312 } else
313 LOGE_AMERGE("%s(%d): Amerge wrong mode!!!\n", __FUNCTION__, __LINE__);
314
315 LOGD_AMERGE("%s: Current OECurve_smooth:%f OECurve_offset:%f \n", __FUNCTION__,
316 pAmergeCtx->NextData.HandleData.Merge_v10.OECurve_smooth,
317 pAmergeCtx->NextData.HandleData.Merge_v10.OECurve_offset);
318 LOGD_AMERGE(
319 "%s: Current MDCurveMS_smooth:%f MDCurveMS_offset:%f MDCurveLM_smooth:%f "
320 "MDCurveLM_offset:%f \n",
321 __FUNCTION__, pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveMS_smooth,
322 pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveMS_offset,
323 pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveLM_smooth,
324 pAmergeCtx->NextData.HandleData.Merge_v10.MDCurveLM_offset);
325
326 // get current IO data
327 AmergeGetTuningProcResV10(pAmergeCtx, pAmergeProcRes);
328
329 // store current handle data to pre data for next loop
330 pAmergeCtx->NextData.CtrlData.ExpoData.EnvLv = pAmergeCtx->NextData.CtrlData.ExpoData.EnvLv;
331 pAmergeCtx->NextData.CtrlData.ExpoData.ISO = pAmergeCtx->NextData.CtrlData.ExpoData.ISO;
332 pAmergeCtx->CurrData.CtrlData.MoveCoef = pAmergeCtx->NextData.CtrlData.MoveCoef;
333 pAmergeCtx->CurrData.CtrlData.ApiMode = pAmergeCtx->mergeAttrV10.opMode;
334 memcpy(&pAmergeCtx->CurrData.HandleData, &pAmergeCtx->NextData.HandleData,
335 sizeof(MergeHandleData_s));
336
337 LOG1_AMERGE("%s:exit!\n", __FUNCTION__);
338 }
339
340 /******************************************************************************
341 * AmergeExpoProcessing()
342 *get handle para by config and current variate
343 *****************************************************************************/
AmergeExpoProcessing(AmergeContext_t * pAmergeCtx,MergeExpoData_t * pExpoData,RkAiqAmergeProcResult_t * pAmergeProcRes)344 void AmergeExpoProcessing(AmergeContext_t* pAmergeCtx, MergeExpoData_t* pExpoData,
345 RkAiqAmergeProcResult_t* pAmergeProcRes) {
346 LOG1_AMERGE("%s:enter!\n", __FUNCTION__);
347
348 // get sw_hdrmge_gain0
349 pAmergeProcRes->Merge_v10.sw_hdrmge_gain0 = (unsigned short)(64.0f * pExpoData->RatioLS);
350 if (pExpoData->RatioLS == 1.0f)
351 pAmergeProcRes->Merge_v10.sw_hdrmge_gain0_inv =
352 (unsigned short)(4096.0f * (1.0f / pExpoData->RatioLS) - 1.0f);
353 else
354 pAmergeProcRes->Merge_v10.sw_hdrmge_gain0_inv =
355 (unsigned short)(4096.0f * (1.0f / pExpoData->RatioLS));
356
357 // get sw_hdrmge_gain1
358 pAmergeProcRes->Merge_v10.sw_hdrmge_gain1 = SW_HDRMGE_GAIN_FIX;
359 pAmergeProcRes->Merge_v10.sw_hdrmge_gain1_inv = SW_HDRMGE_GAIN_INV_FIX;
360
361 // get sw_hdrmge_gain2
362 pAmergeProcRes->Merge_v10.sw_hdrmge_gain2 = SW_HDRMGE_GAIN_FIX;
363
364 // store next data
365 pAmergeCtx->CurrData.CtrlData.ExpoData.LongFrmMode =
366 pAmergeCtx->NextData.CtrlData.ExpoData.LongFrmMode;
367 pAmergeCtx->CurrData.CtrlData.ExpoData.RatioLS = pAmergeCtx->NextData.CtrlData.ExpoData.RatioLS;
368 pAmergeCtx->CurrData.CtrlData.ExpoData.RatioLM = pAmergeCtx->NextData.CtrlData.ExpoData.RatioLM;
369
370 LOGV_AMERGE(
371 "%s: sw_hdrmge_mode:%d sw_hdrmge_ms_dif_0p8:%d sw_hdrmge_lm_dif_0p9:%d "
372 "sw_hdrmge_ms_dif_0p15:%d sw_hdrmge_lm_dif_0p15:%d\n",
373 __FUNCTION__, pAmergeProcRes->Merge_v10.sw_hdrmge_mode,
374 pAmergeProcRes->Merge_v10.sw_hdrmge_ms_dif_0p8,
375 pAmergeProcRes->Merge_v10.sw_hdrmge_lm_dif_0p9,
376 pAmergeProcRes->Merge_v10.sw_hdrmge_ms_dif_0p15,
377 pAmergeProcRes->Merge_v10.sw_hdrmge_lm_dif_0p15);
378 LOGV_AMERGE(
379 "%s: RatioLS:%f sw_hdrmge_gain0:%d sw_hdrmge_gain0_inv:%d RatioLM:%f "
380 "sw_hdrmge_gain1:%d sw_hdrmge_gain1_inv:%d sw_hdrmge_gain2:%d\n",
381 __FUNCTION__, pExpoData->RatioLS, pAmergeProcRes->Merge_v10.sw_hdrmge_gain0,
382 pAmergeProcRes->Merge_v10.sw_hdrmge_gain0_inv, pExpoData->RatioLM,
383 pAmergeProcRes->Merge_v10.sw_hdrmge_gain1, pAmergeProcRes->Merge_v10.sw_hdrmge_gain1_inv,
384 pAmergeProcRes->Merge_v10.sw_hdrmge_gain2);
385 LOGV_AMERGE(
386 "%s: sw_hdrmge_e_y: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", __FUNCTION__,
387 pAmergeProcRes->Merge_v10.sw_hdrmge_e_y[0], pAmergeProcRes->Merge_v10.sw_hdrmge_e_y[1],
388 pAmergeProcRes->Merge_v10.sw_hdrmge_e_y[2], pAmergeProcRes->Merge_v10.sw_hdrmge_e_y[3],
389 pAmergeProcRes->Merge_v10.sw_hdrmge_e_y[4], pAmergeProcRes->Merge_v10.sw_hdrmge_e_y[5],
390 pAmergeProcRes->Merge_v10.sw_hdrmge_e_y[6], pAmergeProcRes->Merge_v10.sw_hdrmge_e_y[7],
391 pAmergeProcRes->Merge_v10.sw_hdrmge_e_y[8], pAmergeProcRes->Merge_v10.sw_hdrmge_e_y[9],
392 pAmergeProcRes->Merge_v10.sw_hdrmge_e_y[10], pAmergeProcRes->Merge_v10.sw_hdrmge_e_y[11],
393 pAmergeProcRes->Merge_v10.sw_hdrmge_e_y[12], pAmergeProcRes->Merge_v10.sw_hdrmge_e_y[13],
394 pAmergeProcRes->Merge_v10.sw_hdrmge_e_y[14], pAmergeProcRes->Merge_v10.sw_hdrmge_e_y[15],
395 pAmergeProcRes->Merge_v10.sw_hdrmge_e_y[16]);
396 LOGV_AMERGE(
397 "%s: sw_hdrmge_l0_y: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", __FUNCTION__,
398 pAmergeProcRes->Merge_v10.sw_hdrmge_l0_y[0], pAmergeProcRes->Merge_v10.sw_hdrmge_l0_y[1],
399 pAmergeProcRes->Merge_v10.sw_hdrmge_l0_y[2], pAmergeProcRes->Merge_v10.sw_hdrmge_l0_y[3],
400 pAmergeProcRes->Merge_v10.sw_hdrmge_l0_y[4], pAmergeProcRes->Merge_v10.sw_hdrmge_l0_y[5],
401 pAmergeProcRes->Merge_v10.sw_hdrmge_l0_y[6], pAmergeProcRes->Merge_v10.sw_hdrmge_l0_y[7],
402 pAmergeProcRes->Merge_v10.sw_hdrmge_l0_y[8], pAmergeProcRes->Merge_v10.sw_hdrmge_l0_y[9],
403 pAmergeProcRes->Merge_v10.sw_hdrmge_l0_y[10], pAmergeProcRes->Merge_v10.sw_hdrmge_l0_y[11],
404 pAmergeProcRes->Merge_v10.sw_hdrmge_l0_y[12], pAmergeProcRes->Merge_v10.sw_hdrmge_l0_y[13],
405 pAmergeProcRes->Merge_v10.sw_hdrmge_l0_y[14], pAmergeProcRes->Merge_v10.sw_hdrmge_l0_y[15],
406 pAmergeProcRes->Merge_v10.sw_hdrmge_l0_y[16]);
407 LOGV_AMERGE(
408 "%s: sw_hdrmge_l1_y: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", __FUNCTION__,
409 pAmergeProcRes->Merge_v10.sw_hdrmge_l1_y[0], pAmergeProcRes->Merge_v10.sw_hdrmge_l1_y[1],
410 pAmergeProcRes->Merge_v10.sw_hdrmge_l1_y[2], pAmergeProcRes->Merge_v10.sw_hdrmge_l1_y[3],
411 pAmergeProcRes->Merge_v10.sw_hdrmge_l1_y[4], pAmergeProcRes->Merge_v10.sw_hdrmge_l1_y[5],
412 pAmergeProcRes->Merge_v10.sw_hdrmge_l1_y[6], pAmergeProcRes->Merge_v10.sw_hdrmge_l1_y[7],
413 pAmergeProcRes->Merge_v10.sw_hdrmge_l1_y[8], pAmergeProcRes->Merge_v10.sw_hdrmge_l1_y[9],
414 pAmergeProcRes->Merge_v10.sw_hdrmge_l1_y[10], pAmergeProcRes->Merge_v10.sw_hdrmge_l1_y[11],
415 pAmergeProcRes->Merge_v10.sw_hdrmge_l1_y[12], pAmergeProcRes->Merge_v10.sw_hdrmge_l1_y[13],
416 pAmergeProcRes->Merge_v10.sw_hdrmge_l1_y[14], pAmergeProcRes->Merge_v10.sw_hdrmge_l1_y[15],
417 pAmergeProcRes->Merge_v10.sw_hdrmge_l1_y[16]);
418
419 LOG1_AMERGE("%s:exit!\n", __FUNCTION__);
420 }
421
422 /******************************************************************************
423 * AmergeByPassProcessing()
424 *get handle para by config and current variate
425 *****************************************************************************/
AmergeByPassProcessing(AmergeContext_t * pAmergeCtx)426 bool AmergeByPassProcessing(AmergeContext_t* pAmergeCtx) {
427 LOG1_AMERGE("%s:enter!\n", __FUNCTION__);
428
429 bool bypass = false;
430 float diff = 0.0f;
431
432 if (pAmergeCtx->FrameID <= 2)
433 bypass = false;
434 else if (pAmergeCtx->mergeAttrV10.opMode != pAmergeCtx->CurrData.CtrlData.ApiMode)
435 bypass = false;
436 else if (pAmergeCtx->mergeAttrV10.opMode == MERGE_OPMODE_MANUAL)
437 bypass = !pAmergeCtx->ifReCalcStManual;
438 else if (pAmergeCtx->mergeAttrV10.opMode == MERGE_OPMODE_AUTO) {
439 // get Current hdr mode
440 pAmergeCtx->NextData.HandleData.Merge_v10.MergeMode = pAmergeCtx->FrameNumber - 1;
441 if (pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.CtrlDataType == CTRLDATATYPE_ENVLV) {
442 diff = pAmergeCtx->CurrData.CtrlData.ExpoData.EnvLv -
443 pAmergeCtx->NextData.CtrlData.ExpoData.EnvLv;
444 if (pAmergeCtx->CurrData.CtrlData.ExpoData.EnvLv <= FLT_EPSILON) {
445 diff = pAmergeCtx->NextData.CtrlData.ExpoData.EnvLv;
446 if (diff <= FLT_EPSILON)
447 bypass = true;
448 else
449 bypass = false;
450 } else {
451 diff /= pAmergeCtx->CurrData.CtrlData.ExpoData.EnvLv;
452 if (diff >= pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.ByPassThr ||
453 diff <= -pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.ByPassThr)
454 bypass = false;
455 else
456 bypass = true;
457 }
458 } else if (pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.CtrlDataType ==
459 CTRLDATATYPE_ISO) {
460 diff = pAmergeCtx->CurrData.CtrlData.ExpoData.ISO -
461 pAmergeCtx->NextData.CtrlData.ExpoData.ISO;
462 diff /= pAmergeCtx->CurrData.CtrlData.ExpoData.ISO;
463 if (diff >= pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.ByPassThr ||
464 diff <= -pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.ByPassThr)
465 bypass = false;
466 else
467 bypass = true;
468 }
469 bypass = bypass && !pAmergeCtx->ifReCalcStAuto;
470 }
471
472 LOGD_AMERGE(
473 "%s: FrameID:%d HDRFrameNum:%d LongFrmMode:%d MergeApiMode:%d ifReCalcStAuto:%d "
474 "ifReCalcStManual:%d CtrlDataType:%d EnvLv:%f ISO:%f MoveCoef:%f "
475 "bypass:%d\n",
476 __FUNCTION__, pAmergeCtx->FrameID, pAmergeCtx->FrameNumber,
477 pAmergeCtx->NextData.CtrlData.ExpoData.LongFrmMode, pAmergeCtx->mergeAttrV10.opMode,
478 pAmergeCtx->ifReCalcStAuto, pAmergeCtx->ifReCalcStManual,
479 pAmergeCtx->mergeAttrV10.stAuto.MergeTuningPara.CtrlDataType,
480 pAmergeCtx->NextData.CtrlData.ExpoData.EnvLv, pAmergeCtx->NextData.CtrlData.ExpoData.ISO,
481 pAmergeCtx->NextData.CtrlData.MoveCoef, bypass);
482
483 LOG1_AMERGE("%s:exit!\n", __FUNCTION__);
484 return bypass;
485 }
486
487 /******************************************************************************
488 * AmergeInit()
489 *****************************************************************************/
AmergeInit(AmergeContext_t ** ppAmergeCtx,CamCalibDbV2Context_t * pCalibV2)490 XCamReturn AmergeInit(AmergeContext_t** ppAmergeCtx, CamCalibDbV2Context_t* pCalibV2) {
491 LOG1_AMERGE("%s:enter!\n", __FUNCTION__);
492
493 XCamReturn result = XCAM_RETURN_NO_ERROR;
494
495 AmergeContext_t* pAmergeCtx;
496 pAmergeCtx = (AmergeContext_t*)malloc(sizeof(AmergeContext_t));
497 if (pAmergeCtx == NULL) {
498 LOGE_ATMO("%s(%d): invalid inputparams\n", __FUNCTION__, __LINE__);
499 return XCAM_RETURN_ERROR_MEM;
500 }
501 *ppAmergeCtx = pAmergeCtx;
502 pAmergeCtx->state = AMERGE_STATE_INITIALIZED;
503
504 CalibDbV2_merge_v10_t* calibv2_amerge_calib =
505 (CalibDbV2_merge_v10_t*)(CALIBDBV2_GET_MODULE_PTR(pCalibV2, amerge_calib));
506 memcpy(&pAmergeCtx->mergeAttrV10.stAuto, calibv2_amerge_calib, sizeof(CalibDbV2_merge_v10_t));
507 pAmergeCtx->mergeAttrV10.opMode = MERGE_OPMODE_AUTO;
508 pAmergeCtx->ifReCalcStAuto = true;
509 pAmergeCtx->ifReCalcStManual = false;
510 pAmergeCtx->isCapture = false;
511
512 LOG1_AMERGE("%s:exit!\n", __FUNCTION__);
513 return (result);
514 }
515 /******************************************************************************
516 * AmergeRelease()
517 *****************************************************************************/
AmergeRelease(AmergeContext_t * pAmergeCtx)518 XCamReturn AmergeRelease(AmergeContext_t* pAmergeCtx) {
519 LOG1_AMERGE("%s:enter!\n", __FUNCTION__);
520 XCamReturn result = XCAM_RETURN_NO_ERROR;
521
522 // initial checks
523 if (NULL == pAmergeCtx) {
524 return (XCAM_RETURN_ERROR_MEM);
525 }
526
527 result = AmergeStop(pAmergeCtx);
528 if (result != XCAM_RETURN_NO_ERROR) {
529 LOGE_AMERGE("%s(%d): Amerge Stop() failed!\n", __FUNCTION__, __LINE__);
530 return (result);
531 }
532
533 // check state
534 if ((AMERGE_STATE_RUNNING == pAmergeCtx->state) || (AMERGE_STATE_LOCKED == pAmergeCtx->state)) {
535 return (XCAM_RETURN_ERROR_FAILED);
536 }
537
538 free(pAmergeCtx);
539 pAmergeCtx = NULL;
540
541 LOG1_AMERGE("%s:exit!\n", __FUNCTION__);
542
543 return (result);
544 }
545