#include "rk_aiq_abayernr_algo_bayernr_v2.h" RKAIQ_BEGIN_DECLARE Abayernr_result_t bayernr_get_mode_by_name_V2(struct list_head *pCalibdbList, char *name, CalibDb_Bayernr_V2_t** ppProfile) { int i = 0; Abayernr_result_t res = ABAYERNR_RET_SUCCESS; if(pCalibdbList == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } if(name == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } if(ppProfile == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } #if 1 *ppProfile = NULL; struct list_head* p; p = pCalibdbList->next; while (p != pCalibdbList) { CalibDb_Bayernr_V2_t* pProfile = container_of(p, CalibDb_Bayernr_V2_t, listItem); LOGE_ANR("%s:%d %s %p \n", __FUNCTION__, __LINE__, pProfile->modeName, p); if (!strncmp(pProfile->modeName, name, sizeof(pProfile->modeName))) { *ppProfile = pProfile; return res; } p = p->next; } CalibDb_Bayernr_V2_t* pProfile = container_of(pCalibdbList->next, CalibDb_Bayernr_V2_t, listItem); *ppProfile = pProfile; #else #endif return res; } Abayernr_result_t bayernr2D_get_setting_by_name_V2(struct list_head *pSettingList, char *name, Calibdb_Bayernr_2Dparams_V2_t** ppSetting) { int i = 0; Abayernr_result_t res = ABAYERNR_RET_SUCCESS; if(pSettingList == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } if(name == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } if(ppSetting == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } *ppSetting = NULL; struct list_head* p; p = pSettingList->next; while (p != pSettingList) { Calibdb_Bayernr_2Dparams_V2_t* pSetting = container_of(p, Calibdb_Bayernr_2Dparams_V2_t, listItem); LOGD_ANR("%s:%d: %s %p ", __FUNCTION__, __LINE__, pSetting->snr_mode, p); if (!strncmp(pSetting->snr_mode, name, sizeof(pSetting->snr_mode))) { *ppSetting = pSetting; return res; } p = p->next; } Calibdb_Bayernr_2Dparams_V2_t* pSetting = container_of(pSettingList->next, Calibdb_Bayernr_2Dparams_V2_t, listItem); *ppSetting = pSetting; return res; } Abayernr_result_t bayernr3D_get_setting_by_name_V2(struct list_head *pSettingList, char *name, CalibDb_Bayernr_3DParams_V2_t** ppSetting) { int i = 0; Abayernr_result_t res = ABAYERNR_RET_SUCCESS; if(pSettingList == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } if(name == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } if(ppSetting == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } *ppSetting = NULL; struct list_head* p; p = pSettingList->next; while (p != pSettingList) { CalibDb_Bayernr_3DParams_V2_t* pSetting = container_of(p, CalibDb_Bayernr_3DParams_V2_t, listItem); LOGD_ANR("%s:%d %s %p ", __FUNCTION__, __LINE__, pSetting->snr_mode, p); if (!strncmp(pSetting->snr_mode, name, sizeof(pSetting->snr_mode))) { *ppSetting = pSetting; return res; } p = p->next; } CalibDb_Bayernr_3DParams_V2_t* pSetting = container_of(pSettingList->next, CalibDb_Bayernr_3DParams_V2_t, listItem); *ppSetting = pSetting; return res; } Abayernr_result_t bayernr2D_config_setting_param_V2(RK_Bayernr_2D_Params_V2_t *pParams, struct list_head *pCalibdbList, char* param_mode, char * snr_name) { Abayernr_result_t res = ABAYERNR_RET_SUCCESS; CalibDb_Bayernr_V2_t *pProfile; Calibdb_Bayernr_2Dparams_V2_t* p2DParams; LOGI_ANR("%s(%d): enter\n", __FUNCTION__, __LINE__); if(pParams == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } if(pCalibdbList == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } if(param_mode == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } if(snr_name == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } res = bayernr_get_mode_by_name_V2(pCalibdbList, param_mode, &pProfile); if(res != ABAYERNR_RET_SUCCESS) { LOGW_ANR("%s(%d): error!!! can't find mode name in iq files, use 0 instead\n", __FUNCTION__, __LINE__); } res = bayernr2D_get_setting_by_name_V2(&pProfile->st2DParams.listHead, snr_name, &p2DParams); if(res != ABAYERNR_RET_SUCCESS) { LOGW_ANR("%s(%d): error!!! can't find setting in iq files, use 0 instead\n", __FUNCTION__, __LINE__); } res = bayernr2D_init_params_V2(pParams, p2DParams); pParams->bayernrv2_2dnr_enable = pProfile->st2DParams.bayernrv2_2dnr_enable; LOGI_ANR("%s(%d): exit\n", __FUNCTION__, __LINE__); return res; } Abayernr_result_t bayernr3D_config_setting_param_V2(RK_Bayernr_3D_Params_V2_t *pParams, struct list_head *pCalibdbList, char* param_mode, char * snr_name) { Abayernr_result_t res = ABAYERNR_RET_SUCCESS; CalibDb_Bayernr_V2_t *pProfile; CalibDb_Bayernr_3DParams_V2_t* p3DParams; if(pParams == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } if(pCalibdbList == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } if(param_mode == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } if(snr_name == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } res = bayernr_get_mode_by_name_V2(pCalibdbList, param_mode, &pProfile); if(res != ABAYERNR_RET_SUCCESS) { LOGW_ANR("%s(%d): error!!! can't find mode name in iq files, use 0 instead\n", __FUNCTION__, __LINE__); } res = bayernr3D_get_setting_by_name_V2(&pProfile->st3DParams.listHead, snr_name, &p3DParams); if(res != ABAYERNR_RET_SUCCESS) { LOGW_ANR("%s(%d): error!!! can't find setting in iq files, use 0 instead\n", __FUNCTION__, __LINE__); } res = bayernr3D_init_params_V2(pParams, p3DParams); pParams->bayernrv2_tnr_enable = pProfile->st3DParams.bayernrv2_tnr_enable; return res; } Abayernr_result_t bayernr2D_init_params_V2(RK_Bayernr_2D_Params_V2_t *pParams, Calibdb_Bayernr_2Dparams_V2_t* pCalibdbParams) { Abayernr_result_t res = ABAYERNR_RET_SUCCESS; int i = 0; int j = 0; LOGI_ANR("%s:(%d) oyyf bayerner xml config start\n", __FUNCTION__, __LINE__); if(pParams == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } if(pCalibdbParams == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } for(int i = 0; i < RK_BAYERNR_V2_MAX_ISO_NUM; i++) { pParams->iso[i] = pCalibdbParams->iso[i]; pParams->bayernrv2_filter_strength_r[i] = pCalibdbParams->bayernrv2_filter_strength_r[i]; pParams->bayernrv2_filter_edgesofts_r[i] = pCalibdbParams->bayernrv2_filter_edgesofts_r[i]; pParams->bayernrv2_filter_out_wgt_r[i] = pCalibdbParams->bayernrv2_filter_out_wgt_r[i]; pParams->bayernrv2_filter_soft_threshold_ratio_r[i] = pCalibdbParams->bayernrv2_filter_soft_threshold_ratio_r[i]; pParams->bayernrv2_gauss_guide_r[i] = pCalibdbParams->bayernrv2_gauss_guide_r[i]; for(int k = 0; k < 8; k++) { pParams->bayernrv2_edge_filter_wgt_r[i][k] = pCalibdbParams->bayernrv2_edge_filter_wgt_r[i][k]; } for(int k = 0; k < 16; k++) { pParams->bayernrv2_filter_sigma_r[i][k] = pCalibdbParams->bayernrv2_filter_sigma_r[i][k]; } } for(int i = 0; i < 8; i++) { pParams->bayernrv2_edge_filter_lumapoint_r[i] = pCalibdbParams->bayernrv2_edge_filter_lumapoint_r[i]; } for(int i = 0; i < 16; i++) { pParams->bayernrv2_filter_lumapoint_r[i] = pCalibdbParams->bayernrv2_filter_lumapoint_r[i]; } LOGI_ANR("%s:(%d) oyyf bayerner xml config end! \n", __FUNCTION__, __LINE__); return res; } Abayernr_result_t bayernr3D_init_params_V2(RK_Bayernr_3D_Params_V2_t *pParams, CalibDb_Bayernr_3DParams_V2_t* pCalibdbParams) { Abayernr_result_t res = ABAYERNR_RET_SUCCESS; int i = 0; int j = 0; LOGI_ANR("%s:(%d) oyyf bayerner xml config start\n", __FUNCTION__, __LINE__); if(pParams == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } if(pCalibdbParams == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } for(int i = 0; i < RK_BAYERNR_V2_MAX_ISO_NUM; i++) { pParams->iso[i] = pCalibdbParams->iso[i]; pParams->bayernrv2_tnr_filter_strength_r[i] = pCalibdbParams->bayernrv2_tnr_filter_strength_r[i]; pParams->bayernrv2_tnr_lo_clipwgt_r[i] = pCalibdbParams->bayernrv2_tnr_lo_clipwgt_r[i]; pParams->bayernrv2_tnr_hi_clipwgt_r[i] = pCalibdbParams->bayernrv2_tnr_hi_clipwgt_r[i]; pParams->bayernrv2_tnr_softwgt_r[i] = pCalibdbParams->bayernrv2_tnr_softwgt_r[i]; for(int k = 0; k < 16; k++) { pParams->bayernrv2_sigma_r[i][k] = pCalibdbParams->bayernrv2_sigma_r[i][k]; } } for(int i = 0; i < 16; i++) { pParams->bayernrv2_lumapoint_r[i] = pCalibdbParams->bayernrv2_lumapoint_r[i]; } LOGI_ANR("%s:(%d) oyyf bayerner xml config end! \n", __FUNCTION__, __LINE__); return res; } Abayernr_result_t bayernr2D_select_params_by_ISO_V2(RK_Bayernr_2D_Params_V2_t *pParams, RK_Bayernr_2D_Params_V2_Select_t *pSelect, Abayernr_ExpInfo_t *pExpInfo) { Abayernr_result_t res = ABAYERNR_RET_SUCCESS; int iso = 50; if(pParams == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } if(pSelect == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } if(pExpInfo == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } iso = pExpInfo->arIso[pExpInfo->hdr_mode]; LOGD_ANR("%s:%d iso:%d \n", __FUNCTION__, __LINE__, iso); int isoGainStd[RK_BAYERNR_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_BAYERNR_V2_MAX_ISO_NUM; i++) { isoGainStd[i] = pParams->iso[i] / 50; } #else for(int i = 0; i < RK_BAYERNR_V2_MAX_ISO_NUM; i++) { isoGainStd[i] = 1 * (1 << i); } #endif for (i = 0; i < RK_BAYERNR_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->bayernrv2_2dnr_enable = pParams->bayernrv2_2dnr_enable; for (i = 0; i < 8; i++) { pSelect->bayernrv2_edge_filter_lumapoint[i] = pParams->bayernrv2_edge_filter_lumapoint_r[i]; pSelect->bayernrv2_edge_filter_wgt[i] = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * pParams->bayernrv2_edge_filter_wgt_r[isoLevelLow][i] + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * pParams->bayernrv2_edge_filter_wgt_r[isoLevelHig][i]; } pSelect->bayernrv2_filter_strength = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * pParams->bayernrv2_filter_strength_r[isoLevelLow] + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * pParams->bayernrv2_filter_strength_r[isoLevelHig]; tmpf = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * pParams->bayernrv2_gauss_guide_r[isoLevelLow] + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * pParams->bayernrv2_gauss_guide_r[isoLevelHig]; pSelect->bayernrv2_gauss_guide = tmpf != 0; for (i = 0; i < 16; i++) { pSelect->bayernrv2_filter_lumapoint[i] = pParams->bayernrv2_filter_lumapoint_r[i]; pSelect->bayernrv2_filter_sigma[i] = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * pParams->bayernrv2_filter_sigma_r[isoLevelLow][i] + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * pParams->bayernrv2_filter_sigma_r[isoLevelHig][i]; } pSelect->bayernrv2_filter_edgesofts = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * pParams->bayernrv2_filter_edgesofts_r[isoLevelLow] + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * pParams->bayernrv2_filter_edgesofts_r[isoLevelHig]; pSelect->bayernrv2_filter_soft_threshold_ratio = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * pParams->bayernrv2_filter_soft_threshold_ratio_r[isoLevelLow] + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * pParams->bayernrv2_filter_soft_threshold_ratio_r[isoLevelHig]; pSelect->bayernrv2_filter_out_wgt = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * pParams->bayernrv2_filter_out_wgt_r[isoLevelLow] + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * pParams->bayernrv2_filter_out_wgt_r[isoLevelHig]; pSelect->bayernrv2_edge_filter_en = 0; return res; } Abayernr_result_t bayernr3D_select_params_by_ISO_V2(RK_Bayernr_3D_Params_V2_t *pParams, RK_Bayernr_3D_Params_V2_Select_t *pSelect, Abayernr_ExpInfo_t *pExpInfo) { Abayernr_result_t res = ABAYERNR_RET_SUCCESS; int iso = 50; if(pParams == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } if(pSelect == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } if(pExpInfo == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } iso = pExpInfo->arIso[pExpInfo->hdr_mode]; LOGD_ANR("%s:%d iso:%d \n", __FUNCTION__, __LINE__, iso); int isoGainStd[RK_BAYERNR_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_BAYERNR_V2_MAX_ISO_NUM; i++) { isoGainStd[i] = pParams->iso[i] / 50; } #else for(int i = 0; i < RK_BAYERNR_V2_MAX_ISO_NUM; i++) { isoGainStd[i] = 1 * (1 << i); } #endif for (i = 0; i < RK_BAYERNR_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->bayernrv2_tnr_enable = pParams->bayernrv2_tnr_enable; pSelect->bayernrv2_tnr_filter_strength = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * pParams->bayernrv2_tnr_filter_strength_r[isoLevelLow] + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * pParams->bayernrv2_tnr_filter_strength_r[isoLevelHig]; pSelect->bayernrv2_tnr_lo_clipwgt = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * pParams->bayernrv2_tnr_lo_clipwgt_r[isoLevelLow] + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * pParams->bayernrv2_tnr_lo_clipwgt_r[isoLevelHig]; pSelect->bayernrv2_tnr_hi_clipwgt = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * pParams->bayernrv2_tnr_hi_clipwgt_r[isoLevelLow] + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * pParams->bayernrv2_tnr_hi_clipwgt_r[isoLevelHig]; pSelect->bayernrv2_tnr_softwgt = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * pParams->bayernrv2_tnr_softwgt_r[isoLevelLow] + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * pParams->bayernrv2_tnr_softwgt_r[isoLevelHig]; for (i = 0; i < 16; i++) { pSelect->bayernrv2_tnr_lumapoint[i] = pParams->bayernrv2_lumapoint_r[i]; pSelect->bayernrv2_tnr_sigma[i] = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * pParams->bayernrv2_sigma_r[isoLevelLow][i] + float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * pParams->bayernrv2_sigma_r[isoLevelHig][i]; } return res; } unsigned short bayernr_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; } Abayernr_result_t bayernr2D_fix_transfer_V2(RK_Bayernr_2D_Params_V2_Select_t* pSelect, RK_Bayernr_2D_Fix_V2_t *pFix, float fStrength, Abayernr_ExpInfo_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; if(pSelect == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } if(pFix == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } if(pExpInfo == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } if(fStrength <= 0.0f) { fStrength = 0.000001; } // 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_gauss_en = pSelect->bayernrv2_gauss_guide; pFix->baynr_log_bypass = 0; pFix->baynr_en = pSelect->bayernrv2_2dnr_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); } // ISP_BAYNR_3A00_PIXDIFF tmp = FIXDIFMAX - 1; pFix->baynr_pix_diff = CLIP(tmp, 0, 0x3fff); // ISP_BAYNR_3A00_THLD tmp = LUTPRECISION_FIX; pFix->baynr_diff_thld = CLIP(tmp, 0, 0x3ff); tmp = (int)(pSelect->bayernrv2_filter_soft_threshold_ratio / fStrength * (1 << 10)); pFix->baynr_softthld = CLIP(tmp, 0, 0x3ff); // ISP_BAYNR_3A00_W1_STRENG tmp = (int)(pSelect->bayernrv2_filter_strength * fStrength * (1 << FIXBILSTRG)); pFix->bltflt_streng = CLIP(tmp, 0, 0xfff); tmp = (int)(pSelect->bayernrv2_filter_out_wgt * 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->bayernrv2_filter_lumapoint[i]; pFix->sigma_x[i] = CLIP(tmp, 0, 0xffff); tmp = pSelect->bayernrv2_filter_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->bayernrv2_filter_edgesofts; 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(0) { //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 bayernr2D_fix_printf_V2(pFix); return ABAYERNR_RET_SUCCESS; } Abayernr_result_t bayernr3D_fix_transfer_V2(RK_Bayernr_3D_Params_V2_Select_t* pSelect, RK_Bayernr_3D_Fix_V2_t *pFix, float fStrength, Abayernr_ExpInfo_t *pExpInfo) { int i = 0; int tmp; if(fStrength <= 0.0f) { fStrength = 0.000001; } // BAY3D_BAY3D_CTRL pFix->bay3d_exp_sel = 1; pFix->bay3d_bypass_en = 0; pFix->bay3d_pk_en = 1; // 1 use local pk, 0 use global pk pFix->bay3d_en_i = pSelect->bayernrv2_tnr_enable; // BAY3D_BAY3D_KALRATIO tmp = (int)(pSelect->bayernrv2_tnr_softwgt / fStrength * (1 << FIXTNRSFT)); pFix->bay3d_softwgt = CLIP(tmp, 0, 0x3ff); tmp = (int)(1.5 * (1 << 10)); //(pSelect->bayertnr_sigratio*(1<bay3d_sigratio = CLIP(tmp, 0, 0x3fff); // BAY3D_BAY3D_GLBPK2 tmp = 1024; pFix->bay3d_glbpk2 = CLIP(tmp, 0, 0xfffffff); // BAY3D_BAY3D_KALSTR tmp = (int)(pSelect->bayernrv2_tnr_filter_strength / fStrength * (1 << 10));// (int)(0.06*(1<<10)); // less, filter strong // classic is 0.1 pFix->bay3d_exp_str = CLIP(tmp, 0, 0x3ff); tmp = (int)(1.0 * (1 << FIXTNRSTG)); pFix->bay3d_str = CLIP(tmp, 0, 0x100); // BAY3D_BAY3D_WGTLMT tmp = (int)(((float)1 - pSelect->bayernrv2_tnr_hi_clipwgt) * fStrength * (1 << FIXTNRWGT)); // 0.0325 pFix->bay3d_wgtlmt_h = CLIP(tmp, 0, 0x3ff); tmp = (int)(((float)1 - pSelect->bayernrv2_tnr_lo_clipwgt) * fStrength * (1 << FIXTNRWGT)); // 0.0325 pFix->bay3d_wgtlmt_l = CLIP(tmp, 0, 0x3ff); // BAY3D_BAY3D_SIG_X0 for(i = 0; i < 16; i++) { //pFix->bay3d_sig_x[i] = bayernr_get_trans_V2(pSelect->bayernrv2_tnr_lumapoint[i]); tmp = pSelect->bayernrv2_tnr_lumapoint[i]; pFix->bay3d_sig_x[i] = CLIP(tmp, 0, 0xffff); tmp = pSelect->bayernrv2_tnr_sigma[i]; pFix->bay3d_sig_y[i] = CLIP(tmp, 0, 0xffff); } bayernr3D_fix_printf_V2(pFix); return ABAYERNR_RET_SUCCESS; } Abayernr_result_t bayernr2D_fix_printf_V2(RK_Bayernr_2D_Fix_V2_t * pFix) { //FILE *fp = fopen("bayernr_regsiter.dat", "wb+"); Abayernr_result_t res = ABAYERNR_RET_SUCCESS; if(pFix == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_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; } Abayernr_result_t bayernr3D_fix_printf_V2(RK_Bayernr_3D_Fix_V2_t * pFix) { //FILE *fp = fopen("bayernr_regsiter.dat", "wb+"); Abayernr_result_t res = ABAYERNR_RET_SUCCESS; if(pFix == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } LOGD_ANR("%s:(%d) ############# bayernr3D enter######################## \n", __FUNCTION__, __LINE__); // BAY3D_BAY3D_CTRL (0x0080) LOGD_ANR("(0x0080) exp_sel:0x%x bypass_en:0x%x pk_en:0x%x en_i:0x%x\n", pFix->bay3d_exp_sel, pFix->bay3d_bypass_en, pFix->bay3d_pk_en, pFix->bay3d_en_i); // BAY3D_BAY3D_KALRATIO (0x0084) LOGD_ANR("(0x0084) softwgt:0x%x sigratio:0x%x \n", pFix->bay3d_softwgt, pFix->bay3d_sigratio); // BAY3D_BAY3D_GLBPK2 (0x0088) LOGD_ANR("(0x0088) glbpk2:0x%x \n", pFix->bay3d_glbpk2); // BAY3D_BAY3D_KALSTR (0x008c) LOGD_ANR("(0x008c) exp_str:0x%x str:0x%x \n", pFix->bay3d_exp_str, pFix->bay3d_str); // BAY3D_BAY3D_WGTLMT (0x0090) LOGD_ANR("(0x0090) wgtlmt_h:0x%x wgtlmt_l:0x%x \n", pFix->bay3d_wgtlmt_h, pFix->bay3d_wgtlmt_l); // BAY3D_BAY3D_SIG_X0-16 (0x0094 - 0x00b0) for(int i = 0; i < 16; i++) { LOGD_ANR("(0x0094 - 0x00b0) sig_x[%d]:0x%x \n", i, pFix->bay3d_sig_x[i]); } // BAY3D_BAY3D_SIG_Y0-16 (0x00b4 - 0x00d0) for(int i = 0; i < 16; i++) { LOGD_ANR("(0x00b4 - 0x00d0) sig_y[%d]:0x%x \n", i, pFix->bay3d_sig_y[i]); } LOGD_ANR("%s:(%d) ############# bayernr3D exit ######################## \n", __FUNCTION__, __LINE__); return res; } Abayernr_result_t bayernr2D_get_setting_by_name_json_V2(CalibDbV2_BayerNrV2_t* pCalibdb, char *name, int *calib_idx, int *tuning_idx) { int i = 0; Abayernr_result_t res = ABAYERNR_RET_SUCCESS; if(pCalibdb == NULL || name == NULL || calib_idx == NULL || tuning_idx == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } for(i = 0; i < pCalibdb->Bayernr2D.Setting_len; i++) { if(strncmp(name, pCalibdb->Bayernr2D.Setting[i].SNR_Mode, strlen(name)*sizeof(char)) == 0) { break; } } if(i < pCalibdb->Bayernr2D.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; } Abayernr_result_t bayernr2D_init_params_json_V2(RK_Bayernr_2D_Params_V2_t *pParams, CalibDbV2_BayerNrV2_t* pCalibdb, int calib_idx, int tuning_idx) { Abayernr_result_t res = ABAYERNR_RET_SUCCESS; CalibDbV2_BayerNrV2_CalibPara_Setting_ISO_t *pCalibIso = NULL; CalibDbV2_BayerNrV2_Bayernr2d_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 ABAYERNR_RET_NULL_POINTER; } for(int i = 0; i < pCalibdb->CalibPara.Setting[calib_idx].Calib_ISO_len && i < RK_BAYERNR_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->bayernrv2_filter_lumapoint_r[k] = pCalibIso->lumapoint[k]; pParams->bayernrv2_filter_sigma_r[i][k] = pCalibIso->sigma[k]; } } for(int i = 0; i < pCalibdb->Bayernr2D.Setting[tuning_idx].Tuning_ISO_len && i < RK_BAYERNR_V2_MAX_ISO_NUM; i++) { pTuningISO = &pCalibdb->Bayernr2D.Setting[tuning_idx].Tuning_ISO[i]; pParams->iso[i] = pTuningISO->iso; pParams->bayernrv2_filter_strength_r[i] = pTuningISO->filter_strength; pParams->bayernrv2_filter_edgesofts_r[i] = pTuningISO->edgesofts; pParams->bayernrv2_filter_out_wgt_r[i] = pTuningISO->weight; pParams->bayernrv2_filter_soft_threshold_ratio_r[i] = pTuningISO->ratio; pParams->bayernrv2_gauss_guide_r[i] = pTuningISO->gauss_guide; } LOGI_ANR("%s:(%d) oyyf bayerner xml config end! \n", __FUNCTION__, __LINE__); return res; } Abayernr_result_t bayernr2D_config_setting_param_json_V2(RK_Bayernr_2D_Params_V2_t *pParams, CalibDbV2_BayerNrV2_t* pCalibdbV2, char* param_mode, char * snr_name) { Abayernr_result_t res = ABAYERNR_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 ABAYERNR_RET_NULL_POINTER; } res = bayernr2D_get_setting_by_name_json_V2(pCalibdbV2, snr_name, &calib_idx, &tuning_idx); if(res != ABAYERNR_RET_SUCCESS) { LOGW_ANR("%s(%d): error!!! can't find setting in iq files, use 0 instead\n", __FUNCTION__, __LINE__); } res = bayernr2D_init_params_json_V2(pParams, pCalibdbV2, calib_idx, tuning_idx); pParams->bayernrv2_2dnr_enable = pCalibdbV2->Bayernr2D.enable; return res; } Abayernr_result_t bayernr3D_get_setting_by_name_json_V2(CalibDbV2_BayerNrV2_t* pCalibdb, char *name, int *calib_idx, int *tuning_idx) { int i = 0; Abayernr_result_t res = ABAYERNR_RET_SUCCESS; if(pCalibdb == NULL || name == NULL || calib_idx == NULL || tuning_idx == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } for(i = 0; i < pCalibdb->Bayernr3D.Setting_len; i++) { if(strncmp(name, pCalibdb->Bayernr3D.Setting[i].SNR_Mode, strlen(name)*sizeof(char)) == 0) { break; } } if(i < pCalibdb->Bayernr3D.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; } Abayernr_result_t bayernr3D_init_params_json_V2(RK_Bayernr_3D_Params_V2_t *pParams, CalibDbV2_BayerNrV2_t* pCalibdb, int calib_idx, int tuning_idx) { Abayernr_result_t res = ABAYERNR_RET_SUCCESS; CalibDbV2_BayerNrV2_CalibPara_Setting_ISO_t *pCalibIso = NULL; CalibDbV2_BayerNrV2_Bayernr3d_Setting_ISO_t *pTuningIso = NULL; LOGI_ANR("%s:(%d) oyyf bayerner xml config start\n", __FUNCTION__, __LINE__); if(pParams == NULL || pCalibdb == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ABAYERNR_RET_NULL_POINTER; } for(int i = 0; i < pCalibdb->CalibPara.Setting[calib_idx].Calib_ISO_len && i < RK_BAYERNR_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->bayernrv2_lumapoint_r[k] = pCalibIso->lumapoint[k]; pParams->bayernrv2_sigma_r[i][k] = pCalibIso->sigma[k]; } } for(int i = 0; i < pCalibdb->Bayernr3D.Setting[tuning_idx].Tuning_ISO_len && i < RK_BAYERNR_V2_MAX_ISO_NUM; i++) { pTuningIso = &pCalibdb->Bayernr3D.Setting[tuning_idx].Tuning_ISO[i]; pParams->iso[i] = pTuningIso->iso; pParams->bayernrv2_tnr_filter_strength_r[i] = pTuningIso->filter_strength; pParams->bayernrv2_tnr_lo_clipwgt_r[i] = pTuningIso->lo_clipwgt; pParams->bayernrv2_tnr_hi_clipwgt_r[i] = pTuningIso->hi_clipwgt; pParams->bayernrv2_tnr_softwgt_r[i] = pTuningIso->softwgt; } LOGI_ANR("%s:(%d) oyyf bayerner xml config end! \n", __FUNCTION__, __LINE__); return res; } Abayernr_result_t bayernr3D_config_setting_param_json_V2(RK_Bayernr_3D_Params_V2_t *pParams, CalibDbV2_BayerNrV2_t* pCalibdbV2, char* param_mode, char * snr_name) { Abayernr_result_t res = ABAYERNR_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 ABAYERNR_RET_NULL_POINTER; } res = bayernr3D_get_setting_by_name_json_V2(pCalibdbV2, snr_name, &calib_idx, &tuning_idx); if(res != ABAYERNR_RET_SUCCESS) { LOGW_ANR("%s(%d): error!!! can't find setting in iq files, use 0 instead\n", __FUNCTION__, __LINE__); } res = bayernr3D_init_params_json_V2(pParams, pCalibdbV2, calib_idx, tuning_idx); pParams->bayernrv2_tnr_enable = pCalibdbV2->Bayernr3D.enable; return res; } RKAIQ_END_DECLARE