xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/algos/amerge/rk_aiq_amerge_algo_v10.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_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