xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/algos/amerge/rk_aiq_amerge_algo_v12.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_v12.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 
MergeGetInterpRatioV12(float * pX,int lo,int hi,float CtrlValue,int length_max)66 float MergeGetInterpRatioV12(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  * CalibrateOECurve()
94  *****************************************************************************/
CalibrateOECurve(float smooth,float offset,unsigned short * OECurve)95 void CalibrateOECurve(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_V12_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 /******************************************************************************
114  * CalibrateEachChnCurve()
115  *****************************************************************************/
CalibrateEachChnCurve(float smooth,float offset,unsigned short * OECurve)116 void CalibrateEachChnCurve(float smooth, float offset, unsigned short* OECurve) {
117     LOG1_AMERGE("%s:Enter!\n", __FUNCTION__);
118 
119     int step    = 64;
120     float curve = 0.0f;
121     float k     = 0.0f;
122 
123     for (int i = 0; i < HDRMGE_V12_OE_CURVE_NUM; ++i) {
124         curve      = 1.0f + exp(-smooth * EACHOECURVESMOOTHMAX * (k / 1023.0f - offset));
125         curve      = 1024.0f / curve;
126         OECurve[i] = round(curve);
127         OECurve[i] = MIN(OECurve[i], 1023);
128         k += step;
129     }
130 
131     LOG1_AMERGE("%s:Eixt!\n", __FUNCTION__);
132 }
133 
134 /******************************************************************************
135  * CalibrateMDCurveLongFrmMode()
136  *****************************************************************************/
CalibrateMDCurveLongFrmMode(float smooth,float offset,unsigned short * MDCurve)137 void CalibrateMDCurveLongFrmMode(float smooth, float offset, unsigned short* MDCurve) {
138     LOG1_AMERGE("%s:Enter!\n", __FUNCTION__);
139 
140     int step    = 16;
141     float curve = 0.0f;
142     float k     = 0.0f;
143 
144     for (int i = 0; i < HDRMGE_V12_MD_CURVE_NUM; ++i) {
145         curve      = 1.0f + exp(-smooth * MDCURVESMOOTHMAX *
146                            (k / 1023.0f - offset * MDCURVEOFFSETMAX / 256.0f));
147         curve      = 1024.0f / curve;
148         MDCurve[i] = round(curve);
149         MDCurve[i] = MIN(MDCurve[i], 1023);
150         k += step;
151     }
152 
153     LOG1_AMERGE("%s:Eixt!\n", __FUNCTION__);
154 }
155 /******************************************************************************
156  * CalibrateMDCurveShortFrmMode()
157  *****************************************************************************/
CalibrateMDCurveShortFrmMode(float smooth,float offset,unsigned short * MDCurveLM,unsigned short * MDCurveMS)158 void CalibrateMDCurveShortFrmMode(float smooth, float offset, unsigned short* MDCurveLM,
159                                   unsigned short* MDCurveMS) {
160     LOG1_AMERGE("%s:Enter!\n", __FUNCTION__);
161 
162     float step  = 1.0f / 16.0f;
163     float curve = 0.0f;
164 
165     for (int i = 0; i < HDRMGE_V12_MD_CURVE_NUM; ++i) {
166         curve        = 0.01f + pow(i * step, 2.0f);
167         curve        = 1024.0f * pow(i * step, 2.0f) / curve;
168         MDCurveLM[i] = round(curve);
169         MDCurveLM[i] = MIN(MDCurveLM[i], 1023);
170         MDCurveMS[i] = MDCurveLM[i];
171     }
172 
173     LOG1_AMERGE("%s:Eixt!\n", __FUNCTION__);
174 }
175 /******************************************************************************
176  * AmergeGetTuningProcResV12()
177  *****************************************************************************/
AmergeGetTuningProcResV12(AmergeContext_t * pAmergeCtx,RkAiqAmergeProcResult_t * pAmergeProcRes)178 void AmergeGetTuningProcResV12(AmergeContext_t* pAmergeCtx,
179                                RkAiqAmergeProcResult_t* pAmergeProcRes) {
180     LOG1_AMERGE("%s:Enter!\n", __FUNCTION__);
181 
182     pAmergeProcRes->Merge_v12.mode        = pAmergeCtx->NextData.HandleData.Merge_v12.MergeMode;
183     pAmergeProcRes->Merge_v12.s_base      = pAmergeCtx->NextData.HandleData.Merge_v12.BaseFrm;
184     pAmergeProcRes->Merge_v12.each_raw_en = pAmergeCtx->NextData.HandleData.Merge_v12.EnableEachChn;
185     pAmergeProcRes->Merge_v12.lm_dif_0p9  = SW_HDRMGE_LM_DIF_0P9_FIX;
186     pAmergeProcRes->Merge_v12.ms_dif_0p8  = SW_HDRMGE_MS_DIF_0P8_FIX;
187     pAmergeProcRes->Merge_v12.lm_dif_0p15 =
188         (unsigned char)(pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveLM_offset *
189                         MDCURVEOFFSETMAX);
190     pAmergeProcRes->Merge_v12.ms_dif_0p15 =
191         (unsigned char)(pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveMS_offset *
192                         MDCURVEOFFSETMAX);
193 
194     if (pAmergeCtx->NextData.CtrlData.ExpoData.LongFrmMode) {
195         for (int i = 0; i < HDRMGE_V12_OE_CURVE_NUM; i++)
196             pAmergeProcRes->Merge_v12.e_y[i] = HDR_LONG_FRMAE_MODE_OECURVE;
197     } else {
198         if ((pAmergeCtx->NextData.HandleData.Merge_v12.OECurve_smooth -
199              pAmergeCtx->CurrData.HandleData.Merge_v12.OECurve_smooth) > FLT_EPSILON ||
200             (pAmergeCtx->NextData.HandleData.Merge_v12.OECurve_smooth -
201              pAmergeCtx->CurrData.HandleData.Merge_v12.OECurve_smooth) < -FLT_EPSILON ||
202             (pAmergeCtx->NextData.HandleData.Merge_v12.OECurve_offset -
203              pAmergeCtx->CurrData.HandleData.Merge_v12.OECurve_offset) > FLT_EPSILON ||
204             (pAmergeCtx->NextData.HandleData.Merge_v12.OECurve_offset -
205              pAmergeCtx->CurrData.HandleData.Merge_v12.OECurve_offset) < -FLT_EPSILON)
206             CalibrateOECurve(pAmergeCtx->NextData.HandleData.Merge_v12.OECurve_smooth,
207                              pAmergeCtx->NextData.HandleData.Merge_v12.OECurve_offset,
208                              pAmergeProcRes->Merge_v12.e_y);
209     }
210     if (pAmergeCtx->NextData.HandleData.Merge_v12.BaseFrm == BASEFRAME_LONG) {
211         if ((pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveLM_smooth -
212              pAmergeCtx->CurrData.HandleData.Merge_v12.MDCurveLM_smooth) > FLT_EPSILON ||
213             (pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveLM_smooth -
214              pAmergeCtx->CurrData.HandleData.Merge_v12.MDCurveLM_smooth) < -FLT_EPSILON ||
215             (pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveLM_offset -
216              pAmergeCtx->CurrData.HandleData.Merge_v12.MDCurveLM_offset) > FLT_EPSILON ||
217             (pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveLM_offset -
218              pAmergeCtx->CurrData.HandleData.Merge_v12.MDCurveLM_offset) < -FLT_EPSILON)
219             CalibrateMDCurveLongFrmMode(pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveLM_smooth,
220                                         pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveLM_offset,
221                                         pAmergeProcRes->Merge_v12.l1_y);
222         if ((pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveMS_smooth -
223              pAmergeCtx->CurrData.HandleData.Merge_v12.MDCurveMS_smooth) > FLT_EPSILON ||
224             (pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveMS_smooth -
225              pAmergeCtx->CurrData.HandleData.Merge_v12.MDCurveMS_smooth) < -FLT_EPSILON ||
226             (pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveMS_offset -
227              pAmergeCtx->CurrData.HandleData.Merge_v12.MDCurveMS_offset) > FLT_EPSILON ||
228             (pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveMS_offset -
229              pAmergeCtx->CurrData.HandleData.Merge_v12.MDCurveMS_offset) < -FLT_EPSILON)
230             CalibrateMDCurveLongFrmMode(pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveMS_smooth,
231                                         pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveMS_offset,
232                                         pAmergeProcRes->Merge_v12.l0_y);
233         // merge v12 add
234         if (pAmergeProcRes->Merge_v12.each_raw_en) {
235             if ((pAmergeCtx->NextData.HandleData.Merge_v12.EachChnCurve_smooth -
236                  pAmergeCtx->CurrData.HandleData.Merge_v12.EachChnCurve_smooth) > FLT_EPSILON ||
237                 (pAmergeCtx->NextData.HandleData.Merge_v12.EachChnCurve_smooth -
238                  pAmergeCtx->CurrData.HandleData.Merge_v12.EachChnCurve_smooth) < -FLT_EPSILON ||
239                 (pAmergeCtx->NextData.HandleData.Merge_v12.EachChnCurve_offset -
240                  pAmergeCtx->CurrData.HandleData.Merge_v12.EachChnCurve_offset) > FLT_EPSILON ||
241                 (pAmergeCtx->NextData.HandleData.Merge_v12.EachChnCurve_offset -
242                  pAmergeCtx->CurrData.HandleData.Merge_v12.EachChnCurve_offset) < -FLT_EPSILON)
243                 CalibrateEachChnCurve(pAmergeCtx->NextData.HandleData.Merge_v12.EachChnCurve_smooth,
244                                       pAmergeCtx->NextData.HandleData.Merge_v12.EachChnCurve_offset,
245                                       pAmergeProcRes->Merge_v12.l_raw0);
246             if ((pAmergeCtx->NextData.HandleData.Merge_v12.EachChnCurve_smooth -
247                  pAmergeCtx->CurrData.HandleData.Merge_v12.EachChnCurve_smooth) > FLT_EPSILON ||
248                 (pAmergeCtx->NextData.HandleData.Merge_v12.EachChnCurve_smooth -
249                  pAmergeCtx->CurrData.HandleData.Merge_v12.EachChnCurve_smooth) < -FLT_EPSILON ||
250                 (pAmergeCtx->NextData.HandleData.Merge_v12.EachChnCurve_offset -
251                  pAmergeCtx->CurrData.HandleData.Merge_v12.EachChnCurve_offset) > FLT_EPSILON ||
252                 (pAmergeCtx->NextData.HandleData.Merge_v12.EachChnCurve_offset -
253                  pAmergeCtx->CurrData.HandleData.Merge_v12.EachChnCurve_offset) < -FLT_EPSILON)
254                 CalibrateEachChnCurve(pAmergeCtx->NextData.HandleData.Merge_v12.EachChnCurve_smooth,
255                                       pAmergeCtx->NextData.HandleData.Merge_v12.EachChnCurve_offset,
256                                       pAmergeProcRes->Merge_v12.l_raw1);
257         }
258     } else if (pAmergeCtx->NextData.HandleData.Merge_v12.BaseFrm == BASEFRAME_SHORT) {
259         if ((pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveLM_smooth -
260              pAmergeCtx->CurrData.HandleData.Merge_v12.MDCurveLM_smooth) > FLT_EPSILON ||
261             (pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveLM_smooth -
262              pAmergeCtx->CurrData.HandleData.Merge_v12.MDCurveLM_smooth) < -FLT_EPSILON ||
263             (pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveLM_offset -
264              pAmergeCtx->CurrData.HandleData.Merge_v12.MDCurveLM_offset) > FLT_EPSILON ||
265             (pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveLM_offset -
266              pAmergeCtx->CurrData.HandleData.Merge_v12.MDCurveLM_offset) < -FLT_EPSILON)
267             CalibrateMDCurveShortFrmMode(pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveLM_smooth,
268                                          pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveLM_offset,
269                                          pAmergeProcRes->Merge_v12.l1_y,
270                                          pAmergeProcRes->Merge_v12.l0_y);
271     }
272 
273     LOG1_AMERGE("%s:Eixt!\n", __FUNCTION__);
274 }
275 
276 /******************************************************************************
277  * MergeDampingV12()
278  *****************************************************************************/
MergeDampingV12(AmergeContext_t * pAmergeCtx)279 void MergeDampingV12(AmergeContext_t* pAmergeCtx) {
280     LOG1_AMERGE("%s:Enter!\n", __FUNCTION__);
281 
282     if (pAmergeCtx->FrameID > 2) {
283         pAmergeCtx->NextData.HandleData.Merge_v12.OECurve_smooth =
284             pAmergeCtx->NextData.CtrlData.MergeOEDamp *
285                 pAmergeCtx->NextData.HandleData.Merge_v12.OECurve_smooth +
286             (1.0f - pAmergeCtx->NextData.CtrlData.MergeOEDamp) *
287                 pAmergeCtx->CurrData.HandleData.Merge_v12.OECurve_smooth;
288         pAmergeCtx->NextData.HandleData.Merge_v12.OECurve_offset =
289             pAmergeCtx->NextData.CtrlData.MergeOEDamp *
290                 pAmergeCtx->NextData.HandleData.Merge_v12.OECurve_offset +
291             (1.0f - pAmergeCtx->NextData.CtrlData.MergeOEDamp) *
292                 pAmergeCtx->CurrData.HandleData.Merge_v12.OECurve_offset;
293         pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveLM_smooth =
294             pAmergeCtx->NextData.CtrlData.MergeMDDampLM *
295                 pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveLM_smooth +
296             (1.0f - pAmergeCtx->NextData.CtrlData.MergeMDDampLM) *
297                 pAmergeCtx->CurrData.HandleData.Merge_v12.MDCurveLM_smooth;
298         pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveLM_offset =
299             pAmergeCtx->NextData.CtrlData.MergeMDDampLM *
300                 pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveLM_offset +
301             (1.0f - pAmergeCtx->NextData.CtrlData.MergeMDDampLM) *
302                 pAmergeCtx->CurrData.HandleData.Merge_v12.MDCurveLM_offset;
303         pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveMS_smooth =
304             pAmergeCtx->NextData.CtrlData.MergeMDDampMS *
305                 pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveMS_smooth +
306             (1.0f - pAmergeCtx->NextData.CtrlData.MergeMDDampMS) *
307                 pAmergeCtx->CurrData.HandleData.Merge_v12.MDCurveMS_smooth;
308         pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveMS_offset =
309             pAmergeCtx->NextData.CtrlData.MergeMDDampMS *
310                 pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveMS_offset +
311             (1.0f - pAmergeCtx->NextData.CtrlData.MergeMDDampMS) *
312                 pAmergeCtx->CurrData.HandleData.Merge_v12.MDCurveMS_offset;
313 
314         pAmergeCtx->NextData.HandleData.Merge_v12.MDCurve_Coef =
315             pAmergeCtx->NextData.CtrlData.MergeMDDampMS *
316                 pAmergeCtx->NextData.HandleData.Merge_v12.MDCurve_Coef +
317             (1.0f - pAmergeCtx->NextData.CtrlData.MergeMDDampMS) *
318                 pAmergeCtx->CurrData.HandleData.Merge_v12.MDCurve_Coef;
319         pAmergeCtx->NextData.HandleData.Merge_v12.MDCurve_ms_thd0 =
320             pAmergeCtx->NextData.CtrlData.MergeMDDampMS *
321                 pAmergeCtx->NextData.HandleData.Merge_v12.MDCurve_ms_thd0 +
322             (1.0f - pAmergeCtx->NextData.CtrlData.MergeMDDampMS) *
323                 pAmergeCtx->CurrData.HandleData.Merge_v12.MDCurve_ms_thd0;
324         pAmergeCtx->NextData.HandleData.Merge_v12.MDCurve_lm_thd0 =
325             pAmergeCtx->NextData.CtrlData.MergeMDDampMS *
326                 pAmergeCtx->NextData.HandleData.Merge_v12.MDCurve_lm_thd0 +
327             (1.0f - pAmergeCtx->NextData.CtrlData.MergeMDDampMS) *
328                 pAmergeCtx->CurrData.HandleData.Merge_v12.MDCurve_lm_thd0;
329     }
330 
331     LOG1_AMERGE("%s:Eixt!\n", __FUNCTION__);
332 }
333 
334 /******************************************************************************
335  * AmergeTuningProcessing()
336  *get handle para by config and current variate
337  *****************************************************************************/
AmergeTuningProcessing(AmergeContext_t * pAmergeCtx,RkAiqAmergeProcResult_t * pAmergeProcRes)338 void AmergeTuningProcessing(AmergeContext_t* pAmergeCtx, RkAiqAmergeProcResult_t* pAmergeProcRes) {
339     LOG1_AMERGE("%s:enter!\n", __FUNCTION__);
340 
341     if (pAmergeCtx->mergeAttrV12.opMode == MERGE_OPMODE_AUTO) {
342         int lo = 0, hi = 0;
343         float ratio     = 0.0f;
344         float CtrlValue = pAmergeCtx->NextData.CtrlData.ExpoData.EnvLv;
345         if (pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.CtrlDataType == CTRLDATATYPE_ISO)
346             CtrlValue = pAmergeCtx->NextData.CtrlData.ExpoData.ISO;
347 
348         pAmergeCtx->NextData.HandleData.Merge_v12.BaseFrm =
349             pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.BaseFrm;
350         if (pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.BaseFrm == BASEFRAME_LONG) {
351             // get Current merge OECurve
352             ratio = MergeGetInterpRatioV12(
353                 pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData.OECurve.CtrlData,
354                 lo, hi, CtrlValue, MERGE_ENVLV_STEP_MAX);
355             pAmergeCtx->NextData.HandleData.Merge_v12.OECurve_smooth =
356                 ratio * (pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData.OECurve
357                              .Smooth[hi] -
358                          pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData.OECurve
359                              .Smooth[lo]) +
360                 pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData.OECurve.Smooth[lo];
361             pAmergeCtx->NextData.HandleData.Merge_v12.OECurve_offset =
362                 ratio * (pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData.OECurve
363                              .Offset[hi] -
364                          pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData.OECurve
365                              .Offset[lo]) +
366                 pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData.OECurve.Offset[lo];
367 
368             // get Current merge MDCurve
369             ratio = MergeGetInterpRatioV12(
370                 pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData.MDCurve.MoveCoef,
371                 lo, hi, pAmergeCtx->NextData.CtrlData.MoveCoef, MERGE_ENVLV_STEP_MAX);
372             pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveLM_smooth =
373                 ratio * (pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData.MDCurve
374                              .LM_smooth[hi] -
375                          pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData.MDCurve
376                              .LM_smooth[lo]) +
377                 pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData.MDCurve
378                     .LM_smooth[lo];
379             pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveLM_offset =
380                 ratio * (pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData.MDCurve
381                              .LM_offset[hi] -
382                          pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData.MDCurve
383                              .LM_offset[lo]) +
384                 pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData.MDCurve
385                     .LM_offset[lo];
386             pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveMS_smooth =
387                 ratio * (pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData.MDCurve
388                              .MS_smooth[hi] -
389                          pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData.MDCurve
390                              .MS_smooth[lo]) +
391                 pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData.MDCurve
392                     .MS_smooth[lo];
393             pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveMS_offset =
394                 ratio * (pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData.MDCurve
395                              .MS_offset[hi] -
396                          pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData.MDCurve
397                              .MS_offset[lo]) +
398                 pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData.MDCurve
399                     .MS_offset[lo];
400 
401             pAmergeCtx->NextData.CtrlData.MergeOEDamp =
402                 pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData.OECurve_damp;
403             pAmergeCtx->NextData.CtrlData.MergeMDDampLM =
404                 pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData.MDCurveLM_damp;
405             pAmergeCtx->NextData.CtrlData.MergeMDDampMS =
406                 pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData.MDCurveMS_damp;
407 
408             // merge v12 add, get Current merge each channel
409             pAmergeCtx->NextData.HandleData.Merge_v12.EnableEachChn =
410                 pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData.EnableEachChn;
411             if (pAmergeCtx->NextData.HandleData.Merge_v12.EnableEachChn) {
412                 ratio = MergeGetInterpRatioV12(pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara
413                                                    .LongFrmModeData.EachChnCurve.CtrlData,
414                                                lo, hi, CtrlValue, MERGE_ENVLV_STEP_MAX);
415                 pAmergeCtx->NextData.HandleData.Merge_v12.EachChnCurve_smooth =
416                     ratio * (pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData
417                                  .EachChnCurve.Smooth[hi] -
418                              pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData
419                                  .EachChnCurve.Smooth[lo]) +
420                     pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData.EachChnCurve
421                         .Smooth[lo];
422                 pAmergeCtx->NextData.HandleData.Merge_v12.EachChnCurve_offset =
423                     ratio * (pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData
424                                  .EachChnCurve.Offset[hi] -
425                              pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData
426                                  .EachChnCurve.Offset[lo]) +
427                     pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.LongFrmModeData.EachChnCurve
428                         .Offset[lo];
429             }
430         } else if (pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.BaseFrm == BASEFRAME_SHORT) {
431             // get Current merge OECurve
432             ratio = MergeGetInterpRatioV12(pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara
433                                                .LongFrmModeData.EachChnCurve.CtrlData,
434                                            lo, hi, CtrlValue, MERGE_ENVLV_STEP_MAX);
435             pAmergeCtx->NextData.HandleData.Merge_v12.OECurve_smooth =
436                 ratio * (pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.ShortFrmModeData.OECurve
437                              .Smooth[hi] -
438                          pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.ShortFrmModeData.OECurve
439                              .Smooth[lo]) +
440                 pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.ShortFrmModeData.OECurve.Smooth[lo];
441             pAmergeCtx->NextData.HandleData.Merge_v12.OECurve_offset =
442                 ratio * (pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.ShortFrmModeData.OECurve
443                              .Offset[hi] -
444                          pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.ShortFrmModeData.OECurve
445                              .Offset[lo]) +
446                 pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.ShortFrmModeData.OECurve.Offset[lo];
447 
448             // get Current merge MDCurve
449             ratio = MergeGetInterpRatioV12(
450                 pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.ShortFrmModeData.MDCurve.MoveCoef,
451                 lo, hi, pAmergeCtx->NextData.CtrlData.MoveCoef, MERGE_ENVLV_STEP_MAX);
452             pAmergeCtx->NextData.HandleData.Merge_v12.MDCurve_Coef =
453                 ratio * (pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.ShortFrmModeData.MDCurve
454                              .Coef[hi] -
455                          pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.ShortFrmModeData.MDCurve
456                              .Coef[lo]) +
457                 pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.ShortFrmModeData.MDCurve.Coef[lo];
458             pAmergeCtx->NextData.HandleData.Merge_v12.MDCurve_ms_thd0 =
459                 ratio * (pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.ShortFrmModeData.MDCurve
460                              .ms_thd0[hi] -
461                          pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.ShortFrmModeData.MDCurve
462                              .ms_thd0[lo]) +
463                 pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.ShortFrmModeData.MDCurve
464                     .ms_thd0[lo];
465             pAmergeCtx->NextData.HandleData.Merge_v12.MDCurve_lm_thd0 =
466                 ratio * (pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.ShortFrmModeData.MDCurve
467                              .lm_thd0[hi] -
468                          pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.ShortFrmModeData.MDCurve
469                              .lm_thd0[lo]) +
470                 pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.ShortFrmModeData.MDCurve
471                     .lm_thd0[lo];
472 
473             pAmergeCtx->NextData.CtrlData.MergeOEDamp =
474                 pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.ShortFrmModeData.OECurve_damp;
475             pAmergeCtx->NextData.CtrlData.MergeMDDampLM =
476                 pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.ShortFrmModeData.MDCurve_damp;
477             pAmergeCtx->NextData.CtrlData.MergeMDDampMS =
478                 pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.ShortFrmModeData.MDCurve_damp;
479         }
480         // merge damp
481         MergeDampingV12(pAmergeCtx);
482     } else if (pAmergeCtx->mergeAttrV12.opMode == MERGE_OPMODE_MANUAL) {
483         pAmergeCtx->NextData.HandleData.Merge_v12.BaseFrm =
484             pAmergeCtx->mergeAttrV12.stManual.BaseFrm;
485         if (pAmergeCtx->mergeAttrV12.stManual.BaseFrm == BASEFRAME_LONG) {
486             // get Current merge OECurve
487             pAmergeCtx->NextData.HandleData.Merge_v12.OECurve_smooth =
488                 pAmergeCtx->mergeAttrV12.stManual.LongFrmModeData.OECurve.Smooth;
489             pAmergeCtx->NextData.HandleData.Merge_v12.OECurve_offset =
490                 pAmergeCtx->mergeAttrV12.stManual.LongFrmModeData.OECurve.Offset;
491 
492             // get Current merge MDCurve
493             pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveLM_smooth =
494                 pAmergeCtx->mergeAttrV12.stManual.LongFrmModeData.MDCurve.LM_smooth;
495             pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveLM_offset =
496                 pAmergeCtx->mergeAttrV12.stManual.LongFrmModeData.MDCurve.LM_offset;
497             pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveMS_smooth =
498                 pAmergeCtx->mergeAttrV12.stManual.LongFrmModeData.MDCurve.MS_smooth;
499             pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveMS_offset =
500                 pAmergeCtx->mergeAttrV12.stManual.LongFrmModeData.MDCurve.MS_offset;
501 
502             // get Current merge each channel
503             pAmergeCtx->NextData.HandleData.Merge_v12.EnableEachChn =
504                 pAmergeCtx->mergeAttrV12.stManual.LongFrmModeData.EnableEachChn;
505             if (pAmergeCtx->NextData.HandleData.Merge_v12.EnableEachChn) {
506                 pAmergeCtx->NextData.HandleData.Merge_v12.EachChnCurve_smooth =
507                     pAmergeCtx->mergeAttrV12.stManual.LongFrmModeData.EachChnCurve.Smooth;
508                 pAmergeCtx->NextData.HandleData.Merge_v12.EachChnCurve_offset =
509                     pAmergeCtx->mergeAttrV12.stManual.LongFrmModeData.EachChnCurve.Offset;
510             }
511         } else if (pAmergeCtx->mergeAttrV12.stManual.BaseFrm == BASEFRAME_SHORT) {
512             // get Current merge OECurve
513             pAmergeCtx->NextData.HandleData.Merge_v12.OECurve_smooth =
514                 pAmergeCtx->mergeAttrV12.stManual.ShortFrmModeData.OECurve.Smooth;
515             pAmergeCtx->NextData.HandleData.Merge_v12.OECurve_offset =
516                 pAmergeCtx->mergeAttrV12.stManual.ShortFrmModeData.OECurve.Offset;
517 
518             // get Current merge MDCurve
519             pAmergeCtx->NextData.HandleData.Merge_v12.MDCurve_Coef =
520                 pAmergeCtx->mergeAttrV12.stManual.ShortFrmModeData.MDCurve.Coef;
521             pAmergeCtx->NextData.HandleData.Merge_v12.MDCurve_ms_thd0 =
522                 pAmergeCtx->mergeAttrV12.stManual.ShortFrmModeData.MDCurve.ms_thd0;
523             pAmergeCtx->NextData.HandleData.Merge_v12.MDCurve_lm_thd0 =
524                 pAmergeCtx->mergeAttrV12.stManual.ShortFrmModeData.MDCurve.lm_thd0;
525         }
526     }
527 
528     LOGD_AMERGE("%s: Current BaseFrm:%d OECurve_smooth:%f OECurve_offset:%f \n", __FUNCTION__,
529                 pAmergeCtx->NextData.HandleData.Merge_v12.BaseFrm,
530                 pAmergeCtx->NextData.HandleData.Merge_v12.OECurve_smooth,
531                 pAmergeCtx->NextData.HandleData.Merge_v12.OECurve_offset);
532     if (pAmergeCtx->NextData.HandleData.Merge_v12.BaseFrm == BASEFRAME_LONG) {
533         LOGD_AMERGE(
534             "%s: Current MDCurveMS_smooth:%f MDCurveMS_offset:%f MDCurveLM_smooth:%f "
535             "MDCurveLM_offset:%f \n",
536             __FUNCTION__, pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveMS_smooth,
537             pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveMS_offset,
538             pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveLM_smooth,
539             pAmergeCtx->NextData.HandleData.Merge_v12.MDCurveLM_offset);
540         LOGD_AMERGE("%s: Current EnableEachChn:%d EachChnCurve_smooth:%f EachChnCurve_offset:%f\n",
541                     __FUNCTION__, pAmergeCtx->NextData.HandleData.Merge_v12.EnableEachChn,
542                     pAmergeCtx->NextData.HandleData.Merge_v12.EachChnCurve_smooth,
543                     pAmergeCtx->NextData.HandleData.Merge_v12.EachChnCurve_offset);
544     } else if (pAmergeCtx->NextData.HandleData.Merge_v12.BaseFrm == BASEFRAME_SHORT) {
545         LOGD_AMERGE("%s: Current MDCurve_Coef:%f MDCurve_ms_thd0:%f MDCurve_lm_thd0:%f\n",
546                     __FUNCTION__, pAmergeCtx->NextData.HandleData.Merge_v12.MDCurve_Coef,
547                     pAmergeCtx->NextData.HandleData.Merge_v12.MDCurve_ms_thd0,
548                     pAmergeCtx->NextData.HandleData.Merge_v12.MDCurve_lm_thd0);
549     }
550 
551     // get current IO data
552     AmergeGetTuningProcResV12(pAmergeCtx, pAmergeProcRes);
553 
554     // store current handle data to pre data for next loop
555     pAmergeCtx->CurrData.CtrlData.ExpoData.EnvLv = pAmergeCtx->NextData.CtrlData.ExpoData.EnvLv;
556     pAmergeCtx->CurrData.CtrlData.ExpoData.ISO   = pAmergeCtx->NextData.CtrlData.ExpoData.ISO;
557     pAmergeCtx->CurrData.CtrlData.MoveCoef       = pAmergeCtx->NextData.CtrlData.MoveCoef;
558     pAmergeCtx->CurrData.CtrlData.ApiMode        = pAmergeCtx->mergeAttrV12.opMode;
559     memcpy(&pAmergeCtx->CurrData.HandleData, &pAmergeCtx->NextData.HandleData,
560            sizeof(MergeHandleData_s));
561 
562     LOG1_AMERGE("%s:exit!\n", __FUNCTION__);
563 }
564 
565 /******************************************************************************
566  * AmergeExpoProcessing()
567  *get handle para by config and current variate
568  *****************************************************************************/
AmergeExpoProcessing(AmergeContext_t * pAmergeCtx,MergeExpoData_t * pExpoData,RkAiqAmergeProcResult_t * pAmergeProcRes)569 void AmergeExpoProcessing(AmergeContext_t* pAmergeCtx, MergeExpoData_t* pExpoData,
570                           RkAiqAmergeProcResult_t* pAmergeProcRes) {
571     LOG1_AMERGE("%s:enter!\n", __FUNCTION__);
572 
573     // get sw_hdrmge_gain0
574     pAmergeProcRes->Merge_v12.gain0 = (unsigned short)(64.0f * pExpoData->RatioLS);
575     if (pExpoData->RatioLS == 1.0f)
576         pAmergeProcRes->Merge_v12.gain0_inv =
577             (unsigned short)(4096.0f * (1.0f / pExpoData->RatioLS) - 1.0f);
578     else
579         pAmergeProcRes->Merge_v12.gain0_inv =
580             (unsigned short)(4096.0f * (1.0f / pExpoData->RatioLS));
581 
582     // get sw_hdrmge_gain1
583     pAmergeProcRes->Merge_v12.gain1     = SW_HDRMGE_GAIN_FIX;
584     pAmergeProcRes->Merge_v12.gain1_inv = SW_HDRMGE_GAIN_INV_FIX;
585 
586     // get sw_hdrmge_gain2
587     pAmergeProcRes->Merge_v12.gain2 = SW_HDRMGE_GAIN_FIX;
588 
589     // merge v11 add
590     if (pAmergeCtx->NextData.HandleData.Merge_v12.BaseFrm == BASEFRAME_SHORT) {
591         float Coef = pAmergeCtx->NextData.HandleData.Merge_v12.MDCurve_Coef * SHORT_MODE_COEF_MAX;
592         float sw_hdrmge_ms_thd0 = pAmergeCtx->NextData.HandleData.Merge_v12.MDCurve_ms_thd0;
593         float sw_hdrmge_lm_thd0 = pAmergeCtx->NextData.HandleData.Merge_v12.MDCurve_lm_thd0;
594         float sw_hdrmge_ms_thd1 = pow(100.0f * Coef * pExpoData->SGain, 0.5f);
595         float sw_hdrmge_lm_thd1 = pow(100.0f * Coef * pExpoData->MGain, 0.5f);
596         float sw_hdrmge_ms_scl  = (sw_hdrmge_ms_thd1 == sw_hdrmge_ms_thd0)
597                                      ? 0.0f
598                                      : (1.0f / (sw_hdrmge_ms_thd1 - sw_hdrmge_ms_thd0));
599         float sw_hdrmge_lm_scl = (sw_hdrmge_lm_thd1 == sw_hdrmge_lm_thd0)
600                                      ? 0.0f
601                                      : (1.0f / (sw_hdrmge_lm_thd1 - sw_hdrmge_lm_thd0));
602         pAmergeProcRes->Merge_v12.ms_thd0 = (unsigned short)(1024.0f * sw_hdrmge_ms_thd0);
603         pAmergeProcRes->Merge_v12.ms_thd1 = (unsigned short)(1024.0f * sw_hdrmge_ms_thd1);
604         pAmergeProcRes->Merge_v12.ms_scl  = (unsigned short)(64.0f * sw_hdrmge_ms_scl);
605         pAmergeProcRes->Merge_v12.lm_thd0 = (unsigned short)(1024.0f * sw_hdrmge_lm_thd0);
606         pAmergeProcRes->Merge_v12.lm_thd1 = (unsigned short)(1024.0f * sw_hdrmge_lm_thd1);
607         pAmergeProcRes->Merge_v12.lm_scl  = (unsigned short)(64.0f * sw_hdrmge_lm_scl);
608     }
609 
610     // merge v12 add
611     if (pAmergeCtx->NextData.HandleData.Merge_v12.BaseFrm == BASEFRAME_LONG &&
612         pAmergeProcRes->Merge_v12.each_raw_en) {
613         pAmergeProcRes->Merge_v12.each_raw_gain0 =
614             (unsigned short)(64.0f * pExpoData->RatioLS);  // ratio between middle and short
615         pAmergeProcRes->Merge_v12.each_raw_gain1 =
616             SW_HDRMGE_GAIN_FIX;  // ratio between middle and long
617     }
618 
619     // store next data
620     pAmergeCtx->CurrData.CtrlData.ExpoData.LongFrmMode =
621         pAmergeCtx->NextData.CtrlData.ExpoData.LongFrmMode;
622     pAmergeCtx->CurrData.CtrlData.ExpoData.RatioLS = pAmergeCtx->NextData.CtrlData.ExpoData.RatioLS;
623     pAmergeCtx->CurrData.CtrlData.ExpoData.RatioLM = pAmergeCtx->NextData.CtrlData.ExpoData.RatioLM;
624     pAmergeCtx->CurrData.CtrlData.ExpoData.SGain   = pAmergeCtx->NextData.CtrlData.ExpoData.SGain;
625     pAmergeCtx->CurrData.CtrlData.ExpoData.MGain   = pAmergeCtx->NextData.CtrlData.ExpoData.MGain;
626 
627     LOGV_AMERGE(
628         "%s: RatioLS:%f sw_hdrmge_gain0:%d sw_hdrmge_gain0_inv:%d RatioLM:%f "
629         "sw_hdrmge_gain1:%d sw_hdrmge_gain1_inv:%d sw_hdrmge_gain2:%d\n",
630         __FUNCTION__, pExpoData->RatioLS, pAmergeProcRes->Merge_v12.gain0,
631         pAmergeProcRes->Merge_v12.gain0_inv, pExpoData->RatioLM, pAmergeProcRes->Merge_v12.gain1,
632         pAmergeProcRes->Merge_v12.gain1_inv, pAmergeProcRes->Merge_v12.gain2);
633     LOGV_AMERGE("%s: sw_hdrmge_mode:%d s_base:%d each_raw_en:%d\n", __FUNCTION__,
634                 pAmergeProcRes->Merge_v12.mode, pAmergeProcRes->Merge_v12.s_base,
635                 pAmergeProcRes->Merge_v12.each_raw_en);
636     if (!(pAmergeProcRes->Merge_v12.s_base)) {
637         LOGV_AMERGE(
638             "%s: sw_hdrmge_ms_dif_0p8:%d sw_hdrmge_lm_dif_0p9:%d "
639             "sw_hdrmge_ms_dif_0p15:%d sw_hdrmge_lm_dif_0p15:%d\n",
640             __FUNCTION__, pAmergeProcRes->Merge_v12.ms_dif_0p8,
641             pAmergeProcRes->Merge_v12.lm_dif_0p9, pAmergeProcRes->Merge_v12.ms_dif_0p15,
642             pAmergeProcRes->Merge_v12.lm_dif_0p15);
643 
644         if (pAmergeProcRes->Merge_v12.each_raw_en) {
645             LOGV_AMERGE("%s: each_raw_gain0:%d each_raw_gain1:%d\n", __FUNCTION__,
646                         pAmergeProcRes->Merge_v12.each_raw_gain0,
647                         pAmergeProcRes->Merge_v12.each_raw_gain1);
648             LOGV_AMERGE(
649                 "%s: sw_hdrmge_l_raw0: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
650                 __FUNCTION__, pAmergeProcRes->Merge_v12.l0_y[0],
651                 pAmergeProcRes->Merge_v12.l_raw0[1], pAmergeProcRes->Merge_v12.l_raw0[2],
652                 pAmergeProcRes->Merge_v12.l_raw0[3], pAmergeProcRes->Merge_v12.l_raw0[4],
653                 pAmergeProcRes->Merge_v12.l_raw0[5], pAmergeProcRes->Merge_v12.l_raw0[6],
654                 pAmergeProcRes->Merge_v12.l_raw0[7], pAmergeProcRes->Merge_v12.l_raw0[8],
655                 pAmergeProcRes->Merge_v12.l_raw0[9], pAmergeProcRes->Merge_v12.l_raw0[10],
656                 pAmergeProcRes->Merge_v12.l_raw0[11], pAmergeProcRes->Merge_v12.l_raw0[12],
657                 pAmergeProcRes->Merge_v12.l_raw0[13], pAmergeProcRes->Merge_v12.l_raw0[14],
658                 pAmergeProcRes->Merge_v12.l_raw0[15], pAmergeProcRes->Merge_v12.l_raw0[16]);
659             LOGV_AMERGE(
660                 "%s: sw_hdrmge_l_raw1: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
661                 __FUNCTION__, pAmergeProcRes->Merge_v12.l1_y[0],
662                 pAmergeProcRes->Merge_v12.l_raw1[1], pAmergeProcRes->Merge_v12.l_raw1[2],
663                 pAmergeProcRes->Merge_v12.l_raw1[3], pAmergeProcRes->Merge_v12.l_raw1[4],
664                 pAmergeProcRes->Merge_v12.l_raw1[5], pAmergeProcRes->Merge_v12.l_raw1[6],
665                 pAmergeProcRes->Merge_v12.l_raw1[7], pAmergeProcRes->Merge_v12.l_raw1[8],
666                 pAmergeProcRes->Merge_v12.l_raw1[9], pAmergeProcRes->Merge_v12.l_raw1[10],
667                 pAmergeProcRes->Merge_v12.l_raw1[11], pAmergeProcRes->Merge_v12.l_raw1[12],
668                 pAmergeProcRes->Merge_v12.l_raw1[13], pAmergeProcRes->Merge_v12.l_raw1[14],
669                 pAmergeProcRes->Merge_v12.l_raw1[15], pAmergeProcRes->Merge_v12.l_raw1[16]);
670         }
671     } else {
672         LOGV_AMERGE("%s: sw_hdrmge_ms_thd0:%d sw_hdrmge_ms_thd1:%d sw_hdrmge_ms_scl:%d\n",
673                     __FUNCTION__, pAmergeProcRes->Merge_v12.ms_thd0,
674                     pAmergeProcRes->Merge_v12.ms_thd1, pAmergeProcRes->Merge_v12.ms_scl);
675         LOGV_AMERGE("%s: sw_hdrmge_lm_thd0:%d sw_hdrmge_lm_thd1:%d sw_hdrmge_lm_scl:%d\n",
676                     __FUNCTION__, pAmergeProcRes->Merge_v12.lm_thd0,
677                     pAmergeProcRes->Merge_v12.lm_thd1, pAmergeProcRes->Merge_v12.lm_scl);
678     }
679     LOGV_AMERGE("%s: sw_hdrmge_e_y: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
680                 __FUNCTION__, pAmergeProcRes->Merge_v12.e_y[0], pAmergeProcRes->Merge_v12.e_y[1],
681                 pAmergeProcRes->Merge_v12.e_y[2], pAmergeProcRes->Merge_v12.e_y[3],
682                 pAmergeProcRes->Merge_v12.e_y[4], pAmergeProcRes->Merge_v12.e_y[5],
683                 pAmergeProcRes->Merge_v12.e_y[6], pAmergeProcRes->Merge_v12.e_y[7],
684                 pAmergeProcRes->Merge_v12.e_y[8], pAmergeProcRes->Merge_v12.e_y[9],
685                 pAmergeProcRes->Merge_v12.e_y[10], pAmergeProcRes->Merge_v12.e_y[11],
686                 pAmergeProcRes->Merge_v12.e_y[12], pAmergeProcRes->Merge_v12.e_y[13],
687                 pAmergeProcRes->Merge_v12.e_y[14], pAmergeProcRes->Merge_v12.e_y[15],
688                 pAmergeProcRes->Merge_v12.e_y[16]);
689     LOGV_AMERGE("%s: sw_hdrmge_l0_y: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
690                 __FUNCTION__, pAmergeProcRes->Merge_v12.l0_y[0], pAmergeProcRes->Merge_v12.l0_y[1],
691                 pAmergeProcRes->Merge_v12.l0_y[2], pAmergeProcRes->Merge_v12.l0_y[3],
692                 pAmergeProcRes->Merge_v12.l0_y[4], pAmergeProcRes->Merge_v12.l0_y[5],
693                 pAmergeProcRes->Merge_v12.l0_y[6], pAmergeProcRes->Merge_v12.l0_y[7],
694                 pAmergeProcRes->Merge_v12.l0_y[8], pAmergeProcRes->Merge_v12.l0_y[9],
695                 pAmergeProcRes->Merge_v12.l0_y[10], pAmergeProcRes->Merge_v12.l0_y[11],
696                 pAmergeProcRes->Merge_v12.l0_y[12], pAmergeProcRes->Merge_v12.l0_y[13],
697                 pAmergeProcRes->Merge_v12.l0_y[14], pAmergeProcRes->Merge_v12.l0_y[15],
698                 pAmergeProcRes->Merge_v12.l0_y[16]);
699     LOGV_AMERGE("%s: sw_hdrmge_l1_y: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
700                 __FUNCTION__, pAmergeProcRes->Merge_v12.l1_y[0], pAmergeProcRes->Merge_v12.l1_y[1],
701                 pAmergeProcRes->Merge_v12.l1_y[2], pAmergeProcRes->Merge_v12.l1_y[3],
702                 pAmergeProcRes->Merge_v12.l1_y[4], pAmergeProcRes->Merge_v12.l1_y[5],
703                 pAmergeProcRes->Merge_v12.l1_y[6], pAmergeProcRes->Merge_v12.l1_y[7],
704                 pAmergeProcRes->Merge_v12.l1_y[8], pAmergeProcRes->Merge_v12.l1_y[9],
705                 pAmergeProcRes->Merge_v12.l1_y[10], pAmergeProcRes->Merge_v12.l1_y[11],
706                 pAmergeProcRes->Merge_v12.l1_y[12], pAmergeProcRes->Merge_v12.l1_y[13],
707                 pAmergeProcRes->Merge_v12.l1_y[14], pAmergeProcRes->Merge_v12.l1_y[15],
708                 pAmergeProcRes->Merge_v12.l1_y[16]);
709 
710     LOG1_AMERGE("%s:exit!\n", __FUNCTION__);
711 }
712 
713 /******************************************************************************
714  * AmergeByPassProcessing()
715  *get handle para by config and current variate
716  *****************************************************************************/
AmergeByPassProcessing(AmergeContext_t * pAmergeCtx)717 bool AmergeByPassProcessing(AmergeContext_t* pAmergeCtx) {
718     LOG1_AMERGE("%s:enter!\n", __FUNCTION__);
719 
720     bool bypass = false;
721     float diff  = 0.0f;
722 
723     if (pAmergeCtx->FrameID <= 2)
724         bypass = false;
725     else if (pAmergeCtx->mergeAttrV12.opMode != pAmergeCtx->CurrData.CtrlData.ApiMode)
726         bypass = false;
727     else if (pAmergeCtx->mergeAttrV12.opMode == MERGE_OPMODE_MANUAL)
728         bypass = !pAmergeCtx->ifReCalcStManual;
729     else if (pAmergeCtx->mergeAttrV12.opMode == MERGE_OPMODE_AUTO) {
730         pAmergeCtx->NextData.HandleData.Merge_v12.MergeMode = pAmergeCtx->FrameNumber - 1;
731         if (pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.CtrlDataType == CTRLDATATYPE_ENVLV) {
732             diff = pAmergeCtx->CurrData.CtrlData.ExpoData.EnvLv -
733                    pAmergeCtx->NextData.CtrlData.ExpoData.EnvLv;
734             if (pAmergeCtx->CurrData.CtrlData.ExpoData.EnvLv <= FLT_EPSILON) {
735                 diff = pAmergeCtx->NextData.CtrlData.ExpoData.EnvLv;
736                 if (diff <= FLT_EPSILON)
737                     bypass = true;
738                 else
739                     bypass = false;
740             } else {
741                 diff /= pAmergeCtx->CurrData.CtrlData.ExpoData.EnvLv;
742                 if (diff >= pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.ByPassThr ||
743                     diff <= -pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.ByPassThr)
744                     bypass = false;
745                 else
746                     bypass = true;
747             }
748         } else if (pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.CtrlDataType ==
749                    CTRLDATATYPE_ISO) {
750             diff = pAmergeCtx->CurrData.CtrlData.ExpoData.ISO -
751                    pAmergeCtx->NextData.CtrlData.ExpoData.ISO;
752             diff /= pAmergeCtx->CurrData.CtrlData.ExpoData.ISO;
753             if (diff >= pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.ByPassThr ||
754                 diff <= -pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.ByPassThr)
755                 bypass = false;
756             else
757                 bypass = true;
758         }
759         bypass = bypass && !pAmergeCtx->ifReCalcStAuto;
760     }
761 
762     LOGD_AMERGE(
763         "%s: FrameID:%d HDRFrameNum:%d LongFrmMode:%d MergeApiMode:%d ifReCalcStAuto:%d "
764         "ifReCalcStManual:%d CtrlDataType:%d EnvLv:%f ISO:%f MoveCoef:%f "
765         "bypass:%d\n",
766         __FUNCTION__, pAmergeCtx->FrameID, pAmergeCtx->FrameNumber,
767         pAmergeCtx->NextData.CtrlData.ExpoData.LongFrmMode, pAmergeCtx->mergeAttrV12.opMode,
768         pAmergeCtx->ifReCalcStAuto, pAmergeCtx->ifReCalcStManual,
769         pAmergeCtx->mergeAttrV12.stAuto.MergeTuningPara.CtrlDataType,
770         pAmergeCtx->NextData.CtrlData.ExpoData.EnvLv, pAmergeCtx->NextData.CtrlData.ExpoData.ISO,
771         pAmergeCtx->NextData.CtrlData.MoveCoef, bypass);
772 
773     LOG1_AMERGE("%s:exit!\n", __FUNCTION__);
774     return bypass;
775 }
776 
777 /******************************************************************************
778  * AmergeInit()
779  *****************************************************************************/
AmergeInit(AmergeContext_t ** ppAmergeCtx,CamCalibDbV2Context_t * pCalibV2)780 XCamReturn AmergeInit(AmergeContext_t** ppAmergeCtx, CamCalibDbV2Context_t* pCalibV2) {
781     LOG1_AMERGE("%s:enter!\n", __FUNCTION__);
782 
783     XCamReturn result = XCAM_RETURN_NO_ERROR;
784 
785     AmergeContext_t* pAmergeCtx;
786     pAmergeCtx = (AmergeContext_t*)malloc(sizeof(AmergeContext_t));
787     if (pAmergeCtx == NULL) {
788         LOGE_ATMO("%s(%d): invalid inputparams\n", __FUNCTION__, __LINE__);
789         return XCAM_RETURN_ERROR_MEM;
790     }
791     *ppAmergeCtx      = pAmergeCtx;
792     pAmergeCtx->state = AMERGE_STATE_INITIALIZED;
793 
794     CalibDbV2_merge_v12_t* calibv2_amerge_calib =
795         (CalibDbV2_merge_v12_t*)(CALIBDBV2_GET_MODULE_PTR(pCalibV2, amerge_calib));
796     memcpy(&pAmergeCtx->mergeAttrV12.stAuto, calibv2_amerge_calib, sizeof(CalibDbV2_merge_v12_t));
797     pAmergeCtx->mergeAttrV12.opMode = MERGE_OPMODE_AUTO;
798     pAmergeCtx->ifReCalcStAuto      = true;
799     pAmergeCtx->ifReCalcStManual    = false;
800     pAmergeCtx->isCapture           = false;
801 
802     LOG1_AMERGE("%s:exit!\n", __FUNCTION__);
803     return (result);
804 }
805 /******************************************************************************
806  * AmergeRelease()
807  *****************************************************************************/
AmergeRelease(AmergeContext_t * pAmergeCtx)808 XCamReturn AmergeRelease(AmergeContext_t* pAmergeCtx) {
809     LOG1_AMERGE("%s:enter!\n", __FUNCTION__);
810     XCamReturn result = XCAM_RETURN_NO_ERROR;
811 
812     // initial checks
813     if (NULL == pAmergeCtx) {
814         return (XCAM_RETURN_ERROR_MEM);
815     }
816 
817     result = AmergeStop(pAmergeCtx);
818     if (result != XCAM_RETURN_NO_ERROR) {
819         LOGE_AMERGE("%s(%d): Amerge Stop() failed!\n", __FUNCTION__, __LINE__);
820         return (result);
821     }
822 
823     // check state
824     if ((AMERGE_STATE_RUNNING == pAmergeCtx->state) || (AMERGE_STATE_LOCKED == pAmergeCtx->state)) {
825         return (XCAM_RETURN_ERROR_FAILED);
826     }
827     free(pAmergeCtx);
828     pAmergeCtx = NULL;
829 
830     LOG1_AMERGE("%s:exit!\n", __FUNCTION__);
831 
832     return (result);
833 }
834