#include "rk_aiq_abayer2dnr_algo_bayernr_v2.h" RKAIQ_BEGIN_DECLARE Abayer2dnr_result_V2_t bayer2dnr_select_params_by_ISO_V2(RK_Bayer2dnr_Params_V2_t *pParams, RK_Bayer2dnr_Params_V2_Select_t *pSelect, Abayer2dnr_ExpInfo_V2_t *pExpInfo) { Abayer2dnr_result_V2_t res = ABAYER2DNR_RET_SUCCESS; int iso = 50; if(pParams == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYER2DNR_RET_NULL_POINTER; } if(pSelect == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYER2DNR_RET_NULL_POINTER; } if(pExpInfo == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYER2DNR_RET_NULL_POINTER; } iso = pExpInfo->arIso[pExpInfo->hdr_mode]; LOGD_ANR("%s:%d iso:%d \n", __FUNCTION__, __LINE__, iso); int isoGainStd[RK_BAYER2DNR_V2_MAX_ISO_NUM]; int isoGain = MAX(int(iso / 50), 1); int isoGainLow = 0; int isoGainHig = 0; int isoGainCorrect = 1; int isoLevelLow = 0; int isoLevelHig = 0; int isoLevelCorrect = 0; int i, j; float tmpf; #ifndef RK_SIMULATOR_HW for(int i = 0; i < RK_BAYER2DNR_V2_MAX_ISO_NUM; i++) { isoGainStd[i] = pParams->iso[i] / 50; } #else for(int i = 0; i < RK_BAYER2DNR_V2_MAX_ISO_NUM; i++) { isoGainStd[i] = 1 * (1 << i); } #endif for (i = 0; i < RK_BAYER2DNR_V2_MAX_ISO_NUM - 1; i++) { if (isoGain >= isoGainStd[i] && isoGain <= isoGainStd[i + 1]) { isoGainLow = isoGainStd[i]; isoGainHig = isoGainStd[i + 1]; isoLevelLow = i; isoLevelHig = i + 1; isoGainCorrect = ((isoGain - isoGainStd[i]) <= (isoGainStd[i + 1] - isoGain)) ? isoGainStd[i] : isoGainStd[i + 1]; isoLevelCorrect = ((isoGain - isoGainStd[i]) <= (isoGainStd[i + 1] - isoGain)) ? i : (i + 1); } } LOGD_ANR("%s:%d iso:%d high:%d low:%d\n", __FUNCTION__, __LINE__, isoGain, isoGainHig, isoGainLow); pSelect->enable = pParams->enable; pSelect->hdrdgain_ctrl_en = pParams->hdrdgain_ctrl_en; pSelect->filter_strength = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * pParams->filter_strength[isoLevelLow] + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * pParams->filter_strength[isoLevelHig]; tmpf = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * pParams->gauss_guide[isoLevelLow] + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * pParams->gauss_guide[isoLevelHig]; pSelect->gauss_guide = tmpf != 0; for (i = 0; i < 16; i++) { pSelect->lumapoint[i] = pParams->lumapoint[i]; pSelect->sigma[i] = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * pParams->sigma[isoLevelLow][i] + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * pParams->sigma[isoLevelHig][i]; } pSelect->edgesofts = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * pParams->edgesofts[isoLevelLow] + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * pParams->edgesofts[isoLevelHig]; pSelect->ratio = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * pParams->ratio[isoLevelLow] + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * pParams->ratio[isoLevelHig]; pSelect->weight = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * pParams->weight[isoLevelLow] + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * pParams->weight[isoLevelHig]; pSelect->pix_diff = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * pParams->pix_diff[isoLevelLow] + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * pParams->pix_diff[isoLevelHig]; pSelect->diff_thld = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * pParams->diff_thld[isoLevelLow] + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * pParams->diff_thld[isoLevelHig]; pSelect->hdr_dgain_scale_s = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * pParams->hdr_dgain_scale_s[isoLevelLow] + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * pParams->hdr_dgain_scale_s[isoLevelHig]; pSelect->hdr_dgain_scale_m = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * pParams->hdr_dgain_scale_m[isoLevelLow] + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * pParams->hdr_dgain_scale_m[isoLevelHig]; return res; } unsigned short bayer2dnr_get_trans_V2(int tmpfix) { int logtablef[65] = {0, 1465, 2909, 4331, 5731, 7112, 8472, 9813, 11136, 12440, 13726, 14995, 16248, 17484, 18704, 19908, 21097, 22272, 23432, 24578, 25710, 26829, 27935, 29028, 30109, 31177, 32234, 33278, 34312, 35334, 36345, 37346, 38336, 39315, 40285, 41245, 42195, 43136, 44068, 44990, 45904, 46808, 47704, 48592, 49472, 50343, 51207, 52062, 52910, 53751, 54584, 55410, 56228, 57040, 57844, 58642, 59433, 60218, 60996, 61768, 62534, 63293, 64047, 64794, 65536 }; int logprecision = 6; int logfixbit = 16; int logtblbit = 16; int logscalebit = 12; int logfixmul = (1 << logfixbit); long long x8, one = 1; long long gx, n = 0, ix1, ix2, dp; long long lt1, lt2, dx, fx; int i, j = 1; x8 = tmpfix + (1 << 8); // find highest bit for (i = 0; i < 32; i++) { if (x8 & j) { n = i; } j = j << 1; } gx = x8 - (one << n); gx = gx * (one << logprecision) * logfixmul; gx = gx / (one << n); ix1 = gx >> logfixbit; dp = gx - ix1 * logfixmul; ix2 = ix1 + 1; lt1 = logtablef[ix1]; lt2 = logtablef[ix2]; dx = lt1 * (logfixmul - dp) + lt2 * dp; fx = dx + (n - 8) * (one << (logfixbit + logtblbit)); fx = fx + (one << (logfixbit + logtblbit - logscalebit - 1)); fx = fx >> (logfixbit + logtblbit - logscalebit); return fx; } Abayer2dnr_result_V2_t bayer2dnr_fix_transfer_V2(RK_Bayer2dnr_Params_V2_Select_t* pSelect, RK_Bayer2dnr_Fix_V2_t *pFix, rk_aiq_bayer2dnr_strength_v2_t *pStrength, Abayer2dnr_ExpInfo_V2_t *pExpInfo) { //--------------------------- v2 params ----------------------------// float frameiso[3]; float frameEt[3]; float fdGain[3]; int dGain[3] = {0}; int i = 0; int ypos[8] = {4, 4, 4, 3, 3, 2, 2, 1}; int xpos[8] = {4, 2, 0, 3, 1, 2, 0, 1}; float tmp1, tmp2, edgesofts; int bayernr_sw_bil_gauss_weight[16]; int tmp; float fStrength = 1.0; if(pSelect == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYER2DNR_RET_NULL_POINTER; } if(pFix == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYER2DNR_RET_NULL_POINTER; } if(pExpInfo == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYER2DNR_RET_NULL_POINTER; } if(pStrength == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYER2DNR_RET_NULL_POINTER; } if(pStrength->strength_enable) { fStrength = pStrength->percent; } if(fStrength <= 0.0f) { fStrength = 0.000001; } LOGD_ANR("api enalbe:%d api:strength:%f fStrength:%f\n", pStrength->strength_enable, pStrength->percent, fStrength); // hdr gain int framenum = pExpInfo->hdr_mode + 1; frameiso[0] = pExpInfo->arIso[0]; frameiso[1] = pExpInfo->arIso[1]; frameiso[2] = pExpInfo->arIso[2]; frameEt[0] = pExpInfo->arTime[0]; frameEt[1] = pExpInfo->arTime[1]; frameEt[2] = pExpInfo->arTime[2]; for (i = 0; i < framenum; i++) { fdGain[i] = frameiso[i] * frameEt[i]; LOGD_ANR("bayernrv2 idx[%d] iso:%f time:%f dgain:%f\n", i, frameiso[i], frameEt[i], fdGain[i]); } for (i = 0; i < framenum; i++) { fdGain[i] = fdGain[framenum - 1] / fdGain[i]; dGain[i] = int(fdGain[i] * (1 << FIXNLMCALC)); LOGD_ANR("bayernrv2 idx[%d] fdgain:%f dgain:%d \n", i, fdGain[i], dGain[i]); } //ISP_BAYNR_3A00_CTRL pFix->baynr_lg2_mode = 0x00; pFix->baynr_gauss_en = pSelect->gauss_guide; pFix->baynr_log_bypass = 0; pFix->baynr_en = pSelect->enable; //pFix->bayernr_gray_mode = 0; // ISP_BAYNR_3A00_DGAIN0-2 for(i = 0; i < framenum; i++) { tmp = dGain[i] / ( 1 << (FIXNLMCALC - FIXGAINBIT)); pFix->baynr_dgain[i] = CLIP(tmp, 0, 0xffff); } if(pSelect->hdrdgain_ctrl_en) { //lc if(framenum == 2) { LOGD_ANR("lc before bayernr dgain:%d\n", pFix->baynr_dgain[0]); tmp = pFix->baynr_dgain[0] * pSelect->hdr_dgain_scale_s; pFix->baynr_dgain[0] = CLIP(tmp, 0, 0xffff); LOGD_ANR("lc after bayernr dgain:%d sacale_s:%f\n ", pFix->baynr_dgain[0], pSelect->hdr_dgain_scale_s); } if(framenum == 3) { LOGD_ANR("lc before bayernr dgain:%d %d\n", pFix->baynr_dgain[0], pFix->baynr_dgain[1]); tmp = pFix->baynr_dgain[0] * pSelect->hdr_dgain_scale_s; pFix->baynr_dgain[0] = CLIP(tmp, 0, 0xffff); tmp = pFix->baynr_dgain[1] * pSelect->hdr_dgain_scale_m; pFix->baynr_dgain[1] = CLIP(tmp, 0, 0xffff); LOGD_ANR("lc after bayernr dgain:%d %d scale:%f %f\n ", pFix->baynr_dgain[0], pFix->baynr_dgain[1], pSelect->hdr_dgain_scale_s, pSelect->hdr_dgain_scale_m); } } //wjm get gain if(framenum > 1) { LOGD_ANR("wjm before dgain[0]:%d \n ", pFix->baynr_dgain[0]); //wjm clip double maxsigma = (1 << 14) - 1; double maxgain = pSelect->sigma[0]; for(i = 0; i < 16; i++) { if(maxgain < pSelect->sigma[i]) { maxgain = pSelect->sigma[i]; } } LOGD_ANR("wjm maxgain:%f\n", maxgain); maxgain = maxsigma / maxgain; tmp = maxgain * (1 << 8); LOGD_ANR("wjm tmp:%d\n", tmp); tmp = MIN(pFix->baynr_dgain[0], tmp); pFix->baynr_dgain[0] = CLIP(tmp, 0, 0xffff); LOGD_ANR("wjm after hdr mode maxsigma:%f maxgain:%f tmp:%d dgain[0]:%d \n ", maxsigma, maxgain, tmp, pFix->baynr_dgain[0]); if(framenum > 2) { tmp = MIN(pFix->baynr_dgain[1], tmp); pFix->baynr_dgain[1] = CLIP(tmp, 0, 0xffff); } } // ISP_BAYNR_3A00_PIXDIFF tmp = pSelect->pix_diff; pFix->baynr_pix_diff = CLIP(tmp, 0, 0x3fff); // ISP_BAYNR_3A00_THLD tmp = pSelect->diff_thld; pFix->baynr_diff_thld = CLIP(tmp, 0, 0x3ff); tmp = (int)(pSelect->ratio / pSelect->filter_strength / fStrength * (1 << 10)); pFix->baynr_softthld = CLIP(tmp, 0, 0x3ff); // ISP_BAYNR_3A00_W1_STRENG tmp = (int)(pSelect->filter_strength * fStrength * (1 << FIXBILSTRG)); pFix->bltflt_streng = CLIP(tmp, 0, 0xfff); tmp = (int)(pSelect->weight * fStrength * (1 << 10)); pFix->baynr_reg_w1 = CLIP(tmp, 0, 0x3ff); // ISP_BAYNR_3A00_SIGMAX0-15 ISP_BAYNR_3A00_SIGMAY0-15 for(i = 0; i < 16; i++) { //pFix->sigma_x[i] = bayernr_get_trans_V2(pSelect->bayernrv2_filter_lumapoint[i]); tmp = pSelect->lumapoint[i]; pFix->sigma_x[i] = CLIP(tmp, 0, 0xffff); tmp = pSelect->sigma[i]; pFix->sigma_y[i] = CLIP(tmp, 0, 0xffff); } // ISP_BAYNR_3A00_WRIT_D #if 0 pFix->weit_d[0] = 0x178; pFix->weit_d[1] = 0x249; pFix->weit_d[2] = 0x31d; #else edgesofts = pSelect->edgesofts * fStrength; if(edgesofts > 16.0) { edgesofts = 16.0; } for(i = 0; i < 8; i++) { tmp1 = (float)(ypos[i] * ypos[i] + xpos[i] * xpos[i]); tmp1 = tmp1 / (2 * edgesofts * edgesofts); tmp2 = expf(-tmp1); bayernr_sw_bil_gauss_weight[i] = (int)(tmp1 * (EXP2RECISION_FIX / (1 << 7))); bayernr_sw_bil_gauss_weight[i + 8] = (int)(tmp2 * (1 << FIXVSTINV)); } if(pExpInfo->gray_mode) { //gray mode tmp = bayernr_sw_bil_gauss_weight[12]; pFix->weit_d[0] = CLIP(tmp, 0, 0x3ff); tmp = bayernr_sw_bil_gauss_weight[10]; pFix->weit_d[1] = CLIP(tmp, 0, 0x3ff); tmp = bayernr_sw_bil_gauss_weight[11]; pFix->weit_d[2] = CLIP(tmp, 0, 0x3ff); } else { tmp = bayernr_sw_bil_gauss_weight[13]; pFix->weit_d[0] = CLIP(tmp, 0, 0x3ff); tmp = bayernr_sw_bil_gauss_weight[14]; pFix->weit_d[1] = CLIP(tmp, 0, 0x3ff); tmp = bayernr_sw_bil_gauss_weight[15]; pFix->weit_d[2] = CLIP(tmp, 0, 0x3ff); } #endif pFix->lg2_off = 0x100; pFix->lg2_lgoff = 0x8000; pFix->dat_max = 0xfffff; bayer2dnr_fix_printf_V2(pFix); return ABAYER2DNR_RET_SUCCESS; } Abayer2dnr_result_V2_t bayer2dnr_fix_printf_V2(RK_Bayer2dnr_Fix_V2_t * pFix) { //FILE *fp = fopen("bayernr_regsiter.dat", "wb+"); Abayer2dnr_result_V2_t res = ABAYER2DNR_RET_SUCCESS; if(pFix == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYER2DNR_RET_NULL_POINTER; } LOGD_ANR("%s:(%d) ############# bayernr2D enter######################## \n", __FUNCTION__, __LINE__); //ISP_BAYNR_3A00_CTRL(0x0000) LOGD_ANR("(0x0000) gauss_en:0x%x log_bypass:0x%x en:0x%x \n", pFix->baynr_gauss_en, pFix->baynr_log_bypass, pFix->baynr_en); // ISP_BAYNR_3A00_DGAIN0-2 (0x0004 - 0x0008) for(int i = 0; i < 3; i++) { LOGD_ANR("(0x0004 - 0x0008) dgain[%d]:0x%x \n", i, pFix->baynr_dgain[i]); } // ISP_BAYNR_3A00_PIXDIFF(0x000c) LOGD_ANR("(0x000c) pix_diff:0x%x \n", pFix->baynr_pix_diff); // ISP_BAYNR_3A00_THLD(0x0010) LOGD_ANR("(0x000d) diff_thld:0x%x softthld:0x%x \n", pFix->baynr_diff_thld, pFix->baynr_softthld); // ISP_BAYNR_3A00_W1_STRENG(0x0014) LOGD_ANR("(0x0014) bltflt_streng:0x%x reg_w1:0x%x \n", pFix->bltflt_streng, pFix->baynr_reg_w1); // ISP_BAYNR_3A00_SIGMAX0-15(0x0018 - 0x0034) for(int i = 0; i < 16; i++) { LOGD_ANR("(0x0018 - 0x0034) sig_x[%d]:0x%x \n", i, pFix->sigma_x[i]); } // ISP_BAYNR_3A00_SIGMAY0-15(0x0038 - 0x0054) for(int i = 0; i < 16; i++) { LOGD_ANR("(0x0038 - 0x0054) sig_y[%d]:0x%x \n", i, pFix->sigma_y[i]); } // ISP_BAYNR_3A00_WRIT_D(0x0058) LOGD_ANR("(0x0058) weit_d[0]:0x%x weit_d[1]:0x%x weit_d[2]:0x%x\n", pFix->weit_d[0], pFix->weit_d[1], pFix->weit_d[2]); LOGD_ANR("%s:(%d) ############# bayernr2D exit ######################## \n", __FUNCTION__, __LINE__); return res; } Abayer2dnr_result_V2_t bayer2dnr_get_setting_by_name_json_V2(CalibDbV2_Bayer2dnr_V2_t* pCalibdb, char *name, int *calib_idx, int *tuning_idx) { int i = 0; Abayer2dnr_result_V2_t res = ABAYER2DNR_RET_SUCCESS; if(pCalibdb == NULL || name == NULL || calib_idx == NULL || tuning_idx == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYER2DNR_RET_NULL_POINTER; } for(i = 0; i < pCalibdb->TuningPara.Setting_len; i++) { if(strncmp(name, pCalibdb->TuningPara.Setting[i].SNR_Mode, strlen(name)*sizeof(char)) == 0) { break; } } if(i < pCalibdb->TuningPara.Setting_len) { *tuning_idx = i; } else { *tuning_idx = 0; } for(i = 0; i < pCalibdb->CalibPara.Setting_len; i++) { if(strncmp(name, pCalibdb->CalibPara.Setting[i].SNR_Mode, strlen(name)*sizeof(char)) == 0) { break; } } if(i < pCalibdb->CalibPara.Setting_len) { *calib_idx = i; } else { *calib_idx = 0; } LOGD_ANR("%s:%d snr_name:%s snr_idx:%d i:%d \n", __FUNCTION__, __LINE__, name, *calib_idx, i); return res; } Abayer2dnr_result_V2_t bayer2dnr_init_params_json_V2(RK_Bayer2dnr_Params_V2_t *pParams, CalibDbV2_Bayer2dnr_V2_t* pCalibdb, int calib_idx, int tuning_idx) { Abayer2dnr_result_V2_t res = ABAYER2DNR_RET_SUCCESS; CalibDbV2_Bayer2dnr_V2_CalibPara_Setting_ISO_t *pCalibIso = NULL; CalibDbV2_Bayer2dnr_V2_TuningPara_Setting_ISO_t *pTuningISO = NULL; int i = 0; int j = 0; LOGI_ANR("%s:(%d) oyyf bayerner xml config start\n", __FUNCTION__, __LINE__); if(pParams == NULL || pCalibdb == NULL || calib_idx < 0 || tuning_idx < 0) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYER2DNR_RET_NULL_POINTER; } pParams->enable = pCalibdb->TuningPara.enable; pParams->hdrdgain_ctrl_en = pCalibdb->TuningPara.hdrdgain_ctrl_en; for(int i = 0; i < pCalibdb->CalibPara.Setting[calib_idx].Calib_ISO_len && i < RK_BAYER2DNR_V2_MAX_ISO_NUM; i++) { pCalibIso = &pCalibdb->CalibPara.Setting[calib_idx].Calib_ISO[i]; pParams->iso[i] = pCalibIso->iso; for(int k = 0; k < 16; k++) { pParams->lumapoint[k] = pCalibIso->lumapoint[k]; pParams->sigma[i][k] = pCalibIso->sigma[k]; } } for(int i = 0; i < pCalibdb->TuningPara.Setting[tuning_idx].Tuning_ISO_len && i < RK_BAYER2DNR_V2_MAX_ISO_NUM; i++) { pTuningISO = &pCalibdb->TuningPara.Setting[tuning_idx].Tuning_ISO[i]; pParams->iso[i] = pTuningISO->iso; pParams->filter_strength[i] = pTuningISO->filter_strength; pParams->edgesofts[i] = pTuningISO->edgesofts; pParams->weight[i] = pTuningISO->weight; pParams->ratio[i] = pTuningISO->ratio; pParams->gauss_guide[i] = pTuningISO->gauss_guide; pParams->pix_diff[i] = FIXDIFMAX - 1; pParams->diff_thld[i] = LUTPRECISION_FIX; pParams->hdr_dgain_scale_s[i] = pTuningISO->hdr_dgain_scale_s; pParams->hdr_dgain_scale_m[i] = pTuningISO->hdr_dgain_scale_m; LOGD_ANR("i:%d dgain_scale:%f %f \n", i, pTuningISO->hdr_dgain_scale_s, pTuningISO->hdr_dgain_scale_m); } LOGI_ANR("%s:(%d) oyyf bayerner xml config end! \n", __FUNCTION__, __LINE__); return res; } Abayer2dnr_result_V2_t bayer2dnr_config_setting_param_json_V2(RK_Bayer2dnr_Params_V2_t *pParams, CalibDbV2_Bayer2dnr_V2_t* pCalibdbV2, char* param_mode, char * snr_name) { Abayer2dnr_result_V2_t res = ABAYER2DNR_RET_SUCCESS; int calib_idx = 0; int tuning_idx = 0; if(pParams == NULL || pCalibdbV2 == NULL || param_mode == NULL || snr_name == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYER2DNR_RET_NULL_POINTER; } res = bayer2dnr_get_setting_by_name_json_V2(pCalibdbV2, snr_name, &calib_idx, &tuning_idx); if(res != ABAYER2DNR_RET_SUCCESS) { LOGW_ANR("%s(%d): error!!! can't find setting in iq files, use 0 instead\n", __FUNCTION__, __LINE__); } res = bayer2dnr_init_params_json_V2(pParams, pCalibdbV2, calib_idx, tuning_idx); return res; } RKAIQ_END_DECLARE