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.
247 lines
11 KiB
247 lines
11 KiB
#include "rk_aiq_isp32_modules.h"
|
|
|
|
bool rk_aiq_sharp32_check_attrib(sharp_api_attrib_t *attr)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
bool rk_aiq_sharp32_check_param(sharp_param_t *param)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
#define RK_SHARP_V33_SHARP_RATIO_FIX_BITS 2
|
|
#define RK_SHARP_V33_GAUS_RATIO_FIX_BITS 7
|
|
#define RK_SHARP_V33_BF_RATIO_FIX_BITS 7
|
|
#define RK_SHARP_V33_PBFCOEFF_FIX_BITS 7
|
|
#define RK_SHARP_V33_RFCOEFF_FIX_BITS 7
|
|
#define RK_SHARP_V33_HBFCOEFF_FIX_BITS 7
|
|
#define RK_SHARP_V33_GLOBAL_GAIN_FIX_BITS 4
|
|
#define RK_SHARP_V33_GLOBAL_GAIN_ALPHA_FIX_BITS 3
|
|
#define RK_SHARP_V33_LOCAL_GAIN_FIX_BITS 4
|
|
#define RK_SHARP_V33_LOCAL_GAIN_SACLE_FIX_BITS 7
|
|
#define RK_SHARP_V33_ADJ_GAIN_FIX_BITS 10
|
|
#define RK_SHARP_V33_STRENGTH_TABLE_FIX_BITS 7
|
|
#define RK_SHARP_V33_LUMA_POINT_NUM (8)
|
|
|
|
void rk_aiq_sharp32_params_cvt(void* attr, struct isp32_isp_params_cfg* isp_cfg, common_cvt_info_t *cvtinfo)
|
|
{
|
|
int i;
|
|
int tmp;
|
|
int pbf_sigma_shift = 0;
|
|
int bf_sigma_shift = 0;
|
|
struct isp32_sharp_cfg *phwcfg = &isp_params->isp_cfg->others.sharp_cfg ;
|
|
sharp_param_t *sharp_param = (sharp_param_t *) attr;
|
|
sharp_params_dyn_t* pdyn = &sharp_param->dyn;
|
|
int rows = cvtinfo->rawHeight;
|
|
int cols = cvtinfo->rawWidth;
|
|
|
|
if (cols > 3072 && rows > 1728) {
|
|
phwcfg->radius_ds_mode = 1;
|
|
} else {
|
|
phwcfg->radius_ds_mode = 0;
|
|
}
|
|
|
|
phwcfg->noiseclip_mode = pdyn->textureDct.hw_sharpT_noiseSgmLimit_mode == sharp_setManual_mode;
|
|
phwcfg->exgain_bypass = pdyn->inPixSgm.hw_sharpT_inPixSgm_mode == sharp_inPixSgmGlb_mode;
|
|
//phwcfg->bypass = bypass;
|
|
tmp = (int)ROUND_F(pdyn->sharpOpt.hw_sharpT_hfGlbShpWgt_val *
|
|
(1 << RK_SHARP_V33_SHARP_RATIO_FIX_BITS));
|
|
phwcfg->sharp_ratio = CLIP(tmp, 0, 127);
|
|
tmp = (int)ROUND_F(pdyn->bifilt.hw_sharpT_biFiltOut_alpha *
|
|
(1 << RK_SHARP_V33_BF_RATIO_FIX_BITS));
|
|
phwcfg->bf_ratio = CLIP(tmp, 0, 0x80);
|
|
tmp = (int)ROUND_F(pdyn->gausFilt.hw_sharpT_gausFiltOut_alpha *
|
|
(1 << RK_SHARP_V33_GAUS_RATIO_FIX_BITS));
|
|
phwcfg->gaus_ratio = CLIP(tmp, 0, 0x80);
|
|
tmp = (int)ROUND_F(pdyn->preBifilt.hw_sharpT_biFiltOut_alpha *
|
|
(1 << RK_SHARP_V33_BF_RATIO_FIX_BITS));
|
|
phwcfg->pbf_ratio = CLIP(tmp, 0, 0x80);
|
|
|
|
for (int i = 0; i < ISP3X_SHARP_X_NUM; i++) {
|
|
tmp = (int16_t)LOG2(pdyn->preBifilt.hw_sharpC_luma2RSigma_curve.idx[i + 1] -
|
|
pdyn->preBifilt.hw_sharpC_luma2RSigma_curve.idx[i]);
|
|
phwcfg->luma_dx[i] = CLIP(tmp, 0, 15);
|
|
}
|
|
|
|
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 < ISP3X_SHARP_Y_NUM; i++) {
|
|
int cur_sigma = FLOOR((pdyn->preBifilt.hw_sharpC_luma2RSigma_curve.val[i] *
|
|
pdyn->preBifilt.sw_sharpT_rsigma_scale +
|
|
pdyn->preBifilt.hw_sharpT_rsigma_offset));
|
|
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 (i = 0; i < ISP3X_SHARP_Y_NUM; i++) {
|
|
tmp = (int16_t)ROUND_F((float)1 / (pdyn->preBifilt.hw_sharpC_luma2RSigma_curve.val[i] *
|
|
pdyn->preBifilt.sw_sharpT_rsigma_scale +
|
|
pdyn->preBifilt.hw_sharpT_rsigma_offset) * (1 << sigma_bits[2]));
|
|
phwcfg->pbf_sigma_inv[i] = CLIP(tmp, 0, 4095);
|
|
}
|
|
|
|
sigma_deci_bits = 9;
|
|
sigma_inte_bits = 1;
|
|
max_val = 0;
|
|
min_val = 65536;
|
|
shf_bits = 0;
|
|
for (int i = 0; i < RK_SHARP_V33_LUMA_POINT_NUM; i++) {
|
|
int cur_sigma = FLOOR((pdyn->bifilt.hw_sharpC_luma2RSigma_curve.val[i] *
|
|
pdyn->bifilt.sw_sharpT_rsigma_scale +
|
|
pdyn->bifilt.hw_sharpT_rsigma_offset));
|
|
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 (i = 0; i < ISP3X_SHARP_Y_NUM; i++) {
|
|
tmp = (int16_t)ROUND_F((float)1 / (pdyn->bifilt.hw_sharpC_luma2RSigma_curve.val[i] *
|
|
pdyn->bifilt.sw_sharpT_rsigma_scale +
|
|
pdyn->bifilt.hw_sharpT_rsigma_offset) * (1 << sigma_bits[2]));
|
|
phwcfg->bf_sigma_inv[i] = CLIP(tmp, 0, 4095);
|
|
}
|
|
phwcfg->pbf_sigma_shift = CLIP(pbf_sigma_shift, 0, 15);;
|
|
phwcfg->bf_sigma_shift = CLIP(bf_sigma_shift, 0, 15);;
|
|
|
|
for (int i = 0; i < ISP3X_SHARP_Y_NUM; i++) {
|
|
tmp = (int)(pdyn->sharpOpt.hw_sharpT_luma2hfShpLimit_val[i]);
|
|
phwcfg->clip_hf[i] = CLIP(tmp, 0, 1023);
|
|
}
|
|
|
|
float pre_bila_filter[3];
|
|
if (pdyn->preBifilt.sw_sharpT_filtCfg_mode == sharp_cfgByFiltStrg_mode) {
|
|
float dis_table_3x3[3] = {0.0, 1.0, 2.0};
|
|
double e = 2.71828182845905;
|
|
float sigma = pdyn->preBifilt.sw_sharpT_filtSpatial_strg;
|
|
float sum_gauss_coeff = 0.0;
|
|
for (int i = 0; i < 3; i++) {
|
|
float tmpf = pow(e, -dis_table_3x3[i] / 2.0 / sigma / sigma);
|
|
pre_bila_filter[i] = tmpf;
|
|
}
|
|
sum_gauss_coeff = pre_bila_filter[0] + 4 * pre_bila_filter[1] + 4 * pre_bila_filter[2];
|
|
for (int i = 0; i < 3; i++) {
|
|
pre_bila_filter[i] = pre_bila_filter[i] / sum_gauss_coeff;
|
|
}
|
|
} else {
|
|
for (int i = 0; i < 3; i++) {
|
|
pre_bila_filter[i] = pdyn->preBifilt.hw_sharpT_filtSpatial_wgt[i];
|
|
}
|
|
}
|
|
tmp = (int)ROUND_F(pre_bila_filter[0] * (1 << RK_SHARP_V33_PBFCOEFF_FIX_BITS));
|
|
phwcfg->pbf_coef0 = CLIP(tmp, 0, 127);
|
|
tmp = (int)ROUND_F(pre_bila_filter[1] * (1 << RK_SHARP_V33_PBFCOEFF_FIX_BITS));
|
|
phwcfg->pbf_coef1 = CLIP(tmp, 0, 127);
|
|
tmp = (int)ROUND_F(pre_bila_filter[2] * (1 << RK_SHARP_V33_PBFCOEFF_FIX_BITS));
|
|
phwcfg->pbf_coef2 = CLIP(tmp, 0, 127);
|
|
|
|
float bila_filter[3];
|
|
if (pdyn->bifilt.sw_sharpT_filtCfg_mode == sharp_cfgByFiltStrg_mode) {
|
|
float dis_table_3x3[3] = {0.0, 1.0, 2.0};
|
|
double e = 2.71828182845905;
|
|
float sigma = pdyn->bifilt.sw_sharpT_filtSpatial_strg;
|
|
float sum_gauss_coeff = 0.0;
|
|
for (int i = 0; i < 3; i++) {
|
|
float tmpf = pow(e, -dis_table_3x3[i] / 2.0 / sigma / sigma);
|
|
bila_filter[i] = tmpf;
|
|
}
|
|
sum_gauss_coeff = bila_filter[0] + 4 * bila_filter[1] + 4 * bila_filter[2];
|
|
for (int i = 0; i < 3; i++) {
|
|
bila_filter[i] = bila_filter[i] / sum_gauss_coeff;
|
|
}
|
|
} else {
|
|
for (int i = 0; i < 3; i++) {
|
|
bila_filter[i] = pdyn->bifilt.hw_sharpT_filtSpatial_wgt[i];
|
|
}
|
|
}
|
|
tmp = (int)ROUND_F(bila_filter[0] * (1 << RK_SHARP_V33_RFCOEFF_FIX_BITS));
|
|
phwcfg->bf_coef0 = CLIP(tmp, 0, 127);
|
|
tmp = (int)ROUND_F(bila_filter[1] * (1 << RK_SHARP_V33_RFCOEFF_FIX_BITS));
|
|
phwcfg->bf_coef1 = CLIP(tmp, 0, 127);
|
|
tmp = (int)ROUND_F(bila_filter[2] * (1 << RK_SHARP_V33_RFCOEFF_FIX_BITS));
|
|
phwcfg->bf_coef2 = CLIP(tmp, 0, 127);
|
|
|
|
float range_filter[6];
|
|
if (pdyn->gausFilt.sw_sharpT_filtCfg_mode == sharp_cfgByFiltStrg_mode) {
|
|
float gauss_dis_table_5x5[6] = {0.0, 1.0, 2.0, 4.0, 5.0, 8.0};
|
|
float gauss_dis_table_3x3[6] = {0.0, 1.0, 2.0, 1000, 1000, 1000};
|
|
double e = 2.71828182845905;
|
|
float sigma = pdyn->gausFilt.sw_sharpT_gausFilt_Strg;
|
|
float sum_gauss_coeff = 0.0;
|
|
if (pdyn->gausFilt.sw_sharpT_filtSpatialRadi_mode == sharp_filt5_mode) {
|
|
for (int i = 0; i < 6; i++) {
|
|
float tmp = pow(e, -gauss_dis_table_5x5[i] / 2.0 / sigma / sigma);
|
|
range_filter[i] = tmp;
|
|
}
|
|
} else {
|
|
for (int i = 0; i < 6; i++) {
|
|
float tmp = pow(e, -gauss_dis_table_3x3[i] / 2.0 / sigma / sigma);
|
|
range_filter[i] = tmp;
|
|
}
|
|
}
|
|
|
|
sum_gauss_coeff = range_filter[0] + 4 * range_filter[1] + 4 * range_filter[2] +
|
|
4 * range_filter[3] + 8 * range_filter[4] + 4 * range_filter[5];
|
|
for (int i = 0; i < 6; i++) {
|
|
range_filter[i] = range_filter[i] / sum_gauss_coeff;
|
|
}
|
|
} else {
|
|
for (int i = 0; i < 6; i++) {
|
|
range_filter[i] = pdyn->gausFilt.hw_sharpT_gausFilt_coeff[i];
|
|
}
|
|
}
|
|
for (int i = 0; i < ISP3X_SHARP_GAUS_COEF_NUM; i++) {
|
|
tmp = (int)ROUND_F(range_filter[i] * (1 << RK_SHARP_V33_HBFCOEFF_FIX_BITS));
|
|
phwcfg->gaus_coef[i] = CLIP(tmp, 0, 127);
|
|
}
|
|
|
|
tmp = pdyn->inPixSgm.hw_sharpT_glbPixSgm_val *
|
|
(1 << RK_SHARP_V33_GLOBAL_GAIN_FIX_BITS);
|
|
phwcfg->global_gain = CLIP(tmp, 0, 1023);
|
|
tmp = pdyn->inPixSgm.hw_sharpT_glbPixSgm_alpha *
|
|
(1 << RK_SHARP_V33_GLOBAL_GAIN_ALPHA_FIX_BITS);
|
|
phwcfg->global_gain_alpha = CLIP(tmp, 0, 8);
|
|
tmp = pdyn->inPixSgm.hw_sharpT_localPixSgm_scale *
|
|
(1 << RK_SHARP_V33_LOCAL_GAIN_SACLE_FIX_BITS);
|
|
phwcfg->local_gainscale = CLIP(tmp, 0, 128);
|
|
for (int i = 0; i < 14; i++) {
|
|
tmp = ROUND_F(pdyn->sharpOpt.hw_sharpT_pixSgm2ShpWgt_val[i] *
|
|
(1 << RK_SHARP_V33_ADJ_GAIN_FIX_BITS));
|
|
phwcfg->gain_adj[i] = CLIP(tmp, 0, 16384);
|
|
}
|
|
|
|
tmp = cols / 2;
|
|
phwcfg->center_wid = CLIP(tmp, 0, 8191);
|
|
tmp = rows / 2;
|
|
phwcfg->center_het = CLIP(tmp, 0, 8191);
|
|
|
|
for (int i = 0; i < 22; i++) {
|
|
tmp = ROUND_F(pdyn->sharpOpt.hw_sharpT_radiDist2ShpWgt_val[i] *
|
|
(1 << RK_SHARP_V33_STRENGTH_TABLE_FIX_BITS));
|
|
phwcfg->strength[i] = CLIP(tmp, 0, 128);
|
|
}
|
|
|
|
tmp = ROUND_F(pdyn->textureDct.hw_sharpT_noiseSgm_scale *
|
|
(1 << RK_SHARP_V33_ADJ_GAIN_FIX_BITS));
|
|
phwcfg->noise_strength = CLIP(tmp, 0, 16383);
|
|
tmp = (pdyn->sharpOpt.hw_sharpT_text2ShpWgt_norizeMax);
|
|
phwcfg->enhance_bit = CLIP(tmp, 0, 9);
|
|
tmp = (pdyn->textureDct.hw_sharpT_noiseSgm_maxLimit);
|
|
phwcfg->noise_sigma = CLIP(tmp, 0, 1023);
|
|
|
|
for (int i = 0; i < 8; i++) {
|
|
phwcfg->ehf_th[i] = 0;
|
|
phwcfg->clip_neg[i] = 0;
|
|
}
|
|
return;
|
|
}
|