#include "rk_aiq_algo_ablc_itf.h"
|
#include "rk_aiq_ablc_algo.h"
|
|
|
AblcResult_t Ablc_html_params_init(AblcConfig_t *pParams)
|
{
|
AblcResult_t ret = ABLC_RET_SUCCESS;
|
|
LOG1_ABLC("%s(%d): enter!\n", __FUNCTION__, __LINE__);
|
|
if(pParams == NULL) {
|
ret = ABLC_RET_NULL_POINTER;
|
LOGE_ADPCC("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ret;
|
}
|
|
int isoBase = 50;
|
|
pParams->enable = 1;
|
for(int i = 0; i < pParams->len; i++) {
|
pParams->iso[i] = isoBase * (1 << i);
|
pParams->blc_r[i] = 200;
|
pParams->blc_gr[i] = 200;
|
pParams->blc_gb[i] = 200;
|
pParams->blc_b[i] = 200;
|
}
|
|
LOG1_ABLC("%s(%d): exit!\n", __FUNCTION__, __LINE__);
|
return ret;
|
}
|
|
AblcResult_t AblcConfig(AblcConfig_t *pParams, CalibDbV2_Ablc_t* pBlcCalib)
|
{
|
AblcResult_t res = ABLC_RET_SUCCESS;
|
|
if(pParams == NULL) {
|
LOGE_ABLC("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ABLC_RET_NULL_POINTER;
|
}
|
|
if(pBlcCalib == NULL) {
|
LOGE_ABLC("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ABLC_RET_NULL_POINTER;
|
}
|
|
pParams->enable = pBlcCalib->BlcTuningPara.enable;
|
for(int i = 0; i < pParams->len; i++) {
|
pParams->iso[i] = pBlcCalib->BlcTuningPara.BLC_Data.ISO[i];
|
pParams->blc_r[i] = pBlcCalib->BlcTuningPara.BLC_Data.R_Channel[i];
|
pParams->blc_gr[i] = pBlcCalib->BlcTuningPara.BLC_Data.Gr_Channel[i];
|
pParams->blc_gb[i] = pBlcCalib->BlcTuningPara.BLC_Data.Gb_Channel[i];
|
pParams->blc_b[i] = pBlcCalib->BlcTuningPara.BLC_Data.B_Channel[i];
|
}
|
LOGD_ABLC("%s(%d): Ablc en:%d blc:%f %f %f %f \n",
|
__FUNCTION__, __LINE__,
|
pParams->enable,
|
pParams->blc_r[0],
|
pParams->blc_gr[0],
|
pParams->blc_gb[0],
|
pParams->blc_gb[0]);
|
|
LOG1_ABLC("%s(%d)\n", __FUNCTION__, __LINE__);
|
return res;
|
}
|
|
AblcResult_t Ablc_Api_Manual_Select_Params(AblcManualAttr_t *pParams, AblcProc_t *pSelect)
|
{
|
LOG1_ABLC("%s(%d): enter!\n", __FUNCTION__, __LINE__);
|
LOGD_ABLC("%s:(%d) Ablc in Manual api!!! \n", __FUNCTION__, __LINE__);
|
|
if(pParams == NULL) {
|
LOGE_ABLC("%s(%d): NULL pointer\n", __FUNCTION__, __LINE__);
|
return ABLC_RET_NULL_POINTER;
|
}
|
|
if(pSelect == NULL) {
|
LOGE_ABLC("%s(%d): NULL pointer\n", __FUNCTION__, __LINE__);
|
return ABLC_RET_NULL_POINTER;
|
}
|
|
pSelect->enable = pParams->enable;
|
pSelect->blc_b = pParams->blc_b;
|
pSelect->blc_gb = pParams->blc_gb;
|
pSelect->blc_gr = pParams->blc_gr;
|
pSelect->blc_r = pParams->blc_r;
|
|
LOG1_ABLC("%s(%d): exit!\n", __FUNCTION__, __LINE__);
|
return ABLC_RET_SUCCESS;
|
}
|
|
AblcResult_t Ablc_Select_Params_By_ISO(AblcConfig_t *pParams, AblcProc_t *pSelect, AblcExpInfo_t *pExpInfo)
|
{
|
LOG1_ABLC("%s(%d): enter!\n", __FUNCTION__, __LINE__);
|
|
int isoLowlevel = 0;
|
int isoHighlevel = 0;
|
int lowIso = 0;
|
int highIso = 0;
|
float ratio = 0.0f;
|
int isoValue = 50;
|
int i = 0;
|
|
if(pParams == NULL) {
|
LOGE_ABLC("%s(%d): NULL pointer\n", __FUNCTION__, __LINE__);
|
return ABLC_RET_NULL_POINTER;
|
}
|
|
if(pSelect == NULL) {
|
LOGE_ABLC("%s(%d): NULL pointer\n", __FUNCTION__, __LINE__);
|
return ABLC_RET_NULL_POINTER;
|
}
|
|
if(pExpInfo == NULL) {
|
LOGE_ABLC("%s(%d): NULL pointer\n", __FUNCTION__, __LINE__);
|
return ABLC_RET_NULL_POINTER;
|
}
|
|
|
isoValue = pExpInfo->arIso[pExpInfo->hdr_mode];
|
for(i = 0; i < pParams->len - 1; i++)
|
{
|
if(isoValue >= pParams->iso[i] && isoValue <= pParams->iso[i + 1])
|
{
|
isoLowlevel = i;
|
isoHighlevel = i + 1;
|
lowIso = pParams->iso[i];
|
highIso = pParams->iso[i + 1];
|
ratio = (isoValue - lowIso ) / (float)(highIso - lowIso);
|
|
LOG1_ABLC("%s:%d iso: %d %d isovalue:%d ratio:%f \n",
|
__FUNCTION__, __LINE__,
|
lowIso, highIso, isoValue, ratio);
|
break;
|
}
|
}
|
|
if(i == pParams->len - 1) {
|
if(isoValue < pParams->iso[0])
|
{
|
isoLowlevel = 0;
|
isoHighlevel = 1;
|
ratio = 0;
|
}
|
|
if(isoValue > pParams->iso[pParams->len - 1])
|
{
|
isoLowlevel = pParams->len - 1;
|
isoHighlevel = pParams->len - 1;
|
ratio = 0;
|
}
|
}
|
|
pSelect->enable = pParams->enable;
|
|
pSelect->blc_r = (short int)(ratio * (pParams->blc_r[isoHighlevel] - pParams->blc_r[isoLowlevel])
|
+ pParams->blc_r[isoLowlevel]);
|
pSelect->blc_gr = (short int)(ratio * (pParams->blc_gr[isoHighlevel] - pParams->blc_gr[isoLowlevel])
|
+ pParams->blc_gr[isoLowlevel]);
|
pSelect->blc_gb = (short int)(ratio * (pParams->blc_gb[isoHighlevel] - pParams->blc_gb[isoLowlevel])
|
+ pParams->blc_gb[isoLowlevel]);
|
pSelect->blc_b = (short int)(ratio * (pParams->blc_b[isoHighlevel] - pParams->blc_b[isoLowlevel])
|
+ pParams->blc_b[isoLowlevel]);
|
|
LOG1_ABLC("%s(%d): exit!\n", __FUNCTION__, __LINE__);
|
return ABLC_RET_SUCCESS;
|
}
|
/******************************************************************************
|
* BlcNewMalloc()
|
***************************************************************************/
|
void BlcNewMalloc
|
(
|
AblcConfig_t* pBlcPara,
|
CalibDbV2_Ablc_t* pCalibDb
|
) {
|
LOG1_ABLC( "%s:enter!\n", __FUNCTION__);
|
|
// initial checks
|
DCT_ASSERT(pBlcPara != NULL);
|
DCT_ASSERT(pCalibDb != NULL);
|
|
if(pBlcPara->len != pCalibDb->BlcTuningPara.BLC_Data.ISO_len) {
|
free(pBlcPara->iso);
|
free(pBlcPara->blc_b);
|
free(pBlcPara->blc_gb);
|
free(pBlcPara->blc_gr);
|
free(pBlcPara->blc_r);
|
pBlcPara->len = pCalibDb->BlcTuningPara.BLC_Data.ISO_len;
|
pBlcPara->iso = (float*)malloc(sizeof(float) * (pCalibDb->BlcTuningPara.BLC_Data.ISO_len));
|
pBlcPara->blc_r = (float*)malloc(sizeof(float) * (pCalibDb->BlcTuningPara.BLC_Data.R_Channel_len));
|
pBlcPara->blc_gr = (float*)malloc(sizeof(float) * (pCalibDb->BlcTuningPara.BLC_Data.Gr_Channel_len));
|
pBlcPara->blc_gb = (float*)malloc(sizeof(float) * (pCalibDb->BlcTuningPara.BLC_Data.Gb_Channel_len));
|
pBlcPara->blc_b = (float*)malloc(sizeof(float) * (pCalibDb->BlcTuningPara.BLC_Data.B_Channel_len));
|
}
|
|
LOG1_ABLC( "%s:exit!\n", __FUNCTION__);
|
}
|
|
AblcResult_t AblcInit(AblcContext_t **ppAblcCtx, CamCalibDbV2Context_t *pCalibDb)
|
{
|
AblcContext_t * pAblcCtx;
|
|
LOG1_ABLC("%s(%d): enter!\n", __FUNCTION__, __LINE__);
|
|
pAblcCtx = (AblcContext_t *)malloc(sizeof(AblcContext_t));
|
if(pAblcCtx == NULL) {
|
LOGE_ABLC("%s(%d): NULL pointer\n", __FUNCTION__, __LINE__);
|
return ABLC_RET_NULL_POINTER;
|
}
|
|
memset(pAblcCtx, 0x00, sizeof(AblcContext_t));
|
pAblcCtx->eState = ABLC_STATE_INITIALIZED;
|
|
*ppAblcCtx = pAblcCtx;
|
|
//init params for algo work
|
pAblcCtx->attr.eMode = ABLC_OP_MODE_API_OFF;
|
pAblcCtx->isReCalculate |= 1;
|
pAblcCtx->isUpdateParam = true;
|
|
#if 1
|
CalibDbV2_Ablc_t* ablc_calib =
|
(CalibDbV2_Ablc_t*)(CALIBDBV2_GET_MODULE_PTR((void*)pCalibDb, ablc_calib));
|
//xml param
|
memcpy(&pAblcCtx->stBlcCalib, ablc_calib, sizeof(CalibDbV2_Ablc_t));
|
pAblcCtx->config.len = ablc_calib->BlcTuningPara.BLC_Data.ISO_len;
|
pAblcCtx->config.iso = (float*)malloc(sizeof(float) * (ablc_calib->BlcTuningPara.BLC_Data.ISO_len));
|
pAblcCtx->config.blc_r = (float*)malloc(sizeof(float) * (ablc_calib->BlcTuningPara.BLC_Data.R_Channel_len));
|
pAblcCtx->config.blc_gr = (float*)malloc(sizeof(float) * (ablc_calib->BlcTuningPara.BLC_Data.Gr_Channel_len));
|
pAblcCtx->config.blc_gb = (float*)malloc(sizeof(float) * (ablc_calib->BlcTuningPara.BLC_Data.Gb_Channel_len));
|
pAblcCtx->config.blc_b = (float*)malloc(sizeof(float) * (ablc_calib->BlcTuningPara.BLC_Data.B_Channel_len));
|
AblcConfig(&pAblcCtx->config, &pAblcCtx->stBlcCalib);
|
#else
|
//static init params
|
Ablc_html_params_init(&pAblcCtx->stAuto.stParams);
|
#endif
|
|
LOG1_ABLC("%s(%d): Ablc en:%d blc:%d %d %d %d \n",
|
__FUNCTION__, __LINE__,
|
pAblcCtx->config.enable,
|
pAblcCtx->config.blc_r[0],
|
pAblcCtx->config.blc_gr[0],
|
pAblcCtx->config.blc_gb[0],
|
pAblcCtx->config.blc_gb[0]);
|
|
|
LOG1_ABLC("%s(%d): exit!\n", __FUNCTION__, __LINE__);
|
return ABLC_RET_SUCCESS;
|
}
|
|
AblcResult_t AblcRelease(AblcContext_t *pAblcCtx)
|
{
|
LOG1_ABLC("%s(%d): enter!\n", __FUNCTION__, __LINE__);
|
if(pAblcCtx == NULL) {
|
LOGE_ABLC("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ABLC_RET_NULL_POINTER;
|
}
|
|
free(pAblcCtx->config.iso);
|
free(pAblcCtx->config.blc_r);
|
free(pAblcCtx->config.blc_gr);
|
free(pAblcCtx->config.blc_gb);
|
free(pAblcCtx->config.blc_b);
|
memset(pAblcCtx, 0x00, sizeof(AblcContext_t));
|
free(pAblcCtx);
|
|
LOG1_ABLC("%s(%d): exit!\n", __FUNCTION__, __LINE__);
|
return ABLC_RET_SUCCESS;
|
|
}
|
|
AblcResult_t AblcProcess(AblcContext_t *pAblcCtx, AblcExpInfo_t *pExpInfo)
|
{
|
LOG1_ABLC("%s(%d): enter!\n", __FUNCTION__, __LINE__);
|
AblcResult_t ret = ABLC_RET_SUCCESS;
|
|
if(pAblcCtx == NULL) {
|
LOGE_ABLC("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ABLC_RET_NULL_POINTER;
|
}
|
|
if(pExpInfo == NULL) {
|
LOGE_ABLC("%s(%d): null pointer \n", __FUNCTION__, __LINE__);
|
return ABLC_RET_NULL_POINTER;
|
}
|
|
memcpy(&pAblcCtx->stExpInfo, pExpInfo, sizeof(AblcExpInfo_t));
|
|
if(pAblcCtx->attr.eMode == ABLC_OP_MODE_API_OFF) {
|
LOGD_ABLC("%s:(%d) Ablc in api off !!! \n", __FUNCTION__, __LINE__);
|
ret = Ablc_Select_Params_By_ISO(&pAblcCtx->config, &pAblcCtx->ProcRes, pExpInfo);
|
}
|
else if(pAblcCtx->attr.eMode == ABLC_OP_MODE_API_TOOL) {
|
LOGD_ABLC("%s:(%d) Ablc in Tool off !!! \n", __FUNCTION__, __LINE__);
|
ret = Ablc_Select_Params_By_ISO(&pAblcCtx->config, &pAblcCtx->ProcRes, pExpInfo);
|
}
|
else if(pAblcCtx->attr.eMode == ABLC_OP_MODE_API_MANUAL)
|
ret = Ablc_Api_Manual_Select_Params(&pAblcCtx->attr.stManual, &pAblcCtx->ProcRes);
|
|
LOGD_ABLC("%s:(%d) Ablc En:%d rggb: %d %d %d %d \n",
|
__FUNCTION__, __LINE__, pAblcCtx->ProcRes.enable,
|
pAblcCtx->ProcRes.blc_r, pAblcCtx->ProcRes.blc_gr,
|
pAblcCtx->ProcRes.blc_gb, pAblcCtx->ProcRes.blc_b);
|
LOG1_ABLC("%s(%d): exit!\n", __FUNCTION__, __LINE__);
|
return ABLC_RET_SUCCESS;
|
}
|