#include "rk_aiq_anr_algo_uvnr.h" RKAIQ_BEGIN_DECLARE ANRresult_t uvnr_get_mode_cell_idx_by_name(CalibDb_UVNR_2_t *pCalibdb, char *name, int *mode_idx) { int i = 0; ANRresult_t res = ANR_RET_SUCCESS; if(pCalibdb == NULL){ LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ANR_RET_NULL_POINTER; } if(name == NULL){ LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ANR_RET_NULL_POINTER; } if(mode_idx == NULL){ LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ANR_RET_NULL_POINTER; } if(pCalibdb->mode_num < 1){ LOGE_ANR("%s(%d): uvnr mode cell num is zero\n", __FUNCTION__, __LINE__); return ANR_RET_NULL_POINTER; } for(i=0; imode_num; i++){ if(strncmp(name, pCalibdb->mode_cell[i].name, sizeof(pCalibdb->mode_cell[i].name)) == 0){ break; } } if(i < pCalibdb->mode_num){ *mode_idx = i; res = ANR_RET_SUCCESS; }else{ *mode_idx = 0; res = ANR_RET_FAILURE; } LOGD_ANR("%s:%d mode_name:%s mode_idx:%d i:%d \n", __FUNCTION__, __LINE__, name, *mode_idx, i); return res; } ANRresult_t uvnr_get_setting_idx_by_name(CalibDb_UVNR_2_t *pCalibdb, char *name, int mode_idx, int *setting_idx) { int i = 0; ANRresult_t res = ANR_RET_SUCCESS; if(pCalibdb == NULL){ LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ANR_RET_NULL_POINTER; } if(name == NULL){ LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ANR_RET_NULL_POINTER; } if(setting_idx == NULL){ LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ANR_RET_NULL_POINTER; } for(i=0; imode_cell[mode_idx].setting[i].snr_mode, sizeof(pCalibdb->mode_cell[mode_idx].setting[i].snr_mode)) == 0){ break; } } if(imode_cell[mode_idx].setting[setting_idx]; for(i = 0; i < MAX_ISO_STEP; i++) { #ifndef RK_SIMULATOR_HW pParams->iso[i] = pSetting->ISO[i]; #endif pParams->ratio[i] = pSetting->step0_uvgrad_ratio[i]; pParams->offset[i] = pSetting->step0_uvgrad_offset[i]; pParams->wStep1[i] = pSetting->step1_downSample_w[i]; pParams->hStep1[i] = pSetting->step1_downSample_h[i]; pParams->meanSize1[i] = pSetting->step1_downSample_meansize[i]; pParams->medSize1[i] = pSetting->step1_median_size[i]; pParams->medRatio1[i] = pSetting->step1_median_ratio[i]; pParams->isMedIIR1[i] = pSetting->step1_median_IIR[i]; pParams->bfSize1[i] = pSetting->step1_bf_size[i]; pParams->sigmaR1[i] = pSetting->step1_bf_sigmaR[i]; pParams->sigmaD1[i] = pSetting->step1_bf_sigmaD[i]; pParams->uvgain1[i] = pSetting->step1_bf_uvgain[i]; pParams->bfRatio1[i] = pSetting->step1_bf_ratio[i]; pParams->isRowIIR1[i] = pSetting->step1_bf_isRowIIR[i]; pParams->isYcopy1[i] = pSetting->step1_bf_isYcopy[i]; pParams->wStep2[i] = pSetting->step2_downSample_w[i]; pParams->hStep2[i] = pSetting->step2_downSample_h[i]; pParams->meanSize2[i] = pSetting->step2_downSample_meansize[i]; pParams->medSize2[i] = pSetting->step2_median_size[i]; pParams->medRatio2[i] = pSetting->step2_median_ratio[i]; pParams->isMedIIR2[i] = pSetting->step2_median_IIR[i]; pParams->bfSize3[i] = pSetting->step2_bf_size[i]; pParams->sigmaR2[i] = pSetting->step2_bf_sigmaR[i]; pParams->sigmaD2[i] = pSetting->step2_bf_sigmaD[i]; pParams->uvgain2[i] = pSetting->step2_bf_uvgain[i]; pParams->bfRatio2[i] = pSetting->step2_bf_ratio[i]; pParams->isRowIIR2[i] = pSetting->step2_bf_isRowIIR[i]; pParams->isYcopy2[i] = pSetting->step2_bf_isYcopy[i]; pParams->bfSize3[i] = pSetting->step3_bf_size[i]; pParams->sigmaR3[i] = pSetting->step3_bf_sigmaR[i]; pParams->sigmaD3[i] = pSetting->step3_bf_sigmaD[i]; pParams->uvgain3[i] = pSetting->step3_bf_uvgain[i]; pParams->bfRatio3[i] = pSetting->step3_bf_ratio[i]; pParams->isRowIIR3[i] = pSetting->step3_bf_isRowIIR[i]; pParams->isYcopy3[i] = pSetting->step3_bf_isYcopy[i]; } for(i=0; i<4; i++){ pParams->nonMed1[i] = pSetting->step1_nonMed1[i]; pParams->nonBf1[i] = pSetting->step1_nonBf1[i]; pParams->block2_ext[i] = pSetting->step2_nonExt_block[i]; pParams->nonMed2[i] = pSetting->step2_nonMed[i]; pParams->nonBf2[i] = pSetting->step2_nonBf[i]; pParams->nonBf3[i] = pSetting->step3_nonBf3[i]; } for(i=0; i<3; i++){ pParams->kernel_3x3_table[i] = pSetting->kernel_3x3[i]; } for(i=0; i<5; i++){ pParams->kernel_5x5_talbe[i] = pSetting->kernel_5x5[i]; } for(i=0; i<8; i++){ pParams->kernel_9x9_table[i] = pSetting->kernel_9x9[i]; } pParams->kernel_9x9_num = pSetting->kernel_9x9_num; for(i=0; i<9; i++){ pParams->sigmaAdj_x[i] = pSetting->sigma_adj_luma[i]; pParams->sigamAdj_y[i] = pSetting->sigma_adj_ratio[i]; pParams->threAdj_x[i] = pSetting->threshold_adj_luma[i]; pParams->threAjd_y[i] = pSetting->threshold_adj_thre[i]; } return ANR_RET_SUCCESS; } ANRresult_t uvnr_get_setting_idx_by_name_json(CalibDbV2_UVNR_t *pCalibdb, char *name, int *tuning_idx) { int i = 0; ANRresult_t res = ANR_RET_SUCCESS; if(pCalibdb == NULL){ LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ANR_RET_NULL_POINTER; } if(name == NULL){ LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ANR_RET_NULL_POINTER; } if(tuning_idx == NULL){ LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ANR_RET_NULL_POINTER; } for(i=0; iTuningPara.Setting_len; i++){ if(strncmp(name, pCalibdb->TuningPara.Setting[i].SNR_Mode, strlen(name)*sizeof(char)) == 0){ break; } } if(iTuningPara.Setting_len){ *tuning_idx = i; res = ANR_RET_SUCCESS; }else{ *tuning_idx = 0; res = ANR_RET_FAILURE; } LOGD_ANR("%s:%d snr_name:%s snr_idx:%d i:%d \n", __FUNCTION__, __LINE__,name,*tuning_idx, i); return res; } ANRresult_t init_uvnr_params_json(RKAnr_Uvnr_Params_t *pParams, CalibDbV2_UVNR_t *pCalibdb, int setting_idx) { ANRresult_t res = ANR_RET_SUCCESS; int i = 0; int j = 0; float luma[9] = {0.0000, 32.0000, 64.0000, 96.0000, 128.0000, 160.0000, 192.0000, 224.0000, 256.0000 }; if(pParams == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ANR_RET_NULL_POINTER; } if(pCalibdb == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ANR_RET_NULL_POINTER; } CalibDbV2_UVNR_TuningPara_Setting_t *pSetting = &pCalibdb->TuningPara.Setting[setting_idx]; CalibDbV2_UVNR_TuningPara_Setting_ISO_t *pTuning_ISO = NULL; for(i = 0; i < pSetting->Tuning_ISO_len; i++) { pTuning_ISO = &pSetting->Tuning_ISO[i]; #ifndef RK_SIMULATOR_HW pParams->iso[i] = pTuning_ISO->iso; #endif pParams->ratio[i] = pTuning_ISO->step0_uvgrad_ratio; pParams->offset[i] = pTuning_ISO->step0_uvgrad_offset; pParams->wStep1[i] = 4; pParams->hStep1[i] = 4; pParams->meanSize1[i] = 4; pParams->medSize1[i] = 3; pParams->medRatio1[i] = pTuning_ISO->step1_median_ratio; pParams->isMedIIR1[i] = 0; pParams->bfSize1[i] = 5; pParams->sigmaR1[i] = pTuning_ISO->step1_bf_sigmaR; pParams->sigmaD1[i] = 16; pParams->uvgain1[i] = pTuning_ISO->step1_bf_uvgain; pParams->bfRatio1[i] = pTuning_ISO->step1_bf_ratio; pParams->isRowIIR1[i] = 0; pParams->isYcopy1[i] = 1; pParams->wStep2[i] = 32; pParams->hStep2[i] = 32; pParams->meanSize2[i] =8; pParams->medSize2[i] = 3; pParams->medRatio2[i] = pTuning_ISO->step2_median_ratio; pParams->isMedIIR2[i] = 0; pParams->bfSize3[i] = 5; pParams->sigmaR2[i] = pTuning_ISO->step2_bf_sigmaR; pParams->sigmaD2[i] = 128; pParams->uvgain2[i] = pTuning_ISO->step2_bf_uvgain; pParams->bfRatio2[i] = pTuning_ISO->step2_bf_ratio; pParams->isRowIIR2[i] = 0; pParams->isYcopy2[i] = 1; pParams->bfSize3[i] = 3; pParams->sigmaR3[i] = pTuning_ISO->step3_bf_sigmaR; pParams->sigmaD3[i] = 8; pParams->uvgain3[i] = pTuning_ISO->step3_bf_uvgain; pParams->bfRatio3[i] = pTuning_ISO->step3_bf_ratio; pParams->isRowIIR3[i] = 0; pParams->isYcopy3[i] = 1; } for(i=0; i<4; i++){ pParams->nonMed1[i] = 3; pParams->nonBf1[i] = 31; pParams->block2_ext[i] = 7; pParams->nonMed2[i] = 1; pParams->nonBf2[i] = 3; pParams->nonBf3[i] = 32; } for(i=0; i<3; i++){ pParams->kernel_3x3_table[i] = pCalibdb->TuningPara.Kernel_Coeff.kernel_3x3[i]; } for(i=0; i<5; i++){ pParams->kernel_5x5_talbe[i] = pCalibdb->TuningPara.Kernel_Coeff.kernel_5x5[i]; } for(i=0; i<8; i++){ pParams->kernel_9x9_table[i] = pCalibdb->TuningPara.Kernel_Coeff.kernel_9x9[i]; } pParams->kernel_9x9_num = pCalibdb->TuningPara.Kernel_Coeff.kernel_9x9_num; for(i=0; i<9; i++){ pParams->sigmaAdj_x[i] = luma[i]; pParams->sigamAdj_y[i] = 1; pParams->threAdj_x[i] = luma[i]; pParams->threAjd_y[i] = 10; } uvnr_algo_param_printf(pParams); return ANR_RET_SUCCESS; } ANRresult_t uvnr_algo_param_printf(RKAnr_Uvnr_Params_t *pParams) { int i,j; if(pParams != NULL){ for(i=0; iiso[i]); #endif LOGD_ANR(" ratio:%f, offset:%f medRatio1\n", pParams->ratio[i], pParams->offset[i]); LOGD_ANR("step1_median_ratio:%f step1_bf_sigmaR:%f step1_bf_uvgain:%f step1_bf_ratio:%f\n", pParams->medRatio1[i], pParams->sigmaR1[i], pParams->uvgain1[i], pParams->bfRatio1[i]); LOGD_ANR("step2_median_ratio:%f step2_bf_sigmaR:%f step2_bf_uvgain:%f step2_bf_ratio:%f\n", pParams->medRatio2[i], pParams->sigmaR2[i], pParams->uvgain2[i], pParams->bfRatio2[i]); LOGD_ANR(" step3_bf_sigmaR:%f step3_bf_uvgain:%f step3_bf_ratio:%f\n", pParams->sigmaR3[i], pParams->uvgain3[i], pParams->bfRatio3[i]); LOGD_ANR(" kernel3x3: %f %f %f\n", pParams->kernel_3x3_table[0], pParams->kernel_3x3_table[1], pParams->kernel_3x3_table[2]); LOGD_ANR(" kernel5x5: %f %f %f %f %f\n", pParams->kernel_5x5_talbe[0], pParams->kernel_5x5_talbe[1], pParams->kernel_5x5_talbe[2], pParams->kernel_5x5_talbe[3], pParams->kernel_5x5_talbe[4]); LOGD_ANR(" kernel9x9: %f %f %f %f %f %f %f %f\n", pParams->kernel_9x9_table[0], pParams->kernel_9x9_table[1], pParams->kernel_9x9_table[2], pParams->kernel_9x9_table[3], pParams->kernel_9x9_table[4], pParams->kernel_9x9_table[5], pParams->kernel_9x9_table[6], pParams->kernel_9x9_table[7]); LOGD_ANR("kernel_num:%d\n\n", pParams->kernel_9x9_num); } } return ANR_RET_SUCCESS; } ANRresult_t uvnr_config_setting_param_json(RKAnr_Uvnr_Params_t *pParams, CalibDbV2_UVNR_t *pCalibdb, char* param_mode, char * snr_name) { ANRresult_t res = ANR_RET_SUCCESS; int tuning_idx = 0; if(pParams == NULL){ LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ANR_RET_NULL_POINTER; } if(pCalibdb == NULL){ LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ANR_RET_NULL_POINTER; } res = uvnr_get_setting_idx_by_name_json(pCalibdb, snr_name, &tuning_idx); if(res != ANR_RET_SUCCESS){ LOGW_ANR("%s(%d): error!!! can't find setting in iq files, use 0 instead\n", __FUNCTION__, __LINE__); } res = init_uvnr_params_json(pParams, pCalibdb, tuning_idx); return res; } float interpISO(int ISO_low, int ISO_high, float value_low, float value_high, int ISO, float value) { if (ISO <= ISO_low) { value = value_low; } else if (ISO >= ISO_high) { value = value_high; } else { value = float(ISO - ISO_low) / float(ISO_high - ISO_low) * (value_high - value_low) + value_low; } return value; } ANRresult_t select_uvnr_params_by_ISO(RKAnr_Uvnr_Params_t *stRKUVNrParams, RKAnr_Uvnr_Params_Select_t *stRKUVNrParamsSelected, ANRExpInfo_t *pExpInfo) { ANRresult_t res = ANR_RET_SUCCESS; int iso = 50; if(stRKUVNrParams == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ANR_RET_NULL_POINTER; } if(stRKUVNrParamsSelected == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ANR_RET_NULL_POINTER; } if(pExpInfo == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ANR_RET_NULL_POINTER; } if(pExpInfo->mfnr_mode_3to1){ iso = pExpInfo->preIso[pExpInfo->hdr_mode]; }else{ iso = pExpInfo->arIso[pExpInfo->hdr_mode]; } //È·¶¨isoµÈ¼¶ //rkuvnriso@50 100 200 400 800 1600 3200 6400 12800 // isogain: 1 2 4 8 16 32 64 128 256 // isoindex: 0 1 2 3 4 5 6 7 8 int isoIndex = 0; int isoGainLow = 0; int isoGainHigh = 0; int isoIndexLow = 0; int isoIndexHigh = 0; int iso_div = 50; int max_iso_step = MAX_ISO_STEP; int i = 0; #ifndef RK_SIMULATOR_HW for ( i = 0; i < max_iso_step - 1 ; i++) { if (iso >= stRKUVNrParams->iso[i] && iso <= stRKUVNrParams->iso[i + 1]) { isoGainLow = stRKUVNrParams->iso[i] ; isoGainHigh = stRKUVNrParams->iso[i + 1]; isoIndexLow = i; isoIndexHigh = i + 1; isoIndex = isoIndexLow; break; } } if(i == max_iso_step - 1){ if(iso < stRKUVNrParams->iso[0] ) { isoGainLow = stRKUVNrParams->iso[0]; isoGainHigh = stRKUVNrParams->iso[1]; isoIndexLow = 0; isoIndexHigh = 1; isoIndex = 0; } if(iso > stRKUVNrParams->iso[max_iso_step - 1] ) { isoGainLow = stRKUVNrParams->iso[max_iso_step - 2] ; isoGainHigh = stRKUVNrParams->iso[max_iso_step - 1]; isoIndexLow = max_iso_step - 2; isoIndexHigh = max_iso_step - 1; isoIndex = max_iso_step - 1; } } #else isoIndex = int(log(float(iso / iso_div)) / log(2.0f)); for (i = max_iso_step - 1; i >= 0; i--) { if (iso < iso_div * (2 << i)) { isoGainLow = iso_div * (2 << (i)) / 2; isoGainHigh = iso_div * (2 << i); } } isoGainLow = MIN(isoGainLow, iso_div * (2 << max_iso_step)); isoGainHigh = MIN(isoGainHigh, iso_div * (2 << max_iso_step)); isoIndexHigh = (int)(log((float)isoGainHigh / iso_div) / log((float)2)); isoIndexLow = (int)(log((float)isoGainLow / iso_div) / log((float)2)); isoIndexLow = MIN(MAX(isoIndexLow, 0), max_iso_step - 1); isoIndexHigh = MIN(MAX(isoIndexHigh, 0), max_iso_step - 1); #endif LOGD_ANR("%s:%d iso:%d high:%d low:%d \n", __FUNCTION__, __LINE__, iso, isoGainHigh, isoGainLow); //È¡Êý memcpy(stRKUVNrParamsSelected->select_iso, stRKUVNrParams->rkuvnrISO, sizeof(char) * 256); //step0:uvgainÔ¤´¦Àí stRKUVNrParamsSelected->ratio = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->ratio[isoIndexLow], stRKUVNrParams->ratio[isoIndexHigh], iso, stRKUVNrParamsSelected->ratio); stRKUVNrParamsSelected->offset = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->offset[isoIndexLow], stRKUVNrParams->offset[isoIndexHigh], iso, stRKUVNrParamsSelected->offset); //step1-ϲÉÑù1 //¾ùÖµ1 stRKUVNrParamsSelected->wStep1 = stRKUVNrParams->wStep1[isoIndex]; stRKUVNrParamsSelected->hStep1 = stRKUVNrParams->hStep1[isoIndex]; stRKUVNrParamsSelected->meanSize1 = stRKUVNrParams->meanSize1[isoIndex]; //ÖÐÖµ1 memcpy(stRKUVNrParamsSelected->nonMed1, stRKUVNrParams->nonMed1, sizeof(int) * 4); stRKUVNrParamsSelected->medSize1 = stRKUVNrParams->medSize1[isoIndex]; stRKUVNrParamsSelected->medRatio1 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->medRatio1[isoIndexLow], stRKUVNrParams->medRatio1[isoIndexHigh], iso, stRKUVNrParamsSelected->medRatio1); stRKUVNrParamsSelected->isMedIIR1 = stRKUVNrParams->isMedIIR1[isoIndex]; //Ë«±ß1 memcpy(stRKUVNrParamsSelected->nonBf1, stRKUVNrParams->nonBf1, sizeof(int) * 4); stRKUVNrParamsSelected->bfSize1 = stRKUVNrParams->bfSize1[isoIndex]; stRKUVNrParamsSelected->sigmaR1 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->sigmaR1[isoIndexLow], stRKUVNrParams->sigmaR1[isoIndexHigh], iso, stRKUVNrParamsSelected->sigmaR1); stRKUVNrParamsSelected->sigmaD1 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->sigmaD1[isoIndexLow], stRKUVNrParams->sigmaD1[isoIndexHigh], iso, stRKUVNrParamsSelected->sigmaD1); stRKUVNrParamsSelected->uvgain1 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->uvgain1[isoIndexLow], stRKUVNrParams->uvgain1[isoIndexHigh], iso, stRKUVNrParamsSelected->uvgain1); stRKUVNrParamsSelected->bfRatio1 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->bfRatio1[isoIndexLow], stRKUVNrParams->bfRatio1[isoIndexHigh], iso, stRKUVNrParamsSelected->bfRatio1); stRKUVNrParamsSelected->isRowIIR1 = stRKUVNrParams->isRowIIR1[isoIndex]; stRKUVNrParamsSelected->isYcopy1 = stRKUVNrParams->isYcopy1[isoIndex]; //step2-ϲÉÑù2 memcpy(stRKUVNrParamsSelected->block2_ext, stRKUVNrParams->block2_ext, sizeof(int) * 4); //¾ùÖµ2 stRKUVNrParamsSelected->wStep2 = stRKUVNrParams->wStep2[isoIndex]; stRKUVNrParamsSelected->hStep2 = stRKUVNrParams->hStep2[isoIndex]; stRKUVNrParamsSelected->meanSize2 = stRKUVNrParams->meanSize2[isoIndex]; //ÖÐÖµ2 memcpy(stRKUVNrParamsSelected->nonMed2, stRKUVNrParams->nonMed2, sizeof(int) * 4); stRKUVNrParamsSelected->medSize2 = stRKUVNrParams->medSize2[isoIndex]; stRKUVNrParamsSelected->medRatio2 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->medRatio2[isoIndexLow], stRKUVNrParams->medRatio2[isoIndexHigh], iso, stRKUVNrParamsSelected->medRatio2); stRKUVNrParamsSelected->isMedIIR2 = stRKUVNrParams->isMedIIR2[isoIndex]; //Ë«±ß2 memcpy(stRKUVNrParamsSelected->nonBf2, stRKUVNrParams->nonBf2, sizeof(int) * 4); stRKUVNrParamsSelected->bfSize2 = stRKUVNrParams->bfSize2[isoIndex]; stRKUVNrParamsSelected->sigmaR2 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->sigmaR2[isoIndexLow], stRKUVNrParams->sigmaR2[isoIndexHigh], iso, stRKUVNrParamsSelected->sigmaR2); stRKUVNrParamsSelected->sigmaD2 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->sigmaD2[isoIndexLow], stRKUVNrParams->sigmaD2[isoIndexHigh], iso, stRKUVNrParamsSelected->sigmaD2); stRKUVNrParamsSelected->uvgain2 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->uvgain2[isoIndexLow], stRKUVNrParams->uvgain2[isoIndexHigh], iso, stRKUVNrParamsSelected->uvgain2); stRKUVNrParamsSelected->bfRatio2 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->bfRatio2[isoIndexLow], stRKUVNrParams->bfRatio2[isoIndexHigh], iso, stRKUVNrParamsSelected->bfRatio2); stRKUVNrParamsSelected->isRowIIR2 = stRKUVNrParams->isRowIIR2[isoIndex]; stRKUVNrParamsSelected->isYcopy2 = stRKUVNrParams->isYcopy2[isoIndex]; //step3 memcpy(stRKUVNrParamsSelected->nonBf3, stRKUVNrParams->nonBf3, sizeof(int) * 4); //Ë«±ß3 stRKUVNrParamsSelected->bfSize3 = stRKUVNrParams->bfSize3[isoIndex]; stRKUVNrParamsSelected->sigmaR3 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->sigmaR3[isoIndexLow], stRKUVNrParams->sigmaR3[isoIndexHigh], iso, stRKUVNrParamsSelected->sigmaR3); stRKUVNrParamsSelected->sigmaD3 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->sigmaD3[isoIndexLow], stRKUVNrParams->sigmaD3[isoIndexHigh], iso, stRKUVNrParamsSelected->sigmaD3); stRKUVNrParamsSelected->uvgain3 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->uvgain3[isoIndexLow], stRKUVNrParams->uvgain3[isoIndexHigh], iso, stRKUVNrParamsSelected->uvgain3); stRKUVNrParamsSelected->bfRatio3 = interpISO(isoGainLow, isoGainHigh, stRKUVNrParams->bfRatio3[isoIndexLow], stRKUVNrParams->bfRatio3[isoIndexHigh], iso, stRKUVNrParamsSelected->bfRatio3); stRKUVNrParamsSelected->isRowIIR3 = stRKUVNrParams->isRowIIR3[isoIndex]; stRKUVNrParamsSelected->isYcopy3 = stRKUVNrParams->isYcopy3[isoIndex]; //kernels memcpy(stRKUVNrParamsSelected->kernel_3x3_table, stRKUVNrParams->kernel_3x3_table, sizeof(float) * 3); memcpy(stRKUVNrParamsSelected->kernel_5x5_table, stRKUVNrParams->kernel_5x5_talbe, sizeof(float) * 5); memcpy(stRKUVNrParamsSelected->kernel_9x9_table, stRKUVNrParams->kernel_9x9_table, sizeof(float) * 8); stRKUVNrParamsSelected->kernel_9x9_num = stRKUVNrParams->kernel_9x9_num; //curves memcpy(stRKUVNrParamsSelected->sigmaAdj_x, stRKUVNrParams->sigmaAdj_x, sizeof(int) * 9); memcpy(stRKUVNrParamsSelected->sigmaAdj_y, stRKUVNrParams->sigamAdj_y, sizeof(float) * 9); memcpy(stRKUVNrParamsSelected->threAdj_x, stRKUVNrParams->threAdj_x, sizeof(int) * 9); memcpy(stRKUVNrParamsSelected->threAdj_y, stRKUVNrParams->threAjd_y, sizeof(int) * 9); return ANR_RET_SUCCESS; } ANRresult_t uvnr_fix_transfer(RKAnr_Uvnr_Params_Select_t *uvnr, RKAnr_Uvnr_Fix_t *pNrCfg, ANRExpInfo_t *pExpInfo, float gain_ratio, float fStrength) { LOGI_ANR("%s:(%d) enter \n", __FUNCTION__, __LINE__); int i = 0; ANRresult_t res = ANR_RET_SUCCESS; if(uvnr == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ANR_RET_NULL_POINTER; } if(pNrCfg == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ANR_RET_NULL_POINTER; } if(pExpInfo == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ANR_RET_NULL_POINTER; } int iso = pExpInfo->arIso[pExpInfo->hdr_mode] * gain_ratio; int log2e = (int)(0.8493f * (1 << RKUVNR_log2e)); log2e = log2e * (1 << RKUVNR_imgBit_set); //0x0080 pNrCfg->uvnr_step1_en = 1; pNrCfg->uvnr_step2_en = 1; pNrCfg->nr_gain_en = 1; pNrCfg->uvnr_nobig_en = 0; pNrCfg->uvnr_big_en = 0; //0x0084 pNrCfg->uvnr_gain_1sigma = (unsigned char)(uvnr->ratio * (1 << RKUVNR_ratio)); //0x0088 pNrCfg->uvnr_gain_offset = (unsigned char)(uvnr->offset * (1 << RKUVNR_offset)); //0x008c pNrCfg->uvnr_gain_uvgain[0] = (unsigned char)(uvnr->uvgain1 * fStrength * (1 << RKUVNR_uvgain)); if( pNrCfg->uvnr_gain_uvgain[0] > 0x7f){ pNrCfg->uvnr_gain_uvgain[0] = 0x7f; } pNrCfg->uvnr_gain_uvgain[1] = (unsigned char)(uvnr->uvgain3 * fStrength * (1 << RKUVNR_uvgain)); if( pNrCfg->uvnr_gain_uvgain[1] > 0x7f){ pNrCfg->uvnr_gain_uvgain[1] = 0x7f; } pNrCfg->uvnr_gain_t2gen = (unsigned char)(uvnr->uvgain2 * fStrength * (1 << RKUVNR_uvgain)); if( pNrCfg->uvnr_gain_t2gen > 0x7f){ pNrCfg->uvnr_gain_t2gen = 0x7f; } pNrCfg->uvnr_gain_iso = (int)(sqrt(50.0 / (float)(iso)) * (1 << RKUVNR_gainRatio)); if(pNrCfg->uvnr_gain_iso > 0x80) { pNrCfg->uvnr_gain_iso = 0x80; } if(pNrCfg->uvnr_gain_iso < 0x8) { pNrCfg->uvnr_gain_iso = 0x8; } //0x0090 pNrCfg->uvnr_t1gen_m3alpha = (uvnr->medRatio1 * (1 << RKUVNR_medRatio)); //0x0094 pNrCfg->uvnr_t1flt_mode = uvnr->kernel_9x9_num; //0x0098 pNrCfg->uvnr_t1flt_msigma = (unsigned short)(log2e / uvnr->sigmaR1); pNrCfg->uvnr_t1flt_msigma = MIN(pNrCfg->uvnr_t1flt_msigma, 8191); //0x009c pNrCfg->uvnr_t1flt_wtp = (unsigned char)(uvnr->bfRatio1 * (1 << RKUVNR_bfRatio)); //0x00a0-0x00a4 for(i = 0; i < 8; i++) { pNrCfg->uvnr_t1flt_wtq[i] = (unsigned char)(uvnr->kernel_9x9_table[i] * (1 << RKUVNR_kernels)); } //0x00a8 pNrCfg->uvnr_t2gen_m3alpha = (unsigned char)(uvnr->medRatio2 * (1 << RKUVNR_medRatio)); //0x00ac pNrCfg->uvnr_t2gen_msigma = (unsigned short)(log2e / uvnr->sigmaR2); pNrCfg->uvnr_t2gen_msigma = MIN(pNrCfg->uvnr_t2gen_msigma, 8191); //0x00b0 pNrCfg->uvnr_t2gen_wtp = (unsigned char)(uvnr->kernel_5x5_table[0] * (1 << RKUVNR_kernels)); //0x00b4 for(i = 0; i < 4; i++) { pNrCfg->uvnr_t2gen_wtq[i] = (unsigned char)(uvnr->kernel_5x5_table[i + 1] * (1 << RKUVNR_kernels)); } //0x00b8 pNrCfg->uvnr_t2flt_msigma = (unsigned short)(log2e / uvnr->sigmaR3); pNrCfg->uvnr_t2flt_msigma = MIN(pNrCfg->uvnr_t2flt_msigma, 8191); //0x00bc pNrCfg->uvnr_t2flt_wtp = (unsigned char)(uvnr->bfRatio3 * (1 << RKUVNR_bfRatio)); for(i = 0; i < 3; i++) { pNrCfg->uvnr_t2flt_wt[i] = (unsigned char)(uvnr->kernel_3x3_table[i] * (1 << RKUVNR_kernels)); } #if UVNR_FIX_VALUE_PRINTF uvnr_fix_Printf(pNrCfg); #endif LOGI_ANR("%s:(%d) exit \n", __FUNCTION__, __LINE__); return ANR_RET_SUCCESS; } ANRresult_t uvnr_fix_Printf(RKAnr_Uvnr_Fix_t * pNrCfg) { int i = 0; LOGI_ANR("%s:(%d) enter \n", __FUNCTION__, __LINE__); ANRresult_t res = ANR_RET_SUCCESS; if(pNrCfg == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ANR_RET_NULL_POINTER; } //0x0080 LOGD_ANR("(0x0080) uvnr_step1_en:%d uvnr_step2_en:%d nr_gain_en:%d uvnr_nobig_en:%d uvnr_big_en:%d\n", pNrCfg->uvnr_step1_en, pNrCfg->uvnr_step2_en, pNrCfg->nr_gain_en, pNrCfg->uvnr_nobig_en, pNrCfg->uvnr_big_en); //0x0084 LOGD_ANR("(0x0084) uvnr_gain_1sigma:%d \n", pNrCfg->uvnr_gain_1sigma); //0x0088 LOGD_ANR("(0x0088) uvnr_gain_offset:%d \n", pNrCfg->uvnr_gain_offset); //0x008c LOGD_ANR("uvnr: (0x008c) uvnr_gain_uvgain:%d uvnr_step2_en:%d uvnr_gain_t2gen:%d uvnr_gain_iso:%d\n", pNrCfg->uvnr_gain_uvgain[0], pNrCfg->uvnr_gain_uvgain[1], pNrCfg->uvnr_gain_t2gen, pNrCfg->uvnr_gain_iso); //0x0090 LOGD_ANR("(0x0090) uvnr_t1gen_m3alpha:%d \n", pNrCfg->uvnr_t1gen_m3alpha); //0x0094 LOGD_ANR("(0x0094) uvnr_t1flt_mode:%d \n", pNrCfg->uvnr_t1flt_mode); //0x0098 LOGD_ANR("(0x0098) uvnr_t1flt_msigma:%d \n", pNrCfg->uvnr_t1flt_msigma); //0x009c LOGD_ANR("(0x009c) uvnr_t1flt_wtp:%d \n", pNrCfg->uvnr_t1flt_wtp); //0x00a0-0x00a4 for(i = 0; i < 8; i++) { LOGD_ANR("(0x00a0-0x00a4) uvnr_t1flt_wtq[%d]:%d \n", i, pNrCfg->uvnr_t1flt_wtq[i]); } //0x00a8 LOGD_ANR("(0x00a8) uvnr_t2gen_m3alpha:%d \n", pNrCfg->uvnr_t2gen_m3alpha); //0x00ac LOGD_ANR("(0x00ac) uvnr_t2gen_msigma:%d \n", pNrCfg->uvnr_t2gen_msigma); //0x00b0 LOGD_ANR("(0x00b0) uvnr_t2gen_wtp:%d \n", pNrCfg->uvnr_t2gen_wtp); //0x00b4 for(i = 0; i < 4; i++) { LOGD_ANR("(0x00b4) uvnr_t2gen_wtq[%d]:%d \n", i, pNrCfg->uvnr_t2gen_wtq[i]); } //0x00b8 LOGD_ANR("(0x00b8) uvnr_t2flt_msigma:%d \n", pNrCfg->uvnr_t2flt_msigma); //0x00bc LOGD_ANR("(0x00bc) uvnr_t2flt_wtp:%d \n", pNrCfg->uvnr_t2flt_wtp); for(i = 0; i < 3; i++) { LOGD_ANR("(0x00bc) uvnr_t2flt_wt[%d]:%d \n", i, pNrCfg->uvnr_t2flt_wt[i]); } LOGD_ANR("%s:(%d) exit \n", __FUNCTION__, __LINE__); return ANR_RET_SUCCESS; } ANRresult_t uvnr_calibdbV2_assign(CalibDbV2_UVNR_t *pDst, CalibDbV2_UVNR_t *pSrc) { ANRresult_t res = ANR_RET_SUCCESS; CalibDbV2_UVNR_TuningPara_t *pSrcTuningParaV2 = NULL; CalibDbV2_UVNR_TuningPara_t *pDstTuningParaV2 = NULL; int setting_len =0; int iso_len = 0; if(pDst == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ANR_RET_NULL_POINTER; } if(pSrc == NULL) { LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return ANR_RET_NULL_POINTER; } uvnr_calibdbV2_free(pDst); pSrcTuningParaV2 = &pSrc->TuningPara; pDstTuningParaV2 = &pDst->TuningPara; //assign the value pDst->Version = strdup(pSrc->Version); pDstTuningParaV2->enable = pSrcTuningParaV2->enable; //malloc iso size setting_len = pSrcTuningParaV2->Setting_len; pDstTuningParaV2->Setting = (CalibDbV2_UVNR_TuningPara_Setting_t *)malloc(setting_len * sizeof(CalibDbV2_UVNR_TuningPara_Setting_t)); memset(pDstTuningParaV2->Setting, 0x00, setting_len * sizeof(CalibDbV2_UVNR_TuningPara_Setting_t)); pDstTuningParaV2->Setting_len = setting_len; for(int i=0; iSetting[i].Tuning_ISO_len; pDstTuningParaV2->Setting[i].Tuning_ISO = (CalibDbV2_UVNR_TuningPara_Setting_ISO_t *)malloc(iso_len * sizeof(CalibDbV2_UVNR_TuningPara_Setting_ISO_t)); memset(pDstTuningParaV2->Setting[i].Tuning_ISO, 0x00, iso_len * sizeof(CalibDbV2_UVNR_TuningPara_Setting_ISO_t)); pDstTuningParaV2->Setting[i].Tuning_ISO_len = iso_len; } for(int i=0; iSetting[i].Tuning_ISO_len; pDstTuningParaV2->Setting[i].SNR_Mode = strdup(pSrcTuningParaV2->Setting[i].SNR_Mode); pDstTuningParaV2->Setting[i].Sensor_Mode = strdup(pSrcTuningParaV2->Setting[i].Sensor_Mode); for(int j=0; jSetting[i].Tuning_ISO[j] = pSrcTuningParaV2->Setting[i].Tuning_ISO[j]; } } pDstTuningParaV2->Kernel_Coeff = pSrcTuningParaV2->Kernel_Coeff; return res; } void uvnr_calibdbV2_free(CalibDbV2_UVNR_t *pCalibdbV2) { if(pCalibdbV2){ if(pCalibdbV2->Version){ free(pCalibdbV2->Version); } if(pCalibdbV2->TuningPara.Setting){ for(int i=0; iTuningPara.Setting_len; i++){ if(pCalibdbV2->TuningPara.Setting[i].SNR_Mode){ free(pCalibdbV2->TuningPara.Setting[i].SNR_Mode); } if(pCalibdbV2->TuningPara.Setting[i].Sensor_Mode){ free(pCalibdbV2->TuningPara.Setting[i].Sensor_Mode); } if(pCalibdbV2->TuningPara.Setting[i].Tuning_ISO){ free(pCalibdbV2->TuningPara.Setting[i].Tuning_ISO); } } free(pCalibdbV2->TuningPara.Setting); } } } RKAIQ_END_DECLARE