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.

179 lines
8.5 KiB

#include "rk_aiq_isp39_modules.h"
void rk_aiq_dm23_params_cvt(void* attr, isp_params_t* isp_params, common_cvt_info_t *cvtinfo)
{
struct isp39_debayer_cfg *phwcfg = &isp_params->isp_cfg->others.debayer_cfg;
dm_param_t *dm_param = (dm_param_t *) attr;
dm_params_dyn_t *pdyn = &dm_param->dyn;
dm_params_static_t *psta = &dm_param->sta;
/* CONTROL */
phwcfg->filter_g_en = pdyn->hw_dmT_gOutlsFlt_en;
phwcfg->filter_c_en = pdyn->cFlt.hw_dmT_cnrFlt_en;
/* LUMA_DX */
phwcfg->luma_dx[0] = 8;
phwcfg->luma_dx[1] = 8;
phwcfg->luma_dx[2] = 9;
phwcfg->luma_dx[3] = 9;
phwcfg->luma_dx[4] = 10;
phwcfg->luma_dx[5] = 10;
phwcfg->luma_dx[6] = 9;
/* G_INTERP */
phwcfg->clip_en = pdyn->gInterp.hw_dmT_gInterpClip_en;
phwcfg->dist_scale = pdyn->gDrctAlpha.hw_dmT_hiTexture_thred;
phwcfg->thed0 = pdyn->gDrctAlpha.hw_dmT_hiDrct_thred;
phwcfg->thed1 = pdyn->gDrctAlpha.hw_dmT_loDrct_thred;
phwcfg->select_thed = pdyn->gDrctAlpha.hw_dmT_drctMethod_thred;
phwcfg->max_ratio = pdyn->gInterp.hw_dmT_gInterpSharpStrg_maxLim;
/* G_INTERP_FILTER1 */
phwcfg->filter1_coe1 = psta->gInterp.hw_dmT_loDrctFlt_coeff[0];
phwcfg->filter1_coe2 = psta->gInterp.hw_dmT_loDrctFlt_coeff[1];
phwcfg->filter1_coe3 = psta->gInterp.hw_dmT_loDrctFlt_coeff[2];
phwcfg->filter1_coe4 = psta->gInterp.hw_dmT_loDrctFlt_coeff[3];
/* G_INTERP_FILTER2 */
phwcfg->filter2_coe1 = psta->gInterp.hw_dmT_hiDrctFlt_coeff[0];
phwcfg->filter2_coe2 = psta->gInterp.hw_dmT_hiDrctFlt_coeff[1];
phwcfg->filter2_coe3 = psta->gInterp.hw_dmT_hiDrctFlt_coeff[2];
phwcfg->filter2_coe4 = psta->gInterp.hw_dmT_hiDrctFlt_coeff[3];
/* G_INTERP_OFFSET_ALPHA */
phwcfg->gain_offset = pdyn->gInterp.hw_dmT_gInterpSharpStrg_offset;
phwcfg->gradloflt_alpha = (pdyn->gDrctAlpha.hw_dmT_gradLoFlt_alpha * (1 << RK_DM23_FIX_BIT_GRAD_FLT_ALPHA));
phwcfg->wgt_alpha = ROUND_F(pdyn->gInterp.hw_dmT_gInterpWgtFlt_alpha * (1 << RK_DM23_FIX_BIT_WGT_FLT_ALPHA));
/* G_INTERP_DRCT_OFFSET */
//@reg:hw_dmT_drct_offset
phwcfg->drct_offset[0] = MAX(pdyn->gDrctAlpha.hw_dmT_luma2Drct_offset[0] * 128, 1);
phwcfg->drct_offset[1] = MAX(pdyn->gDrctAlpha.hw_dmT_luma2Drct_offset[1] * 128, 1);
phwcfg->drct_offset[2] = MAX(pdyn->gDrctAlpha.hw_dmT_luma2Drct_offset[2] * 128, 1);
phwcfg->drct_offset[3] = MAX(pdyn->gDrctAlpha.hw_dmT_luma2Drct_offset[3] * 128, 1);
phwcfg->drct_offset[4] = MAX(pdyn->gDrctAlpha.hw_dmT_luma2Drct_offset[4] * 128, 1);
phwcfg->drct_offset[5] = MAX(pdyn->gDrctAlpha.hw_dmT_luma2Drct_offset[5] * 128, 1);
phwcfg->drct_offset[6] = MAX(pdyn->gDrctAlpha.hw_dmT_luma2Drct_offset[6] * 128, 1);
phwcfg->drct_offset[7] = MAX(pdyn->gDrctAlpha.hw_dmT_luma2Drct_offset[7] * 128, 1);
/* G_FILTER_MODE_OFFSET */
phwcfg->gfilter_mode = pdyn->hw_dmT_gOutlsFlt_mode;
phwcfg->bf_ratio = ROUND_F(pdyn->gOutlsFlt_bifilt.hw_dmT_bifilt_alpha * (1 << RK_DM23_FIX_BIT_BF_RATIO));
phwcfg->offset = pdyn->gOutlsFlt_maxMin.hw_dmT_gOutlsFltRange_offset;
/* G_FILTER_FILTER */
int filter_coe[3];
if (pdyn->gOutlsFlt_bifilt.sw_dmT_filtCfg_mode == dm_cfgByFiltStrg_mode) {
float dis_table_3x3[3] = { 0.0, 1.0, 2.0};
float gaus_table[3];
float sigma = pdyn->gOutlsFlt_bifilt.sw_dmT_filtSpatial_strg;
double e = 2.71828182845905;
for (int k = 0; k < 3; k++)
{
float tmp = pow(e, -dis_table_3x3[k] / 2.0 / sigma / sigma);
gaus_table[k] = tmp;
}
float sumTable = 0;
sumTable = gaus_table[0]
+ 4 * gaus_table[1]
+ 4 * gaus_table[2];
for (int k = 0; k < 3; k++) {
gaus_table[k] = gaus_table[k] / sumTable;
filter_coe[k] = ROUND_F(gaus_table[k] * (1 << RK_DM23_FIX_BIT_BF_WGT));
}
} else {
filter_coe[0] = ROUND_F(pdyn->gOutlsFlt_bifilt.hw_dmT_filtSpatial_wgt[0] * (1 << RK_DM23_FIX_BIT_BF_WGT));
filter_coe[1] = ROUND_F(pdyn->gOutlsFlt_bifilt.hw_dmT_filtSpatial_wgt[1] * (1 << RK_DM23_FIX_BIT_BF_WGT));
filter_coe[2] = ROUND_F(pdyn->gOutlsFlt_bifilt.hw_dmT_filtSpatial_wgt[2] * (1 << RK_DM23_FIX_BIT_BF_WGT));
}
// check filter coeff
int sum_coeff, offset;
sum_coeff = filter_coe[0] + 4 * filter_coe[1] + 4 * filter_coe[2];
offset = (1 << RK_DM23_FIX_BIT_BF_WGT) - sum_coeff;
filter_coe[0] = filter_coe[0] + offset;
phwcfg->filter_coe0 = filter_coe[0];
phwcfg->filter_coe1 = filter_coe[1];
phwcfg->filter_coe2 = filter_coe[2];
/* G_FILTER_VSIGMA */
phwcfg->vsigma[0] = ROUND_F((1 << RK_DM23_FIX_BIT_INV_BF_SIGMA) / pdyn->gOutlsFlt_bifilt.hw_dmT_luma2RgeSgm_val[0]);
phwcfg->vsigma[1] = ROUND_F((1 << RK_DM23_FIX_BIT_INV_BF_SIGMA) / pdyn->gOutlsFlt_bifilt.hw_dmT_luma2RgeSgm_val[1]);
phwcfg->vsigma[2] = ROUND_F((1 << RK_DM23_FIX_BIT_INV_BF_SIGMA) / pdyn->gOutlsFlt_bifilt.hw_dmT_luma2RgeSgm_val[2]);
phwcfg->vsigma[3] = ROUND_F((1 << RK_DM23_FIX_BIT_INV_BF_SIGMA) / pdyn->gOutlsFlt_bifilt.hw_dmT_luma2RgeSgm_val[3]);
phwcfg->vsigma[4] = ROUND_F((1 << RK_DM23_FIX_BIT_INV_BF_SIGMA) / pdyn->gOutlsFlt_bifilt.hw_dmT_luma2RgeSgm_val[4]);
phwcfg->vsigma[5] = ROUND_F((1 << RK_DM23_FIX_BIT_INV_BF_SIGMA) / pdyn->gOutlsFlt_bifilt.hw_dmT_luma2RgeSgm_val[5]);
phwcfg->vsigma[6] = ROUND_F((1 << RK_DM23_FIX_BIT_INV_BF_SIGMA) / pdyn->gOutlsFlt_bifilt.hw_dmT_luma2RgeSgm_val[6]);
phwcfg->vsigma[7] = ROUND_F((1 << RK_DM23_FIX_BIT_INV_BF_SIGMA) / pdyn->gOutlsFlt_bifilt.hw_dmT_luma2RgeSgm_val[7]);
/* C_FILTER_GUIDE_GAUS */
phwcfg->guid_gaus_coe0 = psta->cFlt.hw_dmT_cnrLoGuideLpf_coeff[0];
phwcfg->guid_gaus_coe1 = psta->cFlt.hw_dmT_cnrLoGuideLpf_coeff[1];
phwcfg->guid_gaus_coe2 = psta->cFlt.hw_dmT_cnrLoGuideLpf_coeff[2];
/* C_FILTER_CE_GAUS */
phwcfg->ce_gaus_coe0 = psta->cFlt.hw_dmT_cnrPreFlt_coeff[0];
phwcfg->ce_gaus_coe1 = psta->cFlt.hw_dmT_cnrPreFlt_coeff[1];
phwcfg->ce_gaus_coe2 = psta->cFlt.hw_dmT_cnrPreFlt_coeff[2];
/* C_FILTER_ALPHA_GAUS */
phwcfg->alpha_gaus_coe0 = psta->cFlt.hw_dmT_cnrAlphaLpf_coeff[0];
phwcfg->alpha_gaus_coe1 = psta->cFlt.hw_dmT_cnrAlphaLpf_coeff[1];
phwcfg->alpha_gaus_coe2 = psta->cFlt.hw_dmT_cnrAlphaLpf_coeff[2];
/* C_FILTER_IIR_0 */
// log fix bit : 10, 1 / sigma, (1 << RK_DM23_FIX_BIT_INV_SIGMA) / (sigma)
float sqrtLog2e = 1.2011;
int hw_dmT_cnrLoFltVsigma_inv = ROUND_F((1 << RK_DM23_FIX_BIT_INV_SIGMA) * sqrtLog2e / ((1 << RK_DM23_FIX_BIT_LOG2) * pdyn->cFlt.sw_dmT_cnrLoFlt_rgeSgm));
//@reg: hw_dmT_cnrLoFltWgt_slope
phwcfg->wgtslope = ROUND_F(pdyn->cFlt.hw_dmT_cnrLoFltWgt_slope * (1 << RK_DM23_FIX_BIT_SLOPE));
// chromaFilterStrength * wgtSlope, int to float
int tmptmp = hw_dmT_cnrLoFltVsigma_inv * phwcfg->wgtslope;
int shiftBit = LOG2(tmptmp) - RK_DM23_FIX_BIT_INT_TO_FLOAT;
shiftBit = MAX(shiftBit, 0);
//@reg: hw_dmT_cnrLoFltStrg_inv
phwcfg->ce_sgm = ROUND_F((float)tmptmp / (1 << shiftBit));
//@reg: hw_dmT_cnrLoFltStrg_shift
phwcfg->exp_shift = RK_DM23_FIX_BIT_INV_SIGMA - shiftBit;
/* C_FILTER_IIR_1 */
//@reg: hw_dmT_cnrLoFltWgt_maxLimit
phwcfg->wet_clip = ROUND_F(pdyn->cFlt.hw_dmT_cnrLoFltWgt_maxLimit * (1 << RK_DM23_FIX_BIT_WGT_RATIO));
//@reg: hw_dmT_cnrLoFltWgt_minThred
phwcfg->wet_ghost = ROUND_F(pdyn->cFlt.hw_dmT_cnrLoFltWgt_minThred * (1 << RK_DM23_FIX_BIT_IIR_WGT));
/* C_FILTER_BF */
//@reg: hw_dmT_cnrHiFltWgt_minLimit
phwcfg->bf_clip = pdyn->cFlt.hw_dmT_cnrHiFltWgt_minLimit;
//@reg: hw_dmT_cnrHiFltCur_wgt
phwcfg->bf_curwgt = pdyn->cFlt.hw_dmT_cnrHiFltCur_wgt;
int scale = (1 << 12) - 1; //rawbit: 12
float log2e = 0.8493;
//@reg: hw_dmT_cnrHiFlt_vsigma
phwcfg->bf_sgm = (int)((1 << RK_DM23_FIX_BIT_INV_BF_SIGMA) * log2e / (pdyn->cFlt.sw_dmT_cnrHiFlt_rgeSgm * scale));
/* C_FILTER_LOG_OFFSET */
phwcfg->log_en = cvtinfo->cmps_on ? 0 : 1;
phwcfg->loghf_offset = pdyn->cFlt.hw_dmT_cnrLogGrad_offset;
phwcfg->loggd_offset = pdyn->cFlt.hw_dmT_cnrLogGuide_offset;
/* C_FILTER_ALPHA */
phwcfg->alpha_offset = pdyn->cFlt.hw_dmT_cnrMoireAlpha_offset;
phwcfg->alpha_scale = ROUND_F(pdyn->cFlt.hw_dmT_cnrMoireAlpha_scale * (1 << RK_DM23_FIX_BIT_ALPHA_SCALE));
/* C_FILTER_EDGE */
phwcfg->edge_offset = pdyn->cFlt.hw_dmT_cnrEdgeAlpha_offset;
phwcfg->edge_scale = ROUND_F(pdyn->cFlt.hw_dmT_cnrEdgeAlpha_scale * (1 << RK_DM23_FIX_BIT_EDGE_SCALE));
return;
}