#include "rk_aiq_asharp_algo_sharp_v3.h" RKAIQ_BEGIN_DECLARE Asharp3_result_t sharp_get_mode_by_name_V3(struct list_head* pCalibdbList, char *name, Calibdb_Sharp_V3_t** ppProfile) { int i = 0; Asharp3_result_t res = ASHARP3_RET_SUCCESS; LOGI_ASHARP("%s(%d): enter \n", __FUNCTION__, __LINE__); if(pCalibdbList == NULL) { LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ASHARP3_RET_NULL_POINTER; } if(name == NULL) { LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ASHARP3_RET_NULL_POINTER; } if(ppProfile == NULL) { LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ASHARP3_RET_NULL_POINTER; } LOGD_ASHARP("%s(%d): moden:%s \n", __FUNCTION__, __LINE__, name); #if 1 *ppProfile = NULL; struct list_head* p; p = pCalibdbList->next; int num = get_list_num(pCalibdbList); LOGD_ASHARP("%s(%d): list num:%d list:%p \n", __FUNCTION__, __LINE__, num, pCalibdbList); while (p != pCalibdbList) { Calibdb_Sharp_V3_t* pProfile = container_of(p, Calibdb_Sharp_V3_t, listItem); LOGD_ASHARP("%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; } if(pCalibdbList->next != pCalibdbList) { Calibdb_Sharp_V3_t* pProfile = container_of(pCalibdbList->next, Calibdb_Sharp_V3_t, listItem); *ppProfile = pProfile; } #else #endif LOGI_ASHARP("%s(%d): exit \n", __FUNCTION__, __LINE__); return res; } Asharp3_result_t sharp_get_setting_by_name_V3(struct list_head *pSettingList, char *name, Calibdb_Sharp_params_V3_t** ppSetting) { int i = 0; Asharp3_result_t res = ASHARP3_RET_SUCCESS; LOGI_ASHARP("%s(%d): enter \n", __FUNCTION__, __LINE__); if(pSettingList == NULL) { LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ASHARP3_RET_NULL_POINTER; } if(name == NULL) { LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ASHARP3_RET_NULL_POINTER; } if(ppSetting == NULL) { LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ASHARP3_RET_NULL_POINTER; } LOGD_ASHARP("%s(%d): name:%s \n", __FUNCTION__, __LINE__, name); *ppSetting = NULL; struct list_head* p; p = pSettingList->next; int num = get_list_num(pSettingList); LOGD_ASHARP("%s(%d): list num:%d list:%p \n", __FUNCTION__, __LINE__, num, pSettingList); while (p != pSettingList) { Calibdb_Sharp_params_V3_t* pSetting = container_of(p, Calibdb_Sharp_params_V3_t, listItem); LOGD_ASHARP("%s:%d: %s %p \n", __FUNCTION__, __LINE__, pSetting->snr_mode, p); if (!strncmp(pSetting->snr_mode, name, sizeof(pSetting->snr_mode))) { *ppSetting = pSetting; return res; } p = p->next; } if(pSettingList->next != pSettingList) { Calibdb_Sharp_params_V3_t* pSetting = container_of(pSettingList->next, Calibdb_Sharp_params_V3_t, listItem); *ppSetting = pSetting; } LOGI_ASHARP("%s(%d): exit \n", __FUNCTION__, __LINE__); return res; } Asharp3_result_t sharp_config_setting_param_V3(RK_SHARP_Params_V3_t *pParams, struct list_head *pCalibdbList, char* param_mode, char * snr_name) { Asharp3_result_t res = ASHARP3_RET_SUCCESS; Calibdb_Sharp_V3_t *pProfile; Calibdb_Sharp_params_V3_t *pCalibParms; LOGI_ASHARP("%s(%d): enter\n", __FUNCTION__, __LINE__); if(pParams == NULL) { LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ASHARP3_RET_NULL_POINTER; } if(pCalibdbList == NULL) { LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ASHARP3_RET_NULL_POINTER; } if(param_mode == NULL) { LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ASHARP3_RET_NULL_POINTER; } if(snr_name == NULL) { LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ASHARP3_RET_NULL_POINTER; } LOGD_ASHARP("%s(%d): mode:%s setting:%s \n", __FUNCTION__, __LINE__, param_mode, snr_name); res = sharp_get_mode_by_name_V3(pCalibdbList, param_mode, &pProfile); if(res != ASHARP3_RET_SUCCESS) { LOGW_ASHARP("%s(%d): error!!! can't find mode name in iq files, use 0 instead\n", __FUNCTION__, __LINE__); } res = sharp_get_setting_by_name_V3(&pProfile->listHead, snr_name, &pCalibParms); if(res != ASHARP3_RET_SUCCESS) { LOGW_ASHARP("%s(%d): error!!! can't find setting in iq files, use 0 instead\n", __FUNCTION__, __LINE__); } res = sharp_init_params_V3(pParams, pCalibParms); pParams->enable = pProfile->enable; LOGI_ASHARP("%s(%d): exit\n", __FUNCTION__, __LINE__); return res; } Asharp3_result_t sharp_init_params_V3(RK_SHARP_Params_V3_t *pSharpParams, Calibdb_Sharp_params_V3_t* pCalibParms) { Asharp3_result_t res = ASHARP3_RET_SUCCESS; int i = 0; int j = 0; short isoCurveSectValue; short isoCurveSectValue1; float ave1, ave2, ave3, ave4; int bit_calib = 12; int bit_proc; int bit_shift; LOGI_ASHARP("%s(%d): enter\n", __FUNCTION__, __LINE__); if(pSharpParams == NULL) { LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ASHARP3_RET_NULL_POINTER; } if(pCalibParms == NULL) { LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ASHARP3_RET_NULL_POINTER; } for(i = 0; i < RK_SHARP_V3_LUMA_POINT_NUM; i++) { pSharpParams->luma_point[i] = pCalibParms->luma_point[i]; } for(i = 0; i < RK_SHARP_V3_MAX_ISO_NUM; i++) { pSharpParams->iso[i] = pCalibParms->iso[i]; for(j = 0; j < RK_SHARP_V3_LUMA_POINT_NUM; j++) { pSharpParams->luma_sigma[i][j] = pCalibParms->luma_sigma[i][j]; pSharpParams->lum_clip_h[i][j] = pCalibParms->lum_clip_h[i][j]; pSharpParams->ehf_th[i][j] = pCalibParms->ehf_th[i][j]; pSharpParams->clip_hf[i][j] = pCalibParms->clip_hf[i][j]; pSharpParams->clip_mf[i][j] = pCalibParms->clip_mf[i][j]; pSharpParams->clip_lf[i][j] = pCalibParms->clip_lf[i][j]; pSharpParams->local_wgt[i][j] = pCalibParms->local_wgt[i][j]; } pSharpParams->pbf_gain[i] = pCalibParms->pbf_gain[i]; pSharpParams->pbf_add[i] = pCalibParms->pbf_add[i]; pSharpParams->pbf_ratio[i] = pCalibParms->pbf_ratio[i]; pSharpParams->gaus_ratio[i] = pCalibParms->gaus_ratio[i]; pSharpParams->sharp_ratio[i] = pCalibParms->sharp_ratio[i]; pSharpParams->bf_gain[i] = pCalibParms->bf_gain[i]; pSharpParams->bf_add[i] = pCalibParms->bf_add[i]; pSharpParams->bf_ratio[i] = pCalibParms->bf_ratio[i]; for(j = 0; j < 3; j++) { pSharpParams->kernel_bila_filter[i][j] = pCalibParms->kernel_bila_filter[j][i]; pSharpParams->kernel_pre_bila_filter[i][j] = pCalibParms->kernel_pre_bila_filter[j][i]; pSharpParams->kernel_range_filter[i][j] = pCalibParms->kernel_range_filter[j][i]; LOGD_ASHARP("kernel: index[%d][%d] = %f\n", i, j, pSharpParams->kernel_bila_filter[i][j]); } pSharpParams->sharp_ratio_h[i] = pCalibParms->sharp_ratio_h[i]; pSharpParams->sharp_ratio_m[i] = pCalibParms->sharp_ratio_m[i]; pSharpParams->sharp_ratio_l[i] = pCalibParms->sharp_ratio_l[i]; } LOGI_ASHARP("%s(%d): exit\n", __FUNCTION__, __LINE__); return res; } Asharp3_result_t sharp_select_params_by_ISO_V3( RK_SHARP_Params_V3_t *pParams, RK_SHARP_Params_V3_Select_t *pSelect, Asharp3_ExpInfo_t *pExpInfo ) { Asharp3_result_t res = ASHARP3_RET_SUCCESS; int i; int iso = 50; int iso_div = 50; float ratio = 0.0f; int iso_low = iso, iso_high = iso; int gain_high = 0, gain_low = 0; int max_iso_step = RK_SHARP_V3_MAX_ISO_NUM; int sum_coeff, offset; LOGI_ASHARP("%s(%d): enter\n", __FUNCTION__, __LINE__); if(pParams == NULL) { LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ASHARP3_RET_NULL_POINTER; } if(pSelect == NULL) { LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ASHARP3_RET_NULL_POINTER; } if(pExpInfo == NULL) { LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ASHARP3_RET_NULL_POINTER; } iso = pExpInfo->arIso[pExpInfo->hdr_mode]; #ifndef RK_SIMULATOR_HW for (i = 0; i < max_iso_step - 1; i++) { if (iso >= pParams->iso[i] && iso <= pParams->iso[i + 1] ) { iso_low = pParams->iso[i] ; iso_high = pParams->iso[i + 1]; gain_low = i; gain_high = i + 1; ratio = (float)(iso - iso_low) / (iso_high - iso_low); break; } } if(iso < pParams->iso[0] ) { iso_low = pParams->iso[0] ; iso_high = pParams->iso[1]; gain_low = 0; gain_high = 1; ratio = 0; } if(iso > pParams->iso[max_iso_step - 1] ) { iso_low = pParams->iso[max_iso_step - 2] ; iso_high = pParams->iso[max_iso_step - 1]; gain_low = max_iso_step - 2; gain_high = max_iso_step - 1; ratio = 1; } #else for (i = max_iso_step - 1; i >= 0; i--) { if (iso < iso_div * (2 << i)) { iso_low = iso_div * (2 << (i)) / 2; iso_high = iso_div * (2 << i); } } ratio = (float)(iso - iso_low) / (iso_high - iso_low); if (iso_low == iso) { iso_high = iso; ratio = 0; } if (iso_high == iso ) { iso_low = iso; ratio = 1; } gain_high = (int)(log((float)iso_high / 50) / log((float)2)); gain_low = (int)(log((float)iso_low / 50) / log((float)2)); gain_low = MIN(MAX(gain_low, 0), max_iso_step - 1); gain_high = MIN(MAX(gain_high, 0), max_iso_step - 1); #endif LOGD_ASHARP("%s:%d iso:%d gainlow:%d gian_high:%d\n", __FUNCTION__, __LINE__, iso, gain_high, gain_high); pSelect->enable = pParams->enable; pSelect->pbf_gain = INTERP_V3(pParams->pbf_gain[gain_low], pParams->pbf_gain[gain_high], ratio); pSelect->pbf_add = INTERP_V3(pParams->pbf_add[gain_low], pParams->pbf_add[gain_high], ratio); pSelect->pbf_ratio = INTERP_V3(pParams->pbf_ratio[gain_low], pParams->pbf_ratio[gain_high], ratio); pSelect->gaus_ratio = INTERP_V3(pParams->gaus_ratio[gain_low], pParams->gaus_ratio[gain_high], ratio); pSelect->sharp_ratio = INTERP_V3(pParams->sharp_ratio[gain_low], pParams->sharp_ratio[gain_high], ratio); pSelect->bf_gain = INTERP_V3(pParams->bf_gain[gain_low], pParams->bf_gain[gain_high], ratio); pSelect->bf_add = INTERP_V3(pParams->bf_add[gain_low], pParams->bf_add[gain_high], ratio); pSelect->bf_ratio = INTERP_V3(pParams->bf_ratio[gain_low], pParams->bf_ratio[gain_high], ratio); for(int i = 0; i < RK_SHARP_V3_PBF_DIAM * RK_SHARP_V3_PBF_DIAM; i++) { pSelect->kernel_pre_bila_filter[i] = INTERP_V3(pParams->kernel_pre_bila_filter [gain_low][i], pParams->kernel_pre_bila_filter[gain_high][i], ratio); } for(int i = 0; i < RK_SHARP_V3_RF_DIAM * RK_SHARP_V3_RF_DIAM; i++) { pSelect->kernel_range_filter[i] = INTERP_V3(pParams->kernel_range_filter [gain_low][i], pParams->kernel_range_filter[gain_high][i], ratio); } for(int i = 0; i < RK_SHARP_V3_BF_DIAM * RK_SHARP_V3_BF_DIAM; i++) { pSelect->kernel_bila_filter[i] = INTERP_V3(pParams->kernel_bila_filter [gain_low][i], pParams->kernel_bila_filter[gain_high][i], ratio); } ////////////////////////////////////////////////////////////////////////// // test params pSelect->sharp_ratio_h = INTERP_V3(pParams->sharp_ratio_h[gain_low], pParams->sharp_ratio_h[gain_high], ratio); pSelect->sharp_ratio_m = INTERP_V3(pParams->sharp_ratio_m[gain_low], pParams->sharp_ratio_m[gain_high], ratio); pSelect->sharp_ratio_l = INTERP_V3(pParams->sharp_ratio_l[gain_low], pParams->sharp_ratio_l[gain_high], ratio); for(int i = 0; i < RK_SHARP_V3_LUMA_POINT_NUM; i++) { pSelect->luma_point[i] = pParams->luma_point[i]; pSelect->luma_sigma[i] = INTERP_V3(pParams->luma_sigma[gain_low][i], pParams->luma_sigma[gain_high][i], ratio); pSelect->lum_clip_h[i] = (int16_t)ROUND_F(INTERP_V3(pParams->lum_clip_h[gain_low][i], pParams->lum_clip_h[gain_high][i], ratio)); pSelect->ehf_th[i] = (int16_t)ROUND_F(INTERP_V3(pParams->ehf_th[gain_low][i], pParams->ehf_th[gain_high][i], ratio)); ////////////////////////////////////////////////////////////////////////// pSelect->clip_hf[i] = (int16_t)ROUND_F(INTERP_V3(pParams->clip_hf[gain_low][i], pParams->clip_hf[gain_high][i], ratio)); pSelect->clip_mf[i] = (int16_t)ROUND_F(INTERP_V3(pParams->clip_mf[gain_low][i], pParams->clip_mf[gain_high][i], ratio)); pSelect->clip_lf[i] = (int16_t)ROUND_F(INTERP_V3(pParams->clip_lf[gain_low][i], pParams->clip_lf[gain_high][i], ratio)); pSelect->local_wgt[i] = (int16_t)ROUND_F(INTERP_V3(pParams->local_wgt[gain_low][i], pParams->local_wgt[gain_high][i], ratio)); } ////////////////////////////////////////////////////////////////////////// for(int i = 0; i < RK_SHARP_V3_HF_DIAM * RK_SHARP_V3_HF_DIAM; i++) { pSelect->kernel_hf_filter[i] = INTERP_V3(pParams->kernel_hf_filter[gain_low][i], pParams->kernel_hf_filter[gain_high][i], ratio); } for(int i = 0; i < RK_SHARP_V3_MF_DIAM * RK_SHARP_V3_MF_DIAM; i++) { pSelect->kernel_mf_filter[i] = INTERP_V3(pParams->kernel_mf_filter[gain_low][i], pParams->kernel_mf_filter[gain_high][i], ratio); } for(int i = 0; i < RK_SHARP_V3_LF_DIAM * RK_SHARP_V3_LF_DIAM; i++) { pSelect->kernel_lf_filter[i] = INTERP_V3(pParams->kernel_lf_filter[gain_low][i], pParams->kernel_lf_filter[gain_high][i], ratio); } LOGI_ASHARP("%s(%d): exit\n", __FUNCTION__, __LINE__); return res; } Asharp3_result_t sharp_fix_transfer_V3(RK_SHARP_Params_V3_Select_t *pSelect, RK_SHARP_Fix_V3_t* pFix, float fPercent) { int sum_coeff, offset; int pbf_sigma_shift = 0; int bf_sigma_shift = 0; Asharp3_result_t res = ASHARP3_RET_SUCCESS; int tmp = 0; LOGI_ASHARP("%s(%d): enter\n", __FUNCTION__, __LINE__); if(pSelect == NULL) { LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ASHARP3_RET_NULL_POINTER; } if(pFix == NULL) { LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ASHARP3_RET_NULL_POINTER; } if(fPercent <= 0.0) { fPercent = 0.000001; } // SHARP_SHARP_EN (0x0000) pFix->sharp_bypass = 0; pFix->sharp_en = pSelect->enable; // SHARP_SHARP_RATIO (0x0004) tmp = (int)ROUND_F(pSelect->sharp_ratio * fPercent * (1 << rk_sharp_V3_sharp_ratio_fix_bits)); pFix->sharp_sharp_ratio = CLIP(tmp, 0, 63); tmp = (int)ROUND_F(pSelect->bf_ratio / fPercent * (1 << rk_sharp_V3_bf_ratio_fix_bits)); pFix->sharp_bf_ratio = CLIP(tmp, 0, 128); tmp = (int)ROUND_F(pSelect->gaus_ratio / fPercent * (1 << rk_sharp_V3_gaus_ratio_fix_bits)); pFix->sharp_gaus_ratio = CLIP(tmp, 0, 128); tmp = (int)ROUND_F(pSelect->pbf_ratio / fPercent * (1 << rk_sharp_V3_bf_ratio_fix_bits)); pFix->sharp_pbf_ratio = CLIP(tmp, 0, 128); // SHARP_SHARP_LUMA_DX (0x0008) for(int i = 0; i < RK_SHARP_V3_LUMA_POINT_NUM - 1; i++) { tmp = ( log((float)(pSelect->luma_point[i + 1] - pSelect->luma_point[i])) / log((float)2) ); pFix->sharp_luma_dx[i] = CLIP(tmp, 0, 15); } // SHARP_SHARP_PBF_SIGMA_INV_0 (0x000c - 0x0014) // pre bf sigma inv int sigma_deci_bits = 9; int sigma_inte_bits = 1; int max_val = 0; int min_val = 65536; int shf_bits = 0; short sigma_bits[3]; for(int i = 0; i < RK_SHARP_V3_LUMA_POINT_NUM; i++) { int cur_sigma = FLOOR((pSelect->luma_sigma[i] * pSelect->pbf_gain + pSelect->pbf_add) / fPercent ); if(max_val < cur_sigma) max_val = cur_sigma; if(min_val > cur_sigma) min_val = cur_sigma; } sigma_bits[0] = FLOOR(log((float)min_val) / log((float)2)); sigma_bits[1] = MAX(sigma_inte_bits - sigma_bits[0], 0); sigma_bits[2] = sigma_deci_bits + sigma_bits[0]; pbf_sigma_shift = sigma_bits[2] - 5; for(int i = 0; i < RK_SHARP_V3_LUMA_POINT_NUM; i++) { tmp = (int16_t)ROUND_F((float)1 / (pSelect->luma_sigma[i] * pSelect->pbf_gain + pSelect->pbf_add) * fPercent * (1 << sigma_bits[2])); pFix->sharp_pbf_sigma_inv[i] = CLIP(tmp, 0, 1023); } // SHARP_SHARP_BF_SIGMA_INV_0 (0x0018 - 0x0020) // bf sigma inv sigma_deci_bits = 9; sigma_inte_bits = 1; max_val = 0; min_val = 65536; shf_bits = 0; for(int i = 0; i < RK_SHARP_V3_LUMA_POINT_NUM; i++) { int cur_sigma = FLOOR((pSelect->luma_sigma[i] * pSelect->bf_gain + pSelect->bf_add) / fPercent ); if(max_val < cur_sigma) max_val = cur_sigma; if(min_val > cur_sigma) min_val = cur_sigma; } sigma_bits[0] = FLOOR(log((float)min_val) / log((float)2)); sigma_bits[1] = MAX(sigma_inte_bits - sigma_bits[0], 0); sigma_bits[2] = sigma_deci_bits + sigma_bits[0]; bf_sigma_shift = sigma_bits[2] - 5; for(int i = 0; i < RK_SHARP_V3_LUMA_POINT_NUM; i++) { tmp = (int16_t)ROUND_F((float)1 / (pSelect->luma_sigma[i] * pSelect->bf_gain + pSelect->bf_add) * fPercent * (1 << sigma_bits[2])); pFix->sharp_bf_sigma_inv[i] = CLIP(tmp, 0, 1023); } // SHARP_SHARP_SIGMA_SHIFT (0x00024) pFix->sharp_pbf_sigma_shift = CLIP(bf_sigma_shift, 0, 15); pFix->sharp_bf_sigma_shift = CLIP(pbf_sigma_shift, 0, 15); // SHARP_SHARP_EHF_TH_0 (0x0028 - 0x0030) // wgt = hf * ehf_th for(int i = 0; i < RK_SHARP_V3_LUMA_POINT_NUM; i++) { tmp = (int)(pSelect->ehf_th[i] * fPercent); pFix->sharp_ehf_th[i] = CLIP(tmp, 0, 1023); } // SHARP_SHARP_CLIP_HF_0 (0x0034 - 0x003c) for(int i = 0; i < RK_SHARP_V3_LUMA_POINT_NUM; i++) { tmp = (int)(pSelect->lum_clip_h[i] * fPercent); pFix->sharp_clip_hf[i] = CLIP(tmp, 0, 1023); } // SHARP_SHARP_PBF_COEF (0x00040) // filter coeff // bf coeff // rk_sharp_V3_pbfCoeff : [4], [1], [0] tmp = (int)ROUND_F(pSelect->kernel_pre_bila_filter[0] * (1 << rk_sharp_V3_pbfCoeff_fix_bits)); pFix->sharp_pbf_coef[0] = CLIP(tmp, 0, 127); tmp = (int)ROUND_F(pSelect->kernel_pre_bila_filter[1] * (1 << rk_sharp_V3_pbfCoeff_fix_bits)); pFix->sharp_pbf_coef[1] = CLIP(tmp, 0, 127); tmp = (int)ROUND_F(pSelect->kernel_pre_bila_filter[2] * (1 << rk_sharp_V3_pbfCoeff_fix_bits)); pFix->sharp_pbf_coef[2] = CLIP(tmp, 0, 127); sum_coeff = pFix->sharp_pbf_coef[0] + 4 * pFix->sharp_pbf_coef[1] + 4 * pFix->sharp_pbf_coef[2]; offset = (1 << rk_sharp_V3_pbfCoeff_fix_bits) - sum_coeff; tmp = (int)(pFix->sharp_pbf_coef[0] + offset); pFix->sharp_pbf_coef[0] = CLIP(tmp, 0, 127); // SHARP_SHARP_BF_COEF (0x00044) // bf coeff // rk_sharp_V3_bfCoeff : [4], [1], [0] tmp = (int)ROUND_F(pSelect->kernel_bila_filter[0] * (1 << rk_sharp_V3_hbfCoeff_fix_bits)); pFix->sharp_bf_coef[0] = CLIP(tmp, 0, 127); tmp = (int)ROUND_F(pSelect->kernel_bila_filter[1] * (1 << rk_sharp_V3_hbfCoeff_fix_bits)); pFix->sharp_bf_coef[1] = CLIP(tmp, 0, 127); tmp = (int)ROUND_F(pSelect->kernel_bila_filter[2] * (1 << rk_sharp_V3_hbfCoeff_fix_bits)); pFix->sharp_bf_coef[2] = CLIP(tmp, 0, 127); sum_coeff = pFix->sharp_bf_coef[0] + 4 * pFix->sharp_bf_coef[1] + 4 * pFix->sharp_bf_coef[2]; offset = (1 << rk_sharp_V3_hbfCoeff_fix_bits) - sum_coeff; tmp = (int)(pFix->sharp_bf_coef[0] + offset); pFix->sharp_bf_coef[0] = CLIP(tmp, 0, 127); // SHARP_SHARP_GAUS_COEF (0x00048) // rk_sharp_V3_rfCoeff : [4], [1], [0] tmp = (int)ROUND_F(pSelect->kernel_range_filter[0] * (1 << rk_sharp_V3_rfCoeff_fix_bits)); pFix->sharp_gaus_coef[0] = CLIP(tmp, 0, 127); tmp = (int)ROUND_F(pSelect->kernel_range_filter[1] * (1 << rk_sharp_V3_rfCoeff_fix_bits)); pFix->sharp_gaus_coef[1] = CLIP(tmp, 0, 127); tmp = (int)ROUND_F(pSelect->kernel_range_filter[2] * (1 << rk_sharp_V3_rfCoeff_fix_bits)); pFix->sharp_gaus_coef[2] = CLIP(tmp, 0, 127); sum_coeff = pFix->sharp_gaus_coef[0] + 4 * pFix->sharp_gaus_coef[1] + 4 * pFix->sharp_gaus_coef[2]; offset = (1 << rk_sharp_V3_rfCoeff_fix_bits) - sum_coeff; tmp = (int)(pFix->sharp_gaus_coef[0] + offset); pFix->sharp_gaus_coef[0] = CLIP(tmp, 0, 127); #if 0 //////////////////////////////////params clip//////////////////////////////////////// pFix->sharp_sharp_ratio = CLIP(pFix->sharp_sharp_ratio, 0, 63); pFix->sharp_bf_ratio = CLIP(pFix->sharp_bf_ratio, 0, 128); pFix->sharp_gaus_ratio = CLIP(pFix->sharp_gaus_ratio, 0, 128); pFix->sharp_pbf_ratio = CLIP(pFix->sharp_pbf_ratio, 0, 128); for(int k = 0; k < RK_SHARP_V3_LUMA_POINT_NUM - 1; k ++) { pFix->sharp_luma_dx[k] = CLIP(pFix->sharp_luma_dx[k], 0, 15); } for(int k = 0; k < RK_SHARP_V3_LUMA_POINT_NUM; k ++) { pFix->sharp_pbf_sigma_inv[k] = CLIP(pFix->sharp_pbf_sigma_inv[k], 0, 1023); pFix->sharp_bf_sigma_inv[k] = CLIP(pFix->sharp_bf_sigma_inv[k], 0, 1023); pFix->sharp_clip_hf[k] = CLIP(pFix->sharp_clip_hf[k], 0, 1023); pFix->sharp_ehf_th[k] = CLIP(pFix->sharp_ehf_th[k], 0, 1023); } for(int k = 0; k < 3; k ++) { pFix->sharp_pbf_coef[k] = CLIP(pFix->sharp_pbf_coef[k], 0, 127); pFix->sharp_gaus_coef[k] = CLIP(pFix->sharp_gaus_coef[k], 0, 127); pFix->sharp_bf_coef[k] = CLIP(pFix->sharp_bf_coef[k], 0, 127); } pFix->sharp_pbf_sigma_shift = CLIP(pFix->sharp_pbf_sigma_shift, 0, 15); pFix->sharp_bf_sigma_shift = CLIP(pFix->sharp_bf_sigma_shift, 0, 15); #endif #if 0 sharp_fix_printf_V3(pFix); #endif LOGI_ASHARP("%s(%d): exit\n", __FUNCTION__, __LINE__); return res; } Asharp3_result_t sharp_fix_printf_V3(RK_SHARP_Fix_V3_t * pFix) { int i = 0; Asharp3_result_t res = ASHARP3_RET_SUCCESS; LOGI_ASHARP("%s:(%d) enter \n", __FUNCTION__, __LINE__); if(pFix == NULL) { LOGI_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ASHARP3_RET_NULL_POINTER; } // SHARP_SHARP_EN (0x0000) LOGD_ASHARP("(0x0000) sharp_bypass:0x%x sharp_en:0x%x \n", pFix->sharp_bypass, pFix->sharp_en); // SHARP_SHARP_RATIO (0x0004) LOGD_ASHARP("(0x0004) sharp_sharp_ratio:0x%x sharp_bf_ratio:0x%x sharp_gaus_ratio:0x%x sharp_pbf_ratio:0x%x \n", pFix->sharp_sharp_ratio, pFix->sharp_bf_ratio, pFix->sharp_gaus_ratio, pFix->sharp_pbf_ratio); // SHARP_SHARP_LUMA_DX (0x0008) for(int i = 0; i < 7; i++) { LOGD_ASHARP("(0x0008) sharp_luma_dx[%d]:0x%x \n", i, pFix->sharp_luma_dx[i]); } // SHARP_SHARP_PBF_SIGMA_INV_0 (0x000c - 0x0014) for(int i = 0; i < 8; i++) { LOGD_ASHARP("(0x000c - 0x0014) sharp_pbf_sigma_inv[%d]:0x%x \n", i, pFix->sharp_pbf_sigma_inv[i]); } // SHARP_SHARP_BF_SIGMA_INV_0 (0x0018 - 0x0020) for(int i = 0; i < 8; i++) { LOGD_ASHARP("(0x0018 - 0x0020) sharp_bf_sigma_inv[%d]:0x%x \n", i, pFix->sharp_bf_sigma_inv[i]); } // SHARP_SHARP_SIGMA_SHIFT (0x00024) LOGD_ASHARP("(0x00024) sharp_bf_sigma_shift:0x%x sharp_pbf_sigma_shift:0x%x \n", pFix->sharp_bf_sigma_shift, pFix->sharp_pbf_sigma_shift); // SHARP_SHARP_EHF_TH_0 (0x0028 - 0x0030) for(int i = 0; i < 8; i++) { LOGD_ASHARP("(0x0028 - 0x0030) sharp_ehf_th[%d]:0x%x \n", i, pFix->sharp_ehf_th[i]); } // SHARP_SHARP_CLIP_HF_0 (0x0034 - 0x003c) for(int i = 0; i < 8; i++) { LOGD_ASHARP("(0x0034 - 0x003c) sharp_clip_hf[%d]:0x%x \n", i, pFix->sharp_clip_hf[i]); } // SHARP_SHARP_PBF_COEF (0x00040) for(int i = 0; i < 3; i++) { LOGD_ASHARP("(0x00040) sharp_pbf_coef[%d]:0x%x \n", i, pFix->sharp_pbf_coef[i]); } // SHARP_SHARP_BF_COEF (0x00044) for(int i = 0; i < 3; i++) { LOGD_ASHARP("(0x00044) sharp_bf_coef[%d]:0x%x \n", i, pFix->sharp_bf_coef[i]); } // SHARP_SHARP_GAUS_COEF (0x00048) for(int i = 0; i < 3; i++) { LOGD_ASHARP("(0x00048) sharp_gaus_coef[%d]:0x%x \n", i, pFix->sharp_gaus_coef[i]); } return res; } Asharp3_result_t sharp_get_setting_by_name_json_V3(CalibDbV2_SharpV3_t *pCalibdbV2, char *name, int *tuning_idx) { int i = 0; Asharp3_result_t res = ASHARP3_RET_SUCCESS; LOGI_ASHARP("%s(%d): enter \n", __FUNCTION__, __LINE__); if(pCalibdbV2 == NULL || name == NULL || tuning_idx == NULL) { LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ASHARP3_RET_NULL_POINTER; } for(i = 0; i < pCalibdbV2->TuningPara.Setting_len; i++) { if(strncmp(name, pCalibdbV2->TuningPara.Setting[i].SNR_Mode, strlen(name)*sizeof(char)) == 0) { break; } } if(i < pCalibdbV2->TuningPara.Setting_len) { *tuning_idx = i; } else { *tuning_idx = 0; } LOGI_ASHARP("%s:%d snr_name:%s snr_idx:%d i:%d \n", __FUNCTION__, __LINE__, name, *tuning_idx, i); return res; } Asharp3_result_t sharp_init_params_json_V3(RK_SHARP_Params_V3_t *pSharpParams, CalibDbV2_SharpV3_t *pCalibdbV2, int tuning_idx) { Asharp3_result_t res = ASHARP3_RET_SUCCESS; int i = 0; int j = 0; short isoCurveSectValue; short isoCurveSectValue1; float ave1, ave2, ave3, ave4; int bit_calib = 12; int bit_proc; int bit_shift; CalibDbV2_SharpV3_TuningPara_Setting_ISO_t *pTuningISO; LOGI_ASHARP("%s(%d): enter\n", __FUNCTION__, __LINE__); if(pSharpParams == NULL || pCalibdbV2 == NULL) { LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ASHARP3_RET_NULL_POINTER; } for(i = 0; i < pCalibdbV2->TuningPara.Setting[tuning_idx].Tuning_ISO_len && i < RK_SHARP_V3_MAX_ISO_NUM; i++) { pTuningISO = &pCalibdbV2->TuningPara.Setting[tuning_idx].Tuning_ISO[i]; pSharpParams->iso[i] = pTuningISO->iso; for(j = 0; j < RK_SHARP_V3_LUMA_POINT_NUM; j++) { pSharpParams->luma_point[j] = pTuningISO->luma_para.luma_point[j]; pSharpParams->luma_sigma[i][j] = pTuningISO->luma_para.luma_sigma[j]; pSharpParams->lum_clip_h[i][j] = pTuningISO->luma_para.hf_clip[j]; pSharpParams->ehf_th[i][j] = pTuningISO->luma_para.local_sharp_strength[j]; } pSharpParams->pbf_gain[i] = pTuningISO->pbf_gain; pSharpParams->pbf_add[i] = pTuningISO->pbf_add; pSharpParams->pbf_ratio[i] = pTuningISO->pbf_ratio; pSharpParams->gaus_ratio[i] = pTuningISO->gaus_ratio; pSharpParams->sharp_ratio[i] = pTuningISO->sharp_ratio; pSharpParams->bf_gain[i] = pTuningISO->bf_gain; pSharpParams->bf_add[i] = pTuningISO->bf_add; pSharpParams->bf_ratio[i] = pTuningISO->bf_ratio; for(j = 0; j < 3; j++) { pSharpParams->kernel_bila_filter[i][j] = pTuningISO->kernel_para.GaussianFilter_coeff[j]; pSharpParams->kernel_pre_bila_filter[i][j] = pTuningISO->kernel_para.prefilter_coeff[j]; pSharpParams->kernel_range_filter[i][j] = pTuningISO->kernel_para.hfBilateralFilter_coeff[j]; LOGD_ASHARP("kernel: index[%d][%d] = %f\n", i, j, pSharpParams->kernel_bila_filter[i][j]); } } LOGI_ASHARP("%s(%d): exit\n", __FUNCTION__, __LINE__); return res; } Asharp3_result_t sharp_config_setting_param_json_V3(RK_SHARP_Params_V3_t *pParams, CalibDbV2_SharpV3_t *pCalibdbV2, char* param_mode, char * snr_name) { Asharp3_result_t res = ASHARP3_RET_SUCCESS; int tuning_idx = 0; LOGI_ASHARP("%s(%d): enter\n", __FUNCTION__, __LINE__); if(pParams == NULL || pCalibdbV2 == NULL || param_mode == NULL || snr_name == NULL) { LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ASHARP3_RET_NULL_POINTER; } LOGD_ASHARP("%s(%d): mode:%s setting:%s \n", __FUNCTION__, __LINE__, param_mode, snr_name); res = sharp_get_setting_by_name_json_V3(pCalibdbV2, snr_name, &tuning_idx); if(res != ASHARP3_RET_SUCCESS) { LOGW_ASHARP("%s(%d): error!!! can't find setting in iq files, use 0 instead\n", __FUNCTION__, __LINE__); } res = sharp_init_params_json_V3(pParams, pCalibdbV2, tuning_idx); pParams->enable = pCalibdbV2->TuningPara.enable; LOGI_ASHARP("%s(%d): exit\n", __FUNCTION__, __LINE__); return res; } RKAIQ_END_DECLARE