#include "rk_aiq_uapi_adrc_int.h"
|
#include "adrc/rk_aiq_types_adrc_algo_prvt.h"
|
|
bool
|
IfDrcDataEqu
|
(
|
int* pInput,
|
int len
|
)
|
{
|
bool equ = true;
|
|
for(int i = 0; i < len - 1; i++)
|
if(pInput[i] != pInput[i + 1])
|
equ = false;
|
|
return equ;
|
}
|
|
XCamReturn
|
rk_aiq_uapi_adrc_SetTool
|
(
|
CalibDbV2_drc_t* pStore,
|
CalibDbV2_drc_t* pInput
|
)
|
{
|
LOG1_ATMO("ENTER: %s \n", __func__);
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
|
//enbale
|
pStore->DrcTuningPara.Enable = pInput->DrcTuningPara.Enable;
|
|
//drc gain
|
int DrcGainLen[4];
|
DrcGainLen[0] = pInput->DrcTuningPara.DrcGain.EnvLv_len;
|
DrcGainLen[1] = pInput->DrcTuningPara.DrcGain.DrcGain_len;
|
DrcGainLen[2] = pInput->DrcTuningPara.DrcGain.Alpha_len;
|
DrcGainLen[3] = pInput->DrcTuningPara.DrcGain.Clip_len;
|
bool DrcGainLenEqu = IfDrcDataEqu(DrcGainLen, 4);
|
if(!DrcGainLenEqu) {
|
LOGE_ATMO("%s: Input DRC DrcGain Data length is NOT EQUAL !!!\n", __FUNCTION__ );
|
return XCAM_RETURN_ERROR_FAILED;
|
}
|
if(pStore->DrcTuningPara.DrcGain.EnvLv_len != pInput->DrcTuningPara.DrcGain.EnvLv_len) {
|
//free
|
free(pStore->DrcTuningPara.DrcGain.EnvLv);
|
free(pStore->DrcTuningPara.DrcGain.DrcGain);
|
free(pStore->DrcTuningPara.DrcGain.Alpha);
|
free(pStore->DrcTuningPara.DrcGain.Clip);
|
//malloc
|
pStore->DrcTuningPara.DrcGain.EnvLv =
|
(float *) malloc(sizeof(float) * pInput->DrcTuningPara.DrcGain.EnvLv_len);
|
pStore->DrcTuningPara.DrcGain.DrcGain =
|
(float *) malloc(sizeof(float) * pInput->DrcTuningPara.DrcGain.EnvLv_len);
|
pStore->DrcTuningPara.DrcGain.Alpha =
|
(float *) malloc(sizeof(float) * pInput->DrcTuningPara.DrcGain.EnvLv_len);
|
pStore->DrcTuningPara.DrcGain.Clip =
|
(float *) malloc(sizeof(float) * pInput->DrcTuningPara.DrcGain.EnvLv_len);
|
//store len
|
pStore->DrcTuningPara.DrcGain.EnvLv_len = pInput->DrcTuningPara.DrcGain.EnvLv_len;
|
pStore->DrcTuningPara.DrcGain.DrcGain_len = pInput->DrcTuningPara.DrcGain.EnvLv_len;
|
pStore->DrcTuningPara.DrcGain.Alpha_len = pInput->DrcTuningPara.DrcGain.EnvLv_len;
|
pStore->DrcTuningPara.DrcGain.Clip_len = pInput->DrcTuningPara.DrcGain.EnvLv_len;
|
}
|
memcpy(pStore->DrcTuningPara.DrcGain.EnvLv,
|
pInput->DrcTuningPara.DrcGain.EnvLv, sizeof(float)*pInput->DrcTuningPara.DrcGain.EnvLv_len);
|
memcpy(pStore->DrcTuningPara.DrcGain.DrcGain,
|
pInput->DrcTuningPara.DrcGain.DrcGain, sizeof(float)*pInput->DrcTuningPara.DrcGain.EnvLv_len);
|
memcpy(pStore->DrcTuningPara.DrcGain.Alpha,
|
pInput->DrcTuningPara.DrcGain.Alpha, sizeof(float)*pInput->DrcTuningPara.DrcGain.EnvLv_len);
|
memcpy(pStore->DrcTuningPara.DrcGain.Clip,
|
pInput->DrcTuningPara.DrcGain.Clip, sizeof(float)*pInput->DrcTuningPara.DrcGain.EnvLv_len);
|
|
//Hi Lit
|
int HiLitLen[3];
|
DrcGainLen[0] = pInput->DrcTuningPara.HiLight.EnvLv_len;
|
DrcGainLen[1] = pInput->DrcTuningPara.HiLight.Strength_len;
|
bool HiLitLenEqu = IfDrcDataEqu(HiLitLen, 3);
|
if(!HiLitLenEqu) {
|
LOGE_ATMO("%s: Input DRC HiLit Data length is NOT EQUAL !!!\n", __FUNCTION__ );
|
return XCAM_RETURN_ERROR_FAILED;
|
}
|
if(pStore->DrcTuningPara.HiLight.EnvLv_len != pInput->DrcTuningPara.HiLight.EnvLv_len) {
|
//free
|
free(pStore->DrcTuningPara.HiLight.EnvLv);
|
free(pStore->DrcTuningPara.HiLight.Strength);
|
//malloc
|
pStore->DrcTuningPara.HiLight.EnvLv =
|
(float *) malloc(sizeof(float) * pInput->DrcTuningPara.HiLight.EnvLv_len);
|
pStore->DrcTuningPara.HiLight.Strength =
|
(float *) malloc(sizeof(float) * pInput->DrcTuningPara.HiLight.EnvLv_len);
|
//store len
|
pStore->DrcTuningPara.HiLight.EnvLv_len = pInput->DrcTuningPara.HiLight.EnvLv_len;
|
pStore->DrcTuningPara.HiLight.Strength_len = pInput->DrcTuningPara.HiLight.EnvLv_len;
|
}
|
memcpy(pStore->DrcTuningPara.HiLight.EnvLv,
|
pInput->DrcTuningPara.HiLight.EnvLv, sizeof(float)*pInput->DrcTuningPara.HiLight.EnvLv_len);
|
memcpy(pStore->DrcTuningPara.HiLight.Strength,
|
pInput->DrcTuningPara.HiLight.Strength, sizeof(float)*pInput->DrcTuningPara.HiLight.EnvLv_len);
|
|
//local
|
int LocalLen[4];
|
LocalLen[0] = pInput->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len;
|
LocalLen[1] = pInput->DrcTuningPara.LocalTMOSetting.LocalTMOData.LocalWeit_len;
|
LocalLen[2] = pInput->DrcTuningPara.LocalTMOSetting.LocalTMOData.GlobalContrast_len;
|
LocalLen[3] = pInput->DrcTuningPara.LocalTMOSetting.LocalTMOData.LoLitContrast_len;
|
bool LocalLenEqu = IfDrcDataEqu(LocalLen, 4);
|
if(!LocalLenEqu) {
|
LOGE_ATMO("%s: Input DRC Local Data length is NOT EQUAL !!!\n", __FUNCTION__ );
|
return XCAM_RETURN_ERROR_FAILED;
|
}
|
if(pStore->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len != pInput->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len) {
|
//free
|
free(pStore->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv);
|
free(pStore->DrcTuningPara.LocalTMOSetting.LocalTMOData.LocalWeit);
|
free(pStore->DrcTuningPara.LocalTMOSetting.LocalTMOData.GlobalContrast);
|
free(pStore->DrcTuningPara.LocalTMOSetting.LocalTMOData.LoLitContrast);
|
//malloc
|
pStore->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv =
|
(float *) malloc(sizeof(float) * pInput->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len);
|
pStore->DrcTuningPara.LocalTMOSetting.LocalTMOData.LocalWeit =
|
(float *) malloc(sizeof(float) * pInput->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len);
|
pStore->DrcTuningPara.LocalTMOSetting.LocalTMOData.GlobalContrast =
|
(float *) malloc(sizeof(float) * pInput->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len);
|
pStore->DrcTuningPara.LocalTMOSetting.LocalTMOData.LoLitContrast =
|
(float *) malloc(sizeof(float) * pInput->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len);
|
//store len
|
pStore->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len = pInput->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len;
|
pStore->DrcTuningPara.LocalTMOSetting.LocalTMOData.LocalWeit_len = pInput->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len;
|
pStore->DrcTuningPara.LocalTMOSetting.LocalTMOData.GlobalContrast_len = pInput->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len;
|
pStore->DrcTuningPara.LocalTMOSetting.LocalTMOData.LoLitContrast_len = pInput->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len;
|
}
|
memcpy(pStore->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv,
|
pInput->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv, sizeof(float)*pInput->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len);
|
memcpy(pStore->DrcTuningPara.LocalTMOSetting.LocalTMOData.LocalWeit,
|
pInput->DrcTuningPara.LocalTMOSetting.LocalTMOData.LocalWeit, sizeof(float)*pInput->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len);
|
memcpy(pStore->DrcTuningPara.LocalTMOSetting.LocalTMOData.GlobalContrast,
|
pInput->DrcTuningPara.LocalTMOSetting.LocalTMOData.GlobalContrast, sizeof(float)*pInput->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len);
|
memcpy(pStore->DrcTuningPara.LocalTMOSetting.LocalTMOData.LoLitContrast,
|
pInput->DrcTuningPara.LocalTMOSetting.LocalTMOData.LoLitContrast, sizeof(float)*pInput->DrcTuningPara.LocalTMOSetting.LocalTMOData.EnvLv_len);
|
|
//local other
|
pStore->DrcTuningPara.LocalTMOSetting.curPixWeit = pInput->DrcTuningPara.LocalTMOSetting.curPixWeit;
|
pStore->DrcTuningPara.LocalTMOSetting.preFrameWeit = pInput->DrcTuningPara.LocalTMOSetting.preFrameWeit;
|
pStore->DrcTuningPara.LocalTMOSetting.Range_force_sgm = pInput->DrcTuningPara.LocalTMOSetting.Range_force_sgm;
|
pStore->DrcTuningPara.LocalTMOSetting.Range_sgm_cur = pInput->DrcTuningPara.LocalTMOSetting.Range_sgm_cur;
|
pStore->DrcTuningPara.LocalTMOSetting.Range_sgm_pre = pInput->DrcTuningPara.LocalTMOSetting.Range_sgm_pre;
|
pStore->DrcTuningPara.LocalTMOSetting.Space_sgm_cur = pInput->DrcTuningPara.LocalTMOSetting.Space_sgm_cur;
|
pStore->DrcTuningPara.LocalTMOSetting.Space_sgm_pre = pInput->DrcTuningPara.LocalTMOSetting.Space_sgm_pre;
|
|
//other
|
pStore->DrcTuningPara.Edge_Weit = pInput->DrcTuningPara.Edge_Weit;
|
pStore->DrcTuningPara.IIR_frame = pInput->DrcTuningPara.IIR_frame;
|
pStore->DrcTuningPara.Tolerance = pInput->DrcTuningPara.Tolerance;
|
pStore->DrcTuningPara.damp = pInput->DrcTuningPara.damp;
|
for(int i = 0; i < ADRC_Y_NUM; i++)
|
pStore->DrcTuningPara.Scale_y[i] = pInput->DrcTuningPara.Scale_y[i];
|
|
LOG1_ATMO("EXIT: %s \n", __func__);
|
return ret;
|
}
|
|
XCamReturn
|
rk_aiq_uapi_adrc_SetAttrib(RkAiqAlgoContext *ctx,
|
drc_attrib_t attr,
|
bool need_sync)
|
{
|
LOG1_ATMO("ENTER: %s \n", __func__);
|
AdrcContext_t* pAdrcCtx = (AdrcContext_t*)(ctx->AdrcInstConfig.hAdrc);
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
|
pAdrcCtx->drcAttr.Enable = attr.Enable;
|
pAdrcCtx->drcAttr.opMode = attr.opMode;
|
if(attr.opMode == DRC_OPMODE_MANU)
|
memcpy(&pAdrcCtx->drcAttr.stManual, &attr.stManual, sizeof(mdrcAttr_t));
|
/*if(attr.opMode == DRC_OPMODE_AUTO)
|
ret = rk_aiq_uapi_adrc_SetTool(&pAdrcCtx->drcAttr.stAuto, &attr.stAuto);*/
|
if(attr.opMode == DRC_OPMODE_DRC_GAIN)
|
memcpy(&pAdrcCtx->drcAttr.stManual.DrcGain, &attr.stManual.DrcGain, sizeof(mDrcGain_t));
|
if(attr.opMode == DRC_OPMODE_HILIT)
|
memcpy(&pAdrcCtx->drcAttr.stManual.HiLit, &attr.stManual.HiLit, sizeof(mDrcHiLit_t));
|
if(attr.opMode == DRC_OPMODE_LOCAL_TMO)
|
memcpy(&pAdrcCtx->drcAttr.stManual.Local, &attr.stManual.Local, sizeof(mDrcLocal_t));
|
if(attr.opMode == DRC_OPMODE_COMPRESS)
|
memcpy(&pAdrcCtx->drcAttr.stManual.Compress, &attr.stManual.Compress, sizeof(mDrcCompress_t));
|
|
LOG1_ATMO("EXIT: %s \n", __func__);
|
return ret;
|
}
|
|
XCamReturn
|
rk_aiq_uapi_adrc_GetAttrib(RkAiqAlgoContext *ctx,
|
drc_attrib_t *attr)
|
{
|
LOG1_ATMO("ENTER: %s \n", __func__);
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
|
AdrcContext_t* pAdrcCtx = (AdrcContext_t*)ctx->AdrcInstConfig.hAdrc;
|
|
attr->Enable = pAdrcCtx->drcAttr.Enable;
|
attr->opMode = pAdrcCtx->drcAttr.opMode;
|
memcpy(&attr->Info, &pAdrcCtx->drcAttr.Info, sizeof(DrcInfo_t));
|
memcpy(&attr->stManual, &pAdrcCtx->drcAttr.stManual, sizeof(mdrcAttr_t));
|
//ret = rk_aiq_uapi_adrc_SetTool(&attr->stAuto, &pAdrcCtx->drcAttr.stAuto);
|
|
LOG1_ATMO("EXIT: %s \n", __func__);
|
return XCAM_RETURN_NO_ERROR;
|
}
|