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