xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/algos/again/rk_aiq_again_algo_gain.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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