#include "rk_aiq_algo_ablc_itf.h" #include "rk_aiq_ablc_algo.h" AblcResult_t AblcJsonParamInit(AblcParams_t *pParams, AblcParaV2_t* pBlcCalibParams) { AblcResult_t res = ABLC_RET_SUCCESS; if(pParams == NULL || pBlcCalibParams == NULL) { LOGE_ABLC("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABLC_RET_NULL_POINTER; } pParams->enable = pBlcCalibParams->enable; for(int i = 0; i < pParams->len; i++) { pParams->iso[i] = pBlcCalibParams->BLC_Data.ISO[i]; pParams->blc_r[i] = pBlcCalibParams->BLC_Data.R_Channel[i]; pParams->blc_gr[i] = pBlcCalibParams->BLC_Data.Gr_Channel[i]; pParams->blc_gb[i] = pBlcCalibParams->BLC_Data.Gb_Channel[i]; pParams->blc_b[i] = pBlcCalibParams->BLC_Data.B_Channel[i]; LOGD_ABLC("%s(%d): Ablc en:%d iso:%d blc:%f %f %f %f \n", __FUNCTION__, __LINE__, pParams->enable, pParams->iso[i], pParams->blc_r[i], pParams->blc_gr[i], pParams->blc_gb[i], pParams->blc_b[i]); } LOG1_ABLC("%s(%d)\n", __FUNCTION__, __LINE__); return res; } AblcResult_t Ablc_Select_Params_By_ISO(AblcParams_t *pParams, AblcSelect_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; } if(pParams->len < 1) { LOGE_ABLC("%s(%d): param len is less than 1!\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]); LOGD_ABLC("%s:(%d) Ablc En:%d ISO:%d isoLowlevel:%d isoHighlevel:%d rggb: %d %d %d %d \n", __FUNCTION__, __LINE__, pSelect->enable, isoValue, isoLowlevel, isoHighlevel, pSelect->blc_r, pSelect->blc_gr, pSelect->blc_gb, pSelect->blc_b); LOG1_ABLC("%s(%d): exit!\n", __FUNCTION__, __LINE__); return ABLC_RET_SUCCESS; } /****************************************************************************** * BlcNewMalloc() ***************************************************************************/ void BlcNewMalloc ( AblcParams_t* pBlcPara, AblcParaV2_t* pBlcCalibParams ) { LOG1_ABLC( "%s:enter!\n", __FUNCTION__); // initial checks DCT_ASSERT(pBlcPara != NULL); DCT_ASSERT(pBlcCalibParams != NULL); if(pBlcPara->len != pBlcCalibParams->BLC_Data.ISO_len) { if(pBlcPara->iso) free(pBlcPara->iso); if(pBlcPara->blc_b) free(pBlcPara->blc_b); if(pBlcPara->blc_gb) free(pBlcPara->blc_gb); if(pBlcPara->blc_gr) free(pBlcPara->blc_gr); if(pBlcPara->blc_r) free(pBlcPara->blc_r); pBlcPara->len = pBlcCalibParams->BLC_Data.ISO_len; pBlcPara->iso = (float*)malloc(sizeof(float) * (pBlcCalibParams->BLC_Data.ISO_len)); pBlcPara->blc_r = (float*)malloc(sizeof(float) * (pBlcCalibParams->BLC_Data.R_Channel_len)); pBlcPara->blc_gr = (float*)malloc(sizeof(float) * (pBlcCalibParams->BLC_Data.Gr_Channel_len)); pBlcPara->blc_gb = (float*)malloc(sizeof(float) * (pBlcCalibParams->BLC_Data.Gb_Channel_len)); pBlcPara->blc_b = (float*)malloc(sizeof(float) * (pBlcCalibParams->BLC_Data.B_Channel_len)); } LOG1_ABLC( "%s:exit!\n", __FUNCTION__); } AblcResult_t AblcParamsUpdate(AblcContext_t *pAblcCtx, CalibDbV2_Ablc_t *pCalibDb) { LOG1_ABLC("%s(%d): enter!\n", __FUNCTION__, __LINE__); AblcResult_t ret = ABLC_RET_SUCCESS; if(pAblcCtx == NULL || pCalibDb == NULL) { LOGE_ABLC("%s(%d): NULL pointer\n", __FUNCTION__, __LINE__); return ABLC_RET_NULL_POINTER; } //blc0 BlcNewMalloc(&pAblcCtx->stBlc0Params, &pCalibDb->BlcTuningPara); AblcJsonParamInit(&pAblcCtx->stBlc0Params, &pCalibDb->BlcTuningPara); //blc1 if (CHECK_ISP_HW_V3X()) { BlcNewMalloc(&pAblcCtx->stBlc1Params, &pCalibDb->Blc1TuningPara); AblcJsonParamInit(&pAblcCtx->stBlc1Params, &pCalibDb->Blc1TuningPara); } return ret; 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->eMode = ABLC_OP_MODE_AUTO; pAblcCtx->isReCalculate |= 1; pAblcCtx->isUpdateParam = true; CalibDbV2_Ablc_t* ablc_calib = (CalibDbV2_Ablc_t*)(CALIBDBV2_GET_MODULE_PTR((void*)pCalibDb, ablc_calib)); memcpy(&pAblcCtx->stBlcCalib, ablc_calib, sizeof(pAblcCtx->stBlcCalib)); AblcParamsUpdate(pAblcCtx, ablc_calib); 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; } if(pAblcCtx->stBlc0Params.iso) free(pAblcCtx->stBlc0Params.iso); if(pAblcCtx->stBlc0Params.blc_b) free(pAblcCtx->stBlc0Params.blc_b); if(pAblcCtx->stBlc0Params.blc_gb) free(pAblcCtx->stBlc0Params.blc_gb); if(pAblcCtx->stBlc0Params.blc_gr) free(pAblcCtx->stBlc0Params.blc_gr); if(pAblcCtx->stBlc0Params.blc_r) free(pAblcCtx->stBlc0Params.blc_r); if(pAblcCtx->stBlc1Params.iso) free(pAblcCtx->stBlc1Params.iso); if(pAblcCtx->stBlc1Params.blc_b) free(pAblcCtx->stBlc1Params.blc_b); if(pAblcCtx->stBlc1Params.blc_gb) free(pAblcCtx->stBlc1Params.blc_gb); if(pAblcCtx->stBlc1Params.blc_gr) free(pAblcCtx->stBlc1Params.blc_gr); if(pAblcCtx->stBlc1Params.blc_r) free(pAblcCtx->stBlc1Params.blc_r); 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->eMode == ABLC_OP_MODE_AUTO) { LOGD_ABLC("%s:(%d) Ablc auto !!! \n", __FUNCTION__, __LINE__); ret = Ablc_Select_Params_By_ISO(&pAblcCtx->stBlc0Params, &pAblcCtx->stBlc0Select, pExpInfo); pAblcCtx->ProcRes.enable = pAblcCtx->stBlc0Select.enable; pAblcCtx->ProcRes.blc_r = pAblcCtx->stBlc0Select.blc_r; pAblcCtx->ProcRes.blc_gr = pAblcCtx->stBlc0Select.blc_gr; pAblcCtx->ProcRes.blc_gb = pAblcCtx->stBlc0Select.blc_gb; pAblcCtx->ProcRes.blc_b = pAblcCtx->stBlc0Select.blc_b; if (CHECK_ISP_HW_V3X()) { if(pAblcCtx->stBlc1Params.enable) { ret = Ablc_Select_Params_By_ISO(&pAblcCtx->stBlc1Params, &pAblcCtx->stBlc1Select, pExpInfo); } pAblcCtx->stBlc1Select.enable = pAblcCtx->stBlc1Params.enable; pAblcCtx->ProcRes.blc1_enable = pAblcCtx->stBlc1Select.enable; pAblcCtx->ProcRes.blc1_r = pAblcCtx->stBlc1Select.blc_r; pAblcCtx->ProcRes.blc1_gr = pAblcCtx->stBlc1Select.blc_gr; pAblcCtx->ProcRes.blc1_gb = pAblcCtx->stBlc1Select.blc_gb; pAblcCtx->ProcRes.blc1_b = pAblcCtx->stBlc1Select.blc_b; } } else if(pAblcCtx->eMode == ABLC_OP_MODE_MANUAL) { LOGD_ABLC("%s:(%d) Ablc manual !!! \n", __FUNCTION__, __LINE__); pAblcCtx->ProcRes.enable = pAblcCtx->stBlc0Manual.enable; pAblcCtx->ProcRes.blc_r = pAblcCtx->stBlc0Manual.blc_r; pAblcCtx->ProcRes.blc_gr = pAblcCtx->stBlc0Manual.blc_gr; pAblcCtx->ProcRes.blc_gb = pAblcCtx->stBlc0Manual.blc_gb; pAblcCtx->ProcRes.blc_b = pAblcCtx->stBlc0Manual.blc_b; if (CHECK_ISP_HW_V3X()) { pAblcCtx->ProcRes.blc1_enable = pAblcCtx->stBlc1Manual.enable; pAblcCtx->ProcRes.blc1_r = pAblcCtx->stBlc1Manual.blc_r; pAblcCtx->ProcRes.blc1_gr = pAblcCtx->stBlc1Manual.blc_gr; pAblcCtx->ProcRes.blc1_gb = pAblcCtx->stBlc1Manual.blc_gb; pAblcCtx->ProcRes.blc1_b = pAblcCtx->stBlc1Manual.blc_b; } } else { LOGE_ABLC("%s(%d): not support mode:%d!\n", __FUNCTION__, __LINE__, pAblcCtx->eMode); } LOGD_ABLC("%s(%d): Ablc en:%d blc:%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); if (CHECK_ISP_HW_V3X()) { LOGD_ABLC("%s(%d): Ablc1 en:%d blc:%d %d %d %d \n", __FUNCTION__, __LINE__, pAblcCtx->ProcRes.blc1_enable, pAblcCtx->ProcRes.blc1_r, pAblcCtx->ProcRes.blc1_gr, pAblcCtx->ProcRes.blc1_gb, pAblcCtx->ProcRes.blc1_b); } LOG1_ABLC("%s(%d): exit!\n", __FUNCTION__, __LINE__); return ABLC_RET_SUCCESS; }