|
|
#include "rk_aiq_anr_algo_bayernr.h"
|
|
RKAIQ_BEGIN_DECLARE
|
|
ANRresult_t bayernr_get_mode_cell_idx_by_name(CalibDb_BayerNr_2_t *pCalibdb, char *name, int *mode_idx)
|
{
|
int i = 0;
|
ANRresult_t res = ANR_RET_SUCCESS;
|
|
if(pCalibdb == NULL){
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ANR_RET_NULL_POINTER;
|
}
|
|
if(name == NULL){
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ANR_RET_NULL_POINTER;
|
}
|
|
if(mode_idx == NULL){
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ANR_RET_NULL_POINTER;
|
}
|
|
if(pCalibdb->mode_num < 1){
|
LOGE_ANR("%s(%d): bayerne mode cell is zero\n", __FUNCTION__, __LINE__);
|
return ANR_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 = ANR_RET_SUCCESS;
|
}else{
|
*mode_idx = 0;
|
res = ANR_RET_FAILURE;
|
}
|
|
LOGD_ANR("%s:%d mode_name:%s mode_idx:%d i:%d \n", __FUNCTION__, __LINE__,name, *mode_idx, i);
|
return res;
|
|
}
|
|
ANRresult_t bayernr_get_setting_idx_by_name(CalibDb_BayerNr_2_t *pCalibdb, char *name, int mode_idx, int *setting_idx)
|
{
|
int i = 0;
|
ANRresult_t res = ANR_RET_SUCCESS;
|
|
if(pCalibdb == NULL){
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ANR_RET_NULL_POINTER;
|
}
|
|
if(name == NULL){
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ANR_RET_NULL_POINTER;
|
}
|
|
if(setting_idx == NULL){
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ANR_RET_NULL_POINTER;
|
}
|
|
for(i=0; 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 = ANR_RET_SUCCESS;
|
}else{
|
*setting_idx = 0;
|
res = ANR_RET_FAILURE;
|
}
|
|
LOGD_ANR("%s:%d snr_name:%s snr_idx:%d i:%d \n", __FUNCTION__, __LINE__,name, *setting_idx, i);
|
return res;
|
|
}
|
|
ANRresult_t bayernr_config_setting_param(RKAnr_Bayernr_Params_t *pParams, CalibDb_BayerNr_2_t *pCalibdb, char* param_mode, char * snr_name)
|
{
|
ANRresult_t res = ANR_RET_SUCCESS;
|
int mode_idx = 0;
|
int setting_idx = 0;
|
|
res = bayernr_get_mode_cell_idx_by_name(pCalibdb, param_mode, &mode_idx);
|
if(res != ANR_RET_SUCCESS){
|
LOGW_ANR("%s(%d): error!!! can't find mode name in iq files, use 0 instead\n", __FUNCTION__, __LINE__);
|
}
|
|
res = bayernr_get_setting_idx_by_name(pCalibdb, snr_name, mode_idx, &setting_idx);
|
if(res != ANR_RET_SUCCESS){
|
LOGW_ANR("%s(%d): error!!! can't find setting in iq files, use 0 instead\n", __FUNCTION__, __LINE__);
|
}
|
|
res = init_bayernr_params(pParams, pCalibdb, mode_idx, setting_idx);
|
|
return res;
|
|
}
|
|
ANRresult_t init_bayernr_params(RKAnr_Bayernr_Params_t *pParams, CalibDb_BayerNr_2_t *pCalibdb, int mode_idx, int setting_idx)
|
{
|
ANRresult_t res = ANR_RET_SUCCESS;
|
int i = 0;
|
int j = 0;
|
|
LOGI_ANR("%s:(%d) oyyf bayerner xml config start\n", __FUNCTION__, __LINE__);
|
if(pParams == NULL) {
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ANR_RET_NULL_POINTER;
|
}
|
|
if(pCalibdb == NULL) {
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ANR_RET_NULL_POINTER;
|
}
|
|
//RKAnr_Bayernr_Params_t *pParams = &pANRCtx->stAuto.stBayernrParams;
|
//CalibDb_BayerNr_t *pCalibdb = &pANRConfig->stBayernrCalib;
|
|
CalibDb_BayerNR_Params_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->iso[i];
|
#endif
|
pParams->a[i] = pSetting->iso[i];
|
pParams->b[i] = pSetting->iso[i];
|
pParams->filtpar[i] = pSetting->filtPara[i];
|
LOGI_ANR("a[%d]:%f filtpar[%d]:%f\n",
|
i, pParams->a[i],
|
i, pParams->filtpar[i]);
|
}
|
|
pParams->halfpatch = 1;
|
pParams->halfblock = 1;
|
|
for(i=0; i<7; i++){
|
pParams->ctrPit[i] = 1.0;
|
}
|
|
for(i=0; i<8; i++){
|
pParams->luLevel[i] = pSetting->luLevelVal[i];
|
LOGI_ANR("luLevel[%d]:%f \n",
|
i, pParams->luLevel[i]);
|
}
|
|
for(i = 0; i<MAX_ISO_STEP; i++){
|
for(j=0; j<8; j++){
|
pParams->luRatio[i][j] = pSetting->luRatio[j][i];
|
}
|
}
|
|
for(i = 0; i<MAX_ISO_STEP; i++){
|
for(j=0; j<4; j++){
|
pParams->w[i][j] = pSetting->fixW[j][i];
|
}
|
}
|
|
pParams->peaknoisesigma = pSetting->lamda;
|
pParams->sw_rawnr_gauss_en = pSetting->gauss_en;
|
pParams->rgain_offs = pSetting->RGainOff;
|
pParams->rgain_filp = pSetting->RGainFilp;
|
pParams->bgain_offs = pSetting->BGainOff;
|
pParams->bgain_filp = pSetting->BGainFilp;
|
pParams->bayernr_edgesoftness = pSetting->edgeSoftness;
|
pParams->bayernr_gauss_weight0 = 0;
|
pParams->bayernr_gauss_weight1 = 0;
|
|
memcpy(pParams->bayernr_ver_char, pCalibdb->version, sizeof(pParams->bayernr_ver_char));
|
|
LOGI_ANR("%s:(%d) oyyf bayerner xml config end! ver:%s \n", __FUNCTION__, __LINE__, pParams->bayernr_ver_char);
|
|
return res;
|
}
|
|
|
|
ANRresult_t bayernr_get_setting_idx_by_name_json(CalibDbV2_BayerNrV1_t *pCalibdb, char *name, int *calib_idx, int * tuning_idx)
|
{
|
int i = 0;
|
ANRresult_t res = ANR_RET_SUCCESS;
|
|
if(pCalibdb == NULL){
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ANR_RET_NULL_POINTER;
|
}
|
|
if(name == NULL){
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ANR_RET_NULL_POINTER;
|
}
|
|
if(calib_idx == NULL){
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ANR_RET_NULL_POINTER;
|
}
|
|
if(tuning_idx == NULL){
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ANR_RET_NULL_POINTER;
|
}
|
|
for(i=0; i<pCalibdb->TuningPara.Setting_len; i++){
|
if(strncmp(name, pCalibdb->TuningPara.Setting[i].SNR_Mode , strlen(name)*sizeof(char)) == 0){
|
break;
|
}
|
}
|
|
if(i<pCalibdb->TuningPara.Setting_len){
|
*tuning_idx = i;
|
}else{
|
*tuning_idx = 0;
|
}
|
|
for(i=0; i<pCalibdb->CalibPara.Setting_len; i++){
|
if(strncmp(name, pCalibdb->CalibPara.Setting[i].SNR_Mode , strlen(name)*sizeof(char)) == 0){
|
break;
|
}
|
}
|
|
if(i<pCalibdb->CalibPara.Setting_len){
|
*calib_idx = i;
|
}else{
|
*calib_idx = 0;
|
}
|
|
LOGD_ANR("%s:%d snr_name:%s snr_idx:%d i:%d \n", __FUNCTION__, __LINE__,name, *calib_idx, i);
|
return res;
|
|
}
|
|
|
ANRresult_t init_bayernr_params_json(RKAnr_Bayernr_Params_t *pParams, CalibDbV2_BayerNrV1_t *pCalibdb, int calib_idx, int tuning_idx)
|
{
|
ANRresult_t res = ANR_RET_SUCCESS;
|
int i = 0;
|
int j = 0;
|
|
LOGI_ANR("%s:(%d) oyyf bayerner xml config start\n", __FUNCTION__, __LINE__);
|
if(pParams == NULL) {
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ANR_RET_NULL_POINTER;
|
}
|
|
if(pCalibdb == NULL) {
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ANR_RET_NULL_POINTER;
|
}
|
|
CalibDbV2_BayerNrV1_CalibPara_Setting_t *pCalibSetting = &pCalibdb->CalibPara.Setting[calib_idx];
|
CalibDbV2_BayerNrV1_TuningPara_Setting_t *pTuningSetting= &pCalibdb->TuningPara.Setting[tuning_idx];
|
|
CalibDbV2_BayerNrV1_CalibPara_Setting_ISO_t *pCalib_ISO = NULL;
|
CalibDbV2_BayerNrV1_TuningPara_Setting_ISO_t *pTuning_ISO = NULL;
|
|
|
for(i=0; i<pTuningSetting->Tuning_ISO_len; i++){
|
pTuning_ISO = &pTuningSetting->Tuning_ISO[i];
|
|
#ifndef RK_SIMULATOR_HW
|
pParams->iso[i] = pTuning_ISO->iso;
|
#endif
|
pParams->a[i] = pTuning_ISO->iso;
|
pParams->b[i] = pTuning_ISO->iso;
|
pParams->filtpar[i] = pTuning_ISO->filtPara;
|
LOGI_ANR("a[%d]:%f filtpar[%d]:%f\n",
|
i, pParams->a[i],
|
i, pParams->filtpar[i]);
|
}
|
|
pParams->halfpatch = 1;
|
pParams->halfblock = 1;
|
|
for(i=0; i<7; i++){
|
pParams->ctrPit[i] = 1.0;
|
}
|
|
for(i=0; i<8; i++){
|
pParams->luLevel[i] = pCalibSetting->Calib_ISO[0].luLevelVal[i];
|
LOGI_ANR("luLevel[%d]:%f \n",
|
i, pParams->luLevel[i]);
|
}
|
|
for(i = 0; i<pCalibSetting->Calib_ISO_len; i++){
|
for(j=0; j<8; j++){
|
pParams->luRatio[i][j] = pCalibSetting->Calib_ISO[i].luRatio[j];
|
}
|
}
|
|
for(i = 0; i<pTuningSetting->Tuning_ISO_len; i++){
|
pParams->w[i][0] = pTuningSetting->Tuning_ISO[i].fixW0;
|
pParams->w[i][1] = pTuningSetting->Tuning_ISO[i].fixW1;
|
pParams->w[i][2] = pTuningSetting->Tuning_ISO[i].fixW2;
|
pParams->w[i][3] = pTuningSetting->Tuning_ISO[i].fixW3;
|
}
|
|
pParams->peaknoisesigma = pTuningSetting->Tuning_ISO[0].lamda;
|
pParams->sw_rawnr_gauss_en = pTuningSetting->Tuning_ISO[0].gauss_en;
|
pParams->rgain_offs = pTuningSetting->Tuning_ISO[0].RGainOff;
|
pParams->rgain_filp = pTuningSetting->Tuning_ISO[0].RGainFilp;
|
pParams->bgain_offs = pTuningSetting->Tuning_ISO[0].BGainOff;
|
pParams->bgain_filp = pTuningSetting->Tuning_ISO[0].BGainFilp;
|
|
pParams->bayernr_edgesoftness = 0;
|
pParams->bayernr_gauss_weight0 = 0;
|
pParams->bayernr_gauss_weight1 = 0;
|
|
strncpy(pParams->bayernr_ver_char, pCalibdb->Version, sizeof(pParams->bayernr_ver_char));
|
|
LOGI_ANR("%s:(%d) oyyf bayerner xml config end! ver:%s \n", __FUNCTION__, __LINE__, pParams->bayernr_ver_char);
|
|
bayernr_algo_param_printf(pParams);
|
|
return res;
|
}
|
|
ANRresult_t bayernr_algo_param_printf(RKAnr_Bayernr_Params_t *pParams)
|
{
|
int i,j;
|
|
if(pParams == NULL){
|
LOGE_ANR("NULL pointer\n");
|
return ANR_RET_NULL_POINTER;
|
}
|
|
for(i=0; i<MAX_ISO_STEP; i++){
|
#ifndef RK_SIMULATOR_HW
|
LOGD_ANR("bayernr: iso:%f\n",
|
pParams->iso[i]);
|
#endif
|
|
LOGD_ANR("a[%d]:%f filtpar[%d]:%f\n",
|
i, pParams->a[i],
|
i, pParams->filtpar[i]);
|
}
|
|
for(i=0; i<8; i++){
|
LOGD_ANR("luLevel[%d]:%f \n",
|
i, pParams->luLevel[i]);
|
}
|
|
for(i = 0; i<MAX_ISO_STEP; i++){
|
for(j=0; j<8; j++){
|
LOGD_ANR("luLevel[%d][%d]:%f \n",
|
i, j, pParams->luRatio[i][j]);
|
}
|
|
LOGD_ANR("fixw[%d]:%f %f %f %f \n",
|
i, pParams->w[i][0], pParams->w[i][1], pParams->w[i][2], pParams->w[i][3]);
|
}
|
|
LOGD_ANR(" lamda:%f gauss_en:%d\n",
|
pParams->peaknoisesigma, pParams->sw_rawnr_gauss_en);
|
|
return ANR_RET_SUCCESS;
|
}
|
|
ANRresult_t bayernr_config_setting_param_json(RKAnr_Bayernr_Params_t *pParams, CalibDbV2_BayerNrV1_t *pCalibdb, char* param_mode, char * snr_name)
|
{
|
ANRresult_t res = ANR_RET_SUCCESS;
|
int calib_idx = 0;
|
int tuning_idx = 0;
|
|
res = bayernr_get_setting_idx_by_name_json(pCalibdb, snr_name, &calib_idx, &tuning_idx);
|
if(res != ANR_RET_SUCCESS){
|
LOGW_ANR("%s(%d): error!!! can't find setting in iq files, use 0 instead\n", __FUNCTION__, __LINE__);
|
}
|
|
res = init_bayernr_params_json(pParams, pCalibdb, calib_idx, tuning_idx);
|
|
return res;
|
|
}
|
|
ANRresult_t selsec_hdr_parmas_by_ISO(RKAnr_Bayernr_Params_t *stBayerNrParams, RKAnr_Bayernr_Params_Select_t *stBayerNrParamsSelected, ANRExpInfo_t *pExpInfo)
|
{
|
float frameiso[3];
|
float frameEt[3];
|
float fdgain[3];
|
int i = 0;
|
|
if(stBayerNrParams == NULL) {
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ANR_RET_NULL_POINTER;
|
}
|
|
if(stBayerNrParamsSelected == NULL) {
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ANR_RET_NULL_POINTER;
|
}
|
|
if(pExpInfo == NULL) {
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ANR_RET_NULL_POINTER;
|
}
|
|
int framenum = pExpInfo->hdr_mode + 1;
|
|
frameiso[0] = pExpInfo->arAGain[0] * pExpInfo->arDGain[0];
|
frameiso[1] = pExpInfo->arAGain[1] * pExpInfo->arDGain[1];
|
frameiso[2] = pExpInfo->arAGain[2] * pExpInfo->arDGain[2];
|
|
frameEt[0] = pExpInfo->arTime[0];
|
frameEt[1] = pExpInfo->arTime[1];
|
frameEt[2] = pExpInfo->arTime[2];
|
|
for(int j = 0; j < framenum; j++)
|
{
|
////降噪参数获取
|
//确定iso等级
|
//共有7个iso等级:50 100 200 400 800 1600 3200 6400 12800
|
// isogain: 1 2 4 8 16 32 64 128 256
|
// isolevel: 0 1 2 3 4 5 6 7 8
|
int isoGainStd[MAX_ISO_STEP];
|
int isoGain = int(frameiso[j]);
|
int isoGainLow = 0; //向下一个isoGain,用做参数插值:y=float(isoGainHig-isoGain)/float(isoGainHig-isoGainLow)*y[isoLevelLow]
|
// +float(isoGain-isoGainLow)/float(isoGainHig-isoGainLow)*y[isoLevelHig];
|
int isoGainHig = 0; //向上一个isoGain
|
int isoGainCorrect = 1; //选择最近的一档iso的配置
|
|
int isoLevelLow = 0;
|
int isoLevelHig = 0;
|
int isoLevelCorrect = 0;
|
|
#ifndef RK_SIMULATOR_HW
|
for(int i = 0; i < MAX_ISO_STEP; i++) {
|
isoGainStd[i] = stBayerNrParams->iso[i] / 50;
|
}
|
#else
|
for(int i = 0; i < MAX_ISO_STEP; i++) {
|
isoGainStd[i] = 1 * (1 << i);
|
}
|
#endif
|
|
for (i = 0; i < MAX_ISO_STEP - 1; i++)
|
{
|
if (isoGain >= isoGainStd[i] && isoGain <= isoGainStd[i + 1])
|
{
|
isoGainLow = isoGainStd[i];
|
isoGainHig = isoGainStd[i + 1];
|
isoLevelLow = i;
|
isoLevelHig = i + 1;
|
isoGainCorrect = ((isoGain - isoGainStd[i]) <= (isoGainStd[i + 1] - isoGain)) ? isoGainStd[i] : isoGainStd[i + 1];
|
isoLevelCorrect = ((isoGain - isoGainStd[i]) <= (isoGainStd[i + 1] - isoGain)) ? i : (i + 1);
|
}
|
}
|
|
//VST变换参数, bilinear
|
stBayerNrParamsSelected->a[j] = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->a[isoLevelLow]
|
+ float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->a[isoLevelHig];
|
|
stBayerNrParamsSelected->b[j] = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->b[isoLevelLow]
|
+ float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->b[isoLevelHig];
|
|
stBayerNrParamsSelected->b[j] = 0;
|
stBayerNrParamsSelected->t0[j] = 0;
|
|
stBayerNrParamsSelected->filtPar[j] = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->filtpar[isoLevelLow]
|
+ float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->filtpar[isoLevelHig];
|
|
}
|
|
for (i = 0; i < framenum; i++) {
|
frameiso[i] = frameiso[i] * 50;
|
fdgain[i] = frameiso[i] * frameEt[i];
|
}
|
|
for (i = 0; i < framenum; i++) {
|
fdgain[i] = fdgain[framenum - 1] / fdgain[i];
|
#if 0
|
stBayerNrParamsSelected->sw_dgain[i] = fdgain[i];
|
#else
|
stBayerNrParamsSelected->sw_dgain[i] = sqrt(fdgain[i]);
|
#endif
|
}
|
|
float filtParDiscount = (float)0.1;
|
for (i = 0; i < framenum; i++)
|
{
|
float gainsqrt = sqrt(fdgain[i]);
|
#if 0
|
float par = (stBayerNrParamsSelected->filtPar[i] * filtParDiscount);
|
|
LOGD_ANR("gainsqrt:%f filtpar:%f, total:%f\n",
|
gainsqrt, stBayerNrParamsSelected->filtPar[i], par * gainsqrt);
|
stBayerNrParamsSelected->filtPar[i] = par * gainsqrt;
|
#else
|
stBayerNrParamsSelected->filtPar[i] = stBayerNrParamsSelected->filtPar[i] * gainsqrt;
|
#endif
|
}
|
|
if(framenum <= 1 ) {
|
stBayerNrParamsSelected->gausskparsq = int((1 * 1) * float(1 << (FIXNLMCALC)));// * (1 << 7);
|
} else {
|
stBayerNrParamsSelected->gausskparsq = int((1 * 1) * float(1 << (FIXNLMCALC)));
|
}
|
stBayerNrParamsSelected->sigmaPar = 0 * (1 << FIXNLMCALC);
|
stBayerNrParamsSelected->thld_diff = (int(LUTMAXM1_FIX * LUTPRECISION_FIX));
|
stBayerNrParamsSelected->thld_chanelw = int(0.1 * float(1 << FIXNLMCALC));
|
stBayerNrParamsSelected->pix_diff = FIXDIFMAX - 1;
|
stBayerNrParamsSelected->log_bypass = 0; //0 is none, 1 is G and RB all en, 2 only en G, 3 only RB;
|
|
if(framenum <= 1 ) {
|
stBayerNrParamsSelected->filtPar[1] = stBayerNrParamsSelected->filtPar[0];
|
stBayerNrParamsSelected->filtPar[2] = stBayerNrParamsSelected->filtPar[0];
|
stBayerNrParamsSelected->sw_dgain[1] = stBayerNrParamsSelected->sw_dgain[0];
|
stBayerNrParamsSelected->sw_dgain[2] = stBayerNrParamsSelected->sw_dgain[0];
|
}
|
return ANR_RET_SUCCESS;
|
}
|
|
ANRresult_t select_bayernr_params_by_ISO(RKAnr_Bayernr_Params_t *stBayerNrParams, RKAnr_Bayernr_Params_Select_t *stBayerNrParamsSelected, ANRExpInfo_t *pExpInfo)
|
{
|
ANRresult_t res = ANR_RET_SUCCESS;
|
int iso = 50;
|
|
if(stBayerNrParams == NULL) {
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ANR_RET_NULL_POINTER;
|
}
|
|
if(stBayerNrParamsSelected == NULL) {
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ANR_RET_NULL_POINTER;
|
}
|
|
if(pExpInfo == NULL) {
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ANR_RET_NULL_POINTER;
|
}
|
|
iso = pExpInfo->arIso[pExpInfo->hdr_mode];
|
|
LOGD_ANR("%s:%d iso:%d \n", __FUNCTION__, __LINE__, iso);
|
|
int isoGainStd[MAX_ISO_STEP];
|
int isoGain = MAX(int(iso / 50), 1);
|
int isoGainLow = 0;
|
int isoGainHig = 0;
|
int isoGainCorrect = 1;
|
int isoLevelLow = 0;
|
int isoLevelHig = 0;
|
int isoLevelCorrect = 0;
|
int i, j;
|
|
#ifndef RK_SIMULATOR_HW
|
for(int i = 0; i < MAX_ISO_STEP; i++) {
|
isoGainStd[i] = stBayerNrParams->iso[i] / 50;
|
}
|
#else
|
for(int i = 0; i < MAX_ISO_STEP; i++) {
|
isoGainStd[i] = 1 * (1 << i);
|
}
|
#endif
|
|
|
for (i = 0; i < MAX_ISO_STEP - 1; i++)
|
{
|
if (isoGain >= isoGainStd[i] && isoGain <= isoGainStd[i + 1])
|
{
|
isoGainLow = isoGainStd[i];
|
isoGainHig = isoGainStd[i + 1];
|
isoLevelLow = i;
|
isoLevelHig = i + 1;
|
isoGainCorrect = ((isoGain - isoGainStd[i]) <= (isoGainStd[i + 1] - isoGain)) ? isoGainStd[i] : isoGainStd[i + 1];
|
isoLevelCorrect = ((isoGain - isoGainStd[i]) <= (isoGainStd[i + 1] - isoGain)) ? i : (i + 1);
|
break;
|
}
|
}
|
|
if(i == MAX_ISO_STEP - 1){
|
if(isoGain < isoGainStd[0]){
|
isoGainLow = isoGainStd[0];
|
isoGainHig = isoGainStd[1];
|
isoLevelLow = 0;
|
isoLevelHig = 1;
|
isoGainCorrect = ((isoGain - isoGainStd[0]) <= (isoGainStd[1] - isoGain)) ? isoGainStd[0] : isoGainStd[1];
|
isoLevelCorrect = ((isoGain - isoGainStd[0]) <= (isoGainStd[1] - isoGain)) ? 0 : (1);
|
}
|
|
if(isoGain > isoGainStd[MAX_ISO_STEP - 1]){
|
isoGainLow = isoGainStd[MAX_ISO_STEP - 2];
|
isoGainHig = isoGainStd[MAX_ISO_STEP - 1];
|
isoLevelLow = MAX_ISO_STEP - 2;
|
isoLevelHig = MAX_ISO_STEP - 1;
|
isoGainCorrect = ((isoGain - isoGainStd[MAX_ISO_STEP - 2]) <= (isoGainStd[MAX_ISO_STEP - 1] - isoGain)) ? isoGainStd[MAX_ISO_STEP - 2] : isoGainStd[MAX_ISO_STEP - 1];
|
isoLevelCorrect = ((isoGain - isoGainStd[MAX_ISO_STEP - 2]) <= (isoGainStd[MAX_ISO_STEP - 1] - isoGain)) ? (MAX_ISO_STEP - 2) : (MAX_ISO_STEP - 1);
|
}
|
}
|
|
LOGD_ANR("%s:%d iso:%d high:%d low:%d\n",
|
__FUNCTION__, __LINE__,
|
isoGain, isoGainHig, isoGainLow);
|
|
//VST变换参数, bilinear
|
stBayerNrParamsSelected->a[0] = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->a[isoLevelLow]
|
+ float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->a[isoLevelHig];
|
|
stBayerNrParamsSelected->b[0] = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->b[isoLevelLow]
|
+ float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->b[isoLevelHig];
|
|
stBayerNrParamsSelected->b[0] = 0;
|
stBayerNrParamsSelected->t0[0] = 0;
|
|
//领域halfBlock、搜索halfBlock、降噪系数filtPar,其中halfPatch和halfBlock都是对单通道而言
|
stBayerNrParamsSelected->halfPatch = stBayerNrParams->halfpatch;
|
stBayerNrParamsSelected->halfBlock = stBayerNrParams->halfblock;
|
|
stBayerNrParamsSelected->filtPar[0] = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->filtpar[isoLevelLow]
|
+ float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->filtpar[isoLevelHig];
|
|
#ifdef BAYER_NR_DEBUG
|
LOGD_ANR("Patch=%d*%d\n", stBayerNrParamsSelected->halfPatch * 2 + 1, stBayerNrParamsSelected->halfPatch * 2 + 1);
|
LOGD_ANR("Block=%d*%d\n", stBayerNrParamsSelected->halfBlock * 2 + 1, stBayerNrParamsSelected->halfBlock * 2 + 1);
|
LOGD_ANR("filPar=%f\n", stBayerNrParamsSelected->filtPar);
|
#endif
|
|
for (i = 0; i < 7; i++)
|
{
|
stBayerNrParamsSelected->ctrPit[i] = stBayerNrParams->ctrPit[i];
|
}
|
|
for (i = 0; i < 8; i++)
|
{
|
stBayerNrParamsSelected->luLevel[i] = stBayerNrParams->luLevel[i];
|
stBayerNrParamsSelected->luRatio[i] = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->luRatio[isoLevelLow][i]
|
+ float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->luRatio[isoLevelHig][i];
|
}
|
|
stBayerNrParamsSelected->peaknoisesigma = stBayerNrParams->peaknoisesigma;
|
stBayerNrParamsSelected->sw_rawnr_gauss_en = stBayerNrParams->sw_rawnr_gauss_en;
|
for (i = 0; i < 4; i++)
|
{
|
stBayerNrParamsSelected->w[i] = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->w[isoLevelLow][i]
|
+ float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->w[isoLevelHig][i];
|
}
|
stBayerNrParamsSelected->bayernr_edgesoftness = stBayerNrParams->bayernr_edgesoftness;
|
|
stBayerNrParamsSelected->sw_bayernr_edge_filter_en = stBayerNrParams->sw_bayernr_edge_filter_en;
|
for (i = 0; i < 8; i++)
|
{
|
stBayerNrParamsSelected->sw_bayernr_edge_filter_lumapoint[i] = stBayerNrParams->sw_bayernr_edge_filter_lumapoint[i];
|
stBayerNrParamsSelected->sw_bayernr_edge_filter_wgt[i] = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->sw_bayernr_edge_filter_wgt[isoLevelLow][i]
|
+ float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->sw_bayernr_edge_filter_wgt[isoLevelHig][i];
|
}
|
stBayerNrParamsSelected->sw_bayernr_filter_strength = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->sw_bayernr_filter_strength[isoLevelLow]
|
+ float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->sw_bayernr_filter_strength[isoLevelHig];
|
for (i = 0; i < 16; i++)
|
{
|
stBayerNrParamsSelected->sw_bayernr_filter_lumapoint[i] = stBayerNrParams->sw_bayernr_filter_lumapoint[i];
|
stBayerNrParamsSelected->sw_bayernr_filter_sigma[i] = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->sw_bayernr_filter_sigma[isoLevelLow][i]
|
+ float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->sw_bayernr_filter_sigma[isoLevelHig][i];
|
}
|
stBayerNrParamsSelected->sw_bayernr_filter_edgesofts = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->sw_bayernr_filter_edgesofts[isoLevelLow]
|
+ float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->sw_bayernr_filter_edgesofts[isoLevelHig];
|
stBayerNrParamsSelected->sw_bayernr_filter_soft_threshold_ratio = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->sw_bayernr_filter_soft_threshold_ratio[isoLevelLow]
|
+ float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->sw_bayernr_filter_soft_threshold_ratio[isoLevelHig];
|
stBayerNrParamsSelected->sw_bayernr_filter_out_wgt = float(isoGainHig - isoGain) / float(isoGainHig - isoGainLow) * stBayerNrParams->sw_bayernr_filter_out_wgt[isoLevelLow]
|
+ float(isoGain - isoGainLow) / float(isoGainHig - isoGainLow) * stBayerNrParams->sw_bayernr_filter_out_wgt[isoLevelHig];
|
|
//oyyf: add some fix params select
|
memcpy(stBayerNrParamsSelected->bayernr_ver_char, stBayerNrParams->bayernr_ver_char, sizeof(stBayerNrParams->bayernr_ver_char));
|
stBayerNrParamsSelected->rgain_offs = stBayerNrParams->rgain_offs;
|
stBayerNrParamsSelected->rgain_filp = stBayerNrParams->rgain_filp;
|
stBayerNrParamsSelected->bgain_offs = stBayerNrParams->bgain_offs;
|
stBayerNrParamsSelected->bgain_filp = stBayerNrParams->bgain_filp;
|
|
stBayerNrParamsSelected->bayernr_gauss_weight0 = stBayerNrParams->bayernr_gauss_weight0;
|
stBayerNrParamsSelected->bayernr_gauss_weight1 = stBayerNrParams->bayernr_gauss_weight1;
|
|
stBayerNrParamsSelected->gausskparsq = int((1.15 * 1.15) * float(1 << (FIXNLMCALC)));
|
stBayerNrParamsSelected->sigmaPar = 0 * (1 << FIXNLMCALC);
|
stBayerNrParamsSelected->thld_diff = (int(LUTMAXM1_FIX * LUTPRECISION_FIX));
|
stBayerNrParamsSelected->thld_chanelw = int(0.1 * float(1 << FIXNLMCALC));
|
stBayerNrParamsSelected->pix_diff = FIXDIFMAX - 1;
|
stBayerNrParamsSelected->log_bypass = 0; //0 is none, 1 is G and RB all en, 2 only en G, 3 only RB;
|
|
//oyyf: if hdr open
|
selsec_hdr_parmas_by_ISO(stBayerNrParams, stBayerNrParamsSelected, pExpInfo);
|
|
return res;
|
}
|
|
|
unsigned short bayernr_get_trans(int tmpfix)
|
{
|
int logtablef[65] = {0, 1465, 2909, 4331, 5731, 7112, 8472, 9813, 11136, 12440,
|
13726, 14995, 16248, 17484, 18704, 19908, 21097, 22272, 23432, 24578, 25710,
|
26829, 27935, 29028, 30109, 31177, 32234, 33278, 34312, 35334, 36345, 37346,
|
38336, 39315, 40285, 41245, 42195, 43136, 44068, 44990, 45904, 46808, 47704,
|
48592, 49472, 50343, 51207, 52062, 52910, 53751, 54584, 55410, 56228, 57040,
|
57844, 58642, 59433, 60218, 60996, 61768, 62534, 63293, 64047, 64794, 65536
|
};
|
int logprecision = 6;
|
int logfixbit = 16;
|
int logtblbit = 16;
|
int logscalebit = 12;
|
int logfixmul = (1 << logfixbit);
|
long long x8, one = 1;
|
long long gx, n = 0, ix1, ix2, dp;
|
long long lt1, lt2, dx, fx;
|
int i, j = 1;
|
|
x8 = tmpfix + (1 << 8);
|
// find highest bit
|
for (i = 0; i < 32; i++)
|
{
|
if (x8 & j)
|
{
|
n = i;
|
}
|
j = j << 1;
|
}
|
|
gx = x8 - (one << n);
|
gx = gx * (one << logprecision) * logfixmul;
|
gx = gx / (one << n);
|
|
ix1 = gx >> logfixbit;
|
dp = gx - ix1 * logfixmul;
|
|
ix2 = ix1 + 1;
|
|
lt1 = logtablef[ix1];
|
lt2 = logtablef[ix2];
|
|
dx = lt1 * (logfixmul - dp) + lt2 * dp;
|
|
fx = dx + (n - 8) * (one << (logfixbit + logtblbit));
|
fx = fx + (one << (logfixbit + logtblbit - logscalebit - 1));
|
fx = fx >> (logfixbit + logtblbit - logscalebit);
|
|
return fx;
|
}
|
|
ANRresult_t bayernr_fix_tranfer(RKAnr_Bayernr_Params_Select_t* rawnr, RKAnr_Bayernr_Fix_t *pRawnrCfg, float fStrength)
|
{
|
ANRresult_t res = ANR_RET_SUCCESS;
|
int rawbit = 12;//rawBit;
|
float tmp;
|
|
LOGI_ANR("%s:(%d) enter \n", __FUNCTION__, __LINE__);
|
|
if(rawnr == NULL) {
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ANR_RET_NULL_POINTER;
|
}
|
|
if(pRawnrCfg == NULL) {
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ANR_RET_NULL_POINTER;
|
}
|
|
if(fStrength <= 0.0f){
|
fStrength = 0.000001;
|
}
|
|
LOGD_ANR("%s(%d): strength:%f \n", __FUNCTION__, __LINE__, fStrength);
|
|
//(0x0004)
|
pRawnrCfg->gauss_en = rawnr->sw_rawnr_gauss_en;
|
pRawnrCfg->log_bypass = rawnr->log_bypass;
|
|
//(0x0008 - 0x00010)
|
pRawnrCfg->filtpar0 = (unsigned short)(rawnr->filtPar[0] * fStrength * (1 << FIXNLMCALC));
|
pRawnrCfg->filtpar1 = (unsigned short)(rawnr->filtPar[1] * fStrength * (1 << FIXNLMCALC));
|
pRawnrCfg->filtpar2 = (unsigned short)(rawnr->filtPar[2] * fStrength * (1 << FIXNLMCALC));
|
if(pRawnrCfg->filtpar0 > 0x3fff) {
|
pRawnrCfg->filtpar0 = 0x3fff;
|
}
|
if(pRawnrCfg->filtpar1 > 0x3fff) {
|
pRawnrCfg->filtpar1 = 0x3fff;
|
}
|
if(pRawnrCfg->filtpar2 > 0x3fff) {
|
pRawnrCfg->filtpar2 = 0x3fff;
|
}
|
|
//(0x0014 - 0x0001c)
|
pRawnrCfg->dgain0 = (unsigned int)(rawnr->sw_dgain[0] * (1 << FIXNLMCALC));
|
pRawnrCfg->dgain1 = (unsigned int)(rawnr->sw_dgain[1] * (1 << FIXNLMCALC));
|
pRawnrCfg->dgain2 = (unsigned int)(rawnr->sw_dgain[2] * (1 << FIXNLMCALC));
|
if(pRawnrCfg->dgain0 > 0x3ffff) {
|
pRawnrCfg->dgain0 = 0x3ffff;
|
}
|
if(pRawnrCfg->dgain1 > 0x3ffff) {
|
pRawnrCfg->dgain1 = 0x3ffff;
|
}
|
if(pRawnrCfg->dgain2 > 0x3ffff) {
|
pRawnrCfg->dgain2 = 0x3ffff;
|
}
|
|
|
//(0x0020 - 0x0002c)
|
for(int i = 0; i < 8; i++) {
|
pRawnrCfg->luration[i] = (unsigned short)(rawnr->luRatio[i] * (1 << FIXNLMCALC));
|
}
|
|
//(0x0030 - 0x0003c)
|
for(int i = 0; i < 8; i++) {
|
tmp = rawnr->luLevel[i] * ( 1 << (rawbit - 8) );
|
pRawnrCfg->lulevel[i] = bayernr_get_trans((int)tmp);
|
}
|
tmp = (float)((1 << rawbit) - 1);
|
pRawnrCfg->lulevel[8 - 1] = bayernr_get_trans((int)tmp);
|
|
//(0x0040)
|
pRawnrCfg->gauss = rawnr->gausskparsq;
|
|
//(0x0044)
|
pRawnrCfg->sigma = rawnr->sigmaPar;
|
|
|
//(0x0048)
|
pRawnrCfg->pix_diff = rawnr->pix_diff;
|
|
|
//(0x004c)
|
pRawnrCfg->thld_diff = rawnr->thld_diff;
|
|
|
//(0x0050)
|
pRawnrCfg->gas_weig_scl1 = rawnr->bayernr_gauss_weight0 * (1 << 8);
|
pRawnrCfg->gas_weig_scl2 = rawnr->bayernr_gauss_weight1 * (1 << 8);
|
pRawnrCfg->thld_chanelw = rawnr->thld_chanelw;
|
|
|
|
//(0x0054)
|
pRawnrCfg->lamda = rawnr->peaknoisesigma;
|
|
|
//(0x0058 - 0x0005c)
|
tmp = (rawnr->w[0] / fStrength * (1 << FIXNLMCALC));
|
if(tmp > 0x3ff){
|
tmp = 0x3ff;
|
}
|
pRawnrCfg->fixw0 = (unsigned short)tmp;
|
tmp = (rawnr->w[1] / fStrength * (1 << FIXNLMCALC));
|
if(tmp > 0x3ff){
|
tmp = 0x3ff;
|
}
|
pRawnrCfg->fixw1 = (unsigned short)tmp;;
|
tmp = (rawnr->w[2] / fStrength * (1 << FIXNLMCALC));
|
if(tmp > 0x3ff){
|
tmp = 0x3ff;
|
}
|
pRawnrCfg->fixw2 = (unsigned short)tmp;
|
tmp = (rawnr->w[3] / fStrength * (1 << FIXNLMCALC));
|
if(tmp > 0x3ff){
|
tmp = 0x3ff;
|
}
|
pRawnrCfg->fixw3 = (unsigned short)tmp;
|
|
|
//(0x0060 - 0x00068)
|
pRawnrCfg->wlamda0 = (pRawnrCfg->fixw0 * pRawnrCfg->lamda) >> FIXNLMCALC;
|
pRawnrCfg->wlamda1 = (pRawnrCfg->fixw1 * pRawnrCfg->lamda) >> FIXNLMCALC;
|
pRawnrCfg->wlamda2 = (pRawnrCfg->fixw2 * pRawnrCfg->lamda) >> FIXNLMCALC;
|
|
|
//(0x006c)
|
pRawnrCfg->rgain_filp = rawnr->rgain_filp;
|
pRawnrCfg->bgain_filp = rawnr->bgain_filp;
|
|
#if BAYERNR_FIX_VALUE_PRINTF
|
bayernr_fix_printf(pRawnrCfg);
|
#endif
|
|
LOGI_ANR("%s:(%d) exit \n", __FUNCTION__, __LINE__);
|
|
return res;
|
|
}
|
|
ANRresult_t bayernr_fix_printf(RKAnr_Bayernr_Fix_t * pRawnrCfg)
|
{
|
//FILE *fp = fopen("bayernr_regsiter.dat", "wb+");
|
ANRresult_t res = ANR_RET_SUCCESS;
|
|
if(pRawnrCfg == NULL) {
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ANR_RET_NULL_POINTER;
|
}
|
|
LOGD_ANR("%s:(%d) ############# rawnr enter######################## \n", __FUNCTION__, __LINE__);
|
|
//(0x0004)
|
LOGD_ANR("gauss_en:%d log_bypass:%d \n",
|
pRawnrCfg->gauss_en,
|
pRawnrCfg->log_bypass);
|
|
//(0x0008 - 0x00010)
|
LOGD_ANR("filtpar0-2:%d %d %d \n",
|
pRawnrCfg->filtpar0,
|
pRawnrCfg->filtpar1,
|
pRawnrCfg->filtpar2);
|
|
//(0x0014 - 0x0001c)
|
LOGD_ANR("bayernr (0x0014 - 0x0001c)dgain0-2:%d %d %d \n",
|
pRawnrCfg->dgain0,
|
pRawnrCfg->dgain1,
|
pRawnrCfg->dgain2);
|
|
//(0x0020 - 0x0002c)
|
for(int i = 0; i < 8; i++) {
|
LOGD_ANR("luration[%d]:%d \n", i, pRawnrCfg->luration[i]);
|
}
|
|
//(0x0030 - 0x0003c)
|
for(int i = 0; i < 8; i++) {
|
LOGD_ANR("lulevel[%d]:%d \n", i, pRawnrCfg->lulevel[i]);
|
}
|
|
//(0x0040)
|
LOGD_ANR("gauss:%d \n", pRawnrCfg->gauss);
|
|
//(0x0044)
|
LOGD_ANR("sigma:%d \n", pRawnrCfg->sigma);
|
|
//(0x0048)
|
LOGD_ANR("pix_diff:%d \n", pRawnrCfg->pix_diff);
|
|
//(0x004c)
|
LOGD_ANR("thld_diff:%d \n", pRawnrCfg->thld_diff);
|
|
//(0x0050)
|
LOGD_ANR("gas_weig_scl1:%d gas_weig_scl2:%d thld_chanelw:%d \n",
|
pRawnrCfg->gas_weig_scl1,
|
pRawnrCfg->gas_weig_scl2,
|
pRawnrCfg->thld_chanelw);
|
|
//(0x0054)
|
LOGD_ANR("lamda:%d \n", pRawnrCfg->lamda);
|
|
//(0x0058 - 0x0005c)
|
LOGD_ANR("fixw0-3:%d %d %d %d\n",
|
pRawnrCfg->fixw0,
|
pRawnrCfg->fixw1,
|
pRawnrCfg->fixw2,
|
pRawnrCfg->fixw3);
|
|
//(0x0060 - 0x00068)
|
LOGD_ANR("wlamda0-2:%d %d %d \n",
|
pRawnrCfg->wlamda0,
|
pRawnrCfg->wlamda1,
|
pRawnrCfg->wlamda2);
|
|
//(0x006c)
|
LOGD_ANR("rgain_filp:%d bgain_filp:%d \n",
|
pRawnrCfg->rgain_filp,
|
pRawnrCfg->bgain_filp);
|
|
LOGD_ANR("%s:(%d) ############# rawnr exit ######################## \n", __FUNCTION__, __LINE__);
|
LOGD_ANR("%s:(%d) exit \n", __FUNCTION__, __LINE__);
|
|
return res;
|
}
|
|
ANRresult_t bayernr_calibdbV2_assign(CalibDbV2_BayerNrV1_t *pDst, CalibDbV2_BayerNrV1_t *pSrc)
|
{
|
ANRresult_t res = ANR_RET_SUCCESS;
|
CalibDbV2_BayerNrV1_CalibPara_t *pSrcCalibParaV2 = NULL;
|
CalibDbV2_BayerNrV1_TuningPara_t *pSrcTuningParaV2 = NULL;
|
CalibDbV2_BayerNrV1_CalibPara_t *pDstCalibParaV2 = NULL;
|
CalibDbV2_BayerNrV1_TuningPara_t *pDstTuningParaV2 = NULL;
|
int setting_len =0;
|
int iso_len = 0;
|
|
|
if(pDst == NULL) {
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ANR_RET_NULL_POINTER;
|
}
|
|
if(pSrc == NULL) {
|
LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
|
return ANR_RET_NULL_POINTER;
|
}
|
|
bayernr_calibdbV2_free(pDst);
|
|
pSrcCalibParaV2 = &pSrc->CalibPara;
|
pSrcTuningParaV2 = &pSrc->TuningPara;
|
pDstCalibParaV2 = &pDst->CalibPara;
|
pDstTuningParaV2 = &pDst->TuningPara;
|
|
//assign the value
|
pDst->Version = strdup(pSrc->Version);
|
pDstTuningParaV2->enable = pSrcTuningParaV2->enable;
|
|
|
//malloc iso size
|
setting_len = pSrcCalibParaV2->Setting_len;
|
pDstCalibParaV2->Setting = (CalibDbV2_BayerNrV1_CalibPara_Setting_t *)malloc(setting_len * sizeof(CalibDbV2_BayerNrV1_CalibPara_Setting_t));
|
memset(pDstCalibParaV2->Setting, 0x00, setting_len * sizeof(CalibDbV2_BayerNrV1_CalibPara_Setting_t));
|
pDstCalibParaV2->Setting_len = setting_len;
|
|
for(int i=0; i<setting_len; i++){
|
iso_len = pSrcCalibParaV2->Setting[i].Calib_ISO_len;
|
pDstCalibParaV2->Setting[i].Calib_ISO = (CalibDbV2_BayerNrV1_CalibPara_Setting_ISO_t *)malloc(iso_len * sizeof(CalibDbV2_BayerNrV1_CalibPara_Setting_ISO_t));
|
memset(pDstCalibParaV2->Setting[i].Calib_ISO, 0x00, iso_len * sizeof(CalibDbV2_BayerNrV1_CalibPara_Setting_ISO_t));
|
pDstCalibParaV2->Setting[i].Calib_ISO_len = iso_len;
|
}
|
|
for(int i=0; i<setting_len; i++){
|
iso_len = pSrcCalibParaV2->Setting[i].Calib_ISO_len;
|
pDstCalibParaV2->Setting[i].SNR_Mode = strdup(pSrcTuningParaV2->Setting[i].SNR_Mode);
|
pDstCalibParaV2->Setting[i].Sensor_Mode = strdup(pSrcTuningParaV2->Setting[i].Sensor_Mode);
|
|
for(int j=0; j<iso_len; j++){
|
pDstCalibParaV2->Setting[i].Calib_ISO[j] = pSrcCalibParaV2->Setting[i].Calib_ISO[j];
|
}
|
}
|
|
setting_len = pSrcTuningParaV2->Setting_len;
|
pDstTuningParaV2->Setting = (CalibDbV2_BayerNrV1_TuningPara_Setting_t *)malloc(setting_len * sizeof(CalibDbV2_BayerNrV1_TuningPara_Setting_t));
|
memset(pDstTuningParaV2->Setting, 0x00, setting_len * sizeof(CalibDbV2_BayerNrV1_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_BayerNrV1_TuningPara_Setting_ISO_t *)malloc(iso_len * sizeof(CalibDbV2_BayerNrV1_TuningPara_Setting_ISO_t));
|
memset(pDstTuningParaV2->Setting[i].Tuning_ISO, 0x00, iso_len * sizeof(CalibDbV2_BayerNrV1_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];
|
}
|
}
|
|
return res;
|
}
|
|
|
|
void bayernr_calibdbV2_free(CalibDbV2_BayerNrV1_t *pCalibdbV2)
|
{
|
if(pCalibdbV2 != NULL){
|
if(pCalibdbV2->CalibPara.Setting != NULL){
|
for(int i=0; i<pCalibdbV2->CalibPara.Setting_len; i++){
|
if(pCalibdbV2->CalibPara.Setting[i].Calib_ISO != NULL){
|
free(pCalibdbV2->CalibPara.Setting[i].Calib_ISO );
|
}
|
if(pCalibdbV2->CalibPara.Setting[i].Sensor_Mode != NULL){
|
free(pCalibdbV2->CalibPara.Setting[i].Sensor_Mode);
|
}
|
if(pCalibdbV2->CalibPara.Setting[i].SNR_Mode != NULL){
|
free(pCalibdbV2->CalibPara.Setting[i].SNR_Mode);
|
}
|
}
|
free(pCalibdbV2->CalibPara.Setting);
|
}
|
|
if(pCalibdbV2->TuningPara.Setting != NULL){
|
for(int i=0; i<pCalibdbV2->TuningPara.Setting_len; i++){
|
if(pCalibdbV2->TuningPara.Setting[i].Tuning_ISO!= NULL){
|
free(pCalibdbV2->TuningPara.Setting[i].Tuning_ISO );
|
}
|
if(pCalibdbV2->TuningPara.Setting[i].Sensor_Mode != NULL){
|
free(pCalibdbV2->TuningPara.Setting[i].Sensor_Mode);
|
}
|
if(pCalibdbV2->TuningPara.Setting[i].SNR_Mode != NULL){
|
free(pCalibdbV2->TuningPara.Setting[i].SNR_Mode);
|
}
|
}
|
free(pCalibdbV2->TuningPara.Setting);
|
}
|
|
if(pCalibdbV2->Version != NULL){
|
free(pCalibdbV2->Version);
|
}
|
|
}
|
|
}
|
|
|
RKAIQ_END_DECLARE
|