/****************************************************************************** * * 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 adrc.cpp * * @brief * ADD_DESCRIPTION_HERE * *****************************************************************************/ #include "math.h" #include "rk_aiq_types_adrc_algo_int.h" #include "xcam_log.h" #include "rk_aiq_types_adrc_algo_prvt.h" /****************************************************************************** * AdrcStart() *****************************************************************************/ XCamReturn AdrcStart ( AdrcHandle_t pAdrcCtx ) { LOG1_ATMO( "%s:enter!\n", __FUNCTION__); // initial checks if (pAdrcCtx == NULL) { return (XCAM_RETURN_ERROR_MEM); } if ((ADRC_STATE_RUNNING == pAdrcCtx->state) || (ADRC_STATE_LOCKED == pAdrcCtx->state)) { return (XCAM_RETURN_ERROR_PARAM); } pAdrcCtx->state = ADRC_STATE_RUNNING; LOG1_ATMO( "%s:exit!\n", __FUNCTION__); return (XCAM_RETURN_NO_ERROR); } /****************************************************************************** * DrcGetCurrPara() *****************************************************************************/ float DrcGetCurrPara ( 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__); } /****************************************************************************** * AdrcStop() *****************************************************************************/ XCamReturn AdrcStop ( AdrcHandle_t pAdrcCtx ) { LOG1_ATMO( "%s:enter!\n", __FUNCTION__); // initial checks if (pAdrcCtx == NULL) { return (XCAM_RETURN_ERROR_MEM); } // before stopping, unlock the AHDR if locked if (ADRC_STATE_LOCKED == pAdrcCtx->state) { return (XCAM_RETURN_ERROR_PARAM); } pAdrcCtx->state = ADRC_STATE_STOPPED; LOG1_ATMO( "%s:exit!\n", __FUNCTION__); return (XCAM_RETURN_NO_ERROR); } /****************************************************************************** * DrcNewMalloc() ***************************************************************************/ void DrcNewMalloc ( AdrcConfig_t* pConfig, CalibDbV2_drc_t* pCalibDb ) { LOG1_ATMO( "%s:enter!\n", __FUNCTION__); // initial checks DCT_ASSERT(pConfig != NULL); DCT_ASSERT(pCalibDb != NULL); LOG1_ATMO( "%s: Pre DrcGain len:%d, Cur DrcGain len:%d\n", __FUNCTION__, pConfig->DrcGain.len, pCalibDb->DrcTuningPara.DrcGain.EnvLv_len); LOG1_ATMO( "%s: Pre HiLit len:%d, Cur HiLit len:%d\n", __FUNCTION__, pConfig->HiLit.len, pCalibDb->DrcTuningPara.HiLight.EnvLv_len); LOG1_ATMO( "%s: Pre Local len:%d, Cur Local len:%d\n", __FUNCTION__, pConfig->Local.len, pCalibDb->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len); //drc gain if(pConfig->DrcGain.len != pCalibDb->DrcTuningPara.DrcGain.EnvLv_len) { free(pConfig->DrcGain.EnvLv); free(pConfig->DrcGain.DrcGain); free(pConfig->DrcGain.Alpha); free(pConfig->DrcGain.Clip); pConfig->DrcGain.len = pCalibDb->DrcTuningPara.DrcGain.EnvLv_len; pConfig->DrcGain.EnvLv = (float*)malloc(sizeof(float) * (pCalibDb->DrcTuningPara.DrcGain.EnvLv_len)); pConfig->DrcGain.DrcGain = (float*)malloc(sizeof(float) * (pCalibDb->DrcTuningPara.DrcGain.EnvLv_len)); pConfig->DrcGain.Alpha = (float*)malloc(sizeof(float) * (pCalibDb->DrcTuningPara.DrcGain.EnvLv_len)); pConfig->DrcGain.Clip = (float*)malloc(sizeof(float) * (pCalibDb->DrcTuningPara.DrcGain.EnvLv_len)); } //hilit if(pConfig->HiLit.len != pCalibDb->DrcTuningPara.HiLight.EnvLv_len) { free(pConfig->HiLit.EnvLv); free(pConfig->HiLit.Strength); pConfig->HiLit.len = pCalibDb->DrcTuningPara.HiLight.EnvLv_len; pConfig->HiLit.EnvLv = (float*)malloc(sizeof(float) * (pCalibDb->DrcTuningPara.HiLight.EnvLv_len)); pConfig->HiLit.Strength = (float*)malloc(sizeof(float) * (pCalibDb->DrcTuningPara.HiLight.EnvLv_len)); } //local if(pConfig->Local.len != pCalibDb->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len) { free(pConfig->Local.EnvLv); free(pConfig->Local.LocalWeit); free(pConfig->Local.GlobalContrast); free(pConfig->Local.LoLitContrast); pConfig->Local.len = pCalibDb->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len; pConfig->Local.EnvLv = (float*)malloc(sizeof(float) * (pCalibDb->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len)); pConfig->Local.LocalWeit = (float*)malloc(sizeof(float) * (pCalibDb->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len)); pConfig->Local.GlobalContrast = (float*)malloc(sizeof(float) * (pCalibDb->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len)); pConfig->Local.LoLitContrast = (float*)malloc(sizeof(float) * (pCalibDb->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len)); } LOG1_ATMO( "%s:exit!\n", __FUNCTION__); } /****************************************************************************** * CalibrateDrcGainY() *****************************************************************************/ void CalibrateDrcGainY( DrcProcRes_t *para, float DraGain, float alpha) { LOG1_ATMO("%s:Enter!\n", __FUNCTION__); float tmp = 0; float luma[17] = { 0, 256, 512, 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 2816, 3072, 3328, 3584, 3840, 4096 }; float gainTable[17]; for(int i = 0; i < 17; ++i) { tmp = luma[i]; tmp = 1 - alpha * pow((1 - tmp / 4096), 2); gainTable[i] = 1024 * pow(DraGain, tmp); para->sw_drc_gain_y[i] = (int)(gainTable[i]) ; } LOG1_ATMO("%s:Eixt!\n", __FUNCTION__); } /****************************************************************************** * AdrcApiOffConfig() *set default Config data *****************************************************************************/ void AdrcApiOffConfig ( AdrcHandle_t pAdrcCtx ) { LOG1_ATMO( "%s:enter!\n", __FUNCTION__); LOGI_ATMO( "%s:exit!\n", __FUNCTION__); } /****************************************************************************** * Config() *set default Config data *****************************************************************************/ void Config ( AdrcHandle_t pAdrcCtx ) { LOGI_ATMO( "%s:enter!\n", __FUNCTION__); // initial checks DCT_ASSERT(pAdrcCtx != NULL); if(pAdrcCtx->drcAttr.opMode == DRC_OPMODE_API_OFF) { AdrcApiOffConfig(pAdrcCtx); LOGD_ATMO("%s: Ahdr Api is OFF!!!:\n", __FUNCTION__); } else LOGD_ATMO("%s: Ahdr Api is ON!!!:\n", __FUNCTION__); //config default PrevData data pAdrcCtx->PrevData.frameCnt = 0; pAdrcCtx->PrevData.EnvLv = 0; pAdrcCtx->PrevData.ApiMode = DRC_OPMODE_API_OFF; pAdrcCtx->PrevData.HandleData.DrcGain = 4.0; pAdrcCtx->PrevData.HandleData.Alpha = 0.2; pAdrcCtx->PrevData.HandleData.Clip = 16.0 ; pAdrcCtx->PrevData.HandleData.Strength = 0.01 ; pAdrcCtx->PrevData.HandleData.LocalWeit = 1.00 ; pAdrcCtx->PrevData.HandleData.GlobalContrast = 0 ; pAdrcCtx->PrevData.HandleData.LoLitContrast = 0; LOG1_ATMO( "%s:exit!\n", __FUNCTION__); } void AdrcGetAeResult ( AdrcHandle_t pAdrcCtx, AecPreResult_t AecHdrPreResult ) { LOG1_ATMO( "%s:enter!\n", __FUNCTION__); //get Ae Pre Result pAdrcCtx->CurrAeResult.GlobalEnvLv = AecHdrPreResult.GlobalEnvLv[AecHdrPreResult.NormalIndex]; pAdrcCtx->CurrAeResult.M2S_Ratio = AecHdrPreResult.M2S_ExpRatio; pAdrcCtx->CurrAeResult.M2S_Ratio = pAdrcCtx->CurrAeResult.M2S_Ratio < 1 ? 1 : pAdrcCtx->CurrAeResult.M2S_Ratio; pAdrcCtx->CurrAeResult.L2M_Ratio = AecHdrPreResult.L2M_ExpRatio; pAdrcCtx->CurrAeResult.L2M_Ratio = pAdrcCtx->CurrAeResult.L2M_Ratio < 1 ? 1 : pAdrcCtx->CurrAeResult.L2M_Ratio; //transfer CurrAeResult data into AhdrHandle switch (pAdrcCtx->FrameNumber) { case 1: pAdrcCtx->CurrData.Ratio = 1; pAdrcCtx->CurrAeResult.ISO = AecHdrPreResult.LinearExp.exp_real_params.analog_gain * 50.0; pAdrcCtx->CurrAeResult.GlobalEnvLv = AecHdrPreResult.GlobalEnvLv[0]; pAdrcCtx->CurrAeResult.AEMaxRatio = 1.0; break; case 2: pAdrcCtx->CurrData.Ratio = pAdrcCtx->CurrAeResult.M2S_Ratio; pAdrcCtx->CurrAeResult.ISO = AecHdrPreResult.HdrExp[1].exp_real_params.analog_gain * 50.0; pAdrcCtx->CurrAeResult.GlobalEnvLv = AecHdrPreResult.GlobalEnvLv[1]; //todo pAdrcCtx->CurrAeResult.AEMaxRatio = 64.0; break; default: LOGE_ATMO("%s: Wrong frame number in HDR mode!!!\n", __FUNCTION__); break; } //Normalize the current envLv for AEC float maxEnvLuma = 65 / 10; float minEnvLuma = 0; pAdrcCtx->CurrData.EnvLv = (pAdrcCtx->CurrAeResult.GlobalEnvLv - minEnvLuma) / (maxEnvLuma - minEnvLuma); pAdrcCtx->CurrData.EnvLv = LIMIT_VALUE(pAdrcCtx->CurrData.EnvLv, 1, 0); LOGD_ATMO("%s: Current Ratio:%f\n", __FUNCTION__, pAdrcCtx->CurrData.Ratio); LOG1_ATMO( "%s:exit!\n", __FUNCTION__); } void AdrcGetSensorInfo ( AdrcHandle_t pAdrcCtx, AecProcResult_t AecHdrProcResult ) { LOG1_ATMO( "%s:enter!\n", __FUNCTION__); pAdrcCtx->SensorInfo.LongFrmMode = AecHdrProcResult.LongFrmMode; for(int i = 0; i < 3; i++) { #if 0 // TODO Merge pAdrcCtx->SensorInfo.HdrMinGain[i] = AecHdrProcResult.HdrExpRange.stGainRange[i].Min; pAdrcCtx->SensorInfo.HdrMaxGain[i] = AecHdrProcResult.HdrExpRange.stGainRange[i].Max; pAdrcCtx->SensorInfo.HdrMinIntegrationTime[i] = AecHdrProcResult.HdrExpRange.stExpTimeRange[i].Min; pAdrcCtx->SensorInfo.HdrMaxIntegrationTime[i] = AecHdrProcResult.HdrExpRange.stExpTimeRange[i].Max; #endif } if(pAdrcCtx->FrameNumber == 1) { pAdrcCtx->SensorInfo.MaxExpoL = 0; pAdrcCtx->SensorInfo.MinExpoL = 0; } else if(pAdrcCtx->FrameNumber == 2) { pAdrcCtx->SensorInfo.MaxExpoL = pAdrcCtx->SensorInfo.HdrMaxGain[1] * pAdrcCtx->SensorInfo.HdrMaxIntegrationTime[2]; pAdrcCtx->SensorInfo.MinExpoL = pAdrcCtx->SensorInfo.HdrMinGain[1] * pAdrcCtx->SensorInfo.HdrMinIntegrationTime[2]; } pAdrcCtx->SensorInfo.MaxExpoS = pAdrcCtx->SensorInfo.HdrMaxGain[0] * pAdrcCtx->SensorInfo.HdrMaxIntegrationTime[0]; pAdrcCtx->SensorInfo.MinExpoS = pAdrcCtx->SensorInfo.HdrMinGain[0] * pAdrcCtx->SensorInfo.HdrMinIntegrationTime[0]; LOG1_ATMO( "%s:exit!\n", __FUNCTION__); } /****************************************************************************** * AdrcIQUpdate() * *****************************************************************************/ void AdrcIQUpdate ( AdrcHandle_t pAdrcCtx ) { LOG1_ATMO("%s:enter!\n", __FUNCTION__); //get Drc gain pAdrcCtx->CurrData.HandleData.DrcGain = DrcGetCurrPara(pAdrcCtx->CurrData.EnvLv, pAdrcCtx->Config.DrcGain.EnvLv, pAdrcCtx->Config.DrcGain.DrcGain, pAdrcCtx->Config.DrcGain.len); pAdrcCtx->CurrData.HandleData.Alpha = DrcGetCurrPara(pAdrcCtx->CurrData.EnvLv, pAdrcCtx->Config.DrcGain.EnvLv, pAdrcCtx->Config.DrcGain.Alpha, pAdrcCtx->Config.DrcGain.len); pAdrcCtx->CurrData.HandleData.Clip = DrcGetCurrPara(pAdrcCtx->CurrData.EnvLv, pAdrcCtx->Config.DrcGain.EnvLv, pAdrcCtx->Config.DrcGain.Clip, pAdrcCtx->Config.DrcGain.len); //get hi lit pAdrcCtx->CurrData.HandleData.Strength = DrcGetCurrPara(pAdrcCtx->CurrData.EnvLv, pAdrcCtx->Config.HiLit.EnvLv, pAdrcCtx->Config.HiLit.Strength, pAdrcCtx->Config.HiLit.len); //get local pAdrcCtx->CurrData.HandleData.LocalWeit = DrcGetCurrPara(pAdrcCtx->CurrData.EnvLv, pAdrcCtx->Config.Local.EnvLv, pAdrcCtx->Config.Local.LocalWeit, pAdrcCtx->Config.Local.len); pAdrcCtx->CurrData.HandleData.GlobalContrast = DrcGetCurrPara(pAdrcCtx->CurrData.EnvLv, pAdrcCtx->Config.Local.EnvLv, pAdrcCtx->Config.Local.GlobalContrast, pAdrcCtx->Config.Local.len); pAdrcCtx->CurrData.HandleData.LoLitContrast = DrcGetCurrPara(pAdrcCtx->CurrData.EnvLv, pAdrcCtx->Config.Local.EnvLv, pAdrcCtx->Config.Local.LoLitContrast, pAdrcCtx->Config.Local.len); //compress pAdrcCtx->CurrData.HandleData.Mode = pAdrcCtx->Config.Compress.Mode; for(int i = 0; i < ADRC_Y_NUM; i++) pAdrcCtx->CurrData.HandleData.Manual_curve[i] = pAdrcCtx->Config.Compress.Manual_curve[i]; //others if(0 != memcmp(&pAdrcCtx->CurrData.Others, &pAdrcCtx->Config.Others, sizeof(DrcOhters_t))) memcpy(&pAdrcCtx->CurrData.Others, &pAdrcCtx->Config.Others, sizeof(DrcOhters_t));//load iq paras LOG1_ATMO( "%s:exit!\n", __FUNCTION__); } /****************************************************************************** * AdrcTranferData2Api() * *****************************************************************************/ void AdrcTranferData2Api ( AdrcHandle_t pAdrcCtx ) { LOG1_ATMO("%s:enter!\n", __FUNCTION__); //info pAdrcCtx->drcAttr.Info.EnvLv = pAdrcCtx->CurrData.EnvLv; //reg pAdrcCtx->drcAttr.stManual.DrcGain.DrcGain = pAdrcCtx->CurrData.HandleData.DrcGain; pAdrcCtx->drcAttr.stManual.DrcGain.Alpha = pAdrcCtx->CurrData.HandleData.Alpha; pAdrcCtx->drcAttr.stManual.DrcGain.Clip = pAdrcCtx->CurrData.HandleData.Clip; pAdrcCtx->drcAttr.stManual.HiLit.Strength = pAdrcCtx->CurrData.HandleData.Strength; pAdrcCtx->drcAttr.stManual.Local.LocalWeit = pAdrcCtx->CurrData.HandleData.LocalWeit; pAdrcCtx->drcAttr.stManual.Local.GlobalContrast = pAdrcCtx->CurrData.HandleData.GlobalContrast; pAdrcCtx->drcAttr.stManual.Local.LoLitContrast = pAdrcCtx->CurrData.HandleData.LoLitContrast; LOG1_ATMO( "%s:exit!\n", __FUNCTION__); } /****************************************************************************** * AdrcApiManualUpdate() * *****************************************************************************/ void AdrcApiManualUpdate ( CurrData_t* pAdrcCurr, mdrcAttr_t* pStManual ) { LOG1_ATMO("%s:enter!\n", __FUNCTION__); //get Drc gain pAdrcCurr->HandleData.DrcGain = pStManual->DrcGain.DrcGain; pAdrcCurr->HandleData.Alpha = pStManual->DrcGain.Alpha; pAdrcCurr->HandleData.Clip = pStManual->DrcGain.Clip; //get hi lit pAdrcCurr->HandleData.Strength = pStManual->HiLit.Strength; //get local pAdrcCurr->HandleData.LocalWeit = pStManual->Local.LocalWeit; pAdrcCurr->HandleData.GlobalContrast = pStManual->Local.GlobalContrast; pAdrcCurr->HandleData.LoLitContrast = pStManual->Local.LoLitContrast; //compress pAdrcCurr->HandleData.Mode = pStManual->Compress.Mode; for(int i = 0; i < ADRC_Y_NUM; i++) pAdrcCurr->HandleData.Manual_curve[i] = pStManual->Compress.Manual_curve[i]; LOG1_ATMO( "%s:exit!\n", __FUNCTION__); } /****************************************************************************** * AdrcUpdateConfig() *transfer html parameter into handle ***************************************************************************/ void AdrcUpdateConfig ( AdrcHandle_t pAdrcCtx, CalibDbV2_drc_t* pCalibDb ) { LOG1_ATMO( "%s:enter!\n", __FUNCTION__); // initial checks DCT_ASSERT(pAdrcCtx != NULL); DCT_ASSERT(pCalibDb != NULL); //enbale pAdrcCtx->Config.Enable = pCalibDb->DrcTuningPara.Enable; pAdrcCtx->Config.OutPutLongFrame = pCalibDb->DrcTuningPara.OutPutLongFrame; //drc gain for (int i = 0; i < pAdrcCtx->Config.DrcGain.len; i++ ) { pAdrcCtx->Config.DrcGain.EnvLv[i] = LIMIT_VALUE(pCalibDb->DrcTuningPara.DrcGain.EnvLv[i], ADRCNORMALIZEMAX, ADRCNORMALIZEMIN); pAdrcCtx->Config.DrcGain.DrcGain[i] = LIMIT_VALUE(pCalibDb->DrcTuningPara.DrcGain.DrcGain[i], DRCGAINMAX, DRCGAINMIN); pAdrcCtx->Config.DrcGain.Alpha[i] = LIMIT_VALUE(pCalibDb->DrcTuningPara.DrcGain.Alpha[i], ADRCNORMALIZEMAX, ADRCNORMALIZEMIN); pAdrcCtx->Config.DrcGain.Clip[i] = LIMIT_VALUE(pCalibDb->DrcTuningPara.DrcGain.Clip[i], CLIPMAX, CLIPMIN); } //hight ligjt for (int i = 0; i < pAdrcCtx->Config.HiLit.len; i++ ) { pAdrcCtx->Config.HiLit.EnvLv[i] = LIMIT_VALUE(pCalibDb->DrcTuningPara.HiLight.EnvLv[i], ADRCNORMALIZEMAX, ADRCNORMALIZEMIN); pAdrcCtx->Config.HiLit.Strength[i] = LIMIT_VALUE(pCalibDb->DrcTuningPara.HiLight.Strength[i], ADRCNORMALIZEMAX, ADRCNORMALIZEMIN); } // local for (int i = 0; i < pAdrcCtx->Config.Local.len; i++ ) { pAdrcCtx->Config.Local.EnvLv[i] = LIMIT_VALUE(pCalibDb->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv[i], ADRCNORMALIZEMAX, ADRCNORMALIZEMIN); pAdrcCtx->Config.Local.LocalWeit[i] = LIMIT_VALUE(pCalibDb->DrcTuningPara.LocalTMOSetting.LocalTMOData.LocalWeit[i], ADRCNORMALIZEMAX, ADRCNORMALIZEMIN); pAdrcCtx->Config.Local.GlobalContrast[i] = LIMIT_VALUE(pCalibDb->DrcTuningPara.LocalTMOSetting.LocalTMOData.GlobalContrast[i], ADRCNORMALIZEMAX, ADRCNORMALIZEMIN); pAdrcCtx->Config.Local.LoLitContrast[i] = LIMIT_VALUE(pCalibDb->DrcTuningPara.LocalTMOSetting.LocalTMOData.LoLitContrast[i], ADRCNORMALIZEMAX, ADRCNORMALIZEMIN); } //others pAdrcCtx->Config.Others.curPixWeit = LIMIT_VALUE(pCalibDb->DrcTuningPara.LocalTMOSetting.curPixWeit, ADRCNORMALIZEMAX, ADRCNORMALIZEMIN); pAdrcCtx->Config.Others.preFrameWeit = LIMIT_VALUE(pCalibDb->DrcTuningPara.LocalTMOSetting.preFrameWeit, ADRCNORMALIZEMAX, ADRCNORMALIZEMIN); pAdrcCtx->Config.Others.Range_force_sgm = LIMIT_VALUE(pCalibDb->DrcTuningPara.LocalTMOSetting.Range_force_sgm, ADRCNORMALIZEMAX, ADRCNORMALIZEMIN); pAdrcCtx->Config.Others.Range_sgm_cur = LIMIT_VALUE(pCalibDb->DrcTuningPara.LocalTMOSetting.Range_sgm_cur, ADRCNORMALIZEMAX, ADRCNORMALIZEMIN); pAdrcCtx->Config.Others.Range_sgm_pre = LIMIT_VALUE(pCalibDb->DrcTuningPara.LocalTMOSetting.Range_sgm_pre, ADRCNORMALIZEMAX, ADRCNORMALIZEMIN); pAdrcCtx->Config.Others.Space_sgm_cur = LIMIT_VALUE(pCalibDb->DrcTuningPara.LocalTMOSetting.Space_sgm_cur, SPACESGMMAX, SPACESGMMIN); pAdrcCtx->Config.Others.Space_sgm_pre = LIMIT_VALUE(pCalibDb->DrcTuningPara.LocalTMOSetting.Space_sgm_pre, SPACESGMMAX, SPACESGMMIN); //compress and scale y pAdrcCtx->Config.Compress.Mode = pCalibDb->DrcTuningPara.CompressSetting.Mode; for(int i = 0; i < ADRC_Y_NUM; i++ ) { pAdrcCtx->Config.Others.Scale_y[i] = LIMIT_VALUE(pCalibDb->DrcTuningPara.Scale_y[i], SCALEYMAX, SCALEYMIN); pAdrcCtx->Config.Compress.Manual_curve[i] = LIMIT_VALUE(pCalibDb->DrcTuningPara.CompressSetting.Manual_curve[i], MANUALCURVEMAX, MANUALCURVEMIN); } pAdrcCtx->Config.Others.ByPassThr = LIMIT_VALUE(pCalibDb->DrcTuningPara.ByPassThr, ADRCNORMALIZEMAX, ADRCNORMALIZEMIN); pAdrcCtx->Config.Others.Edge_Weit = LIMIT_VALUE(pCalibDb->DrcTuningPara.Edge_Weit, ADRCNORMALIZEMAX, ADRCNORMALIZEMIN); pAdrcCtx->Config.Others.IIR_frame = LIMIT_VALUE(pCalibDb->DrcTuningPara.IIR_frame, IIRFRAMEMAX, IIRFRAMEMIN); pAdrcCtx->Config.Others.Tolerance = LIMIT_VALUE(pCalibDb->DrcTuningPara.Tolerance, IIRFRAMEMAX, IIRFRAMEMIN); pAdrcCtx->Config.Others.damp = LIMIT_VALUE(pCalibDb->DrcTuningPara.damp, ADRCNORMALIZEMAX, ADRCNORMALIZEMIN); LOG1_ATMO( "%s:exit!\n", __FUNCTION__); } /****************************************************************************** * AdrcDamping() *****************************************************************************/ void AdrcDamping ( CurrData_t* pCurrData, AdrcPrevData_t* pPreData, drc_OpMode_t opMode, int FrameCnt ) { LOG1_ATMO("%s:Enter!\n", __FUNCTION__); float Drc_damp = pCurrData->Others.damp; bool enDamp; bool ifHDRModeChange = pCurrData->frameCnt == pPreData->frameCnt ? false : true; if((opMode == DRC_OPMODE_API_OFF || opMode == DRC_OPMODE_AUTO) && FrameCnt != 0 && !ifHDRModeChange) { float diff = 0.0; diff = ABS(pCurrData->EnvLv - pPreData->EnvLv); diff = diff / pPreData->EnvLv; if (diff < pCurrData->Others.Tolerance) enDamp = false; else enDamp = true; //get finnal cfg data by damp if (enDamp) { pCurrData->HandleData.DrcGain = Drc_damp * pCurrData->HandleData.DrcGain + (1 - Drc_damp) * pPreData->HandleData.DrcGain; pCurrData->HandleData.Alpha = Drc_damp * pCurrData->HandleData.Alpha + (1 - Drc_damp) * pPreData->HandleData.Alpha; pCurrData->HandleData.Clip = Drc_damp * pCurrData->HandleData.Clip + (1 - Drc_damp) * pPreData->HandleData.Clip; pCurrData->HandleData.Strength = Drc_damp * pCurrData->HandleData.Strength + (1 - Drc_damp) * pPreData->HandleData.Strength; pCurrData->HandleData.LocalWeit = Drc_damp * pCurrData->HandleData.LocalWeit + (1 - Drc_damp) * pPreData->HandleData.LocalWeit; pCurrData->HandleData.GlobalContrast = Drc_damp * pCurrData->HandleData.GlobalContrast + (1 - Drc_damp) * pPreData->HandleData.GlobalContrast; pCurrData->HandleData.LoLitContrast = Drc_damp * pCurrData->HandleData.LoLitContrast + (1 - Drc_damp) * pPreData->HandleData.LoLitContrast; } } LOG1_ATMO("%s:Eixt!\n", __FUNCTION__); } /****************************************************************************** * AdrcGetCurrProcRes() *****************************************************************************/ void AdrcGetCurrProcRes ( AdrcProcResData_t* pAdrcProcRes, CurrData_t* pCurrData, bool LongFrmMode, int FrameNumber, int FrameCnt, bool OutPutLongFrame ) { LOG1_ATMO( "%s:enter!\n", __FUNCTION__); //enable if(FrameNumber == 2 || FrameNumber == 3) { pAdrcProcRes->bTmoEn = true; pAdrcProcRes->isLinearTmo = false; } else if(FrameNumber == 1) { pAdrcProcRes->bTmoEn = pCurrData->Enable; pAdrcProcRes->isLinearTmo = pAdrcProcRes->bTmoEn; } //Long Frame mode pAdrcProcRes->LongFrameMode = LongFrmMode; //Global tmo pAdrcProcRes->isHdrGlobalTmo = pCurrData->HandleData.LocalWeit == 0 ? true : false; //compress mode pAdrcProcRes->CompressMode = pCurrData->HandleData.Mode; //DrcProcRes pAdrcProcRes->DrcProcRes.sw_drc_offset_pow2 = SW_DRC_OFFSET_POW2_FIX; pAdrcProcRes->DrcProcRes.sw_drc_position = (int)(SHIFT8BIT(pCurrData->HandleData.Clip) + 0.5); pAdrcProcRes->DrcProcRes.sw_drc_hpdetail_ratio = (int)(SHIFT12BIT(pCurrData->HandleData.LoLitContrast) + 0.5); pAdrcProcRes->DrcProcRes.sw_drc_lpdetail_ratio = (int)(SHIFT12BIT(pCurrData->HandleData.GlobalContrast) + 0.5); pAdrcProcRes->DrcProcRes.sw_drc_weicur_pix = (int)(SHIFT8BIT(pCurrData->Others.curPixWeit) + 0.5); pAdrcProcRes->DrcProcRes.sw_drc_weipre_frame = (int)(SHIFT8BIT(pCurrData->Others.preFrameWeit) + 0.5); pAdrcProcRes->DrcProcRes.sw_drc_weipre_frame = LIMIT_VALUE(pAdrcProcRes->DrcProcRes.sw_drc_weipre_frame, 255, 0); pAdrcProcRes->DrcProcRes.sw_drc_force_sgm_inv0 = (int)(SHIFT13BIT(pCurrData->Others.Range_force_sgm) + 0.5); pAdrcProcRes->DrcProcRes.sw_drc_edge_scl = (int)(SHIFT8BIT(pCurrData->Others.Edge_Weit) + 0.5); pAdrcProcRes->DrcProcRes.sw_drc_motion_scl = SW_DRC_MOTION_SCL_FIX; pAdrcProcRes->DrcProcRes.sw_drc_space_sgm_inv1 = (int)(pCurrData->Others.Space_sgm_cur); pAdrcProcRes->DrcProcRes.sw_drc_space_sgm_inv0 = (int)(pCurrData->Others.Space_sgm_pre); pAdrcProcRes->DrcProcRes.sw_drc_range_sgm_inv1 = (int)(SHIFT13BIT(pCurrData->Others.Range_sgm_cur) + 0.5); pAdrcProcRes->DrcProcRes.sw_drc_range_sgm_inv0 = (int)(SHIFT13BIT(pCurrData->Others.Range_sgm_pre) + 0.5); pAdrcProcRes->DrcProcRes.sw_drc_weig_maxl = (int)(SHIFT4BIT(pCurrData->HandleData.Strength) + 0.5); pAdrcProcRes->DrcProcRes.sw_drc_adrc_gain = pCurrData->HandleData.DrcGain; pAdrcProcRes->DrcProcRes.sw_drc_weig_bilat = (int)(SHIFT4BIT(pCurrData->HandleData.LocalWeit) + 0.5); pAdrcProcRes->DrcProcRes.sw_drc_min_ogain = OutPutLongFrame ? 1 : 0; for(int i = 0; i < ADRC_Y_NUM; ++i) { pAdrcProcRes->DrcProcRes.sw_drc_scale_y[i] = (int)(pCurrData->Others.Scale_y[i]) ; pAdrcProcRes->DrcProcRes.sw_drc_compres_y[i] = pCurrData->HandleData.Manual_curve[i] ; } //get sw_drc_gain_y CalibrateDrcGainY(&pAdrcProcRes->DrcProcRes, pAdrcProcRes->DrcProcRes.sw_drc_adrc_gain, pCurrData->HandleData.Alpha) ; float iir_frame = (float)(MIN(FrameCnt + 1, pCurrData->Others.IIR_frame)); pAdrcProcRes->DrcProcRes.sw_drc_iir_weight = (int)(SHIFT6BIT((iir_frame - 1) / iir_frame) + 0.5); pAdrcProcRes->DrcProcRes.sw_drc_compres_scl = 20000.0; //sw_drc_delta_scalein FIX int ISP_RAW_BIT = 12; int MFHDR_LOG_Q_BITS = 11; int dstbits = ISP_RAW_BIT << MFHDR_LOG_Q_BITS; int offsetbits_int = SW_DRC_OFFSET_POW2_FIX; int offsetbits = offsetbits_int << MFHDR_LOG_Q_BITS; int validbits = dstbits - offsetbits; int delta_scalein = (256 << MFHDR_LOG_Q_BITS) / validbits; pAdrcProcRes->DrcProcRes.sw_drc_delta_scalein = delta_scalein; LOGD_ATMO("%s:Current damp Enable:%d DrcGain:%f Alpha:%f Clip:%f Strength:%f LocalWeit:%f GlobalContrast:%f LoLitContrast:%f CompressMode:%d\n", __FUNCTION__, pAdrcProcRes->bTmoEn, pCurrData->HandleData.DrcGain, pCurrData->HandleData.Alpha, pCurrData->HandleData.Clip, pCurrData->HandleData.Strength, pCurrData->HandleData.LocalWeit, pCurrData->HandleData.GlobalContrast, pCurrData->HandleData.LoLitContrast, pCurrData->HandleData.Mode); LOGV_ATMO("%s: sw_drc_adrc_gain:%f Alpha:%f\n", __FUNCTION__, pAdrcProcRes->DrcProcRes.sw_drc_adrc_gain, pCurrData->HandleData.Alpha); LOGV_ATMO("%s: sw_drc_offset_pow2:%d\n", __FUNCTION__, pAdrcProcRes->DrcProcRes.sw_drc_offset_pow2); LOGV_ATMO("%s: sw_drc_compres_scl:%d\n", __FUNCTION__, pAdrcProcRes->DrcProcRes.sw_drc_compres_scl); LOGV_ATMO("%s: sw_drc_position:%d\n", __FUNCTION__, pAdrcProcRes->DrcProcRes.sw_drc_position); LOGV_ATMO("%s: sw_drc_delta_scalein:%d\n", __FUNCTION__, pAdrcProcRes->DrcProcRes.sw_drc_delta_scalein); LOGV_ATMO("%s: sw_drc_hpdetail_ratio:%d\n", __FUNCTION__, pAdrcProcRes->DrcProcRes.sw_drc_hpdetail_ratio); LOGV_ATMO("%s: sw_drc_lpdetail_ratio:%d\n", __FUNCTION__, pAdrcProcRes->DrcProcRes.sw_drc_lpdetail_ratio); LOGV_ATMO("%s: sw_drc_weicur_pix:%d\n", __FUNCTION__, pAdrcProcRes->DrcProcRes.sw_drc_weicur_pix); LOGV_ATMO("%s: sw_drc_weipre_frame:%d\n", __FUNCTION__, pAdrcProcRes->DrcProcRes.sw_drc_weipre_frame); LOGV_ATMO("%s: sw_drc_force_sgm_inv0:%d\n", __FUNCTION__, pAdrcProcRes->DrcProcRes.sw_drc_force_sgm_inv0); LOGV_ATMO("%s: sw_drc_edge_scl:%d\n", __FUNCTION__, pAdrcProcRes->DrcProcRes.sw_drc_edge_scl); LOGV_ATMO("%s: sw_drc_space_sgm_inv1:%d\n", __FUNCTION__, pAdrcProcRes->DrcProcRes.sw_drc_space_sgm_inv1); LOGV_ATMO("%s: sw_drc_space_sgm_inv0:%d\n", __FUNCTION__, pAdrcProcRes->DrcProcRes.sw_drc_space_sgm_inv0); LOGV_ATMO("%s: sw_drc_range_sgm_inv1:%d\n", __FUNCTION__, pAdrcProcRes->DrcProcRes.sw_drc_range_sgm_inv1); LOGV_ATMO("%s: sw_drc_range_sgm_inv0:%d\n", __FUNCTION__, pAdrcProcRes->DrcProcRes.sw_drc_range_sgm_inv0); LOGV_ATMO("%s: sw_drc_weig_maxl:%d\n", __FUNCTION__, pAdrcProcRes->DrcProcRes.sw_drc_weig_maxl); LOGV_ATMO("%s: sw_drc_weig_bilat:%d\n", __FUNCTION__, pAdrcProcRes->DrcProcRes.sw_drc_weig_bilat); LOGV_ATMO("%s: sw_drc_adrc_gain:%f\n", __FUNCTION__, pAdrcProcRes->DrcProcRes.sw_drc_adrc_gain); LOGV_ATMO("%s: sw_drc_iir_weight:%d\n", __FUNCTION__, pAdrcProcRes->DrcProcRes.sw_drc_iir_weight); LOGV_ATMO("%s: sw_drc_min_ogain:%d\n", __FUNCTION__, pAdrcProcRes->DrcProcRes.sw_drc_min_ogain); for(int i = 0; i < 17; i++) LOGV_ATMO("%s: sw_drc_gain_y[%d]:%d\n", __FUNCTION__, i, pAdrcProcRes->DrcProcRes.sw_drc_gain_y[i]); LOG1_ATMO( "%s:exit!\n", __FUNCTION__); } /****************************************************************************** * AdrcGetCurrData() *****************************************************************************/ void AdrcGetCurrData ( AdrcHandle_t pAdrcCtx ) { LOG1_ATMO( "%s:enter!\n", __FUNCTION__); //damp AdrcDamping(&pAdrcCtx->CurrData, &pAdrcCtx->PrevData, pAdrcCtx->drcAttr.opMode, pAdrcCtx->frameCnt); //get io data AdrcGetCurrProcRes(&pAdrcCtx->AdrcProcRes, &pAdrcCtx->CurrData, pAdrcCtx->SensorInfo.LongFrmMode, pAdrcCtx->FrameNumber, pAdrcCtx->frameCnt, pAdrcCtx->Config.OutPutLongFrame); // store current handle data to pre data for next loop pAdrcCtx->PrevData.EnvLv = pAdrcCtx->CurrData.EnvLv; pAdrcCtx->PrevData.ISO = pAdrcCtx->CurrData.ISO; if(0 != memcmp(&pAdrcCtx->PrevData.HandleData, &pAdrcCtx->CurrData.HandleData, sizeof(DrcHandleData_t))) memcpy(&pAdrcCtx->PrevData.HandleData, &pAdrcCtx->CurrData.HandleData, sizeof(DrcHandleData_t)); ++pAdrcCtx->frameCnt; LOG1_ATMO( "%s:exit!\n", __FUNCTION__); } /****************************************************************************** * AdrcProcessing() *get handle para by config and current variate *****************************************************************************/ void AdrcProcessing ( AdrcHandle_t pAdrcCtx ) { LOG1_ATMO("%s:enter!\n", __FUNCTION__); pAdrcCtx->CurrData.frameCnt = pAdrcCtx->frameCnt; //enable setting if(pAdrcCtx->drcAttr.Enable) pAdrcCtx->CurrData.Enable = true; else pAdrcCtx->CurrData.Enable = pAdrcCtx->Config.Enable; //para setting AdrcIQUpdate(pAdrcCtx); //api if(pAdrcCtx->drcAttr.opMode == DRC_OPMODE_API_OFF) LOGD_ATMO("%s: Adrc api OFF!! Current Handle data:\n", __FUNCTION__); else if(pAdrcCtx->drcAttr.opMode == DRC_OPMODE_MANU) { LOGD_ATMO("%s: Adrc api Manual!! Current Handle data:\n", __FUNCTION__); AdrcApiManualUpdate(&pAdrcCtx->CurrData, &pAdrcCtx->drcAttr.stManual); } else if(pAdrcCtx->drcAttr.opMode == DRC_OPMODE_AUTO) LOGD_ATMO("%s: Adrc api ATUO!! Current Handle data:\n", __FUNCTION__); else if(pAdrcCtx->drcAttr.opMode == DRC_OPMODE_DRC_GAIN) { LOGD_ATMO("%s: Adrc api GDRC Gain!! Current Handle data:\n", __FUNCTION__); pAdrcCtx->CurrData.HandleData.DrcGain = pAdrcCtx->drcAttr.stManual.DrcGain.DrcGain; pAdrcCtx->CurrData.HandleData.Alpha = pAdrcCtx->drcAttr.stManual.DrcGain.Alpha; pAdrcCtx->CurrData.HandleData.Clip = pAdrcCtx->drcAttr.stManual.DrcGain.Clip; } else if(pAdrcCtx->drcAttr.opMode == DRC_OPMODE_HILIT) { LOGD_ATMO("%s: Adrc api HiLit!! Current Handle data:\n", __FUNCTION__); pAdrcCtx->CurrData.HandleData.Strength = pAdrcCtx->drcAttr.stManual.HiLit.Strength; } else if(pAdrcCtx->drcAttr.opMode == DRC_OPMODE_LOCAL_TMO) { LOGD_ATMO("%s: Adrc api Local TMO!! Current Handle data:\n", __FUNCTION__); pAdrcCtx->CurrData.HandleData.LocalWeit = pAdrcCtx->drcAttr.stManual.Local.LocalWeit; pAdrcCtx->CurrData.HandleData.GlobalContrast = pAdrcCtx->drcAttr.stManual.Local.GlobalContrast; pAdrcCtx->CurrData.HandleData.LoLitContrast = pAdrcCtx->drcAttr.stManual.Local.LoLitContrast; } else if(pAdrcCtx->drcAttr.opMode == DRC_OPMODE_COMPRESS) { LOGD_ATMO("%s: Adrc api Compress!! Current Handle data:\n", __FUNCTION__); pAdrcCtx->CurrData.HandleData.Mode = pAdrcCtx->drcAttr.stManual.Compress.Mode; for(int i = 0; i < ADRC_Y_NUM; i++) pAdrcCtx->CurrData.HandleData.Manual_curve[i] = pAdrcCtx->drcAttr.stManual.Compress.Manual_curve[i]; } else LOGE_ATMO("%s: Adrc wrong mode!!!\n", __FUNCTION__); //clip drc gain if(pAdrcCtx->CurrAeResult.AEMaxRatio * pAdrcCtx->CurrData.HandleData.DrcGain > MAX_AE_DRC_GAIN) { LOGE_ATMO("%s: AERatio*DrcGain > 256!!!\n", __FUNCTION__); pAdrcCtx->CurrData.HandleData.DrcGain = MAX_AE_DRC_GAIN / pAdrcCtx->CurrAeResult.AEMaxRatio; } LOGD_ATMO("%s:Current Enable:%d DrcGain:%f Alpha:%f Clip:%f Strength:%f LocalWeit:%f GlobalContrast:%f LoLitContrast:%f CompressMode:%d\n", __FUNCTION__, pAdrcCtx->CurrData.Enable, pAdrcCtx->CurrData.HandleData.DrcGain, pAdrcCtx->CurrData.HandleData.Alpha, pAdrcCtx->CurrData.HandleData.Clip, pAdrcCtx->CurrData.HandleData.Strength, pAdrcCtx->CurrData.HandleData.LocalWeit, pAdrcCtx->CurrData.HandleData.GlobalContrast, pAdrcCtx->CurrData.HandleData.LoLitContrast , pAdrcCtx->CurrData.HandleData.Mode); //transfer data to api AdrcTranferData2Api(pAdrcCtx); //get io and store data in proc res AdrcGetCurrData(pAdrcCtx); LOG1_ATMO( "%s:exit!\n", __FUNCTION__); } /****************************************************************************** * AdrcByPassProcessing() *get handle para by config and current variate *****************************************************************************/ bool AdrcByPassProcessing ( AdrcHandle_t pAdrcCtx, AecPreResult_t AecHdrPreResult ) { LOG1_ATMO("%s:enter!\n", __FUNCTION__); bool bypass = false; float diff = 0.0; if(pAdrcCtx->frameCnt <= 2)//start frame bypass = false; else if(pAdrcCtx->drcAttr.opMode > DRC_OPMODE_API_OFF)//api bypass = false; else if(pAdrcCtx->drcAttr.opMode != pAdrcCtx->PrevData.ApiMode)//api change bypass = false; else { //EnvLv change //get current ae data from AecPreRes AdrcGetAeResult(pAdrcCtx, AecHdrPreResult); //transfer ae data to CurrHandle pAdrcCtx->CurrData.EnvLv = LIMIT_VALUE(pAdrcCtx->CurrData.EnvLv, ADRCNORMALIZEMAX, ADRCNORMALIZEMIN); pAdrcCtx->CurrData.ISO = pAdrcCtx->CurrAeResult.ISO; pAdrcCtx->CurrData.ISO = LIMIT_VALUE(pAdrcCtx->CurrData.ISO, ISOMAX, ISOMIN); //use Envlv for now diff = pAdrcCtx->PrevData.EnvLv - pAdrcCtx->CurrData.EnvLv; if(pAdrcCtx->PrevData.EnvLv == 0.0) { diff = pAdrcCtx->CurrData.EnvLv; if(diff == 0.0) bypass = true; else bypass = false; } else { diff /= pAdrcCtx->PrevData.EnvLv; if(diff >= pAdrcCtx->Config.Others.ByPassThr || diff <= (0 - pAdrcCtx->Config.Others.ByPassThr)) bypass = false; else bypass = true; } } LOG1_ATMO( "%s:CtrlEnvLv:%f PrevEnvLv:%f diff:%f ByPassThr:%f opMode:%d bypass:%d!\n", __FUNCTION__, pAdrcCtx->CurrData.EnvLv, pAdrcCtx->PrevData.EnvLv, diff, pAdrcCtx->Config.Others.ByPassThr, pAdrcCtx->drcAttr.opMode, bypass); LOG1_ATMO( "%s:exit!\n", __FUNCTION__); return bypass; } /****************************************************************************** * AdrcInit() *****************************************************************************/ XCamReturn AdrcInit ( AdrcInstanceConfig_t* pInstConfig, CamCalibDbV2Context_t* calibv2 ) { AdrcContext_s *pAdrcCtx; LOG1_ATMO("%s:enter!\n", __FUNCTION__); XCamReturn result = XCAM_RETURN_NO_ERROR; // initial checks if (pInstConfig == NULL) return (XCAM_RETURN_ERROR_PARAM); // allocate Adrc control context pAdrcCtx = (AdrcContext_s*)calloc(sizeof(AdrcContext_t), 1); if (NULL == pAdrcCtx) { LOGE_ATMO( "%s: Can't allocate Adrc context\n", __FUNCTION__); return (XCAM_RETURN_ERROR_OUTOFRANGE); } CalibDbV2_drc_t* calibv2_adrc_calib = (CalibDbV2_drc_t*)(CALIBDBV2_GET_MODULE_PTR(calibv2, adrc_calib)); // pre-initialize context memset(pAdrcCtx, 0x00, sizeof(*pAdrcCtx)); //malloc DrcGain pAdrcCtx->Config.DrcGain.len = calibv2_adrc_calib->DrcTuningPara.DrcGain.EnvLv_len; pAdrcCtx->Config.DrcGain.EnvLv = (float*)malloc(sizeof(float) * (calibv2_adrc_calib->DrcTuningPara.DrcGain.EnvLv_len)); pAdrcCtx->Config.DrcGain.DrcGain = (float*)malloc(sizeof(float) * (calibv2_adrc_calib->DrcTuningPara.DrcGain.EnvLv_len)); pAdrcCtx->Config.DrcGain.Alpha = (float*)malloc(sizeof(float) * (calibv2_adrc_calib->DrcTuningPara.DrcGain.EnvLv_len)); pAdrcCtx->Config.DrcGain.Clip = (float*)malloc(sizeof(float) * (calibv2_adrc_calib->DrcTuningPara.DrcGain.EnvLv_len)); //malloc HiLit pAdrcCtx->Config.HiLit.len = calibv2_adrc_calib->DrcTuningPara.HiLight.EnvLv_len; pAdrcCtx->Config.HiLit.EnvLv = (float*)malloc(sizeof(float) * (calibv2_adrc_calib->DrcTuningPara.HiLight.EnvLv_len)); pAdrcCtx->Config.HiLit.Strength = (float*)malloc(sizeof(float) * (calibv2_adrc_calib->DrcTuningPara.HiLight.EnvLv_len)); //malloc local pAdrcCtx->Config.Local.len = calibv2_adrc_calib->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len; pAdrcCtx->Config.Local.EnvLv = (float*)malloc(sizeof(float) * (calibv2_adrc_calib->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len)); pAdrcCtx->Config.Local.LocalWeit = (float*)malloc(sizeof(float) * (calibv2_adrc_calib->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len)); pAdrcCtx->Config.Local.GlobalContrast = (float*)malloc(sizeof(float) * (calibv2_adrc_calib->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len)); pAdrcCtx->Config.Local.LoLitContrast = (float*)malloc(sizeof(float) * (calibv2_adrc_calib->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len)); pAdrcCtx->drcAttr.Enable = false; pAdrcCtx->drcAttr.opMode = DRC_OPMODE_API_OFF; pAdrcCtx->frameCnt = 0; Config(pAdrcCtx); //set default para memcpy(&pAdrcCtx->pCalibDB, calibv2_adrc_calib, sizeof(CalibDbV2_drc_t));//load iq paras //memcpy(&pAdrcCtx->drcAttr.stAuto, calibv2_adrc_calib, sizeof(CalibDbV2_drc_t));//load iq paras to stTool pAdrcCtx->state = ADRC_STATE_INITIALIZED; pInstConfig->hAdrc = (AdrcHandle_t)pAdrcCtx; LOG1_ATMO( "%s:exit!\n", __FUNCTION__); return (XCAM_RETURN_NO_ERROR); } /****************************************************************************** * AhdrRelease() *****************************************************************************/ XCamReturn AdrcRelease ( AdrcHandle_t pAdrcCtx ) { LOG1_ATMO( "%s:enter!\n", __FUNCTION__); XCamReturn result = XCAM_RETURN_NO_ERROR; // initial checks if (NULL == pAdrcCtx) { return (XCAM_RETURN_ERROR_PARAM); } result = AdrcStop(pAdrcCtx); if (result != XCAM_RETURN_NO_ERROR) { LOGE_ATMO( "%s: AHDRStop() failed!\n", __FUNCTION__); return (result); } // check state if ((ADRC_STATE_RUNNING == pAdrcCtx->state) || (ADRC_STATE_LOCKED == pAdrcCtx->state)) { return (XCAM_RETURN_ERROR_MEM); } free(pAdrcCtx->Config.DrcGain.EnvLv); free(pAdrcCtx->Config.DrcGain.DrcGain); free(pAdrcCtx->Config.DrcGain.Alpha); free(pAdrcCtx->Config.DrcGain.Clip); free(pAdrcCtx->Config.HiLit.EnvLv); free(pAdrcCtx->Config.HiLit.Strength); free(pAdrcCtx->Config.Local.EnvLv); free(pAdrcCtx->Config.Local.LocalWeit); free(pAdrcCtx->Config.Local.GlobalContrast); free(pAdrcCtx->Config.Local.LoLitContrast); memset(pAdrcCtx, 0, sizeof(AdrcContext_t)); free(pAdrcCtx); pAdrcCtx = NULL; LOG1_ATMO( "%s:exit!\n", __FUNCTION__); return (XCAM_RETURN_NO_ERROR); }