1 #include "rk_aiq_again_algo_gain.h"
2
3
4
5 typedef double FLOAT_GAIN_V1;
6
FLOAT_LIM2_INT_V1(float In,int bit_deci_dst,int type=0)7 uint32_t FLOAT_LIM2_INT_V1(float In, int bit_deci_dst, int type = 0)
8 {
9 // would trigger strict-aliasing compile warning on -Os level
10 int exp_val = (((uint32_t*)(&In))[0] >> 23) & 0xff;
11 uint32_t dst;
12 int shf_bit;
13 if(exp_val - 127 <= bit_deci_dst || type == 1)
14 {
15 shf_bit = bit_deci_dst - (exp_val - 127);
16 dst = ROUND_F(In * (1 << bit_deci_dst));
17 }
18 else
19 {
20 shf_bit = (exp_val - 127) - bit_deci_dst;
21 dst = ROUND_F(In / (1 << bit_deci_dst));
22 }
23 return dst;
24 }
25
26 template<typename T>
FLOAT_FIX_V1(T In,int bit_inte_dst,int bit_deci_dst)27 T FLOAT_FIX_V1(T In, int bit_inte_dst, int bit_deci_dst)
28 {
29 uint32_t tmp;
30 T out;
31
32 tmp = ROUND_F(In * (1 << bit_deci_dst));
33 out = ((FLOAT_GAIN_V1)tmp) / (1 << bit_deci_dst);
34 return out;
35
36 }
37
38
gain_find_data_bits_v1(int data)39 int gain_find_data_bits_v1(int data)
40 {
41 int i, j = 1;
42 int bits = 0;
43
44 for(i = 0; i < 32; i++)
45 {
46 if(data & j)
47 {
48 bits = i + 1;
49 }
50 j = j << 1;
51 }
52
53 return bits;
54 }
55
gain_fix_transfer_v1(RK_GAIN_Params_V1_Select_t * pSelect,RK_GAIN_Fix_V1_t * pGainFix,Again_ExpInfo_t * pExpInfo,float gain_ratio)56 Again_result_t gain_fix_transfer_v1(RK_GAIN_Params_V1_Select_t *pSelect, RK_GAIN_Fix_V1_t* pGainFix, Again_ExpInfo_t *pExpInfo, float gain_ratio)
57 {
58 int i;
59 double max_val = 0;
60 uint16_t sigma_bits_max;
61 uint16_t sigma_bits_act = GAIN_SIGMA_BITS_ACT_V1;
62 double noise_sigma_dehaze[GAIN_MAX_INTEPORATATION_LUMAPOINT];
63 unsigned short noise_sigma_dehaze_x[GAIN_MAX_INTEPORATATION_LUMAPOINT];
64
65
66 LOGI_ANR("%s:(%d) enter\n", __FUNCTION__, __LINE__);
67
68 if(pSelect == NULL) {
69 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
70 return AGAIN_RET_NULL_POINTER;
71 }
72
73 if(pGainFix == NULL) {
74 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
75 return AGAIN_RET_NULL_POINTER;
76 }
77
78 if(pExpInfo == NULL) {
79 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
80 return AGAIN_RET_NULL_POINTER;
81 }
82
83 //pGainFix->gain_table_en = 1;
84 memcpy(noise_sigma_dehaze, pSelect->noise_sigma_dehaze, sizeof(pSelect->noise_sigma_dehaze));
85
86 for(i = 0; i < GAIN_MAX_INTEPORATATION_LUMAPOINT - 2; i++) {
87 pGainFix->idx[i] = pSelect->fix_x_pos_dehaze[i + 1];
88 if(pGainFix->idx[i] > 255) {
89 pGainFix->idx[i] = 255;
90 }
91 LOGD_ANR("%s:%d sigma x: %d\n", __FUNCTION__, __LINE__, pGainFix->idx[i]);
92 }
93
94 for(i = 0; i < GAIN_MAX_INTEPORATATION_LUMAPOINT; i++) {
95 if(max_val < pSelect->noise_sigma_dehaze[i])
96 max_val = pSelect->noise_sigma_dehaze[i];
97 }
98 sigma_bits_max = gain_find_data_bits_v1((int)max_val);//CEIL(log((FLOAT_GAIN_V1)max_val) / log((float)2));
99
100 for(i = 0; i < GAIN_MAX_INTEPORATATION_LUMAPOINT; i++) {
101 noise_sigma_dehaze[i] = FLOAT_FIX_V1(pSelect->noise_sigma_dehaze[i], sigma_bits_max, sigma_bits_act - sigma_bits_max);
102 }
103
104 for(int i = 0; i < GAIN_MAX_INTEPORATATION_LUMAPOINT; i++)
105 {
106 pGainFix->lut[i] = FLOAT_LIM2_INT_V1((float)noise_sigma_dehaze[i], sigma_bits_act - sigma_bits_max);
107 }
108
109
110 #if 1
111 pGainFix->dhaz_en = 1;
112 pGainFix->wdr_en = 0;
113 pGainFix->tmo_en = 1;
114 pGainFix->lsc_en = 1;
115 pGainFix->mge_en = 1;
116 #endif
117
118
119 int hdr_frameNum = pExpInfo->hdr_mode + 1;
120 if(hdr_frameNum > 1)
121 {
122 float frameiso[3];
123 float frameEt[3];
124 float frame_exp_val[3];
125 float frame_exp_ratio[3];
126 float dGain[3];
127
128 for (int i = 0; i < hdr_frameNum; i++) {
129 frameiso[i] = pExpInfo->arAGain[i];
130 frameEt[i] = pExpInfo->arTime[i];
131 LOGD_ANR("%s:%d idx:%d gain:%f time:%f exp:%f\n",
132 __FUNCTION__, __LINE__, i,
133 pExpInfo->arAGain[i], pExpInfo->arTime[i],
134 pExpInfo->arAGain[i] * pExpInfo->arTime[i]);
135 }
136
137 for (int i = 0; i < 3; i++) {
138 if(i >= hdr_frameNum) {
139 frame_exp_val[i] = frame_exp_val[hdr_frameNum - 1];
140 frameiso[i] = frameiso[hdr_frameNum - 1];
141 } else {
142 frame_exp_val[i] = frameiso[i] * frameEt[i];
143 frameiso[i] = frameiso[i] * 50;
144 }
145 }
146
147 for (int i = 0; i < 3; i++) {
148 frame_exp_ratio[i] = frame_exp_val[hdr_frameNum - 1] / frame_exp_val[i];
149 }
150
151 for (int i = 2; i >= 0; i--) {
152 dGain[i] = (frame_exp_ratio[i] * pExpInfo->arAGain[i] * pExpInfo->arDGain[i]);
153 LOGD_ANR("%s:%d idx:%d ratio:%f dgain %f\n",
154 __FUNCTION__, __LINE__, i,
155 frame_exp_ratio[i], dGain[i]);
156 pGainFix->mge_gain[i] = FLOAT_LIM2_INT_V1(dGain[i] * gain_ratio, GAIN_HDR_MERGE_IN_FIX_BITS_DECI_V1, 1); // 12:6
157 if(i == 0)
158 pGainFix->mge_gain[i] = MIN(pGainFix->mge_gain[i], (1 << (GAIN_HDR_MERGE_IN2_FIX_BITS_INTE_V1 + GAIN_HDR_MERGE_IN_FIX_BITS_DECI_V1)) - 1);
159 else
160 pGainFix->mge_gain[i] = MIN(pGainFix->mge_gain[i], (1 << (GAIN_HDR_MERGE_IN0_FIX_BITS_INTE_V1 + GAIN_HDR_MERGE_IN_FIX_BITS_DECI_V1)) - 1);
161 }
162 }
163 else
164 {
165 pGainFix->mge_gain[0] = FLOAT_LIM2_INT_V1(pExpInfo->arAGain[0] * pExpInfo->arDGain[0] * gain_ratio, GAIN_HDR_MERGE_IN_FIX_BITS_DECI_V1, 1); // 12:6
166 pGainFix->mge_gain[1] = FLOAT_LIM2_INT_V1(pExpInfo->arAGain[0] * pExpInfo->arDGain[0] * gain_ratio, GAIN_HDR_MERGE_IN_FIX_BITS_DECI_V1, 1); // 12:6
167 pGainFix->mge_gain[2] = FLOAT_LIM2_INT_V1(pExpInfo->arAGain[0] * pExpInfo->arDGain[0] * gain_ratio, GAIN_HDR_MERGE_IN_FIX_BITS_DECI_V1, 1); // 12:6
168 }
169
170 LOGI_ANR("%s:(%d) exit\n", __FUNCTION__, __LINE__);
171
172 return AGAIN_RET_SUCCESS;
173
174 }
175
176
gain_fix_Printf_v1(RK_GAIN_Fix_V1_t * pFix)177 Again_result_t gain_fix_Printf_v1(RK_GAIN_Fix_V1_t * pFix)
178 {
179 LOGI_ANR("%s:(%d) enter\n", __FUNCTION__, __LINE__);
180
181 if(pFix == NULL) {
182 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
183 return AGAIN_RET_NULL_POINTER;
184 }
185
186 LOGD_ANR("0x3f00: gain_table_en:%d dhaz_en:%d wdr_en:%d tmo_en:%d lsc_en:%d mge_en:%d\n",
187 pFix->gain_table_en,
188 pFix->dhaz_en,
189 pFix->wdr_en,
190 pFix->tmo_en,
191 pFix->lsc_en,
192 pFix->mge_en);
193
194 LOGD_ANR("0x3f00: mge_gain: %d %d %d\n",
195 pFix->mge_gain[0],
196 pFix->mge_gain[1],
197 pFix->mge_gain[2]);
198
199 for(int i=0; i<15; i++){
200 LOGD_ANR("0x3f00: mge_gain[%d]: %d\n",
201 i,
202 pFix->idx[i]);
203 }
204
205 for(int i=0; i<17; i++){
206 LOGD_ANR("0x3f00: mge_gain[%d]: %d\n",
207 i,
208 pFix->lut[i]);
209 }
210
211 LOGI_ANR("%s:(%d) exit\n", __FUNCTION__, __LINE__);
212
213 return AGAIN_RET_SUCCESS;
214
215 }
216
217
218
219
220
221
222