#include "rk_aiq_acnr_algo_v1.h" #include "rk_aiq_acnr_algo_itf_v1.h" RKAIQ_BEGIN_DECLARE Acnr_result_t Acnr_Start_V1(Acnr_Context_V1_t *pAcnrCtx) { LOGI_ANR( "%s:enter!\n", __FUNCTION__); // initial checks if (pAcnrCtx == NULL) { return (ACNR_RET_NULL_POINTER); } if ((ACNR_STATE_RUNNING == pAcnrCtx->eState) || (ACNR_STATE_LOCKED == pAcnrCtx->eState)) { return (ACNR_RET_FAILURE); } pAcnrCtx->eState = ACNR_STATE_RUNNING; LOGI_ANR( "%s:exit!\n", __FUNCTION__); return (ACNR_RET_SUCCESS); } Acnr_result_t Acnr_Stop_V1(Acnr_Context_V1_t *pAcnrCtx) { LOGI_ANR( "%s:enter!\n", __FUNCTION__); // initial checks if (pAcnrCtx == NULL) { return (ACNR_RET_NULL_POINTER); } if (ACNR_STATE_LOCKED == pAcnrCtx->eState) { return (ACNR_RET_FAILURE); } pAcnrCtx->eState = ACNR_STATE_STOPPED; LOGI_ANR( "%s:exit!\n", __FUNCTION__); return (ACNR_RET_SUCCESS); } //anr inint Acnr_result_t Acnr_Init_V1(Acnr_Context_V1_t **ppAcnrCtx, void *pCalibDb) { Acnr_Context_V1_t * pAcnrCtx; LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__); pAcnrCtx = (Acnr_Context_V1_t *)malloc(sizeof(Acnr_Context_V1_t)); if(pAcnrCtx == NULL) { LOGE_ANR("%s(%d): malloc fail\n", __FUNCTION__, __LINE__); return ACNR_RET_NULL_POINTER; } memset(pAcnrCtx, 0x00, sizeof(Acnr_Context_V1_t)); //gain state init pAcnrCtx->fCnr_SF_Strength = 1.0; pAcnrCtx->eState = ACNR_STATE_INITIALIZED; *ppAcnrCtx = pAcnrCtx; pAcnrCtx->eMode = ACNR_OP_MODE_AUTO; pAcnrCtx->isIQParaUpdate = false; pAcnrCtx->isGrayMode = false; pAcnrCtx->isReCalculate = 1; #if ACNR_USE_XML_FILE_V1 //read v1 params from xml #if ACNR_USE_JSON_FILE_V1 pAcnrCtx->cnr_v1 = *(CalibDbV2_CNR_t *)(CALIBDBV2_GET_MODULE_PTR(pCalibDb, cnr_v1)); #else pAcnrCtx->list_cnr_v1 = (struct list_head*)(CALIBDB_GET_MODULE_PTR(pCalibDb, list_cnr_v1)); printf("%s(%d): cnrV1 list:%p\n", __FUNCTION__, __LINE__, pAcnrCtx->list_cnr_v1); #endif #endif #if RK_SIMULATOR_HW //just for v2 params from html #endif #if ACNR_USE_XML_FILE_V1 pAcnrCtx->stExpInfo.snr_mode = 1; pAcnrCtx->eParamMode = ACNR_PARAM_MODE_NORMAL; Acnr_ConfigSettingParam_V1(pAcnrCtx, pAcnrCtx->eParamMode, pAcnrCtx->stExpInfo.snr_mode); #endif LOGD_ANR("%s(%d):", __FUNCTION__, __LINE__); LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__); return ACNR_RET_SUCCESS; } //anr release Acnr_result_t Acnr_Release_V1(Acnr_Context_V1_t *pAcnrCtx) { Acnr_result_t result = ACNR_RET_SUCCESS; LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__); if(pAcnrCtx == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ACNR_RET_NULL_POINTER; } result = Acnr_Stop_V1(pAcnrCtx); if (result != ACNR_RET_SUCCESS) { LOGE_ANR( "%s: ANRStop() failed!\n", __FUNCTION__); return (result); } // check state if ((ACNR_STATE_RUNNING == pAcnrCtx->eState) || (ACNR_STATE_LOCKED == pAcnrCtx->eState)) { return (ACNR_RET_BUSY); } memset(pAcnrCtx, 0x00, sizeof(Acnr_Context_V1_t)); free(pAcnrCtx); LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__); return ACNR_RET_SUCCESS; } //anr config Acnr_result_t Acnr_Prepare_V1(Acnr_Context_V1_t *pAcnrCtx, Acnr_Config_V1_t* pAcnrConfig) { LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__); if(pAcnrCtx == NULL || pAcnrConfig == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ACNR_RET_INVALID_PARM; } if(!!(pAcnrCtx->prepare_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB)) { Acnr_IQParaUpdate_V1(pAcnrCtx); } pAcnrCtx->rawWidth = pAcnrConfig->rawWidth; pAcnrCtx->rawHeight = pAcnrConfig->rawHeight; Acnr_Start_V1(pAcnrCtx); LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__); return ACNR_RET_SUCCESS; } //anr reconfig Acnr_result_t Acnr_ReConfig_V1(Acnr_Context_V1_t *pAcnrCtx, Acnr_Config_V1_t* pAcnrConfig) { LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__); //need todo what? LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__); return ACNR_RET_SUCCESS; } //anr reconfig Acnr_result_t Acnr_IQParaUpdate_V1(Acnr_Context_V1_t *pAcnrCtx) { LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__); //need todo what? if(pAcnrCtx->isIQParaUpdate) { LOGD_ANR("IQ data reconfig\n"); Acnr_ConfigSettingParam_V1(pAcnrCtx, pAcnrCtx->eParamMode, pAcnrCtx->stExpInfo.snr_mode); pAcnrCtx->isIQParaUpdate = false; } LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__); return ACNR_RET_SUCCESS; } //anr preprocess Acnr_result_t Acnr_PreProcess_V1(Acnr_Context_V1_t *pAcnrCtx) { LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__); //need todo what? Acnr_IQParaUpdate_V1(pAcnrCtx); LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__); return ACNR_RET_SUCCESS; } //anr process Acnr_result_t Acnr_Process_V1(Acnr_Context_V1_t *pAcnrCtx, Acnr_ExpInfo_t *pExpInfo) { LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__); Acnr_ParamMode_t mode = ACNR_PARAM_MODE_INVALID; if(pAcnrCtx == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ACNR_RET_INVALID_PARM; } if(pExpInfo == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ACNR_RET_INVALID_PARM; } if(pAcnrCtx->eState != ACNR_STATE_RUNNING) { return ACNR_RET_SUCCESS; } Acnr_ParamModeProcess_V1(pAcnrCtx, pExpInfo, &mode); if(pAcnrCtx->eMode == ACNR_OP_MODE_AUTO) { LOGD_ANR("%s(%d): \n", __FUNCTION__, __LINE__); #if ACNR_USE_XML_FILE_V1 if(pExpInfo->snr_mode != pAcnrCtx->stExpInfo.snr_mode || pAcnrCtx->eParamMode != mode) { LOGD_ANR("param mode:%d snr_mode:%d\n", mode, pExpInfo->snr_mode); pAcnrCtx->eParamMode = mode; Acnr_ConfigSettingParam_V1(pAcnrCtx, pAcnrCtx->eParamMode, pExpInfo->snr_mode); } #endif //select param cnr_select_params_by_ISO_V1(&pAcnrCtx->stAuto.stParams, &pAcnrCtx->stAuto.stSelect, pExpInfo); } else if(pAcnrCtx->eMode == ACNR_OP_MODE_MANUAL) { //TODO } memcpy(&pAcnrCtx->stExpInfo, pExpInfo, sizeof(Acnr_ExpInfo_t)); pAcnrCtx->stExpInfo.rawHeight = pAcnrCtx->rawHeight; pAcnrCtx->stExpInfo.rawWidth = pAcnrCtx->rawWidth; LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__); return ACNR_RET_SUCCESS; } //anr get result Acnr_result_t Acnr_GetProcResult_V1(Acnr_Context_V1_t *pAcnrCtx, Acnr_ProcResult_V1_t* pAcnrResult) { LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__); if(pAcnrCtx == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ACNR_RET_INVALID_PARM; } if(pAcnrResult == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ACNR_RET_INVALID_PARM; } if(pAcnrCtx->eMode == ACNR_OP_MODE_AUTO) { pAcnrResult->stSelect = pAcnrCtx->stAuto.stSelect; } else if(pAcnrCtx->eMode == ACNR_OP_MODE_MANUAL) { //TODO pAcnrResult->stSelect = pAcnrCtx->stManual.stSelect; pAcnrCtx->fCnr_SF_Strength = 1.0; } //transfer to reg value cnr_fix_transfer_V1(&pAcnrResult->stSelect, &pAcnrResult->stFix, &pAcnrCtx->stExpInfo, pAcnrCtx->fCnr_SF_Strength); 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 ACNR_RET_SUCCESS; } Acnr_result_t Acnr_ConfigSettingParam_V1(Acnr_Context_V1_t *pAcnrCtx, Acnr_ParamMode_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(pAcnrCtx == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ACNR_RET_INVALID_PARM; } //select param mode first if(eParamMode == ACNR_PARAM_MODE_NORMAL) { sprintf(param_mode_name, "%s", "normal"); } else if(eParamMode == ACNR_PARAM_MODE_HDR) { sprintf(param_mode_name, "%s", "hdr"); } else if(eParamMode == ACNR_PARAM_MODE_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:%d!\n", __FUNCTION__, __LINE__, snr_mode); sprintf(snr_name, "%s", "LSNR"); } #if ACNR_USE_JSON_FILE_V1 cnr_config_setting_param_json_V1(&pAcnrCtx->stAuto.stParams, &pAcnrCtx->cnr_v1, param_mode_name, snr_name); #else cnr_config_setting_param_V1(&pAcnrCtx->stAuto.stParams, pAcnrCtx->list_cnr_v1, param_mode_name, snr_name); #endif return ACNR_RET_SUCCESS; } Acnr_result_t Acnr_ParamModeProcess_V1(Acnr_Context_V1_t *pAcnrCtx, Acnr_ExpInfo_t *pExpInfo, Acnr_ParamMode_t *mode) { Acnr_result_t res = ACNR_RET_SUCCESS; *mode = pAcnrCtx->eParamMode; if(pAcnrCtx == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ACNR_RET_INVALID_PARM; } if(pAcnrCtx->isGrayMode) { *mode = ACNR_PARAM_MODE_GRAY; } else if(pExpInfo->hdr_mode == 0) { *mode = ACNR_PARAM_MODE_NORMAL; } else if(pExpInfo->hdr_mode >= 1) { *mode = ACNR_PARAM_MODE_HDR; } else { *mode = ACNR_PARAM_MODE_NORMAL; } return res; } RKAIQ_END_DECLARE