/****************************************************************************** 
 | 
 * 
 | 
 * 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); 
 | 
} 
 |