|
#include "rk_aiq_abayernr_algo_v1.h"
|
#include "rk_aiq_abayernr_algo_itf_v1.h"
|
|
RKAIQ_BEGIN_DECLARE
|
|
Abayernr_result_v1_t Abayernr_Start_V1(Abayernr_Context_V1_t *pAbayernrCtx)
|
{
|
LOGI_ANR( "%s:enter!\n", __FUNCTION__);
|
|
// initial checks
|
if (pAbayernrCtx == NULL) {
|
return (ABAYERNR_RET_V1_NULL_POINTER);
|
}
|
|
if ((ABAYERNR_STATE_V1_RUNNING == pAbayernrCtx->eState)
|
|| (ABAYERNR_STATE_V1_LOCKED == pAbayernrCtx->eState)) {
|
return (ABAYERNR_RET_V1_FAILURE);
|
}
|
|
pAbayernrCtx->eState = ABAYERNR_STATE_V1_RUNNING;
|
|
LOGI_ANR( "%s:exit!\n", __FUNCTION__);
|
return (ABAYERNR_RET_V1_SUCCESS);
|
}
|
|
|
Abayernr_result_v1_t Abayernr_Stop_V1(Abayernr_Context_V1_t *pAbayernrCtx)
|
{
|
LOGI_ANR( "%s:enter!\n", __FUNCTION__);
|
|
// initial checks
|
if (pAbayernrCtx == NULL) {
|
return (ABAYERNR_RET_V1_NULL_POINTER);
|
}
|
|
if (ABAYERNR_STATE_V1_LOCKED == pAbayernrCtx->eState) {
|
return (ABAYERNR_RET_V1_FAILURE);
|
}
|
|
pAbayernrCtx->eState = ABAYERNR_STATE_V1_STOPPED;
|
|
LOGI_ANR( "%s:exit!\n", __FUNCTION__);
|
return (ABAYERNR_RET_V1_SUCCESS);
|
}
|
|
#if ABAYERNR_USE_JSON_FILE_V1
|
|
//anr inint
|
Abayernr_result_v1_t Abayernr_Init_Json_V1(Abayernr_Context_V1_t **ppAbayernrCtx, CamCalibDbV2Context_t *pCalibDbV2)
|
{
|
Abayernr_Context_V1_t * pAbayernrCtx;
|
|
LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
|
|
pAbayernrCtx = (Abayernr_Context_V1_t *)malloc(sizeof(Abayernr_Context_V1_t));
|
if(pAbayernrCtx == NULL) {
|
LOGE_ANR("%s(%d): malloc fail\n", __FUNCTION__, __LINE__);
|
return ABAYERNR_RET_V1_NULL_POINTER;
|
}
|
|
memset(pAbayernrCtx, 0x00, sizeof(Abayernr_Context_V1_t));
|
|
//gain state init
|
pAbayernrCtx->fRawnr_SF_Strength = 1.0;
|
|
pAbayernrCtx->eState = ABAYERNR_STATE_V1_INITIALIZED;
|
*ppAbayernrCtx = pAbayernrCtx;
|
|
pAbayernrCtx->eMode = ABAYERNR_OP_MODE_V1_AUTO;
|
pAbayernrCtx->isIQParaUpdate = false;
|
pAbayernrCtx->isGrayMode = false;
|
|
#if ABAYERNR_USE_JSON_FILE_V1
|
//read v1 params from xml
|
CalibDbV2_BayerNrV1_t* calibv2_bayernr_v1 =
|
(CalibDbV2_BayerNrV1_t*)(CALIBDBV2_GET_MODULE_PTR(pCalibDbV2, bayernr_v1));
|
bayernrV1_calibdbV2_assign(&pAbayernrCtx->bayernr_v1, calibv2_bayernr_v1);
|
|
#endif
|
|
#if RK_SIMULATOR_HW
|
//just for v2 params from html
|
|
#endif
|
|
#if ABAYERNR_USE_JSON_FILE_V1
|
pAbayernrCtx->stExpInfo.snr_mode = 1;
|
pAbayernrCtx->eParamMode = ABAYERNR_PARAM_MODE_V1_NORMAL;
|
Abayernr_ConfigSettingParam_V1(pAbayernrCtx, pAbayernrCtx->eParamMode, pAbayernrCtx->stExpInfo.snr_mode);
|
#endif
|
|
LOGD_ANR("%s(%d): bayernr %f %f %f %d %d %f", __FUNCTION__, __LINE__);
|
|
|
LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
|
return ABAYERNR_RET_V1_SUCCESS;
|
}
|
|
#else
|
|
//anr inint
|
Abayernr_result_v1_t Abayernr_Init_V1(Abayernr_Context_V1_t **ppAbayernrCtx, CamCalibDbContext_t *pCalibDb)
|
{
|
Abayernr_Context_V1_t * pAbayernrCtx;
|
|
LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
|
|
pAbayernrCtx = (Abayernr_Context_V1_t *)malloc(sizeof(Abayernr_Context_V1_t));
|
if(pAbayernrCtx == NULL) {
|
LOGE_ANR("%s(%d): malloc fail\n", __FUNCTION__, __LINE__);
|
return ABAYERNR_RET_V1_NULL_POINTER;
|
}
|
|
memset(pAbayernrCtx, 0x00, sizeof(Abayernr_Context_V1_t));
|
|
//gain state init
|
pAbayernrCtx->fRawnr_SF_Strength = 1.0;
|
|
pAbayernrCtx->eState = ABAYERNR_STATE_V1_INITIALIZED;
|
*ppAbayernrCtx = pAbayernrCtx;
|
|
pAbayernrCtx->eMode = ABAYERNR_OP_MODE_V1_AUTO;
|
pAbayernrCtx->isIQParaUpdate = false;
|
pAbayernrCtx->isGrayMode = false;
|
|
#if ABAYERNR_USE_XML_FILE_V1
|
//read v1 params from xml
|
pAbayernrCtx->stBayernrCalib = *(CalibDb_BayerNr_2_t*)(CALIBDB_GET_MODULE_PTR((void*)pCalibDb, bayerNr));
|
#endif
|
|
#if RK_SIMULATOR_HW
|
//just for v2 params from html
|
|
#endif
|
|
#if ABAYERNR_USE_XML_FILE_V1
|
pAbayernrCtx->stExpInfo.snr_mode = 1;
|
pAbayernrCtx->eParamMode = ABAYERNR_PARAM_MODE_V1_NORMAL;
|
Abayernr_ParamModeProcess_V1(pAbayernrCtx, &pAbayernrCtx->stExpInfo, &pAbayernrCtx->eParamMode);
|
#endif
|
|
LOGD_ANR("%s(%d): bayernr %f %f %f %d %d %f", __FUNCTION__, __LINE__);
|
|
|
LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
|
return ABAYERNR_RET_V1_SUCCESS;
|
}
|
#endif
|
|
//anr release
|
Abayernr_result_v1_t Abayernr_Release_V1(Abayernr_Context_V1_t *pAbayernrCtx)
|
{
|
Abayernr_result_v1_t result = ABAYERNR_RET_V1_SUCCESS;
|
LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
|
if(pAbayernrCtx == NULL) {
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ABAYERNR_RET_V1_NULL_POINTER;
|
}
|
|
result = Abayernr_Stop_V1(pAbayernrCtx);
|
if (result != ABAYERNR_RET_V1_SUCCESS) {
|
LOGE_ANR( "%s: ANRStop() failed!\n", __FUNCTION__);
|
return (result);
|
}
|
|
// check state
|
if ((ABAYERNR_STATE_V1_RUNNING == pAbayernrCtx->eState)
|
|| (ABAYERNR_STATE_V1_LOCKED == pAbayernrCtx->eState)) {
|
return (ABAYERNR_RET_V1_BUSY);
|
}
|
|
#if ABAYERNR_USE_JSON_FILE_V1
|
bayernrV1_calibdbV2_release(&pAbayernrCtx->bayernr_v1);
|
#endif
|
|
memset(pAbayernrCtx, 0x00, sizeof(Abayernr_Context_V1_t));
|
free(pAbayernrCtx);
|
|
LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
|
return ABAYERNR_RET_V1_SUCCESS;
|
}
|
|
//anr config
|
Abayernr_result_v1_t Abayernr_Prepare_V1(Abayernr_Context_V1_t *pAbayernrCtx, Abayernr_Config_V1_t* pAbayernrConfig)
|
{
|
LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
|
|
if(pAbayernrCtx == NULL) {
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ABAYERNR_RET_V1_INVALID_PARM;
|
}
|
|
if(pAbayernrConfig == NULL) {
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ABAYERNR_RET_V1_INVALID_PARM;
|
}
|
|
if(!!(pAbayernrCtx->prepare_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB)) {
|
Abayernr_IQParaUpdate_V1(pAbayernrCtx);
|
}
|
|
Abayernr_Start_V1(pAbayernrCtx);
|
|
LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
|
return ABAYERNR_RET_V1_SUCCESS;
|
}
|
|
//anr reconfig
|
Abayernr_result_v1_t Abayernr_ReConfig_V1(Abayernr_Context_V1_t *pAbayernrCtx, Abayernr_Config_V1_t* pAbayernrConfig)
|
{
|
LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
|
//need todo what?
|
|
LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
|
return ABAYERNR_RET_V1_SUCCESS;
|
}
|
|
//anr reconfig
|
Abayernr_result_v1_t Abayernr_IQParaUpdate_V1(Abayernr_Context_V1_t *pAbayernrCtx)
|
{
|
LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
|
//need todo what?
|
|
if(pAbayernrCtx->isIQParaUpdate) {
|
LOGD_ANR("IQ data reconfig\n");
|
Abayernr_ConfigSettingParam_V1(pAbayernrCtx, pAbayernrCtx->eParamMode, pAbayernrCtx->stExpInfo.snr_mode);
|
pAbayernrCtx->isIQParaUpdate = false;
|
}
|
|
LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
|
return ABAYERNR_RET_V1_SUCCESS;
|
}
|
|
|
//anr preprocess
|
Abayernr_result_v1_t Abayernr_PreProcess_V1(Abayernr_Context_V1_t *pAbayernrCtx)
|
{
|
LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
|
//need todo what?
|
|
Abayernr_IQParaUpdate_V1(pAbayernrCtx);
|
|
LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
|
return ABAYERNR_RET_V1_SUCCESS;
|
}
|
|
//anr process
|
Abayernr_result_v1_t Abayernr_Process_V1(Abayernr_Context_V1_t *pAbayernrCtx, Abayernr_ExpInfo_V1_t *pExpInfo)
|
{
|
LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
|
Abayernr_ParamMode_V1_t mode = ABAYERNR_PARAM_MODE_V1_INVALID;
|
|
if(pAbayernrCtx == NULL) {
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ABAYERNR_RET_V1_INVALID_PARM;
|
}
|
|
if(pExpInfo == NULL) {
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ABAYERNR_RET_V1_INVALID_PARM;
|
}
|
|
if(pAbayernrCtx->eState != ABAYERNR_STATE_V1_RUNNING) {
|
return ABAYERNR_RET_V1_SUCCESS;
|
}
|
|
|
Abayernr_ParamModeProcess_V1(pAbayernrCtx, pExpInfo, &mode);
|
|
if(pAbayernrCtx->eMode == ABAYERNR_OP_MODE_V1_AUTO) {
|
|
LOGD_ANR("%s(%d): \n", __FUNCTION__, __LINE__);
|
|
#if ABAYERNR_USE_XML_FILE_V1
|
if(pExpInfo->snr_mode != pAbayernrCtx->stExpInfo.snr_mode || pAbayernrCtx->eParamMode != mode) {
|
LOGD_ANR("param mode:%d snr_mode:%d\n", mode, pExpInfo->snr_mode);
|
pAbayernrCtx->eParamMode = mode;
|
Abayernr_ConfigSettingParam_V1(pAbayernrCtx, pAbayernrCtx->eParamMode, pExpInfo->snr_mode);
|
}
|
#endif
|
|
//select param
|
select_bayernrV1_params_by_ISO(&pAbayernrCtx->stAuto.stParams, &pAbayernrCtx->stAuto.stSelect, pExpInfo);
|
|
} else if(pAbayernrCtx->eMode == ABAYERNR_OP_MODE_V1_MANUAL) {
|
//TODO
|
}
|
|
memcpy(&pAbayernrCtx->stExpInfo, pExpInfo, sizeof(Abayernr_ExpInfo_V1_t));
|
|
LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
|
return ABAYERNR_RET_V1_SUCCESS;
|
|
}
|
|
|
|
//anr get result
|
Abayernr_result_v1_t Abayernr_GetProcResult_V1(Abayernr_Context_V1_t *pAbayernrCtx, Abayernr_ProcResult_V1_t* pAbayernrResult)
|
{
|
LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
|
|
if(pAbayernrCtx == NULL) {
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ABAYERNR_RET_V1_INVALID_PARM;
|
}
|
|
if(pAbayernrResult == NULL) {
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ABAYERNR_RET_V1_INVALID_PARM;
|
}
|
|
if(pAbayernrCtx->eMode == ABAYERNR_OP_MODE_V1_AUTO) {
|
pAbayernrResult->stSelect = pAbayernrCtx->stAuto.stSelect;
|
pAbayernrResult->bayernrEn = pAbayernrCtx->stAuto.bayernrEn;
|
|
} else if(pAbayernrCtx->eMode == ABAYERNR_OP_MODE_V1_MANUAL) {
|
//TODO
|
pAbayernrResult->stSelect = pAbayernrCtx->stManual.stSelect;
|
pAbayernrResult->bayernrEn = pAbayernrCtx->stManual.bayernrEn;
|
pAbayernrCtx->fRawnr_SF_Strength = 1.0;
|
}
|
|
//transfer to reg value
|
bayernrV1_fix_tranfer(&pAbayernrResult->stSelect, &pAbayernrResult->stFix, pAbayernrCtx->fRawnr_SF_Strength);
|
pAbayernrResult->stFix.rawnr_en = pAbayernrResult->bayernrEn;
|
|
LOGD_ANR("%s:%d xml:local:%d mode:%d reg: local gain:%d mfnr gain:%d mode:%d\n",
|
__FUNCTION__, __LINE__);
|
|
LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
|
return ABAYERNR_RET_V1_SUCCESS;
|
}
|
|
Abayernr_result_v1_t Abayernr_ConfigSettingParam_V1(Abayernr_Context_V1_t *pAbayernrCtx, Abayernr_ParamMode_V1_t eParamMode, int snr_mode)
|
{
|
char snr_name[CALIBDB_NR_SHARP_NAME_LENGTH];
|
char param_mode_name[CALIBDB_MAX_MODE_NAME_LENGTH];
|
memset(param_mode_name, 0x00, sizeof(param_mode_name));
|
memset(snr_name, 0x00, sizeof(snr_name));
|
|
if(pAbayernrCtx == NULL) {
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ABAYERNR_RET_V1_INVALID_PARM;
|
}
|
|
//select param mode first
|
if(eParamMode == ABAYERNR_PARAM_MODE_V1_NORMAL) {
|
sprintf(param_mode_name, "%s", "normal");
|
} else if(eParamMode == ABAYERNR_PARAM_MODE_V1_HDR) {
|
sprintf(param_mode_name, "%s", "hdr");
|
} else if(eParamMode == ABAYERNR_PARAM_MODE_V1_GRAY) {
|
sprintf(param_mode_name, "%s", "gray");
|
} else {
|
LOGE_ANR("%s(%d): not support param mode!\n", __FUNCTION__, __LINE__);
|
sprintf(param_mode_name, "%s", "normal");
|
}
|
|
|
//then select snr mode next
|
if(snr_mode == 1) {
|
sprintf(snr_name, "%s", "HSNR");
|
} else if(snr_mode == 0) {
|
sprintf(snr_name, "%s", "LSNR");
|
} else {
|
LOGE_ANR("%s(%d): not support snr mode!\n", __FUNCTION__, __LINE__);
|
sprintf(snr_name, "%s", "HSNR");
|
}
|
|
#if ABAYERNR_USE_JSON_FILE_V1
|
pAbayernrCtx->stAuto.bayernrEn = pAbayernrCtx->bayernr_v1.TuningPara.enable;
|
bayernrV1_config_setting_param_json(&pAbayernrCtx->stAuto.stParams, &pAbayernrCtx->bayernr_v1, param_mode_name, snr_name);
|
#else
|
pAbayernrCtx->stAuto.bayernrEn = pAbayernrCtx->stBayernrCalib.enable;
|
bayernrV1_config_setting_param(&pAbayernrCtx->stAuto.stParams, &pAbayernrCtx->stBayernrCalib, param_mode_name, snr_name);
|
#endif
|
|
return ABAYERNR_RET_V1_SUCCESS;
|
}
|
|
Abayernr_result_v1_t Abayernr_ParamModeProcess_V1(Abayernr_Context_V1_t *pAbayernrCtx, Abayernr_ExpInfo_V1_t *pExpInfo, Abayernr_ParamMode_V1_t *mode) {
|
Abayernr_result_v1_t res = ABAYERNR_RET_V1_SUCCESS;
|
*mode = pAbayernrCtx->eParamMode;
|
|
if(pAbayernrCtx == NULL) {
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ABAYERNR_RET_V1_INVALID_PARM;
|
}
|
|
if(pAbayernrCtx->isGrayMode) {
|
*mode = ABAYERNR_PARAM_MODE_V1_GRAY;
|
} else if(pExpInfo->hdr_mode == 0) {
|
*mode = ABAYERNR_PARAM_MODE_V1_NORMAL;
|
} else if(pExpInfo->hdr_mode >= 1) {
|
*mode = ABAYERNR_PARAM_MODE_V1_HDR;
|
} else {
|
*mode = ABAYERNR_PARAM_MODE_V1_NORMAL;
|
}
|
|
return res;
|
}
|
|
|
RKAIQ_END_DECLARE
|