You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
192 lines
8.1 KiB
192 lines
8.1 KiB
#include "rk_aiq_isp39_modules.h"
|
|
|
|
typedef struct Gain_ExpInfo_s {
|
|
int hdr_mode;
|
|
float arTime[3];
|
|
float arAGain[3];
|
|
float arDGain[3];
|
|
int arIso[3];
|
|
float isp_dgain[3];
|
|
int isoLevelLow;
|
|
int isoLevelHig;
|
|
} Gain_ExpInfo_t;
|
|
|
|
uint32_t gain_float_lim2_int(float In, int bit_deci_dst, int type)
|
|
{
|
|
uint8_t *in_u8 = (uint8_t *)&In;
|
|
int exp_val = ((in_u8[3] << 1) & (in_u8[2] >> 7) & 0xff);
|
|
uint32_t dst;
|
|
int shf_bit;
|
|
if (exp_val - 127 <= bit_deci_dst || type == 1)
|
|
{
|
|
shf_bit = bit_deci_dst - (exp_val - 127);
|
|
dst = ROUND_F(In * (1 << bit_deci_dst));
|
|
}
|
|
else
|
|
{
|
|
shf_bit = (exp_val - 127) - bit_deci_dst;
|
|
dst = ROUND_F(In / (1 << bit_deci_dst));
|
|
}
|
|
return dst;
|
|
}
|
|
|
|
#define GAIN_HDR_MERGE_IN_FIX_BITS_DECI 6
|
|
#define GAIN_HDR_MERGE_IN0_FIX_BITS_INTE 8
|
|
#define GAIN_HDR_MERGE_IN1_FIX_BITS_INTE 8
|
|
#define GAIN_HDR_MERGE_IN2_FIX_BITS_INTE 12
|
|
|
|
void rk_aiq_gain20_params_cvt(void* attr, isp_params_t* isp_params, common_cvt_info_t* cvtinfo)
|
|
{
|
|
struct isp3x_gain_cfg* pFix = &isp_params->isp_cfg->others.gain_cfg;
|
|
gain_param_t *gain_param = (gain_param_t *) attr;
|
|
gain_params_dyn_t* pdyn = &gain_param->dyn;
|
|
|
|
Gain_ExpInfo_t stExpInfo;
|
|
memset(&stExpInfo, 0x00, sizeof(Gain_ExpInfo_t));
|
|
RKAiqAecExpInfo_t* curExp = cvtinfo->ae_exp;
|
|
stExpInfo.hdr_mode = cvtinfo->frameNum - 1;
|
|
if (cvtinfo->frameNum == 1) {
|
|
if(curExp->LinearExp.exp_real_params.analog_gain < 1.0) {
|
|
stExpInfo.arAGain[0] = 1.0;
|
|
LOGW_ANR("leanr mode again is wrong, use 1.0 instead\n");
|
|
} else {
|
|
stExpInfo.arAGain[0] = curExp->LinearExp.exp_real_params.analog_gain;
|
|
}
|
|
if(curExp->LinearExp.exp_real_params.digital_gain < 1.0) {
|
|
stExpInfo.arDGain[0] = 1.0;
|
|
LOGW_ANR("leanr mode dgain is wrong, use 1.0 instead\n");
|
|
} else {
|
|
stExpInfo.arDGain[0] = curExp->LinearExp.exp_real_params.digital_gain;
|
|
}
|
|
if(curExp->LinearExp.exp_real_params.isp_dgain < 1.0) {
|
|
stExpInfo.isp_dgain[0] = 1.0;
|
|
LOGW_ANR("leanr mode isp_dgain is wrong, use 1.0 instead\n");
|
|
} else {
|
|
stExpInfo.isp_dgain[0] = curExp->LinearExp.exp_real_params.isp_dgain;
|
|
}
|
|
// stExpInfo.arAGain[0] = 64.0;
|
|
stExpInfo.arTime[0] = curExp->LinearExp.exp_real_params.integration_time;
|
|
stExpInfo.arIso[0] = stExpInfo.arAGain[0] * stExpInfo.arDGain[0] * 50 * stExpInfo.isp_dgain[0];
|
|
}
|
|
else {
|
|
for(int i = 0; i < 3; i++) {
|
|
if(curExp->HdrExp[i].exp_real_params.analog_gain < 1.0) {
|
|
stExpInfo.arAGain[i] = 1.0;
|
|
if (i < cvtinfo->frameNum) {
|
|
LOGW_ANR("hdr mode again is wrong, use 1.0 instead\n");
|
|
}
|
|
} else {
|
|
stExpInfo.arAGain[i] = curExp->HdrExp[i].exp_real_params.analog_gain;
|
|
}
|
|
if(curExp->HdrExp[i].exp_real_params.digital_gain < 1.0) {
|
|
stExpInfo.arDGain[i] = 1.0;
|
|
if (i < cvtinfo->frameNum) {
|
|
LOGW_ANR("hdr mode dgain is wrong, use 1.0 instead\n");
|
|
}
|
|
} else {
|
|
stExpInfo.arDGain[i] = curExp->HdrExp[i].exp_real_params.digital_gain;
|
|
}
|
|
if(curExp->HdrExp[i].exp_real_params.isp_dgain < 1.0) {
|
|
stExpInfo.isp_dgain[i] = 1.0;
|
|
if (i < cvtinfo->frameNum) {
|
|
LOGW_ANR("hdr mode isp_dgain is wrong, use 1.0 instead\n");
|
|
}
|
|
} else {
|
|
stExpInfo.isp_dgain[i] = curExp->HdrExp[i].exp_real_params.isp_dgain;
|
|
}
|
|
stExpInfo.arTime[i] = curExp->HdrExp[i].exp_real_params.integration_time;
|
|
stExpInfo.arIso[i] = stExpInfo.arAGain[i] * stExpInfo.arDGain[i] * 50 * stExpInfo.isp_dgain[i];
|
|
}
|
|
}
|
|
float exp_gain[3];
|
|
float dGain[3];
|
|
float frameiso[3];
|
|
float frameEt[3];
|
|
// frame_gain_in
|
|
float frame_exp_val[3];
|
|
float frame_exp_ratio[3];
|
|
int HDR_frame_num = cvtinfo->frameNum;
|
|
|
|
// get exposure time and gain information (store as float number)
|
|
for (int i = 0; i < 3; ++i)
|
|
{
|
|
exp_gain[i] = stExpInfo.arAGain[i] * stExpInfo.arDGain[i];
|
|
frameEt[i] = stExpInfo.arTime[i];
|
|
frameiso[i] = stExpInfo.arIso[i];
|
|
if (i >= HDR_frame_num)
|
|
{
|
|
exp_gain[i] = stExpInfo.arAGain[HDR_frame_num - 1] * stExpInfo.arDGain[HDR_frame_num - 1];
|
|
frameEt[i] = stExpInfo.arTime[HDR_frame_num - 1];
|
|
frameiso[i] = stExpInfo.arIso[HDR_frame_num - 1];
|
|
}
|
|
frame_exp_val[i] = frameiso[i] * frameEt[i];
|
|
|
|
LOGD_ANR("again: idx:%d gain:%d time:%f HDR_frame_num:%d exp: %f %f %f \n",
|
|
i, stExpInfo.arIso[i], stExpInfo.arTime[i], HDR_frame_num,
|
|
frameiso[i], frameEt[i], frame_exp_val[i]);
|
|
}
|
|
|
|
|
|
// calculate exposure ratio (store as float number)
|
|
for (int i = 0; i < 3; i++)
|
|
{
|
|
frame_exp_ratio[i] = frame_exp_val[HDR_frame_num - 1] / frame_exp_val[i];
|
|
}
|
|
|
|
unsigned int sw_gain[3];
|
|
// calculate the fixed gain number {12i, 6f}
|
|
for (int i = 2; i >= 0; i--)
|
|
{
|
|
uint32_t a = (1 << (GAIN_HDR_MERGE_IN2_FIX_BITS_INTE + GAIN_HDR_MERGE_IN_FIX_BITS_DECI)) - 1;
|
|
dGain[i] = (frame_exp_ratio[i] * exp_gain[i]) / exp_gain[2];
|
|
if (!CHECK_ISP_HW_V20() && !CHECK_ISP_HW_V21() && !CHECK_ISP_HW_V30() ) {
|
|
if(stExpInfo.hdr_mode == 0 && cvtinfo->blc_res.obcPostTnr.sw_blcT_obcPostTnr_en && cvtinfo->preDGain > 1.0) {
|
|
dGain[i] *= cvtinfo->preDGain;
|
|
}
|
|
}
|
|
sw_gain[i] = gain_float_lim2_int(dGain[i], GAIN_HDR_MERGE_IN_FIX_BITS_DECI, 1); // 12:6
|
|
|
|
|
|
if(stExpInfo.hdr_mode == 0) {
|
|
if (i == 0)
|
|
sw_gain[i] = MIN(sw_gain[i], (1 << (GAIN_HDR_MERGE_IN2_FIX_BITS_INTE + GAIN_HDR_MERGE_IN_FIX_BITS_DECI)) - 1);
|
|
else if (i == 1)
|
|
sw_gain[i] = MIN(sw_gain[i], (1 << (GAIN_HDR_MERGE_IN1_FIX_BITS_INTE + GAIN_HDR_MERGE_IN_FIX_BITS_DECI)) - 1);
|
|
else
|
|
sw_gain[i] = MIN(sw_gain[i], (1 << (GAIN_HDR_MERGE_IN0_FIX_BITS_INTE + GAIN_HDR_MERGE_IN_FIX_BITS_DECI)) - 1);
|
|
} else if(stExpInfo.hdr_mode == 1) {
|
|
LOGD_ANR("enter 2fram hdr mode, scale_s:%f\n", pdyn->hdr_gain_scale_s);
|
|
if (i == 0) {
|
|
if(pdyn->hdrgain_ctrl_enable) {
|
|
sw_gain[i] = MIN(sw_gain[i] * pdyn->hdr_gain_scale_s, (1 << (GAIN_HDR_MERGE_IN2_FIX_BITS_INTE + GAIN_HDR_MERGE_IN_FIX_BITS_DECI)) - 1);
|
|
} else {
|
|
sw_gain[i] = MIN(sw_gain[i], (1 << (GAIN_HDR_MERGE_IN2_FIX_BITS_INTE + GAIN_HDR_MERGE_IN_FIX_BITS_DECI)) - 1);
|
|
}
|
|
} else if (i == 1)
|
|
sw_gain[i] = MIN(sw_gain[i], (1 << (GAIN_HDR_MERGE_IN1_FIX_BITS_INTE + GAIN_HDR_MERGE_IN_FIX_BITS_DECI)) - 1);
|
|
else
|
|
sw_gain[i] = MIN(sw_gain[i], (1 << (GAIN_HDR_MERGE_IN0_FIX_BITS_INTE + GAIN_HDR_MERGE_IN_FIX_BITS_DECI)) - 1);
|
|
} else if(stExpInfo.hdr_mode == 2) {
|
|
if (i == 0) {
|
|
if(pdyn->hdrgain_ctrl_enable) {
|
|
sw_gain[i] = MIN(sw_gain[i] * pdyn->hdr_gain_scale_s, (1 << (GAIN_HDR_MERGE_IN2_FIX_BITS_INTE + GAIN_HDR_MERGE_IN_FIX_BITS_DECI)) - 1);
|
|
} else {
|
|
sw_gain[i] = MIN(sw_gain[i], (1 << (GAIN_HDR_MERGE_IN2_FIX_BITS_INTE + GAIN_HDR_MERGE_IN_FIX_BITS_DECI)) - 1);
|
|
}
|
|
} else if (i == 1) {
|
|
if(pdyn->hdrgain_ctrl_enable) {
|
|
sw_gain[i] = MIN(sw_gain[i] * pdyn->hdr_gain_scale_m, (1 << (GAIN_HDR_MERGE_IN1_FIX_BITS_INTE + GAIN_HDR_MERGE_IN_FIX_BITS_DECI)) - 1);
|
|
} else {
|
|
sw_gain[i] = MIN(sw_gain[i], (1 << (GAIN_HDR_MERGE_IN1_FIX_BITS_INTE + GAIN_HDR_MERGE_IN_FIX_BITS_DECI)) - 1);
|
|
}
|
|
} else
|
|
sw_gain[i] = MIN(sw_gain[i], (1 << (GAIN_HDR_MERGE_IN0_FIX_BITS_INTE + GAIN_HDR_MERGE_IN_FIX_BITS_DECI)) - 1);
|
|
}
|
|
}
|
|
pFix->g0 = sw_gain[0];
|
|
pFix->g1 = sw_gain[1];
|
|
pFix->g2 = sw_gain[2];
|
|
|
|
return;
|
|
}
|