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