1 #include "rk_aiq_anr_algo_gain.h"
2
3
4 typedef double FLOAT_GAIN;
5
FLOAT_LIM2_INT(float In,int bit_deci_dst,int type=0)6 uint32_t FLOAT_LIM2_INT(float In, int bit_deci_dst, int type = 0)
7 {
8 // would trigger strict-aliasing compile warning on -Os level
9 //int exp_val = (((uint32_t*)(&In))[0] >> 23) & 0xff;
10 uint8_t *in_u8 = reinterpret_cast<uint8_t *>(&In);
11 int exp_val = ((in_u8[3] << 1) & (in_u8[2] >> 7) & 0xff);
12
13 uint32_t dst;
14 int shf_bit;
15 if(exp_val - 127 <= bit_deci_dst || type == 1)
16 {
17 shf_bit = bit_deci_dst - (exp_val - 127);
18 dst = ROUND_F(In * (1 << bit_deci_dst));
19 }
20 else
21 {
22 shf_bit = (exp_val - 127) - bit_deci_dst;
23 dst = ROUND_F(In / (1 << bit_deci_dst));
24 }
25 return dst;
26 }
27
28 template<typename T>
FLOAT_FIX(T In,int bit_inte_dst,int bit_deci_dst)29 T FLOAT_FIX(T In, int bit_inte_dst, int bit_deci_dst)
30 {
31 uint32_t tmp;
32 T out;
33
34 tmp = ROUND_F(In * (1 << bit_deci_dst));
35 out = ((FLOAT_GAIN)tmp) / (1 << bit_deci_dst);
36 return out;
37
38 }
39
40
gain_find_data_bits(int data)41 int gain_find_data_bits(int data)
42 {
43 int i, j = 1;
44 int bits = 0;
45
46 for(i = 0; i < 32; i++)
47 {
48 if(data & j)
49 {
50 bits = i + 1;
51 }
52 j = j << 1;
53 }
54
55 return bits;
56 }
57
gain_fix_transfer(RKAnr_Mfnr_Params_Select_t * pMfnrSelect,RKAnr_Gain_Fix_t * pGainFix,ANRExpInfo_t * pExpInfo,float gain_ratio)58 ANRresult_t gain_fix_transfer(RKAnr_Mfnr_Params_Select_t *pMfnrSelect, RKAnr_Gain_Fix_t* pGainFix, ANRExpInfo_t *pExpInfo, float gain_ratio)
59 {
60 int i;
61 double max_val = 0;
62 uint16_t sigma_bits_max;
63 uint16_t sigma_bits_act = GAIN_SIGMA_BITS_ACT;
64 double noise_sigma_dehaze[MAX_INTEPORATATION_LUMAPOINT];
65 unsigned short noise_sigma_dehaze_x[MAX_INTEPORATATION_LUMAPOINT];
66
67
68 LOGI_ANR("%s:(%d) oyyf bayerner xml config start\n", __FUNCTION__, __LINE__);
69 if(pMfnrSelect == NULL) {
70 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
71 return ANR_RET_NULL_POINTER;
72 }
73
74 if(pGainFix == NULL) {
75 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
76 return ANR_RET_NULL_POINTER;
77 }
78
79 if(pExpInfo == NULL) {
80 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
81 return ANR_RET_NULL_POINTER;
82 }
83
84 //pGainFix->gain_table_en = 1;
85 memcpy(noise_sigma_dehaze, pMfnrSelect->noise_sigma_dehaze, sizeof(pMfnrSelect->noise_sigma_dehaze));
86
87 for(i = 0; i < MAX_INTEPORATATION_LUMAPOINT - 2; i++) {
88 pGainFix->idx[i] = pMfnrSelect->fix_x_pos_dehaze[i + 1];
89 if(pGainFix->idx[i] > 255) {
90 pGainFix->idx[i] = 255;
91 }
92 LOGD_ANR("%s:%d sigma x: %d\n", __FUNCTION__, __LINE__, pGainFix->idx[i]);
93 }
94
95 for(i = 0; i < MAX_INTEPORATATION_LUMAPOINT; i++) {
96 if(max_val < pMfnrSelect->noise_sigma_dehaze[i])
97 max_val = pMfnrSelect->noise_sigma_dehaze[i];
98 }
99 sigma_bits_max = gain_find_data_bits((int)max_val);//CEIL(log((FLOAT_GAIN)max_val) / log((float)2));
100
101 for(i = 0; i < MAX_INTEPORATATION_LUMAPOINT; i++) {
102 noise_sigma_dehaze[i] = FLOAT_FIX(pMfnrSelect->noise_sigma_dehaze[i], sigma_bits_max, sigma_bits_act - sigma_bits_max);
103 }
104
105 for(int i = 0; i < MAX_INTEPORATATION_LUMAPOINT; i++)
106 {
107 pGainFix->lut[i] = FLOAT_LIM2_INT((float)noise_sigma_dehaze[i], sigma_bits_act - sigma_bits_max);
108 }
109
110
111 #if 1
112 pGainFix->dhaz_en = 1;
113 pGainFix->wdr_en = 0;
114 pGainFix->tmo_en = 1;
115 pGainFix->lsc_en = 1;
116 pGainFix->mge_en = 1;
117 #endif
118
119
120 int hdr_frameNum = pExpInfo->hdr_mode + 1;
121 if(hdr_frameNum > 1)
122 {
123 float frameiso[3];
124 float frameEt[3];
125 float frame_exp_val[3];
126 float frame_exp_ratio[3];
127 float dGain[3];
128
129 for (int i = 0; i < hdr_frameNum; i++) {
130 frameiso[i] = pExpInfo->arAGain[i];
131 frameEt[i] = pExpInfo->arTime[i];
132 LOGD_ANR("%s:%d idx:%d gain:%f time:%f exp:%f\n",
133 __FUNCTION__, __LINE__, i,
134 pExpInfo->arAGain[i], pExpInfo->arTime[i],
135 pExpInfo->arAGain[i] * pExpInfo->arTime[i]);
136 }
137
138 for (int i = 0; i < 3; i++) {
139 if(i >= hdr_frameNum) {
140 frame_exp_val[i] = frame_exp_val[hdr_frameNum - 1];
141 frameiso[i] = frameiso[hdr_frameNum - 1];
142 } else {
143 frame_exp_val[i] = frameiso[i] * frameEt[i];
144 frameiso[i] = frameiso[i] * 50;
145 }
146 }
147
148 for (int i = 0; i < 3; i++) {
149 frame_exp_ratio[i] = frame_exp_val[hdr_frameNum - 1] / frame_exp_val[i];
150 }
151
152 for (int i = 2; i >= 0; i--) {
153 dGain[i] = (frame_exp_ratio[i] * pExpInfo->arAGain[i] * pExpInfo->arDGain[i]);
154 LOGD_ANR("%s:%d idx:%d ratio:%f dgain %f\n",
155 __FUNCTION__, __LINE__, i,
156 frame_exp_ratio[i], dGain[i]);
157 pGainFix->mge_gain[i] = FLOAT_LIM2_INT(dGain[i] * gain_ratio, GAIN_HDR_MERGE_IN_FIX_BITS_DECI, 1); // 12:6
158 if(i == 0)
159 pGainFix->mge_gain[i] = MIN(pGainFix->mge_gain[i], (1 << (GAIN_HDR_MERGE_IN2_FIX_BITS_INTE + GAIN_HDR_MERGE_IN_FIX_BITS_DECI)) - 1);
160 else
161 pGainFix->mge_gain[i] = MIN(pGainFix->mge_gain[i], (1 << (GAIN_HDR_MERGE_IN0_FIX_BITS_INTE + GAIN_HDR_MERGE_IN_FIX_BITS_DECI)) - 1);
162 }
163 }
164 else
165 {
166 pGainFix->mge_gain[0] = FLOAT_LIM2_INT(pExpInfo->arAGain[0] * pExpInfo->arDGain[0] * gain_ratio, GAIN_HDR_MERGE_IN_FIX_BITS_DECI, 1); // 12:6
167 pGainFix->mge_gain[1] = FLOAT_LIM2_INT(pExpInfo->arAGain[0] * pExpInfo->arDGain[0] * gain_ratio, GAIN_HDR_MERGE_IN_FIX_BITS_DECI, 1); // 12:6
168 pGainFix->mge_gain[2] = FLOAT_LIM2_INT(pExpInfo->arAGain[0] * pExpInfo->arDGain[0] * gain_ratio, GAIN_HDR_MERGE_IN_FIX_BITS_DECI, 1); // 12:6
169 }
170
171 return ANR_RET_SUCCESS;
172
173 }
174
175
176
177