/* * RkAiqConfigTranslator.cpp * * Copyright (c) 2019 Rockchip Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #include "isp20/Isp20Evts.h" #include "isp20/Isp20StatsBuffer.h" #include "isp20/rkispp-config.h" #include "RkAiqResourceTranslator.h" namespace RkCam { XCamReturn RkAiqResourceTranslator::translateIspStats (const SmartPtr &from, SmartPtr &to) { XCamReturn ret = XCAM_RETURN_NO_ERROR; const SmartPtr buf = from.dynamic_cast_ptr(); struct rkisp_isp2x_stat_buffer *stats; SmartPtr statsInt = to->data(); SmartPtr expParams = nullptr; rkisp_effect_params_v20 ispParams = {0}; SmartPtr afParams = buf->get_af_params(); SmartPtr irisParams = buf->get_iris_params(); stats = (struct rkisp_isp2x_stat_buffer *)(buf->get_v4l2_userptr()); if(stats == NULL) { LOGE("fail to get stats ,ignore\n"); return XCAM_RETURN_BYPASS; } LOGD_ANALYZER("stats frame_id(%d), meas_type; 0x%x, buf sequence(%d)", stats->frame_id, stats->meas_type, buf->get_sequence()); if (buf->getEffectiveExpParams(stats->frame_id, expParams) < 0) LOGE("fail to get expParams"); if (buf->getEffectiveIspParams(stats->frame_id, ispParams) < 0) { LOGE("fail to get ispParams ,ignore\n"); return XCAM_RETURN_BYPASS; } statsInt->frame_id = stats->frame_id; //ahdr statsInt->atmo_stats_valid = stats->meas_type >> 16 & 1; statsInt->atmo_stats.tmo_stats.ro_hdrtmo_lglow = stats->params.hdrtmo.lglow; statsInt->atmo_stats.tmo_stats.ro_hdrtmo_lgmin = stats->params.hdrtmo.lgmin; statsInt->atmo_stats.tmo_stats.ro_hdrtmo_lghigh = stats->params.hdrtmo.lghigh; statsInt->atmo_stats.tmo_stats.ro_hdrtmo_lgmax = stats->params.hdrtmo.lgmax; statsInt->atmo_stats.tmo_stats.ro_hdrtmo_weightkey = stats->params.hdrtmo.weightkey; statsInt->atmo_stats.tmo_stats.ro_hdrtmo_lgmean = stats->params.hdrtmo.lgmean; statsInt->atmo_stats.tmo_stats.ro_hdrtmo_lgrange0 = stats->params.hdrtmo.lgrange0; statsInt->atmo_stats.tmo_stats.ro_hdrtmo_lgrange1 = stats->params.hdrtmo.lgrange1; statsInt->atmo_stats.tmo_stats.ro_hdrtmo_palpha = stats->params.hdrtmo.palpha; statsInt->atmo_stats.tmo_stats.ro_hdrtmo_lgavgmax = stats->params.hdrtmo.lgavgmax; statsInt->atmo_stats.tmo_stats.ro_hdrtmo_linecnt = stats->params.hdrtmo.linecnt; for(int i = 0; i < 32; i++) statsInt->atmo_stats.tmo_stats.ro_array_min_max[i] = stats->params.hdrtmo.min_max[i]; //dehaze statsInt->adehaze_stats_valid = stats->meas_type >> 17 & 1; statsInt->adehaze_stats.dehaze_stats_v20.dhaz_adp_air_base = stats->params.dhaz.dhaz_adp_air_base; statsInt->adehaze_stats.dehaze_stats_v20.dhaz_adp_wt = stats->params.dhaz.dhaz_adp_wt; statsInt->adehaze_stats.dehaze_stats_v20.dhaz_adp_gratio = stats->params.dhaz.dhaz_adp_gratio; statsInt->adehaze_stats.dehaze_stats_v20.dhaz_adp_wt = stats->params.dhaz.dhaz_adp_wt; for(int i = 0; i < 64; i++) { statsInt->adehaze_stats.dehaze_stats_v20.h_b_iir[i] = stats->params.dhaz.h_b_iir[i]; statsInt->adehaze_stats.dehaze_stats_v20.h_g_iir[i] = stats->params.dhaz.h_g_iir[i]; statsInt->adehaze_stats.dehaze_stats_v20.h_r_iir[i] = stats->params.dhaz.h_r_iir[i]; } //ae statsInt->aec_stats_valid = (stats->meas_type >> 11) & (0x01) ? true : false; /*rawae stats*/ uint8_t AeSwapMode, AeSelMode; AeSwapMode = ispParams.isp_params.meas.rawae0.rawae_sel; AeSelMode = ispParams.isp_params.meas.rawae3.rawae_sel; switch(AeSwapMode) { case AEC_RAWSWAP_MODE_S_LITE: for(int i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) { if(i < ISP2X_RAWAELITE_MEAN_NUM) { statsInt->aec_stats.ae_data.chn[0].rawae_lite.channelr_xy[i] = stats->params.rawae0.data[i].channelr_xy; statsInt->aec_stats.ae_data.chn[0].rawae_lite.channelg_xy[i] = stats->params.rawae0.data[i].channelg_xy; statsInt->aec_stats.ae_data.chn[0].rawae_lite.channelb_xy[i] = stats->params.rawae0.data[i].channelb_xy; } statsInt->aec_stats.ae_data.chn[1].rawae_big.channelr_xy[i] = stats->params.rawae1.data[i].channelr_xy; statsInt->aec_stats.ae_data.chn[1].rawae_big.channelg_xy[i] = stats->params.rawae1.data[i].channelg_xy; statsInt->aec_stats.ae_data.chn[1].rawae_big.channelb_xy[i] = stats->params.rawae1.data[i].channelb_xy; statsInt->aec_stats.ae_data.chn[2].rawae_big.channelr_xy[i] = stats->params.rawae2.data[i].channelr_xy; statsInt->aec_stats.ae_data.chn[2].rawae_big.channelg_xy[i] = stats->params.rawae2.data[i].channelg_xy; statsInt->aec_stats.ae_data.chn[2].rawae_big.channelb_xy[i] = stats->params.rawae2.data[i].channelb_xy; if(i < ISP2X_RAWAEBIG_SUBWIN_NUM) { statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumr[i] = stats->params.rawae1.sumr[i]; statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumg[i] = stats->params.rawae1.sumg[i]; statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumb[i] = stats->params.rawae1.sumb[i]; statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumr[i] = stats->params.rawae2.sumr[i]; statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumg[i] = stats->params.rawae2.sumg[i]; statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumb[i] = stats->params.rawae2.sumb[i]; } } memcpy(statsInt->aec_stats.ae_data.chn[0].rawhist_lite.bins, stats->params.rawhist0.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32)); memcpy(statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins, stats->params.rawhist1.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32)); memcpy(statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins, stats->params.rawhist2.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32)); break; case AEC_RAWSWAP_MODE_M_LITE: for(int i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) { if(i < ISP2X_RAWAELITE_MEAN_NUM) { statsInt->aec_stats.ae_data.chn[1].rawae_lite.channelr_xy[i] = stats->params.rawae0.data[i].channelr_xy; statsInt->aec_stats.ae_data.chn[1].rawae_lite.channelg_xy[i] = stats->params.rawae0.data[i].channelg_xy; statsInt->aec_stats.ae_data.chn[1].rawae_lite.channelb_xy[i] = stats->params.rawae0.data[i].channelb_xy; } statsInt->aec_stats.ae_data.chn[0].rawae_big.channelr_xy[i] = stats->params.rawae1.data[i].channelr_xy; statsInt->aec_stats.ae_data.chn[0].rawae_big.channelg_xy[i] = stats->params.rawae1.data[i].channelg_xy; statsInt->aec_stats.ae_data.chn[0].rawae_big.channelb_xy[i] = stats->params.rawae1.data[i].channelb_xy; statsInt->aec_stats.ae_data.chn[2].rawae_big.channelr_xy[i] = stats->params.rawae2.data[i].channelr_xy; statsInt->aec_stats.ae_data.chn[2].rawae_big.channelg_xy[i] = stats->params.rawae2.data[i].channelg_xy; statsInt->aec_stats.ae_data.chn[2].rawae_big.channelb_xy[i] = stats->params.rawae2.data[i].channelb_xy; if(i < ISP2X_RAWAEBIG_SUBWIN_NUM) { statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumr[i] = stats->params.rawae1.sumr[i]; statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumg[i] = stats->params.rawae1.sumg[i]; statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumb[i] = stats->params.rawae1.sumb[i]; statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumr[i] = stats->params.rawae2.sumr[i]; statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumg[i] = stats->params.rawae2.sumg[i]; statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumb[i] = stats->params.rawae2.sumb[i]; } } memcpy(statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins, stats->params.rawhist1.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32)); memcpy(statsInt->aec_stats.ae_data.chn[1].rawhist_lite.bins, stats->params.rawhist0.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32)); memcpy(statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins, stats->params.rawhist2.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32)); break; case AEC_RAWSWAP_MODE_L_LITE: for(int i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) { if(i < ISP2X_RAWAELITE_MEAN_NUM) { statsInt->aec_stats.ae_data.chn[2].rawae_lite.channelr_xy[i] = stats->params.rawae0.data[i].channelr_xy; statsInt->aec_stats.ae_data.chn[2].rawae_lite.channelg_xy[i] = stats->params.rawae0.data[i].channelg_xy; statsInt->aec_stats.ae_data.chn[2].rawae_lite.channelb_xy[i] = stats->params.rawae0.data[i].channelb_xy; } statsInt->aec_stats.ae_data.chn[0].rawae_big.channelr_xy[i] = stats->params.rawae2.data[i].channelr_xy; statsInt->aec_stats.ae_data.chn[0].rawae_big.channelg_xy[i] = stats->params.rawae2.data[i].channelg_xy; statsInt->aec_stats.ae_data.chn[0].rawae_big.channelb_xy[i] = stats->params.rawae2.data[i].channelb_xy; statsInt->aec_stats.ae_data.chn[1].rawae_big.channelr_xy[i] = stats->params.rawae1.data[i].channelr_xy; statsInt->aec_stats.ae_data.chn[1].rawae_big.channelg_xy[i] = stats->params.rawae1.data[i].channelg_xy; statsInt->aec_stats.ae_data.chn[1].rawae_big.channelb_xy[i] = stats->params.rawae1.data[i].channelb_xy; if(i < ISP2X_RAWAEBIG_SUBWIN_NUM) { statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumr[i] = stats->params.rawae2.sumr[i]; statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumg[i] = stats->params.rawae2.sumg[i]; statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumb[i] = stats->params.rawae2.sumb[i]; statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumr[i] = stats->params.rawae1.sumr[i]; statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumg[i] = stats->params.rawae1.sumg[i]; statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumb[i] = stats->params.rawae1.sumb[i]; } } memcpy(statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins, stats->params.rawhist2.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32)); memcpy(statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins, stats->params.rawhist1.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32)); memcpy(statsInt->aec_stats.ae_data.chn[2].rawhist_lite.bins, stats->params.rawhist0.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32)); break; default: LOGE("wrong AeSwapMode=%d\n", AeSwapMode); return XCAM_RETURN_ERROR_PARAM; break; } switch(AeSelMode) { case AEC_RAWSEL_MODE_CHN_0: for(int i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) { statsInt->aec_stats.ae_data.chn[0].rawae_big.channelr_xy[i] = stats->params.rawae3.data[i].channelr_xy; statsInt->aec_stats.ae_data.chn[0].rawae_big.channelg_xy[i] = stats->params.rawae3.data[i].channelg_xy; statsInt->aec_stats.ae_data.chn[0].rawae_big.channelb_xy[i] = stats->params.rawae3.data[i].channelb_xy; if(i < ISP2X_RAWAEBIG_SUBWIN_NUM) { statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumr[i] = stats->params.rawae3.sumr[i]; statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumg[i] = stats->params.rawae3.sumg[i]; statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumb[i] = stats->params.rawae3.sumb[i]; } } memcpy(statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins, stats->params.rawhist3.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32)); break; case AEC_RAWSEL_MODE_CHN_1: for(int i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) { statsInt->aec_stats.ae_data.chn[1].rawae_big.channelr_xy[i] = stats->params.rawae3.data[i].channelr_xy; statsInt->aec_stats.ae_data.chn[1].rawae_big.channelg_xy[i] = stats->params.rawae3.data[i].channelg_xy; statsInt->aec_stats.ae_data.chn[1].rawae_big.channelb_xy[i] = stats->params.rawae3.data[i].channelb_xy; if(i < ISP2X_RAWAEBIG_SUBWIN_NUM) { statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumr[i] = stats->params.rawae3.sumr[i]; statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumg[i] = stats->params.rawae3.sumg[i]; statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumb[i] = stats->params.rawae3.sumb[i]; } } memcpy(statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins, stats->params.rawhist3.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32)); break; case AEC_RAWSEL_MODE_CHN_2: for(int i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) { statsInt->aec_stats.ae_data.chn[2].rawae_big.channelr_xy[i] = stats->params.rawae3.data[i].channelr_xy; statsInt->aec_stats.ae_data.chn[2].rawae_big.channelg_xy[i] = stats->params.rawae3.data[i].channelg_xy; statsInt->aec_stats.ae_data.chn[2].rawae_big.channelb_xy[i] = stats->params.rawae3.data[i].channelb_xy; if(i < ISP2X_RAWAEBIG_SUBWIN_NUM) { statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumr[i] = stats->params.rawae3.sumr[i]; statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumg[i] = stats->params.rawae3.sumg[i]; statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumb[i] = stats->params.rawae3.sumb[i]; } } memcpy(statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins, stats->params.rawhist3.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32)); break; case AEC_RAWSEL_MODE_TMO: for(int i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) { statsInt->aec_stats.ae_data.extra.rawae_big.channelr_xy[i] = stats->params.rawae3.data[i].channelr_xy; statsInt->aec_stats.ae_data.extra.rawae_big.channelg_xy[i] = stats->params.rawae3.data[i].channelg_xy; statsInt->aec_stats.ae_data.extra.rawae_big.channelb_xy[i] = stats->params.rawae3.data[i].channelb_xy; if(i < ISP2X_RAWAEBIG_SUBWIN_NUM) { statsInt->aec_stats.ae_data.extra.rawae_big.wndx_sumr[i] = stats->params.rawae3.sumr[i]; statsInt->aec_stats.ae_data.extra.rawae_big.wndx_sumg[i] = stats->params.rawae3.sumg[i]; statsInt->aec_stats.ae_data.extra.rawae_big.wndx_sumb[i] = stats->params.rawae3.sumb[i]; } } memcpy(statsInt->aec_stats.ae_data.extra.rawhist_big.bins, stats->params.rawhist3.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32)); break; default: LOGE("wrong AeSelMode=%d\n", AeSelMode); return XCAM_RETURN_ERROR_PARAM; } //yuvae for(int i = 0; i < ISP2X_YUVAE_MEAN_NUM; i++) { statsInt->aec_stats.ae_data.yuvae.mean[i] = stats->params.yuvae.mean[i]; if(i < ISP2X_YUVAE_SUBWIN_NUM) statsInt->aec_stats.ae_data.yuvae.ro_yuvae_sumy[i] = stats->params.yuvae.ro_yuvae_sumy[i]; } memcpy(statsInt->aec_stats.ae_data.sihist.bins, stats->params.sihst.win_stat[0].hist_bins, ISP2X_SIHIST_WIN_NUM * sizeof(u32)); if (expParams.ptr()) { statsInt->aec_stats.ae_exp = expParams->data()->aecExpInfo; /* * printf("%s: L: [0x%x-0x%x], M: [0x%x-0x%x], S: [0x%x-0x%x]\n", * __func__, * expParams->data()->aecExpInfo.HdrExp[2].exp_sensor_params.coarse_integration_time, * expParams->data()->aecExpInfo.HdrExp[2].exp_sensor_params.analog_gain_code_global, * expParams->data()->aecExpInfo.HdrExp[1].exp_sensor_params.coarse_integration_time, * expParams->data()->aecExpInfo.HdrExp[1].exp_sensor_params.analog_gain_code_global, * expParams->data()->aecExpInfo.HdrExp[0].exp_sensor_params.coarse_integration_time, * expParams->data()->aecExpInfo.HdrExp[0].exp_sensor_params.analog_gain_code_global); */ } if (irisParams.ptr()) { float sof_time = (float)irisParams->data()->sofTime / 1000000000.0f; float start_time = (float)irisParams->data()->PIris.StartTim.tv_sec + (float)irisParams->data()->PIris.StartTim.tv_usec / 1000000.0f; float end_time = (float)irisParams->data()->PIris.EndTim.tv_sec + (float)irisParams->data()->PIris.EndTim.tv_usec / 1000000.0f; float frm_intval = 1 / (statsInt->aec_stats.ae_exp.pixel_clock_freq_mhz * 1000000.0f / (float)statsInt->aec_stats.ae_exp.line_length_pixels / (float)statsInt->aec_stats.ae_exp.frame_length_lines); /*printf("%s: step=%d,last-step=%d,start-tim=%f,end-tim=%f,sof_tim=%f\n", __func__, statsInt->aec_stats.ae_exp.Iris.PIris.step, irisParams->data()->PIris.laststep,start_time,end_time,sof_time); */ if(sof_time < end_time + frm_intval) statsInt->aec_stats.ae_exp.Iris.PIris.step = irisParams->data()->PIris.laststep; else statsInt->aec_stats.ae_exp.Iris.PIris.step = irisParams->data()->PIris.step; } //af { statsInt->af_stats_valid = (stats->meas_type >> 6) & (0x01) ? true : false; statsInt->af_stats.roia_luminance = stats->params.rawaf.afm_lum[0]; statsInt->af_stats.roib_sharpness = stats->params.rawaf.afm_sum[1]; statsInt->af_stats.roib_luminance = stats->params.rawaf.afm_lum[1]; memcpy(statsInt->af_stats.global_sharpness, stats->params.rawaf.ramdata, ISP2X_RAWAF_SUMDATA_NUM * sizeof(u32)); statsInt->af_stats.roia_sharpness = 0LL; for (int i = 0; i < ISP2X_RAWAF_SUMDATA_NUM; i++) statsInt->af_stats.roia_sharpness += stats->params.rawaf.ramdata[i]; if(afParams.ptr()) { statsInt->af_stats.focus_endtim = afParams->data()->focusEndTim; statsInt->af_stats.focus_starttim = afParams->data()->focusStartTim; statsInt->af_stats.zoom_endtim = afParams->data()->zoomEndTim; statsInt->af_stats.zoom_starttim = afParams->data()->zoomStartTim; statsInt->af_stats.sof_tim = afParams->data()->sofTime; } } to->set_sequence(stats->frame_id); return ret; } XCamReturn RkAiqResourceTranslator::translateAecStats (const SmartPtr &from, SmartPtr &to) { XCamReturn ret = XCAM_RETURN_NO_ERROR; const SmartPtr buf = from.dynamic_cast_ptr(); struct rkisp_isp2x_stat_buffer *stats; SmartPtr statsInt = to->data(); stats = (struct rkisp_isp2x_stat_buffer *)(buf->get_v4l2_userptr()); if(stats == NULL) { LOGE("fail to get stats ,ignore\n"); return XCAM_RETURN_BYPASS; } LOGD_ANALYZER("stats frame_id(%d), meas_type; 0x%x, buf sequence(%d)", stats->frame_id, stats->meas_type, buf->get_sequence()); SmartPtr irisParams = buf->get_iris_params(); SmartPtr expParams = nullptr; rkisp_effect_params_v20 ispParams = {0}; if (buf->getEffectiveExpParams(stats->frame_id, expParams) < 0) LOGE("fail to get expParams"); if (buf->getEffectiveIspParams(stats->frame_id, ispParams) < 0) { LOGE("fail to get ispParams ,ignore\n"); return XCAM_RETURN_BYPASS; } statsInt->frame_id = stats->frame_id; //ae statsInt->aec_stats_valid = (stats->meas_type >> 11) & (0x01) ? true : false; /*rawae stats*/ uint8_t AeSwapMode, AeSelMode; AeSwapMode = ispParams.isp_params.meas.rawae0.rawae_sel; AeSelMode = ispParams.isp_params.meas.rawae3.rawae_sel; switch(AeSwapMode) { case AEC_RAWSWAP_MODE_S_LITE: for(int i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) { if(i < ISP2X_RAWAELITE_MEAN_NUM) { statsInt->aec_stats.ae_data.chn[0].rawae_lite.channelr_xy[i] = stats->params.rawae0.data[i].channelr_xy; statsInt->aec_stats.ae_data.chn[0].rawae_lite.channelg_xy[i] = stats->params.rawae0.data[i].channelg_xy; statsInt->aec_stats.ae_data.chn[0].rawae_lite.channelb_xy[i] = stats->params.rawae0.data[i].channelb_xy; } statsInt->aec_stats.ae_data.chn[1].rawae_big.channelr_xy[i] = stats->params.rawae1.data[i].channelr_xy; statsInt->aec_stats.ae_data.chn[1].rawae_big.channelg_xy[i] = stats->params.rawae1.data[i].channelg_xy; statsInt->aec_stats.ae_data.chn[1].rawae_big.channelb_xy[i] = stats->params.rawae1.data[i].channelb_xy; statsInt->aec_stats.ae_data.chn[2].rawae_big.channelr_xy[i] = stats->params.rawae2.data[i].channelr_xy; statsInt->aec_stats.ae_data.chn[2].rawae_big.channelg_xy[i] = stats->params.rawae2.data[i].channelg_xy; statsInt->aec_stats.ae_data.chn[2].rawae_big.channelb_xy[i] = stats->params.rawae2.data[i].channelb_xy; if(i < ISP2X_RAWAEBIG_SUBWIN_NUM) { statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumr[i] = stats->params.rawae1.sumr[i]; statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumg[i] = stats->params.rawae1.sumg[i]; statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumb[i] = stats->params.rawae1.sumb[i]; statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumr[i] = stats->params.rawae2.sumr[i]; statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumg[i] = stats->params.rawae2.sumg[i]; statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumb[i] = stats->params.rawae2.sumb[i]; } } memcpy(statsInt->aec_stats.ae_data.chn[0].rawhist_lite.bins, stats->params.rawhist0.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32)); memcpy(statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins, stats->params.rawhist1.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32)); memcpy(statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins, stats->params.rawhist2.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32)); break; case AEC_RAWSWAP_MODE_M_LITE: for(int i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) { if(i < ISP2X_RAWAELITE_MEAN_NUM) { statsInt->aec_stats.ae_data.chn[1].rawae_lite.channelr_xy[i] = stats->params.rawae0.data[i].channelr_xy; statsInt->aec_stats.ae_data.chn[1].rawae_lite.channelg_xy[i] = stats->params.rawae0.data[i].channelg_xy; statsInt->aec_stats.ae_data.chn[1].rawae_lite.channelb_xy[i] = stats->params.rawae0.data[i].channelb_xy; } statsInt->aec_stats.ae_data.chn[0].rawae_big.channelr_xy[i] = stats->params.rawae1.data[i].channelr_xy; statsInt->aec_stats.ae_data.chn[0].rawae_big.channelg_xy[i] = stats->params.rawae1.data[i].channelg_xy; statsInt->aec_stats.ae_data.chn[0].rawae_big.channelb_xy[i] = stats->params.rawae1.data[i].channelb_xy; statsInt->aec_stats.ae_data.chn[2].rawae_big.channelr_xy[i] = stats->params.rawae2.data[i].channelr_xy; statsInt->aec_stats.ae_data.chn[2].rawae_big.channelg_xy[i] = stats->params.rawae2.data[i].channelg_xy; statsInt->aec_stats.ae_data.chn[2].rawae_big.channelb_xy[i] = stats->params.rawae2.data[i].channelb_xy; if(i < ISP2X_RAWAEBIG_SUBWIN_NUM) { statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumr[i] = stats->params.rawae1.sumr[i]; statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumg[i] = stats->params.rawae1.sumg[i]; statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumb[i] = stats->params.rawae1.sumb[i]; statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumr[i] = stats->params.rawae2.sumr[i]; statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumg[i] = stats->params.rawae2.sumg[i]; statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumb[i] = stats->params.rawae2.sumb[i]; } } memcpy(statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins, stats->params.rawhist1.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32)); memcpy(statsInt->aec_stats.ae_data.chn[1].rawhist_lite.bins, stats->params.rawhist0.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32)); memcpy(statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins, stats->params.rawhist2.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32)); break; case AEC_RAWSWAP_MODE_L_LITE: for(int i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) { if(i < ISP2X_RAWAELITE_MEAN_NUM) { statsInt->aec_stats.ae_data.chn[2].rawae_lite.channelr_xy[i] = stats->params.rawae0.data[i].channelr_xy; statsInt->aec_stats.ae_data.chn[2].rawae_lite.channelg_xy[i] = stats->params.rawae0.data[i].channelg_xy; statsInt->aec_stats.ae_data.chn[2].rawae_lite.channelb_xy[i] = stats->params.rawae0.data[i].channelb_xy; } statsInt->aec_stats.ae_data.chn[0].rawae_big.channelr_xy[i] = stats->params.rawae2.data[i].channelr_xy; statsInt->aec_stats.ae_data.chn[0].rawae_big.channelg_xy[i] = stats->params.rawae2.data[i].channelg_xy; statsInt->aec_stats.ae_data.chn[0].rawae_big.channelb_xy[i] = stats->params.rawae2.data[i].channelb_xy; statsInt->aec_stats.ae_data.chn[1].rawae_big.channelr_xy[i] = stats->params.rawae1.data[i].channelr_xy; statsInt->aec_stats.ae_data.chn[1].rawae_big.channelg_xy[i] = stats->params.rawae1.data[i].channelg_xy; statsInt->aec_stats.ae_data.chn[1].rawae_big.channelb_xy[i] = stats->params.rawae1.data[i].channelb_xy; if(i < ISP2X_RAWAEBIG_SUBWIN_NUM) { statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumr[i] = stats->params.rawae2.sumr[i]; statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumg[i] = stats->params.rawae2.sumg[i]; statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumb[i] = stats->params.rawae2.sumb[i]; statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumr[i] = stats->params.rawae1.sumr[i]; statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumg[i] = stats->params.rawae1.sumg[i]; statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumb[i] = stats->params.rawae1.sumb[i]; } } memcpy(statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins, stats->params.rawhist2.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32)); memcpy(statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins, stats->params.rawhist1.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32)); memcpy(statsInt->aec_stats.ae_data.chn[2].rawhist_lite.bins, stats->params.rawhist0.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32)); break; default: LOGE("wrong AeSwapMode=%d\n", AeSwapMode); return XCAM_RETURN_ERROR_PARAM; break; } switch(AeSelMode) { case AEC_RAWSEL_MODE_CHN_0: for(int i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) { statsInt->aec_stats.ae_data.chn[0].rawae_big.channelr_xy[i] = stats->params.rawae3.data[i].channelr_xy; statsInt->aec_stats.ae_data.chn[0].rawae_big.channelg_xy[i] = stats->params.rawae3.data[i].channelg_xy; statsInt->aec_stats.ae_data.chn[0].rawae_big.channelb_xy[i] = stats->params.rawae3.data[i].channelb_xy; if(i < ISP2X_RAWAEBIG_SUBWIN_NUM) { statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumr[i] = stats->params.rawae3.sumr[i]; statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumg[i] = stats->params.rawae3.sumg[i]; statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumb[i] = stats->params.rawae3.sumb[i]; } } memcpy(statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins, stats->params.rawhist3.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32)); break; case AEC_RAWSEL_MODE_CHN_1: for(int i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) { statsInt->aec_stats.ae_data.chn[1].rawae_big.channelr_xy[i] = stats->params.rawae3.data[i].channelr_xy; statsInt->aec_stats.ae_data.chn[1].rawae_big.channelg_xy[i] = stats->params.rawae3.data[i].channelg_xy; statsInt->aec_stats.ae_data.chn[1].rawae_big.channelb_xy[i] = stats->params.rawae3.data[i].channelb_xy; if(i < ISP2X_RAWAEBIG_SUBWIN_NUM) { statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumr[i] = stats->params.rawae3.sumr[i]; statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumg[i] = stats->params.rawae3.sumg[i]; statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumb[i] = stats->params.rawae3.sumb[i]; } } memcpy(statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins, stats->params.rawhist3.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32)); break; case AEC_RAWSEL_MODE_CHN_2: for(int i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) { statsInt->aec_stats.ae_data.chn[2].rawae_big.channelr_xy[i] = stats->params.rawae3.data[i].channelr_xy; statsInt->aec_stats.ae_data.chn[2].rawae_big.channelg_xy[i] = stats->params.rawae3.data[i].channelg_xy; statsInt->aec_stats.ae_data.chn[2].rawae_big.channelb_xy[i] = stats->params.rawae3.data[i].channelb_xy; if(i < ISP2X_RAWAEBIG_SUBWIN_NUM) { statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumr[i] = stats->params.rawae3.sumr[i]; statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumg[i] = stats->params.rawae3.sumg[i]; statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumb[i] = stats->params.rawae3.sumb[i]; } } memcpy(statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins, stats->params.rawhist3.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32)); break; case AEC_RAWSEL_MODE_TMO: for(int i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) { statsInt->aec_stats.ae_data.extra.rawae_big.channelr_xy[i] = stats->params.rawae3.data[i].channelr_xy; statsInt->aec_stats.ae_data.extra.rawae_big.channelg_xy[i] = stats->params.rawae3.data[i].channelg_xy; statsInt->aec_stats.ae_data.extra.rawae_big.channelb_xy[i] = stats->params.rawae3.data[i].channelb_xy; if(i < ISP2X_RAWAEBIG_SUBWIN_NUM) { statsInt->aec_stats.ae_data.extra.rawae_big.wndx_sumr[i] = stats->params.rawae3.sumr[i]; statsInt->aec_stats.ae_data.extra.rawae_big.wndx_sumg[i] = stats->params.rawae3.sumg[i]; statsInt->aec_stats.ae_data.extra.rawae_big.wndx_sumb[i] = stats->params.rawae3.sumb[i]; } } memcpy(statsInt->aec_stats.ae_data.extra.rawhist_big.bins, stats->params.rawhist3.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32)); break; default: LOGE("wrong AeSelMode=%d\n", AeSelMode); return XCAM_RETURN_ERROR_PARAM; } //yuvae for(int i = 0; i < ISP2X_YUVAE_MEAN_NUM; i++) { statsInt->aec_stats.ae_data.yuvae.mean[i] = stats->params.yuvae.mean[i]; if(i < ISP2X_YUVAE_SUBWIN_NUM) statsInt->aec_stats.ae_data.yuvae.ro_yuvae_sumy[i] = stats->params.yuvae.ro_yuvae_sumy[i]; } memcpy(statsInt->aec_stats.ae_data.sihist.bins, stats->params.sihst.win_stat[0].hist_bins, ISP2X_SIHIST_WIN_NUM * sizeof(u32)); if (expParams.ptr()) { statsInt->aec_stats.ae_exp = expParams->data()->aecExpInfo; /* * printf("%s: L: [0x%x-0x%x], M: [0x%x-0x%x], S: [0x%x-0x%x]\n", * __func__, * expParams->data()->aecExpInfo.HdrExp[2].exp_sensor_params.coarse_integration_time, * expParams->data()->aecExpInfo.HdrExp[2].exp_sensor_params.analog_gain_code_global, * expParams->data()->aecExpInfo.HdrExp[1].exp_sensor_params.coarse_integration_time, * expParams->data()->aecExpInfo.HdrExp[1].exp_sensor_params.analog_gain_code_global, * expParams->data()->aecExpInfo.HdrExp[0].exp_sensor_params.coarse_integration_time, * expParams->data()->aecExpInfo.HdrExp[0].exp_sensor_params.analog_gain_code_global); */ } if (irisParams.ptr()) { float sof_time = (float)irisParams->data()->sofTime / 1000000000.0f; float start_time = (float)irisParams->data()->PIris.StartTim.tv_sec + (float)irisParams->data()->PIris.StartTim.tv_usec / 1000000.0f; float end_time = (float)irisParams->data()->PIris.EndTim.tv_sec + (float)irisParams->data()->PIris.EndTim.tv_usec / 1000000.0f; float frm_intval = 1 / (statsInt->aec_stats.ae_exp.pixel_clock_freq_mhz * 1000000.0f / (float)statsInt->aec_stats.ae_exp.line_length_pixels / (float)statsInt->aec_stats.ae_exp.frame_length_lines); /*printf("%s: step=%d,last-step=%d,start-tim=%f,end-tim=%f,sof_tim=%f\n", __func__, statsInt->aec_stats.ae_exp.Iris.PIris.step, irisParams->data()->PIris.laststep,start_time,end_time,sof_time); */ if(sof_time < end_time + frm_intval) statsInt->aec_stats.ae_exp.Iris.PIris.step = irisParams->data()->PIris.laststep; else statsInt->aec_stats.ae_exp.Iris.PIris.step = irisParams->data()->PIris.step; } to->set_sequence(stats->frame_id); return ret; } XCamReturn RkAiqResourceTranslator::translateAwbStats (const SmartPtr &from, SmartPtr &to) { XCamReturn ret = XCAM_RETURN_NO_ERROR; const SmartPtr buf = from.dynamic_cast_ptr(); struct rkisp_isp2x_stat_buffer *stats; SmartPtr statsInt = to->data(); stats = (struct rkisp_isp2x_stat_buffer *)(buf->get_v4l2_userptr()); if(stats == NULL) { LOGE("fail to get stats ,ignore\n"); return XCAM_RETURN_BYPASS; } LOGD_ANALYZER("stats frame_id(%d), meas_type; 0x%x, buf sequence(%d)", stats->frame_id, stats->meas_type, buf->get_sequence()); statsInt->awb_stats_valid = stats->meas_type >> 5 & 1; if (!statsInt->awb_stats_valid) { LOGE_ANALYZER("AWB stats invalid, ignore"); return XCAM_RETURN_BYPASS; } rkisp_effect_params_v20 ispParams = {0}; if (buf->getEffectiveIspParams(stats->frame_id, ispParams) < 0) { LOGE("fail to get ispParams ,ignore\n"); return XCAM_RETURN_BYPASS; } statsInt->frame_id = stats->frame_id; //awb2.0 statsInt->awb_stats.awb_cfg_effect_v200 = ispParams.awb_cfg; statsInt->awb_cfg_effect_valid = true; for(int i = 0; i < statsInt->awb_stats.awb_cfg_effect_v200.lightNum; i++) { statsInt->awb_stats.light[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V200].Rvalue = stats->params.rawawb.ro_rawawb_sum_r_nor[i]; statsInt->awb_stats.light[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V200].Gvalue = stats->params.rawawb.ro_rawawb_sum_g_nor[i]; statsInt->awb_stats.light[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V200].Bvalue = stats->params.rawawb.ro_rawawb_sum_b_nor[i]; statsInt->awb_stats.light[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V200].WpNo = stats->params.rawawb.ro_rawawb_wp_num_nor[i]; statsInt->awb_stats.light[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V200].Rvalue = stats->params.rawawb.ro_rawawb_sum_r_big[i]; statsInt->awb_stats.light[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V200].Gvalue = stats->params.rawawb.ro_rawawb_sum_g_big[i]; statsInt->awb_stats.light[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V200].Bvalue = stats->params.rawawb.ro_rawawb_sum_b_big[i]; statsInt->awb_stats.light[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V200].WpNo = stats->params.rawawb.ro_rawawb_wp_num_big[i]; statsInt->awb_stats.light[i].xYType[RK_AIQ_AWB_XY_TYPE_SMALL_V200].Rvalue = stats->params.rawawb.ro_rawawb_sum_r_sma[i]; statsInt->awb_stats.light[i].xYType[RK_AIQ_AWB_XY_TYPE_SMALL_V200].Gvalue = stats->params.rawawb.ro_rawawb_sum_g_sma[i]; statsInt->awb_stats.light[i].xYType[RK_AIQ_AWB_XY_TYPE_SMALL_V200].Bvalue = stats->params.rawawb.ro_rawawb_sum_b_sma[i]; statsInt->awb_stats.light[i].xYType[RK_AIQ_AWB_XY_TYPE_SMALL_V200].WpNo = stats->params.rawawb.ro_rawawb_wp_num_sma[i]; } for(int i = 0; i < statsInt->awb_stats.awb_cfg_effect_v200.lightNum; i++) { statsInt->awb_stats.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V200].Rvalue = stats->params.rawawb.ro_sum_r_nor_multiwindow[i]; statsInt->awb_stats.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V200].Gvalue = stats->params.rawawb.ro_sum_g_nor_multiwindow[i]; statsInt->awb_stats.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V200].Bvalue = stats->params.rawawb.ro_sum_b_nor_multiwindow[i]; statsInt->awb_stats.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V200].WpNo = stats->params.rawawb.ro_wp_nm_nor_multiwindow[i]; statsInt->awb_stats.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V200].Rvalue = stats->params.rawawb.ro_sum_r_big_multiwindow[i]; statsInt->awb_stats.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V200].Gvalue = stats->params.rawawb.ro_sum_g_big_multiwindow[i]; statsInt->awb_stats.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V200].Bvalue = stats->params.rawawb.ro_sum_b_big_multiwindow[i]; statsInt->awb_stats.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V200].WpNo = stats->params.rawawb.ro_wp_nm_big_multiwindow[i]; statsInt->awb_stats.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_SMALL_V200].Rvalue = stats->params.rawawb.ro_sum_r_sma_multiwindow[i]; statsInt->awb_stats.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_SMALL_V200].Gvalue = stats->params.rawawb.ro_sum_g_sma_multiwindow[i]; statsInt->awb_stats.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_SMALL_V200].Bvalue = stats->params.rawawb.ro_sum_b_sma_multiwindow[i]; statsInt->awb_stats.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_SMALL_V200].WpNo = stats->params.rawawb.ro_wp_nm_sma_multiwindow[i]; } for(int i = 0; i < RK_AIQ_AWB_STAT_WP_RANGE_NUM_V200; i++) { statsInt->awb_stats.excWpRangeResult[i].Rvalue = stats->params.rawawb.ro_sum_r_exc[i]; statsInt->awb_stats.excWpRangeResult[i].Gvalue = stats->params.rawawb.ro_sum_g_exc[i]; statsInt->awb_stats.excWpRangeResult[i].Bvalue = stats->params.rawawb.ro_sum_b_exc[i]; statsInt->awb_stats.excWpRangeResult[i].WpNo = stats->params.rawawb.ro_wp_nm_exc[i]; } for(int i = 0; i < RK_AIQ_AWB_GRID_NUM_TOTAL; i++) { statsInt->awb_stats.blockResult[i].Rvalue = stats->params.rawawb.ramdata[i].r; statsInt->awb_stats.blockResult[i].Gvalue = stats->params.rawawb.ramdata[i].g; statsInt->awb_stats.blockResult[i].Bvalue = stats->params.rawawb.ramdata[i].b; statsInt->awb_stats.blockResult[i].isWP[2] = stats->params.rawawb.ramdata[i].wp & 0x1; statsInt->awb_stats.blockResult[i].isWP[1] = (stats->params.rawawb.ramdata[i].wp >> 1) & 0x1; statsInt->awb_stats.blockResult[i].isWP[0] = (stats->params.rawawb.ramdata[i].wp >> 2) & 0x1; } //statsInt->awb_stats_valid = ISP2X_STAT_RAWAWB(stats->meas_type)? true:false; statsInt->awb_stats_valid = stats->meas_type >> 5 & 1; to->set_sequence(stats->frame_id); return ret; } XCamReturn RkAiqResourceTranslator::translateAtmoStats (const SmartPtr &from, SmartPtr &to) { XCamReturn ret = XCAM_RETURN_NO_ERROR; const SmartPtr buf = from.dynamic_cast_ptr(); struct rkisp_isp2x_stat_buffer *stats; SmartPtr statsInt = to->data(); stats = (struct rkisp_isp2x_stat_buffer *)(buf->get_v4l2_userptr()); if(stats == NULL) { LOGE("fail to get stats ,ignore\n"); return XCAM_RETURN_BYPASS; } LOGD_ANALYZER("stats frame_id(%d), meas_type; 0x%x, buf sequence(%d)", stats->frame_id, stats->meas_type, buf->get_sequence()); statsInt->frame_id = stats->frame_id; //ahdr statsInt->atmo_stats_valid = stats->meas_type >> 16 & 1; statsInt->atmo_stats.tmo_stats.ro_hdrtmo_lglow = stats->params.hdrtmo.lglow; statsInt->atmo_stats.tmo_stats.ro_hdrtmo_lgmin = stats->params.hdrtmo.lgmin; statsInt->atmo_stats.tmo_stats.ro_hdrtmo_lghigh = stats->params.hdrtmo.lghigh; statsInt->atmo_stats.tmo_stats.ro_hdrtmo_lgmax = stats->params.hdrtmo.lgmax; statsInt->atmo_stats.tmo_stats.ro_hdrtmo_weightkey = stats->params.hdrtmo.weightkey; statsInt->atmo_stats.tmo_stats.ro_hdrtmo_lgmean = stats->params.hdrtmo.lgmean; statsInt->atmo_stats.tmo_stats.ro_hdrtmo_lgrange0 = stats->params.hdrtmo.lgrange0; statsInt->atmo_stats.tmo_stats.ro_hdrtmo_lgrange1 = stats->params.hdrtmo.lgrange1; statsInt->atmo_stats.tmo_stats.ro_hdrtmo_palpha = stats->params.hdrtmo.palpha; statsInt->atmo_stats.tmo_stats.ro_hdrtmo_lgavgmax = stats->params.hdrtmo.lgavgmax; statsInt->atmo_stats.tmo_stats.ro_hdrtmo_linecnt = stats->params.hdrtmo.linecnt; for(int i = 0; i < 32; i++) statsInt->atmo_stats.tmo_stats.ro_array_min_max[i] = stats->params.hdrtmo.min_max[i]; to->set_sequence(stats->frame_id); return ret; } XCamReturn RkAiqResourceTranslator::translateAdehazeStats (const SmartPtr &from, SmartPtr &to) { XCamReturn ret = XCAM_RETURN_NO_ERROR; const SmartPtr buf = from.dynamic_cast_ptr(); struct rkisp_isp2x_stat_buffer *stats; SmartPtr statsInt = to->data(); stats = (struct rkisp_isp2x_stat_buffer *)(buf->get_v4l2_userptr()); if(stats == NULL) { LOGE("fail to get stats ,ignore\n"); return XCAM_RETURN_BYPASS; } LOGD_ANALYZER("stats frame_id(%d), meas_type; 0x%x, buf sequence(%d)", stats->frame_id, stats->meas_type, buf->get_sequence()); statsInt->frame_id = stats->frame_id; //dehaze statsInt->adehaze_stats_valid = stats->meas_type >> 17 & 1; statsInt->adehaze_stats.dehaze_stats_v20.dhaz_adp_air_base = stats->params.dhaz.dhaz_adp_air_base; statsInt->adehaze_stats.dehaze_stats_v20.dhaz_adp_wt = stats->params.dhaz.dhaz_adp_wt; statsInt->adehaze_stats.dehaze_stats_v20.dhaz_adp_gratio = stats->params.dhaz.dhaz_adp_gratio; statsInt->adehaze_stats.dehaze_stats_v20.dhaz_adp_wt = stats->params.dhaz.dhaz_adp_wt; for(int i = 0; i < 64; i++) { statsInt->adehaze_stats.dehaze_stats_v20.h_b_iir[i] = stats->params.dhaz.h_b_iir[i]; statsInt->adehaze_stats.dehaze_stats_v20.h_g_iir[i] = stats->params.dhaz.h_g_iir[i]; statsInt->adehaze_stats.dehaze_stats_v20.h_r_iir[i] = stats->params.dhaz.h_r_iir[i]; } to->set_sequence(stats->frame_id); return ret; } XCamReturn RkAiqResourceTranslator::translateAfStats (const SmartPtr &from, SmartPtr &to) { XCamReturn ret = XCAM_RETURN_NO_ERROR; const SmartPtr buf = from.dynamic_cast_ptr(); struct rkisp_isp2x_stat_buffer *stats; SmartPtr statsInt = to->data(); stats = (struct rkisp_isp2x_stat_buffer *)(buf->get_v4l2_userptr()); if(stats == NULL) { LOGE("fail to get stats ,ignore\n"); return XCAM_RETURN_BYPASS; } LOGD_ANALYZER("stats frame_id(%d), meas_type; 0x%x, buf sequence(%d)", stats->frame_id, stats->meas_type, buf->get_sequence()); SmartPtr afParams = buf->get_af_params(); statsInt->frame_id = stats->frame_id; //af { statsInt->af_stats_valid = (stats->meas_type >> 6) & (0x01) ? true : false; statsInt->af_stats.roia_luminance = stats->params.rawaf.afm_lum[0]; statsInt->af_stats.roib_sharpness = stats->params.rawaf.afm_sum[1]; statsInt->af_stats.roib_luminance = stats->params.rawaf.afm_lum[1]; memcpy(statsInt->af_stats.global_sharpness, stats->params.rawaf.ramdata, ISP2X_RAWAF_SUMDATA_NUM * sizeof(u32)); statsInt->af_stats.roia_sharpness = 0LL; for (int i = 0; i < ISP2X_RAWAF_SUMDATA_NUM; i++) statsInt->af_stats.roia_sharpness += stats->params.rawaf.ramdata[i]; if(afParams.ptr()) { statsInt->af_stats.focus_endtim = afParams->data()->focusEndTim; statsInt->af_stats.focus_starttim = afParams->data()->focusStartTim; statsInt->af_stats.zoom_endtim = afParams->data()->zoomEndTim; statsInt->af_stats.zoom_starttim = afParams->data()->zoomStartTim; statsInt->af_stats.sof_tim = afParams->data()->sofTime; } } to->set_sequence(stats->frame_id); return ret; } XCamReturn RkAiqResourceTranslator::translateOrbStats (const SmartPtr &from, SmartPtr &to) { XCamReturn ret = XCAM_RETURN_NO_ERROR; const SmartPtr nr_stats_buf = from.dynamic_cast_ptr(); SmartPtr statsInt = to->data(); struct rkispp_stats_nrbuf *stats = NULL; stats = (struct rkispp_stats_nrbuf *)(nr_stats_buf->get_v4l2_userptr()); // orbStats->data()->valid = true;//(stats->meas_type >> 4) & (0x01) ? true : false; statsInt->orb_stats.frame_id = stats->frame_id; statsInt->orb_stats.num_points = stats->total_num; if (stats->total_num > 0 && stats->total_num <= ORB_DATA_NUM) memcpy(statsInt->orb_stats.points, stats->data, stats->total_num*sizeof(stats->data[0])); to->set_sequence(stats->frame_id); return ret; } } //namespace RkCam