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_v11.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
MergeGetInterpRatioV11(float * pX,int lo,int hi,float CtrlValue,int length_max)66 float MergeGetInterpRatioV11(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 * CalibrateOECurveV11()
94 *****************************************************************************/
CalibrateOECurveV11(float smooth,float offset,unsigned short * OECurve)95 void CalibrateOECurveV11(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_V11_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 * CalibrateMDCurveLongFrmMode()
114 *****************************************************************************/
CalibrateMDCurveLongFrmMode(float smooth,float offset,unsigned short * MDCurve)115 void CalibrateMDCurveLongFrmMode(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_V11_MD_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 * CalibrateMDCurveShortFrmMode()
135 *****************************************************************************/
CalibrateMDCurveShortFrmMode(float smooth,float offset,unsigned short * MDCurveLM,unsigned short * MDCurveMS)136 void CalibrateMDCurveShortFrmMode(float smooth, float offset, unsigned short* MDCurveLM,
137 unsigned short* MDCurveMS) {
138 LOG1_AMERGE("%s:Enter!\n", __FUNCTION__);
139
140 float step = 1.0f / 16.0f;
141 float curve = 0.0f;
142
143 for (int i = 0; i < HDRMGE_V11_MD_CURVE_NUM; ++i) {
144 curve = 0.01f + pow(i * step, 2.0f);
145 curve = 1024.0f * pow(i * step, 2.0f) / curve;
146 MDCurveLM[i] = round(curve);
147 MDCurveLM[i] = MIN(MDCurveLM[i], 1023);
148 MDCurveMS[i] = MDCurveLM[i];
149 }
150
151 LOG1_AMERGE("%s:Eixt!\n", __FUNCTION__);
152 }
153 /******************************************************************************
154 * AmergeGetTuningProcResV11()
155 *****************************************************************************/
AmergeGetTuningProcResV11(AmergeContext_t * pAmergeCtx,RkAiqAmergeProcResult_t * pAmergeProcRes)156 void AmergeGetTuningProcResV11(AmergeContext_t* pAmergeCtx,
157 RkAiqAmergeProcResult_t* pAmergeProcRes) {
158 LOG1_AMERGE("%s:Enter!\n", __FUNCTION__);
159
160 pAmergeProcRes->Merge_v11.sw_hdrmge_mode = pAmergeCtx->NextData.HandleData.Merge_v11.MergeMode;
161 pAmergeProcRes->Merge_v11.sw_hdrmge_s_base = pAmergeCtx->NextData.HandleData.Merge_v11.BaseFrm;
162 pAmergeProcRes->Merge_v11.sw_hdrmge_lm_dif_0p9 = SW_HDRMGE_LM_DIF_0P9_FIX;
163 pAmergeProcRes->Merge_v11.sw_hdrmge_ms_dif_0p8 = SW_HDRMGE_MS_DIF_0P8_FIX;
164 pAmergeProcRes->Merge_v11.sw_hdrmge_lm_dif_0p15 =
165 (unsigned char)(pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveLM_offset *
166 MDCURVEOFFSETMAX);
167 pAmergeProcRes->Merge_v11.sw_hdrmge_ms_dif_0p15 =
168 (unsigned char)(pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveMS_offset *
169 MDCURVEOFFSETMAX);
170
171 if (pAmergeCtx->NextData.CtrlData.ExpoData.LongFrmMode) {
172 for (int i = 0; i < HDRMGE_V11_OE_CURVE_NUM; i++)
173 pAmergeProcRes->Merge_v11.sw_hdrmge_e_y[i] = HDR_LONG_FRMAE_MODE_OECURVE;
174 } else {
175 if ((pAmergeCtx->NextData.HandleData.Merge_v11.OECurve_smooth -
176 pAmergeCtx->CurrData.HandleData.Merge_v11.OECurve_smooth) > FLT_EPSILON ||
177 (pAmergeCtx->NextData.HandleData.Merge_v11.OECurve_smooth -
178 pAmergeCtx->CurrData.HandleData.Merge_v11.OECurve_smooth) > FLT_EPSILON ||
179 (pAmergeCtx->NextData.HandleData.Merge_v11.OECurve_offset -
180 pAmergeCtx->CurrData.HandleData.Merge_v11.OECurve_offset) > FLT_EPSILON ||
181 (pAmergeCtx->NextData.HandleData.Merge_v11.OECurve_offset -
182 pAmergeCtx->CurrData.HandleData.Merge_v11.OECurve_offset) < -FLT_EPSILON)
183 CalibrateOECurveV11(pAmergeCtx->NextData.HandleData.Merge_v11.OECurve_smooth,
184 pAmergeCtx->NextData.HandleData.Merge_v11.OECurve_offset,
185 pAmergeProcRes->Merge_v11.sw_hdrmge_e_y);
186 }
187 if (pAmergeCtx->NextData.HandleData.Merge_v11.BaseFrm == BASEFRAME_LONG) {
188 if ((pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveLM_smooth -
189 pAmergeCtx->CurrData.HandleData.Merge_v11.MDCurveLM_smooth) > FLT_EPSILON ||
190 (pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveLM_smooth -
191 pAmergeCtx->CurrData.HandleData.Merge_v11.MDCurveLM_smooth) < -FLT_EPSILON ||
192 (pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveLM_offset -
193 pAmergeCtx->CurrData.HandleData.Merge_v11.MDCurveLM_offset) > FLT_EPSILON ||
194 (pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveLM_offset -
195 pAmergeCtx->CurrData.HandleData.Merge_v11.MDCurveLM_offset) < -FLT_EPSILON)
196 CalibrateMDCurveLongFrmMode(pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveLM_smooth,
197 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveLM_offset,
198 pAmergeProcRes->Merge_v11.sw_hdrmge_l1_y);
199 if ((pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveMS_smooth -
200 pAmergeCtx->CurrData.HandleData.Merge_v11.MDCurveMS_smooth) > FLT_EPSILON ||
201 (pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveMS_smooth -
202 pAmergeCtx->CurrData.HandleData.Merge_v11.MDCurveMS_smooth) < -FLT_EPSILON ||
203 (pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveMS_offset -
204 pAmergeCtx->CurrData.HandleData.Merge_v11.MDCurveMS_offset) > FLT_EPSILON ||
205 (pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveMS_offset -
206 pAmergeCtx->CurrData.HandleData.Merge_v11.MDCurveMS_offset) < -FLT_EPSILON)
207 CalibrateMDCurveLongFrmMode(pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveMS_smooth,
208 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveMS_offset,
209 pAmergeProcRes->Merge_v11.sw_hdrmge_l0_y);
210 } else if (pAmergeCtx->NextData.HandleData.Merge_v11.BaseFrm == BASEFRAME_SHORT) {
211 if ((pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveLM_smooth -
212 pAmergeCtx->CurrData.HandleData.Merge_v11.MDCurveLM_smooth) > FLT_EPSILON ||
213 (pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveLM_smooth -
214 pAmergeCtx->CurrData.HandleData.Merge_v11.MDCurveLM_smooth) > FLT_EPSILON ||
215 (pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveLM_offset -
216 pAmergeCtx->CurrData.HandleData.Merge_v11.MDCurveLM_offset) > FLT_EPSILON ||
217 (pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveLM_offset -
218 pAmergeCtx->CurrData.HandleData.Merge_v11.MDCurveLM_offset) > FLT_EPSILON)
219 CalibrateMDCurveShortFrmMode(pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveLM_smooth,
220 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveLM_offset,
221 pAmergeProcRes->Merge_v11.sw_hdrmge_l1_y,
222 pAmergeProcRes->Merge_v11.sw_hdrmge_l0_y);
223 }
224
225 LOG1_AMERGE("%s:Eixt!\n", __FUNCTION__);
226 }
227
228 /******************************************************************************
229 * MergeDampingV11()
230 *****************************************************************************/
MergeDampingV11(AmergeContext_t * pAmergeCtx)231 void MergeDampingV11(AmergeContext_t* pAmergeCtx) {
232 LOG1_AMERGE("%s:Enter!\n", __FUNCTION__);
233
234 if (pAmergeCtx->FrameID > 2) {
235 pAmergeCtx->NextData.HandleData.Merge_v11.OECurve_smooth =
236 pAmergeCtx->NextData.CtrlData.MergeOEDamp *
237 pAmergeCtx->NextData.HandleData.Merge_v11.OECurve_smooth +
238 (1.0f - pAmergeCtx->NextData.CtrlData.MergeOEDamp) *
239 pAmergeCtx->CurrData.HandleData.Merge_v11.OECurve_smooth;
240 pAmergeCtx->NextData.HandleData.Merge_v11.OECurve_offset =
241 pAmergeCtx->NextData.CtrlData.MergeOEDamp *
242 pAmergeCtx->NextData.HandleData.Merge_v11.OECurve_offset +
243 (1.0f - pAmergeCtx->NextData.CtrlData.MergeOEDamp) *
244 pAmergeCtx->CurrData.HandleData.Merge_v11.OECurve_offset;
245 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveLM_smooth =
246 pAmergeCtx->NextData.CtrlData.MergeMDDampLM *
247 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveLM_smooth +
248 (1.0f - pAmergeCtx->NextData.CtrlData.MergeMDDampLM) *
249 pAmergeCtx->CurrData.HandleData.Merge_v11.MDCurveLM_smooth;
250 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveLM_offset =
251 pAmergeCtx->NextData.CtrlData.MergeMDDampLM *
252 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveLM_offset +
253 (1.0f - pAmergeCtx->NextData.CtrlData.MergeMDDampLM) *
254 pAmergeCtx->CurrData.HandleData.Merge_v11.MDCurveLM_offset;
255 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveMS_smooth =
256 pAmergeCtx->NextData.CtrlData.MergeMDDampMS *
257 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveMS_smooth +
258 (1.0f - pAmergeCtx->NextData.CtrlData.MergeMDDampMS) *
259 pAmergeCtx->CurrData.HandleData.Merge_v11.MDCurveMS_smooth;
260 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveMS_offset =
261 pAmergeCtx->NextData.CtrlData.MergeMDDampMS *
262 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveMS_offset +
263 (1.0f - pAmergeCtx->NextData.CtrlData.MergeMDDampMS) *
264 pAmergeCtx->CurrData.HandleData.Merge_v11.MDCurveMS_offset;
265
266 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurve_Coef =
267 pAmergeCtx->NextData.CtrlData.MergeMDDampMS *
268 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurve_Coef +
269 (1.0f - pAmergeCtx->NextData.CtrlData.MergeMDDampMS) *
270 pAmergeCtx->CurrData.HandleData.Merge_v11.MDCurve_Coef;
271 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurve_ms_thd0 =
272 pAmergeCtx->NextData.CtrlData.MergeMDDampMS *
273 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurve_ms_thd0 +
274 (1.0f - pAmergeCtx->NextData.CtrlData.MergeMDDampMS) *
275 pAmergeCtx->CurrData.HandleData.Merge_v11.MDCurve_ms_thd0;
276 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurve_lm_thd0 =
277 pAmergeCtx->NextData.CtrlData.MergeMDDampMS *
278 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurve_lm_thd0 +
279 (1.0f - pAmergeCtx->NextData.CtrlData.MergeMDDampMS) *
280 pAmergeCtx->CurrData.HandleData.Merge_v11.MDCurve_lm_thd0;
281 }
282
283 LOG1_AMERGE("%s:Eixt!\n", __FUNCTION__);
284 }
285
286 /******************************************************************************
287 * AmergeTuningProcessing()
288 *get handle para by config and current variate
289 *****************************************************************************/
AmergeTuningProcessing(AmergeContext_t * pAmergeCtx,RkAiqAmergeProcResult_t * pAmergeProcRes)290 void AmergeTuningProcessing(AmergeContext_t* pAmergeCtx, RkAiqAmergeProcResult_t* pAmergeProcRes) {
291 LOG1_AMERGE("%s:enter!\n", __FUNCTION__);
292
293 if (pAmergeCtx->mergeAttrV11.opMode == MERGE_OPMODE_AUTO) {
294 int lo = 0, hi = 0;
295 float ratio = 0.0f;
296 float CtrlValue = pAmergeCtx->NextData.CtrlData.ExpoData.EnvLv;
297 if (pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.CtrlDataType == CTRLDATATYPE_ISO)
298 CtrlValue = pAmergeCtx->NextData.CtrlData.ExpoData.ISO;
299
300 pAmergeCtx->NextData.HandleData.Merge_v11.BaseFrm =
301 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.BaseFrm;
302 if (pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.BaseFrm == BASEFRAME_LONG) {
303 // get Current merge OECurve
304 ratio = MergeGetInterpRatioV11(
305 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.LongFrmModeData.OECurve.CtrlData,
306 lo, hi, CtrlValue, MERGE_ENVLV_STEP_MAX);
307 pAmergeCtx->NextData.HandleData.Merge_v11.OECurve_smooth =
308 ratio * (pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.LongFrmModeData.OECurve
309 .Smooth[hi] -
310 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.LongFrmModeData.OECurve
311 .Smooth[lo]) +
312 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.LongFrmModeData.OECurve.Smooth[lo];
313 pAmergeCtx->NextData.HandleData.Merge_v11.OECurve_offset =
314 ratio * (pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.LongFrmModeData.OECurve
315 .Offset[hi] -
316 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.LongFrmModeData.OECurve
317 .Offset[lo]) +
318 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.LongFrmModeData.OECurve.Offset[lo];
319
320 // get Current merge MDCurve
321 ratio = MergeGetInterpRatioV11(
322 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.LongFrmModeData.MDCurve.MoveCoef,
323 lo, hi, pAmergeCtx->NextData.CtrlData.MoveCoef, MERGE_ENVLV_STEP_MAX);
324 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveLM_smooth =
325 ratio * (pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.LongFrmModeData.MDCurve
326 .LM_smooth[hi] -
327 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.LongFrmModeData.MDCurve
328 .LM_smooth[lo]) +
329 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.LongFrmModeData.MDCurve
330 .LM_smooth[lo];
331 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveLM_offset =
332 ratio * (pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.LongFrmModeData.MDCurve
333 .LM_offset[hi] -
334 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.LongFrmModeData.MDCurve
335 .LM_offset[lo]) +
336 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.LongFrmModeData.MDCurve
337 .LM_offset[lo];
338 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveMS_smooth =
339 ratio * (pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.LongFrmModeData.MDCurve
340 .MS_smooth[hi] -
341 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.LongFrmModeData.MDCurve
342 .MS_smooth[lo]) +
343 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.LongFrmModeData.MDCurve
344 .MS_smooth[lo];
345 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveMS_offset =
346 ratio * (pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.LongFrmModeData.MDCurve
347 .MS_offset[hi] -
348 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.LongFrmModeData.MDCurve
349 .MS_offset[lo]) +
350 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.LongFrmModeData.MDCurve
351 .MS_offset[lo];
352
353 pAmergeCtx->NextData.CtrlData.MergeOEDamp =
354 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.LongFrmModeData.OECurve_damp;
355 pAmergeCtx->NextData.CtrlData.MergeMDDampLM =
356 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.LongFrmModeData.MDCurveLM_damp;
357 pAmergeCtx->NextData.CtrlData.MergeMDDampMS =
358 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.LongFrmModeData.MDCurveMS_damp;
359 } else if (pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.BaseFrm == BASEFRAME_SHORT) {
360 // get Current merge OECurve
361 ratio = MergeGetInterpRatioV11(
362 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.ShortFrmModeData.OECurve.CtrlData,
363 lo, hi, CtrlValue, MERGE_ENVLV_STEP_MAX);
364 pAmergeCtx->NextData.HandleData.Merge_v11.OECurve_smooth =
365 ratio * (pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.ShortFrmModeData.OECurve
366 .Smooth[hi] -
367 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.ShortFrmModeData.OECurve
368 .Smooth[lo]) +
369 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.ShortFrmModeData.OECurve.Smooth[lo];
370 pAmergeCtx->NextData.HandleData.Merge_v11.OECurve_offset =
371 ratio * (pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.ShortFrmModeData.OECurve
372 .Offset[hi] -
373 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.ShortFrmModeData.OECurve
374 .Offset[lo]) +
375 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.ShortFrmModeData.OECurve.Offset[lo];
376
377 // get Current merge MDCurve
378 ratio = MergeGetInterpRatioV11(
379 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.ShortFrmModeData.MDCurve.MoveCoef,
380 lo, hi, pAmergeCtx->NextData.CtrlData.MoveCoef, MERGE_ENVLV_STEP_MAX);
381 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurve_Coef =
382 ratio * (pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.ShortFrmModeData.MDCurve
383 .Coef[hi] -
384 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.ShortFrmModeData.MDCurve
385 .Coef[lo]) +
386 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.ShortFrmModeData.MDCurve.Coef[lo];
387 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurve_ms_thd0 =
388 ratio * (pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.ShortFrmModeData.MDCurve
389 .ms_thd0[hi] -
390 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.ShortFrmModeData.MDCurve
391 .ms_thd0[lo]) +
392 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.ShortFrmModeData.MDCurve
393 .ms_thd0[lo];
394 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurve_lm_thd0 =
395 ratio * (pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.ShortFrmModeData.MDCurve
396 .lm_thd0[hi] -
397 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.ShortFrmModeData.MDCurve
398 .lm_thd0[lo]) +
399 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.ShortFrmModeData.MDCurve
400 .lm_thd0[lo];
401
402 pAmergeCtx->NextData.CtrlData.MergeOEDamp =
403 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.ShortFrmModeData.OECurve_damp;
404 pAmergeCtx->NextData.CtrlData.MergeMDDampLM =
405 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.ShortFrmModeData.MDCurve_damp;
406 pAmergeCtx->NextData.CtrlData.MergeMDDampMS =
407 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.ShortFrmModeData.MDCurve_damp;
408 }
409 // merge damp
410 MergeDampingV11(pAmergeCtx);
411 } else if (pAmergeCtx->mergeAttrV11.opMode == MERGE_OPMODE_MANUAL) {
412 pAmergeCtx->NextData.HandleData.Merge_v11.BaseFrm =
413 pAmergeCtx->mergeAttrV11.stManual.BaseFrm;
414 if (pAmergeCtx->mergeAttrV11.stManual.BaseFrm == BASEFRAME_LONG) {
415 // get Current merge OECurve
416 pAmergeCtx->NextData.HandleData.Merge_v11.OECurve_smooth =
417 pAmergeCtx->mergeAttrV11.stManual.LongFrmModeData.OECurve.Smooth;
418 pAmergeCtx->NextData.HandleData.Merge_v11.OECurve_offset =
419 pAmergeCtx->mergeAttrV11.stManual.LongFrmModeData.OECurve.Offset;
420
421 // get Current merge MDCurve
422 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveLM_smooth =
423 pAmergeCtx->mergeAttrV11.stManual.LongFrmModeData.MDCurve.LM_smooth;
424 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveLM_offset =
425 pAmergeCtx->mergeAttrV11.stManual.LongFrmModeData.MDCurve.LM_offset;
426 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveMS_smooth =
427 pAmergeCtx->mergeAttrV11.stManual.LongFrmModeData.MDCurve.MS_smooth;
428 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveMS_offset =
429 pAmergeCtx->mergeAttrV11.stManual.LongFrmModeData.MDCurve.MS_offset;
430 } else if (pAmergeCtx->mergeAttrV11.stManual.BaseFrm == BASEFRAME_SHORT) {
431 // get Current merge OECurve
432 pAmergeCtx->NextData.HandleData.Merge_v11.OECurve_smooth =
433 pAmergeCtx->mergeAttrV11.stManual.ShortFrmModeData.OECurve.Smooth;
434 pAmergeCtx->NextData.HandleData.Merge_v11.OECurve_offset =
435 pAmergeCtx->mergeAttrV11.stManual.ShortFrmModeData.OECurve.Offset;
436
437 // get Current merge MDCurve
438 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurve_Coef =
439 pAmergeCtx->mergeAttrV11.stManual.ShortFrmModeData.MDCurve.Coef;
440 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurve_ms_thd0 =
441 pAmergeCtx->mergeAttrV11.stManual.ShortFrmModeData.MDCurve.ms_thd0;
442 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurve_lm_thd0 =
443 pAmergeCtx->mergeAttrV11.stManual.ShortFrmModeData.MDCurve.lm_thd0;
444 }
445 }
446
447 LOGD_AMERGE("%s: Current BaseFrm:%d OECurve_smooth:%f OECurve_offset:%f \n", __FUNCTION__,
448 pAmergeCtx->NextData.HandleData.Merge_v11.BaseFrm,
449 pAmergeCtx->NextData.HandleData.Merge_v11.OECurve_smooth,
450 pAmergeCtx->NextData.HandleData.Merge_v11.OECurve_offset);
451 if (pAmergeCtx->NextData.HandleData.Merge_v11.BaseFrm == BASEFRAME_LONG)
452 LOGD_AMERGE(
453 "%s: Current MDCurveMS_smooth:%f MDCurveMS_offset:%f MDCurveLM_smooth:%f "
454 "MDCurveLM_offset:%f \n",
455 __FUNCTION__, pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveMS_smooth,
456 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveMS_offset,
457 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveLM_smooth,
458 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurveLM_offset);
459 else if (pAmergeCtx->NextData.HandleData.Merge_v11.BaseFrm == BASEFRAME_SHORT) {
460 LOGD_AMERGE("%s: Current MDCurve_Coef:%f MDCurve_ms_thd0:%f MDCurve_lm_thd0:%f\n",
461 __FUNCTION__, pAmergeCtx->NextData.HandleData.Merge_v11.MDCurve_Coef,
462 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurve_ms_thd0,
463 pAmergeCtx->NextData.HandleData.Merge_v11.MDCurve_lm_thd0);
464 }
465
466 // get current IO data
467 AmergeGetTuningProcResV11(pAmergeCtx, pAmergeProcRes);
468
469 // store current handle data to pre data for next loop
470 pAmergeCtx->NextData.CtrlData.ExpoData.EnvLv = pAmergeCtx->NextData.CtrlData.ExpoData.EnvLv;
471 pAmergeCtx->NextData.CtrlData.ExpoData.ISO = pAmergeCtx->NextData.CtrlData.ExpoData.ISO;
472 pAmergeCtx->CurrData.CtrlData.MoveCoef = pAmergeCtx->NextData.CtrlData.MoveCoef;
473 pAmergeCtx->CurrData.CtrlData.ApiMode = pAmergeCtx->mergeAttrV11.opMode;
474 memcpy(&pAmergeCtx->CurrData.HandleData, &pAmergeCtx->NextData.HandleData,
475 sizeof(MergeHandleData_s));
476
477 LOG1_AMERGE("%s:exit!\n", __FUNCTION__);
478 }
479
480 /******************************************************************************
481 * AmergeExpoProcessing()
482 *get handle para by config and current variate
483 *****************************************************************************/
AmergeExpoProcessing(AmergeContext_t * pAmergeCtx,MergeExpoData_t * pExpoData,RkAiqAmergeProcResult_t * pAmergeProcRes)484 void AmergeExpoProcessing(AmergeContext_t* pAmergeCtx, MergeExpoData_t* pExpoData,
485 RkAiqAmergeProcResult_t* pAmergeProcRes) {
486 LOG1_AMERGE("%s:enter!\n", __FUNCTION__);
487
488 // get sw_hdrmge_gain0
489 pAmergeProcRes->Merge_v11.sw_hdrmge_gain0 = (unsigned short)(64.0f * pExpoData->RatioLS);
490 if (pExpoData->RatioLS == 1.0f)
491 pAmergeProcRes->Merge_v11.sw_hdrmge_gain0_inv =
492 (unsigned short)(4096.0f * (1.0f / pExpoData->RatioLS) - 1.0f);
493 else
494 pAmergeProcRes->Merge_v11.sw_hdrmge_gain0_inv =
495 (unsigned short)(4096.0f * (1.0f / pExpoData->RatioLS));
496
497 // get sw_hdrmge_gain1
498 pAmergeProcRes->Merge_v11.sw_hdrmge_gain1 = (unsigned short)(64.0f * pExpoData->RatioLM);
499 if (pExpoData->RatioLM == 1.0f)
500 pAmergeProcRes->Merge_v11.sw_hdrmge_gain1_inv =
501 (unsigned short)(4096.0f * (1.0f / pExpoData->RatioLM) - 1.0f);
502 else
503 pAmergeProcRes->Merge_v11.sw_hdrmge_gain1_inv =
504 (unsigned short)(4096.0f * (1.0f / pExpoData->RatioLM));
505
506 // get sw_hdrmge_gain2
507 pAmergeProcRes->Merge_v11.sw_hdrmge_gain2 = SW_HDRMGE_GAIN_FIX;
508
509 // isp30 add
510 if (pAmergeCtx->NextData.HandleData.Merge_v11.BaseFrm == BASEFRAME_SHORT) {
511 float Coef = pAmergeCtx->NextData.HandleData.Merge_v11.MDCurve_Coef * SHORT_MODE_COEF_MAX;
512 float sw_hdrmge_ms_thd0 = pAmergeCtx->NextData.HandleData.Merge_v11.MDCurve_ms_thd0;
513 float sw_hdrmge_lm_thd0 = pAmergeCtx->NextData.HandleData.Merge_v11.MDCurve_lm_thd0;
514 float sw_hdrmge_ms_thd1 = pow(100.0f * Coef * pExpoData->SGain, 0.5f);
515 float sw_hdrmge_lm_thd1 = pow(100.0f * Coef * pExpoData->MGain, 0.5f);
516 float sw_hdrmge_ms_scl = (sw_hdrmge_ms_thd1 == sw_hdrmge_ms_thd0)
517 ? 0.0f
518 : (1.0f / (sw_hdrmge_ms_thd1 - sw_hdrmge_ms_thd0));
519 float sw_hdrmge_lm_scl = (sw_hdrmge_lm_thd1 == sw_hdrmge_lm_thd0)
520 ? 0.0f
521 : (1.0f / (sw_hdrmge_lm_thd1 - sw_hdrmge_lm_thd0));
522 pAmergeProcRes->Merge_v11.sw_hdrmge_ms_thd0 = (unsigned short)(1024.0f * sw_hdrmge_ms_thd0);
523 pAmergeProcRes->Merge_v11.sw_hdrmge_ms_thd1 = (unsigned short)(1024.0f * sw_hdrmge_ms_thd1);
524 pAmergeProcRes->Merge_v11.sw_hdrmge_ms_scl = (unsigned short)(64.0f * sw_hdrmge_ms_scl);
525 pAmergeProcRes->Merge_v11.sw_hdrmge_lm_thd0 = (unsigned short)(1024.0f * sw_hdrmge_lm_thd0);
526 pAmergeProcRes->Merge_v11.sw_hdrmge_lm_thd1 = (unsigned short)(1024.0f * sw_hdrmge_lm_thd1);
527 pAmergeProcRes->Merge_v11.sw_hdrmge_lm_scl = (unsigned short)(64.0f * sw_hdrmge_lm_scl);
528 }
529
530 // store next data
531 pAmergeCtx->CurrData.CtrlData.ExpoData.LongFrmMode =
532 pAmergeCtx->NextData.CtrlData.ExpoData.LongFrmMode;
533 pAmergeCtx->CurrData.CtrlData.ExpoData.RatioLS = pAmergeCtx->NextData.CtrlData.ExpoData.RatioLS;
534 pAmergeCtx->CurrData.CtrlData.ExpoData.RatioLM = pAmergeCtx->NextData.CtrlData.ExpoData.RatioLM;
535 pAmergeCtx->CurrData.CtrlData.ExpoData.SGain = pAmergeCtx->NextData.CtrlData.ExpoData.SGain;
536 pAmergeCtx->CurrData.CtrlData.ExpoData.MGain = pAmergeCtx->NextData.CtrlData.ExpoData.MGain;
537
538 LOGV_AMERGE(
539 "%s: sw_hdrmge_mode:%d sw_hdrmge_ms_dif_0p8:%d sw_hdrmge_lm_dif_0p9:%d "
540 "sw_hdrmge_ms_dif_0p15:%d sw_hdrmge_lm_dif_0p15:%d\n",
541 __FUNCTION__, pAmergeProcRes->Merge_v11.sw_hdrmge_mode,
542 pAmergeProcRes->Merge_v11.sw_hdrmge_ms_dif_0p8,
543 pAmergeProcRes->Merge_v11.sw_hdrmge_lm_dif_0p9,
544 pAmergeProcRes->Merge_v11.sw_hdrmge_ms_dif_0p15,
545 pAmergeProcRes->Merge_v11.sw_hdrmge_lm_dif_0p15);
546 LOGV_AMERGE(
547 "%s: RatioLS:%f sw_hdrmge_gain0:%d sw_hdrmge_gain0_inv:%d RatioLM:%f "
548 "sw_hdrmge_gain1:%d sw_hdrmge_gain1_inv:%d sw_hdrmge_gain2:%d\n",
549 __FUNCTION__, pExpoData->RatioLS, pAmergeProcRes->Merge_v11.sw_hdrmge_gain0,
550 pAmergeProcRes->Merge_v11.sw_hdrmge_gain0_inv, pExpoData->RatioLM,
551 pAmergeProcRes->Merge_v11.sw_hdrmge_gain1, pAmergeProcRes->Merge_v11.sw_hdrmge_gain1_inv,
552 pAmergeProcRes->Merge_v11.sw_hdrmge_gain2);
553 LOGV_AMERGE("%s: sw_hdrmge_ms_thd0:%d sw_hdrmge_ms_thd1:%d sw_hdrmge_ms_scl:%d\n", __FUNCTION__,
554 pAmergeProcRes->Merge_v11.sw_hdrmge_ms_thd0,
555 pAmergeProcRes->Merge_v11.sw_hdrmge_ms_thd1,
556 pAmergeProcRes->Merge_v11.sw_hdrmge_ms_scl);
557 LOGV_AMERGE("%s: sw_hdrmge_lm_thd0:%d sw_hdrmge_lm_thd1:%d sw_hdrmge_lm_scl:%d\n", __FUNCTION__,
558 pAmergeProcRes->Merge_v11.sw_hdrmge_lm_thd0,
559 pAmergeProcRes->Merge_v11.sw_hdrmge_lm_thd1,
560 pAmergeProcRes->Merge_v11.sw_hdrmge_lm_scl);
561 LOGV_AMERGE(
562 "%s: sw_hdrmge_e_y: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", __FUNCTION__,
563 pAmergeProcRes->Merge_v11.sw_hdrmge_e_y[0], pAmergeProcRes->Merge_v11.sw_hdrmge_e_y[1],
564 pAmergeProcRes->Merge_v11.sw_hdrmge_e_y[2], pAmergeProcRes->Merge_v11.sw_hdrmge_e_y[3],
565 pAmergeProcRes->Merge_v11.sw_hdrmge_e_y[4], pAmergeProcRes->Merge_v11.sw_hdrmge_e_y[5],
566 pAmergeProcRes->Merge_v11.sw_hdrmge_e_y[6], pAmergeProcRes->Merge_v11.sw_hdrmge_e_y[7],
567 pAmergeProcRes->Merge_v11.sw_hdrmge_e_y[8], pAmergeProcRes->Merge_v11.sw_hdrmge_e_y[9],
568 pAmergeProcRes->Merge_v11.sw_hdrmge_e_y[10], pAmergeProcRes->Merge_v11.sw_hdrmge_e_y[11],
569 pAmergeProcRes->Merge_v11.sw_hdrmge_e_y[12], pAmergeProcRes->Merge_v11.sw_hdrmge_e_y[13],
570 pAmergeProcRes->Merge_v11.sw_hdrmge_e_y[14], pAmergeProcRes->Merge_v11.sw_hdrmge_e_y[15],
571 pAmergeProcRes->Merge_v11.sw_hdrmge_e_y[16]);
572 LOGV_AMERGE(
573 "%s: sw_hdrmge_l0_y: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", __FUNCTION__,
574 pAmergeProcRes->Merge_v11.sw_hdrmge_l0_y[0], pAmergeProcRes->Merge_v11.sw_hdrmge_l0_y[1],
575 pAmergeProcRes->Merge_v11.sw_hdrmge_l0_y[2], pAmergeProcRes->Merge_v11.sw_hdrmge_l0_y[3],
576 pAmergeProcRes->Merge_v11.sw_hdrmge_l0_y[4], pAmergeProcRes->Merge_v11.sw_hdrmge_l0_y[5],
577 pAmergeProcRes->Merge_v11.sw_hdrmge_l0_y[6], pAmergeProcRes->Merge_v11.sw_hdrmge_l0_y[7],
578 pAmergeProcRes->Merge_v11.sw_hdrmge_l0_y[8], pAmergeProcRes->Merge_v11.sw_hdrmge_l0_y[9],
579 pAmergeProcRes->Merge_v11.sw_hdrmge_l0_y[10], pAmergeProcRes->Merge_v11.sw_hdrmge_l0_y[11],
580 pAmergeProcRes->Merge_v11.sw_hdrmge_l0_y[12], pAmergeProcRes->Merge_v11.sw_hdrmge_l0_y[13],
581 pAmergeProcRes->Merge_v11.sw_hdrmge_l0_y[14], pAmergeProcRes->Merge_v11.sw_hdrmge_l0_y[15],
582 pAmergeProcRes->Merge_v11.sw_hdrmge_l0_y[16]);
583 LOGV_AMERGE(
584 "%s: sw_hdrmge_l1_y: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", __FUNCTION__,
585 pAmergeProcRes->Merge_v11.sw_hdrmge_l1_y[0], pAmergeProcRes->Merge_v11.sw_hdrmge_l1_y[1],
586 pAmergeProcRes->Merge_v11.sw_hdrmge_l1_y[2], pAmergeProcRes->Merge_v11.sw_hdrmge_l1_y[3],
587 pAmergeProcRes->Merge_v11.sw_hdrmge_l1_y[4], pAmergeProcRes->Merge_v11.sw_hdrmge_l1_y[5],
588 pAmergeProcRes->Merge_v11.sw_hdrmge_l1_y[6], pAmergeProcRes->Merge_v11.sw_hdrmge_l1_y[7],
589 pAmergeProcRes->Merge_v11.sw_hdrmge_l1_y[8], pAmergeProcRes->Merge_v11.sw_hdrmge_l1_y[9],
590 pAmergeProcRes->Merge_v11.sw_hdrmge_l1_y[10], pAmergeProcRes->Merge_v11.sw_hdrmge_l1_y[11],
591 pAmergeProcRes->Merge_v11.sw_hdrmge_l1_y[12], pAmergeProcRes->Merge_v11.sw_hdrmge_l1_y[13],
592 pAmergeProcRes->Merge_v11.sw_hdrmge_l1_y[14], pAmergeProcRes->Merge_v11.sw_hdrmge_l1_y[15],
593 pAmergeProcRes->Merge_v11.sw_hdrmge_l1_y[16]);
594
595 LOG1_AMERGE("%s:exit!\n", __FUNCTION__);
596 }
597
598 /******************************************************************************
599 * AmergeByPassProcessing()
600 *get handle para by config and current variate
601 *****************************************************************************/
AmergeByPassProcessing(AmergeContext_t * pAmergeCtx)602 bool AmergeByPassProcessing(AmergeContext_t* pAmergeCtx) {
603 LOG1_AMERGE("%s:enter!\n", __FUNCTION__);
604
605 bool bypass = false;
606 float diff = 0.0f;
607
608 if (pAmergeCtx->FrameID <= 2)
609 bypass = false;
610 else if (pAmergeCtx->mergeAttrV11.opMode != pAmergeCtx->CurrData.CtrlData.ApiMode)
611 bypass = false;
612 else if (pAmergeCtx->mergeAttrV11.opMode == MERGE_OPMODE_MANUAL)
613 bypass = !pAmergeCtx->ifReCalcStManual;
614 else if (pAmergeCtx->mergeAttrV11.opMode == MERGE_OPMODE_AUTO) {
615 pAmergeCtx->NextData.HandleData.Merge_v11.MergeMode = pAmergeCtx->FrameNumber - 1;
616 if (pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.CtrlDataType == CTRLDATATYPE_ENVLV) {
617 diff = pAmergeCtx->CurrData.CtrlData.ExpoData.EnvLv -
618 pAmergeCtx->NextData.CtrlData.ExpoData.EnvLv;
619 if (pAmergeCtx->CurrData.CtrlData.ExpoData.EnvLv <= FLT_EPSILON) {
620 diff = pAmergeCtx->NextData.CtrlData.ExpoData.EnvLv;
621 if (diff <= FLT_EPSILON)
622 bypass = true;
623 else
624 bypass = false;
625 } else {
626 diff /= pAmergeCtx->CurrData.CtrlData.ExpoData.EnvLv;
627 if (diff >= pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.ByPassThr ||
628 diff <= -pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.ByPassThr)
629 bypass = false;
630 else
631 bypass = true;
632 }
633 } else if (pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.CtrlDataType ==
634 CTRLDATATYPE_ISO) {
635 diff = pAmergeCtx->CurrData.CtrlData.ExpoData.ISO -
636 pAmergeCtx->NextData.CtrlData.ExpoData.ISO;
637 diff /= pAmergeCtx->CurrData.CtrlData.ExpoData.ISO;
638 if (diff >= pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.ByPassThr ||
639 diff <= -pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.ByPassThr)
640 bypass = false;
641 else
642 bypass = true;
643 }
644 bypass = bypass && !pAmergeCtx->ifReCalcStAuto;
645 }
646
647 LOGD_AMERGE(
648 "%s: FrameID:%d HDRFrameNum:%d LongFrmMode:%d MergeApiMode:%d ifReCalcStAuto:%d "
649 "ifReCalcStManual:%d CtrlDataType:%d EnvLv:%f ISO:%f MoveCoef:%f "
650 "bypass:%d\n",
651 __FUNCTION__, pAmergeCtx->FrameID, pAmergeCtx->FrameNumber,
652 pAmergeCtx->NextData.CtrlData.ExpoData.LongFrmMode, pAmergeCtx->mergeAttrV11.opMode,
653 pAmergeCtx->ifReCalcStAuto, pAmergeCtx->ifReCalcStManual,
654 pAmergeCtx->mergeAttrV11.stAuto.MergeTuningPara.CtrlDataType,
655 pAmergeCtx->NextData.CtrlData.ExpoData.EnvLv, pAmergeCtx->NextData.CtrlData.ExpoData.ISO,
656 pAmergeCtx->NextData.CtrlData.MoveCoef, bypass);
657
658 LOG1_AMERGE("%s:exit!\n", __FUNCTION__);
659 return bypass;
660 }
661
662 /******************************************************************************
663 * AmergeInit()
664 *****************************************************************************/
AmergeInit(AmergeContext_t ** ppAmergeCtx,CamCalibDbV2Context_t * pCalibV2)665 XCamReturn AmergeInit(AmergeContext_t** ppAmergeCtx, CamCalibDbV2Context_t* pCalibV2) {
666 LOG1_AMERGE("%s:enter!\n", __FUNCTION__);
667
668 XCamReturn result = XCAM_RETURN_NO_ERROR;
669
670 AmergeContext_t* pAmergeCtx;
671 pAmergeCtx = (AmergeContext_t*)malloc(sizeof(AmergeContext_t));
672 if (pAmergeCtx == NULL) {
673 LOGE_ATMO("%s(%d): invalid inputparams\n", __FUNCTION__, __LINE__);
674 return XCAM_RETURN_ERROR_MEM;
675 }
676 *ppAmergeCtx = pAmergeCtx;
677 pAmergeCtx->state = AMERGE_STATE_INITIALIZED;
678
679 CalibDbV2_merge_v11_t* calibv2_amerge_calib =
680 (CalibDbV2_merge_v11_t*)(CALIBDBV2_GET_MODULE_PTR(pCalibV2, amerge_calib));
681 memcpy(&pAmergeCtx->mergeAttrV11.stAuto, calibv2_amerge_calib, sizeof(CalibDbV2_merge_v11_t));
682 pAmergeCtx->mergeAttrV11.opMode = MERGE_OPMODE_AUTO;
683 pAmergeCtx->ifReCalcStAuto = true;
684 pAmergeCtx->ifReCalcStManual = false;
685 pAmergeCtx->isCapture = false;
686
687 LOG1_AMERGE("%s:exit!\n", __FUNCTION__);
688 return (result);
689 }
690 /******************************************************************************
691 * AmergeRelease()
692 *****************************************************************************/
AmergeRelease(AmergeContext_t * pAmergeCtx)693 XCamReturn AmergeRelease(AmergeContext_t* pAmergeCtx) {
694 LOG1_AMERGE("%s:enter!\n", __FUNCTION__);
695 XCamReturn result = XCAM_RETURN_NO_ERROR;
696
697 // initial checks
698 if (NULL == pAmergeCtx) {
699 return (XCAM_RETURN_ERROR_MEM);
700 }
701
702 result = AmergeStop(pAmergeCtx);
703 if (result != XCAM_RETURN_NO_ERROR) {
704 LOGE_AMERGE("%s(%d): Amerge Stop() failed!\n", __FUNCTION__, __LINE__);
705 return (result);
706 }
707
708 // check state
709 if ((AMERGE_STATE_RUNNING == pAmergeCtx->state) || (AMERGE_STATE_LOCKED == pAmergeCtx->state)) {
710 return (XCAM_RETURN_ERROR_FAILED);
711 }
712 free(pAmergeCtx);
713 pAmergeCtx = NULL;
714
715 LOG1_AMERGE("%s:exit!\n", __FUNCTION__);
716
717 return (result);
718 }
719