| 
#include "rk_aiq_asharp_algo_sharp.h" 
 | 
  
 | 
RKAIQ_BEGIN_DECLARE 
 | 
  
 | 
#define MAX_SHARP_LUMA_CLIP_VALUE (8.0) 
 | 
  
 | 
void sharp_filter_merge(float *src0, float *src1, float* dst, int size, float alpha) 
 | 
{ 
 | 
    for(int i = 0; i < size; i++) 
 | 
    { 
 | 
        dst[i] = src0[i] * alpha + src1[i] * (1 - alpha); 
 | 
        LOGD_ANR("sharp filter_merge idx[%d]; src1:%f src2:%f alpha:%f dst:%f\n", 
 | 
                 i, src0[i], src1[i], alpha, dst[i]); 
 | 
    } 
 | 
} 
 | 
  
 | 
AsharpResult_t sharp_get_mode_cell_idx_by_name_v1(CalibDb_Sharp_2_t *pCalibdb, char *name, int *mode_idx) 
 | 
{ 
 | 
    int i = 0; 
 | 
    AsharpResult_t res = ASHARP_RET_SUCCESS; 
 | 
  
 | 
    if(pCalibdb == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    if(name == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    if(mode_idx == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    if(pCalibdb->mode_num < 1) { 
 | 
        LOGE_ASHARP("%s(%d): sharp mode cell num is zero\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    for(i = 0; i < pCalibdb->mode_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 = ASHARP_RET_SUCCESS; 
 | 
    } else { 
 | 
        *mode_idx = 0; 
 | 
        res = ASHARP_RET_FAILURE; 
 | 
    } 
 | 
  
 | 
    LOGD_ASHARP("%s:%d mode_name:%s  mode_idx:%d i:%d \n", __FUNCTION__, __LINE__, name, * mode_idx, i); 
 | 
    return res; 
 | 
  
 | 
} 
 | 
  
 | 
AsharpResult_t sharp_get_setting_idx_by_name_v1(CalibDb_Sharp_2_t *pCalibdb, char *name, int mode_idx, int *setting_idx) 
 | 
{ 
 | 
    int i = 0; 
 | 
    AsharpResult_t res = ASHARP_RET_SUCCESS; 
 | 
  
 | 
    if(pCalibdb == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    if(name == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    if(setting_idx == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    for(i = 0; i < CALIBDB_NR_SHARP_SETTING_LEVEL; i++) { 
 | 
        if(strncmp(name, pCalibdb->mode_cell[mode_idx].setting[i].snr_mode, sizeof(pCalibdb->mode_cell[mode_idx].setting[i].snr_mode)) == 0) { 
 | 
            break; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    if(i < CALIBDB_NR_SHARP_SETTING_LEVEL) { 
 | 
        *setting_idx = i; 
 | 
        res = ASHARP_RET_SUCCESS; 
 | 
    } else { 
 | 
        *setting_idx = 0; 
 | 
        res = ASHARP_RET_FAILURE; 
 | 
    } 
 | 
  
 | 
    LOGD_ASHARP("%s:%d snr_name:%s  snr_idx:%d i:%d \n", __FUNCTION__, __LINE__, name, * setting_idx, i); 
 | 
    return res; 
 | 
  
 | 
} 
 | 
  
 | 
AsharpResult_t sharp_config_setting_param_v1(RKAsharp_Sharp_HW_Params_t *pParams, CalibDb_Sharp_2_t *pCalibdb, char *param_mode, char* snr_name) 
 | 
{ 
 | 
    AsharpResult_t res = ASHARP_RET_SUCCESS; 
 | 
    int mode_idx = 0; 
 | 
    int setting_idx = 0; 
 | 
  
 | 
    if(pParams == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    if(pCalibdb == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
  
 | 
    res = sharp_get_mode_cell_idx_by_name_v1(pCalibdb, param_mode, &mode_idx); 
 | 
    if(res != ASHARP_RET_SUCCESS) { 
 | 
        LOGE_ASHARP("%s(%d): error!!!  can't find mode name in iq files, use 0 instead\n", __FUNCTION__, __LINE__); 
 | 
    } 
 | 
  
 | 
    res = sharp_get_setting_idx_by_name_v1(pCalibdb, snr_name, mode_idx, &setting_idx); 
 | 
    if(res != ASHARP_RET_SUCCESS) { 
 | 
        LOGE_ASHARP("%s(%d): error!!!  can't find setting in iq files, use 0 instead\n", __FUNCTION__, __LINE__); 
 | 
    } 
 | 
  
 | 
    res = init_sharp_params_v1(pParams, pCalibdb, mode_idx, setting_idx); 
 | 
  
 | 
    LOGD_ASHARP("%s(%d): finnal mode:%d snr_mode:%d \n", __FUNCTION__, __LINE__, mode_idx, setting_idx); 
 | 
    return res; 
 | 
  
 | 
} 
 | 
AsharpResult_t init_sharp_params_v1(RKAsharp_Sharp_HW_Params_t *pParams, CalibDb_Sharp_2_t *pCalibdb, int mode_idx, int setting_idx) 
 | 
{ 
 | 
    AsharpResult_t res = ASHARP_RET_SUCCESS; 
 | 
    int i = 0; 
 | 
    int j = 0; 
 | 
    int max_iso_step = MAX_ISO_STEP; 
 | 
  
 | 
    if(pParams == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    if(pCalibdb == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    CalibDb_Sharp_Setting_t *pSetting = &pCalibdb->mode_cell[mode_idx].setting[setting_idx]; 
 | 
    for (i = 0; i < max_iso_step; i++) { 
 | 
#ifndef RK_SIMULATOR_HW 
 | 
        pParams->iso[i] = pSetting->sharp_iso[i].iso; 
 | 
#endif 
 | 
        pParams->lratio[i] = pSetting->sharp_iso[i].lratio; 
 | 
        pParams->hratio[i] = pSetting->sharp_iso[i].hratio; 
 | 
        pParams->M_ratio[i] = pSetting->sharp_iso[i].mf_sharp_ratio; 
 | 
        pParams->H_ratio[i] = pSetting->sharp_iso[i].hf_sharp_ratio; 
 | 
    } 
 | 
  
 | 
    for(int j = 0; j < RK_EDGEFILTER_LUMA_POINT_NUM; j++) { 
 | 
        pParams->luma_point[j] = pCalibdb->luma_point[j]; 
 | 
    } 
 | 
  
 | 
    for (i = 0; i < max_iso_step; i++) { 
 | 
        for(int j = 0; j < RK_EDGEFILTER_LUMA_POINT_NUM; j++) { 
 | 
            pParams->luma_sigma[i][j] = pSetting->sharp_iso[i].luma_sigma[j]; 
 | 
        } 
 | 
        pParams->pbf_gain[i] = pSetting->sharp_iso[i].pbf_gain; 
 | 
        pParams->pbf_ratio[i] = pSetting->sharp_iso[i].pbf_ratio; 
 | 
        pParams->pbf_add[i] = pSetting->sharp_iso[i].pbf_add; 
 | 
  
 | 
        for(int j = 0; j < RK_EDGEFILTER_LUMA_POINT_NUM; j++) { 
 | 
            pParams->lum_clp_m[i][j] = pSetting->sharp_iso[i].mf_clip_pos[j]; 
 | 
        } 
 | 
  
 | 
        for(int j = 0; j < RK_EDGEFILTER_LUMA_POINT_NUM; j++) { 
 | 
            pParams->lum_min_m[i][j] = pSetting->sharp_iso[i].mf_clip_neg[j]; 
 | 
        } 
 | 
  
 | 
        for(int j = 0; j < RK_SHARPFILTER_LUMA_POINT_NUM; j++) { 
 | 
            pParams->lum_clp_h[i][j] = pSetting->sharp_iso[i].hf_clip[j]; 
 | 
        } 
 | 
  
 | 
        pParams->mbf_gain[i] = pSetting->sharp_iso[i].mbf_gain; 
 | 
        pParams->hbf_gain[i] = pSetting->sharp_iso[i].hbf_gain; 
 | 
        pParams->hbf_ratio[i] = pSetting->sharp_iso[i].hbf_ratio; 
 | 
        pParams->mbf_add[i] = pSetting->sharp_iso[i].mbf_add; 
 | 
        pParams->hbf_add[i] = pSetting->sharp_iso[i].hbf_add; 
 | 
        pParams->ehf_th[i] = pSetting->sharp_iso[i].local_sharp_strength; 
 | 
        pParams->pbf_coeff_percent[i] = pSetting->sharp_iso[i].pbf_coeff_percent; 
 | 
        pParams->rf_m_coeff_percent[i] = pSetting->sharp_iso[i].rf_m_coeff_percent; 
 | 
        pParams->rf_h_coeff_percent[i] = pSetting->sharp_iso[i].rf_h_coeff_percent; 
 | 
        pParams->hbf_coeff_percent[i] = pSetting->sharp_iso[i].hbf_coeff_percent; 
 | 
    } 
 | 
  
 | 
    ////////////////////////////////////////////////////////////////////////// 
 | 
    // init filter params 
 | 
    // Gaussian filter params 
 | 
    float gaus_luma_coeff[RKSHAPRENHW_PBF_DIAM * RKSHAPRENHW_PBF_DIAM] = 
 | 
    { 
 | 
        0.0625, 0.125, 0.0625, 
 | 
        0.125, 0.25, 0.125, 
 | 
        0.0625, 0.125, 0.0625 
 | 
    }; 
 | 
    // pre bf params 
 | 
    float pbf_coeff[RKSHAPRENHW_PBF_DIAM * RKSHAPRENHW_PBF_DIAM] = 
 | 
    { 
 | 
        0.156250, 0.25, 0.156250, 
 | 
        0.25, 0.375000, 0.25, 
 | 
        0.156250, 0.25, 0.156250 
 | 
    }; 
 | 
    // mf range filter params 
 | 
    float rf_m_coeff[RKSHAPRENHW_MRF_DIAM * RKSHAPRENHW_MRF_DIAM] = 
 | 
    { 
 | 
        0.023438, 0.031250, 0.039063, 0.031250, 0.023438, 
 | 
        0.031250, 0.046875, 0.054688, 0.046875, 0.031250, 
 | 
        0.039063, 0.054688, 0.093750, 0.054688, 0.039063, 
 | 
        0.031250, 0.046875, 0.054688, 0.046875, 0.031250, 
 | 
        0.023438, 0.031250, 0.039063, 0.031250, 0.023438 
 | 
  
 | 
    }; 
 | 
    // mf bf params 
 | 
    float mbf_coeff[RKSHAPRENHW_MBF_DIAM_Y * RKSHAPRENHW_MBF_DIAM_X] = 
 | 
    { 
 | 
        0.0, 0.0, 0.0, 0.0, 0.406250, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.406250, 0.0, 0.0, 0.0, 0.0, 
 | 
        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.343750, 0.0, 0.328125, 0.0, 0.343750, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
 | 
        0.0, 0.0, 0.406250, 0.0, 0.359375, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.359375, 0.0, 0.406250, 0.0, 0.0, 
 | 
        0.0, 0.0, 0.0, 0.0, 0.0, 0.296875, 0.0, 0.234375, 0.0, 0.234375, 0.0, 0.296875, 0.0, 0.0, 0.0, 0.0, 0.0, 
 | 
        0.0, 0.406250, 0.0, 0.343750, 0.0, 0.0, 0.0, 0.0, 0.171875, 0.0, 0.0, 0.0, 0.0, 0.343750, 0.0, 0.406250, 0.0, 
 | 
        0.0, 0.0, 0.0, 0.0, 0.0, 0.234375, 0.0, 0.140625, 0.109375, 0.140625, 0.0, 0.234375, 0.0, 0.0, 0.0, 0.0, 0.0, 
 | 
        0.437500, 0.0, 0.0, 0.328125, 0.0, 0.0, 0.171875, 0.109375, 0.0, 0.109375, 0.171875, 0.0, 0.0, 0.328125, 0.0, 0.0, 0.437500, 
 | 
        0.0, 0.0, 0.0, 0.0, 0.0, 0.234375, 0.0, 0.140625, 0.109375, 0.140625, 0.0, 0.234375, 0.0, 0.0, 0.0, 0.0, 0.0, 
 | 
        0.0, 0.406250, 0.0, 0.343750, 0.0, 0.0, 0.0, 0.0, 0.171875, 0.0, 0.0, 0.0, 0.0, 0.343750, 0.0, 0.406250, 0.0, 
 | 
        0.0, 0.0, 0.0, 0.0, 0.0, 0.296875, 0.0, 0.234375, 0.0, 0.234375, 0.0, 0.296875, 0.0, 0.0, 0.0, 0.0, 0.0, 
 | 
        0.0, 0.0, 0.406250, 0.0, 0.359375, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.359375, 0.0, 0.406250, 0.0, 0.0, 
 | 
        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.343750, 0.0, 0.328125, 0.0, 0.343750, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
 | 
        0.0, 0.0, 0.0, 0.0, 0.406250, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.406250, 0.0, 0.0, 0.0, 0.0 
 | 
    }; 
 | 
    // hf range filter params 
 | 
    float rf_h_coeff[RKSHAPRENHW_HRF_DIAM * RKSHAPRENHW_HRF_DIAM] = 
 | 
    { 
 | 
        0.0, 0.015625, 0.023438, 0.015625, 0.0, 
 | 
        0.015625, 0.062500, 0.101563, 0.062500, 0.015625, 
 | 
        0.023438, 0.101563, 0.125000, 0.101563, 0.023438, 
 | 
        0.015625, 0.062500, 0.101563, 0.062500, 0.015625, 
 | 
        0.0, 0.015625, 0.023438, 0.015625, 0.0 
 | 
    }; 
 | 
    // hf bf params 
 | 
    float hbf_coeff[RKSHAPRENHW_HBF_DIAM * RKSHAPRENHW_HBF_DIAM] = 
 | 
    { 
 | 
        0.156250, 0.25, 0.156250, 
 | 
        0.25, 0.375000, 0.25, 
 | 
        0.156250, 0.25, 0.156250 
 | 
    }; 
 | 
  
 | 
    float* p_gaus_luma_kernel = gaus_luma_coeff; 
 | 
#ifndef RK_SIMULATOR_HW 
 | 
    if(pCalibdb->mode_cell[mode_idx].gauss_luma_coeff[RKSHAPRENHW_GAU_DIAM * RKSHAPRENHW_GAU_DIAM / 2] != 0) { 
 | 
        p_gaus_luma_kernel = pCalibdb->mode_cell[mode_idx].gauss_luma_coeff; 
 | 
    } 
 | 
#endif 
 | 
  
 | 
    for (i = 0; i < max_iso_step; i++) { 
 | 
        int h = RKSHAPRENHW_GAU_DIAM; 
 | 
        int w = RKSHAPRENHW_GAU_DIAM; 
 | 
        for(int m = 0; m < h; m++) { 
 | 
            for(int n = 0; n < w; n++) { 
 | 
                pParams->gaus_luma_kernel[i][m * w + n] = p_gaus_luma_kernel[m * w + n]; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    float* p_kernel_pbf_l = pbf_coeff; 
 | 
    float* p_kernel_pbf_h = pbf_coeff; 
 | 
#if 0 
 | 
    float* p_kernel_pbf = pbf_coeff; 
 | 
    if(pCalibdb->mode_cell[mode_idx].pbf_coeff[RKSHAPRENHW_PBF_DIAM * RKSHAPRENHW_PBF_DIAM / 2] != 0) { 
 | 
        p_kernel_pbf = pCalibdb->mode_cell[mode_idx].pbf_coeff; 
 | 
    } 
 | 
  
 | 
    for (i = 0; i < max_iso_step; i++) { 
 | 
        int h = RKSHAPRENHW_PBF_DIAM; 
 | 
        int w = RKSHAPRENHW_PBF_DIAM; 
 | 
        for(int m = 0; m < h; m++) { 
 | 
            for(int n = 0; n < w; n++) { 
 | 
                pParams->kernel_pbf[i][m * w + n] = p_kernel_pbf[m * w + n]; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
#endif 
 | 
  
 | 
#ifndef RK_SIMULATOR_HW 
 | 
    if(pCalibdb->mode_cell[mode_idx].pbf_coeff_l[RKSHAPRENHW_PBF_DIAM * RKSHAPRENHW_PBF_DIAM / 2] != 0 
 | 
            && pCalibdb->mode_cell[mode_idx].pbf_coeff_h[RKSHAPRENHW_PBF_DIAM * RKSHAPRENHW_PBF_DIAM / 2] != 0) { 
 | 
        p_kernel_pbf_l = pCalibdb->mode_cell[mode_idx].pbf_coeff_l; 
 | 
        p_kernel_pbf_h = pCalibdb->mode_cell[mode_idx].pbf_coeff_h; 
 | 
    } 
 | 
#endif 
 | 
    for (i = 0; i < max_iso_step; i++) { 
 | 
        int h = RKSHAPRENHW_PBF_DIAM; 
 | 
        int w = RKSHAPRENHW_PBF_DIAM; 
 | 
        for(int m = 0; m < h; m++) { 
 | 
            for(int n = 0; n < w; n++) { 
 | 
                pParams->kernel_pbf_l[i][m * w + n] = p_kernel_pbf_l[m * w + n]; 
 | 
                pParams->kernel_pbf_h[i][m * w + n] = p_kernel_pbf_h[m * w + n]; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
#if 0 
 | 
    float* p_h_rf_m = rf_m_coeff; 
 | 
#ifndef RK_SIMULATOR_HW 
 | 
    if(pCalibdb->mode_cell[mode_idx].rf_m_coeff[RKSHAPRENHW_MRF_DIAM * RKSHAPRENHW_MRF_DIAM / 2] != 0) { 
 | 
        p_h_rf_m = pCalibdb->mode_cell[mode_idx].rf_m_coeff; 
 | 
    } 
 | 
#endif 
 | 
    for (i = 0; i < max_iso_step; i++) { 
 | 
        int h = RKSHAPRENHW_MRF_DIAM; 
 | 
        int w = RKSHAPRENHW_MRF_DIAM; 
 | 
        for(int m = 0; m < h; m++) { 
 | 
            for(int n = 0; n < w; n++) 
 | 
                pParams->h_rf_m[i][m * w + n] = p_h_rf_m[m * w + n]; 
 | 
        } 
 | 
    } 
 | 
#else 
 | 
    float* p_h_rf_m_l = rf_m_coeff; 
 | 
    float* p_h_rf_m_h = rf_m_coeff; 
 | 
#ifndef RK_SIMULATOR_HW 
 | 
    if(pCalibdb->mode_cell[mode_idx].rf_m_coeff_l[RKSHAPRENHW_MRF_DIAM * RKSHAPRENHW_MRF_DIAM / 2] != 0 
 | 
            && pCalibdb->mode_cell[mode_idx].rf_m_coeff_h[RKSHAPRENHW_MRF_DIAM * RKSHAPRENHW_MRF_DIAM / 2] != 0) { 
 | 
        p_h_rf_m_l = pCalibdb->mode_cell[mode_idx].rf_m_coeff_l; 
 | 
        p_h_rf_m_h = pCalibdb->mode_cell[mode_idx].rf_m_coeff_h; 
 | 
    } 
 | 
#endif 
 | 
  
 | 
    for (i = 0; i < max_iso_step; i++) { 
 | 
        int h = RKSHAPRENHW_MRF_DIAM; 
 | 
        int w = RKSHAPRENHW_MRF_DIAM; 
 | 
        for(int m = 0; m < h; m++) { 
 | 
            for(int n = 0; n < w; n++) { 
 | 
                pParams->h_rf_m_l[i][m * w + n] = p_h_rf_m_l[m * w + n]; 
 | 
                pParams->h_rf_m_h[i][m * w + n] = p_h_rf_m_h[m * w + n]; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
#endif 
 | 
  
 | 
    float* p_kernel_mbf = mbf_coeff; 
 | 
#ifndef RK_SIMULATOR_HW 
 | 
    if(pCalibdb->mode_cell[mode_idx].mbf_coeff[RKSHAPRENHW_MBF_DIAM_Y * RKSHAPRENHW_MBF_DIAM_X / 2 - 1] != 0) { 
 | 
        p_kernel_mbf = pCalibdb->mode_cell[mode_idx].mbf_coeff; 
 | 
    } 
 | 
#endif 
 | 
    for (i = 0; i < max_iso_step; i++) { 
 | 
        int h = RKSHAPRENHW_MBF_DIAM_Y; 
 | 
        int w = RKSHAPRENHW_MBF_DIAM_X; 
 | 
        for(int m = 0; m < h; m++) { 
 | 
            for(int n = 0; n < w; n++) 
 | 
                pParams->kernel_mbf[i][m * w + n] = p_kernel_mbf[m * w + n]; 
 | 
        } 
 | 
    } 
 | 
  
 | 
#if 0 
 | 
    float* p_h_rf_h = rf_h_coeff; 
 | 
#ifndef RK_SIMULATOR_HW 
 | 
    if(pCalibdb->mode_cell[mode_idx].rf_h_coeff[RKSHAPRENHW_HRF_DIAM * RKSHAPRENHW_HRF_DIAM / 2] != 0) { 
 | 
        p_h_rf_h = pCalibdb->mode_cell[mode_idx].rf_h_coeff; 
 | 
    } 
 | 
#endif 
 | 
    for (i = 0; i < max_iso_step; i++) { 
 | 
        int h = RKSHAPRENHW_HRF_DIAM; 
 | 
        int w = RKSHAPRENHW_HRF_DIAM; 
 | 
        for(int m = 0; m < h; m++) { 
 | 
            for(int n = 0; n < w; n++) 
 | 
                pParams->h_rf_h[i][m * w + n] = p_h_rf_h[m * w + n]; 
 | 
        } 
 | 
    } 
 | 
#else 
 | 
    float* p_h_rf_h_l = rf_h_coeff; 
 | 
    float* p_h_rf_h_h = rf_h_coeff; 
 | 
#ifndef RK_SIMULATOR_HW 
 | 
    if(pCalibdb->mode_cell[mode_idx].rf_h_coeff_l[RKSHAPRENHW_HRF_DIAM * RKSHAPRENHW_HRF_DIAM / 2] != 0 
 | 
            && pCalibdb->mode_cell[mode_idx].rf_h_coeff_h[RKSHAPRENHW_HRF_DIAM * RKSHAPRENHW_HRF_DIAM / 2] != 0) { 
 | 
        p_h_rf_h_l = pCalibdb->mode_cell[mode_idx].rf_h_coeff_l; 
 | 
        p_h_rf_h_h = pCalibdb->mode_cell[mode_idx].rf_h_coeff_h; 
 | 
    } 
 | 
#endif 
 | 
    for (i = 0; i < max_iso_step; i++) { 
 | 
        int h = RKSHAPRENHW_HRF_DIAM; 
 | 
        int w = RKSHAPRENHW_HRF_DIAM; 
 | 
        for(int m = 0; m < h; m++) { 
 | 
            for(int n = 0; n < w; n++) { 
 | 
                pParams->h_rf_h_l[i][m * w + n] = p_h_rf_h_l[m * w + n]; 
 | 
                pParams->h_rf_h_h[i][m * w + n] = p_h_rf_h_h[m * w + n]; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
#endif 
 | 
  
 | 
  
 | 
#if 0 
 | 
    float* p_kernel_hbf = hbf_coeff; 
 | 
#ifndef RK_SIMULATOR_HW 
 | 
    if(pCalibdb->mode_cell[mode_idx].hbf_coeff[RKSHAPRENHW_HBF_DIAM * RKSHAPRENHW_HBF_DIAM / 2] != 0) { 
 | 
        p_kernel_hbf = pCalibdb->mode_cell[mode_idx].hbf_coeff; 
 | 
    } 
 | 
#endif 
 | 
    for (i = 0; i < max_iso_step; i++) { 
 | 
        int h = RKSHAPRENHW_HBF_DIAM; 
 | 
        int w = RKSHAPRENHW_HBF_DIAM; 
 | 
        for(int m = 0; m < h; m++) { 
 | 
            for(int n = 0; n < w; n++) 
 | 
                pParams->kernel_hbf[i][m * w + n] = p_kernel_hbf[m * w + n]; 
 | 
        } 
 | 
    } 
 | 
#else 
 | 
    float* p_kernel_hbf_l = hbf_coeff; 
 | 
    float* p_kernel_hbf_h = hbf_coeff; 
 | 
#ifndef RK_SIMULATOR_HW 
 | 
    if(pCalibdb->mode_cell[mode_idx].hbf_coeff_l[RKSHAPRENHW_HBF_DIAM * RKSHAPRENHW_HBF_DIAM / 2] != 0 
 | 
            && pCalibdb->mode_cell[mode_idx].hbf_coeff_h[RKSHAPRENHW_HBF_DIAM * RKSHAPRENHW_HBF_DIAM / 2] != 0) { 
 | 
        p_kernel_hbf_l = pCalibdb->mode_cell[mode_idx].hbf_coeff_l; 
 | 
        p_kernel_hbf_h = pCalibdb->mode_cell[mode_idx].hbf_coeff_h; 
 | 
    } 
 | 
#endif 
 | 
    for (i = 0; i < max_iso_step; i++) { 
 | 
        int h = RKSHAPRENHW_HBF_DIAM; 
 | 
        int w = RKSHAPRENHW_HBF_DIAM; 
 | 
        for(int m = 0; m < h; m++) { 
 | 
            for(int n = 0; n < w; n++) { 
 | 
                pParams->kernel_hbf_l[i][m * w + n] = p_kernel_hbf_l[m * w + n]; 
 | 
                pParams->kernel_hbf_h[i][m * w + n] = p_kernel_hbf_h[m * w + n]; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
#endif 
 | 
  
 | 
  
 | 
    LOGD_ASHARP("oyyf sharp iso50 lratio:%f hratio:%f\n", 
 | 
                pParams->lratio[0], 
 | 
                pParams->hratio[0]); 
 | 
  
 | 
    return res; 
 | 
  
 | 
} 
 | 
  
 | 
  
 | 
AsharpResult_t sharp_get_setting_idx_by_name_v1_json(CalibDbV2_SharpV1_t *pCalibdb, char *name,  int *setting_idx) 
 | 
{ 
 | 
    int i = 0; 
 | 
    AsharpResult_t res = ASHARP_RET_SUCCESS; 
 | 
  
 | 
    if(pCalibdb == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    if(name == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    if(setting_idx == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    for(i = 0; i < pCalibdb->TuningPara.Setting_len; i++) { 
 | 
        LOGD_ASHARP("snr name:%s setName:%s\n", name, pCalibdb->TuningPara.Setting[i].SNR_Mode); 
 | 
        if(strncmp(name, pCalibdb->TuningPara.Setting[i].SNR_Mode, strlen(name)*sizeof(char)) == 0) { 
 | 
            break; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    if(i < pCalibdb->TuningPara.Setting_len) { 
 | 
        *setting_idx = i; 
 | 
        res = ASHARP_RET_SUCCESS; 
 | 
    } else { 
 | 
        *setting_idx = 0; 
 | 
        res = ASHARP_RET_FAILURE; 
 | 
    } 
 | 
  
 | 
    LOGD_ASHARP("%s:%d snr_name:%s  snr_idx:%d i:%d \n", __FUNCTION__, __LINE__, name, * setting_idx, i); 
 | 
    return res; 
 | 
  
 | 
} 
 | 
  
 | 
AsharpResult_t init_sharp_params_v1_json(RKAsharp_Sharp_HW_Params_t *pParams, CalibDbV2_SharpV1_t *pCalibdb,  int setting_idx) 
 | 
{ 
 | 
    AsharpResult_t res = ASHARP_RET_SUCCESS; 
 | 
    int i = 0; 
 | 
    int j = 0; 
 | 
    int max_iso_step = MAX_ISO_STEP; 
 | 
    CalibDbV2_SharpV1_TuningPara_Setting_t *pSetting = NULL; 
 | 
    CalibDbV2_SharpV1_TuningPara_Setting_ISO_t *pTuning_ISO = NULL; 
 | 
    CalibDbV2_SharpV1_TuningPara_Kernel_t *pKernel_coeff = NULL; 
 | 
  
 | 
    if(pParams == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    if(pCalibdb == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    pSetting = &pCalibdb->TuningPara.Setting[setting_idx]; 
 | 
  
 | 
    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->lratio[i] = pTuning_ISO->lratio; 
 | 
        pParams->hratio[i] = pTuning_ISO->hratio; 
 | 
        pParams->M_ratio[i] = pTuning_ISO->mf_sharp_ratio; 
 | 
        pParams->H_ratio[i] = pTuning_ISO->hf_sharp_ratio; 
 | 
  
 | 
        pParams->pbf_gain[i] =  pTuning_ISO->pbf_gain; 
 | 
        pParams->pbf_ratio[i] =  pTuning_ISO->pbf_ratio; 
 | 
        pParams->pbf_add[i] =  pTuning_ISO->pbf_add; 
 | 
  
 | 
        pParams->mbf_gain[i] = pTuning_ISO->mbf_gain; 
 | 
        pParams->hbf_gain[i] = pTuning_ISO->hbf_gain; 
 | 
        pParams->hbf_ratio[i] = pTuning_ISO->hbf_ratio; 
 | 
        pParams->mbf_add[i] = pTuning_ISO->mbf_add; 
 | 
        pParams->hbf_add[i] = pTuning_ISO->hbf_add; 
 | 
        pParams->ehf_th[i] = pTuning_ISO->local_sharp_strength; 
 | 
        pParams->pbf_coeff_percent[i] = pTuning_ISO->pbf_coeff_percent; 
 | 
        pParams->rf_m_coeff_percent[i] = pTuning_ISO->rf_m_coeff_percent; 
 | 
        pParams->rf_h_coeff_percent[i] = pTuning_ISO->rf_h_coeff_percent; 
 | 
        pParams->hbf_coeff_percent[i] = pTuning_ISO->hbf_coeff_percent; 
 | 
  
 | 
        for(int j = 0; j < RK_EDGEFILTER_LUMA_POINT_NUM; j++) { 
 | 
            pParams->luma_point[j] = pTuning_ISO->luma_para.luma_point[j]; 
 | 
            pParams->luma_sigma[i][j] = pTuning_ISO->luma_para.luma_sigma[j]; 
 | 
            pParams->lum_clp_m[i][j] = pTuning_ISO->luma_para.mf_clip_pos[j]; 
 | 
            pParams->lum_min_m[i][j] = pTuning_ISO->luma_para.mf_clip_neg[j]; 
 | 
            pParams->lum_clp_h[i][j] = pTuning_ISO->luma_para.hf_clip[j]; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    pKernel_coeff = &pCalibdb->TuningPara.kernel_coeff; 
 | 
  
 | 
    ////////////////////////////////////////////////////////////////////////// 
 | 
    // init filter params 
 | 
    // Gaussian filter params 
 | 
    float gaus_luma_coeff[RKSHAPRENHW_PBF_DIAM * RKSHAPRENHW_PBF_DIAM] = 
 | 
    { 
 | 
        0.0625, 0.125, 0.0625, 
 | 
        0.125, 0.25, 0.125, 
 | 
        0.0625, 0.125, 0.0625 
 | 
    }; 
 | 
    // pre bf params 
 | 
    float pbf_coeff[RKSHAPRENHW_PBF_DIAM * RKSHAPRENHW_PBF_DIAM] = 
 | 
    { 
 | 
        0.156250, 0.25, 0.156250, 
 | 
        0.25, 0.375000, 0.25, 
 | 
        0.156250, 0.25, 0.156250 
 | 
    }; 
 | 
    // mf range filter params 
 | 
    float rf_m_coeff[RKSHAPRENHW_MRF_DIAM * RKSHAPRENHW_MRF_DIAM] = 
 | 
    { 
 | 
        0.023438, 0.031250, 0.039063, 0.031250, 0.023438, 
 | 
        0.031250, 0.046875, 0.054688, 0.046875, 0.031250, 
 | 
        0.039063, 0.054688, 0.093750, 0.054688, 0.039063, 
 | 
        0.031250, 0.046875, 0.054688, 0.046875, 0.031250, 
 | 
        0.023438, 0.031250, 0.039063, 0.031250, 0.023438 
 | 
  
 | 
    }; 
 | 
    // mf bf params 
 | 
    float mbf_coeff[RKSHAPRENHW_MBF_DIAM_Y * RKSHAPRENHW_MBF_DIAM_X] = 
 | 
    { 
 | 
        0.0, 0.0, 0.0, 0.0, 0.406250, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.406250, 0.0, 0.0, 0.0, 0.0, 
 | 
        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.343750, 0.0, 0.328125, 0.0, 0.343750, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
 | 
        0.0, 0.0, 0.406250, 0.0, 0.359375, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.359375, 0.0, 0.406250, 0.0, 0.0, 
 | 
        0.0, 0.0, 0.0, 0.0, 0.0, 0.296875, 0.0, 0.234375, 0.0, 0.234375, 0.0, 0.296875, 0.0, 0.0, 0.0, 0.0, 0.0, 
 | 
        0.0, 0.406250, 0.0, 0.343750, 0.0, 0.0, 0.0, 0.0, 0.171875, 0.0, 0.0, 0.0, 0.0, 0.343750, 0.0, 0.406250, 0.0, 
 | 
        0.0, 0.0, 0.0, 0.0, 0.0, 0.234375, 0.0, 0.140625, 0.109375, 0.140625, 0.0, 0.234375, 0.0, 0.0, 0.0, 0.0, 0.0, 
 | 
        0.437500, 0.0, 0.0, 0.328125, 0.0, 0.0, 0.171875, 0.109375, 0.0, 0.109375, 0.171875, 0.0, 0.0, 0.328125, 0.0, 0.0, 0.437500, 
 | 
        0.0, 0.0, 0.0, 0.0, 0.0, 0.234375, 0.0, 0.140625, 0.109375, 0.140625, 0.0, 0.234375, 0.0, 0.0, 0.0, 0.0, 0.0, 
 | 
        0.0, 0.406250, 0.0, 0.343750, 0.0, 0.0, 0.0, 0.0, 0.171875, 0.0, 0.0, 0.0, 0.0, 0.343750, 0.0, 0.406250, 0.0, 
 | 
        0.0, 0.0, 0.0, 0.0, 0.0, 0.296875, 0.0, 0.234375, 0.0, 0.234375, 0.0, 0.296875, 0.0, 0.0, 0.0, 0.0, 0.0, 
 | 
        0.0, 0.0, 0.406250, 0.0, 0.359375, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.359375, 0.0, 0.406250, 0.0, 0.0, 
 | 
        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.343750, 0.0, 0.328125, 0.0, 0.343750, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
 | 
        0.0, 0.0, 0.0, 0.0, 0.406250, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.406250, 0.0, 0.0, 0.0, 0.0 
 | 
    }; 
 | 
    // hf range filter params 
 | 
    float rf_h_coeff[RKSHAPRENHW_HRF_DIAM * RKSHAPRENHW_HRF_DIAM] = 
 | 
    { 
 | 
        0.0, 0.015625, 0.023438, 0.015625, 0.0, 
 | 
        0.015625, 0.062500, 0.101563, 0.062500, 0.015625, 
 | 
        0.023438, 0.101563, 0.125000, 0.101563, 0.023438, 
 | 
        0.015625, 0.062500, 0.101563, 0.062500, 0.015625, 
 | 
        0.0, 0.015625, 0.023438, 0.015625, 0.0 
 | 
    }; 
 | 
    // hf bf params 
 | 
    float hbf_coeff[RKSHAPRENHW_HBF_DIAM * RKSHAPRENHW_HBF_DIAM] = 
 | 
    { 
 | 
        0.156250, 0.25, 0.156250, 
 | 
        0.25, 0.375000, 0.25, 
 | 
        0.156250, 0.25, 0.156250 
 | 
    }; 
 | 
  
 | 
    float* p_gaus_luma_kernel = gaus_luma_coeff; 
 | 
#ifndef RK_SIMULATOR_HW 
 | 
    if(pKernel_coeff->gauss_luma_coeff[RKSHAPRENHW_GAU_DIAM * RKSHAPRENHW_GAU_DIAM / 2] != 0) { 
 | 
        p_gaus_luma_kernel = pKernel_coeff->gauss_luma_coeff; 
 | 
    } 
 | 
#endif 
 | 
  
 | 
    for (i = 0; i < max_iso_step; i++) { 
 | 
        int h = RKSHAPRENHW_GAU_DIAM; 
 | 
        int w = RKSHAPRENHW_GAU_DIAM; 
 | 
        for(int m = 0; m < h; m++) { 
 | 
            for(int n = 0; n < w; n++) { 
 | 
                pParams->gaus_luma_kernel[i][m * w + n] = p_gaus_luma_kernel[m * w + n]; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    float* p_kernel_pbf_l = pbf_coeff; 
 | 
    float* p_kernel_pbf_h = pbf_coeff; 
 | 
#if 0 
 | 
    float* p_kernel_pbf = pbf_coeff; 
 | 
    if(pCalibdb->mode_cell[mode_idx].pbf_coeff[RKSHAPRENHW_PBF_DIAM * RKSHAPRENHW_PBF_DIAM / 2] != 0) { 
 | 
        p_kernel_pbf = pCalibdb->mode_cell[mode_idx].pbf_coeff; 
 | 
    } 
 | 
  
 | 
    for (i = 0; i < max_iso_step; i++) { 
 | 
        int h = RKSHAPRENHW_PBF_DIAM; 
 | 
        int w = RKSHAPRENHW_PBF_DIAM; 
 | 
        for(int m = 0; m < h; m++) { 
 | 
            for(int n = 0; n < w; n++) { 
 | 
                pParams->kernel_pbf[i][m * w + n] = p_kernel_pbf[m * w + n]; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
#endif 
 | 
  
 | 
#ifndef RK_SIMULATOR_HW 
 | 
    if(pKernel_coeff->pbf_coeff_l[RKSHAPRENHW_PBF_DIAM * RKSHAPRENHW_PBF_DIAM / 2] != 0 
 | 
            && pKernel_coeff->pbf_coeff_h[RKSHAPRENHW_PBF_DIAM * RKSHAPRENHW_PBF_DIAM / 2] != 0) { 
 | 
        p_kernel_pbf_l = pKernel_coeff->pbf_coeff_l; 
 | 
        p_kernel_pbf_h = pKernel_coeff->pbf_coeff_h; 
 | 
    } 
 | 
#endif 
 | 
    for (i = 0; i < max_iso_step; i++) { 
 | 
        int h = RKSHAPRENHW_PBF_DIAM; 
 | 
        int w = RKSHAPRENHW_PBF_DIAM; 
 | 
        for(int m = 0; m < h; m++) { 
 | 
            for(int n = 0; n < w; n++) { 
 | 
                pParams->kernel_pbf_l[i][m * w + n] = p_kernel_pbf_l[m * w + n]; 
 | 
                pParams->kernel_pbf_h[i][m * w + n] = p_kernel_pbf_h[m * w + n]; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
#if 0 
 | 
    float* p_h_rf_m = rf_m_coeff; 
 | 
#ifndef RK_SIMULATOR_HW 
 | 
    if(pCalibdb->mode_cell[mode_idx].rf_m_coeff[RKSHAPRENHW_MRF_DIAM * RKSHAPRENHW_MRF_DIAM / 2] != 0) { 
 | 
        p_h_rf_m = pCalibdb->mode_cell[mode_idx].rf_m_coeff; 
 | 
    } 
 | 
#endif 
 | 
    for (i = 0; i < max_iso_step; i++) { 
 | 
        int h = RKSHAPRENHW_MRF_DIAM; 
 | 
        int w = RKSHAPRENHW_MRF_DIAM; 
 | 
        for(int m = 0; m < h; m++) { 
 | 
            for(int n = 0; n < w; n++) 
 | 
                pParams->h_rf_m[i][m * w + n] = p_h_rf_m[m * w + n]; 
 | 
        } 
 | 
    } 
 | 
#else 
 | 
    float* p_h_rf_m_l = rf_m_coeff; 
 | 
    float* p_h_rf_m_h = rf_m_coeff; 
 | 
#ifndef RK_SIMULATOR_HW 
 | 
    if(pKernel_coeff->rf_m_coeff_l[RKSHAPRENHW_MRF_DIAM * RKSHAPRENHW_MRF_DIAM / 2] != 0 
 | 
            && pKernel_coeff->rf_m_coeff_h[RKSHAPRENHW_MRF_DIAM * RKSHAPRENHW_MRF_DIAM / 2] != 0) { 
 | 
        p_h_rf_m_l = pKernel_coeff->rf_m_coeff_l; 
 | 
        p_h_rf_m_h = pKernel_coeff->rf_m_coeff_h; 
 | 
    } 
 | 
#endif 
 | 
  
 | 
    for (i = 0; i < max_iso_step; i++) { 
 | 
        int h = RKSHAPRENHW_MRF_DIAM; 
 | 
        int w = RKSHAPRENHW_MRF_DIAM; 
 | 
        for(int m = 0; m < h; m++) { 
 | 
            for(int n = 0; n < w; n++) { 
 | 
                pParams->h_rf_m_l[i][m * w + n] = p_h_rf_m_l[m * w + n]; 
 | 
                pParams->h_rf_m_h[i][m * w + n] = p_h_rf_m_h[m * w + n]; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
#endif 
 | 
  
 | 
    float* p_kernel_mbf = mbf_coeff; 
 | 
#ifndef RK_SIMULATOR_HW 
 | 
    if(pKernel_coeff->mbf_coeff[RKSHAPRENHW_MBF_DIAM_Y * RKSHAPRENHW_MBF_DIAM_X / 2 - 1] != 0) { 
 | 
        p_kernel_mbf = pKernel_coeff->mbf_coeff; 
 | 
    } 
 | 
#endif 
 | 
    for (i = 0; i < max_iso_step; i++) { 
 | 
        int h = RKSHAPRENHW_MBF_DIAM_Y; 
 | 
        int w = RKSHAPRENHW_MBF_DIAM_X; 
 | 
        for(int m = 0; m < h; m++) { 
 | 
            for(int n = 0; n < w; n++) 
 | 
                pParams->kernel_mbf[i][m * w + n] = p_kernel_mbf[m * w + n]; 
 | 
        } 
 | 
    } 
 | 
  
 | 
#if 0 
 | 
    float* p_h_rf_h = rf_h_coeff; 
 | 
#ifndef RK_SIMULATOR_HW 
 | 
    if(pCalibdb->mode_cell[mode_idx].rf_h_coeff[RKSHAPRENHW_HRF_DIAM * RKSHAPRENHW_HRF_DIAM / 2] != 0) { 
 | 
        p_h_rf_h = pCalibdb->mode_cell[mode_idx].rf_h_coeff; 
 | 
    } 
 | 
#endif 
 | 
    for (i = 0; i < max_iso_step; i++) { 
 | 
        int h = RKSHAPRENHW_HRF_DIAM; 
 | 
        int w = RKSHAPRENHW_HRF_DIAM; 
 | 
        for(int m = 0; m < h; m++) { 
 | 
            for(int n = 0; n < w; n++) 
 | 
                pParams->h_rf_h[i][m * w + n] = p_h_rf_h[m * w + n]; 
 | 
        } 
 | 
    } 
 | 
#else 
 | 
    float* p_h_rf_h_l = rf_h_coeff; 
 | 
    float* p_h_rf_h_h = rf_h_coeff; 
 | 
#ifndef RK_SIMULATOR_HW 
 | 
    if(pKernel_coeff->rf_h_coeff_l[RKSHAPRENHW_HRF_DIAM * RKSHAPRENHW_HRF_DIAM / 2] != 0 
 | 
            && pKernel_coeff->rf_h_coeff_h[RKSHAPRENHW_HRF_DIAM * RKSHAPRENHW_HRF_DIAM / 2] != 0) { 
 | 
        p_h_rf_h_l = pKernel_coeff->rf_h_coeff_l; 
 | 
        p_h_rf_h_h = pKernel_coeff->rf_h_coeff_h; 
 | 
    } 
 | 
#endif 
 | 
    for (i = 0; i < max_iso_step; i++) { 
 | 
        int h = RKSHAPRENHW_HRF_DIAM; 
 | 
        int w = RKSHAPRENHW_HRF_DIAM; 
 | 
        for(int m = 0; m < h; m++) { 
 | 
            for(int n = 0; n < w; n++) { 
 | 
                pParams->h_rf_h_l[i][m * w + n] = p_h_rf_h_l[m * w + n]; 
 | 
                pParams->h_rf_h_h[i][m * w + n] = p_h_rf_h_h[m * w + n]; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
#endif 
 | 
  
 | 
  
 | 
#if 0 
 | 
    float* p_kernel_hbf = hbf_coeff; 
 | 
#ifndef RK_SIMULATOR_HW 
 | 
    if(pCalibdb->mode_cell[mode_idx].hbf_coeff[RKSHAPRENHW_HBF_DIAM * RKSHAPRENHW_HBF_DIAM / 2] != 0) { 
 | 
        p_kernel_hbf = pCalibdb->mode_cell[mode_idx].hbf_coeff; 
 | 
    } 
 | 
#endif 
 | 
    for (i = 0; i < max_iso_step; i++) { 
 | 
        int h = RKSHAPRENHW_HBF_DIAM; 
 | 
        int w = RKSHAPRENHW_HBF_DIAM; 
 | 
        for(int m = 0; m < h; m++) { 
 | 
            for(int n = 0; n < w; n++) 
 | 
                pParams->kernel_hbf[i][m * w + n] = p_kernel_hbf[m * w + n]; 
 | 
        } 
 | 
    } 
 | 
#else 
 | 
    float* p_kernel_hbf_l = hbf_coeff; 
 | 
    float* p_kernel_hbf_h = hbf_coeff; 
 | 
#ifndef RK_SIMULATOR_HW 
 | 
    if(pKernel_coeff->hbf_coeff_l[RKSHAPRENHW_HBF_DIAM * RKSHAPRENHW_HBF_DIAM / 2] != 0 
 | 
            && pKernel_coeff->hbf_coeff_h[RKSHAPRENHW_HBF_DIAM * RKSHAPRENHW_HBF_DIAM / 2] != 0) { 
 | 
        p_kernel_hbf_l = pKernel_coeff->hbf_coeff_l; 
 | 
        p_kernel_hbf_h = pKernel_coeff->hbf_coeff_h; 
 | 
    } 
 | 
#endif 
 | 
    for (i = 0; i < max_iso_step; i++) { 
 | 
        int h = RKSHAPRENHW_HBF_DIAM; 
 | 
        int w = RKSHAPRENHW_HBF_DIAM; 
 | 
        for(int m = 0; m < h; m++) { 
 | 
            for(int n = 0; n < w; n++) { 
 | 
                pParams->kernel_hbf_l[i][m * w + n] = p_kernel_hbf_l[m * w + n]; 
 | 
                pParams->kernel_hbf_h[i][m * w + n] = p_kernel_hbf_h[m * w + n]; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
#endif 
 | 
  
 | 
    LOGD_ASHARP("oyyf sharp iso50 lratio:%f hratio:%f\n", 
 | 
                pParams->lratio[0], 
 | 
                pParams->hratio[0]); 
 | 
  
 | 
    sharp_algo_param_printf(pParams); 
 | 
  
 | 
    return res; 
 | 
  
 | 
} 
 | 
  
 | 
AsharpResult_t sharp_algo_param_printf(RKAsharp_Sharp_HW_Params_t *pParams) 
 | 
{ 
 | 
    int i, j; 
 | 
  
 | 
    if(pParams != NULL) { 
 | 
  
 | 
        for(i = 0; i < MAX_ISO_STEP; i++) { 
 | 
#ifndef RK_SIMULATOR_HW 
 | 
            LOGD_ASHARP(" sharp: ISO:%f\n", pParams->iso[i]); 
 | 
#endif 
 | 
  
 | 
            LOGD_ASHARP(" lratio:%f  hratio:%f mf_sharp_ratio:%f hf_sharp_ratio:%f\n", 
 | 
                        pParams->lratio[i], 
 | 
                        pParams->hratio[i], 
 | 
                        pParams->M_ratio[i], 
 | 
                        pParams->H_ratio[i]); 
 | 
  
 | 
            LOGD_ASHARP(" pbf_gain:%f  pbf_ratio:%f pbf_add:%f\n", 
 | 
                        pParams->pbf_gain[i], 
 | 
                        pParams->pbf_ratio[i], 
 | 
                        pParams->pbf_add[i]); 
 | 
  
 | 
  
 | 
            LOGD_ASHARP(" mbf_gain:%f  mbf_add:%f local_sharp_strength:%d\n", 
 | 
                        pParams->mbf_gain[i], 
 | 
                        pParams->mbf_add[i], 
 | 
                        pParams->ehf_th[i]); 
 | 
  
 | 
            LOGD_ASHARP(" hbf_gain:%f  hbf_ratio:%f hbf_add:%f\n", 
 | 
                        pParams->hbf_gain[i], 
 | 
                        pParams->hbf_ratio[i], 
 | 
                        pParams->hbf_add[i]); 
 | 
  
 | 
            LOGD_ASHARP(" pbf_coeff_percent:%f  rf_m_coeff_percent:%f rf_h_coeff_percent:%f hbf_coeff_percent:%f\n", 
 | 
                        pParams->pbf_coeff_percent[i], 
 | 
                        pParams->rf_m_coeff_percent[i], 
 | 
                        pParams->rf_h_coeff_percent[i], 
 | 
                        pParams->hbf_coeff_percent[i]); 
 | 
  
 | 
  
 | 
            for(int j = 0; j < RK_EDGEFILTER_LUMA_POINT_NUM; j++) { 
 | 
  
 | 
                LOGD_ASHARP(" luma_point:%d luma_sigma:%f mf_clip_pos:%d mf_clip_neg:%f hf_clip:%d\n", 
 | 
                            pParams->luma_point[j], 
 | 
                            pParams->luma_sigma[i][j], 
 | 
                            pParams->lum_clp_m[i][j], 
 | 
                            pParams->lum_min_m[i][j], 
 | 
                            pParams->lum_clp_h[i][j]); 
 | 
            } 
 | 
  
 | 
        } 
 | 
    } 
 | 
  
 | 
    return ASHARP_RET_SUCCESS; 
 | 
} 
 | 
  
 | 
AsharpResult_t sharp_config_setting_param_v1_json(RKAsharp_Sharp_HW_Params_t *pParams, CalibDbV2_SharpV1_t *pCalibdb, char *param_mode, char* snr_name) 
 | 
{ 
 | 
    AsharpResult_t res = ASHARP_RET_SUCCESS; 
 | 
    int setting_idx = 0; 
 | 
  
 | 
    if(pParams == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    if(pCalibdb == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    res = sharp_get_setting_idx_by_name_v1_json(pCalibdb, snr_name, &setting_idx); 
 | 
    if(res != ASHARP_RET_SUCCESS) { 
 | 
        LOGE_ASHARP("%s(%d): error!!!  can't find setting in iq files, use 0 instead\n", __FUNCTION__, __LINE__); 
 | 
    } 
 | 
  
 | 
    res = init_sharp_params_v1_json(pParams, pCalibdb, setting_idx); 
 | 
  
 | 
    LOGD_ASHARP("%s(%d): finnal snr_mode:%d \n", __FUNCTION__, __LINE__,  setting_idx); 
 | 
    return res; 
 | 
  
 | 
} 
 | 
  
 | 
  
 | 
AsharpResult_t select_rk_sharpen_hw_params_by_ISO( 
 | 
    RKAsharp_Sharp_HW_Params_t *strksharpenParams, 
 | 
    RKAsharp_Sharp_HW_Params_Select_t *strksharpenParamsSelected, 
 | 
    AsharpExpInfo_t *pExpInfo 
 | 
) 
 | 
{ 
 | 
    int i; 
 | 
    int gain_high = 0, gain_low = 0; 
 | 
    float ratio = 0.0f; 
 | 
    int iso_div             = 50; 
 | 
    int max_iso_step        = MAX_ISO_STEP; 
 | 
    AsharpResult_t res = ASHARP_RET_SUCCESS; 
 | 
    int iso = 50; 
 | 
    int iso_low = iso, iso_high = iso; 
 | 
  
 | 
    if(strksharpenParams == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    if(strksharpenParamsSelected == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    if(pExpInfo == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    if(pExpInfo->mfnr_mode_3to1) { 
 | 
        iso = pExpInfo->preIso[pExpInfo->hdr_mode]; 
 | 
    } else { 
 | 
        iso = pExpInfo->arIso[pExpInfo->hdr_mode]; 
 | 
    } 
 | 
  
 | 
#ifndef RK_SIMULATOR_HW 
 | 
    for (i = 0; i < max_iso_step - 1; i++) { 
 | 
        if (iso >=  strksharpenParams->iso[i]  &&  iso <=  strksharpenParams->iso[i + 1] ) { 
 | 
            iso_low = strksharpenParams->iso[i] ; 
 | 
            iso_high = strksharpenParams->iso[i + 1]; 
 | 
            gain_low = i; 
 | 
            gain_high = i + 1; 
 | 
            ratio = (float)(iso - iso_low) / (iso_high - iso_low); 
 | 
            break; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    if(i == max_iso_step - 1) { 
 | 
        if(iso < strksharpenParams->iso[0] ) { 
 | 
            iso_low = strksharpenParams->iso[0] ; 
 | 
            iso_high = strksharpenParams->iso[1]; 
 | 
            gain_low = 0; 
 | 
            gain_high = 1; 
 | 
            ratio = 0; 
 | 
        } 
 | 
  
 | 
        if(iso > strksharpenParams->iso[max_iso_step - 1] ) { 
 | 
            iso_low = strksharpenParams->iso[max_iso_step - 2] ; 
 | 
            iso_high = strksharpenParams->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); 
 | 
            break; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    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 iso_low:%d iso_high:%d gainlow:%d gain_high:%d ratio:%f\n", 
 | 
                __FUNCTION__, __LINE__, 
 | 
                iso, iso_low, iso_high, gain_low, gain_high, ratio); 
 | 
    strksharpenParamsSelected->lratio               = INTERP1(strksharpenParams->lratio     [gain_low],     strksharpenParams->lratio       [gain_high],    ratio); 
 | 
    strksharpenParamsSelected->hratio               = INTERP1(strksharpenParams->hratio     [gain_low],     strksharpenParams->hratio       [gain_high],    ratio); 
 | 
    strksharpenParamsSelected->M_ratio              = INTERP1(strksharpenParams->M_ratio    [gain_low],     strksharpenParams->M_ratio      [gain_high],    ratio); 
 | 
    strksharpenParamsSelected->H_ratio              = INTERP1(strksharpenParams->H_ratio    [gain_low],     strksharpenParams->H_ratio      [gain_high],    ratio); 
 | 
    strksharpenParamsSelected->pbf_ratio            = INTERP1(strksharpenParams->pbf_ratio  [gain_low],     strksharpenParams->pbf_ratio    [gain_high],    ratio); 
 | 
    strksharpenParamsSelected->hbf_ratio            = INTERP1(strksharpenParams->hbf_ratio  [gain_low],     strksharpenParams->hbf_ratio    [gain_high],    ratio); 
 | 
    strksharpenParamsSelected->ehf_th               = (short)ROUND_F(INTERP1(strksharpenParams->ehf_th     [gain_low],     strksharpenParams->ehf_th       [gain_high],    ratio)); 
 | 
    for(int i = 0; i < RK_EDGEFILTER_LUMA_POINT_NUM; i++) 
 | 
    { 
 | 
        strksharpenParamsSelected->luma_point[i]    = strksharpenParams->luma_point[i]; 
 | 
        strksharpenParamsSelected->luma_sigma[i]    = INTERP1(strksharpenParams->luma_sigma [gain_low][i],  strksharpenParams->luma_sigma   [gain_high][i], ratio); 
 | 
  
 | 
        strksharpenParamsSelected->lum_clp_m[i]     = (short)ROUND_F(INTERP1(strksharpenParams->lum_clp_m  [gain_low][i],  strksharpenParams->lum_clp_m    [gain_high][i], ratio)); 
 | 
        strksharpenParamsSelected->lum_min_m[i]     = INTERP1(strksharpenParams->lum_min_m  [gain_low][i],  strksharpenParams->lum_min_m    [gain_high][i], ratio); 
 | 
  
 | 
        strksharpenParamsSelected->lum_clp_h[i]     = (short)ROUND_F(INTERP1(strksharpenParams->lum_clp_h  [gain_low][i],  strksharpenParams->lum_clp_h    [gain_high][i], ratio)); 
 | 
    } 
 | 
    strksharpenParamsSelected->pbf_gain      = INTERP1(strksharpenParams->pbf_gain   [gain_low],  strksharpenParams->pbf_gain     [gain_high], ratio); 
 | 
    strksharpenParamsSelected->pbf_add       = INTERP1(strksharpenParams->pbf_add    [gain_low],  strksharpenParams->pbf_add      [gain_high], ratio); 
 | 
  
 | 
    strksharpenParamsSelected->mbf_gain      = INTERP1(strksharpenParams->mbf_gain   [gain_low],  strksharpenParams->mbf_gain     [gain_high], ratio); 
 | 
    strksharpenParamsSelected->mbf_add       = INTERP1(strksharpenParams->mbf_add    [gain_low],  strksharpenParams->mbf_add      [gain_high], ratio); 
 | 
  
 | 
    strksharpenParamsSelected->hbf_gain      = INTERP1(strksharpenParams->hbf_gain   [gain_low],  strksharpenParams->hbf_gain     [gain_high], ratio); 
 | 
    strksharpenParamsSelected->hbf_add       = INTERP1(strksharpenParams->hbf_add    [gain_low],  strksharpenParams->hbf_add      [gain_high], ratio); 
 | 
  
 | 
  
 | 
    for(unsigned int i = 0; i < sizeof(strksharpenParamsSelected->gaus_luma_kernel) / sizeof(strksharpenParamsSelected->gaus_luma_kernel[0]); i++) 
 | 
        strksharpenParamsSelected->gaus_luma_kernel[i]    = INTERP1(strksharpenParams->gaus_luma_kernel [gain_low][i],  strksharpenParams->gaus_luma_kernel   [gain_high][i], ratio); 
 | 
    for(unsigned int i = 0; i < sizeof(strksharpenParamsSelected->kernel_mbf) / sizeof(strksharpenParamsSelected->kernel_mbf[0]); i++) 
 | 
        strksharpenParamsSelected->kernel_mbf[i]    = INTERP1(strksharpenParams->kernel_mbf [gain_low][i],  strksharpenParams->kernel_mbf   [gain_high][i], ratio); 
 | 
#if 0 
 | 
    for(unsigned int i = 0; i < sizeof(strksharpenParamsSelected->kernel_pbf) / sizeof(strksharpenParamsSelected->kernel_pbf[0]); i++) 
 | 
        strksharpenParamsSelected->kernel_pbf[i]    = INTERP1(strksharpenParams->kernel_pbf [gain_low][i],  strksharpenParams->kernel_pbf   [gain_high][i], ratio); 
 | 
    for(unsigned int i = 0; i < sizeof(strksharpenParamsSelected->h_rf_m) / sizeof(strksharpenParamsSelected->h_rf_m[0]); i++) 
 | 
        strksharpenParamsSelected->h_rf_m[i]        = INTERP1(strksharpenParams->h_rf_m [gain_low][i],      strksharpenParams->h_rf_m       [gain_high][i], ratio); 
 | 
  
 | 
    for(unsigned int i = 0; i < sizeof(strksharpenParamsSelected->h_rf_h) / sizeof(strksharpenParamsSelected->h_rf_h[0]); i++) 
 | 
        strksharpenParamsSelected->h_rf_h[i]        = INTERP1(strksharpenParams->h_rf_h [gain_low][i],      strksharpenParams->h_rf_h       [gain_high][i], ratio); 
 | 
    for(unsigned int i = 0; i < sizeof(strksharpenParamsSelected->kernel_hbf) / sizeof(strksharpenParamsSelected->kernel_hbf[0]); i++) 
 | 
        strksharpenParamsSelected->kernel_hbf[i]    = INTERP1(strksharpenParams->kernel_hbf [gain_low][i],  strksharpenParams->kernel_hbf   [gain_high][i], ratio); 
 | 
#else 
 | 
  
 | 
    float pbf_coeff_percent      = INTERP1(strksharpenParams->pbf_coeff_percent    [gain_low],  strksharpenParams->pbf_coeff_percent      [gain_high], ratio); 
 | 
    float rf_m_coeff_percent      = INTERP1(strksharpenParams->rf_m_coeff_percent    [gain_low],  strksharpenParams->rf_m_coeff_percent      [gain_high], ratio); 
 | 
    float rf_h_coeff_percent      = INTERP1(strksharpenParams->rf_h_coeff_percent    [gain_low],  strksharpenParams->rf_h_coeff_percent      [gain_high], ratio); 
 | 
    float hbf_coeff_percent      = INTERP1(strksharpenParams->hbf_coeff_percent    [gain_low],  strksharpenParams->hbf_coeff_percent      [gain_high], ratio); 
 | 
  
 | 
    sharp_filter_merge(strksharpenParams->kernel_pbf_h[gain_low], strksharpenParams->kernel_pbf_l[gain_low], strksharpenParamsSelected->kernel_pbf, 9, pbf_coeff_percent); 
 | 
    sharp_filter_merge(strksharpenParams->h_rf_m_h[gain_low], strksharpenParams->h_rf_m_l[gain_low], strksharpenParamsSelected->h_rf_m, 25, rf_m_coeff_percent); 
 | 
    sharp_filter_merge(strksharpenParams->h_rf_h_h[gain_low], strksharpenParams->h_rf_h_l[gain_low], strksharpenParamsSelected->h_rf_h, 25, rf_h_coeff_percent); 
 | 
    sharp_filter_merge(strksharpenParams->kernel_hbf_h[gain_low], strksharpenParams->kernel_hbf_l[gain_low], strksharpenParamsSelected->kernel_hbf, 9, hbf_coeff_percent); 
 | 
#endif 
 | 
    return res; 
 | 
} 
 | 
  
 | 
AsharpResult_t select_rk_sharpen_hw_v2_params_by_ISO( 
 | 
    RKAsharp_Sharp_HW_V2_Params_t *strksharpenParams, 
 | 
    RKAsharp_Sharp_HW_V2_Params_Select_t *strksharpenParamsSelected, 
 | 
    AsharpExpInfo_t *pExpInfo 
 | 
) 
 | 
{ 
 | 
    int i; 
 | 
    int gain_high, gain_low; 
 | 
    float ratio = 0.0f; 
 | 
    int iso_div             = 50; 
 | 
    int max_iso_step        = MAX_ISO_STEP; 
 | 
    AsharpResult_t res = ASHARP_RET_SUCCESS; 
 | 
    int iso = 50; 
 | 
    int iso_low = iso, iso_high = iso; 
 | 
  
 | 
    if(strksharpenParams == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    if(strksharpenParamsSelected == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    if(pExpInfo == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    iso = pExpInfo->arIso[pExpInfo->hdr_mode]; 
 | 
    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); 
 | 
  
 | 
    strksharpenParamsSelected->pbf_gain             = INTERP1(strksharpenParams->pbf_gain   [gain_low],     strksharpenParams->pbf_gain     [gain_high],    ratio); 
 | 
    strksharpenParamsSelected->pbf_add              = INTERP1(strksharpenParams->pbf_add    [gain_low],     strksharpenParams->pbf_add      [gain_high],    ratio); 
 | 
    strksharpenParamsSelected->pbf_ratio            = INTERP1(strksharpenParams->pbf_ratio  [gain_low],     strksharpenParams->pbf_ratio    [gain_high],    ratio); 
 | 
    strksharpenParamsSelected->lratio               = INTERP1(strksharpenParams->lratio     [gain_low],     strksharpenParams->lratio       [gain_high],    ratio); 
 | 
    strksharpenParamsSelected->hratio               = INTERP1(strksharpenParams->hratio     [gain_low],     strksharpenParams->hratio       [gain_high],    ratio); 
 | 
    strksharpenParamsSelected->sharp_ratio          = INTERP1(strksharpenParams->sharp_ratio[gain_low],     strksharpenParams->sharp_ratio  [gain_high],    ratio); 
 | 
    strksharpenParamsSelected->hbf_gain             = INTERP1(strksharpenParams->hbf_gain   [gain_low],     strksharpenParams->hbf_gain     [gain_high],    ratio); 
 | 
    strksharpenParamsSelected->hbf_add              = INTERP1(strksharpenParams->hbf_add    [gain_low],     strksharpenParams->hbf_add      [gain_high],    ratio); 
 | 
    strksharpenParamsSelected->hbf_ratio            = INTERP1(strksharpenParams->hbf_ratio  [gain_low],     strksharpenParams->hbf_ratio    [gain_high],    ratio); 
 | 
    strksharpenParamsSelected->ehf_th               = (short)ROUND_F(INTERP1(strksharpenParams->ehf_th     [gain_low],     strksharpenParams->ehf_th       [gain_high],    ratio)); 
 | 
    for(int i = 0; i < RK_EDGEFILTER_LUMA_POINT_NUM; i++) 
 | 
    { 
 | 
        strksharpenParamsSelected->luma_point[i]    = strksharpenParams->luma_point[i]; 
 | 
        strksharpenParamsSelected->luma_sigma[i]    = INTERP1(strksharpenParams->luma_sigma [gain_low][i],  strksharpenParams->luma_sigma   [gain_high][i], ratio); 
 | 
        strksharpenParamsSelected->lum_clip_h[i]    = (short)ROUND_F(INTERP1(strksharpenParams->lum_clip_h  [gain_low][i],  strksharpenParams->lum_clip_h    [gain_high][i], ratio)); 
 | 
    } 
 | 
    for(int i = 0; i < RKSHAPRENHW_V2_GAU_DIAM * RKSHAPRENHW_V2_GAU_DIAM; i++) 
 | 
    { 
 | 
        strksharpenParamsSelected->gaus_luma_kernel[i] = INTERP1(strksharpenParams->gaus_luma_kernel [gain_low][i],  strksharpenParams->gaus_luma_kernel[gain_high][i], ratio); 
 | 
    } 
 | 
  
 | 
    for(int i = 0; i < RKSHAPRENHW_V2_PBF_DIAM * RKSHAPRENHW_V2_PBF_DIAM; i++) 
 | 
    { 
 | 
        strksharpenParamsSelected->kernel_pre_bf[i] = INTERP1(strksharpenParams->kernel_pre_bf [gain_low][i], strksharpenParams->kernel_pre_bf[gain_high][i], ratio); 
 | 
    } 
 | 
    for(int i = 0; i < RKSHAPRENHW_V2_HRF_DIAM * RKSHAPRENHW_V2_HRF_DIAM; i++) 
 | 
    { 
 | 
        strksharpenParamsSelected->kernel_range_filter[i] = INTERP1(strksharpenParams->kernel_range_filter[gain_low][i], strksharpenParams->kernel_range_filter[gain_high][i], ratio); 
 | 
    } 
 | 
    for(int i = 0; i < RKSHAPRENHW_V2_HBF_DIAM_Y * RKSHAPRENHW_V2_HBF_DIAM_X; i++) 
 | 
    { 
 | 
        strksharpenParamsSelected->kernel_hf_bf[i] = INTERP1(strksharpenParams->kernel_hf_bf[gain_low][i],  strksharpenParams->kernel_hf_bf[gain_high][i], ratio); 
 | 
    } 
 | 
  
 | 
    return res; 
 | 
} 
 | 
  
 | 
AsharpResult_t select_rk_sharpen_hw_v3_params_by_ISO( 
 | 
    RKAsharp_Sharp_HW_V3_Params_t *strksharpenParams, 
 | 
    RKAsharp_Sharp_HW_V3_Params_Select_t *strksharpenParamsSelected, 
 | 
    AsharpExpInfo_t *pExpInfo 
 | 
) 
 | 
{ 
 | 
    int i; 
 | 
    int gain_high, gain_low; 
 | 
    float ratio = 0.0f; 
 | 
    int iso_div             = 50; 
 | 
    int max_iso_step        = MAX_ISO_STEP; 
 | 
    AsharpResult_t res = ASHARP_RET_SUCCESS; 
 | 
    int iso = 50; 
 | 
    int iso_low = iso, iso_high = iso; 
 | 
  
 | 
    if(strksharpenParams == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    if(strksharpenParamsSelected == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    if(pExpInfo == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    iso = pExpInfo->arIso[pExpInfo->hdr_mode]; 
 | 
    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); 
 | 
  
 | 
    strksharpenParamsSelected->lratio               = INTERP1(strksharpenParams->lratio     [gain_low],     strksharpenParams->lratio       [gain_high],    ratio); 
 | 
    strksharpenParamsSelected->hratio               = INTERP1(strksharpenParams->hratio     [gain_low],     strksharpenParams->hratio       [gain_high],    ratio); 
 | 
    strksharpenParamsSelected->sharp_ratio          = INTERP1(strksharpenParams->sharp_ratio[gain_low],     strksharpenParams->sharp_ratio  [gain_high],    ratio); 
 | 
    strksharpenParamsSelected->ehf_th               = (short)ROUND_F(INTERP1(strksharpenParams->ehf_th     [gain_low],     strksharpenParams->ehf_th       [gain_high],    ratio)); 
 | 
    for(int i = 0; i < RK_EDGEFILTER_LUMA_POINT_NUM; i++) 
 | 
    { 
 | 
        strksharpenParamsSelected->luma_point[i]    = strksharpenParams->luma_point[i]; 
 | 
        strksharpenParamsSelected->lum_clip_h[i]    = (short)ROUND_F(INTERP1(strksharpenParams->lum_clip_h  [gain_low][i],  strksharpenParams->lum_clip_h    [gain_high][i], ratio)); 
 | 
    } 
 | 
    for(int i = 0; i < RKSHAPRENHW_V3_RF_DIAM * RKSHAPRENHW_V3_RF_DIAM; i++) 
 | 
    { 
 | 
        strksharpenParamsSelected->kernel_range_filter[i] = INTERP1(strksharpenParams->kernel_range_filter [gain_low][i], strksharpenParams->kernel_range_filter[gain_high][i], ratio); 
 | 
    } 
 | 
  
 | 
    return res; 
 | 
} 
 | 
  
 | 
void select_sharpen_params_by_ISO   ( 
 | 
    RKAsharp_Sharp_Params_t *strksharpenParams, 
 | 
    RKAsharp_Sharp_Params_Select_t *strksharpenParamsSelected, 
 | 
    AsharpExpInfo_t *pExpInfo 
 | 
) 
 | 
{ 
 | 
    select_rk_sharpen_hw_params_by_ISO(&strksharpenParams->rk_sharpen_params_V1, &strksharpenParamsSelected->rk_sharpen_params_selected_V1, pExpInfo); 
 | 
  
 | 
    select_rk_sharpen_hw_v2_params_by_ISO(&strksharpenParams->rk_sharpen_params_V2, &strksharpenParamsSelected->rk_sharpen_params_selected_V2, pExpInfo); 
 | 
  
 | 
    select_rk_sharpen_hw_v3_params_by_ISO(&strksharpenParams->rk_sharpen_params_V3, &strksharpenParamsSelected->rk_sharpen_params_selected_V3, pExpInfo); 
 | 
} 
 | 
  
 | 
  
 | 
  
 | 
AsharpResult_t rk_Sharp_V1_fix_transfer(RKAsharp_Sharp_HW_Params_Select_t *pSharpV1, RKAsharp_Sharp_HW_Fix_t* pSharpCfg, float fPercent) 
 | 
{ 
 | 
    int i = 0; 
 | 
    int k = 0; 
 | 
    int tmp = 0; 
 | 
    int sum_coeff, offset; 
 | 
    float sum_coeff_float; 
 | 
    AsharpResult_t res = ASHARP_RET_SUCCESS; 
 | 
    float mClipStrength = 1.0; 
 | 
    float hClipStrength = 1.0; 
 | 
  
 | 
    if(pSharpV1 == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    if(pSharpCfg == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    if(fPercent <= 0.0) { 
 | 
        fPercent = 0.000001; 
 | 
    } 
 | 
  
 | 
    if(fPercent > (MAX_SHARP_LUMA_CLIP_VALUE / pSharpV1->M_ratio )) { 
 | 
        mClipStrength = fPercent / (MAX_SHARP_LUMA_CLIP_VALUE / pSharpV1->M_ratio ) ; 
 | 
    } 
 | 
  
 | 
    if(fPercent > (MAX_SHARP_LUMA_CLIP_VALUE / pSharpV1->H_ratio)) { 
 | 
        hClipStrength = fPercent / (MAX_SHARP_LUMA_CLIP_VALUE / pSharpV1->H_ratio ) ; 
 | 
    } 
 | 
  
 | 
    LOGD_ASHARP("%s:%d percent:%f m&h_strength:%f %f\n", 
 | 
                __FUNCTION__, __LINE__, fPercent, 
 | 
                mClipStrength, hClipStrength); 
 | 
  
 | 
    pSharpV1->pbf_gain  = pSharpV1->pbf_gain / fPercent; 
 | 
    if(pSharpV1->pbf_gain > 2.0) 
 | 
        pSharpV1->pbf_gain  = 2.0; 
 | 
  
 | 
    pSharpV1->pbf_add = pSharpV1->pbf_add / fPercent; 
 | 
    if(pSharpV1->pbf_add > 255) 
 | 
        pSharpV1->pbf_add = 255; 
 | 
  
 | 
    pSharpV1->mbf_gain  = pSharpV1->mbf_gain / fPercent; 
 | 
    if(pSharpV1->mbf_gain > 2.0) 
 | 
        pSharpV1->mbf_gain  = 2.0; 
 | 
  
 | 
    pSharpV1->mbf_add = pSharpV1->mbf_add / fPercent; 
 | 
    if(pSharpV1->mbf_add > 255) 
 | 
        pSharpV1->mbf_add = 255; 
 | 
  
 | 
    pSharpV1->hbf_gain  = pSharpV1->hbf_gain / fPercent; 
 | 
    if(pSharpV1->hbf_gain > 2.0) 
 | 
        pSharpV1->hbf_gain  = 2.0; 
 | 
  
 | 
    pSharpV1->hbf_add = pSharpV1->hbf_add / fPercent; 
 | 
    if(pSharpV1->hbf_add > 255) 
 | 
        pSharpV1->hbf_add = 255; 
 | 
  
 | 
  
 | 
    //0x0080 
 | 
    pSharpCfg->yin_flt_en = 1; 
 | 
    pSharpCfg->edge_avg_en = 1; 
 | 
  
 | 
    //0x0084 
 | 
    tmp = ROUND_F(pSharpV1->hbf_ratio / fPercent * (1 << reg_sharpenHW_hbf_ratio_fix_bits)); 
 | 
    if(tmp > 0x100) { 
 | 
        tmp = 0x100; 
 | 
    } 
 | 
    pSharpCfg->hbf_ratio = (unsigned short)tmp; 
 | 
    tmp = ROUND_F(pSharpV1->ehf_th * fPercent); 
 | 
    if(tmp > 0xff) { 
 | 
        tmp = 0xff; 
 | 
    } 
 | 
    pSharpCfg->ehf_th = (unsigned char) tmp; 
 | 
    tmp = ROUND_F(pSharpV1->pbf_ratio / fPercent * (1 << reg_sharpenHW_pbf_ratio_fix_bits)); 
 | 
    if(tmp > 0x80) { 
 | 
        tmp = 0x80; 
 | 
    } 
 | 
    pSharpCfg->pbf_ratio = (unsigned short)tmp; 
 | 
  
 | 
  
 | 
    //0x0090 
 | 
    sum_coeff = 0; 
 | 
    sum_coeff_float = 0; 
 | 
    pSharpCfg->pbf_k[0] = (unsigned char)ROUND_F(pSharpV1->kernel_pbf[4] * (1 << reg_sharpenHW_pPBfCoeff_fix_bits)); 
 | 
    pSharpCfg->pbf_k[1] = (unsigned char)ROUND_F(pSharpV1->kernel_pbf[1] * (1 << reg_sharpenHW_pPBfCoeff_fix_bits)); 
 | 
    pSharpCfg->pbf_k[2] = (unsigned char)ROUND_F(pSharpV1->kernel_pbf[0] * (1 << reg_sharpenHW_pPBfCoeff_fix_bits)); 
 | 
    for(k = 0; k < RKSHAPRENHW_PBF_DIAM * RKSHAPRENHW_PBF_DIAM; k ++) 
 | 
    { 
 | 
        sum_coeff += ROUND_F(pSharpV1->kernel_pbf[k] * (1 << reg_sharpenHW_pPBfCoeff_fix_bits)); 
 | 
        sum_coeff_float += pSharpV1->kernel_pbf[k]; 
 | 
    } 
 | 
    offset = int(sum_coeff_float * (1 << reg_sharpenHW_pPBfCoeff_fix_bits)) - sum_coeff; 
 | 
    pSharpCfg->pbf_k[0] = pSharpCfg->pbf_k[0] + offset; 
 | 
  
 | 
  
 | 
    //0x0094 - 0x0098 
 | 
    sum_coeff = 0; 
 | 
    sum_coeff_float = 0; 
 | 
    pSharpCfg->mrf_k[0] = (unsigned char)ROUND_F(pSharpV1->h_rf_m[12] * (1 << reg_sharpenHW_pMRfCoeff_fix_bits)); 
 | 
    pSharpCfg->mrf_k[1] = (unsigned char)ROUND_F(pSharpV1->h_rf_m[7] * (1 << reg_sharpenHW_pMRfCoeff_fix_bits)); 
 | 
    pSharpCfg->mrf_k[2] = (unsigned char)ROUND_F(pSharpV1->h_rf_m[6] * (1 << reg_sharpenHW_pMRfCoeff_fix_bits)); 
 | 
    pSharpCfg->mrf_k[3] = (unsigned char)ROUND_F(pSharpV1->h_rf_m[2] * (1 << reg_sharpenHW_pMRfCoeff_fix_bits)); 
 | 
    pSharpCfg->mrf_k[4] = (unsigned char)ROUND_F(pSharpV1->h_rf_m[1] * (1 << reg_sharpenHW_pMRfCoeff_fix_bits)); 
 | 
    pSharpCfg->mrf_k[5] = (unsigned char)ROUND_F(pSharpV1->h_rf_m[0] * (1 << reg_sharpenHW_pMRfCoeff_fix_bits)); 
 | 
    for(k = 0; k < RKSHAPRENHW_MRF_DIAM * RKSHAPRENHW_MRF_DIAM; k ++) 
 | 
    { 
 | 
        sum_coeff += ROUND_F(pSharpV1->h_rf_m[k] * (1 << reg_sharpenHW_pMRfCoeff_fix_bits)); 
 | 
        sum_coeff_float += pSharpV1->h_rf_m[k]; 
 | 
    } 
 | 
    offset = int(sum_coeff_float * (1 << reg_sharpenHW_pMRfCoeff_fix_bits)) - sum_coeff; 
 | 
    pSharpCfg->mrf_k[0] = pSharpCfg->mrf_k[0] + offset; 
 | 
  
 | 
    //0x009c -0x00a4 
 | 
    sum_coeff = 0; 
 | 
    sum_coeff_float = 0; 
 | 
    pSharpCfg->mbf_k[0] = (unsigned char)ROUND_F(pSharpV1->kernel_mbf[110] * (1 << reg_sharpenHW_pMBfCoeff_fix_bits)); 
 | 
    pSharpCfg->mbf_k[1] = (unsigned char)ROUND_F(pSharpV1->kernel_mbf[93] * (1 << reg_sharpenHW_pMBfCoeff_fix_bits)); 
 | 
    pSharpCfg->mbf_k[2] = (unsigned char)ROUND_F(pSharpV1->kernel_mbf[92] * (1 << reg_sharpenHW_pMBfCoeff_fix_bits)); 
 | 
    pSharpCfg->mbf_k[3] = (unsigned char)ROUND_F(pSharpV1->kernel_mbf[76] * (1 << reg_sharpenHW_pMBfCoeff_fix_bits)); 
 | 
    pSharpCfg->mbf_k[4] = (unsigned char)ROUND_F(pSharpV1->kernel_mbf[58] * (1 << reg_sharpenHW_pMBfCoeff_fix_bits)); 
 | 
    pSharpCfg->mbf_k[5] = (unsigned char)ROUND_F(pSharpV1->kernel_mbf[56] * (1 << reg_sharpenHW_pMBfCoeff_fix_bits)); 
 | 
    pSharpCfg->mbf_k[6] = (unsigned char)ROUND_F(pSharpV1->kernel_mbf[25] * (1 << reg_sharpenHW_pMBfCoeff_fix_bits)); 
 | 
    pSharpCfg->mbf_k[7] = (unsigned char)ROUND_F(pSharpV1->kernel_mbf[23] * (1 << reg_sharpenHW_pMBfCoeff_fix_bits)); 
 | 
    pSharpCfg->mbf_k[8] = (unsigned char)ROUND_F(pSharpV1->kernel_mbf[38] * (1 << reg_sharpenHW_pMBfCoeff_fix_bits)); 
 | 
    pSharpCfg->mbf_k[9] = (unsigned char)ROUND_F(pSharpV1->kernel_mbf[4] * (1 << reg_sharpenHW_pMBfCoeff_fix_bits)); 
 | 
    pSharpCfg->mbf_k[10] = (unsigned char)ROUND_F(pSharpV1->kernel_mbf[69] * (1 << reg_sharpenHW_pMBfCoeff_fix_bits)); 
 | 
    pSharpCfg->mbf_k[11] = (unsigned char)ROUND_F(pSharpV1->kernel_mbf[102] * (1 << reg_sharpenHW_pMBfCoeff_fix_bits)); 
 | 
    for(k = 0; k < RKSHAPRENHW_MBF_DIAM_Y * RKSHAPRENHW_MBF_DIAM_X; k ++) 
 | 
    { 
 | 
        sum_coeff += ROUND_F(pSharpV1->kernel_mbf[k] * (1 << reg_sharpenHW_pMBfCoeff_fix_bits)); 
 | 
        sum_coeff_float += pSharpV1->kernel_mbf[k]; 
 | 
    } 
 | 
    offset = int(sum_coeff_float * (1 << reg_sharpenHW_pMBfCoeff_fix_bits)) - sum_coeff; 
 | 
    pSharpCfg->mbf_k[0] = pSharpCfg->mbf_k[0] + offset; 
 | 
  
 | 
    //0x00a8 -0x00ac 
 | 
    sum_coeff = 0; 
 | 
    sum_coeff_float = 0; 
 | 
    pSharpCfg->hrf_k[0] = (unsigned char)ROUND_F(pSharpV1->h_rf_h[12] * (1 << reg_sharpenHW_pHRfCoeff_fix_bits)); 
 | 
    pSharpCfg->hrf_k[1] = (unsigned char)ROUND_F(pSharpV1->h_rf_h[7] * (1 << reg_sharpenHW_pHRfCoeff_fix_bits)); 
 | 
    pSharpCfg->hrf_k[2] = (unsigned char)ROUND_F(pSharpV1->h_rf_h[6] * (1 << reg_sharpenHW_pHRfCoeff_fix_bits)); 
 | 
    pSharpCfg->hrf_k[3] = (unsigned char)ROUND_F(pSharpV1->h_rf_h[2] * (1 << reg_sharpenHW_pHRfCoeff_fix_bits)); 
 | 
    pSharpCfg->hrf_k[4] = (unsigned char)ROUND_F(pSharpV1->h_rf_h[1] * (1 << reg_sharpenHW_pHRfCoeff_fix_bits)); 
 | 
    pSharpCfg->hrf_k[5] = (unsigned char)ROUND_F(pSharpV1->h_rf_h[0] * (1 << reg_sharpenHW_pHRfCoeff_fix_bits)); 
 | 
    for(k = 0; k < RKSHAPRENHW_HRF_DIAM * RKSHAPRENHW_HRF_DIAM; k ++) 
 | 
    { 
 | 
        sum_coeff += ROUND_F(pSharpV1->h_rf_h[k] * (1 << reg_sharpenHW_pHRfCoeff_fix_bits)); 
 | 
        sum_coeff_float += pSharpV1->h_rf_h[k]; 
 | 
    } 
 | 
    offset = int(sum_coeff_float * (1 << reg_sharpenHW_pHRfCoeff_fix_bits)) - sum_coeff; 
 | 
    pSharpCfg->hrf_k[0] = pSharpCfg->hrf_k[0] + offset; 
 | 
  
 | 
    //0x00b0 
 | 
    sum_coeff = 0; 
 | 
    sum_coeff_float = 0; 
 | 
    pSharpCfg->hbf_k[0] = (unsigned char)ROUND_F(pSharpV1->kernel_hbf[4] * (1 << reg_sharpenHW_pHBfCoeff_fix_bits)); 
 | 
    pSharpCfg->hbf_k[1] = (unsigned char)ROUND_F(pSharpV1->kernel_hbf[1] * (1 << reg_sharpenHW_pHBfCoeff_fix_bits)); 
 | 
    pSharpCfg->hbf_k[2] = (unsigned char)ROUND_F(pSharpV1->kernel_hbf[0] * (1 << reg_sharpenHW_pHBfCoeff_fix_bits)); 
 | 
    for(k = 0; k < RKSHAPRENHW_HBF_DIAM * RKSHAPRENHW_HBF_DIAM; k ++) 
 | 
    { 
 | 
        sum_coeff += ROUND_F(pSharpV1->kernel_hbf[k] * (1 << reg_sharpenHW_pHBfCoeff_fix_bits)); 
 | 
        sum_coeff_float += pSharpV1->kernel_hbf[k]; 
 | 
    } 
 | 
    offset = int(sum_coeff_float * (1 << reg_sharpenHW_pHBfCoeff_fix_bits)) - sum_coeff; 
 | 
    pSharpCfg->hbf_k[0] = pSharpCfg->hbf_k[0] + offset; 
 | 
  
 | 
    //0x00b4 
 | 
  
 | 
    //0x00b8 
 | 
  
 | 
    //0x00bc - 0x00c0 
 | 
  
 | 
    //0x00c4 - 0x00c8 
 | 
  
 | 
    //0x00cc - 0x00d0 
 | 
    for(i = 0; i < 6; i++) { 
 | 
        pSharpCfg->lum_point[i] = (unsigned char)ROUND_F(pSharpV1->luma_point[i + 1]); 
 | 
    } 
 | 
  
 | 
    //0x00d4 
 | 
    //pbf 
 | 
    int sigma_deci_bits = 7; 
 | 
    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 < 8; i++) 
 | 
    { 
 | 
        int cur_sigma = FLOOR((pSharpV1->luma_sigma[i] * pSharpV1->pbf_gain + pSharpV1->pbf_add)); 
 | 
        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]; 
 | 
    pSharpCfg->pbf_shf_bits = sigma_bits[2] - 5; 
 | 
  
 | 
    // mf bf sigma inv 
 | 
    max_val = 0; 
 | 
    min_val = 65536; 
 | 
    shf_bits = 0; 
 | 
    for(int i = 0; i < 8; i++) 
 | 
    { 
 | 
        int cur_sigma = FLOOR(pSharpV1->luma_sigma[i] 
 | 
                              * pSharpV1->mbf_gain 
 | 
                              + pSharpV1->mbf_add); 
 | 
        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]; 
 | 
    pSharpCfg->mbf_shf_bits = (unsigned char)(sigma_bits[2] - 5); 
 | 
  
 | 
    // hf bf sigma inv 
 | 
    max_val = 0; 
 | 
    min_val = 65536; 
 | 
    shf_bits = 0; 
 | 
    for(int i = 0; i < 8; i++) 
 | 
    { 
 | 
        int cur_sigma = FLOOR(pSharpV1->luma_sigma[i] * pSharpV1->hbf_gain + pSharpV1->hbf_add); 
 | 
        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]; 
 | 
    pSharpCfg->hbf_shf_bits = (unsigned char)(sigma_bits[2] - 5); 
 | 
  
 | 
  
 | 
    //0x00d8 - 0x00dc 
 | 
    // pre bf sigma inv 
 | 
    sigma_deci_bits = 7; 
 | 
    sigma_inte_bits = 1; 
 | 
    max_val         = 0; 
 | 
    min_val         = 65536; 
 | 
    shf_bits        = 0; 
 | 
    for(int i = 0; i < RK_SHARPFILTER_LUMA_POINT_NUM; i++) 
 | 
    { 
 | 
        int cur_sigma = FLOOR((pSharpV1->luma_sigma[i] * pSharpV1->pbf_gain + pSharpV1->pbf_add)); 
 | 
        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]; 
 | 
  
 | 
    for(i = 0; i < 8; i++) { 
 | 
        pSharpCfg->pbf_sigma[i] = (unsigned char)ROUND_F((float)1 
 | 
                                  / (pSharpV1->luma_sigma[i] * pSharpV1->pbf_gain + pSharpV1->pbf_add) 
 | 
                                  * (1 << sigma_bits[2])); 
 | 
    } 
 | 
  
 | 
    //0x00e0 - 0x00e4 
 | 
    for(i = 0; i < 8; i++) { 
 | 
        tmp = ((pSharpV1->lum_clp_m[i]) * mClipStrength); 
 | 
        if(tmp > 0xff) { 
 | 
            tmp = 0xff; 
 | 
        } 
 | 
        pSharpCfg->lum_clp_m[i] = (unsigned char)tmp; 
 | 
    } 
 | 
  
 | 
    //0x00e8 - 0x00ec 
 | 
    for(i = 0; i < 8; i++) { 
 | 
        tmp = ROUND_F(pSharpV1->lum_min_m[i] * mClipStrength * (1 << reg_sharpenHW_lum_min_m_fix_bits)); 
 | 
        if(tmp < -32) { 
 | 
            tmp = -32; 
 | 
        } 
 | 
        pSharpCfg->lum_min_m[i] = (char)tmp; 
 | 
    } 
 | 
  
 | 
    //0x00f0 - 0x00f4 
 | 
  
 | 
  
 | 
    // mf bf sigma inv 
 | 
    max_val = 0; 
 | 
    min_val = 65536; 
 | 
    shf_bits = 0; 
 | 
    for(int i = 0; i < RK_SHARPFILTER_LUMA_POINT_NUM; i++) 
 | 
    { 
 | 
        int cur_sigma = FLOOR(pSharpV1->luma_sigma[i] * pSharpV1->mbf_gain + pSharpV1->mbf_add); 
 | 
        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]; 
 | 
  
 | 
    for(i = 0; i < 8; i++) { 
 | 
        pSharpCfg->mbf_sigma[i] = (unsigned char)ROUND_F((float)1 
 | 
                                  / (pSharpV1->luma_sigma[i] * pSharpV1->mbf_gain + pSharpV1->mbf_add) 
 | 
                                  * (1 << sigma_bits[2])); 
 | 
    } 
 | 
  
 | 
    //0x00f8 - 0x00fc 
 | 
    for(i = 0; i < 8; i++) { 
 | 
        tmp = (pSharpV1->lum_clp_h[i] * hClipStrength); 
 | 
        if(tmp > 0xff) { 
 | 
            tmp = 0xff; 
 | 
        } 
 | 
        pSharpCfg->lum_clp_h[i] = (unsigned char)tmp; 
 | 
    } 
 | 
  
 | 
    //0x0100 - 0x0104 
 | 
    //hbf 
 | 
  
 | 
    max_val = 0; 
 | 
    min_val = 65536; 
 | 
    shf_bits = 0; 
 | 
    for(int i = 0; i < RK_SHARPFILTER_LUMA_POINT_NUM; i++) 
 | 
    { 
 | 
        int cur_sigma = FLOOR(pSharpV1->luma_sigma[i] * pSharpV1->hbf_gain + pSharpV1->hbf_add); 
 | 
        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]; 
 | 
  
 | 
    for(i = 0; i < 8; i++) { 
 | 
        pSharpCfg->hbf_sigma[i] = (unsigned char)ROUND_F((float)1 
 | 
                                  / (pSharpV1->luma_sigma[i] * pSharpV1->hbf_gain + pSharpV1->hbf_add) 
 | 
                                  * (1 << sigma_bits[2])); 
 | 
    } 
 | 
  
 | 
    //0x0128 
 | 
    tmp = ROUND_F(pSharpV1->lratio /  fPercent * (1 << reg_sharpenHW_lratio_fix_bits)); 
 | 
    if(tmp > 0x100) { 
 | 
        tmp = 0x100; 
 | 
    } 
 | 
    pSharpCfg->rfl_ratio = (unsigned short) tmp; 
 | 
  
 | 
    tmp = ROUND_F(pSharpV1->hratio * fPercent * (1 << reg_sharpenHW_hratio_fix_bits)); 
 | 
    if(tmp > 0x3ff) { 
 | 
        tmp = 0x3ff; 
 | 
    } 
 | 
    if(tmp < 0x100) { 
 | 
        tmp = 0x100; 
 | 
    } 
 | 
    pSharpCfg->rfh_ratio = (unsigned short) tmp; 
 | 
  
 | 
    //0x012C 
 | 
    pSharpCfg->m_ratio = (unsigned char)ROUND_F(pSharpV1->M_ratio * fPercent * (1 << reg_sharpenHW_M_ratio_fix_bits)); 
 | 
    if(pSharpCfg->m_ratio > 0x1f) { 
 | 
        pSharpCfg->m_ratio = 0x1f; 
 | 
    } 
 | 
    pSharpCfg->h_ratio = (unsigned char)ROUND_F(pSharpV1->H_ratio *  fPercent * (1 << reg_sharpenHW_H_ratio_fix_bits)); 
 | 
    if(pSharpCfg->h_ratio > 0x1f) { 
 | 
        pSharpCfg->h_ratio = 0x1f; 
 | 
    } 
 | 
  
 | 
  
 | 
    return res; 
 | 
} 
 | 
  
 | 
AsharpResult_t rk_Sharp_fix_transfer(RKAsharp_Sharp_Params_Select_t* sharp, RKAsharp_Sharp_Fix_t* pSharpCfg, float fPercent) 
 | 
{ 
 | 
    AsharpResult_t res = ASHARP_RET_SUCCESS; 
 | 
  
 | 
    if(sharp == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    if(pSharpCfg == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    rk_Sharp_V1_fix_transfer(&sharp->rk_sharpen_params_selected_V1, &pSharpCfg->stSharpFixV1, fPercent); 
 | 
  
 | 
    return res; 
 | 
} 
 | 
  
 | 
AsharpResult_t sharp_calibdbV2_assign(CalibDbV2_SharpV1_t *pDst, CalibDbV2_SharpV1_t *pSrc) 
 | 
{ 
 | 
    AsharpResult_t res = ASHARP_RET_SUCCESS; 
 | 
    CalibDbV2_SharpV1_TuningPara_t *pSrcTuningParaV2 = NULL; 
 | 
    CalibDbV2_SharpV1_TuningPara_t *pDstTuningParaV2 = NULL; 
 | 
    int setting_len = 0; 
 | 
    int iso_len = 0; 
 | 
  
 | 
  
 | 
    if(pDst == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
  
 | 
    if(pSrc == NULL) { 
 | 
        LOGE_ASHARP("%s(%d): null pointer\n", __FUNCTION__, __LINE__); 
 | 
        return ASHARP_RET_NULL_POINTER; 
 | 
    } 
 | 
    sharp_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_SharpV1_TuningPara_Setting_t *)malloc(setting_len * sizeof(CalibDbV2_SharpV1_TuningPara_Setting_t)); 
 | 
    memset(pDstTuningParaV2->Setting, 0x00, setting_len * sizeof(CalibDbV2_SharpV1_TuningPara_Setting_t)); 
 | 
    pDstTuningParaV2->Setting_len = setting_len; 
 | 
  
 | 
    for(int i = 0; i < setting_len; i++) { 
 | 
        iso_len = pSrcTuningParaV2->Setting[i].Tuning_ISO_len; 
 | 
        pDstTuningParaV2->Setting[i].Tuning_ISO = (CalibDbV2_SharpV1_TuningPara_Setting_ISO_t *)malloc(iso_len * sizeof(CalibDbV2_SharpV1_TuningPara_Setting_ISO_t)); 
 | 
        memset(pDstTuningParaV2->Setting[i].Tuning_ISO, 0x00, iso_len * sizeof(CalibDbV2_SharpV1_TuningPara_Setting_ISO_t)); 
 | 
        pDstTuningParaV2->Setting[i].Tuning_ISO_len = iso_len; 
 | 
    } 
 | 
  
 | 
    for(int i = 0; i < setting_len; i++) { 
 | 
        iso_len = pSrcTuningParaV2->Setting[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; j < iso_len; j++) { 
 | 
            pDstTuningParaV2->Setting[i].Tuning_ISO[j] = pSrcTuningParaV2->Setting[i].Tuning_ISO[j]; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    pDstTuningParaV2->kernel_coeff = pSrcTuningParaV2->kernel_coeff; 
 | 
  
 | 
    return res; 
 | 
  
 | 
} 
 | 
  
 | 
  
 | 
  
 | 
void sharp_calibdbV2_free(CalibDbV2_SharpV1_t *pCalibdbV2) 
 | 
{ 
 | 
    if(pCalibdbV2) { 
 | 
        if(pCalibdbV2->Version) { 
 | 
            free(pCalibdbV2->Version); 
 | 
        } 
 | 
  
 | 
        if(pCalibdbV2->TuningPara.Setting) { 
 | 
            for(int i = 0; i < pCalibdbV2->TuningPara.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 
 |