#include "rk_aiq_uapi_atmo_int.h"
|
#include "rk_aiq_types_atmo_algo_prvt.h"
|
|
bool
|
IfTmoDataEqu
|
(
|
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_atmo_SetTool
|
(
|
CalibDbV2_tmo_t* pStore,
|
CalibDbV2_tmo_t* pInput
|
)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
|
//global luma
|
int GlobalLumaLen[3];
|
GlobalLumaLen[0] = pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv_len;
|
GlobalLumaLen[1] = pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.ISO_len;
|
GlobalLumaLen[2] = pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.Strength_len;
|
bool GlobalLumaEqu = IfTmoDataEqu(GlobalLumaLen, 3);
|
if(!GlobalLumaEqu) {
|
LOGE_ATMO("%s: Input TMO Global Luma Data length is NOT EQUAL !!!\n", __FUNCTION__ );
|
return XCAM_RETURN_ERROR_FAILED;
|
}
|
|
if(pStore->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv_len != pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv_len) {
|
free(pStore->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv);
|
free(pStore->TmoTuningPara.GlobalLuma.GlobalLumaData.ISO);
|
free(pStore->TmoTuningPara.GlobalLuma.GlobalLumaData.Strength);
|
pStore->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv =
|
(float *) malloc(sizeof(float) * pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv_len);
|
pStore->TmoTuningPara.GlobalLuma.GlobalLumaData.ISO =
|
(float *) malloc(sizeof(float) * pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv_len);
|
pStore->TmoTuningPara.GlobalLuma.GlobalLumaData.Strength =
|
(float *) malloc(sizeof(float) * pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv_len);
|
}
|
pStore->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv_len = pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv_len;
|
pStore->TmoTuningPara.GlobalLuma.GlobalLumaData.ISO_len = pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv_len;
|
pStore->TmoTuningPara.GlobalLuma.GlobalLumaData.Strength_len = pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv_len;
|
memcpy(pStore->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv,
|
pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv, sizeof(float)*pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv_len);
|
memcpy(pStore->TmoTuningPara.GlobalLuma.GlobalLumaData.ISO,
|
pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.ISO, sizeof(float)*pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv_len);
|
memcpy(pStore->TmoTuningPara.GlobalLuma.GlobalLumaData.Strength,
|
pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.Strength, sizeof(float)*pInput->TmoTuningPara.GlobalLuma.GlobalLumaData.EnvLv_len);
|
|
//high light
|
int HighLightLen[3];
|
HighLightLen[0] = pInput->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf_len;
|
HighLightLen[1] = pInput->TmoTuningPara.DetailsHighLight.HighLightData.EnvLv_len;
|
HighLightLen[2] = pInput->TmoTuningPara.DetailsHighLight.HighLightData.Strength_len;
|
bool HighLightLenEqu = IfTmoDataEqu(HighLightLen, 3);
|
if(!HighLightLenEqu) {
|
LOGE_ATMO("%s: Input TMO Hight Light Data length is NOT EQUAL !!!\n", __FUNCTION__ );
|
return XCAM_RETURN_ERROR_FAILED;
|
}
|
if(pStore->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf_len != pInput->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf_len) {
|
free(pStore->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf);
|
free(pStore->TmoTuningPara.DetailsHighLight.HighLightData.EnvLv);
|
free(pStore->TmoTuningPara.DetailsHighLight.HighLightData.Strength);
|
pStore->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf =
|
(float *) malloc(sizeof(float) * pInput->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf_len);
|
pStore->TmoTuningPara.DetailsHighLight.HighLightData.EnvLv =
|
(float *) malloc(sizeof(float) * pInput->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf_len);
|
pStore->TmoTuningPara.DetailsHighLight.HighLightData.Strength =
|
(float *) malloc(sizeof(float) * pInput->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf_len);
|
}
|
pStore->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf_len = pInput->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf_len;
|
pStore->TmoTuningPara.DetailsHighLight.HighLightData.EnvLv_len = pInput->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf_len;
|
pStore->TmoTuningPara.DetailsHighLight.HighLightData.Strength_len = pInput->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf_len;
|
memcpy(pStore->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf,
|
pInput->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf, sizeof(float)*pInput->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf_len);
|
memcpy(pStore->TmoTuningPara.DetailsHighLight.HighLightData.EnvLv,
|
pInput->TmoTuningPara.DetailsHighLight.HighLightData.EnvLv, sizeof(float)*pInput->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf_len);
|
memcpy(pStore->TmoTuningPara.DetailsHighLight.HighLightData.Strength,
|
pInput->TmoTuningPara.DetailsHighLight.HighLightData.Strength, sizeof(float)*pInput->TmoTuningPara.DetailsHighLight.HighLightData.OEPdf_len);
|
|
//low light
|
int LowLightLen[4];
|
LowLightLen[0] = pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len;
|
LowLightLen[1] = pInput->TmoTuningPara.DetailsLowLight.LowLightData.DarkPdf_len;
|
LowLightLen[2] = pInput->TmoTuningPara.DetailsLowLight.LowLightData.ISO_len;
|
LowLightLen[3] = pInput->TmoTuningPara.DetailsLowLight.LowLightData.Strength_len;
|
bool LowLightLenEqu = IfTmoDataEqu(LowLightLen, 4);
|
if(!LowLightLenEqu) {
|
LOGE_ATMO("%s: Input TMO Low Light Data length is NOT EQUAL !!!\n", __FUNCTION__ );
|
return XCAM_RETURN_ERROR_FAILED;
|
}
|
if(pStore->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len != pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len) {
|
free(pStore->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma);
|
free(pStore->TmoTuningPara.DetailsLowLight.LowLightData.DarkPdf);
|
free(pStore->TmoTuningPara.DetailsLowLight.LowLightData.ISO);
|
free(pStore->TmoTuningPara.DetailsLowLight.LowLightData.Strength);
|
pStore->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma =
|
(float *) malloc(sizeof(float) * pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len);
|
pStore->TmoTuningPara.DetailsLowLight.LowLightData.DarkPdf =
|
(float *) malloc(sizeof(float) * pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len);
|
pStore->TmoTuningPara.DetailsLowLight.LowLightData.ISO =
|
(float *) malloc(sizeof(float) * pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len);
|
pStore->TmoTuningPara.DetailsLowLight.LowLightData.Strength =
|
(float *) malloc(sizeof(float) * pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len);
|
}
|
pStore->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len = pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len;
|
pStore->TmoTuningPara.DetailsLowLight.LowLightData.DarkPdf_len = pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len;
|
pStore->TmoTuningPara.DetailsLowLight.LowLightData.ISO_len = pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len;
|
pStore->TmoTuningPara.DetailsLowLight.LowLightData.Strength_len = pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len;
|
memcpy(pStore->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma,
|
pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma, sizeof(float)*pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len);
|
memcpy(pStore->TmoTuningPara.DetailsLowLight.LowLightData.DarkPdf,
|
pInput->TmoTuningPara.DetailsLowLight.LowLightData.DarkPdf, sizeof(float)*pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len);
|
memcpy(pStore->TmoTuningPara.DetailsLowLight.LowLightData.ISO,
|
pInput->TmoTuningPara.DetailsLowLight.LowLightData.ISO, sizeof(float)*pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len);
|
memcpy(pStore->TmoTuningPara.DetailsLowLight.LowLightData.Strength,
|
pInput->TmoTuningPara.DetailsLowLight.LowLightData.Strength, sizeof(float)*pInput->TmoTuningPara.DetailsLowLight.LowLightData.FocusLuma_len);
|
|
//global tmo
|
int GlobalTMOLen[3];
|
GlobalTMOLen[0] = pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange_len;
|
GlobalTMOLen[1] = pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.EnvLv_len;
|
GlobalTMOLen[2] = pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.Strength_len;
|
bool GlobalTMOLenEqu = IfTmoDataEqu(GlobalTMOLen, 3);
|
if(!GlobalTMOLenEqu) {
|
LOGE_ATMO("%s: Input TMO GlobalTMO Data length is NOT EQUAL !!!\n", __FUNCTION__ );
|
return XCAM_RETURN_ERROR_FAILED;
|
}
|
if(pStore->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange_len != pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange_len) {
|
free(pStore->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange);
|
free(pStore->TmoTuningPara.GlobaTMO.GlobalTmoData.EnvLv);
|
free(pStore->TmoTuningPara.GlobaTMO.GlobalTmoData.Strength);
|
pStore->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange =
|
(float *) malloc(sizeof(float) * pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange_len);
|
pStore->TmoTuningPara.GlobaTMO.GlobalTmoData.EnvLv =
|
(float *) malloc(sizeof(float) * pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange_len);
|
pStore->TmoTuningPara.GlobaTMO.GlobalTmoData.Strength =
|
(float *) malloc(sizeof(float) * pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange_len);
|
}
|
pStore->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange_len = pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange_len;
|
pStore->TmoTuningPara.GlobaTMO.GlobalTmoData.EnvLv_len = pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange_len;
|
pStore->TmoTuningPara.GlobaTMO.GlobalTmoData.Strength_len = pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange_len;
|
memcpy(pStore->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange,
|
pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange, sizeof(float)*pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange_len);
|
memcpy(pStore->TmoTuningPara.GlobaTMO.GlobalTmoData.EnvLv,
|
pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.EnvLv, sizeof(float)*pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange_len);
|
memcpy(pStore->TmoTuningPara.GlobaTMO.GlobalTmoData.Strength,
|
pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.Strength, sizeof(float)*pInput->TmoTuningPara.GlobaTMO.GlobalTmoData.DynamicRange_len);
|
|
//local tmo
|
int LocalTMOLen[3];
|
LocalTMOLen[0] = pInput->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange_len;
|
LocalTMOLen[1] = pInput->TmoTuningPara.LocalTMO.LocalTmoData.EnvLv_len;
|
LocalTMOLen[2] = pInput->TmoTuningPara.LocalTMO.LocalTmoData.Strength_len;
|
bool LocalTMOLenEqu = IfTmoDataEqu(LocalTMOLen, 3);
|
if(!LocalTMOLenEqu) {
|
LOGE_ATMO("%s: Input TMO LocalTMO Data length is NOT EQUAL !!!\n", __FUNCTION__ );
|
return XCAM_RETURN_ERROR_FAILED;
|
}
|
if(pStore->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange_len != pInput->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange_len) {
|
//free
|
free(pStore->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange);
|
free(pStore->TmoTuningPara.LocalTMO.LocalTmoData.EnvLv);
|
free(pStore->TmoTuningPara.LocalTMO.LocalTmoData.Strength);
|
//malloc
|
pStore->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange =
|
(float *) malloc(sizeof(float) * pInput->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange_len);
|
pStore->TmoTuningPara.LocalTMO.LocalTmoData.EnvLv =
|
(float *) malloc(sizeof(float) * pInput->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange_len);
|
pStore->TmoTuningPara.LocalTMO.LocalTmoData.Strength =
|
(float *) malloc(sizeof(float) * pInput->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange_len);
|
//store len
|
pStore->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange_len = pInput->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange_len;
|
pStore->TmoTuningPara.LocalTMO.LocalTmoData.EnvLv_len = pInput->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange_len;
|
pStore->TmoTuningPara.LocalTMO.LocalTmoData.Strength_len = pInput->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange_len;
|
}
|
memcpy(pStore->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange,
|
pInput->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange, sizeof(float)*pInput->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange_len);
|
memcpy(pStore->TmoTuningPara.LocalTMO.LocalTmoData.EnvLv,
|
pInput->TmoTuningPara.LocalTMO.LocalTmoData.EnvLv, sizeof(float)*pInput->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange_len);
|
memcpy(pStore->TmoTuningPara.LocalTMO.LocalTmoData.Strength,
|
pInput->TmoTuningPara.LocalTMO.LocalTmoData.Strength, sizeof(float)*pInput->TmoTuningPara.LocalTMO.LocalTmoData.DynamicRange_len);
|
|
|
pStore->TmoTuningPara.Enable = pInput->TmoTuningPara.Enable;
|
pStore->TmoTuningPara.GlobalLuma.Mode = pInput->TmoTuningPara.GlobalLuma.Mode;
|
pStore->TmoTuningPara.GlobalLuma.Tolerance = pInput->TmoTuningPara.GlobalLuma.Tolerance;
|
pStore->TmoTuningPara.DetailsHighLight.Mode = pInput->TmoTuningPara.DetailsHighLight.Mode;
|
pStore->TmoTuningPara.DetailsHighLight.Tolerance = pInput->TmoTuningPara.DetailsHighLight.Tolerance;
|
pStore->TmoTuningPara.DetailsLowLight.Mode = pInput->TmoTuningPara.DetailsLowLight.Mode;
|
pStore->TmoTuningPara.DetailsLowLight.Tolerance = pInput->TmoTuningPara.DetailsLowLight.Tolerance;
|
pStore->TmoTuningPara.LocalTMO.Mode = pInput->TmoTuningPara.LocalTMO.Mode;
|
pStore->TmoTuningPara.LocalTMO.Tolerance = pInput->TmoTuningPara.LocalTMO.Tolerance;
|
pStore->TmoTuningPara.GlobaTMO.Mode = pInput->TmoTuningPara.GlobaTMO.Mode;
|
pStore->TmoTuningPara.GlobaTMO.Tolerance = pInput->TmoTuningPara.GlobaTMO.Tolerance;
|
pStore->TmoTuningPara.GlobaTMO.Enable = pInput->TmoTuningPara.GlobaTMO.Enable;
|
pStore->TmoTuningPara.GlobaTMO.IIR = pInput->TmoTuningPara.GlobaTMO.IIR;
|
pStore->TmoTuningPara.damp = pInput->TmoTuningPara.damp;
|
|
return ret;
|
}
|
|
XCamReturn
|
rk_aiq_uapi_atmo_SetAttrib
|
(
|
RkAiqAlgoContext* ctx,
|
atmo_attrib_t attr,
|
bool need_sync
|
)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
|
if(ctx == NULL) {
|
LOGE_ATMO("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return XCAM_RETURN_ERROR_PARAM;
|
}
|
|
AtmoContext_t* pAtmoCtx = (AtmoContext_t*)(ctx->AtmoInstConfig.hAtmo);
|
|
//Todo
|
pAtmoCtx->tmoAttr.opMode = attr.opMode;
|
if(attr.opMode == TMO_OPMODE_SET_LEVEL)
|
memcpy(&pAtmoCtx->tmoAttr.stSetLevel, &attr.stSetLevel, sizeof(FastMode_t));
|
if(attr.opMode == TMO_OPMODE_DARKAREA)
|
memcpy(&pAtmoCtx->tmoAttr.stDarkArea, &attr.stDarkArea, sizeof(DarkArea_t));
|
if(attr.opMode == TMO_OPMODE_TOOL)
|
ret = rk_aiq_uapi_atmo_SetTool(&pAtmoCtx->tmoAttr.stTool, &attr.stTool);
|
|
if (attr.opMode == TMO_OPMODE_AUTO) {
|
pAtmoCtx->tmoAttr.stAuto.bUpdateTmo = attr.stAuto.bUpdateTmo;
|
memcpy(&pAtmoCtx->tmoAttr.stAuto.stTmoAuto, &attr.stAuto.stTmoAuto, sizeof(atmoAttr_t));
|
}
|
else
|
pAtmoCtx->tmoAttr.stAuto.bUpdateTmo = false;
|
|
if (attr.opMode == TMO_OPMODE_MANU) {
|
pAtmoCtx->tmoAttr.stManual.bUpdateTmo = attr.stManual.bUpdateTmo;
|
memcpy(&pAtmoCtx->tmoAttr.stManual.stTmoManual, &attr.stManual.stTmoManual, sizeof(mtmoAttr_t));
|
}
|
else
|
pAtmoCtx->tmoAttr.stManual.bUpdateTmo = false;
|
|
return ret;
|
}
|
|
XCamReturn
|
rk_aiq_uapi_atmo_GetAttrib
|
(
|
RkAiqAlgoContext* ctx,
|
atmo_attrib_t* attr
|
)
|
{
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
|
if(ctx == NULL || attr == NULL) {
|
LOGE_ATMO("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return XCAM_RETURN_ERROR_PARAM;
|
}
|
|
AtmoContext_t* pAtmoCtx = (AtmoContext_t*)ctx->AtmoInstConfig.hAtmo;
|
|
attr->opMode = pAtmoCtx->tmoAttr.opMode;
|
memcpy(&attr->stAuto.stTmoAuto, &pAtmoCtx->tmoAttr.stAuto.stTmoAuto, sizeof(atmoAttr_t));
|
memcpy(&attr->stManual.stTmoManual, &pAtmoCtx->tmoAttr.stManual.stTmoManual, sizeof(mtmoAttr_t));
|
memcpy(&attr->stSetLevel, &pAtmoCtx->tmoAttr.stSetLevel, sizeof(FastMode_t));
|
memcpy(&attr->stDarkArea, &pAtmoCtx->tmoAttr.stDarkArea, sizeof(DarkArea_t));
|
ret = rk_aiq_uapi_atmo_SetTool(&attr->stTool, &pAtmoCtx->tmoAttr.stTool);
|
memcpy(&attr->stTool, &pAtmoCtx->tmoAttr.stTool, sizeof(CalibDbV2_tmo_t));
|
memcpy(&attr->CtlInfo, &pAtmoCtx->tmoAttr.CtlInfo, sizeof(TmoCurrCtlData_t));
|
memcpy(&attr->RegInfo, &pAtmoCtx->tmoAttr.RegInfo, sizeof(TmoCurrRegData_t));
|
|
return ret;
|
}
|