/******************************************************************************
|
*
|
* Copyright 2019, Fuzhou Rockchip Electronics Co.Ltd. All rights reserved.
|
* No part of this work may be reproduced, modified, distributed, transmitted,
|
* transcribed, or translated into any language or computer format, in any form
|
* or by any means without written permission of:
|
* Fuzhou Rockchip Electronics Co.Ltd .
|
*
|
*
|
*****************************************************************************/
|
/**
|
* @file rk_aiq_amerge_algo.cpp
|
*
|
* @brief
|
* ADD_DESCRIPTION_HERE
|
*
|
*****************************************************************************/
|
#include "math.h"
|
#include "rk_aiq_types_amerge_algo_int.h"
|
#include "rk_aiq_types_amerge_algo_prvt.h"
|
#include "xcam_log.h"
|
|
/******************************************************************************
|
* AmergeStart()
|
*****************************************************************************/
|
XCamReturn AmergeStart
|
(
|
AmergeContext_t* pAmergeCtx
|
) {
|
|
LOG1_AMERGE( "%s:enter!\n", __FUNCTION__);
|
|
// initial checks
|
if (pAmergeCtx == NULL) {
|
return (XCAM_RETURN_ERROR_MEM);
|
}
|
|
if ((AMERGE_STATE_RUNNING == pAmergeCtx->state)
|
|| (AMERGE_STATE_LOCKED == pAmergeCtx->state)) {
|
return (XCAM_RETURN_ERROR_FAILED);
|
}
|
|
pAmergeCtx->state = AMERGE_STATE_RUNNING;
|
|
LOG1_AMERGE( "%s:exit!\n", __FUNCTION__);
|
return (XCAM_RETURN_NO_ERROR);
|
}
|
/******************************************************************************
|
* AmergeStop()
|
*****************************************************************************/
|
XCamReturn AmergeStop
|
(
|
AmergeContext_t* pAmergeCtx
|
) {
|
|
LOG1_AMERGE( "%s:enter!\n", __FUNCTION__);
|
|
// initial checks
|
if (pAmergeCtx == NULL) {
|
return (XCAM_RETURN_ERROR_MEM);
|
}
|
|
// before stopping, unlock the AHDR if locked
|
if (AMERGE_STATE_LOCKED == pAmergeCtx->state) {
|
return (XCAM_RETURN_ERROR_FAILED);
|
}
|
|
pAmergeCtx->state = AMERGE_STATE_STOPPED;
|
|
LOG1_AMERGE( "%s:exit!\n", __FUNCTION__);
|
|
return (XCAM_RETURN_NO_ERROR);
|
}
|
|
/******************************************************************************
|
* GetCurrPara()
|
*****************************************************************************/
|
float GetCurrPara
|
(
|
float inPara,
|
float* inMatrixX,
|
float* inMatrixY,
|
int Max_Knots
|
) {
|
LOG1_AMERGE( "%s:enter!\n", __FUNCTION__);
|
float x1 = 0.0f;
|
float x2 = 0.0f;
|
float value1 = 0.0f;
|
float value2 = 0.0f;
|
float outPara = 0.0f;
|
|
if(inPara < inMatrixX[0])
|
outPara = inMatrixY[0];
|
else if (inPara >= inMatrixX[Max_Knots - 1])
|
outPara = inMatrixY[Max_Knots - 1];
|
else
|
for(int i = 0; i < Max_Knots - 1; i++)
|
{
|
if(inPara >= inMatrixX[i] && inPara < inMatrixX[i + 1])
|
{
|
x1 = inMatrixX[i];
|
x2 = inMatrixX[i + 1];
|
value1 = inMatrixY[i];
|
value2 = inMatrixY[i + 1];
|
outPara = value1 + (inPara - x1) * (value1 - value2) / (x1 - x2);
|
break;
|
}
|
else
|
continue;
|
}
|
|
return outPara;
|
LOG1_AMERGE( "%s:exit!\n", __FUNCTION__);
|
}
|
|
void AmergeGetEnvLv
|
(
|
AmergeContext_t* pAmergeCtx,
|
AecPreResult_t AecHdrPreResult
|
) {
|
LOG1_AMERGE( "%s:enter!\n", __FUNCTION__);
|
|
//get Ae Pre Result
|
pAmergeCtx->AeResult.GlobalEnvLv = AecHdrPreResult.GlobalEnvLv[AecHdrPreResult.NormalIndex];
|
|
//transfer AeResult data into AhdrHandle
|
switch (pAmergeCtx->FrameNumber)
|
{
|
case LINEAR_NUM:
|
pAmergeCtx->AeResult.GlobalEnvLv = AecHdrPreResult.GlobalEnvLv[0];
|
break;
|
case HDR_2X_NUM:
|
pAmergeCtx->AeResult.GlobalEnvLv = AecHdrPreResult.GlobalEnvLv[1];
|
break;
|
case HDR_3X_NUM:
|
pAmergeCtx->AeResult.GlobalEnvLv = AecHdrPreResult.GlobalEnvLv[1];
|
break;
|
default:
|
LOGE_AMERGE("%s: Wrong frame number in HDR mode!!!\n", __FUNCTION__);
|
break;
|
}
|
|
//Normalize the current envLv for AEC
|
pAmergeCtx->CurrData.CtrlData.EnvLv = (pAmergeCtx->AeResult.GlobalEnvLv - MIN_ENV_LV) / (MAX_ENV_LV - MIN_ENV_LV);
|
pAmergeCtx->CurrData.CtrlData.EnvLv = LIMIT_VALUE(pAmergeCtx->CurrData.CtrlData.EnvLv, ENVLVMAX, ENVLVMIN);
|
|
LOG1_AMERGE( "%s:exit!\n", __FUNCTION__);
|
}
|
|
void GetCurrMergeDataV20
|
(
|
AmergeContext_t* pAmergeCtx
|
) {
|
LOG1_AMERGE( "%s:enter!\n", __FUNCTION__);
|
|
//get Current merge OECurve
|
pAmergeCtx->CurrData.HandleData.Merge_v20.OECurve_smooth = GetCurrPara(pAmergeCtx->CurrData.CtrlData.EnvLv,
|
pAmergeCtx->Config.Merge_v20.EnvLv, pAmergeCtx->Config.Merge_v20.OECurve_smooth, pAmergeCtx->Config.Merge_v20.MaxEnvLvKnots);
|
pAmergeCtx->CurrData.HandleData.Merge_v20.OECurve_offset = GetCurrPara(pAmergeCtx->CurrData.CtrlData.EnvLv,
|
pAmergeCtx->Config.Merge_v20.EnvLv, pAmergeCtx->Config.Merge_v20.OECurve_offset, pAmergeCtx->Config.Merge_v20.MaxEnvLvKnots);
|
|
//get Current merge MDCurve
|
pAmergeCtx->CurrData.HandleData.Merge_v20.MDCurveLM_smooth = GetCurrPara(pAmergeCtx->CurrData.CtrlData.MoveCoef,
|
pAmergeCtx->Config.Merge_v20.MoveCoef, pAmergeCtx->Config.Merge_v20.MDCurveLM_smooth, pAmergeCtx->Config.Merge_v20.MaxMoveCoefKnots);
|
pAmergeCtx->CurrData.HandleData.Merge_v20.MDCurveLM_offset = GetCurrPara(pAmergeCtx->CurrData.CtrlData.MoveCoef,
|
pAmergeCtx->Config.Merge_v20.MoveCoef, pAmergeCtx->Config.Merge_v20.MDCurveLM_offset, pAmergeCtx->Config.Merge_v20.MaxMoveCoefKnots);
|
pAmergeCtx->CurrData.HandleData.Merge_v20.MDCurveMS_smooth = GetCurrPara(pAmergeCtx->CurrData.CtrlData.MoveCoef,
|
pAmergeCtx->Config.Merge_v20.MoveCoef, pAmergeCtx->Config.Merge_v20.MDCurveMS_smooth, pAmergeCtx->Config.Merge_v20.MaxMoveCoefKnots);
|
pAmergeCtx->CurrData.HandleData.Merge_v20.MDCurveMS_offset = GetCurrPara(pAmergeCtx->CurrData.CtrlData.MoveCoef,
|
pAmergeCtx->Config.Merge_v20.MoveCoef, pAmergeCtx->Config.Merge_v20.MDCurveMS_offset, pAmergeCtx->Config.Merge_v20.MaxMoveCoefKnots);
|
|
pAmergeCtx->CurrData.CtrlData.MergeOEDamp = pAmergeCtx->Config.Merge_v20.OECurve_damp;
|
pAmergeCtx->CurrData.CtrlData.MergeMDDampLM = pAmergeCtx->Config.Merge_v20.MDCurveLM_damp;
|
pAmergeCtx->CurrData.CtrlData.MergeMDDampMS = pAmergeCtx->Config.Merge_v20.MDCurveMS_damp;
|
|
LOG1_AMERGE( "%s:exit!\n", __FUNCTION__);
|
}
|
|
void AmergeGetSensorInfo
|
(
|
AmergeContext_t* pAmergeCtx,
|
AecProcResult_t AecHdrProcResult
|
) {
|
LOG1_AMERGE( "%s:enter!\n", __FUNCTION__);
|
|
pAmergeCtx->SensorInfo.LongFrmMode = AecHdrProcResult.LongFrmMode && (pAmergeCtx->FrameNumber != LINEAR_NUM);
|
|
for(int i = 0; i < 3; i++)
|
{
|
pAmergeCtx->SensorInfo.HdrMinGain[i] = AecHdrProcResult.HdrMinGain[i];
|
pAmergeCtx->SensorInfo.HdrMaxGain[i] = AecHdrProcResult.HdrMaxGain[i];
|
pAmergeCtx->SensorInfo.HdrMinIntegrationTime[i] = AecHdrProcResult.HdrMinIntegrationTime[i];
|
pAmergeCtx->SensorInfo.HdrMaxIntegrationTime[i] = AecHdrProcResult.HdrMaxIntegrationTime[i];
|
}
|
|
if(pAmergeCtx->FrameNumber == HDR_2X_NUM) {
|
pAmergeCtx->SensorInfo.MaxExpoL = pAmergeCtx->SensorInfo.HdrMaxGain[1] * pAmergeCtx->SensorInfo.HdrMaxIntegrationTime[1];
|
pAmergeCtx->SensorInfo.MinExpoL = pAmergeCtx->SensorInfo.HdrMinGain[1] * pAmergeCtx->SensorInfo.HdrMinIntegrationTime[1];
|
pAmergeCtx->SensorInfo.MaxExpoM = 0;
|
pAmergeCtx->SensorInfo.MinExpoM = 0;
|
}
|
else if(pAmergeCtx->FrameNumber == HDR_3X_NUM)
|
{
|
pAmergeCtx->SensorInfo.MaxExpoL = pAmergeCtx->SensorInfo.HdrMaxGain[2] * pAmergeCtx->SensorInfo.HdrMaxIntegrationTime[2];
|
pAmergeCtx->SensorInfo.MinExpoL = pAmergeCtx->SensorInfo.HdrMinGain[2] * pAmergeCtx->SensorInfo.HdrMinIntegrationTime[2];
|
pAmergeCtx->SensorInfo.MaxExpoM = pAmergeCtx->SensorInfo.HdrMaxGain[1] * pAmergeCtx->SensorInfo.HdrMaxIntegrationTime[1];
|
pAmergeCtx->SensorInfo.MinExpoM = pAmergeCtx->SensorInfo.HdrMinGain[1] * pAmergeCtx->SensorInfo.HdrMinIntegrationTime[1];
|
}
|
|
pAmergeCtx->SensorInfo.MaxExpoS = pAmergeCtx->SensorInfo.HdrMaxGain[0] * pAmergeCtx->SensorInfo.HdrMaxIntegrationTime[0];
|
pAmergeCtx->SensorInfo.MinExpoS = pAmergeCtx->SensorInfo.HdrMinGain[0] * pAmergeCtx->SensorInfo.HdrMinIntegrationTime[0];
|
|
LOG1_AMERGE( "%s:exit!\n", __FUNCTION__);
|
}
|
|
/******************************************************************************
|
* AmergeIQUpdate()
|
*
|
*****************************************************************************/
|
void AmergeIQUpdate(AmergeContext_t* pAmergeCtx)
|
{
|
LOG1_AMERGE("%s:enter!\n", __FUNCTION__);
|
|
if(CHECK_ISP_HW_V21()) {
|
//get Current merge OECurve
|
pAmergeCtx->CurrData.HandleData.Merge_v20.OECurve_smooth = GetCurrPara(pAmergeCtx->CurrData.CtrlData.EnvLv,
|
pAmergeCtx->Config.Merge_v20.EnvLv, pAmergeCtx->Config.Merge_v20.OECurve_smooth, pAmergeCtx->Config.Merge_v20.MaxEnvLvKnots);
|
pAmergeCtx->CurrData.HandleData.Merge_v20.OECurve_offset = GetCurrPara(pAmergeCtx->CurrData.CtrlData.EnvLv,
|
pAmergeCtx->Config.Merge_v20.EnvLv, pAmergeCtx->Config.Merge_v20.OECurve_offset, pAmergeCtx->Config.Merge_v20.MaxEnvLvKnots);
|
|
//get Current merge MDCurve
|
pAmergeCtx->CurrData.HandleData.Merge_v20.MDCurveLM_smooth = GetCurrPara(pAmergeCtx->CurrData.CtrlData.MoveCoef,
|
pAmergeCtx->Config.Merge_v20.MoveCoef, pAmergeCtx->Config.Merge_v20.MDCurveLM_smooth, pAmergeCtx->Config.Merge_v20.MaxMoveCoefKnots);
|
pAmergeCtx->CurrData.HandleData.Merge_v20.MDCurveLM_offset = GetCurrPara(pAmergeCtx->CurrData.CtrlData.MoveCoef,
|
pAmergeCtx->Config.Merge_v20.MoveCoef, pAmergeCtx->Config.Merge_v20.MDCurveLM_offset, pAmergeCtx->Config.Merge_v20.MaxMoveCoefKnots);
|
pAmergeCtx->CurrData.HandleData.Merge_v20.MDCurveMS_smooth = GetCurrPara(pAmergeCtx->CurrData.CtrlData.MoveCoef,
|
pAmergeCtx->Config.Merge_v20.MoveCoef, pAmergeCtx->Config.Merge_v20.MDCurveMS_smooth, pAmergeCtx->Config.Merge_v20.MaxMoveCoefKnots);
|
pAmergeCtx->CurrData.HandleData.Merge_v20.MDCurveMS_offset = GetCurrPara(pAmergeCtx->CurrData.CtrlData.MoveCoef,
|
pAmergeCtx->Config.Merge_v20.MoveCoef, pAmergeCtx->Config.Merge_v20.MDCurveMS_offset, pAmergeCtx->Config.Merge_v20.MaxMoveCoefKnots);
|
|
pAmergeCtx->CurrData.CtrlData.MergeOEDamp = pAmergeCtx->Config.Merge_v20.OECurve_damp;
|
pAmergeCtx->CurrData.CtrlData.MergeMDDampLM = pAmergeCtx->Config.Merge_v20.MDCurveLM_damp;
|
pAmergeCtx->CurrData.CtrlData.MergeMDDampMS = pAmergeCtx->Config.Merge_v20.MDCurveMS_damp;
|
}
|
else if(CHECK_ISP_HW_V30()) {
|
if(pAmergeCtx->Config.Merge_v30.BaseFrm == BASEFRAME_LONG) {
|
//get Current merge OECurve
|
pAmergeCtx->CurrData.HandleData.Merge_v30.OECurve_smooth = GetCurrPara(pAmergeCtx->CurrData.CtrlData.EnvLv,
|
pAmergeCtx->Config.Merge_v30.LongFrmEnvLv, pAmergeCtx->Config.Merge_v30.LongFrmOECurve_smooth, pAmergeCtx->Config.Merge_v30.LongFrmMaxEnvLvKnots);
|
pAmergeCtx->CurrData.HandleData.Merge_v30.OECurve_offset = GetCurrPara(pAmergeCtx->CurrData.CtrlData.EnvLv,
|
pAmergeCtx->Config.Merge_v30.LongFrmEnvLv, pAmergeCtx->Config.Merge_v30.LongFrmOECurve_offset, pAmergeCtx->Config.Merge_v30.LongFrmMaxEnvLvKnots);
|
|
//get Current merge MDCurve
|
pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurveLM_smooth = GetCurrPara(pAmergeCtx->CurrData.CtrlData.MoveCoef,
|
pAmergeCtx->Config.Merge_v30.LongFrmMoveCoef, pAmergeCtx->Config.Merge_v30.LongFrmMDCurveLM_smooth, pAmergeCtx->Config.Merge_v30.LongFrmMaxMoveCoefKnots);
|
pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurveLM_offset = GetCurrPara(pAmergeCtx->CurrData.CtrlData.MoveCoef,
|
pAmergeCtx->Config.Merge_v30.LongFrmMoveCoef, pAmergeCtx->Config.Merge_v30.LongFrmMDCurveLM_offset, pAmergeCtx->Config.Merge_v30.LongFrmMaxMoveCoefKnots);
|
pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurveMS_smooth = GetCurrPara(pAmergeCtx->CurrData.CtrlData.MoveCoef,
|
pAmergeCtx->Config.Merge_v30.LongFrmMoveCoef, pAmergeCtx->Config.Merge_v30.LongFrmMDCurveMS_smooth, pAmergeCtx->Config.Merge_v30.LongFrmMaxMoveCoefKnots);
|
pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurveMS_offset = GetCurrPara(pAmergeCtx->CurrData.CtrlData.MoveCoef,
|
pAmergeCtx->Config.Merge_v30.LongFrmMoveCoef, pAmergeCtx->Config.Merge_v30.LongFrmMDCurveMS_offset, pAmergeCtx->Config.Merge_v30.LongFrmMaxMoveCoefKnots);
|
|
pAmergeCtx->CurrData.CtrlData.MergeOEDamp = pAmergeCtx->Config.Merge_v30.LongFrmOECurve_damp;
|
pAmergeCtx->CurrData.CtrlData.MergeMDDampLM = pAmergeCtx->Config.Merge_v30.LongFrmMDCurveLM_damp;
|
pAmergeCtx->CurrData.CtrlData.MergeMDDampMS = pAmergeCtx->Config.Merge_v30.LongFrmMDCurveMS_damp;
|
}
|
else if(pAmergeCtx->Config.Merge_v30.BaseFrm == BASEFRAME_SHORT) {
|
//get Current merge OECurve
|
pAmergeCtx->CurrData.HandleData.Merge_v30.OECurve_smooth = GetCurrPara(pAmergeCtx->CurrData.CtrlData.EnvLv,
|
pAmergeCtx->Config.Merge_v30.ShortFrmEnvLv, pAmergeCtx->Config.Merge_v30.ShortFrmOECurve_smooth, pAmergeCtx->Config.Merge_v30.ShortFrmMaxEnvLvKnots);
|
pAmergeCtx->CurrData.HandleData.Merge_v30.OECurve_offset = GetCurrPara(pAmergeCtx->CurrData.CtrlData.EnvLv,
|
pAmergeCtx->Config.Merge_v30.ShortFrmEnvLv, pAmergeCtx->Config.Merge_v30.ShortFrmOECurve_offset, pAmergeCtx->Config.Merge_v30.ShortFrmMaxEnvLvKnots);
|
|
//get Current merge MDCurve
|
pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurve_Coef = GetCurrPara(pAmergeCtx->CurrData.CtrlData.MoveCoef,
|
pAmergeCtx->Config.Merge_v30.ShortFrmMoveCoef, pAmergeCtx->Config.Merge_v30.ShortFrmMDCurve_Coef, pAmergeCtx->Config.Merge_v30.ShortFrmMaxMoveCoefKnots);
|
pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurve_ms_thd0 = GetCurrPara(pAmergeCtx->CurrData.CtrlData.MoveCoef,
|
pAmergeCtx->Config.Merge_v30.ShortFrmMoveCoef, pAmergeCtx->Config.Merge_v30.ShortFrmMDCurve_ms_thd0, pAmergeCtx->Config.Merge_v30.ShortFrmMaxMoveCoefKnots);
|
pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurve_lm_thd0 = GetCurrPara(pAmergeCtx->CurrData.CtrlData.MoveCoef,
|
pAmergeCtx->Config.Merge_v30.ShortFrmMoveCoef, pAmergeCtx->Config.Merge_v30.ShortFrmMDCurve_lm_thd0, pAmergeCtx->Config.Merge_v30.ShortFrmMaxMoveCoefKnots);
|
|
pAmergeCtx->CurrData.CtrlData.MergeOEDamp = pAmergeCtx->Config.Merge_v30.ShortFrmOECurve_damp;
|
pAmergeCtx->CurrData.CtrlData.MergeMDDampLM = pAmergeCtx->Config.Merge_v30.ShortFrmMDCurve_damp;
|
pAmergeCtx->CurrData.CtrlData.MergeMDDampMS = pAmergeCtx->Config.Merge_v30.ShortFrmMDCurve_damp;
|
}
|
}
|
|
LOG1_AMERGE( "%s:exit!\n", __FUNCTION__);
|
}
|
/******************************************************************************
|
* MergePrepareJsonMalloc()
|
***************************************************************************/
|
void MergePrepareJsonMalloc
|
(
|
AmergeConfig_t* pAmergeConfig,
|
AmergeCalib_t* pCalibDb
|
) {
|
LOG1_AMERGE( "%s:enter!\n", __FUNCTION__);
|
|
// initial checks
|
DCT_ASSERT(pAmergeConfig != NULL);
|
DCT_ASSERT(pCalibDb != NULL);
|
|
if(CHECK_ISP_HW_V21()) {
|
int New_OECurve_EnvLv_len = pCalibDb->Merge_v20.MergeTuningPara.OECurve.EnvLv_len;
|
int New_MDCurve_MoveCoef_len = pCalibDb->Merge_v20.MergeTuningPara.MDCurve.MoveCoef_len;
|
|
LOG1_AMERGE( "%s: Pre MaxEnvLvKnots:%d Cur MaxEnvLvKnots:%d\n", __FUNCTION__, pAmergeConfig->Merge_v20.MaxEnvLvKnots, New_OECurve_EnvLv_len);
|
LOG1_AMERGE( "%s: Pre MaxMoveCoefKnots:%d Cur MaxMoveCoefKnots:%d\n", __FUNCTION__, pAmergeConfig->Merge_v20.MaxMoveCoefKnots, New_MDCurve_MoveCoef_len);
|
|
if(pAmergeConfig->Merge_v20.MaxEnvLvKnots != New_OECurve_EnvLv_len) {
|
free(pAmergeConfig->Merge_v20.EnvLv);
|
free(pAmergeConfig->Merge_v20.OECurve_smooth);
|
free(pAmergeConfig->Merge_v20.OECurve_offset);
|
pAmergeConfig->Merge_v20.MaxEnvLvKnots = New_OECurve_EnvLv_len;
|
pAmergeConfig->Merge_v20.EnvLv = (float*)malloc(sizeof(float) * New_OECurve_EnvLv_len);
|
pAmergeConfig->Merge_v20.OECurve_smooth = (float*)malloc(sizeof(float) * New_OECurve_EnvLv_len);
|
pAmergeConfig->Merge_v20.OECurve_offset = (float*)malloc(sizeof(float) * New_OECurve_EnvLv_len);
|
}
|
if(pAmergeConfig->Merge_v20.MaxMoveCoefKnots != New_MDCurve_MoveCoef_len) {
|
free(pAmergeConfig->Merge_v20.MoveCoef);
|
free(pAmergeConfig->Merge_v20.MDCurveLM_smooth);
|
free(pAmergeConfig->Merge_v20.MDCurveLM_offset);
|
free(pAmergeConfig->Merge_v20.MDCurveMS_smooth);
|
free(pAmergeConfig->Merge_v20.MDCurveMS_offset);
|
pAmergeConfig->Merge_v20.MaxMoveCoefKnots = New_MDCurve_MoveCoef_len;
|
pAmergeConfig->Merge_v20.MoveCoef = (float*)malloc(sizeof(float) * New_MDCurve_MoveCoef_len);
|
pAmergeConfig->Merge_v20.MDCurveLM_smooth = (float*)malloc(sizeof(float) * New_MDCurve_MoveCoef_len);
|
pAmergeConfig->Merge_v20.MDCurveLM_offset = (float*)malloc(sizeof(float) * New_MDCurve_MoveCoef_len);
|
pAmergeConfig->Merge_v20.MDCurveMS_smooth = (float*)malloc(sizeof(float) * New_MDCurve_MoveCoef_len);
|
pAmergeConfig->Merge_v20.MDCurveMS_offset = (float*)malloc(sizeof(float) * New_MDCurve_MoveCoef_len);
|
}
|
}
|
else if(CHECK_ISP_HW_V30()) {
|
int New_Long_OECurve_EnvLv_len = pCalibDb->Merge_v30.MergeTuningPara.LongFrmModeData.OECurve.EnvLv_len;
|
int New_Long_MDCurve_MoveCoef_len = pCalibDb->Merge_v30.MergeTuningPara.LongFrmModeData.MDCurve.MoveCoef_len;
|
int New_Short_OECurve_EnvLv_len = pCalibDb->Merge_v30.MergeTuningPara.ShortFrmModeData.OECurve.EnvLv_len;
|
int New_Short_MDCurve_MoveCoef_len = pCalibDb->Merge_v30.MergeTuningPara.ShortFrmModeData.MDCurve.MoveCoef_len;
|
|
//long frm mode
|
LOG1_AMERGE( "%s: Pre MaxEnvLvKnots:%d Cur MaxEnvLvKnots:%d\n", __FUNCTION__,
|
pAmergeConfig->Merge_v30.LongFrmMaxEnvLvKnots, New_Long_OECurve_EnvLv_len);
|
LOG1_AMERGE( "%s: Pre MaxMoveCoefKnots:%d Cur MaxMoveCoefKnots:%d\n", __FUNCTION__,
|
pAmergeConfig->Merge_v30.LongFrmMaxMoveCoefKnots, New_Long_MDCurve_MoveCoef_len);
|
|
if(pAmergeConfig->Merge_v30.LongFrmMaxEnvLvKnots != New_Long_OECurve_EnvLv_len) {
|
free(pAmergeConfig->Merge_v30.LongFrmEnvLv);
|
free(pAmergeConfig->Merge_v30.LongFrmOECurve_smooth);
|
free(pAmergeConfig->Merge_v30.LongFrmOECurve_offset);
|
pAmergeConfig->Merge_v30.LongFrmMaxEnvLvKnots = New_Long_OECurve_EnvLv_len;
|
pAmergeConfig->Merge_v30.LongFrmEnvLv = (float*)malloc(sizeof(float) * (New_Long_OECurve_EnvLv_len));
|
pAmergeConfig->Merge_v30.LongFrmOECurve_smooth = (float*)malloc(sizeof(float) * (New_Long_OECurve_EnvLv_len));
|
pAmergeConfig->Merge_v30.LongFrmOECurve_offset = (float*)malloc(sizeof(float) * (New_Long_OECurve_EnvLv_len));
|
}
|
if(pAmergeConfig->Merge_v30.LongFrmMaxMoveCoefKnots != New_Long_MDCurve_MoveCoef_len) {
|
free(pAmergeConfig->Merge_v30.LongFrmMoveCoef);
|
free(pAmergeConfig->Merge_v30.LongFrmMDCurveLM_smooth);
|
free(pAmergeConfig->Merge_v30.LongFrmMDCurveLM_offset);
|
free(pAmergeConfig->Merge_v30.LongFrmMDCurveMS_smooth);
|
free(pAmergeConfig->Merge_v30.LongFrmMDCurveMS_offset);
|
pAmergeConfig->Merge_v30.LongFrmMaxMoveCoefKnots = New_Long_MDCurve_MoveCoef_len;
|
pAmergeConfig->Merge_v30.LongFrmMoveCoef = (float*)malloc(sizeof(float) * (New_Long_MDCurve_MoveCoef_len));
|
pAmergeConfig->Merge_v30.LongFrmMDCurveLM_smooth = (float*)malloc(sizeof(float) * (New_Long_MDCurve_MoveCoef_len));
|
pAmergeConfig->Merge_v30.LongFrmMDCurveLM_offset = (float*)malloc(sizeof(float) * (New_Long_MDCurve_MoveCoef_len));
|
pAmergeConfig->Merge_v30.LongFrmMDCurveMS_smooth = (float*)malloc(sizeof(float) * (New_Long_MDCurve_MoveCoef_len));
|
pAmergeConfig->Merge_v30.LongFrmMDCurveMS_offset = (float*)malloc(sizeof(float) * (New_Long_MDCurve_MoveCoef_len));
|
}
|
|
//short frm mode
|
LOG1_AMERGE( "%s: Pre MaxEnvLvKnots:%d Cur MaxEnvLvKnots:%d\n", __FUNCTION__,
|
pAmergeConfig->Merge_v30.ShortFrmMaxEnvLvKnots, New_Short_OECurve_EnvLv_len);
|
LOG1_AMERGE( "%s: Pre MaxMoveCoefKnots:%d Cur MaxMoveCoefKnots:%d\n", __FUNCTION__,
|
pAmergeConfig->Merge_v30.ShortFrmMaxMoveCoefKnots, New_Short_MDCurve_MoveCoef_len);
|
|
if(pAmergeConfig->Merge_v30.ShortFrmMaxEnvLvKnots != New_Short_OECurve_EnvLv_len) {
|
free(pAmergeConfig->Merge_v30.ShortFrmEnvLv);
|
free(pAmergeConfig->Merge_v30.ShortFrmOECurve_smooth);
|
free(pAmergeConfig->Merge_v30.ShortFrmOECurve_offset);
|
pAmergeConfig->Merge_v30.ShortFrmMaxEnvLvKnots = New_Short_OECurve_EnvLv_len;
|
pAmergeConfig->Merge_v30.ShortFrmEnvLv = (float*)malloc(sizeof(float) * New_Short_OECurve_EnvLv_len);
|
pAmergeConfig->Merge_v30.ShortFrmOECurve_smooth = (float*)malloc(sizeof(float) * New_Short_OECurve_EnvLv_len);
|
pAmergeConfig->Merge_v30.ShortFrmOECurve_offset = (float*)malloc(sizeof(float) * New_Short_OECurve_EnvLv_len);
|
}
|
if(pAmergeConfig->Merge_v30.ShortFrmMaxMoveCoefKnots != New_Short_MDCurve_MoveCoef_len) {
|
free(pAmergeConfig->Merge_v30.ShortFrmMoveCoef);
|
free(pAmergeConfig->Merge_v30.ShortFrmMDCurve_Coef);
|
free(pAmergeConfig->Merge_v30.ShortFrmMDCurve_ms_thd0);
|
free(pAmergeConfig->Merge_v30.ShortFrmMDCurve_lm_thd0);
|
pAmergeConfig->Merge_v30.ShortFrmMaxMoveCoefKnots = New_Short_MDCurve_MoveCoef_len;
|
pAmergeConfig->Merge_v30.ShortFrmMoveCoef = (float*)malloc(sizeof(float) * New_Short_MDCurve_MoveCoef_len);
|
pAmergeConfig->Merge_v30.ShortFrmMDCurve_Coef = (float*)malloc(sizeof(float) * New_Short_MDCurve_MoveCoef_len);
|
pAmergeConfig->Merge_v30.ShortFrmMDCurve_ms_thd0 = (float*)malloc(sizeof(float) * New_Short_MDCurve_MoveCoef_len);
|
pAmergeConfig->Merge_v30.ShortFrmMDCurve_lm_thd0 = (float*)malloc(sizeof(float) * New_Short_MDCurve_MoveCoef_len);
|
}
|
}
|
|
LOG1_AMERGE( "%s:exit!\n", __FUNCTION__);
|
}
|
/******************************************************************************
|
* MergeProcApiMalloc()
|
***************************************************************************/
|
void MergeProcApiMalloc
|
(
|
AmergeConfig_t* pAmergeConfig,
|
mergeAttr_t* pAttr
|
) {
|
LOG1_AMERGE( "%s:enter!\n", __FUNCTION__);
|
|
// initial checks
|
DCT_ASSERT(pAmergeConfig != NULL);
|
DCT_ASSERT(pAttr != NULL);
|
|
if(CHECK_ISP_HW_V21()) {
|
int New_OECurve_EnvLv_len = 1;
|
int New_MDCurve_MoveCoef_len = 1;
|
|
LOG1_AMERGE( "%s: Pre MaxEnvLvKnots:%d Cur MaxEnvLvKnots:%d\n", __FUNCTION__, pAmergeConfig->Merge_v20.MaxEnvLvKnots, New_OECurve_EnvLv_len);
|
LOG1_AMERGE( "%s: Pre MaxMoveCoefKnots:%d Cur MaxMoveCoefKnots:%d\n", __FUNCTION__, pAmergeConfig->Merge_v20.MaxMoveCoefKnots, New_MDCurve_MoveCoef_len);
|
|
if(pAmergeConfig->Merge_v20.MaxEnvLvKnots != New_OECurve_EnvLv_len) {
|
free(pAmergeConfig->Merge_v20.EnvLv);
|
free(pAmergeConfig->Merge_v20.OECurve_smooth);
|
free(pAmergeConfig->Merge_v20.OECurve_offset);
|
pAmergeConfig->Merge_v20.MaxEnvLvKnots = New_OECurve_EnvLv_len;
|
pAmergeConfig->Merge_v20.EnvLv = (float*)malloc(sizeof(float) * New_OECurve_EnvLv_len);
|
pAmergeConfig->Merge_v20.OECurve_smooth = (float*)malloc(sizeof(float) * New_OECurve_EnvLv_len);
|
pAmergeConfig->Merge_v20.OECurve_offset = (float*)malloc(sizeof(float) * New_OECurve_EnvLv_len);
|
}
|
if(pAmergeConfig->Merge_v20.MaxMoveCoefKnots != New_MDCurve_MoveCoef_len) {
|
free(pAmergeConfig->Merge_v20.MoveCoef);
|
free(pAmergeConfig->Merge_v20.MDCurveLM_smooth);
|
free(pAmergeConfig->Merge_v20.MDCurveLM_offset);
|
free(pAmergeConfig->Merge_v20.MDCurveMS_smooth);
|
free(pAmergeConfig->Merge_v20.MDCurveMS_offset);
|
pAmergeConfig->Merge_v20.MaxMoveCoefKnots = New_MDCurve_MoveCoef_len;
|
pAmergeConfig->Merge_v20.MoveCoef = (float*)malloc(sizeof(float) * New_MDCurve_MoveCoef_len);
|
pAmergeConfig->Merge_v20.MDCurveLM_smooth = (float*)malloc(sizeof(float) * New_MDCurve_MoveCoef_len);
|
pAmergeConfig->Merge_v20.MDCurveLM_offset = (float*)malloc(sizeof(float) * New_MDCurve_MoveCoef_len);
|
pAmergeConfig->Merge_v20.MDCurveMS_smooth = (float*)malloc(sizeof(float) * New_MDCurve_MoveCoef_len);
|
pAmergeConfig->Merge_v20.MDCurveMS_offset = (float*)malloc(sizeof(float) * New_MDCurve_MoveCoef_len);
|
}
|
}
|
else if(CHECK_ISP_HW_V30()) {
|
int New_Long_OECurve_EnvLv_len = 1;
|
int New_Long_MDCurve_MoveCoef_len = 1;
|
int New_Short_OECurve_EnvLv_len = 1;
|
int New_Short_MDCurve_MoveCoef_len = 1;
|
|
//long frm mode
|
LOG1_AMERGE( "%s: Pre MaxEnvLvKnots:%d Cur MaxEnvLvKnots:%d\n", __FUNCTION__,
|
pAmergeConfig->Merge_v30.LongFrmMaxEnvLvKnots, New_Long_OECurve_EnvLv_len);
|
LOG1_AMERGE( "%s: Pre MaxMoveCoefKnots:%d Cur MaxMoveCoefKnots:%d\n", __FUNCTION__,
|
pAmergeConfig->Merge_v30.LongFrmMaxMoveCoefKnots, New_Long_MDCurve_MoveCoef_len);
|
|
if(pAmergeConfig->Merge_v30.LongFrmMaxEnvLvKnots != New_Long_OECurve_EnvLv_len) {
|
free(pAmergeConfig->Merge_v30.LongFrmEnvLv);
|
free(pAmergeConfig->Merge_v30.LongFrmOECurve_smooth);
|
free(pAmergeConfig->Merge_v30.LongFrmOECurve_offset);
|
pAmergeConfig->Merge_v30.LongFrmMaxEnvLvKnots = New_Long_OECurve_EnvLv_len;
|
pAmergeConfig->Merge_v30.LongFrmEnvLv = (float*)malloc(sizeof(float) * (New_Long_OECurve_EnvLv_len));
|
pAmergeConfig->Merge_v30.LongFrmOECurve_smooth = (float*)malloc(sizeof(float) * (New_Long_OECurve_EnvLv_len));
|
pAmergeConfig->Merge_v30.LongFrmOECurve_offset = (float*)malloc(sizeof(float) * (New_Long_OECurve_EnvLv_len));
|
}
|
if(pAmergeConfig->Merge_v30.LongFrmMaxMoveCoefKnots != New_Long_MDCurve_MoveCoef_len) {
|
free(pAmergeConfig->Merge_v30.LongFrmMoveCoef);
|
free(pAmergeConfig->Merge_v30.LongFrmMDCurveLM_smooth);
|
free(pAmergeConfig->Merge_v30.LongFrmMDCurveLM_offset);
|
free(pAmergeConfig->Merge_v30.LongFrmMDCurveMS_smooth);
|
free(pAmergeConfig->Merge_v30.LongFrmMDCurveMS_offset);
|
pAmergeConfig->Merge_v30.LongFrmMaxMoveCoefKnots = New_Long_MDCurve_MoveCoef_len;
|
pAmergeConfig->Merge_v30.LongFrmMoveCoef = (float*)malloc(sizeof(float) * (New_Long_MDCurve_MoveCoef_len));
|
pAmergeConfig->Merge_v30.LongFrmMDCurveLM_smooth = (float*)malloc(sizeof(float) * (New_Long_MDCurve_MoveCoef_len));
|
pAmergeConfig->Merge_v30.LongFrmMDCurveLM_offset = (float*)malloc(sizeof(float) * (New_Long_MDCurve_MoveCoef_len));
|
pAmergeConfig->Merge_v30.LongFrmMDCurveMS_smooth = (float*)malloc(sizeof(float) * (New_Long_MDCurve_MoveCoef_len));
|
pAmergeConfig->Merge_v30.LongFrmMDCurveMS_offset = (float*)malloc(sizeof(float) * (New_Long_MDCurve_MoveCoef_len));
|
}
|
|
//short frm mode
|
LOG1_AMERGE( "%s: Pre MaxEnvLvKnots:%d Cur MaxEnvLvKnots:%d\n", __FUNCTION__,
|
pAmergeConfig->Merge_v30.ShortFrmMaxEnvLvKnots, New_Short_OECurve_EnvLv_len);
|
LOG1_AMERGE( "%s: Pre MaxMoveCoefKnots:%d Cur MaxMoveCoefKnots:%d\n", __FUNCTION__,
|
pAmergeConfig->Merge_v30.ShortFrmMaxMoveCoefKnots, New_Short_MDCurve_MoveCoef_len);
|
|
if(pAmergeConfig->Merge_v30.ShortFrmMaxEnvLvKnots != New_Short_OECurve_EnvLv_len) {
|
free(pAmergeConfig->Merge_v30.ShortFrmEnvLv);
|
free(pAmergeConfig->Merge_v30.ShortFrmOECurve_smooth);
|
free(pAmergeConfig->Merge_v30.ShortFrmOECurve_offset);
|
pAmergeConfig->Merge_v30.ShortFrmMaxEnvLvKnots = New_Short_OECurve_EnvLv_len;
|
pAmergeConfig->Merge_v30.ShortFrmEnvLv = (float*)malloc(sizeof(float) * New_Short_OECurve_EnvLv_len);
|
pAmergeConfig->Merge_v30.ShortFrmOECurve_smooth = (float*)malloc(sizeof(float) * New_Short_OECurve_EnvLv_len);
|
pAmergeConfig->Merge_v30.ShortFrmOECurve_offset = (float*)malloc(sizeof(float) * New_Short_OECurve_EnvLv_len);
|
}
|
if(pAmergeConfig->Merge_v30.ShortFrmMaxMoveCoefKnots != New_Short_MDCurve_MoveCoef_len) {
|
free(pAmergeConfig->Merge_v30.ShortFrmMoveCoef);
|
free(pAmergeConfig->Merge_v30.ShortFrmMDCurve_Coef);
|
free(pAmergeConfig->Merge_v30.ShortFrmMDCurve_ms_thd0);
|
free(pAmergeConfig->Merge_v30.ShortFrmMDCurve_lm_thd0);
|
pAmergeConfig->Merge_v30.ShortFrmMaxMoveCoefKnots = New_Short_MDCurve_MoveCoef_len;
|
pAmergeConfig->Merge_v30.ShortFrmMoveCoef = (float*)malloc(sizeof(float) * New_Short_MDCurve_MoveCoef_len);
|
pAmergeConfig->Merge_v30.ShortFrmMDCurve_Coef = (float*)malloc(sizeof(float) * New_Short_MDCurve_MoveCoef_len);
|
pAmergeConfig->Merge_v30.ShortFrmMDCurve_ms_thd0 = (float*)malloc(sizeof(float) * New_Short_MDCurve_MoveCoef_len);
|
pAmergeConfig->Merge_v30.ShortFrmMDCurve_lm_thd0 = (float*)malloc(sizeof(float) * New_Short_MDCurve_MoveCoef_len);
|
}
|
}
|
|
LOG1_AMERGE( "%s:exit!\n", __FUNCTION__);
|
}
|
|
/******************************************************************************
|
* AmergePrepareJsonUpdateConfig()
|
*transfer html parameter into handle
|
***************************************************************************/
|
void AmergePrepareJsonUpdateConfig
|
(
|
AmergeContext_t* pAmergeCtx,
|
AmergeCalib_t* pCalibDb
|
) {
|
LOG1_AMERGE( "%s:enter!\n", __FUNCTION__);
|
|
// initial checks
|
DCT_ASSERT(pAmergeCtx != NULL);
|
DCT_ASSERT(pCalibDb != NULL);
|
|
if(CHECK_ISP_HW_V21()) {
|
pAmergeCtx->Config.Merge_v20.BaseFrm = BASEFRAME_LONG;
|
pAmergeCtx->Config.Merge_v20.ByPassThr = LIMIT_VALUE(pCalibDb->Merge_v20.MergeTuningPara.ByPassThr, DAMPMAX, DAMPMIN);
|
pAmergeCtx->Config.Merge_v20.OECurve_damp = LIMIT_VALUE(pCalibDb->Merge_v20.MergeTuningPara.OECurve_damp, DAMPMAX, DAMPMIN);
|
pAmergeCtx->Config.Merge_v20.MDCurveLM_damp = LIMIT_VALUE(pCalibDb->Merge_v20.MergeTuningPara.MDCurveLM_damp, DAMPMAX, DAMPMIN);
|
pAmergeCtx->Config.Merge_v20.MDCurveMS_damp = LIMIT_VALUE(pCalibDb->Merge_v20.MergeTuningPara.MDCurveMS_damp, DAMPMAX, DAMPMIN);
|
for (int i = 0; i < pAmergeCtx->Config.Merge_v20.MaxEnvLvKnots; i++ ) {
|
pAmergeCtx->Config.Merge_v20.EnvLv[i] = LIMIT_VALUE(pCalibDb->Merge_v20.MergeTuningPara.OECurve.EnvLv[i], ENVLVMAX, ENVLVMIN);
|
pAmergeCtx->Config.Merge_v20.OECurve_smooth[i] = LIMIT_VALUE(pCalibDb->Merge_v20.MergeTuningPara.OECurve.Smooth[i], IQPARAMAX, IQPARAMIN);
|
pAmergeCtx->Config.Merge_v20.OECurve_offset[i] = LIMIT_VALUE(pCalibDb->Merge_v20.MergeTuningPara.OECurve.Offset[i], OECURVEOFFSETMAX, OECURVEOFFSETMIN);
|
}
|
for (int i = 0; i < pAmergeCtx->Config.Merge_v20.MaxMoveCoefKnots; i++ ) {
|
pAmergeCtx->Config.Merge_v20.MoveCoef[i] = LIMIT_VALUE(pCalibDb->Merge_v20.MergeTuningPara.MDCurve.MoveCoef[i], MOVECOEFMAX, MOVECOEFMIN);
|
pAmergeCtx->Config.Merge_v20.MDCurveLM_smooth[i] = LIMIT_VALUE(pCalibDb->Merge_v20.MergeTuningPara.MDCurve.LM_smooth[i], IQPARAMAX, IQPARAMIN);
|
pAmergeCtx->Config.Merge_v20.MDCurveLM_offset[i] = LIMIT_VALUE(pCalibDb->Merge_v20.MergeTuningPara.MDCurve.LM_offset[i], IQPARAMAX, IQPARAMIN);
|
pAmergeCtx->Config.Merge_v20.MDCurveMS_smooth[i] = LIMIT_VALUE(pCalibDb->Merge_v20.MergeTuningPara.MDCurve.MS_smooth[i], IQPARAMAX, IQPARAMIN);
|
pAmergeCtx->Config.Merge_v20.MDCurveMS_offset[i] = LIMIT_VALUE(pCalibDb->Merge_v20.MergeTuningPara.MDCurve.MS_offset[i], IQPARAMAX, IQPARAMIN);
|
}
|
|
//turn the IQ paras into algo paras
|
for(int i = 0; i < pAmergeCtx->Config.Merge_v20.MaxEnvLvKnots; i++)
|
{
|
pAmergeCtx->Config.Merge_v20.OECurve_smooth[i] *= OECURVESMOOTHMAX;
|
pAmergeCtx->Config.Merge_v20.OECurve_smooth[i] = LIMIT_VALUE(pAmergeCtx->Config.Merge_v20.OECurve_smooth[i], OECURVESMOOTHMAX, OECURVESMOOTHMIN) ;
|
}
|
|
for(int i = 0; i < pAmergeCtx->Config.Merge_v20.MaxMoveCoefKnots; i++)
|
{
|
pAmergeCtx->Config.Merge_v20.MDCurveLM_smooth[i] *= MDCURVESMOOTHMAX;
|
pAmergeCtx->Config.Merge_v20.MDCurveLM_smooth[i] = LIMIT_VALUE(pAmergeCtx->Config.Merge_v20.MDCurveLM_smooth[i], MDCURVESMOOTHMAX, MDCURVESMOOTHMIN) ;
|
pAmergeCtx->Config.Merge_v20.MDCurveLM_offset[i] *= MDCURVEOFFSETMAX;
|
pAmergeCtx->Config.Merge_v20.MDCurveLM_offset[i] = LIMIT_VALUE(pAmergeCtx->Config.Merge_v20.MDCurveLM_offset[i], MDCURVEOFFSETMAX, MDCURVEOFFSETMIN) ;
|
|
pAmergeCtx->Config.Merge_v20.MDCurveMS_smooth[i] *= MDCURVESMOOTHMAX;
|
pAmergeCtx->Config.Merge_v20.MDCurveMS_smooth[i] = LIMIT_VALUE(pAmergeCtx->Config.Merge_v20.MDCurveMS_smooth[i], MDCURVESMOOTHMAX, MDCURVESMOOTHMIN) ;
|
pAmergeCtx->Config.Merge_v20.MDCurveMS_offset[i] *= MDCURVEOFFSETMAX;
|
pAmergeCtx->Config.Merge_v20.MDCurveMS_offset[i] = LIMIT_VALUE(pAmergeCtx->Config.Merge_v20.MDCurveMS_offset[i], MDCURVEOFFSETMAX, MDCURVEOFFSETMIN) ;
|
}
|
}
|
else if(CHECK_ISP_HW_V30()) {
|
pAmergeCtx->Config.Merge_v30.BaseFrm = pCalibDb->Merge_v30.MergeTuningPara.BaseFrm;
|
pAmergeCtx->Config.Merge_v30.ByPassThr = LIMIT_VALUE(pCalibDb->Merge_v30.MergeTuningPara.ByPassThr, DAMPMAX, DAMPMIN);
|
|
//long frm mode para
|
pAmergeCtx->Config.Merge_v30.LongFrmOECurve_damp = LIMIT_VALUE(pCalibDb->Merge_v30.MergeTuningPara.LongFrmModeData.OECurve_damp, DAMPMAX, DAMPMIN);
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveLM_damp = LIMIT_VALUE(pCalibDb->Merge_v30.MergeTuningPara.LongFrmModeData.MDCurveLM_damp, DAMPMAX, DAMPMIN);
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveMS_damp = LIMIT_VALUE(pCalibDb->Merge_v30.MergeTuningPara.LongFrmModeData.MDCurveMS_damp, DAMPMAX, DAMPMIN);
|
for (int i = 0; i < pAmergeCtx->Config.Merge_v30.LongFrmMaxEnvLvKnots; i++ ) {
|
pAmergeCtx->Config.Merge_v30.LongFrmEnvLv[i] = LIMIT_VALUE(pCalibDb->Merge_v30.MergeTuningPara.LongFrmModeData.OECurve.EnvLv[i], ENVLVMAX, ENVLVMIN);
|
pAmergeCtx->Config.Merge_v30.LongFrmOECurve_smooth[i] = LIMIT_VALUE(pCalibDb->Merge_v30.MergeTuningPara.LongFrmModeData.OECurve.Smooth[i], IQPARAMAX, IQPARAMIN);
|
pAmergeCtx->Config.Merge_v30.LongFrmOECurve_offset[i] = LIMIT_VALUE(pCalibDb->Merge_v30.MergeTuningPara.LongFrmModeData.OECurve.Offset[i], OECURVEOFFSETMAX, OECURVEOFFSETMIN);
|
}
|
for (int i = 0; i < pAmergeCtx->Config.Merge_v30.LongFrmMaxMoveCoefKnots; i++ ) {
|
pAmergeCtx->Config.Merge_v30.LongFrmMoveCoef[i] = LIMIT_VALUE(pCalibDb->Merge_v30.MergeTuningPara.LongFrmModeData.MDCurve.MoveCoef[i], MOVECOEFMAX, MOVECOEFMIN);
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveLM_smooth[i] = LIMIT_VALUE(pCalibDb->Merge_v30.MergeTuningPara.LongFrmModeData.MDCurve.LM_smooth[i], IQPARAMAX, IQPARAMIN);
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveLM_offset[i] = LIMIT_VALUE(pCalibDb->Merge_v30.MergeTuningPara.LongFrmModeData.MDCurve.LM_offset[i], IQPARAMAX, IQPARAMIN);
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveMS_smooth[i] = LIMIT_VALUE(pCalibDb->Merge_v30.MergeTuningPara.LongFrmModeData.MDCurve.MS_smooth[i], IQPARAMAX, IQPARAMIN);
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveMS_offset[i] = LIMIT_VALUE(pCalibDb->Merge_v30.MergeTuningPara.LongFrmModeData.MDCurve.MS_offset[i], IQPARAMAX, IQPARAMIN);
|
}
|
//short frm mode para
|
pAmergeCtx->Config.Merge_v30.ShortFrmOECurve_damp = LIMIT_VALUE(pCalibDb->Merge_v30.MergeTuningPara.ShortFrmModeData.OECurve_damp, DAMPMAX, DAMPMIN);
|
pAmergeCtx->Config.Merge_v30.ShortFrmMDCurve_damp = LIMIT_VALUE(pCalibDb->Merge_v30.MergeTuningPara.ShortFrmModeData.MDCurve_damp, DAMPMAX, DAMPMIN);
|
for (int i = 0; i < pAmergeCtx->Config.Merge_v30.ShortFrmMaxEnvLvKnots; i++ ) {
|
pAmergeCtx->Config.Merge_v30.ShortFrmEnvLv[i] = LIMIT_VALUE(pCalibDb->Merge_v30.MergeTuningPara.ShortFrmModeData.OECurve.EnvLv[i], ENVLVMAX, ENVLVMIN);
|
pAmergeCtx->Config.Merge_v30.ShortFrmOECurve_smooth[i] = LIMIT_VALUE(pCalibDb->Merge_v30.MergeTuningPara.ShortFrmModeData.OECurve.Smooth[i], IQPARAMAX, IQPARAMIN);
|
pAmergeCtx->Config.Merge_v30.ShortFrmOECurve_offset[i] = LIMIT_VALUE(pCalibDb->Merge_v30.MergeTuningPara.ShortFrmModeData.OECurve.Offset[i], OECURVEOFFSETMAX, OECURVEOFFSETMIN);
|
}
|
for (int i = 0; i < pAmergeCtx->Config.Merge_v30.ShortFrmMaxMoveCoefKnots; i++ ) {
|
pAmergeCtx->Config.Merge_v30.ShortFrmMoveCoef[i] = LIMIT_VALUE(pCalibDb->Merge_v30.MergeTuningPara.ShortFrmModeData.MDCurve.MoveCoef[i], MOVECOEFMAX, MOVECOEFMIN);
|
pAmergeCtx->Config.Merge_v30.ShortFrmMDCurve_Coef[i] = LIMIT_VALUE(pCalibDb->Merge_v30.MergeTuningPara.ShortFrmModeData.MDCurve.Coef[i], IQPARAMAX, IQPARAMIN);
|
pAmergeCtx->Config.Merge_v30.ShortFrmMDCurve_ms_thd0[i] = LIMIT_VALUE(pCalibDb->Merge_v30.MergeTuningPara.ShortFrmModeData.MDCurve.ms_thd0[i], IQ_TH0_PARAMAX, IQ_TH0_PARAMIN);
|
pAmergeCtx->Config.Merge_v30.ShortFrmMDCurve_lm_thd0[i] = LIMIT_VALUE(pCalibDb->Merge_v30.MergeTuningPara.ShortFrmModeData.MDCurve.lm_thd0[i], IQ_TH0_PARAMAX, IQ_TH0_PARAMIN);
|
}
|
|
//turn the IQ paras into algo paras
|
for(int i = 0; i < pAmergeCtx->Config.Merge_v30.LongFrmMaxEnvLvKnots; i++) {
|
pAmergeCtx->Config.Merge_v30.LongFrmOECurve_smooth[i] *= OECURVESMOOTHMAX;
|
pAmergeCtx->Config.Merge_v30.LongFrmOECurve_smooth[i] = LIMIT_VALUE(pAmergeCtx->Config.Merge_v30.LongFrmOECurve_smooth[i], OECURVESMOOTHMAX, OECURVESMOOTHMIN) ;
|
}
|
for(int i = 0; i < pAmergeCtx->Config.Merge_v30.LongFrmMaxMoveCoefKnots; i++)
|
{
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveLM_smooth[i] *= MDCURVESMOOTHMAX;
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveLM_smooth[i] = LIMIT_VALUE(pAmergeCtx->Config.Merge_v30.LongFrmMDCurveLM_smooth[i], MDCURVESMOOTHMAX, MDCURVESMOOTHMIN) ;
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveLM_offset[i] *= MDCURVEOFFSETMAX;
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveLM_offset[i] = LIMIT_VALUE(pAmergeCtx->Config.Merge_v30.LongFrmMDCurveLM_offset[i], MDCURVEOFFSETMAX, MDCURVEOFFSETMIN) ;
|
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveMS_smooth[i] *= MDCURVESMOOTHMAX;
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveMS_smooth[i] = LIMIT_VALUE(pAmergeCtx->Config.Merge_v30.LongFrmMDCurveMS_smooth[i], MDCURVESMOOTHMAX, MDCURVESMOOTHMIN) ;
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveMS_offset[i] *= MDCURVEOFFSETMAX;
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveMS_offset[i] = LIMIT_VALUE(pAmergeCtx->Config.Merge_v30.LongFrmMDCurveMS_offset[i], MDCURVEOFFSETMAX, MDCURVEOFFSETMIN) ;
|
}
|
for(int i = 0; i < pAmergeCtx->Config.Merge_v30.ShortFrmMaxEnvLvKnots; i++) {
|
pAmergeCtx->Config.Merge_v30.ShortFrmOECurve_smooth[i] *= OECURVESMOOTHMAX;
|
pAmergeCtx->Config.Merge_v30.ShortFrmOECurve_smooth[i] = LIMIT_VALUE(pAmergeCtx->Config.Merge_v30.ShortFrmOECurve_smooth[i], OECURVESMOOTHMAX, OECURVESMOOTHMIN) ;
|
}
|
}
|
|
LOG1_AMERGE( "%s:exit!\n", __FUNCTION__);
|
}
|
|
/******************************************************************************
|
* AmergeProcApiUpdateConfig()
|
*transfer api parameter into handle
|
***************************************************************************/
|
void AmergeProcApiUpdateConfig
|
(
|
AmergeContext_t* pAmergeCtx
|
) {
|
LOG1_AMERGE( "%s:enter!\n", __FUNCTION__);
|
|
// initial checks
|
DCT_ASSERT(pAmergeCtx != NULL);
|
|
if(CHECK_ISP_HW_V21()) {
|
pAmergeCtx->Config.Merge_v20.BaseFrm = BASEFRAME_LONG;
|
pAmergeCtx->Config.Merge_v20.ByPassThr = DAMPMIN;
|
pAmergeCtx->Config.Merge_v20.OECurve_damp = DAMPMIN;
|
pAmergeCtx->Config.Merge_v20.MDCurveLM_damp = DAMPMIN;
|
pAmergeCtx->Config.Merge_v20.MDCurveMS_damp = DAMPMIN;
|
for (int i = 0; i < pAmergeCtx->Config.Merge_v20.MaxEnvLvKnots; i++ ) {
|
pAmergeCtx->Config.Merge_v20.EnvLv[i] = ENVLVMIN;
|
pAmergeCtx->Config.Merge_v20.OECurve_smooth[i] = LIMIT_VALUE(pAmergeCtx->mergeAttr.attrV21.stManual.OECurve.Smooth, IQPARAMAX, IQPARAMIN);
|
pAmergeCtx->Config.Merge_v20.OECurve_offset[i] = LIMIT_VALUE(pAmergeCtx->mergeAttr.attrV21.stManual.OECurve.Offset, OECURVEOFFSETMAX, OECURVEOFFSETMIN);
|
}
|
for (int i = 0; i < pAmergeCtx->Config.Merge_v20.MaxMoveCoefKnots; i++ ) {
|
pAmergeCtx->Config.Merge_v20.MoveCoef[i] = MOVECOEFMIN;
|
pAmergeCtx->Config.Merge_v20.MDCurveLM_smooth[i] = LIMIT_VALUE(pAmergeCtx->mergeAttr.attrV21.stManual.MDCurve.LM_smooth, IQPARAMAX, IQPARAMIN);
|
pAmergeCtx->Config.Merge_v20.MDCurveLM_offset[i] = LIMIT_VALUE(pAmergeCtx->mergeAttr.attrV21.stManual.MDCurve.LM_offset, IQPARAMAX, IQPARAMIN);
|
pAmergeCtx->Config.Merge_v20.MDCurveMS_smooth[i] = LIMIT_VALUE(pAmergeCtx->mergeAttr.attrV21.stManual.MDCurve.MS_smooth, IQPARAMAX, IQPARAMIN);
|
pAmergeCtx->Config.Merge_v20.MDCurveMS_offset[i] = LIMIT_VALUE(pAmergeCtx->mergeAttr.attrV21.stManual.MDCurve.MS_offset, IQPARAMAX, IQPARAMIN);
|
}
|
|
//turn the IQ paras into algo paras
|
for(int i = 0; i < pAmergeCtx->Config.Merge_v20.MaxEnvLvKnots; i++)
|
{
|
pAmergeCtx->Config.Merge_v20.OECurve_smooth[i] *= OECURVESMOOTHMAX;
|
pAmergeCtx->Config.Merge_v20.OECurve_smooth[i] = LIMIT_VALUE(pAmergeCtx->Config.Merge_v20.OECurve_smooth[i], OECURVESMOOTHMAX, OECURVESMOOTHMIN) ;
|
}
|
|
for(int i = 0; i < pAmergeCtx->Config.Merge_v20.MaxMoveCoefKnots; i++)
|
{
|
pAmergeCtx->Config.Merge_v20.MDCurveLM_smooth[i] *= MDCURVESMOOTHMAX;
|
pAmergeCtx->Config.Merge_v20.MDCurveLM_smooth[i] = LIMIT_VALUE(pAmergeCtx->Config.Merge_v20.MDCurveLM_smooth[i], MDCURVESMOOTHMAX, MDCURVESMOOTHMIN) ;
|
pAmergeCtx->Config.Merge_v20.MDCurveLM_offset[i] *= MDCURVEOFFSETMAX;
|
pAmergeCtx->Config.Merge_v20.MDCurveLM_offset[i] = LIMIT_VALUE(pAmergeCtx->Config.Merge_v20.MDCurveLM_offset[i], MDCURVEOFFSETMAX, MDCURVEOFFSETMIN) ;
|
|
pAmergeCtx->Config.Merge_v20.MDCurveMS_smooth[i] *= MDCURVESMOOTHMAX;
|
pAmergeCtx->Config.Merge_v20.MDCurveMS_smooth[i] = LIMIT_VALUE(pAmergeCtx->Config.Merge_v20.MDCurveMS_smooth[i], MDCURVESMOOTHMAX, MDCURVESMOOTHMIN) ;
|
pAmergeCtx->Config.Merge_v20.MDCurveMS_offset[i] *= MDCURVEOFFSETMAX;
|
pAmergeCtx->Config.Merge_v20.MDCurveMS_offset[i] = LIMIT_VALUE(pAmergeCtx->Config.Merge_v20.MDCurveMS_offset[i], MDCURVEOFFSETMAX, MDCURVEOFFSETMIN) ;
|
}
|
}
|
else if(CHECK_ISP_HW_V30()) {
|
pAmergeCtx->Config.Merge_v30.BaseFrm = pAmergeCtx->mergeAttr.attrV30.stManual.BaseFrm;
|
pAmergeCtx->Config.Merge_v30.ByPassThr = DAMPMIN;
|
|
//long frm mode para
|
pAmergeCtx->Config.Merge_v30.LongFrmOECurve_damp = DAMPMIN;
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveLM_damp = DAMPMIN;
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveMS_damp = DAMPMIN;
|
for (int i = 0; i < pAmergeCtx->Config.Merge_v30.LongFrmMaxEnvLvKnots; i++ ) {
|
pAmergeCtx->Config.Merge_v30.LongFrmEnvLv[i] = ENVLVMIN;
|
pAmergeCtx->Config.Merge_v30.LongFrmOECurve_smooth[i] = LIMIT_VALUE(pAmergeCtx->mergeAttr.attrV30.stManual.LongFrmModeData.OECurve.Smooth, IQPARAMAX, IQPARAMIN);
|
pAmergeCtx->Config.Merge_v30.LongFrmOECurve_offset[i] = LIMIT_VALUE(pAmergeCtx->mergeAttr.attrV30.stManual.LongFrmModeData.OECurve.Offset, OECURVEOFFSETMAX, OECURVEOFFSETMIN);
|
}
|
for (int i = 0; i < pAmergeCtx->Config.Merge_v30.LongFrmMaxMoveCoefKnots; i++ ) {
|
pAmergeCtx->Config.Merge_v30.LongFrmMoveCoef[i] = MOVECOEFMIN;
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveLM_smooth[i] = LIMIT_VALUE(pAmergeCtx->mergeAttr.attrV30.stManual.LongFrmModeData.MDCurve.LM_smooth, IQPARAMAX, IQPARAMIN);
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveLM_offset[i] = LIMIT_VALUE(pAmergeCtx->mergeAttr.attrV30.stManual.LongFrmModeData.MDCurve.LM_offset, IQPARAMAX, IQPARAMIN);
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveMS_smooth[i] = LIMIT_VALUE(pAmergeCtx->mergeAttr.attrV30.stManual.LongFrmModeData.MDCurve.MS_smooth, IQPARAMAX, IQPARAMIN);
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveMS_offset[i] = LIMIT_VALUE(pAmergeCtx->mergeAttr.attrV30.stManual.LongFrmModeData.MDCurve.MS_offset, IQPARAMAX, IQPARAMIN);
|
}
|
//short frm mode para
|
pAmergeCtx->Config.Merge_v30.ShortFrmOECurve_damp = DAMPMIN;
|
pAmergeCtx->Config.Merge_v30.ShortFrmMDCurve_damp = DAMPMIN;
|
for (int i = 0; i < pAmergeCtx->Config.Merge_v30.ShortFrmMaxEnvLvKnots; i++ ) {
|
pAmergeCtx->Config.Merge_v30.ShortFrmEnvLv[i] = ENVLVMIN;
|
pAmergeCtx->Config.Merge_v30.ShortFrmOECurve_smooth[i] = LIMIT_VALUE(pAmergeCtx->mergeAttr.attrV30.stManual.ShortFrmModeData.OECurve.Smooth, IQPARAMAX, IQPARAMIN);
|
pAmergeCtx->Config.Merge_v30.ShortFrmOECurve_offset[i] = LIMIT_VALUE(pAmergeCtx->mergeAttr.attrV30.stManual.ShortFrmModeData.OECurve.Offset, OECURVEOFFSETMAX, OECURVEOFFSETMIN);
|
}
|
for (int i = 0; i < pAmergeCtx->Config.Merge_v30.ShortFrmMaxMoveCoefKnots; i++ ) {
|
pAmergeCtx->Config.Merge_v30.ShortFrmMoveCoef[i] = MOVECOEFMIN;
|
pAmergeCtx->Config.Merge_v30.ShortFrmMDCurve_Coef[i] = LIMIT_VALUE(pAmergeCtx->mergeAttr.attrV30.stManual.ShortFrmModeData.MDCurve.Coef, IQPARAMAX, IQPARAMIN);
|
pAmergeCtx->Config.Merge_v30.ShortFrmMDCurve_ms_thd0[i] = LIMIT_VALUE(pAmergeCtx->mergeAttr.attrV30.stManual.ShortFrmModeData.MDCurve.ms_thd0, IQ_TH0_PARAMAX, IQ_TH0_PARAMIN);
|
pAmergeCtx->Config.Merge_v30.ShortFrmMDCurve_lm_thd0[i] = LIMIT_VALUE(pAmergeCtx->mergeAttr.attrV30.stManual.ShortFrmModeData.MDCurve.lm_thd0, IQ_TH0_PARAMAX, IQ_TH0_PARAMIN);
|
}
|
|
//turn the IQ paras into algo paras
|
for(int i = 0; i < pAmergeCtx->Config.Merge_v30.LongFrmMaxEnvLvKnots; i++) {
|
pAmergeCtx->Config.Merge_v30.LongFrmOECurve_smooth[i] *= OECURVESMOOTHMAX;
|
pAmergeCtx->Config.Merge_v30.LongFrmOECurve_smooth[i] = LIMIT_VALUE(pAmergeCtx->Config.Merge_v30.LongFrmOECurve_smooth[i], OECURVESMOOTHMAX, OECURVESMOOTHMIN) ;
|
}
|
for(int i = 0; i < pAmergeCtx->Config.Merge_v30.LongFrmMaxMoveCoefKnots; i++)
|
{
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveLM_smooth[i] *= MDCURVESMOOTHMAX;
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveLM_smooth[i] = LIMIT_VALUE(pAmergeCtx->Config.Merge_v30.LongFrmMDCurveLM_smooth[i], MDCURVESMOOTHMAX, MDCURVESMOOTHMIN) ;
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveLM_offset[i] *= MDCURVEOFFSETMAX;
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveLM_offset[i] = LIMIT_VALUE(pAmergeCtx->Config.Merge_v30.LongFrmMDCurveLM_offset[i], MDCURVEOFFSETMAX, MDCURVEOFFSETMIN) ;
|
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveMS_smooth[i] *= MDCURVESMOOTHMAX;
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveMS_smooth[i] = LIMIT_VALUE(pAmergeCtx->Config.Merge_v30.LongFrmMDCurveMS_smooth[i], MDCURVESMOOTHMAX, MDCURVESMOOTHMIN) ;
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveMS_offset[i] *= MDCURVEOFFSETMAX;
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveMS_offset[i] = LIMIT_VALUE(pAmergeCtx->Config.Merge_v30.LongFrmMDCurveMS_offset[i], MDCURVEOFFSETMAX, MDCURVEOFFSETMIN) ;
|
}
|
for(int i = 0; i < pAmergeCtx->Config.Merge_v30.ShortFrmMaxEnvLvKnots; i++) {
|
pAmergeCtx->Config.Merge_v30.ShortFrmOECurve_smooth[i] *= OECURVESMOOTHMAX;
|
pAmergeCtx->Config.Merge_v30.ShortFrmOECurve_smooth[i] = LIMIT_VALUE(pAmergeCtx->Config.Merge_v30.ShortFrmOECurve_smooth[i], OECURVESMOOTHMAX, OECURVESMOOTHMIN) ;
|
}
|
}
|
|
LOG1_AMERGE( "%s:exit!\n", __FUNCTION__);
|
}
|
|
/******************************************************************************
|
* CalibrateOECurve()
|
*****************************************************************************/
|
void CalibrateOECurve
|
(
|
float smooth, float offset, unsigned short *OECurve
|
)
|
{
|
LOG1_AMERGE("%s:Enter!\n", __FUNCTION__);
|
|
int step = 32 ;
|
float curve = 0.0;
|
float k = 511;
|
|
for(int i = 0; i < ISP20_HDRMGE_OE_CURVE_NUM; ++i)
|
{
|
curve = 1 + exp(-smooth * (k / 1023 - offset / 256));
|
curve = 1024 / curve ;
|
OECurve[i] = round(curve) ;
|
OECurve[i] = MIN(OECurve[i], 1023);
|
k += step ;
|
}
|
|
LOG1_AMERGE("%s:Eixt!\n", __FUNCTION__);
|
}
|
/******************************************************************************
|
* CalibrateMDCurveLongFrmMode()
|
*****************************************************************************/
|
void CalibrateMDCurveLongFrmMode
|
(
|
float smooth, float offset, unsigned short *MDCurve
|
)
|
{
|
LOG1_AMERGE("%s:Enter!\n", __FUNCTION__);
|
|
int step = 16;
|
float curve = 0.0;
|
float k = 0;
|
|
for (int i = 0; i < ISP20_HDRMGE_MD_CURVE_NUM; ++i)
|
{
|
curve = 1 + exp(-smooth * (k / 1023 - offset / 256));
|
curve = 1024 / curve ;
|
MDCurve[i] = round(curve) ;
|
MDCurve[i] = MIN(MDCurve[i], 1023);
|
k += step ;
|
}
|
|
LOG1_AMERGE("%s:Eixt!\n", __FUNCTION__);
|
}
|
/******************************************************************************
|
* CalibrateMDCurveShortFrmMode()
|
*****************************************************************************/
|
void CalibrateMDCurveShortFrmMode
|
(
|
float smooth, float offset, unsigned short *MDCurveLM, unsigned short *MDCurveMS
|
)
|
{
|
LOG1_AMERGE("%s:Enter!\n", __FUNCTION__);
|
|
float step = 1.0 / 16.0;
|
float curve = 0.0;
|
|
for (int i = 0; i < ISP3X_HDRMGE_MD_CURVE_NUM; ++i)
|
{
|
curve = 0.01 + pow(i * step, 2.0f);
|
curve = 1024.0 * pow(i * step, 2.0f) / curve ;
|
MDCurveLM[i] = round(curve) ;
|
MDCurveLM[i] = MIN(MDCurveLM[i], 1023);
|
MDCurveMS[i] = MDCurveLM[i];
|
}
|
|
LOG1_AMERGE("%s:Eixt!\n", __FUNCTION__);
|
}
|
|
/******************************************************************************
|
* AmergeGetTuningProcResV20()
|
*****************************************************************************/
|
void AmergeGetTuningProcResV20
|
(
|
AmergeContext_t* pAmergeCtx
|
)
|
{
|
LOG1_AMERGE("%s:Enter!\n", __FUNCTION__);
|
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_mode = pAmergeCtx->CurrData.HandleData.Merge_v20.MergeMode;
|
if(CHECK_ISP_HW_V21())
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_mode = LIMIT_VALUE(pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_mode, 1, 0);
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_lm_dif_0p9 = SW_HDRMGE_LM_DIF_0P9_FIX;
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_ms_dif_0p8 = SW_HDRMGE_MS_DIF_0P8_FIX;
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_lm_dif_0p15 = (int)pAmergeCtx->CurrData.HandleData.Merge_v20.MDCurveLM_offset;
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_ms_dif_0p15 = (int)pAmergeCtx->CurrData.HandleData.Merge_v20.MDCurveMS_offset;
|
|
CalibrateOECurve(pAmergeCtx->CurrData.HandleData.Merge_v20.OECurve_smooth,
|
pAmergeCtx->CurrData.HandleData.Merge_v20.OECurve_offset, pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y) ;
|
CalibrateMDCurveLongFrmMode(pAmergeCtx->CurrData.HandleData.Merge_v20.MDCurveLM_smooth,
|
pAmergeCtx->CurrData.HandleData.Merge_v20.MDCurveLM_offset, pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y);
|
CalibrateMDCurveLongFrmMode(pAmergeCtx->CurrData.HandleData.Merge_v20.MDCurveMS_smooth,
|
pAmergeCtx->CurrData.HandleData.Merge_v20.MDCurveMS_offset, pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y);
|
|
if(pAmergeCtx->SensorInfo.LongFrmMode) {
|
for(int i = 0; i < ISP20_HDRMGE_OE_CURVE_NUM; i++)
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[i] = HDR_LONG_FRMAE_MODE_OECURVE;
|
}
|
|
LOG1_AMERGE("%s:Eixt!\n", __FUNCTION__);
|
}
|
/******************************************************************************
|
* AmergeGetTuningProcResV30()
|
*****************************************************************************/
|
void AmergeGetTuningProcResV30
|
(
|
AmergeContext_t* pAmergeCtx
|
)
|
{
|
LOG1_AMERGE("%s:Enter!\n", __FUNCTION__);
|
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_mode = pAmergeCtx->CurrData.HandleData.Merge_v30.MergeMode;
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_s_base = pAmergeCtx->Config.Merge_v30.BaseFrm;
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_lm_dif_0p9 = SW_HDRMGE_LM_DIF_0P9_FIX;
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_ms_dif_0p8 = SW_HDRMGE_MS_DIF_0P8_FIX;
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_lm_dif_0p15 = (int)pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurveLM_offset;
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_ms_dif_0p15 = (int)pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurveMS_offset;
|
|
|
CalibrateOECurve(pAmergeCtx->CurrData.HandleData.Merge_v30.OECurve_smooth,
|
pAmergeCtx->CurrData.HandleData.Merge_v30.OECurve_offset, pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_e_y);
|
if(pAmergeCtx->Config.Merge_v30.BaseFrm == BASEFRAME_LONG) {
|
CalibrateMDCurveLongFrmMode(pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurveLM_smooth,
|
pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurveLM_offset, pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l1_y);
|
CalibrateMDCurveLongFrmMode(pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurveMS_smooth,
|
pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurveMS_offset, pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l0_y);
|
}
|
else if(pAmergeCtx->Config.Merge_v30.BaseFrm == BASEFRAME_SHORT)
|
CalibrateMDCurveShortFrmMode(pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurveLM_smooth, pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurveLM_offset,
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l1_y, pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l0_y);
|
|
if(pAmergeCtx->SensorInfo.LongFrmMode) {
|
for(int i = 0; i < ISP3X_HDRMGE_OE_CURVE_NUM; i++)
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_e_y[i] = HDR_LONG_FRMAE_MODE_OECURVE;
|
}
|
|
LOG1_AMERGE("%s:Eixt!\n", __FUNCTION__);
|
}
|
|
/******************************************************************************
|
* MergeDamping()
|
*****************************************************************************/
|
void MergeDamping
|
(
|
AmergeContext_t* pAmergeCtx
|
)
|
{
|
LOG1_AMERGE("%s:Enter!\n", __FUNCTION__);
|
|
float OEDamp = pAmergeCtx->CurrData.CtrlData.MergeOEDamp;
|
float MDDampLM = pAmergeCtx->CurrData.CtrlData.MergeMDDampLM;
|
float MDDampMS = pAmergeCtx->CurrData.CtrlData.MergeMDDampMS;
|
bool ifHDRModeChange = false;
|
|
if(CHECK_ISP_HW_V21()) {
|
ifHDRModeChange = pAmergeCtx->CurrData.HandleData.Merge_v20.MergeMode == pAmergeCtx->PrevData.HandleData.Merge_v20.MergeMode ? false : true;
|
|
//get finnal current data
|
if (pAmergeCtx->mergeAttr.attrV21.opMode == MERGE_OPMODE_API_OFF && pAmergeCtx->frameCnt != 0 && !ifHDRModeChange)
|
{
|
pAmergeCtx->CurrData.HandleData.Merge_v20.OECurve_smooth = OEDamp * pAmergeCtx->CurrData.HandleData.Merge_v20.OECurve_smooth
|
+ (1 - OEDamp) * pAmergeCtx->PrevData.HandleData.Merge_v20.OECurve_smooth;
|
pAmergeCtx->CurrData.HandleData.Merge_v20.OECurve_offset = OEDamp * pAmergeCtx->CurrData.HandleData.Merge_v20.OECurve_offset
|
+ (1 - OEDamp) * pAmergeCtx->PrevData.HandleData.Merge_v20.OECurve_offset;
|
pAmergeCtx->CurrData.HandleData.Merge_v20.MDCurveLM_smooth = MDDampLM * pAmergeCtx->CurrData.HandleData.Merge_v20.MDCurveLM_smooth
|
+ (1 - MDDampLM) * pAmergeCtx->PrevData.HandleData.Merge_v20.MDCurveLM_smooth;
|
pAmergeCtx->CurrData.HandleData.Merge_v20.MDCurveLM_offset = MDDampLM * pAmergeCtx->CurrData.HandleData.Merge_v20.MDCurveLM_offset
|
+ (1 - MDDampLM) * pAmergeCtx->PrevData.HandleData.Merge_v20.MDCurveLM_offset;
|
pAmergeCtx->CurrData.HandleData.Merge_v20.MDCurveMS_smooth = MDDampMS * pAmergeCtx->CurrData.HandleData.Merge_v20.MDCurveMS_smooth
|
+ (1 - MDDampMS) * pAmergeCtx->PrevData.HandleData.Merge_v20.MDCurveMS_smooth;
|
pAmergeCtx->CurrData.HandleData.Merge_v20.MDCurveMS_offset = MDDampMS * pAmergeCtx->CurrData.HandleData.Merge_v20.MDCurveMS_offset
|
+ (1 - MDDampMS) * pAmergeCtx->PrevData.HandleData.Merge_v20.MDCurveMS_offset;
|
}
|
|
LOGD_AMERGE("%s: Current OECurve_smooth:%f OECurve_offset:%f \n", __FUNCTION__, pAmergeCtx->CurrData.HandleData.Merge_v20.OECurve_smooth,
|
pAmergeCtx->CurrData.HandleData.Merge_v20.OECurve_offset);
|
LOGD_AMERGE("%s: Current MDCurveMS_smooth:%f MDCurveMS_offset:%f MDCurveLM_smooth:%f MDCurveLM_offset:%f \n", __FUNCTION__, pAmergeCtx->CurrData.HandleData.Merge_v20.MDCurveMS_smooth
|
, pAmergeCtx->CurrData.HandleData.Merge_v20.MDCurveMS_offset, pAmergeCtx->CurrData.HandleData.Merge_v20.MDCurveLM_smooth,
|
pAmergeCtx->CurrData.HandleData.Merge_v20.MDCurveLM_offset);
|
}
|
else if(CHECK_ISP_HW_V30()) {
|
ifHDRModeChange = pAmergeCtx->CurrData.HandleData.Merge_v30.MergeMode == pAmergeCtx->PrevData.HandleData.Merge_v30.MergeMode ? false : true;
|
|
//get finnal current data
|
if (pAmergeCtx->mergeAttr.attrV30.opMode == MERGE_OPMODE_API_OFF && pAmergeCtx->frameCnt != 0 && !ifHDRModeChange)
|
{
|
pAmergeCtx->CurrData.HandleData.Merge_v30.OECurve_smooth = OEDamp * pAmergeCtx->CurrData.HandleData.Merge_v30.OECurve_smooth
|
+ (1 - OEDamp) * pAmergeCtx->PrevData.HandleData.Merge_v30.OECurve_smooth;
|
pAmergeCtx->CurrData.HandleData.Merge_v30.OECurve_offset = OEDamp * pAmergeCtx->CurrData.HandleData.Merge_v30.OECurve_offset
|
+ (1 - OEDamp) * pAmergeCtx->PrevData.HandleData.Merge_v30.OECurve_offset;
|
pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurveLM_smooth = MDDampLM * pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurveLM_smooth
|
+ (1 - MDDampLM) * pAmergeCtx->PrevData.HandleData.Merge_v30.MDCurveLM_smooth;
|
pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurveLM_offset = MDDampLM * pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurveLM_offset
|
+ (1 - MDDampLM) * pAmergeCtx->PrevData.HandleData.Merge_v30.MDCurveLM_offset;
|
pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurveMS_smooth = MDDampMS * pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurveMS_smooth
|
+ (1 - MDDampMS) * pAmergeCtx->PrevData.HandleData.Merge_v30.MDCurveMS_smooth;
|
pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurveMS_offset = MDDampMS * pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurveMS_offset
|
+ (1 - MDDampMS) * pAmergeCtx->PrevData.HandleData.Merge_v30.MDCurveMS_offset;
|
|
pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurve_Coef = MDDampMS * pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurve_Coef
|
+ (1 - MDDampMS) * pAmergeCtx->PrevData.HandleData.Merge_v30.MDCurve_Coef;
|
pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurve_ms_thd0 = MDDampMS * pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurve_ms_thd0
|
+ (1 - MDDampMS) * pAmergeCtx->PrevData.HandleData.Merge_v30.MDCurve_ms_thd0;
|
pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurve_lm_thd0 = MDDampMS * pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurve_lm_thd0
|
+ (1 - MDDampMS) * pAmergeCtx->PrevData.HandleData.Merge_v30.MDCurve_lm_thd0;
|
}
|
|
LOGD_AMERGE("%s: Current BaseFrm:%d OECurve_smooth:%f OECurve_offset:%f \n", __FUNCTION__, pAmergeCtx->Config.Merge_v30.BaseFrm,
|
pAmergeCtx->CurrData.HandleData.Merge_v30.OECurve_smooth, pAmergeCtx->CurrData.HandleData.Merge_v30.OECurve_offset);
|
if(pAmergeCtx->Config.Merge_v30.BaseFrm == BASEFRAME_LONG)
|
LOGD_AMERGE("%s: Current MDCurveMS_smooth:%f MDCurveMS_offset:%f MDCurveLM_smooth:%f MDCurveLM_offset:%f \n", __FUNCTION__,
|
pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurveMS_smooth, pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurveMS_offset,
|
pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurveLM_smooth, pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurveLM_offset);
|
else if(pAmergeCtx->Config.Merge_v30.BaseFrm == BASEFRAME_SHORT)
|
LOGD_AMERGE("%s: Current MDCurve_Coef:%f MDCurve_ms_thd0:%f MDCurve_lm_thd0:%f\n", __FUNCTION__,
|
pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurve_Coef, pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurve_ms_thd0,
|
pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurve_lm_thd0);
|
}
|
|
LOG1_AMERGE("%s:Eixt!\n", __FUNCTION__);
|
}
|
|
/******************************************************************************
|
* AmergeTuningProcessing()
|
*get handle para by config and current variate
|
*****************************************************************************/
|
void AmergeTuningProcessing
|
(
|
AmergeContext_t* pAmergeCtx
|
)
|
{
|
LOG1_AMERGE("%s:enter!\n", __FUNCTION__);
|
|
AmergeIQUpdate(pAmergeCtx);
|
|
//transfer data to api
|
if(CHECK_ISP_HW_V21()) {
|
//transfer control data to api
|
pAmergeCtx->mergeAttr.attrV21.CtlInfo.Envlv = pAmergeCtx->CurrData.CtrlData.EnvLv;
|
pAmergeCtx->mergeAttr.attrV21.CtlInfo.MoveCoef = pAmergeCtx->CurrData.CtrlData.MoveCoef;
|
}
|
else if(CHECK_ISP_HW_V30()) {
|
//transfer control data to api
|
pAmergeCtx->mergeAttr.attrV30.CtlInfo.Envlv = pAmergeCtx->CurrData.CtrlData.EnvLv;
|
pAmergeCtx->mergeAttr.attrV30.CtlInfo.MoveCoef = pAmergeCtx->CurrData.CtrlData.MoveCoef;
|
}
|
|
//merge damp
|
MergeDamping(pAmergeCtx);
|
|
//get current IO data
|
if(CHECK_ISP_HW_V21())
|
AmergeGetTuningProcResV20(pAmergeCtx);
|
else if(CHECK_ISP_HW_V30())
|
AmergeGetTuningProcResV30(pAmergeCtx);
|
|
// store current handle data to pre data for next loop
|
pAmergeCtx->PrevData.CtrlData.EnvLv = pAmergeCtx->CurrData.CtrlData.EnvLv;
|
pAmergeCtx->PrevData.CtrlData.MoveCoef = pAmergeCtx->CurrData.CtrlData.MoveCoef;
|
memcpy(&pAmergeCtx->PrevData.HandleData, &pAmergeCtx->CurrData.HandleData, sizeof(MergeHandleData_s));
|
|
LOG1_AMERGE( "%s:exit!\n", __FUNCTION__);
|
}
|
|
/******************************************************************************
|
* AmergeExpoProcessing()
|
*get handle para by config and current variate
|
*****************************************************************************/
|
void AmergeExpoProcessing
|
(
|
AmergeContext_t* pAmergeCtx,
|
MergeExpoData_t* pExpoData
|
)
|
{
|
LOG1_AMERGE("%s:enter!\n", __FUNCTION__);
|
|
if(CHECK_ISP_HW_V20()) {
|
//get sw_hdrmge_gain0
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_gain0 = (int)(64 * pExpoData->nextRatioLS);
|
if(pExpoData->nextRatioLS == 1)
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_gain0_inv = (int)(4096 * (1 / pExpoData->nextRatioLS) - 1);
|
else
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_gain0_inv = (int)(4096 * (1 / pExpoData->nextRatioLS));
|
|
//get sw_hdrmge_gain1
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_gain1 = (int)(64 * pExpoData->nextRatioLM);
|
if(pExpoData->nextRatioLM == 1)
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_gain1_inv = (int)(4096 * (1 / pExpoData->nextRatioLM) - 1);
|
else
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_gain1_inv = (int)(4096 * (1 / pExpoData->nextRatioLM));
|
|
//get sw_hdrmge_gain2
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_gain2 = SW_HDRMGE_GAIN_FIX;
|
|
LOGV_AMERGE("%s: sw_hdrmge_mode:%d sw_hdrmge_ms_dif_0p8:%d sw_hdrmge_lm_dif_0p9:%d sw_hdrmge_ms_dif_0p15:%d sw_hdrmge_lm_dif_0p15:%d\n", __FUNCTION__,
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_mode, pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_ms_dif_0p8,
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_lm_dif_0p9, pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_ms_dif_0p15,
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_lm_dif_0p15);
|
LOGV_AMERGE( "%s: nextRatioLS:%f sw_hdrmge_gain0:%d sw_hdrmge_gain0_inv:%d nextRatioLM:%f sw_hdrmge_gain1:%d sw_hdrmge_gain1_inv:%d sw_hdrmge_gain2:%d\n", __FUNCTION__,
|
pExpoData->nextRatioLS, pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_gain0, pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_gain0_inv, pExpoData->nextRatioLM,
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_gain1, pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_gain1_inv, pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_gain2);
|
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", __FUNCTION__,
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[0], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[1],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[2], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[3],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[4], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[5],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[6], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[7],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[8], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[9],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[10], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[11],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[12], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[13],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[14], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[15],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[16]);
|
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", __FUNCTION__,
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[0], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[1],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[2], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[3],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[4], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[5],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[6], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[7],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[8], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[9],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[10], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[11],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[12], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[13],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[14], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[15],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[16]);
|
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", __FUNCTION__,
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[0], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[1],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[2], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[3],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[4], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[5],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[6], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[7],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[8], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[9],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[10], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[11],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[12], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[13],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[14], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[15],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[16]);
|
}
|
else if(CHECK_ISP_HW_V21()) {
|
//get sw_hdrmge_gain0
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_gain0 = (int)(64 * pExpoData->nextRatioLS);
|
if(pExpoData->nextRatioLS == 1)
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_gain0_inv = (int)(4096 * (1 / pExpoData->nextRatioLS) - 1);
|
else
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_gain0_inv = (int)(4096 * (1 / pExpoData->nextRatioLS));
|
|
//get sw_hdrmge_gain1
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_gain1 = SW_HDRMGE_GAIN_FIX;
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_gain1_inv = SW_HDRMGE_GAIN_INV_FIX;
|
|
//get sw_hdrmge_gain2
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_gain2 = SW_HDRMGE_GAIN_FIX;
|
|
LOGV_AMERGE("%s: sw_hdrmge_mode:%d sw_hdrmge_ms_dif_0p8:%d sw_hdrmge_lm_dif_0p9:%d sw_hdrmge_ms_dif_0p15:%d sw_hdrmge_lm_dif_0p15:%d\n", __FUNCTION__,
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_mode, pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_ms_dif_0p8,
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_lm_dif_0p9, pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_ms_dif_0p15,
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_lm_dif_0p15);
|
LOGV_AMERGE( "%s: nextRatioLS:%f sw_hdrmge_gain0:%d sw_hdrmge_gain0_inv:%d nextRatioLM:%f sw_hdrmge_gain1:%d sw_hdrmge_gain1_inv:%d sw_hdrmge_gain2:%d\n", __FUNCTION__,
|
pExpoData->nextRatioLS, pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_gain0, pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_gain0_inv, pExpoData->nextRatioLM,
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_gain1, pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_gain1_inv, pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_gain2);
|
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", __FUNCTION__,
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[0], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[1],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[2], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[3],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[4], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[5],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[6], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[7],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[8], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[9],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[10], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[11],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[12], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[13],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[14], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[15],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_e_y[16]);
|
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", __FUNCTION__,
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[0], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[1],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[2], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[3],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[4], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[5],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[6], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[7],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[8], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[9],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[10], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[11],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[12], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[13],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[14], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[15],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l0_y[16]);
|
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", __FUNCTION__,
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[0], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[1],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[2], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[3],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[4], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[5],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[6], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[7],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[8], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[9],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[10], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[11],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[12], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[13],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[14], pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[15],
|
pAmergeCtx->ProcRes.Merge_v20.sw_hdrmge_l1_y[16]);
|
}
|
else if(CHECK_ISP_HW_V30()) {
|
//get sw_hdrmge_gain0
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_gain0 = (int)(64 * pExpoData->nextRatioLS);
|
if(pExpoData->nextRatioLS == 1)
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_gain0_inv = (int)(4096 * (1 / pExpoData->nextRatioLS) - 1);
|
else
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_gain0_inv = (int)(4096 * (1 / pExpoData->nextRatioLS));
|
|
//get sw_hdrmge_gain1
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_gain1 = (int)(64 * pExpoData->nextRatioLM);
|
if(pExpoData->nextRatioLM == 1)
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_gain1_inv = (int)(4096 * (1 / pExpoData->nextRatioLM) - 1);
|
else
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_gain1_inv = (int)(4096 * (1 / pExpoData->nextRatioLM));
|
|
//get sw_hdrmge_gain2
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_gain2 = SW_HDRMGE_GAIN_FIX;
|
|
//isp30 add
|
float Coef = pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurve_Coef / SHORT_MODE_COEF_MAX;
|
float sw_hdrmge_ms_thd0 = pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurve_ms_thd0;
|
float sw_hdrmge_lm_thd0 = pAmergeCtx->CurrData.HandleData.Merge_v30.MDCurve_lm_thd0;
|
float sw_hdrmge_ms_thd1 = 1024 * pow(100 * Coef * pExpoData->nextSGain, 0.5f);
|
float sw_hdrmge_lm_thd1 = 1024 * pow(100 * Coef * pExpoData->nextMGain, 0.5f);
|
float sw_hdrmge_ms_scl = (sw_hdrmge_ms_thd1 == sw_hdrmge_ms_thd0) ? 0 : (1 / (sw_hdrmge_ms_thd1 - sw_hdrmge_ms_thd0));
|
float sw_hdrmge_lm_scl = (sw_hdrmge_lm_thd1 == sw_hdrmge_lm_thd0) ? 0 : (1 / (sw_hdrmge_lm_thd1 - sw_hdrmge_lm_thd0));
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_ms_thd0 = (int)(1024 * sw_hdrmge_ms_thd0);
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_ms_thd1 = (int)(1024 * sw_hdrmge_ms_thd1);
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_ms_scl = (int)(64 * sw_hdrmge_ms_scl);
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_lm_thd0 = (int)(1024 * sw_hdrmge_lm_thd0);
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_lm_thd1 = (int)(1024 * sw_hdrmge_lm_thd1);
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_lm_scl = (int)(64 * sw_hdrmge_lm_scl);
|
|
LOGV_AMERGE("%s: sw_hdrmge_mode:%d sw_hdrmge_ms_dif_0p8:%d sw_hdrmge_lm_dif_0p9:%d sw_hdrmge_ms_dif_0p15:%d sw_hdrmge_lm_dif_0p15:%d\n", __FUNCTION__,
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_mode, pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_ms_dif_0p8,
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_lm_dif_0p9, pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_ms_dif_0p15,
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_lm_dif_0p15);
|
LOGV_AMERGE( "%s: nextRatioLS:%f sw_hdrmge_gain0:%d sw_hdrmge_gain0_inv:%d nextRatioLM:%f sw_hdrmge_gain1:%d sw_hdrmge_gain1_inv:%d sw_hdrmge_gain2:%d\n", __FUNCTION__,
|
pExpoData->nextRatioLS, pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_gain0, pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_gain0_inv, pExpoData->nextRatioLM,
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_gain1, pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_gain1_inv, pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_gain2);
|
LOGV_AMERGE( "%s: sw_hdrmge_ms_thd0:%d sw_hdrmge_ms_thd1:%d sw_hdrmge_ms_scl:%d\n", __FUNCTION__,
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_ms_thd0, pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_ms_thd1, pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_ms_scl);
|
LOGV_AMERGE( "%s: sw_hdrmge_lm_thd0:%d sw_hdrmge_lm_thd1:%d sw_hdrmge_lm_scl:%d\n", __FUNCTION__,
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_lm_thd0, pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_lm_thd1, pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_lm_scl);
|
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", __FUNCTION__,
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_e_y[0], pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_e_y[1],
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_e_y[2], pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_e_y[3],
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_e_y[4], pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_e_y[5],
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_e_y[6], pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_e_y[7],
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_e_y[8], pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_e_y[9],
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_e_y[10], pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_e_y[11],
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_e_y[12], pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_e_y[13],
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_e_y[14], pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_e_y[15],
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_e_y[16]);
|
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", __FUNCTION__,
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l0_y[0], pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l0_y[1],
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l0_y[2], pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l0_y[3],
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l0_y[4], pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l0_y[5],
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l0_y[6], pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l0_y[7],
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l0_y[8], pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l0_y[9],
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l0_y[10], pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l0_y[11],
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l0_y[12], pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l0_y[13],
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l0_y[14], pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l0_y[15],
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l0_y[16]);
|
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", __FUNCTION__,
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l1_y[0], pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l1_y[1],
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l1_y[2], pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l1_y[3],
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l1_y[4], pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l1_y[5],
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l1_y[6], pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l1_y[7],
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l1_y[8], pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l1_y[9],
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l1_y[10], pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l1_y[11],
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l1_y[12], pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l1_y[13],
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l1_y[14], pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l1_y[15],
|
pAmergeCtx->ProcRes.Merge_v30.sw_hdrmge_l1_y[16]);
|
}
|
|
LOG1_AMERGE( "%s:exit!\n", __FUNCTION__);
|
}
|
|
/******************************************************************************
|
* AmergeByPassProcessing()
|
*get handle para by config and current variate
|
*****************************************************************************/
|
bool AmergeByPassProcessing
|
(
|
AmergeContext_t* pAmergeCtx,
|
AecPreResult_t AecHdrPreResult
|
)
|
{
|
LOG1_AMERGE("%s:enter!\n", __FUNCTION__);
|
|
bool bypass = false;
|
float diff = 0.0;
|
|
// get envlv from AecPreRes
|
AmergeGetEnvLv(pAmergeCtx, AecHdrPreResult);
|
pAmergeCtx->CurrData.CtrlData.EnvLv =
|
LIMIT_VALUE(pAmergeCtx->CurrData.CtrlData.EnvLv, ENVLVMAX, ENVLVMIN);
|
|
pAmergeCtx->CurrData.CtrlData.MoveCoef = MOVE_COEF_DEFAULT;
|
pAmergeCtx->CurrData.CtrlData.MoveCoef =
|
LIMIT_VALUE(pAmergeCtx->CurrData.CtrlData.MoveCoef, MOVECOEFMAX, MOVECOEFMIN);
|
|
merge_OpModeV21_t ApiMode = MERGE_OPMODE_API_OFF;
|
if(CHECK_ISP_HW_V21())
|
ApiMode = pAmergeCtx->mergeAttr.attrV21.opMode;
|
else if(CHECK_ISP_HW_V30())
|
ApiMode = pAmergeCtx->mergeAttr.attrV30.opMode;
|
|
if(pAmergeCtx->frameCnt <= 2) //start frame
|
bypass = false;
|
else if(ApiMode > MERGE_OPMODE_API_OFF)//api
|
bypass = false;
|
else if(ApiMode != pAmergeCtx->PrevData.CtrlData.ApiMode)//api change
|
bypass = false;
|
else { //EvnLv change
|
//get Current hdr mode
|
float ByPassThr = 0.0;
|
if(CHECK_ISP_HW_V21()) {
|
pAmergeCtx->CurrData.HandleData.Merge_v20.MergeMode = pAmergeCtx->FrameNumber - 1;
|
LOG1_AMERGE("%s: Current MergeMode: %d \n", __FUNCTION__, pAmergeCtx->CurrData.HandleData.Merge_v20.MergeMode);
|
ByPassThr = pAmergeCtx->Config.Merge_v20.ByPassThr;
|
}
|
else if(CHECK_ISP_HW_V30()) {
|
pAmergeCtx->CurrData.HandleData.Merge_v30.MergeMode = pAmergeCtx->FrameNumber - 1;
|
LOG1_AMERGE("%s: Current MergeMode: %d \n", __FUNCTION__, pAmergeCtx->CurrData.HandleData.Merge_v30.MergeMode);
|
ByPassThr = pAmergeCtx->Config.Merge_v30.ByPassThr;
|
}
|
|
//use Envlv for now
|
diff = pAmergeCtx->PrevData.CtrlData.EnvLv - pAmergeCtx->CurrData.CtrlData.EnvLv;
|
if(pAmergeCtx->PrevData.CtrlData.EnvLv == 0.0) {
|
diff = pAmergeCtx->CurrData.CtrlData.EnvLv;
|
if(diff == 0.0)
|
bypass = true;
|
else
|
bypass = false;
|
}
|
else {
|
diff /= pAmergeCtx->PrevData.CtrlData.EnvLv;
|
if(diff >= ByPassThr || diff <= (0 - ByPassThr))
|
bypass = false;
|
else
|
bypass = true;
|
}
|
}
|
|
LOGD_AMERGE( "%s: FrameID:%d HDRFrameNum:%d LongFrmMode:%d MergeApiMode:%d EnvLv:%f MoveCoef:%f bypass:%d\n", __FUNCTION__, pAmergeCtx->frameCnt, pAmergeCtx->FrameNumber,
|
pAmergeCtx->SensorInfo.LongFrmMode, ApiMode, pAmergeCtx->CurrData.CtrlData.EnvLv, pAmergeCtx->CurrData.CtrlData.MoveCoef, bypass);
|
|
LOG1_AMERGE( "%s:exit!\n", __FUNCTION__);
|
return bypass;
|
}
|
|
/******************************************************************************
|
* AmergeInit()
|
*****************************************************************************/
|
XCamReturn AmergeInit
|
(
|
AmergeContext_t **ppAmergeCtx,
|
CamCalibDbV2Context_t* pCalibV2
|
) {
|
LOG1_AMERGE("%s:enter!\n", __FUNCTION__);
|
|
XCamReturn result = XCAM_RETURN_NO_ERROR;
|
|
AmergeContext_t * pAmergeCtx;
|
pAmergeCtx = (AmergeContext_t *)malloc(sizeof(AmergeContext_t));
|
if(pAmergeCtx == NULL) {
|
LOGE_ATMO("%s(%d): invalid inputparams\n", __FUNCTION__, __LINE__);
|
return XCAM_RETURN_ERROR_MEM;
|
}
|
|
memset(pAmergeCtx, 0x00, sizeof(AmergeContext_t));
|
*ppAmergeCtx = pAmergeCtx;
|
pAmergeCtx->state = AMERGE_STATE_INITIALIZED;
|
|
if(CHECK_ISP_HW_V21()) {
|
CalibDbV2_merge_t* calibv2_amerge_calib =
|
(CalibDbV2_merge_t*)(CALIBDBV2_GET_MODULE_PTR(pCalibV2, amerge_calib));
|
|
memcpy(&pAmergeCtx->pCalibDB.Merge_v20, calibv2_amerge_calib, sizeof(CalibDbV2_merge_t));//load iq paras
|
//memcpy(&pAmergeCtx->mergeAttr.stTool, calibv2_amerge_calib, sizeof(CalibDbV2_merge_t));//load iq paras to stTool
|
|
//malloc
|
pAmergeCtx->Config.Merge_v20.MaxEnvLvKnots = calibv2_amerge_calib->MergeTuningPara.OECurve.EnvLv_len;
|
pAmergeCtx->Config.Merge_v20.EnvLv = (float*)malloc(sizeof(float) * (calibv2_amerge_calib->MergeTuningPara.OECurve.EnvLv_len));
|
pAmergeCtx->Config.Merge_v20.OECurve_smooth = (float*)malloc(sizeof(float) * (calibv2_amerge_calib->MergeTuningPara.OECurve.EnvLv_len));
|
pAmergeCtx->Config.Merge_v20.OECurve_offset = (float*)malloc(sizeof(float) * (calibv2_amerge_calib->MergeTuningPara.OECurve.EnvLv_len));
|
pAmergeCtx->Config.Merge_v20.MaxMoveCoefKnots = calibv2_amerge_calib->MergeTuningPara.MDCurve.MoveCoef_len;
|
pAmergeCtx->Config.Merge_v20.MoveCoef = (float*)malloc(sizeof(float) * (calibv2_amerge_calib->MergeTuningPara.MDCurve.MoveCoef_len));
|
pAmergeCtx->Config.Merge_v20.MDCurveLM_smooth = (float*)malloc(sizeof(float) * (calibv2_amerge_calib->MergeTuningPara.MDCurve.MoveCoef_len));
|
pAmergeCtx->Config.Merge_v20.MDCurveLM_offset = (float*)malloc(sizeof(float) * (calibv2_amerge_calib->MergeTuningPara.MDCurve.MoveCoef_len));
|
pAmergeCtx->Config.Merge_v20.MDCurveMS_smooth = (float*)malloc(sizeof(float) * (calibv2_amerge_calib->MergeTuningPara.MDCurve.MoveCoef_len));
|
pAmergeCtx->Config.Merge_v20.MDCurveMS_offset = (float*)malloc(sizeof(float) * (calibv2_amerge_calib->MergeTuningPara.MDCurve.MoveCoef_len));
|
|
//set default para
|
//config default PrevData data
|
pAmergeCtx->PrevData.CtrlData.EnvLv = 0;
|
pAmergeCtx->PrevData.CtrlData.MoveCoef = 0;
|
pAmergeCtx->PrevData.CtrlData.ApiMode = MERGE_OPMODE_API_OFF;
|
pAmergeCtx->PrevData.HandleData.Merge_v20.MergeMode = 1;
|
pAmergeCtx->PrevData.HandleData.Merge_v20.OECurve_smooth = 80;
|
pAmergeCtx->PrevData.HandleData.Merge_v20.OECurve_offset = 210;
|
pAmergeCtx->PrevData.HandleData.Merge_v20.MDCurveLM_smooth = 80;
|
pAmergeCtx->PrevData.HandleData.Merge_v20.MDCurveLM_offset = 38;
|
pAmergeCtx->PrevData.HandleData.Merge_v20.MDCurveMS_smooth = 80;
|
pAmergeCtx->PrevData.HandleData.Merge_v20.MDCurveMS_offset = 38;
|
|
//set default ctrl info
|
pAmergeCtx->mergeAttr.attrV21.opMode = MERGE_OPMODE_API_OFF;
|
pAmergeCtx->mergeAttr.attrV21.CtlInfo.Envlv = 1.0;
|
pAmergeCtx->mergeAttr.attrV21.CtlInfo.MoveCoef = 0.0;
|
|
pAmergeCtx->mergeAttr.attrV21.stManual.OECurve.Smooth = 0.4;
|
pAmergeCtx->mergeAttr.attrV21.stManual.OECurve.Offset = 210;
|
pAmergeCtx->mergeAttr.attrV21.stManual.MDCurve.LM_smooth = 0.4;
|
pAmergeCtx->mergeAttr.attrV21.stManual.MDCurve.LM_offset = 0.38;
|
pAmergeCtx->mergeAttr.attrV21.stManual.MDCurve.MS_smooth = 0.4;
|
pAmergeCtx->mergeAttr.attrV21.stManual.MDCurve.MS_offset = 0.38;
|
}
|
else if(CHECK_ISP_HW_V30()) {
|
CalibDbV2_merge_V2_t* calibv2_amerge_calib =
|
(CalibDbV2_merge_V2_t*)(CALIBDBV2_GET_MODULE_PTR(pCalibV2, amerge_calib));
|
|
memcpy(&pAmergeCtx->pCalibDB.Merge_v30, calibv2_amerge_calib, sizeof(CalibDbV2_merge_V2_t));//load iq paras
|
|
//malloc long frm mode
|
pAmergeCtx->Config.Merge_v30.LongFrmMaxEnvLvKnots = calibv2_amerge_calib->MergeTuningPara.LongFrmModeData.OECurve.EnvLv_len;
|
pAmergeCtx->Config.Merge_v30.LongFrmMaxMoveCoefKnots = calibv2_amerge_calib->MergeTuningPara.LongFrmModeData.MDCurve.MoveCoef_len;
|
pAmergeCtx->Config.Merge_v30.LongFrmEnvLv = (float*)malloc(sizeof(float) * (calibv2_amerge_calib->MergeTuningPara.LongFrmModeData.OECurve.EnvLv_len));
|
pAmergeCtx->Config.Merge_v30.LongFrmOECurve_smooth = (float*)malloc(sizeof(float) * (calibv2_amerge_calib->MergeTuningPara.LongFrmModeData.OECurve.EnvLv_len));
|
pAmergeCtx->Config.Merge_v30.LongFrmOECurve_offset = (float*)malloc(sizeof(float) * (calibv2_amerge_calib->MergeTuningPara.LongFrmModeData.OECurve.EnvLv_len));
|
pAmergeCtx->Config.Merge_v30.LongFrmMoveCoef = (float*)malloc(sizeof(float) * (calibv2_amerge_calib->MergeTuningPara.LongFrmModeData.MDCurve.MoveCoef_len));
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveLM_smooth = (float*)malloc(sizeof(float) * (calibv2_amerge_calib->MergeTuningPara.LongFrmModeData.MDCurve.MoveCoef_len));
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveLM_offset = (float*)malloc(sizeof(float) * (calibv2_amerge_calib->MergeTuningPara.LongFrmModeData.MDCurve.MoveCoef_len));
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveMS_smooth = (float*)malloc(sizeof(float) * (calibv2_amerge_calib->MergeTuningPara.LongFrmModeData.MDCurve.MoveCoef_len));
|
pAmergeCtx->Config.Merge_v30.LongFrmMDCurveMS_offset = (float*)malloc(sizeof(float) * (calibv2_amerge_calib->MergeTuningPara.LongFrmModeData.MDCurve.MoveCoef_len));
|
|
//malloc short frm mode
|
pAmergeCtx->Config.Merge_v30.ShortFrmMaxEnvLvKnots = calibv2_amerge_calib->MergeTuningPara.ShortFrmModeData.OECurve.EnvLv_len;
|
pAmergeCtx->Config.Merge_v30.ShortFrmMaxMoveCoefKnots = calibv2_amerge_calib->MergeTuningPara.ShortFrmModeData.MDCurve.MoveCoef_len;
|
pAmergeCtx->Config.Merge_v30.ShortFrmEnvLv = (float*)malloc(sizeof(float) * (calibv2_amerge_calib->MergeTuningPara.ShortFrmModeData.OECurve.EnvLv_len));
|
pAmergeCtx->Config.Merge_v30.ShortFrmOECurve_smooth = (float*)malloc(sizeof(float) * (calibv2_amerge_calib->MergeTuningPara.ShortFrmModeData.OECurve.EnvLv_len));
|
pAmergeCtx->Config.Merge_v30.ShortFrmOECurve_offset = (float*)malloc(sizeof(float) * (calibv2_amerge_calib->MergeTuningPara.ShortFrmModeData.OECurve.EnvLv_len));
|
pAmergeCtx->Config.Merge_v30.ShortFrmMoveCoef = (float*)malloc(sizeof(float) * (calibv2_amerge_calib->MergeTuningPara.ShortFrmModeData.MDCurve.MoveCoef_len));
|
pAmergeCtx->Config.Merge_v30.ShortFrmMDCurve_Coef = (float*)malloc(sizeof(float) * (calibv2_amerge_calib->MergeTuningPara.ShortFrmModeData.MDCurve.MoveCoef_len));
|
pAmergeCtx->Config.Merge_v30.ShortFrmMDCurve_ms_thd0 = (float*)malloc(sizeof(float) * (calibv2_amerge_calib->MergeTuningPara.ShortFrmModeData.MDCurve.MoveCoef_len));
|
pAmergeCtx->Config.Merge_v30.ShortFrmMDCurve_lm_thd0 = (float*)malloc(sizeof(float) * (calibv2_amerge_calib->MergeTuningPara.ShortFrmModeData.MDCurve.MoveCoef_len));
|
|
//set default para
|
//config default PrevData data
|
pAmergeCtx->PrevData.CtrlData.EnvLv = 0;
|
pAmergeCtx->PrevData.CtrlData.MoveCoef = 0;
|
pAmergeCtx->PrevData.CtrlData.ApiMode = MERGE_OPMODE_API_OFF;
|
pAmergeCtx->PrevData.HandleData.Merge_v30.MergeMode = 1;
|
pAmergeCtx->PrevData.HandleData.Merge_v30.OECurve_smooth = 80;
|
pAmergeCtx->PrevData.HandleData.Merge_v30.OECurve_offset = 210;
|
pAmergeCtx->PrevData.HandleData.Merge_v30.MDCurveLM_smooth = 80;
|
pAmergeCtx->PrevData.HandleData.Merge_v30.MDCurveLM_offset = 38;
|
pAmergeCtx->PrevData.HandleData.Merge_v30.MDCurveMS_smooth = 80;
|
pAmergeCtx->PrevData.HandleData.Merge_v30.MDCurveMS_offset = 38;
|
pAmergeCtx->PrevData.HandleData.Merge_v30.MDCurve_Coef = 0.05;
|
pAmergeCtx->PrevData.HandleData.Merge_v30.MDCurve_ms_thd0 = 0;
|
pAmergeCtx->PrevData.HandleData.Merge_v30.MDCurve_lm_thd0 = 0;
|
|
//set default ctrl info
|
pAmergeCtx->mergeAttr.attrV30.opMode = MERGE_OPMODE_API_OFF;
|
pAmergeCtx->mergeAttr.attrV30.CtlInfo.Envlv = 1.0;
|
pAmergeCtx->mergeAttr.attrV30.CtlInfo.MoveCoef = 0.0;
|
|
pAmergeCtx->mergeAttr.attrV30.stManual.BaseFrm = BASEFRAME_LONG;
|
pAmergeCtx->mergeAttr.attrV30.stManual.LongFrmModeData.OECurve.Smooth = 0.4;
|
pAmergeCtx->mergeAttr.attrV30.stManual.LongFrmModeData.OECurve.Offset = 210;
|
pAmergeCtx->mergeAttr.attrV30.stManual.LongFrmModeData.MDCurve.LM_smooth = 0.4;
|
pAmergeCtx->mergeAttr.attrV30.stManual.LongFrmModeData.MDCurve.LM_offset = 0.38;
|
pAmergeCtx->mergeAttr.attrV30.stManual.LongFrmModeData.MDCurve.MS_smooth = 0.4;
|
pAmergeCtx->mergeAttr.attrV30.stManual.LongFrmModeData.MDCurve.MS_offset = 0.38;
|
|
pAmergeCtx->mergeAttr.attrV30.stManual.ShortFrmModeData.OECurve.Smooth = 0.4;
|
pAmergeCtx->mergeAttr.attrV30.stManual.ShortFrmModeData.OECurve.Offset = 210;
|
pAmergeCtx->mergeAttr.attrV30.stManual.ShortFrmModeData.MDCurve.Coef = 0.05;
|
pAmergeCtx->mergeAttr.attrV30.stManual.ShortFrmModeData.MDCurve.ms_thd0 = 0.00;
|
pAmergeCtx->mergeAttr.attrV30.stManual.ShortFrmModeData.MDCurve.lm_thd0 = 0.00;
|
}
|
|
LOG1_AMERGE( "%s:exit!\n", __FUNCTION__);
|
return (result);
|
}
|
/******************************************************************************
|
* AmergeRelease()
|
*****************************************************************************/
|
XCamReturn AmergeRelease
|
(
|
AmergeContext_t* pAmergeCtx
|
) {
|
|
LOG1_AMERGE( "%s:enter!\n", __FUNCTION__);
|
XCamReturn result = XCAM_RETURN_NO_ERROR;
|
|
// initial checks
|
if (NULL == pAmergeCtx) {
|
return (XCAM_RETURN_ERROR_MEM);
|
}
|
|
result = AmergeStop(pAmergeCtx);
|
if (result != XCAM_RETURN_NO_ERROR) {
|
LOGE_AMERGE( "%s: Amerge Stop() failed!\n", __FUNCTION__);
|
return (result);
|
}
|
|
// check state
|
if ((AMERGE_STATE_RUNNING == pAmergeCtx->state)
|
|| (AMERGE_STATE_LOCKED == pAmergeCtx->state)) {
|
return (XCAM_RETURN_ERROR_FAILED);
|
}
|
|
if(CHECK_ISP_HW_V21()) {
|
free(pAmergeCtx->Config.Merge_v20.EnvLv);
|
free(pAmergeCtx->Config.Merge_v20.OECurve_smooth);
|
free(pAmergeCtx->Config.Merge_v20.OECurve_offset);
|
free(pAmergeCtx->Config.Merge_v20.MoveCoef);
|
free(pAmergeCtx->Config.Merge_v20.MDCurveLM_smooth);
|
free(pAmergeCtx->Config.Merge_v20.MDCurveLM_offset);
|
free(pAmergeCtx->Config.Merge_v20.MDCurveMS_smooth);
|
free(pAmergeCtx->Config.Merge_v20.MDCurveMS_offset);
|
}
|
else if(CHECK_ISP_HW_V30()) {
|
//free long frm mode
|
free(pAmergeCtx->Config.Merge_v30.LongFrmEnvLv );
|
free(pAmergeCtx->Config.Merge_v30.LongFrmOECurve_smooth );
|
free(pAmergeCtx->Config.Merge_v30.LongFrmOECurve_offset);
|
free(pAmergeCtx->Config.Merge_v30.LongFrmMoveCoef );
|
free(pAmergeCtx->Config.Merge_v30.LongFrmMDCurveLM_smooth );
|
free(pAmergeCtx->Config.Merge_v30.LongFrmMDCurveLM_offset);
|
free(pAmergeCtx->Config.Merge_v30.LongFrmMDCurveMS_smooth);
|
free(pAmergeCtx->Config.Merge_v30.LongFrmMDCurveMS_offset);
|
//free short frm mode
|
free(pAmergeCtx->Config.Merge_v30.ShortFrmEnvLv);
|
free(pAmergeCtx->Config.Merge_v30.ShortFrmOECurve_smooth);
|
free(pAmergeCtx->Config.Merge_v30.ShortFrmOECurve_offset);
|
free(pAmergeCtx->Config.Merge_v30.ShortFrmMoveCoef);
|
free(pAmergeCtx->Config.Merge_v30.ShortFrmMDCurve_Coef);
|
free(pAmergeCtx->Config.Merge_v30.ShortFrmMDCurve_ms_thd0);
|
free(pAmergeCtx->Config.Merge_v30.ShortFrmMDCurve_lm_thd0);
|
}
|
memset(pAmergeCtx, 0, sizeof(AmergeContext_s));
|
free(pAmergeCtx);
|
pAmergeCtx = NULL;
|
|
LOG1_AMERGE( "%s:exit!\n", __FUNCTION__);
|
|
return (result);
|
}
|