You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

177 lines
8.3 KiB

#include "rk_aiq_isp39_modules.h"
#define BIT_MIN (0)
#define BIT_3_MAX (7)
#define BIT_4_MAX (15)
#define BIT_8_MAX (255)
#define BIT_10_MAX (1023)
#define BIT_14_MAX (16383)
#define BIT_17_MAX (131071)
#define LIMIT_VALUE(value,max_value,min_value) (value > max_value? max_value : value < min_value ? min_value : value)
#define YNR_V24_ISO_CURVE_POINT_BIT 4
#define YNR_V24_ISO_CURVE_POINT_NUM ((1 << YNR_V24_ISO_CURVE_POINT_BIT)+1)
#define YNR_V24_NOISE_SIGMA_FIX_BIT 3
int ynrClipFloatValueV24(float posx, int BitInt, int BitFloat) {
int yOutInt = 0;
int yOutIntMax = (int)(pow(2, (BitFloat + BitInt)) - 1);
int yOutIntMin = 0;
yOutInt = LIMIT_VALUE((int)(posx * pow(2, BitFloat)), yOutIntMax, yOutIntMin);
return yOutInt;
}
void rk_aiq_ynr34_params_cvt(void* attr, struct isp39_isp_params_cfg* isp_cfg,common_cvt_info_t *cvtinfo)
{
int i;
int tmp;
int w0, w1, w2;
struct isp39_ynr_cfg *pFix = &isp_cfg->others.ynr_cfg;
ynr_param_t *ynr_param = (ynr_param_t *) attr;
ynr_params_static_t* psta = &ynr_param->sta;
ynr_params_dyn_t* pdyn = &ynr_param->dyn;
int rows = cvtinfo->rawHeight;
int cols = cvtinfo->rawWidth;
// YNR_2700_GLOBAL_CTRL (0x0000)
pFix->lospnr_bypass = !pdyn->hw_ynrT_loNr_en;
pFix->hispnr_bypass = !pdyn->hiNr_filtProc.hw_ynrT_nlmFilt_en;
pFix->exgain_bypass = 0;
pFix->global_set_gain = ynrClipFloatValueV24(pdyn->ynrScl_locSgmStrg.hw_ynrT_glbSgmStrg_val, 6, 4);
pFix->gain_merge_alpha = LIMIT_VALUE(pdyn->ynrScl_locSgmStrg.hw_ynrT_glbSgmStrg_alpha * 8.0, BIT_3_MAX + 1, BIT_MIN);
pFix->rnr_en = 1;
// YNR_2700_RNR_MAX_R (0x0004)
float r_sq_inv = 16.0f / (cols * cols + rows * rows); // divide 2
int* number_ptr = (int*)(&r_sq_inv);
int EE = ((*number_ptr) >> 23) & (0x0ff);
EE = -(EE - 127 + 1);
int MM = (*number_ptr) & 0x7fffff;
float tmp2 = ((MM / (float)(1 << 23)) + 1) / 2;
MM = (int)(256 * tmp2 + 0.5);
tmp = (MM << 5) + EE;
pFix->rnr_max_radius = CLIP(tmp, 0, 0x3fff);
// local gain scale
tmp = (1.0) * (1 << 7);
pFix->local_gain_scale = CLIP(tmp, 0, 0x80);
// YNR_2700_CENTRE_COOR (0x0008)
pFix->rnr_center_coorv = rows / 2;
pFix->rnr_center_coorh = cols / 2;
// YNR_2700_LOCAL_GAIN_CTRL (0x000c) register deleted
// YNR_2700_LOWNR_CTRL0 (0x0010)
pFix->ds_filt_soft_thred_scale =
ynrClipFloatValueV24(pdyn->loNr_iirGuide.hw_ynrT_softThd_scale, 4, 5);
pFix->ds_img_edge_scale = ynrClipFloatValueV24(pdyn->loNr_preProc.sw_ynrT_edgeDctConf_scale, 5, 0);
pFix->ds_filt_wgt_thred_scale =
ynrClipFloatValueV24(pdyn->loNr_iirGuide.hw_ynrT_pixDiffEge_thred, 3, 6);
// YNR_2700_LOWNR_CTRL1 (0x0014)
pFix->ds_filt_local_gain_alpha =
LIMIT_VALUE(pdyn->loNr_iirGuide.hw_ynrT_localYnrScl_alpha * 16.0f, BIT_4_MAX + 1, BIT_MIN);
pFix->ds_iir_init_wgt_scale = ynrClipFloatValueV24(pdyn->loNr_iirGuide.hw_ynrT_iirInitWgt_scale, 0, 6);
pFix->ds_filt_center_wgt = ynrClipFloatValueV24(pdyn->loNr_iirGuide.hw_ynrT_centerPix_wgt, 1, 10);
// YNR_2700_LOWNR_CTRL2 (0x0018)
if (pdyn->loNr_iirGuide.hw_ynrT_iiFilt_strg == 0.0f)
pFix->ds_filt_inv_strg = 0x3fff;
else
pFix->ds_filt_inv_strg = ynrClipFloatValueV24(1.0f / pdyn->loNr_iirGuide.hw_ynrT_iiFilt_strg, 5, 9);
pFix->lospnr_wgt = LIMIT_VALUE(pdyn->loNr_bifilt.hw_ynrT_bifiltOut_alpha * 1024.0f, BIT_10_MAX + 1, BIT_MIN);
// YNR_2700_LOWNR_CTRL3 (0x001c)
pFix->lospnr_center_wgt = ynrClipFloatValueV24(pdyn->loNr_bifilt.hw_ynrT_centerPix_wgt, 2, 10);
pFix->lospnr_strg = ynrClipFloatValueV24(pdyn->loNr_bifilt.hw_ynrT_rgeSgm_scale, 5, 7);
// YNR_2700_LOWNR_CTRL4 (0x002c)
pFix->lospnr_dist_vstrg_scale =
ynrClipFloatValueV24(pdyn->loNr_bifilt.hw_ynrT_filtSpatialV_strg, 3, 6);
pFix->lospnr_dist_hstrg_scale =
ynrClipFloatValueV24(pdyn->loNr_bifilt.hw_ynrT_filtSpatialH_strg, 3, 6);
// YNR_2700_GAUSS_COEFF (0x0030)
if (pdyn->loNr_preProc.sw_ynrT_preLpfCfg_mode == ynr_cfgByFiltStrg_mode) {
float filter1_sigma = pdyn->loNr_preProc.sw_ynrT_preLpf_strg;
float filt1_coeff1 = exp(-1 / (2 * filter1_sigma * filter1_sigma));
float filt1_coeff0 = filt1_coeff1 * filt1_coeff1;
float coeff1_sum = 1 + 4 * filt1_coeff1 + 4 * filt1_coeff0;
int w2 = (int)(filt1_coeff0 / coeff1_sum * 128 + 0.5);
int w1 = (int)(filt1_coeff1 / coeff1_sum * 128 + 0.5);
int w0 = 128 - w1 * 4 - w2 * 4;
pFix->pre_filt_coeff0 = w0;
pFix->pre_filt_coeff1 = w1;
pFix->pre_filt_coeff2 = w2;
} else {
pFix->pre_filt_coeff0 = pdyn->loNr_preProc.hw_ynrT_preLpfSpatial_wgt[0];
pFix->pre_filt_coeff1 = pdyn->loNr_preProc.hw_ynrT_preLpfSpatial_wgt[1];
pFix->pre_filt_coeff2 = pdyn->loNr_preProc.hw_ynrT_preLpfSpatial_wgt[2];
}
// YNR_2700_LOW_GAIN_ADJ (0x0034 ~ 0x003c)
for (int i = 0; i < 9; i++) {
pFix->lospnr_gain2strg_val[i] =
ynrClipFloatValueV24(pdyn->ynrScl_locSgmStrg.hw_ynrT_locSgmStrg2YnrScl_val[i], 4, 4);
}
// YNR_2700_SGM_DX (0x0040 ~ 0x0060)
// YNR_2700_luma2sima_val (0x0070 ~ 0x0060)
if (psta->sw_ynrCfg_sgmCurve_mode == ynr_cfgByCoeff2Curve_mode) {
for (int i = 0; i < YNR_V24_ISO_CURVE_POINT_NUM; i++) {
tmp = pdyn->hw_ynrC_luma2Sigma_curve.idx[i];
pFix->luma2sima_idx[i] = CLIP(tmp, 0, 0x400);
tmp = (int)(pdyn->hw_ynrC_luma2Sigma_curve.val[i] * (1 << YNR_V24_NOISE_SIGMA_FIX_BIT)) * pdyn->coeff2SgmCurve.lowFreqCoeff;
pFix->luma2sima_val[i] = CLIP(tmp, 0, 0xfff);
}
} else {
for (int i = 0; i < YNR_V24_ISO_CURVE_POINT_NUM; i++) {
tmp = pdyn->hw_ynrC_luma2Sigma_curve.idx[i];
pFix->luma2sima_idx[i] = CLIP(tmp, 0, 0x400);
tmp = (int)(pdyn->hw_ynrC_luma2Sigma_curve.val[i] * (1 << YNR_V24_NOISE_SIGMA_FIX_BIT));
pFix->luma2sima_val[i] = CLIP(tmp, 0, 0xfff);
}
}
// YNR_2700_RNR_STRENGTH03 (0x00d0- 0x00e0)
for (int i = 0; i < 17; i++) {
tmp = (int)(pdyn->ynrScl_radi.hw_ynrT_radiDist2YnrScl_val[i] * 16);
pFix->radius2strg_val[i] = CLIP(tmp, 0, 0xff);
}
// YNR_2700_NLM_STRONG_EDGE (0x00ec)
pFix->hispnr_strong_edge = ynrClipFloatValueV24(pdyn->hiNr_alphaProc.hw_ynrT_edgAlphaUp_thred, 5, 3);
// YNR_2700_NLM_SIGMA_GAIN (0x00f0)
pFix->hispnr_sigma_min_limit =
ynrClipFloatValueV24(pdyn->hiNr_filtProc.hw_ynrT_nlmSgm_minLimit, 0, 11);
pFix->hispnr_local_gain_alpha =
LIMIT_VALUE(pdyn->hiNr_filtProc.hw_ynrT_localYnrScl_alpha * 16.0f, BIT_4_MAX + 1, BIT_MIN);
pFix->hispnr_strg = ynrClipFloatValueV24(pdyn->hiNr_filtProc.hw_ynrT_nlmSgm_scale, 4, 6);
// YNR_2700_NLM_COE (0x00f4)
pFix->hispnr_filt_coeff[0] = ynrClipFloatValueV24(pdyn->hiNr_filtProc.hw_ynrT_nlmSpatial_wgt[0], 4, 0);
pFix->hispnr_filt_coeff[1] = ynrClipFloatValueV24(pdyn->hiNr_filtProc.hw_ynrT_nlmSpatial_wgt[1], 4, 0);
pFix->hispnr_filt_coeff[2] = ynrClipFloatValueV24(pdyn->hiNr_filtProc.hw_ynrT_nlmSpatial_wgt[2], 4, 0);
pFix->hispnr_filt_coeff[3] = ynrClipFloatValueV24(pdyn->hiNr_filtProc.hw_ynrT_nlmSpatial_wgt[3], 4, 0);
pFix->hispnr_filt_coeff[4] = ynrClipFloatValueV24(pdyn->hiNr_filtProc.hw_ynrT_nlmSpatial_wgt[4], 4, 0);
pFix->hispnr_filt_coeff[5] = ynrClipFloatValueV24(pdyn->hiNr_filtProc.hw_ynrT_nlmSpatial_wgt[5], 4, 0);
// YNR_2700_NLM_WEIGHT (0x00f8)
pFix->hispnr_filt_wgt_offset =
ynrClipFloatValueV24(pdyn->hiNr_filtProc.hw_ynrT_nlmRgeWgt_negOff, 0, 10);
pFix->hispnr_filt_center_wgt =
LIMIT_VALUE(pdyn->hiNr_filtProc.hw_ynrT_centerPix_wgt * 1024.0f, BIT_17_MAX + 1, BIT_MIN);
// YNR_2700_NLM_NR_WEIGHT (0x00fc)
pFix->hispnr_filt_wgt =
LIMIT_VALUE(pdyn->hiNr_alphaProc.hw_ynrT_nlmOut_alpha * 1024.0f, BIT_10_MAX + 1, BIT_MIN);
pFix->hispnr_gain_thred = LIMIT_VALUE(pdyn->hiNr_alphaProc.hw_ynrT_locSgmStrgAlphaUp_thred * 16.0, BIT_10_MAX, 1);
return;
}