xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/algos/amerge/rk_aiq_amerge_algo_v11.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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