xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/aiq_core/RkAiqResourceTranslatorV3x.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  * RkAiqConfigTranslatorV3x.cpp
3  *
4  *  Copyright (c) 2019 Rockchip Corporation
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  */
19 
20 #include "isp20/Isp20Evts.h"
21 #include "isp20/Isp20StatsBuffer.h"
22 #include "common/rkisp2-config.h"
23 #include "common/rkisp21-config.h"
24 #include "common/rkisp3-config.h"
25 #include "RkAiqResourceTranslatorV3x.h"
26 
27 //#define AE_STATS_DEBUG
28 #define MAX_10BITS ((1 << 10) - 1)
29 #define MAX_12BITS ((1 << 12) - 1)
30 #define MAX_29BITS ((1 << 29) - 1)
31 #define MAX_32BITS  0xffffffff
32 
33 namespace RkCam {
34 
RkAiqResourceTranslatorV3x()35 RkAiqResourceTranslatorV3x::RkAiqResourceTranslatorV3x() : mIsMultiIsp(false) {}
36 
SetMultiIspMode(bool isMultiIsp)37 RkAiqResourceTranslatorV3x& RkAiqResourceTranslatorV3x::SetMultiIspMode(bool isMultiIsp) {
38     mIsMultiIsp = isMultiIsp;
39     return *this;
40 }
41 
SetPicInfo(RkAiqResourceTranslatorV3x::Rectangle & pic_rect)42 RkAiqResourceTranslatorV3x& RkAiqResourceTranslatorV3x::SetPicInfo(RkAiqResourceTranslatorV3x::Rectangle& pic_rect) {
43     pic_rect_ = pic_rect;
44     return *this;
45 }
46 
SetLeftIspRect(RkAiqResourceTranslatorV3x::Rectangle & left_isp_rect)47 RkAiqResourceTranslatorV3x& RkAiqResourceTranslatorV3x::SetLeftIspRect(RkAiqResourceTranslatorV3x::Rectangle& left_isp_rect) {
48     left_isp_rect_ = left_isp_rect;
49     return *this;
50 }
51 
SetRightIspRect(RkAiqResourceTranslatorV3x::Rectangle & right_isp_rect)52 RkAiqResourceTranslatorV3x& RkAiqResourceTranslatorV3x::SetRightIspRect(
53     RkAiqResourceTranslatorV3x::Rectangle& right_isp_rect) {
54     right_isp_rect_ = right_isp_rect;
55     return *this;
56 }
57 
SetPicInfo(RkAiqResourceTranslatorV3x::Rectangle && pic_rect)58 RkAiqResourceTranslatorV3x& RkAiqResourceTranslatorV3x::SetPicInfo(RkAiqResourceTranslatorV3x::Rectangle&& pic_rect) {
59     pic_rect_ = std::move(pic_rect);
60     return *this;
61 }
62 
SetLeftIspRect(RkAiqResourceTranslatorV3x::Rectangle && left_isp_rect)63 RkAiqResourceTranslatorV3x& RkAiqResourceTranslatorV3x::SetLeftIspRect(RkAiqResourceTranslatorV3x::Rectangle&& left_isp_rect) {
64     left_isp_rect_ = std::move(left_isp_rect);
65     return *this;
66 }
67 
SetRightIspRect(RkAiqResourceTranslatorV3x::Rectangle && right_isp_rect)68 RkAiqResourceTranslatorV3x& RkAiqResourceTranslatorV3x::SetRightIspRect(
69     RkAiqResourceTranslatorV3x::Rectangle&& right_isp_rect) {
70     right_isp_rect_ = std::move(right_isp_rect);
71     return *this;
72 }
73 
IsMultiIspMode() const74 bool RkAiqResourceTranslatorV3x::IsMultiIspMode() const {
75     return mIsMultiIsp;
76 }
77 
GetPicInfo()78 RkAiqResourceTranslatorV3x::Rectangle RkAiqResourceTranslatorV3x::GetPicInfo() {
79     return pic_rect_;
80 }
81 
GetLeftIspRect()82 RkAiqResourceTranslatorV3x::Rectangle RkAiqResourceTranslatorV3x::GetLeftIspRect() {
83     return left_isp_rect_;
84 }
85 
GetRightIspRect()86 RkAiqResourceTranslatorV3x::Rectangle RkAiqResourceTranslatorV3x::GetRightIspRect() {
87     return right_isp_rect_;
88 }
89 
JudgeWinLocation(struct isp2x_window * ori_win,WinSplitMode & mode,RkAiqResourceTranslatorV3x::Rectangle left_isp_rect_,RkAiqResourceTranslatorV3x::Rectangle right_isp_rect_)90 void JudgeWinLocation(
91     struct isp2x_window* ori_win,
92     WinSplitMode& mode,
93     RkAiqResourceTranslatorV3x::Rectangle left_isp_rect_,
94     RkAiqResourceTranslatorV3x::Rectangle right_isp_rect_
95 ) {
96 
97     if (ori_win->h_offs + ori_win->h_size <= left_isp_rect_.w) {
98         mode = LEFT_MODE;
99     } else if(ori_win->h_offs >= right_isp_rect_.x) {
100         mode = RIGHT_MODE;
101     } else {
102         if ((ori_win->h_offs + ori_win->h_size / 2) <= left_isp_rect_.w
103                 && right_isp_rect_.x <= (ori_win->h_offs + ori_win->h_size / 2)) {
104             mode = LEFT_AND_RIGHT_MODE;
105         }
106         else {
107 
108             if ((ori_win->h_offs + ori_win->h_size / 2) < right_isp_rect_.x) {
109 
110                 u16 h_size_tmp1 = left_isp_rect_.w - ori_win->h_offs;
111                 u16 h_size_tmp2 = (right_isp_rect_.x - ori_win->h_offs) * 2;
112 
113                 if (abs(ori_win->h_size - h_size_tmp1) < abs(ori_win->h_size - h_size_tmp2))
114                     mode = LEFT_MODE;
115                 else
116                     mode = LEFT_AND_RIGHT_MODE;
117             }
118             else {
119 
120                 u16 h_size_tmp1 = ori_win->h_offs + ori_win->h_size - right_isp_rect_.x;
121                 u16 h_size_tmp2 = (ori_win->h_offs + ori_win->h_size - left_isp_rect_.w) * 2;
122 
123                 if (abs(ori_win->h_size - h_size_tmp1) < abs(ori_win->h_size - h_size_tmp2))
124                     mode = RIGHT_MODE;
125                 else
126                     mode = LEFT_AND_RIGHT_MODE;
127             }
128         }
129     }
130 }
131 
132 #if defined(RKAIQ_HAVE_MULTIISP)
133 
MergeAecWinLiteStats(rawaelite_stat_t * merge_stats,struct isp2x_rawaelite_stat * left_stats,struct isp2x_rawaelite_stat * right_stats,WinSplitMode mode,struct isp2x_bls_fixed_val bls1_val,float * bls_ratio)134 void MergeAecWinLiteStats(
135     rawaelite_stat_t *merge_stats,
136     struct isp2x_rawaelite_stat *left_stats,
137     struct isp2x_rawaelite_stat *right_stats,
138     WinSplitMode mode,
139     struct isp2x_bls_fixed_val bls1_val,
140     float* bls_ratio
141 ) {
142     u8 wnd_num = sqrt(ISP3X_RAWAELITE_MEAN_NUM);
143 
144     for(int i = 0; i < wnd_num; i++) {
145         for(int j = 0; j < wnd_num; j++) {
146 
147             // step1 copy stats
148             switch(mode) {
149             case LEFT_MODE:
150                 merge_stats->channelr_xy[i * wnd_num + j] = left_stats->data[i * wnd_num + j].channelr_xy;
151                 merge_stats->channelg_xy[i * wnd_num + j] = left_stats->data[i * wnd_num + j].channelg_xy;
152                 merge_stats->channelb_xy[i * wnd_num + j] = left_stats->data[i * wnd_num + j].channelb_xy;
153                 break;
154             case RIGHT_MODE:
155                 merge_stats->channelr_xy[i * wnd_num + j] = right_stats->data[i * wnd_num + j].channelr_xy;
156                 merge_stats->channelg_xy[i * wnd_num + j] = right_stats->data[i * wnd_num + j].channelg_xy;
157                 merge_stats->channelb_xy[i * wnd_num + j] = right_stats->data[i * wnd_num + j].channelb_xy;
158                 break;
159             case LEFT_AND_RIGHT_MODE:
160 
161                 if(j < wnd_num / 2) {
162                     merge_stats->channelr_xy[i * wnd_num + j] = (left_stats->data[i * wnd_num + j * 2].channelr_xy + left_stats->data[i * wnd_num + j * 2 + 1].channelr_xy) / 2;
163                     merge_stats->channelg_xy[i * wnd_num + j] = (left_stats->data[i * wnd_num + j * 2].channelg_xy + left_stats->data[i * wnd_num + j * 2 + 1].channelg_xy) / 2;
164                     merge_stats->channelb_xy[i * wnd_num + j] = (left_stats->data[i * wnd_num + j * 2].channelb_xy + left_stats->data[i * wnd_num + j * 2 + 1].channelb_xy) / 2;
165                 } else if(j > wnd_num / 2) {
166                     merge_stats->channelr_xy[i * wnd_num + j] = (right_stats->data[i * wnd_num + j * 2 - wnd_num].channelr_xy + right_stats->data[i * wnd_num + j * 2 - wnd_num + 1].channelr_xy) / 2;
167                     merge_stats->channelg_xy[i * wnd_num + j] = (right_stats->data[i * wnd_num + j * 2 - wnd_num].channelg_xy + right_stats->data[i * wnd_num + j * 2 - wnd_num + 1].channelg_xy) / 2;
168                     merge_stats->channelb_xy[i * wnd_num + j] = (right_stats->data[i * wnd_num + j * 2 - wnd_num].channelb_xy + right_stats->data[i * wnd_num + j * 2 - wnd_num + 1].channelb_xy) / 2;
169                 } else {
170                     merge_stats->channelr_xy[i * wnd_num + j] = (left_stats->data[i * wnd_num + wnd_num - 1].channelr_xy + right_stats->data[i * wnd_num + 0].channelr_xy) / 2;
171                     merge_stats->channelg_xy[i * wnd_num + j] = (left_stats->data[i * wnd_num + wnd_num - 1].channelg_xy + right_stats->data[i * wnd_num + 0].channelg_xy) / 2;
172                     merge_stats->channelb_xy[i * wnd_num + j] = (left_stats->data[i * wnd_num + wnd_num - 1].channelb_xy + right_stats->data[i * wnd_num + 0].channelb_xy) / 2;
173                 }
174                 break;
175             default:
176                 break;
177             }
178 
179             // step2 subtract bls1
180             merge_stats->channelr_xy[i * wnd_num + j] = (u16)CLIP((merge_stats->channelr_xy[i * wnd_num + j] - bls1_val.r) * bls_ratio[0], 0, MAX_10BITS);
181             merge_stats->channelg_xy[i * wnd_num + j] = (u16)CLIP((merge_stats->channelg_xy[i * wnd_num + j] - bls1_val.gr) * bls_ratio[1], 0, MAX_12BITS);
182             merge_stats->channelb_xy[i * wnd_num + j] = (u16)CLIP((merge_stats->channelb_xy[i * wnd_num + j] - bls1_val.b) * bls_ratio[2], 0, MAX_10BITS);
183 
184         }
185     }
186 }
MergeAecWinBigStats(rawaebig_stat_t * merge_stats,struct isp2x_rawaebig_stat * left_stats,struct isp2x_rawaebig_stat * right_stats,WinSplitMode mode,struct isp2x_bls_fixed_val bls1_val,float * bls_ratio)187 void MergeAecWinBigStats(
188     rawaebig_stat_t *merge_stats,
189     struct isp2x_rawaebig_stat *left_stats,
190     struct isp2x_rawaebig_stat *right_stats,
191     WinSplitMode mode,
192     struct isp2x_bls_fixed_val bls1_val,
193     float* bls_ratio
194 ) {
195     u8 wnd_num = sqrt(ISP3X_RAWAEBIG_MEAN_NUM);
196     for(int i = 0; i < wnd_num; i++) {
197         for(int j = 0; j < wnd_num; j++) {
198 
199             // step1 copy stats
200             switch(mode) {
201             case LEFT_MODE:
202                 merge_stats->channelr_xy[i * wnd_num + j] = left_stats->data[i * wnd_num + j].channelr_xy;
203                 merge_stats->channelg_xy[i * wnd_num + j] = left_stats->data[i * wnd_num + j].channelg_xy;
204                 merge_stats->channelb_xy[i * wnd_num + j] = left_stats->data[i * wnd_num + j].channelb_xy;
205                 break;
206             case RIGHT_MODE:
207                 merge_stats->channelr_xy[i * wnd_num + j] = right_stats->data[i * wnd_num + j].channelr_xy;
208                 merge_stats->channelg_xy[i * wnd_num + j] = right_stats->data[i * wnd_num + j].channelg_xy;
209                 merge_stats->channelb_xy[i * wnd_num + j] = right_stats->data[i * wnd_num + j].channelb_xy;
210                 break;
211             case LEFT_AND_RIGHT_MODE:
212                 if(j < wnd_num / 2) {
213                     merge_stats->channelr_xy[i * wnd_num + j] = (left_stats->data[i * wnd_num + j * 2].channelr_xy + left_stats->data[i * wnd_num + j * 2 + 1].channelr_xy) / 2;
214                     merge_stats->channelg_xy[i * wnd_num + j] = (left_stats->data[i * wnd_num + j * 2].channelg_xy + left_stats->data[i * wnd_num + j * 2 + 1].channelg_xy) / 2;
215                     merge_stats->channelb_xy[i * wnd_num + j] = (left_stats->data[i * wnd_num + j * 2].channelb_xy + left_stats->data[i * wnd_num + j * 2 + 1].channelb_xy) / 2;
216                 } else if(j > wnd_num / 2) {
217                     merge_stats->channelr_xy[i * wnd_num + j] = (right_stats->data[i * wnd_num + j * 2 - wnd_num].channelr_xy + right_stats->data[i * wnd_num + j * 2 - wnd_num + 1].channelr_xy) / 2;
218                     merge_stats->channelg_xy[i * wnd_num + j] = (right_stats->data[i * wnd_num + j * 2 - wnd_num].channelg_xy + right_stats->data[i * wnd_num + j * 2 - wnd_num + 1].channelg_xy) / 2;
219                     merge_stats->channelb_xy[i * wnd_num + j] = (right_stats->data[i * wnd_num + j * 2 - wnd_num].channelb_xy + right_stats->data[i * wnd_num + j * 2 - wnd_num + 1].channelb_xy) / 2;
220                 } else {
221                     merge_stats->channelr_xy[i * wnd_num + j] = (left_stats->data[i * wnd_num + wnd_num - 1].channelr_xy + right_stats->data[i * wnd_num + 0].channelr_xy) / 2;
222                     merge_stats->channelg_xy[i * wnd_num + j] = (left_stats->data[i * wnd_num + wnd_num - 1].channelg_xy + right_stats->data[i * wnd_num + 0].channelg_xy) / 2;
223                     merge_stats->channelb_xy[i * wnd_num + j] = (left_stats->data[i * wnd_num + wnd_num - 1].channelb_xy + right_stats->data[i * wnd_num + 0].channelb_xy) / 2;
224                 }
225                 break;
226             default:
227                 break;
228             }
229 
230             // step2 subtract bls1
231             merge_stats->channelr_xy[i * wnd_num + j] = (u16)CLIP((merge_stats->channelr_xy[i * wnd_num + j] - bls1_val.r) * bls_ratio[0], 0, MAX_10BITS);
232             merge_stats->channelg_xy[i * wnd_num + j] = (u16)CLIP((merge_stats->channelg_xy[i * wnd_num + j] - bls1_val.gr) * bls_ratio[1], 0, MAX_12BITS);
233             merge_stats->channelb_xy[i * wnd_num + j] = (u16)CLIP((merge_stats->channelb_xy[i * wnd_num + j] - bls1_val.b) * bls_ratio[2], 0, MAX_10BITS);
234 
235         }
236     }
237 
238 }
MergeAecSubWinStats(rawaebig_stat_t * merge_stats,struct isp2x_rawaebig_stat * left_stats,struct isp2x_rawaebig_stat * right_stats,u8 * left_en,u8 * right_en,struct isp2x_bls_fixed_val bls1_val,float * bls_ratio,u32 * pixel_num)239 void MergeAecSubWinStats(
240     rawaebig_stat_t *merge_stats,
241     struct isp2x_rawaebig_stat *left_stats,
242     struct isp2x_rawaebig_stat *right_stats,
243     u8 *left_en,
244     u8 *right_en,
245     struct isp2x_bls_fixed_val bls1_val,
246     float* bls_ratio,
247     u32* pixel_num
248 ) {
249     for(int i = 0; i < ISP3X_RAWAEBIG_SUBWIN_NUM; i++) {
250         // step1 copy stats
251         merge_stats->wndx_sumr[i] = ((left_en[i]) ? left_stats->sumr[i] : 0) + ((right_en[i]) ? right_stats->sumr[i] : 0);
252         merge_stats->wndx_sumg[i] = ((left_en[i]) ? left_stats->sumg[i] : 0) + ((right_en[i]) ? right_stats->sumg[i] : 0);
253         merge_stats->wndx_sumb[i] = ((left_en[i]) ? left_stats->sumb[i] : 0) + ((right_en[i]) ? right_stats->sumb[i] : 0);
254 
255         // step2 subtract bls1
256         if(left_en[i] == 1 || right_en[i] == 1) {
257             merge_stats->wndx_sumr[i] = (u32)CLIP((merge_stats->wndx_sumr[i] - (pixel_num[i] >> 2) * bls1_val.r) * bls_ratio[0], 0, MAX_29BITS);
258             merge_stats->wndx_sumg[i] = (u32)CLIP((merge_stats->wndx_sumg[i] - (pixel_num[i] >> 1) * bls1_val.gr) * bls_ratio[1], 0, MAX_32BITS);
259             merge_stats->wndx_sumb[i] = (u32)CLIP((merge_stats->wndx_sumb[i] - (pixel_num[i] >> 2) * bls1_val.b) * bls_ratio[2], 0, MAX_29BITS);
260         }
261     }
262 }
MergeAecHistBinStats(u32 * merge_stats,u32 * left_stats,u32 * right_stats,WinSplitMode mode,s16 bls1_val,float bls_ratio)263 void MergeAecHistBinStats(
264     u32 *merge_stats,
265     u32 *left_stats,
266     u32 *right_stats,
267     WinSplitMode mode,
268     s16   bls1_val,
269     float bls_ratio
270 ) {
271     int tmp;
272     memset(merge_stats, 0, ISP3X_HIST_BIN_N_MAX * sizeof(u32));
273 
274     switch(mode) {
275     case LEFT_MODE:
276         for(int i = 0; i < ISP3X_HIST_BIN_N_MAX; i++) {
277             tmp = (i - bls1_val >= 0) ? (i - bls1_val) * bls_ratio + 0.5 : 0;
278             if(tmp > ISP3X_HIST_BIN_N_MAX - 1)
279                 tmp = ISP3X_HIST_BIN_N_MAX - 1;
280             merge_stats[tmp] += left_stats[i];
281         }
282         break;
283     case RIGHT_MODE:
284         for(int i = 0; i < ISP3X_HIST_BIN_N_MAX; i++) {
285             tmp = (i - bls1_val >= 0) ? (i - bls1_val) * bls_ratio + 0.5 : 0;
286             if(tmp > ISP3X_HIST_BIN_N_MAX - 1)
287                 tmp = ISP3X_HIST_BIN_N_MAX - 1;
288             merge_stats[tmp] += right_stats[i];
289         }
290         break;
291     case LEFT_AND_RIGHT_MODE:
292         for(int i = 0; i < ISP3X_HIST_BIN_N_MAX; i++) {
293             tmp = (i - bls1_val >= 0) ? (i - bls1_val) * bls_ratio + 0.5 : 0;
294             if(tmp > ISP3X_HIST_BIN_N_MAX - 1)
295                 tmp = ISP3X_HIST_BIN_N_MAX - 1;
296             merge_stats[tmp] += left_stats[i] + right_stats[i];
297         }
298         break;
299     }
300 
301 }
302 
MergeAwbWinStats(rk_aiq_awb_stat_wp_res_light_v201_t * merge_stats,struct isp3x_rawawb_meas_stat * left_stats,struct isp3x_rawawb_meas_stat * right_stats,int lightNum,WinSplitMode mode)303 void MergeAwbWinStats(
304     rk_aiq_awb_stat_wp_res_light_v201_t *merge_stats,
305     struct isp3x_rawawb_meas_stat *left_stats,
306     struct isp3x_rawawb_meas_stat *right_stats,
307     int lightNum,
308     WinSplitMode mode
309 ) {
310     switch(mode) {
311     case LEFT_MODE:
312         for(int i = 0; i < lightNum; i++) {
313             merge_stats[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V201].RgainValue = left_stats->ro_rawawb_sum_rgain_nor[i];
314             merge_stats[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V201].BgainValue = left_stats->ro_rawawb_sum_bgain_nor[i];
315             merge_stats[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V201].WpNo = left_stats->ro_rawawb_wp_num_nor[i];
316             merge_stats[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V201].RgainValue = left_stats->ro_rawawb_sum_rgain_big[i];
317             merge_stats[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V201].BgainValue = left_stats->ro_rawawb_sum_bgain_big[i];
318             merge_stats[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V201].WpNo = left_stats->ro_rawawb_wp_num_big[i];
319         }
320         break;
321     case RIGHT_MODE:
322         for(int i = 0; i < lightNum; i++) {
323             merge_stats[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V201].RgainValue = right_stats->ro_rawawb_sum_rgain_nor[i];
324             merge_stats[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V201].BgainValue = right_stats->ro_rawawb_sum_bgain_nor[i];
325             merge_stats[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V201].WpNo = right_stats->ro_rawawb_wp_num_nor[i];
326             merge_stats[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V201].RgainValue = right_stats->ro_rawawb_sum_rgain_big[i];
327             merge_stats[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V201].BgainValue = right_stats->ro_rawawb_sum_bgain_big[i];
328             merge_stats[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V201].WpNo = right_stats->ro_rawawb_wp_num_big[i];
329         }
330         break;
331     case LEFT_AND_RIGHT_MODE:
332         for(int i = 0; i < lightNum; i++) {
333             merge_stats[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V201].RgainValue =
334                 left_stats->ro_rawawb_sum_rgain_nor[i] + right_stats->ro_rawawb_sum_rgain_nor[i] ;
335             merge_stats[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V201].BgainValue =
336                 left_stats->ro_rawawb_sum_bgain_nor[i] +  right_stats->ro_rawawb_sum_bgain_nor[i];
337             merge_stats[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V201].WpNo =
338                 left_stats->ro_rawawb_wp_num_nor[i] +  right_stats->ro_rawawb_wp_num_nor[i];
339             merge_stats[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V201].RgainValue =
340                 left_stats->ro_rawawb_sum_rgain_big[i] +  right_stats->ro_rawawb_sum_rgain_big[i];
341             merge_stats[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V201].BgainValue =
342                 left_stats->ro_rawawb_sum_bgain_big[i] +  right_stats->ro_rawawb_sum_bgain_big[i];
343             merge_stats[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V201].WpNo =
344                 left_stats->ro_rawawb_wp_num_big[i] +  right_stats->ro_rawawb_wp_num_big[i];
345         }
346         break;
347     default:
348         break;
349     }
350 }
351 #endif
352 
AwbStatOverflowCheckandFixed(struct isp2x_window * win,rk_aiq_awb_blk_stat_mode_v201_t blkMeasureMode,bool blkStatisticsWithLumaWeightEn,rk_aiq_awb_xy_type_v201_t xyRangeTypeForWpHist,int lightNum,struct isp3x_rawawb_meas_stat * stats)353 void AwbStatOverflowCheckandFixed(struct isp2x_window* win, rk_aiq_awb_blk_stat_mode_v201_t blkMeasureMode, bool blkStatisticsWithLumaWeightEn, rk_aiq_awb_xy_type_v201_t xyRangeTypeForWpHist,
354                                   int lightNum, struct isp3x_rawawb_meas_stat *stats)
355 {
356     int w, h;
357     w = win->h_size;
358     h = win->v_size;
359     float factor1 = (float)((1 << (RK_AIQ_AWB_WP_WEIGHT_BIS_V201 + 1)) - 1) / ((1 << RK_AIQ_AWB_WP_WEIGHT_BIS_V201) - 1);
360     if(w * h > RK_AIQ_AWB_STAT_MAX_AREA) {
361         LOGD_AWB("%s ramdata and ro_wp_num2 is fixed", __FUNCTION__);
362         for(int i = 0; i < RK_AIQ_AWB_GRID_NUM_TOTAL; i++) {
363             stats->ramdata[i].wp = (float)stats->ramdata[i].wp * factor1 + 0.5 ;
364             stats->ramdata[i].r = (float)stats->ramdata[i].r * factor1 + 0.5 ;
365             stats->ramdata[i].g = (float)stats->ramdata[i].g * factor1 + 0.5 ;
366             stats->ramdata[i].b = (float)stats->ramdata[i].b * factor1 + 0.5 ;
367         }
368         if(xyRangeTypeForWpHist == RK_AIQ_AWB_XY_TYPE_BIG_V201) {
369             for(int i = 0; i < lightNum; i++) {
370                 stats->ro_wp_num2[i] = stats->ro_rawawb_wp_num_big[i] >> RK_AIQ_WP_GAIN_FRAC_BIS;
371             }
372         } else {
373             for(int i = 0; i < lightNum; i++) {
374                 stats->ro_wp_num2[i] = stats->ro_rawawb_wp_num_nor[i] >> RK_AIQ_WP_GAIN_FRAC_BIS;
375             }
376         }
377     } else {
378         if(RK_AIQ_AWB_BLK_STAT_MODE_REALWP_V201 == blkMeasureMode && blkStatisticsWithLumaWeightEn) {
379             for(int i = 0; i < RK_AIQ_AWB_GRID_NUM_TOTAL; i++) {
380                 stats->ramdata[i].wp = (float)stats->ramdata[i].wp * factor1 + 0.5 ;
381                 stats->ramdata[i].r = (float)stats->ramdata[i].r * factor1 + 0.5 ;
382                 stats->ramdata[i].g = (float)stats->ramdata[i].g * factor1 + 0.5 ;
383                 stats->ramdata[i].b = (float)stats->ramdata[i].b * factor1 + 0.5 ;
384             }
385         }
386     }
387 }
388 
389 #if defined(RKAIQ_HAVE_MULTIISP)
390 
MergeAwbBlkStats(struct isp2x_window * ori_win,struct isp2x_window * left_win,struct isp2x_window * right_win,rk_aiq_awb_stat_blk_res_v201_t * merge_stats,struct isp3x_rawawb_meas_stat * left_stats,struct isp3x_rawawb_meas_stat * right_stats,WinSplitMode mode)391 void MergeAwbBlkStats(
392     struct isp2x_window* ori_win,
393     struct isp2x_window* left_win,
394     struct isp2x_window* right_win,
395     rk_aiq_awb_stat_blk_res_v201_t *merge_stats,
396     struct isp3x_rawawb_meas_stat *left_stats,
397     struct isp3x_rawawb_meas_stat *right_stats,
398     WinSplitMode mode
399 ) {
400     u8 wnd_num = sqrt(RK_AIQ_AWB_GRID_NUM_TOTAL);
401 
402     switch(mode) {
403     case LEFT_MODE:
404         for(int i = 0; i < wnd_num; i++) {
405             for(int j = 0; j < wnd_num; j++) {
406                 merge_stats[i * wnd_num + j].Rvalue = left_stats->ramdata[i * wnd_num + j].r;
407                 merge_stats[i * wnd_num + j].Gvalue = left_stats->ramdata[i * wnd_num + j].g;
408                 merge_stats[i * wnd_num + j].Bvalue = left_stats->ramdata[i * wnd_num + j].b;
409                 merge_stats[i * wnd_num + j].WpNo = left_stats->ramdata[i * wnd_num + j].wp;
410             }
411         }
412         break;
413     case RIGHT_MODE:
414         for(int i = 0; i < wnd_num; i++) {
415             for(int j = 0; j < wnd_num; j++) {
416                 merge_stats[i * wnd_num + j].Rvalue = right_stats->ramdata[i * wnd_num + j].r;
417                 merge_stats[i * wnd_num + j].Gvalue = right_stats->ramdata[i * wnd_num + j].g;
418                 merge_stats[i * wnd_num + j].Bvalue = right_stats->ramdata[i * wnd_num + j].b;
419                 merge_stats[i * wnd_num + j].WpNo = right_stats->ramdata[i * wnd_num + j].wp;
420             }
421         }
422         break;
423     case LEFT_AND_RIGHT_MODE:
424         for(int i = 0; i < wnd_num; i++) {
425             for(int j = 0; j < wnd_num; j++) {
426                 if(j < wnd_num / 2) {
427                     merge_stats[i * wnd_num + j].Rvalue = left_stats->ramdata[i * wnd_num + j * 2].r + left_stats->ramdata[i * wnd_num + j * 2 + 1].r;
428                     merge_stats[i * wnd_num + j].Gvalue = left_stats->ramdata[i * wnd_num + j * 2].g + left_stats->ramdata[i * wnd_num + j * 2 + 1].g;
429                     merge_stats[i * wnd_num + j].Bvalue = left_stats->ramdata[i * wnd_num + j * 2].b +  left_stats->ramdata[i * wnd_num + j * 2 + 1].b;
430                     merge_stats[i * wnd_num + j].WpNo = left_stats->ramdata[i * wnd_num + j * 2].wp + left_stats->ramdata[i * wnd_num + j * 2 + 1].wp;
431                 } else if(j > wnd_num / 2) {
432                     merge_stats[i * wnd_num + j].Rvalue = right_stats->ramdata[i * wnd_num + j * 2 - wnd_num].r + right_stats->ramdata[i * wnd_num + j * 2 - wnd_num + 1].r;
433                     merge_stats[i * wnd_num + j].Gvalue = right_stats->ramdata[i * wnd_num + j * 2 - wnd_num].g + right_stats->ramdata[i * wnd_num + j * 2 - wnd_num + 1].g;
434                     merge_stats[i * wnd_num + j].Bvalue = right_stats->ramdata[i * wnd_num + j * 2 - wnd_num].b + right_stats->ramdata[i * wnd_num + j * 2 - wnd_num + 1].b;
435                     merge_stats[i * wnd_num + j].WpNo = right_stats->ramdata[i * wnd_num + j * 2 - wnd_num].wp + right_stats->ramdata[i * wnd_num + j * 2 - wnd_num + 1].wp;
436                 } else {
437                     merge_stats[i * wnd_num + j].Rvalue = left_stats->ramdata[i * wnd_num + wnd_num - 1].r + right_stats->ramdata[i * wnd_num + 0].r;
438                     merge_stats[i * wnd_num + j].Gvalue = left_stats->ramdata[i * wnd_num + wnd_num - 1].g + right_stats->ramdata[i * wnd_num + 0].g;
439                     merge_stats[i * wnd_num + j].Bvalue = left_stats->ramdata[i * wnd_num + wnd_num - 1].b + right_stats->ramdata[i * wnd_num + 0].b;
440                     merge_stats[i * wnd_num + j].WpNo = left_stats->ramdata[i * wnd_num + wnd_num - 1].wp + right_stats->ramdata[i * wnd_num + 0].wp;
441                 }
442             }
443         }
444         break;
445     default:
446         break;
447     }
448 
449 }
450 
MergeAwbHistBinStats(unsigned int * merge_stats,u16 * left_stats,u16 * right_stats,WinSplitMode mode)451 void MergeAwbHistBinStats(
452     unsigned int *merge_stats,
453     u16 *left_stats,
454     u16 *right_stats,
455     WinSplitMode mode
456 ) {
457     u32 tmp1, tmp2;
458     switch(mode) {
459     case LEFT_MODE:
460         for(int i = 0; i < RK_AIQ_AWB_WP_HIST_BIN_NUM; i++) {
461             tmp1 = left_stats[i];
462             if(left_stats[i] & 0x8000) {
463                 tmp1 = left_stats[i] & 0x7FFF;
464                 tmp1 *=    (1 << 3);
465             }
466             merge_stats[i] = tmp1;
467         }
468         break;
469     case RIGHT_MODE:
470         for(int i = 0; i < RK_AIQ_AWB_WP_HIST_BIN_NUM; i++) {
471             tmp2 = right_stats[i];
472             if(right_stats[i] & 0x8000) {
473                 tmp2 = right_stats[i] & 0x7FFF;
474                 tmp2 *=    (1 << 3);
475             }
476             merge_stats[i] = tmp2;
477         }
478 
479         break;
480     case LEFT_AND_RIGHT_MODE:
481         for(int i = 0; i < RK_AIQ_AWB_WP_HIST_BIN_NUM; i++) {
482             tmp1 = left_stats[i];
483             if(left_stats[i] & 0x8000) {
484                 tmp1 = left_stats[i] & 0x7FFF;
485                 tmp1 *=    (1 << 3);
486             }
487             tmp2 = right_stats[i];
488             if(right_stats[i] & 0x8000) {
489                 tmp2 = right_stats[i] & 0x7FFF;
490                 tmp2 *=    (1 << 3);
491             }
492             merge_stats[i] = tmp1 + tmp2;
493 
494         }
495         break;
496     }
497 }
498 
499 #if defined(ISP_HW_V30)
500 
MergeAwbMultiWinStats(rk_aiq_isp_awb_stats_v3x_t * merge_stats,struct isp3x_rawawb_meas_stat * left_stats,struct isp3x_rawawb_meas_stat * right_stats)501 void MergeAwbMultiWinStats(
502     rk_aiq_isp_awb_stats_v3x_t *merge_stats,
503     struct isp3x_rawawb_meas_stat *left_stats,
504     struct isp3x_rawawb_meas_stat *right_stats
505 ) {
506     for(int i = 0; i < RK_AIQ_AWB_MULTIWINDOW_NUM_V201; i++) {
507 
508         merge_stats->multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V201].RgainValue =
509             left_stats->ro_sum_r_nor_multiwindow[i] + right_stats->ro_sum_r_nor_multiwindow[i];
510         merge_stats->multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V201].BgainValue =
511             left_stats->ro_sum_b_nor_multiwindow[i] + right_stats->ro_sum_b_nor_multiwindow[i];
512         merge_stats->multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V201].WpNo =
513             left_stats->ro_wp_nm_nor_multiwindow[i] + right_stats->ro_wp_nm_nor_multiwindow[i];
514         merge_stats->multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V201].RgainValue =
515             left_stats->ro_sum_r_big_multiwindow[i] + right_stats->ro_sum_r_big_multiwindow[i];
516         merge_stats->multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V201].BgainValue =
517             left_stats->ro_sum_b_big_multiwindow[i] + right_stats->ro_sum_b_big_multiwindow[i];
518         merge_stats->multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V201].WpNo =
519             left_stats->ro_wp_nm_big_multiwindow[i] + right_stats->ro_wp_nm_big_multiwindow[i];
520 
521     }
522 }
523 
MergeAwbExcWpStats(rk_aiq_awb_stat_wp_res_v201_t * merge_stats,isp3x_rawawb_meas_stat * left_stats,isp3x_rawawb_meas_stat * right_stats,WinSplitMode mode)524 void MergeAwbExcWpStats(
525     rk_aiq_awb_stat_wp_res_v201_t*merge_stats,
526     isp3x_rawawb_meas_stat *left_stats,
527     isp3x_rawawb_meas_stat *right_stats,
528     WinSplitMode mode
529 ) {
530     switch(mode) {
531     case LEFT_MODE:
532         for(int i = 0; i < RK_AIQ_AWB_STAT_WP_RANGE_NUM_V201; i++) {
533             merge_stats[i].RgainValue = left_stats->ro_sum_r_exc[i];
534             merge_stats[i].RgainValue = left_stats->ro_sum_b_exc[i];
535             merge_stats[i].RgainValue = left_stats->ro_wp_nm_exc[i];
536         }
537         break;
538     case RIGHT_MODE:
539         for(int i = 0; i < RK_AIQ_AWB_STAT_WP_RANGE_NUM_V201; i++) {
540             merge_stats[i].RgainValue = right_stats->ro_sum_r_exc[i];
541             merge_stats[i].RgainValue = right_stats->ro_sum_b_exc[i];
542             merge_stats[i].RgainValue = right_stats->ro_wp_nm_exc[i];
543         }
544         break;
545     case LEFT_AND_RIGHT_MODE:
546         for(int i = 0; i < RK_AIQ_AWB_STAT_WP_RANGE_NUM_V201; i++) {
547             merge_stats[i].RgainValue = left_stats->ro_sum_r_exc[i] + right_stats->ro_sum_r_exc[i];
548             merge_stats[i].RgainValue = left_stats->ro_sum_b_exc[i] + right_stats->ro_sum_b_exc[i];
549             merge_stats[i].RgainValue = left_stats->ro_wp_nm_exc[i] + right_stats->ro_sum_b_exc[i];
550         }
551         break;
552     }
553 }
554 #endif
555 
556 XCamReturn
translateMultiAecStats(const SmartPtr<VideoBuffer> & from,SmartPtr<RkAiqAecStatsProxy> & to)557 RkAiqResourceTranslatorV3x::translateMultiAecStats(const SmartPtr<VideoBuffer>& from, SmartPtr<RkAiqAecStatsProxy>& to)
558 {
559 
560     XCamReturn ret = XCAM_RETURN_NO_ERROR;
561     Isp20StatsBuffer* buf =
562         from.get_cast_ptr<Isp20StatsBuffer>();
563 
564     SmartPtr<RkAiqAecStats> statsInt = to->data();
565 
566     struct rkisp3x_isp_stat_buffer *left_stats;
567     struct rkisp3x_isp_stat_buffer *right_stats;
568 
569     left_stats = (struct rkisp3x_isp_stat_buffer*)(buf->get_v4l2_userptr());
570     if(left_stats == NULL) {
571         LOGE("fail to get left stats ,ignore\n");
572         return XCAM_RETURN_BYPASS;
573     }
574 
575     right_stats = left_stats + 1;
576     if(right_stats == NULL) {
577         LOGE("fail to get right stats ,ignore\n");
578         return XCAM_RETURN_BYPASS;
579     }
580 
581     if (left_stats->frame_id != right_stats->frame_id || left_stats->meas_type != right_stats->meas_type) {
582         LOGE_ANALYZER("status params(frmid or meas_type) of left isp and right isp are different");
583     } else {
584         LOGD_ANALYZER("camId: %d, stats: frame_id: %d,  meas_type; 0x%x", mCamPhyId, left_stats->frame_id, left_stats->meas_type);
585     }
586 
587     SmartPtr<RkAiqIrisParamsProxy> irisParams = buf->get_iris_params();
588     SmartPtr<RkAiqSensorExpParamsProxy> expParams = nullptr;
589     rkisp_effect_params_v20 ispParams;
590     memset(&ispParams, 0, sizeof(ispParams));
591     if (buf->getEffectiveExpParams(left_stats->frame_id, expParams) < 0)
592         LOGE("fail to get expParams");
593     if (buf->getEffectiveIspParams(left_stats->frame_id, ispParams) < 0) {
594         LOGE("fail to get ispParams ,ignore\n");
595         return XCAM_RETURN_BYPASS;
596     }
597 
598     //ae stats v3.x
599 
600     statsInt->frame_id = left_stats->frame_id;
601 
602     /*rawae stats*/
603     uint8_t AeSwapMode, AeSelMode, AfUseAeBig;
604     AeSwapMode = ispParams.isp_params_v3x[0].meas.rawae0.rawae_sel;
605     AeSelMode = ispParams.isp_params_v3x[0].meas.rawae3.rawae_sel;
606     AfUseAeBig = ispParams.isp_params_v3x[0].meas.rawaf.ae_mode;
607     unsigned int meas_type = 0;
608 
609     WinSplitMode AeWinSplitMode[4] = {LEFT_AND_RIGHT_MODE}; //0:rawae0 1:rawae1 2:rawae2 3:rawae3
610     WinSplitMode HistWinSplitMode[4] = {LEFT_AND_RIGHT_MODE}; //0:rawhist0 1:rawhist1 2:rawhist2 3:rawhist3
611 
612     JudgeWinLocation(&ispParams.isp_params_v3x[0].meas.rawae0.win, AeWinSplitMode[0], left_isp_rect_, right_isp_rect_);
613     JudgeWinLocation(&ispParams.isp_params_v3x[0].meas.rawae1.win, AeWinSplitMode[1], left_isp_rect_, right_isp_rect_);
614     JudgeWinLocation(&ispParams.isp_params_v3x[0].meas.rawae2.win, AeWinSplitMode[2], left_isp_rect_, right_isp_rect_);
615     JudgeWinLocation(&ispParams.isp_params_v3x[0].meas.rawae3.win, AeWinSplitMode[3], left_isp_rect_, right_isp_rect_);
616 
617     JudgeWinLocation(&ispParams.isp_params_v3x[0].meas.rawhist0.win, HistWinSplitMode[0], left_isp_rect_, right_isp_rect_);
618     JudgeWinLocation(&ispParams.isp_params_v3x[0].meas.rawhist1.win, HistWinSplitMode[1], left_isp_rect_, right_isp_rect_);
619     JudgeWinLocation(&ispParams.isp_params_v3x[0].meas.rawhist2.win, HistWinSplitMode[2], left_isp_rect_, right_isp_rect_);
620     JudgeWinLocation(&ispParams.isp_params_v3x[0].meas.rawhist3.win, HistWinSplitMode[3], left_isp_rect_, right_isp_rect_);
621 
622     struct isp21_bls_cfg *bls_cfg = &ispParams.isp_params_v3x[0].others.bls_cfg;
623     struct isp2x_bls_fixed_val bls1_val; //bls1_val = blc1_ori_val * awb * range_ratio
624     float bls_ratio[3] = {1, 1, 1};
625     u32 pixel_num[ISP3X_RAWAEBIG_SUBWIN_NUM] = {0};
626 
627     if(bls_cfg->bls1_en) {
628 
629         bls1_val.r = bls_cfg->bls1_val.r >> 2;
630         bls1_val.gr = bls_cfg->bls1_val.gr;
631         bls1_val.gb = bls_cfg->bls1_val.gb;
632         bls1_val.b = bls_cfg->bls1_val.b >> 2;
633 
634         bls_ratio[0] = (float)((1 << 12) - 1) / ((1 << 12) - 1 - bls_cfg->bls1_val.r);
635         bls_ratio[1] = (float)((1 << 12) - 1) / ((1 << 12) - 1 - bls_cfg->bls1_val.gr);
636         bls_ratio[2] = (float)((1 << 12) - 1) / ((1 << 12) - 1 - bls_cfg->bls1_val.b);
637 
638     } else {
639 
640         bls1_val.r = 0;
641         bls1_val.gr = 0;
642         bls1_val.gb = 0;
643         bls1_val.b = 0;
644 
645     }
646 
647 #ifdef AE_STATS_DEBUG
648     LOGE("bls1[%d-%d-%d-%d]", bls1_val.r, bls1_val.gr, bls1_val.gb, bls1_val.b);
649     LOGE("bls_ratio[%f-%f-%f]", bls_ratio[0], bls_ratio[1], bls_ratio[2]);
650 #endif
651 
652     s16   hist_bls1;
653     float hist_bls_ratio;
654     uint64_t SumHistPix[3] = {0, 0, 0};
655     float HistMean[3] = {0.0f, 0.0f, 0.0f};
656 
657     switch(AeSwapMode)
658     {
659     case AEC_RAWSWAP_MODE_S_LITE:
660 
661         switch(ispParams.isp_params_v3x[0].meas.rawhist0.mode) {
662         case 2:
663             hist_bls1 = (bls1_val.r >> 2);
664             hist_bls_ratio = bls_ratio[0];
665             break;
666         case 3:
667             hist_bls1 = (bls1_val.gr >> 4);
668             hist_bls_ratio = bls_ratio[1];
669             break;
670         case 4:
671             hist_bls1 = (bls1_val.b >> 2);
672             hist_bls_ratio = bls_ratio[2];
673             break;
674         case 5:
675         default:
676             hist_bls1 = (s16)((bls1_val.gr >> 4) * 0.587 + (bls1_val.r >> 2) * 0.299 + (bls1_val.b >> 2) * 0.114 + 0.5);
677             hist_bls_ratio = (float)((1 << 8) - 1) / ((1 << 8) - 1 - hist_bls1);
678             break;
679         }
680 
681         meas_type = ((left_stats->meas_type >> 7) & (0x01)) & ((left_stats->meas_type >> 11) & (0x01));
682         statsInt->aec_stats_valid = (meas_type & 0x01) ? true : false;
683 
684         //chn 0 => rawae0 rawhist0
685         MergeAecWinLiteStats(&statsInt->aec_stats.ae_data.chn[0].rawae_lite, &left_stats->params.rawae0, &right_stats->params.rawae0, AeWinSplitMode[0], bls1_val, bls_ratio);
686         MergeAecHistBinStats(statsInt->aec_stats.ae_data.chn[0].rawhist_lite.bins, left_stats->params.rawhist0.hist_bin,
687                              right_stats->params.rawhist0.hist_bin, HistWinSplitMode[0], hist_bls1, hist_bls_ratio);
688 
689         //chn 1 => rawae1 rawhist1
690         MergeAecWinBigStats(&statsInt->aec_stats.ae_data.chn[1].rawae_big, &left_stats->params.rawae1, &right_stats->params.rawae1, AeWinSplitMode[1], bls1_val, bls_ratio);
691         pixel_num[0] = ispParams.isp_params_v3x[0].meas.rawae1.subwin[0].h_size * ispParams.isp_params_v3x[0].meas.rawae1.subwin[0].v_size;
692         pixel_num[1] = ispParams.isp_params_v3x[0].meas.rawae1.subwin[1].h_size * ispParams.isp_params_v3x[0].meas.rawae1.subwin[1].v_size;
693         pixel_num[2] = ispParams.isp_params_v3x[0].meas.rawae1.subwin[2].h_size * ispParams.isp_params_v3x[0].meas.rawae1.subwin[2].v_size;
694         pixel_num[3] = ispParams.isp_params_v3x[0].meas.rawae1.subwin[3].h_size * ispParams.isp_params_v3x[0].meas.rawae1.subwin[3].v_size;
695         MergeAecSubWinStats(&statsInt->aec_stats.ae_data.chn[1].rawae_big, &left_stats->params.rawae1, &right_stats->params.rawae1,
696                             ispParams.isp_params_v3x[1].meas.rawae1.subwin_en, ispParams.isp_params_v3x[2].meas.rawae1.subwin_en,
697                             bls1_val, bls_ratio, pixel_num);
698 
699         MergeAecHistBinStats(statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins, left_stats->params.rawhist1.hist_bin,
700                              right_stats->params.rawhist1.hist_bin, HistWinSplitMode[1], hist_bls1, hist_bls_ratio);
701 
702 
703         //chn 2 => rawae2 rawhist2
704         MergeAecWinBigStats(&statsInt->aec_stats.ae_data.chn[2].rawae_big, &left_stats->params.rawae2, &right_stats->params.rawae2, AeWinSplitMode[2], bls1_val, bls_ratio);
705         pixel_num[0] = ispParams.isp_params_v3x[0].meas.rawae2.subwin[0].h_size * ispParams.isp_params_v3x[0].meas.rawae2.subwin[0].v_size;
706         pixel_num[1] = ispParams.isp_params_v3x[0].meas.rawae2.subwin[1].h_size * ispParams.isp_params_v3x[0].meas.rawae2.subwin[1].v_size;
707         pixel_num[2] = ispParams.isp_params_v3x[0].meas.rawae2.subwin[2].h_size * ispParams.isp_params_v3x[0].meas.rawae2.subwin[2].v_size;
708         pixel_num[3] = ispParams.isp_params_v3x[0].meas.rawae2.subwin[3].h_size * ispParams.isp_params_v3x[0].meas.rawae2.subwin[3].v_size;
709 
710         MergeAecSubWinStats(&statsInt->aec_stats.ae_data.chn[2].rawae_big, &left_stats->params.rawae2, &right_stats->params.rawae2,
711                             ispParams.isp_params_v3x[1].meas.rawae2.subwin_en, ispParams.isp_params_v3x[2].meas.rawae2.subwin_en,
712                             bls1_val, bls_ratio, pixel_num);
713 
714 
715         MergeAecHistBinStats(statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins, left_stats->params.rawhist2.hist_bin,
716                              right_stats->params.rawhist2.hist_bin, HistWinSplitMode[2], hist_bls1, hist_bls_ratio);
717 
718         for (int i = 0; i < ISP2X_HIST_BIN_N_MAX; i++) {
719             SumHistPix[0] += statsInt->aec_stats.ae_data.chn[0].rawhist_lite.bins[i];
720             SumHistPix[1] += statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins[i];
721             SumHistPix[2] += statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins[i];
722         }
723 
724         for (int i = 0; i < ISP2X_HIST_BIN_N_MAX; i++) {
725             HistMean[0] += (float)(statsInt->aec_stats.ae_data.chn[0].rawhist_lite.bins[i] * (i + 1)) / (float)SumHistPix[0];
726             HistMean[1] += (float)(statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins[i] * (i + 1)) / (float)SumHistPix[1];
727             HistMean[2] += (float)(statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins[i] * (i + 1)) / (float)SumHistPix[2];
728         }
729 
730         // NOTE: tmp use yuvae mean
731         statsInt->aec_stats.ae_data.yuvae.mean[0] = (uint8_t)HistMean[0];
732         statsInt->aec_stats.ae_data.yuvae.mean[1] = (uint8_t)HistMean[1];
733         statsInt->aec_stats.ae_data.yuvae.mean[2] = (uint8_t)HistMean[2];
734 
735         break;
736 
737     case AEC_RAWSWAP_MODE_M_LITE:
738         switch(ispParams.isp_params_v3x[0].meas.rawhist1.mode) {
739         case 2:
740             hist_bls1 = (bls1_val.r >> 2);
741             hist_bls_ratio = bls_ratio[0];
742             break;
743         case 3:
744             hist_bls1 = (bls1_val.gr >> 4);
745             hist_bls_ratio = bls_ratio[1];
746             break;
747         case 4:
748             hist_bls1 = (bls1_val.b >> 2);
749             hist_bls_ratio = bls_ratio[2];
750             break;
751         case 5:
752         default:
753             hist_bls1 = (s16)((bls1_val.gr >> 4) * 0.587 + (bls1_val.r >> 2) * 0.299 + (bls1_val.b >> 2) * 0.114 + 0.5);
754             hist_bls_ratio = (float)((1 << 8) - 1) / ((1 << 8) - 1 - hist_bls1);
755             break;
756         }
757 
758         meas_type = ((left_stats->meas_type >> 8) & (0x01)) & ((left_stats->meas_type >> 12) & (0x01));
759         statsInt->aec_stats_valid = (meas_type & 0x01) ? true : false;
760 
761         //chn 0 => rawae1 rawhist1
762         MergeAecWinBigStats(&statsInt->aec_stats.ae_data.chn[0].rawae_big, &left_stats->params.rawae1, &right_stats->params.rawae1, AeWinSplitMode[1], bls1_val, bls_ratio);
763 
764         pixel_num[0] = ispParams.isp_params_v3x[0].meas.rawae1.subwin[0].h_size * ispParams.isp_params_v3x[0].meas.rawae1.subwin[0].v_size;
765         pixel_num[1] = ispParams.isp_params_v3x[0].meas.rawae1.subwin[1].h_size * ispParams.isp_params_v3x[0].meas.rawae1.subwin[1].v_size;
766         pixel_num[2] = ispParams.isp_params_v3x[0].meas.rawae1.subwin[2].h_size * ispParams.isp_params_v3x[0].meas.rawae1.subwin[2].v_size;
767         pixel_num[3] = ispParams.isp_params_v3x[0].meas.rawae1.subwin[3].h_size * ispParams.isp_params_v3x[0].meas.rawae1.subwin[3].v_size;
768 
769         MergeAecSubWinStats(&statsInt->aec_stats.ae_data.chn[0].rawae_big, &left_stats->params.rawae1, &right_stats->params.rawae1,
770                             ispParams.isp_params_v3x[1].meas.rawae1.subwin_en, ispParams.isp_params_v3x[2].meas.rawae1.subwin_en,
771                             bls1_val, bls_ratio, pixel_num);
772         MergeAecHistBinStats(statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins, left_stats->params.rawhist1.hist_bin,
773                              right_stats->params.rawhist1.hist_bin, HistWinSplitMode[1], hist_bls1, hist_bls_ratio);
774 
775         //chn 1 => rawae0 rawhist0
776         MergeAecWinLiteStats(&statsInt->aec_stats.ae_data.chn[1].rawae_lite, &left_stats->params.rawae0, &right_stats->params.rawae0, AeWinSplitMode[0], bls1_val, bls_ratio);
777         MergeAecHistBinStats(statsInt->aec_stats.ae_data.chn[1].rawhist_lite.bins, left_stats->params.rawhist0.hist_bin,
778                              right_stats->params.rawhist0.hist_bin, HistWinSplitMode[0], hist_bls1, hist_bls_ratio);
779 
780         //chn 2 => rawae2 rawhist2
781         MergeAecWinBigStats(&statsInt->aec_stats.ae_data.chn[2].rawae_big, &left_stats->params.rawae2, &right_stats->params.rawae2, AeWinSplitMode[2], bls1_val, bls_ratio);
782 
783         pixel_num[0] = ispParams.isp_params_v3x[0].meas.rawae2.subwin[0].h_size * ispParams.isp_params_v3x[0].meas.rawae2.subwin[0].v_size;
784         pixel_num[1] = ispParams.isp_params_v3x[0].meas.rawae2.subwin[1].h_size * ispParams.isp_params_v3x[0].meas.rawae2.subwin[1].v_size;
785         pixel_num[2] = ispParams.isp_params_v3x[0].meas.rawae2.subwin[2].h_size * ispParams.isp_params_v3x[0].meas.rawae2.subwin[2].v_size;
786         pixel_num[3] = ispParams.isp_params_v3x[0].meas.rawae2.subwin[3].h_size * ispParams.isp_params_v3x[0].meas.rawae2.subwin[3].v_size;
787 
788         MergeAecSubWinStats(&statsInt->aec_stats.ae_data.chn[2].rawae_big, &left_stats->params.rawae2, &right_stats->params.rawae2,
789                             ispParams.isp_params_v3x[1].meas.rawae2.subwin_en, ispParams.isp_params_v3x[2].meas.rawae2.subwin_en,
790                             bls1_val, bls_ratio, pixel_num);
791         MergeAecHistBinStats(statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins, left_stats->params.rawhist2.hist_bin,
792                              right_stats->params.rawhist2.hist_bin, HistWinSplitMode[2], hist_bls1, hist_bls_ratio);
793 
794         for (int i = 0; i < ISP2X_HIST_BIN_N_MAX; i++) {
795             SumHistPix[0] += statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins[i];
796             SumHistPix[1] += statsInt->aec_stats.ae_data.chn[1].rawhist_lite.bins[i];
797             SumHistPix[2] += statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins[i];
798         }
799 
800         for (int i = 0; i < ISP2X_HIST_BIN_N_MAX; i++) {
801             HistMean[0] += (float)(statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins[i] * (i + 1)) / (float)SumHistPix[0];
802             HistMean[1] += (float)(statsInt->aec_stats.ae_data.chn[1].rawhist_lite.bins[i] * (i + 1)) / (float)SumHistPix[1];
803             HistMean[2] += (float)(statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins[i] * (i + 1)) / (float)SumHistPix[2];
804         }
805 
806         // NOTE: tmp use yuvae mean
807         statsInt->aec_stats.ae_data.yuvae.mean[0] = (uint8_t)HistMean[0];
808         statsInt->aec_stats.ae_data.yuvae.mean[1] = (uint8_t)HistMean[1];
809         statsInt->aec_stats.ae_data.yuvae.mean[2] = (uint8_t)HistMean[2];
810 
811         break;
812 
813     case AEC_RAWSWAP_MODE_L_LITE:
814         switch(ispParams.isp_params_v3x[0].meas.rawhist2.mode) {
815         case 2:
816             hist_bls1 = (bls1_val.r >> 2);
817             hist_bls_ratio = bls_ratio[0];
818             break;
819         case 3:
820             hist_bls1 = (bls1_val.gr >> 4);
821             hist_bls_ratio = bls_ratio[1];
822             break;
823         case 4:
824             hist_bls1 = (bls1_val.b >> 2);
825             hist_bls_ratio = bls_ratio[2];
826             break;
827         case 5:
828         default:
829             hist_bls1 = (s16)((bls1_val.gr >> 4) * 0.587 + (bls1_val.r >> 2) * 0.299 + (bls1_val.b >> 2) * 0.114 + 0.5);
830             hist_bls_ratio = (float)((1 << 8) - 1) / ((1 << 8) - 1 - hist_bls1);
831             break;
832         }
833 
834         meas_type = ((left_stats->meas_type >> 9) & (0x01)) & ((left_stats->meas_type >> 13) & (0x01));
835         statsInt->aec_stats_valid = (meas_type & 0x01) ? true : false;
836 
837         //chn 0 => rawae2 rawhist2
838         MergeAecWinBigStats(&statsInt->aec_stats.ae_data.chn[0].rawae_big, &left_stats->params.rawae2, &right_stats->params.rawae2, AeWinSplitMode[2], bls1_val, bls_ratio);
839         pixel_num[0] = ispParams.isp_params_v3x[0].meas.rawae2.subwin[0].h_size * ispParams.isp_params_v3x[0].meas.rawae2.subwin[0].v_size;
840         pixel_num[1] = ispParams.isp_params_v3x[0].meas.rawae2.subwin[1].h_size * ispParams.isp_params_v3x[0].meas.rawae2.subwin[1].v_size;
841         pixel_num[2] = ispParams.isp_params_v3x[0].meas.rawae2.subwin[2].h_size * ispParams.isp_params_v3x[0].meas.rawae2.subwin[2].v_size;
842         pixel_num[3] = ispParams.isp_params_v3x[0].meas.rawae2.subwin[3].h_size * ispParams.isp_params_v3x[0].meas.rawae2.subwin[3].v_size;
843         MergeAecSubWinStats(&statsInt->aec_stats.ae_data.chn[0].rawae_big, &left_stats->params.rawae2, &right_stats->params.rawae2,
844                             ispParams.isp_params_v3x[1].meas.rawae2.subwin_en, ispParams.isp_params_v3x[2].meas.rawae2.subwin_en,
845                             bls1_val, bls_ratio, pixel_num);
846         MergeAecHistBinStats(statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins, left_stats->params.rawhist2.hist_bin,
847                              right_stats->params.rawhist2.hist_bin, HistWinSplitMode[2], hist_bls1, hist_bls_ratio);
848 
849         //chn 1 => rawae1 rawhist1
850         MergeAecWinBigStats(&statsInt->aec_stats.ae_data.chn[1].rawae_big, &left_stats->params.rawae1, &right_stats->params.rawae1, AeWinSplitMode[1], bls1_val, bls_ratio);
851 
852         pixel_num[0] = ispParams.isp_params_v3x[0].meas.rawae1.subwin[0].h_size * ispParams.isp_params_v3x[0].meas.rawae1.subwin[0].v_size;
853         pixel_num[1] = ispParams.isp_params_v3x[0].meas.rawae1.subwin[1].h_size * ispParams.isp_params_v3x[0].meas.rawae1.subwin[1].v_size;
854         pixel_num[2] = ispParams.isp_params_v3x[0].meas.rawae1.subwin[2].h_size * ispParams.isp_params_v3x[0].meas.rawae1.subwin[2].v_size;
855         pixel_num[3] = ispParams.isp_params_v3x[0].meas.rawae1.subwin[3].h_size * ispParams.isp_params_v3x[0].meas.rawae1.subwin[3].v_size;
856         MergeAecSubWinStats(&statsInt->aec_stats.ae_data.chn[1].rawae_big, &left_stats->params.rawae1, &right_stats->params.rawae1,
857                             ispParams.isp_params_v3x[1].meas.rawae1.subwin_en, ispParams.isp_params_v3x[2].meas.rawae1.subwin_en,
858                             bls1_val, bls_ratio, pixel_num);
859         MergeAecHistBinStats(statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins, left_stats->params.rawhist1.hist_bin,
860                              right_stats->params.rawhist1.hist_bin, HistWinSplitMode[1], hist_bls1, hist_bls_ratio);
861 
862         //chn 2 => rawae0 rawhist0
863         MergeAecWinLiteStats(&statsInt->aec_stats.ae_data.chn[2].rawae_lite, &left_stats->params.rawae0, &right_stats->params.rawae0, AeWinSplitMode[0], bls1_val, bls_ratio);
864         MergeAecHistBinStats(statsInt->aec_stats.ae_data.chn[2].rawhist_lite.bins, left_stats->params.rawhist0.hist_bin,
865                              right_stats->params.rawhist0.hist_bin, HistWinSplitMode[0], hist_bls1, hist_bls_ratio);
866 
867         for (int i = 0; i < ISP2X_HIST_BIN_N_MAX; i++) {
868             SumHistPix[0] += statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins[i];
869             SumHistPix[1] += statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins[i];
870             SumHistPix[2] += statsInt->aec_stats.ae_data.chn[2].rawhist_lite.bins[i];
871         }
872 
873         for (int i = 0; i < ISP2X_HIST_BIN_N_MAX; i++) {
874             HistMean[0] += (float)(statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins[i] * (i + 1)) / (float)SumHistPix[0];
875             HistMean[1] += (float)(statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins[i] * (i + 1)) / (float)SumHistPix[1];
876             HistMean[2] += (float)(statsInt->aec_stats.ae_data.chn[2].rawhist_lite.bins[i] * (i + 1)) / (float)SumHistPix[2];
877         }
878 
879         // NOTE: tmp use yuvae mean
880         statsInt->aec_stats.ae_data.yuvae.mean[0] = (uint8_t)HistMean[0];
881         statsInt->aec_stats.ae_data.yuvae.mean[1] = (uint8_t)HistMean[1];
882         statsInt->aec_stats.ae_data.yuvae.mean[2] = (uint8_t)HistMean[2];
883 
884         break;
885 
886     default:
887         LOGE("wrong AeSwapMode=%d\n", AeSwapMode);
888         return XCAM_RETURN_ERROR_PARAM;
889         break;
890     }
891 
892     statsInt->af_prior = (AfUseAeBig == 0) ? false : true;
893 
894     if(!AfUseAeBig) {
895         switch(AeSelMode) {
896         case AEC_RAWSEL_MODE_CHN_0:
897         case AEC_RAWSEL_MODE_CHN_1:
898         case AEC_RAWSEL_MODE_CHN_2:
899             //chn 0 => rawae3 rawhist3
900             switch(ispParams.isp_params_v3x[0].meas.rawhist3.mode) {
901             case 2:
902                 hist_bls1 = (bls1_val.r >> 2);
903                 hist_bls_ratio = bls_ratio[0];
904                 break;
905             case 3:
906                 hist_bls1 = (bls1_val.gr >> 4);
907                 hist_bls_ratio = bls_ratio[1];
908                 break;
909             case 4:
910                 hist_bls1 = (bls1_val.b >> 2);
911                 hist_bls_ratio = bls_ratio[2];
912                 break;
913             case 5:
914             default:
915                 hist_bls1 = (s16)((bls1_val.gr >> 4) * 0.587 + (bls1_val.r >> 2) * 0.299 + (bls1_val.b >> 2) * 0.114 + 0.5);
916                 hist_bls_ratio = (float)((1 << 8) - 1) / ((1 << 8) - 1 - hist_bls1);
917                 break;
918             }
919 
920             MergeAecWinBigStats(&statsInt->aec_stats.ae_data.chn[AeSelMode].rawae_big, &left_stats->params.rawae3, &right_stats->params.rawae3, AeWinSplitMode[3], bls1_val, bls_ratio);
921             pixel_num[0] = ispParams.isp_params_v3x[0].meas.rawae3.subwin[0].h_size * ispParams.isp_params_v3x[0].meas.rawae3.subwin[0].v_size;
922             pixel_num[1] = ispParams.isp_params_v3x[0].meas.rawae3.subwin[1].h_size * ispParams.isp_params_v3x[0].meas.rawae3.subwin[1].v_size;
923             pixel_num[2] = ispParams.isp_params_v3x[0].meas.rawae3.subwin[2].h_size * ispParams.isp_params_v3x[0].meas.rawae3.subwin[2].v_size;
924             pixel_num[3] = ispParams.isp_params_v3x[0].meas.rawae3.subwin[3].h_size * ispParams.isp_params_v3x[0].meas.rawae3.subwin[3].v_size;
925             MergeAecSubWinStats(&statsInt->aec_stats.ae_data.chn[AeSelMode].rawae_big, &left_stats->params.rawae3, &right_stats->params.rawae3,
926                                 ispParams.isp_params_v3x[1].meas.rawae3.subwin_en, ispParams.isp_params_v3x[2].meas.rawae3.subwin_en,
927                                 bls1_val, bls_ratio, pixel_num);
928 
929             MergeAecHistBinStats(statsInt->aec_stats.ae_data.chn[AeSelMode].rawhist_big.bins, left_stats->params.rawhist3.hist_bin,
930                                  right_stats->params.rawhist3.hist_bin, HistWinSplitMode[3], hist_bls1, hist_bls_ratio);
931 
932             break;
933         case AEC_RAWSEL_MODE_TMO:
934 
935             bls1_val.r = 0;
936             bls1_val.gr = 0;
937             bls1_val.gb = 0;
938             bls1_val.b = 0;
939 
940             bls_ratio[0] = 1;
941             bls_ratio[1] = 1;
942             bls_ratio[2] = 1;
943 
944             //extra => rawae3 rawhist3
945             MergeAecWinBigStats(&statsInt->aec_stats.ae_data.extra.rawae_big, &left_stats->params.rawae3, &right_stats->params.rawae3, AeWinSplitMode[3], bls1_val, bls_ratio);
946             pixel_num[0] = ispParams.isp_params_v3x[0].meas.rawae3.subwin[0].h_size * ispParams.isp_params_v3x[0].meas.rawae3.subwin[0].v_size;
947             pixel_num[1] = ispParams.isp_params_v3x[0].meas.rawae3.subwin[1].h_size * ispParams.isp_params_v3x[0].meas.rawae3.subwin[1].v_size;
948             pixel_num[2] = ispParams.isp_params_v3x[0].meas.rawae3.subwin[2].h_size * ispParams.isp_params_v3x[0].meas.rawae3.subwin[2].v_size;
949             pixel_num[3] = ispParams.isp_params_v3x[0].meas.rawae3.subwin[3].h_size * ispParams.isp_params_v3x[0].meas.rawae3.subwin[3].v_size;
950             MergeAecSubWinStats(&statsInt->aec_stats.ae_data.extra.rawae_big, &left_stats->params.rawae3, &right_stats->params.rawae3,
951                                 ispParams.isp_params_v3x[1].meas.rawae3.subwin_en, ispParams.isp_params_v3x[2].meas.rawae3.subwin_en,
952                                 bls1_val, bls_ratio, pixel_num);
953             hist_bls1 = 0;
954             hist_bls_ratio = 1;
955 
956             MergeAecHistBinStats(statsInt->aec_stats.ae_data.extra.rawhist_big.bins, left_stats->params.rawhist3.hist_bin,
957                                  right_stats->params.rawhist3.hist_bin, HistWinSplitMode[3], hist_bls1, hist_bls_ratio);
958 
959             break;
960 
961         default:
962             LOGE("wrong AeSelMode=%d\n", AeSelMode);
963             return XCAM_RETURN_ERROR_PARAM;
964         }
965     }
966 
967 #ifdef AE_STATS_DEBUG
968     if(AeSwapMode != 0) {
969         for(int i = 0; i < 15; i++) {
970             for(int j = 0; j < 15; j++) {
971                 printf("chn0[%d,%d]:r 0x%x, g 0x%x, b 0x%x\n", i, j,
972                        statsInt->aec_stats.ae_data.chn[0].rawae_big.channelr_xy[i * 15 + j],
973                        statsInt->aec_stats.ae_data.chn[0].rawae_big.channelg_xy[i * 15 + j],
974                        statsInt->aec_stats.ae_data.chn[0].rawae_big.channelb_xy[i * 15 + j]);
975             }
976         }
977         printf("====================sub-win-result======================\n");
978 
979         for(int i = 0; i < 4; i++)
980             printf("chn0_subwin[%d]:sumr 0x%08lx, sumg 0x%08lx, sumb 0x%08lx\n", i,
981                    statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumr[i],
982                    statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumg[i],
983                    statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumb[i]);
984 
985         printf("====================hist_result========================\n");
986         for(int i = 0; i < 256; i++)
987             printf("bin[%d]= 0x%08x\n", i, statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins[i]);
988 
989     } else {
990         for(int i = 0; i < 5; i++) {
991             for(int j = 0; j < 5; j++) {
992                 printf("chn0[%d,%d]:r 0x%x, g 0x%x, b 0x%x\n", i, j,
993                        statsInt->aec_stats.ae_data.chn[0].rawae_lite.channelr_xy[i * 5 + j],
994                        statsInt->aec_stats.ae_data.chn[0].rawae_lite.channelg_xy[i * 5 + j],
995                        statsInt->aec_stats.ae_data.chn[0].rawae_lite.channelb_xy[i * 5 + j]);
996             }
997         }
998 
999         printf("====================hist_result========================\n");
1000         for(int i = 0; i < 256; i++)
1001             printf("bin[%d]= 0x%08x\n", i, statsInt->aec_stats.ae_data.chn[0].rawhist_lite.bins[i]);
1002 
1003     }
1004 #endif
1005 
1006     //expsoure params
1007     if (expParams.ptr()) {
1008 
1009         statsInt->aec_stats.ae_exp = expParams->data()->aecExpInfo;
1010 
1011         /*
1012          * printf("%s: L: [0x%x-0x%x], M: [0x%x-0x%x], S: [0x%x-0x%x]\n",
1013          *        __func__,
1014          *        expParams->data()->aecExpInfo.HdrExp[2].exp_sensor_params.coarse_integration_time,
1015          *        expParams->data()->aecExpInfo.HdrExp[2].exp_sensor_params.analog_gain_code_global,
1016          *        expParams->data()->aecExpInfo.HdrExp[1].exp_sensor_params.coarse_integration_time,
1017          *        expParams->data()->aecExpInfo.HdrExp[1].exp_sensor_params.analog_gain_code_global,
1018          *        expParams->data()->aecExpInfo.HdrExp[0].exp_sensor_params.coarse_integration_time,
1019          *        expParams->data()->aecExpInfo.HdrExp[0].exp_sensor_params.analog_gain_code_global);
1020          */
1021     }
1022 
1023     //iris params
1024     if (irisParams.ptr()) {
1025 
1026         float sof_time = (float)irisParams->data()->sofTime / 1000000000.0f;
1027         float start_time = (float)irisParams->data()->PIris.StartTim.tv_sec + (float)irisParams->data()->PIris.StartTim.tv_usec / 1000000.0f;
1028         float end_time = (float)irisParams->data()->PIris.EndTim.tv_sec + (float)irisParams->data()->PIris.EndTim.tv_usec / 1000000.0f;
1029         float frm_intval = 1 / (statsInt->aec_stats.ae_exp.pixel_clock_freq_mhz * 1000000.0f /
1030                                 (float)statsInt->aec_stats.ae_exp.line_length_pixels / (float)statsInt->aec_stats.ae_exp.frame_length_lines);
1031 
1032         /*printf("%s: step=%d,last-step=%d,start-tim=%f,end-tim=%f,sof_tim=%f\n",
1033             __func__,
1034             statsInt->aec_stats.ae_exp.Iris.PIris.step,
1035             irisParams->data()->PIris.laststep,start_time,end_time,sof_time);
1036         */
1037 
1038         if(sof_time < end_time + frm_intval)
1039             statsInt->aec_stats.ae_exp.Iris.PIris.step = irisParams->data()->PIris.laststep;
1040         else
1041             statsInt->aec_stats.ae_exp.Iris.PIris.step = irisParams->data()->PIris.step;
1042     }
1043 
1044     to->set_sequence(left_stats->frame_id);
1045 
1046     return ret;
1047 
1048 }
1049 
translateMultiAwbStats(const SmartPtr<VideoBuffer> & from,SmartPtr<RkAiqAwbStatsProxy> & to)1050 XCamReturn RkAiqResourceTranslatorV3x::translateMultiAwbStats(const SmartPtr<VideoBuffer>& from, SmartPtr<RkAiqAwbStatsProxy>& to)
1051 {
1052     XCamReturn ret = XCAM_RETURN_NO_ERROR;
1053     Isp20StatsBuffer* buf =
1054         from.get_cast_ptr<Isp20StatsBuffer>();
1055 
1056     SmartPtr<RkAiqAwbStats> statsInt = to->data();
1057 
1058     struct rkisp3x_isp_stat_buffer *left_stats;
1059     struct rkisp3x_isp_stat_buffer *right_stats;
1060 
1061     left_stats = (struct rkisp3x_isp_stat_buffer*)(buf->get_v4l2_userptr());
1062     if(left_stats == NULL) {
1063         LOGE("fail to get left stats ,ignore\n");
1064         return XCAM_RETURN_BYPASS;
1065     }
1066 
1067     right_stats = left_stats + 1;
1068     if(right_stats == NULL) {
1069         LOGE("fail to get right stats ,ignore\n");
1070         return XCAM_RETURN_BYPASS;
1071     }
1072 
1073     if (left_stats->frame_id != right_stats->frame_id || left_stats->meas_type != right_stats->meas_type) {
1074         LOGE_ANALYZER("status params(frmid or meas_type) of left isp and right isp are different");
1075     } else {
1076         LOGI_ANALYZER("stats: frame_id: %d,  meas_type; 0x%x", left_stats->frame_id, left_stats->meas_type);
1077     }
1078 
1079 
1080     statsInt->awb_stats_valid = left_stats->meas_type >> 5 & 1;
1081     if (!statsInt->awb_stats_valid) {
1082         LOGE_ANALYZER("AWB stats invalid, ignore");
1083         return XCAM_RETURN_BYPASS;
1084     }
1085 
1086     rkisp_effect_params_v20 ispParams;
1087     memset(&ispParams, 0, sizeof(ispParams));
1088     if (buf->getEffectiveIspParams(left_stats->frame_id, ispParams) < 0) {
1089         LOGE("fail to get ispParams ,ignore\n");
1090         return XCAM_RETURN_BYPASS;
1091     }
1092     rk_aiq_isp_blc_t *bls_cfg = &ispParams.blc_cfg.v0;
1093     statsInt->blc_cfg_effect = ispParams.blc_cfg.v0;
1094     //awb30
1095     statsInt->awb_stats_v3x.awb_cfg_effect_v201 = ispParams.awb_cfg_v3x;
1096     statsInt->awb_cfg_effect_valid = true;
1097     statsInt->frame_id = left_stats->frame_id;
1098 
1099     WinSplitMode AwbWinSplitMode = LEFT_AND_RIGHT_MODE;
1100 
1101     struct isp2x_window ori_win;
1102     ori_win.h_offs = ispParams.isp_params_v3x[0].meas.rawawb.sw_rawawb_h_offs;
1103     ori_win.h_size = ispParams.isp_params_v3x[0].meas.rawawb.sw_rawawb_h_size;
1104     ori_win.v_offs = ispParams.isp_params_v3x[0].meas.rawawb.sw_rawawb_v_offs;
1105     ori_win.v_size = ispParams.isp_params_v3x[0].meas.rawawb.sw_rawawb_v_size;
1106 
1107     JudgeWinLocation(&ori_win, AwbWinSplitMode, left_isp_rect_, right_isp_rect_);
1108 
1109     MergeAwbWinStats(statsInt->awb_stats_v3x.light, &left_stats->params.rawawb, &right_stats->params.rawawb,
1110                      statsInt->awb_stats_v3x.awb_cfg_effect_v201.lightNum, AwbWinSplitMode);
1111 
1112     struct isp2x_window left_win;
1113     left_win.h_offs = ispParams.isp_params_v3x[1].meas.rawawb.sw_rawawb_h_offs;
1114     left_win.h_size = ispParams.isp_params_v3x[1].meas.rawawb.sw_rawawb_h_size;
1115     left_win.v_offs = ispParams.isp_params_v3x[1].meas.rawawb.sw_rawawb_v_offs;
1116     left_win.v_size = ispParams.isp_params_v3x[1].meas.rawawb.sw_rawawb_v_size;
1117 
1118     struct isp2x_window right_win;
1119     right_win.h_offs = ispParams.isp_params_v3x[2].meas.rawawb.sw_rawawb_h_offs;
1120     right_win.h_size = ispParams.isp_params_v3x[2].meas.rawawb.sw_rawawb_h_size;
1121     right_win.v_offs = ispParams.isp_params_v3x[2].meas.rawawb.sw_rawawb_v_offs;
1122     right_win.v_size = ispParams.isp_params_v3x[2].meas.rawawb.sw_rawawb_v_size;
1123 
1124     // to fixed the bug in ic design that some egisters maybe overflow
1125     AwbStatOverflowCheckandFixed(&left_win,
1126                                  (rk_aiq_awb_blk_stat_mode_v201_t)ispParams.isp_params_v3x[1].meas.rawawb.sw_rawawb_blk_measure_mode,
1127                                  ispParams.isp_params_v3x[1].meas.rawawb.sw_rawawb_blk_with_luma_wei_en,
1128                                  (rk_aiq_awb_xy_type_v201_t)ispParams.isp_params_v3x[1].meas.rawawb.sw_rawawb_wp_hist_xytype,
1129                                  ispParams.isp_params_v3x[1].meas.rawawb.sw_rawawb_light_num, &left_stats->params.rawawb);
1130     AwbStatOverflowCheckandFixed(&right_win,
1131                                  (rk_aiq_awb_blk_stat_mode_v201_t)ispParams.isp_params_v3x[2].meas.rawawb.sw_rawawb_blk_measure_mode,
1132                                  ispParams.isp_params_v3x[2].meas.rawawb.sw_rawawb_blk_with_luma_wei_en,
1133                                  (rk_aiq_awb_xy_type_v201_t)ispParams.isp_params_v3x[2].meas.rawawb.sw_rawawb_wp_hist_xytype,
1134                                  ispParams.isp_params_v3x[2].meas.rawawb.sw_rawawb_light_num, &right_stats->params.rawawb);
1135 
1136 
1137     MergeAwbBlkStats(&ori_win, &left_win, &right_win, statsInt->awb_stats_v3x.blockResult, &left_stats->params.rawawb, &right_stats->params.rawawb, AwbWinSplitMode);
1138 
1139     MergeAwbHistBinStats(statsInt->awb_stats_v3x.WpNoHist, left_stats->params.rawawb.ro_yhist_bin, right_stats->params.rawawb.ro_yhist_bin, AwbWinSplitMode);
1140 
1141 #if defined(ISP_HW_V30)
1142     switch(AwbWinSplitMode) {
1143     case LEFT_MODE:
1144         for(int i = 0; i < statsInt->awb_stats_v3x.awb_cfg_effect_v201.lightNum; i++)
1145             statsInt->awb_stats_v3x.WpNo2[i] = left_stats->params.rawawb.ro_wp_num2[i];
1146         break;
1147     case RIGHT_MODE:
1148         for(int i = 0; i < statsInt->awb_stats_v3x.awb_cfg_effect_v201.lightNum; i++)
1149             statsInt->awb_stats_v3x.WpNo2[i] = right_stats->params.rawawb.ro_wp_num2[i];
1150         break;
1151     case LEFT_AND_RIGHT_MODE:
1152         for(int i = 0; i < statsInt->awb_stats_v3x.awb_cfg_effect_v201.lightNum; i++)
1153             statsInt->awb_stats_v3x.WpNo2[i] = left_stats->params.rawawb.ro_wp_num2[i] + right_stats->params.rawawb.ro_wp_num2[i];
1154         break;
1155     default:
1156         break;
1157     }
1158 
1159     MergeAwbMultiWinStats(&statsInt->awb_stats_v3x, &left_stats->params.rawawb, &right_stats->params.rawawb);
1160     MergeAwbExcWpStats( statsInt->awb_stats_v3x.excWpRangeResult, &left_stats->params.rawawb, &right_stats->params.rawawb, AwbWinSplitMode);
1161 
1162 #endif
1163 
1164     LOG1_AWB("bls_cfg %p", bls_cfg);
1165     if(bls_cfg) {
1166         LOG1_AWB("bls1_enalbe: %d, b r gb gr:[ %d %d %d %d]", bls_cfg->blc1_enable, bls_cfg->blc1_b,
1167                  bls_cfg->blc1_r, bls_cfg->blc1_gb, bls_cfg->blc1_gr);
1168     }
1169     if(bls_cfg && bls_cfg->blc1_enable && (bls_cfg->blc1_b > 0 || bls_cfg->blc1_r > 0 || bls_cfg->blc1_gb > 0 || bls_cfg->blc1_gr > 0)) {
1170 
1171         for(int i = 0; i < RK_AIQ_AWB_GRID_NUM_TOTAL; i++) {
1172             statsInt->awb_stats_v3x.blockResult[i].Rvalue -=
1173                 (long long)(statsInt->awb_stats_v3x.blockResult[i].WpNo * bls_cfg->blc1_r *
1174                             statsInt->awb_stats_v3x.awb_cfg_effect_v201.pre_wbgain_inv_r + 2048) >> 12 ;
1175             statsInt->awb_stats_v3x.blockResult[i].Gvalue -=
1176                 (long long)(statsInt->awb_stats_v3x.blockResult[i].WpNo * (bls_cfg->blc1_gr + bls_cfg->blc1_gb) *
1177                             statsInt->awb_stats_v3x.awb_cfg_effect_v201.pre_wbgain_inv_g + 4096) >> 13 ;
1178             statsInt->awb_stats_v3x.blockResult[i].Bvalue -=
1179                 (long long)(statsInt->awb_stats_v3x.blockResult[i].WpNo * bls_cfg->blc1_b  *
1180                             statsInt->awb_stats_v3x.awb_cfg_effect_v201.pre_wbgain_inv_b + 2048) >> 12 ; ;
1181         }
1182     }
1183 
1184     //statsInt->awb_stats_valid = ISP2X_STAT_RAWAWB(left_stats->meas_type)? true:false;
1185     statsInt->awb_stats_valid = left_stats->meas_type >> 5 & 1;
1186     to->set_sequence(left_stats->frame_id);
1187     return ret;
1188 
1189 }
1190 
1191 XCamReturn
translateMultiAdehazeStats(const SmartPtr<VideoBuffer> & from,SmartPtr<RkAiqAdehazeStatsProxy> & to)1192 RkAiqResourceTranslatorV3x::translateMultiAdehazeStats(const SmartPtr<VideoBuffer>& from, SmartPtr<RkAiqAdehazeStatsProxy>& to)
1193 {
1194 
1195     XCamReturn ret = XCAM_RETURN_NO_ERROR;
1196 
1197     Isp20StatsBuffer* buf =
1198         from.get_cast_ptr<Isp20StatsBuffer>();
1199 
1200     SmartPtr<RkAiqAdehazeStats> statsInt = to->data();
1201 
1202     struct rkisp3x_isp_stat_buffer *left_stats;
1203     struct rkisp3x_isp_stat_buffer *right_stats;
1204 
1205     left_stats = (struct rkisp3x_isp_stat_buffer*)(buf->get_v4l2_userptr());
1206     if(left_stats == NULL) {
1207         LOGE("fail to get left stats ,ignore\n");
1208         return XCAM_RETURN_BYPASS;
1209     }
1210 
1211     right_stats = left_stats + 1;
1212     if(right_stats == NULL) {
1213         LOGE("fail to get right stats ,ignore\n");
1214         return XCAM_RETURN_BYPASS;
1215     }
1216 
1217     if(left_stats->frame_id != right_stats->frame_id || left_stats->meas_type != right_stats->meas_type) {
1218         LOGE_ANALYZER("status params(frmid or meas_type) of left isp and right isp are different");
1219         return XCAM_RETURN_ERROR_PARAM;
1220     } else {
1221         LOGI_ANALYZER("stats: frame_id: %d,  meas_type; 0x%x", left_stats->frame_id, left_stats->meas_type);
1222     }
1223 
1224     //adehaze stats v3.x
1225     statsInt->adehaze_stats_valid = left_stats->meas_type >> 17 & 1;
1226     statsInt->frame_id = left_stats->frame_id;
1227 
1228     statsInt->adehaze_stats.dehaze_stats_v11_duo.dhaz_adp_air_base = (left_stats->params.dhaz.dhaz_adp_air_base + right_stats->params.dhaz.dhaz_adp_air_base) / 2;
1229     statsInt->adehaze_stats.dehaze_stats_v11_duo.dhaz_adp_wt = (left_stats->params.dhaz.dhaz_adp_wt + right_stats->params.dhaz.dhaz_adp_wt) / 2;
1230     statsInt->adehaze_stats.dehaze_stats_v11_duo.dhaz_adp_gratio = (left_stats->params.dhaz.dhaz_adp_gratio + right_stats->params.dhaz.dhaz_adp_gratio) / 2;
1231     statsInt->adehaze_stats.dehaze_stats_v11_duo.dhaz_adp_tmax = (left_stats->params.dhaz.dhaz_adp_tmax + right_stats->params.dhaz.dhaz_adp_tmax) / 2;
1232     statsInt->adehaze_stats.dehaze_stats_v11_duo.dhaz_pic_sumh_left = left_stats->params.dhaz.dhaz_adp_tmax;
1233     statsInt->adehaze_stats.dehaze_stats_v11_duo.dhaz_pic_sumh_right = right_stats->params.dhaz.dhaz_adp_tmax;
1234 
1235     unsigned int ro_pic_sumh_left = left_stats->params.dhaz.dhaz_pic_sumh;
1236     unsigned int ro_pic_sumh_right = right_stats->params.dhaz.dhaz_pic_sumh;
1237     unsigned int tmp = 0;
1238     for (int i = 0; i < ISP3X_DHAZ_HIST_IIR_NUM; i++) {
1239         tmp = (left_stats->params.dhaz.h_rgb_iir[i] * ro_pic_sumh_left + right_stats->params.dhaz.h_rgb_iir[i] * ro_pic_sumh_right)
1240               / (ro_pic_sumh_left + ro_pic_sumh_right);
1241         statsInt->adehaze_stats.dehaze_stats_v11_duo.h_rgb_iir[i] = tmp > ISP3X_DHAZ_HIST_IIR_MAX ? ISP3X_DHAZ_HIST_IIR_MAX : tmp;
1242     }
1243 
1244     return ret;
1245 }
1246 #endif
1247 
1248 XCamReturn
translateAecStats(const SmartPtr<VideoBuffer> & from,SmartPtr<RkAiqAecStatsProxy> & to)1249 RkAiqResourceTranslatorV3x::translateAecStats (const SmartPtr<VideoBuffer> &from, SmartPtr<RkAiqAecStatsProxy> &to)
1250 {
1251     XCamReturn ret = XCAM_RETURN_NO_ERROR;
1252 #if defined(ISP_HW_V30)
1253 
1254     Isp20StatsBuffer* buf =
1255         from.get_cast_ptr<Isp20StatsBuffer>();
1256     struct rkisp3x_isp_stat_buffer *stats;
1257     SmartPtr<RkAiqAecStats> statsInt = to->data();
1258 
1259 #if defined(RKAIQ_HAVE_MULTIISP)
1260     if (mIsMultiIsp) {
1261         return translateMultiAecStats(from, to);
1262     }
1263 #endif
1264 
1265     stats = (struct rkisp3x_isp_stat_buffer*)(buf->get_v4l2_userptr());
1266     if(stats == NULL) {
1267         LOGE("fail to get stats ,ignore\n");
1268         return XCAM_RETURN_BYPASS;
1269     }
1270     LOGI_ANALYZER("camId: %d, aec stats: frame_id: %d,  meas_type; 0x%x",
1271                   mCamPhyId, stats->frame_id, stats->meas_type);
1272 
1273     SmartPtr<RkAiqIrisParamsProxy> irisParams = buf->get_iris_params();
1274     SmartPtr<RkAiqSensorExpParamsProxy> expParams = nullptr;
1275     rkisp_effect_params_v20 ispParams;
1276     memset(&ispParams, 0, sizeof(ispParams));
1277     if (buf->getEffectiveExpParams(stats->frame_id, expParams) < 0)
1278         LOGE("fail to get expParams");
1279     if (buf->getEffectiveIspParams(stats->frame_id, ispParams) < 0) {
1280         LOGE("fail to get ispParams ,ignore\n");
1281         return XCAM_RETURN_BYPASS;
1282     }
1283 
1284     //ae stats v3.x
1285 
1286     statsInt->frame_id = stats->frame_id;
1287 
1288     /*rawae stats*/
1289     struct isp3x_isp_meas_cfg* isp_params = &ispParams.isp_params_v3x[0].meas;
1290     uint8_t AeSwapMode, AeSelMode, AfUseAeBig;
1291     AeSwapMode = isp_params->rawae0.rawae_sel;
1292     AeSelMode = isp_params->rawae3.rawae_sel;
1293     AfUseAeBig = isp_params->rawaf.ae_mode;
1294     unsigned int meas_type = 0;
1295 
1296     struct isp21_bls_cfg *bls_cfg = &ispParams.isp_params_v3x[0].others.bls_cfg;
1297     struct isp2x_bls_fixed_val bls1_val; //bls1_val = blc1_ori_val * awb * range_ratio
1298     float bls_ratio[3] = {1, 1, 1};
1299     u32 pixel_num = 0;
1300 
1301     if(bls_cfg->bls1_en) {
1302 
1303         bls1_val.r = bls_cfg->bls1_val.r >> 2;
1304         bls1_val.gr = bls_cfg->bls1_val.gr;
1305         bls1_val.gb = bls_cfg->bls1_val.gb;
1306         bls1_val.b = bls_cfg->bls1_val.b >> 2;
1307 
1308         bls_ratio[0] = (float)((1 << 12) - 1) / ((1 << 12) - 1 - bls_cfg->bls1_val.r);
1309         bls_ratio[1] = (float)((1 << 12) - 1) / ((1 << 12) - 1 - bls_cfg->bls1_val.gr);
1310         bls_ratio[2] = (float)((1 << 12) - 1) / ((1 << 12) - 1 - bls_cfg->bls1_val.b);
1311 
1312     } else {
1313 
1314         bls1_val.r = 0;
1315         bls1_val.gr = 0;
1316         bls1_val.gb = 0;
1317         bls1_val.b = 0;
1318 
1319     }
1320 
1321 #ifdef AE_STATS_DEBUG
1322     LOGE("bls1[%d-%d-%d-%d]", bls1_val.r, bls1_val.gr, bls1_val.gb, bls1_val.b);
1323     LOGE("bls_ratio[%f-%f-%f]", bls_ratio[0], bls_ratio[1], bls_ratio[2]);
1324 #endif
1325 
1326     uint64_t SumHistPix[3] = {0, 0, 0};
1327     float HistMean[3] = {0.0f, 0.0f, 0.0f};
1328 
1329     switch(AeSwapMode) {
1330     case AEC_RAWSWAP_MODE_S_LITE:
1331         meas_type = ((stats->meas_type >> 7) & (0x01)) & ((stats->meas_type >> 11) & (0x01));
1332         statsInt->aec_stats_valid = (meas_type & 0x01) ? true : false;
1333 
1334         for(int i = 0; i < ISP3X_RAWAEBIG_MEAN_NUM; i++) {
1335             if(i < ISP3X_RAWAELITE_MEAN_NUM) {
1336                 statsInt->aec_stats.ae_data.chn[0].rawae_lite.channelr_xy[i] = (u16)CLIP((stats->params.rawae0.data[i].channelr_xy - bls1_val.r) * bls_ratio[0], 0, MAX_10BITS);
1337                 statsInt->aec_stats.ae_data.chn[0].rawae_lite.channelg_xy[i] = (u16)CLIP((stats->params.rawae0.data[i].channelg_xy - bls1_val.gr) * bls_ratio[1], 0, MAX_12BITS);
1338                 statsInt->aec_stats.ae_data.chn[0].rawae_lite.channelb_xy[i] = (u16)CLIP((stats->params.rawae0.data[i].channelb_xy - bls1_val.b) * bls_ratio[2], 0, MAX_10BITS);
1339             }
1340             statsInt->aec_stats.ae_data.chn[1].rawae_big.channelr_xy[i] = (u16)CLIP((stats->params.rawae1.data[i].channelr_xy - bls1_val.r) * bls_ratio[0], 0, MAX_10BITS);
1341             statsInt->aec_stats.ae_data.chn[1].rawae_big.channelg_xy[i] = (u16)CLIP((stats->params.rawae1.data[i].channelg_xy - bls1_val.gr) * bls_ratio[1], 0, MAX_12BITS);
1342             statsInt->aec_stats.ae_data.chn[1].rawae_big.channelb_xy[i] = (u16)CLIP((stats->params.rawae1.data[i].channelb_xy - bls1_val.b) * bls_ratio[2], 0, MAX_10BITS);
1343             statsInt->aec_stats.ae_data.chn[2].rawae_big.channelr_xy[i] = (u16)CLIP((stats->params.rawae2.data[i].channelr_xy - bls1_val.r) * bls_ratio[0], 0, MAX_10BITS);
1344             statsInt->aec_stats.ae_data.chn[2].rawae_big.channelg_xy[i] = (u16)CLIP((stats->params.rawae2.data[i].channelg_xy - bls1_val.gr) * bls_ratio[1], 0, MAX_12BITS);
1345             statsInt->aec_stats.ae_data.chn[2].rawae_big.channelb_xy[i] = (u16)CLIP((stats->params.rawae2.data[i].channelb_xy - bls1_val.b) * bls_ratio[2], 0, MAX_10BITS);
1346 
1347             if(i < ISP3X_RAWAEBIG_SUBWIN_NUM) {
1348                 pixel_num = isp_params->rawae1.subwin[i].h_size * isp_params->rawae1.subwin[i].v_size;
1349                 statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumr[i] = CLIP((s64)((stats->params.rawae1.sumr[i] - (pixel_num >> 2) * bls1_val.r) * bls_ratio[0]), 0, MAX_29BITS);
1350                 statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumg[i] = CLIP((s64)((stats->params.rawae1.sumg[i] - (pixel_num >> 1) * bls1_val.gr) * bls_ratio[1]), 0, MAX_32BITS);
1351                 statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumb[i] = CLIP((s64)((stats->params.rawae1.sumb[i] - (pixel_num >> 2) * bls1_val.b) * bls_ratio[2]), 0, MAX_29BITS);
1352                 pixel_num = isp_params->rawae2.subwin[i].h_size * isp_params->rawae2.subwin[i].v_size;
1353                 statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumr[i] = CLIP((s64)((stats->params.rawae2.sumr[i] - (pixel_num >> 2) * bls1_val.r) * bls_ratio[0]), 0, MAX_29BITS);
1354                 statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumg[i] = CLIP((s64)((stats->params.rawae2.sumg[i] - (pixel_num >> 1) * bls1_val.gr) * bls_ratio[1]), 0, MAX_32BITS);
1355                 statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumb[i] = CLIP((s64)((stats->params.rawae2.sumb[i] - (pixel_num >> 2) * bls1_val.b) * bls_ratio[2]), 0, MAX_29BITS);
1356             }
1357         }
1358 
1359         if(bls_cfg->bls1_en) {
1360 
1361             memset(statsInt->aec_stats.ae_data.chn[0].rawhist_lite.bins, 0, ISP3X_HIST_BIN_N_MAX * sizeof(u32));
1362             memset(statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins, 0, ISP3X_HIST_BIN_N_MAX * sizeof(u32));
1363             memset(statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins, 0, ISP3X_HIST_BIN_N_MAX * sizeof(u32));
1364 
1365 
1366             for(int i = 0; i < ISP3X_HIST_BIN_N_MAX; i++) {
1367                 int tmp;
1368                 switch(isp_params->rawhist0.mode) {
1369                 case 2:
1370                     tmp = (i - (bls1_val.r >> 2) > 0) ? (i - (bls1_val.r >> 2)) * bls_ratio[0] + 0.5 : 0;
1371                     break;
1372                 case 3:
1373                     tmp = (i - (bls1_val.gr >> 4) > 0) ? (i - (bls1_val.gr >> 4)) * bls_ratio[1] + 0.5 : 0;
1374                     break;
1375                 case 4:
1376                     tmp = (i - (bls1_val.b >> 2) > 0) ? (i - (bls1_val.b >> 2)) * bls_ratio[2] + 0.5 : 0;
1377                     break;
1378                 case 5:
1379                 default:
1380                     s16 hist_bls1 = (s16)((bls1_val.gr >> 4) * 0.587 + (bls1_val.r >> 2) * 0.299 + (bls1_val.b >> 2) * 0.114 + 0.5);
1381                     float hist_bls_ratio = (float)((1 << 8) - 1) / ((1 << 8) - 1 - hist_bls1);
1382                     tmp = (i - hist_bls1 > 0) ? (i - hist_bls1) * hist_bls_ratio + 0.5 : 0;
1383                     break;
1384                 }
1385                 if(tmp > ISP3X_HIST_BIN_N_MAX - 1)
1386                     tmp = ISP3X_HIST_BIN_N_MAX - 1;
1387                 statsInt->aec_stats.ae_data.chn[0].rawhist_lite.bins[tmp] += stats->params.rawhist0.hist_bin[i];
1388                 statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins[tmp] += stats->params.rawhist1.hist_bin[i];
1389                 statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins[tmp] += stats->params.rawhist2.hist_bin[i];
1390 
1391                 SumHistPix[0] += stats->params.rawhist0.hist_bin[i];
1392                 SumHistPix[1] += stats->params.rawhist1.hist_bin[i];
1393                 SumHistPix[2] += stats->params.rawhist2.hist_bin[i];
1394             }
1395 
1396             for (int i = 0; i < ISP3X_HIST_BIN_N_MAX; i++) {
1397                 HistMean[0] += (float)(stats->params.rawhist0.hist_bin[i] * (i + 1)) / (float)SumHistPix[0];
1398                 HistMean[1] += (float)(stats->params.rawhist1.hist_bin[i] * (i + 1)) / (float)SumHistPix[1];
1399                 HistMean[2] += (float)(stats->params.rawhist2.hist_bin[i] * (i + 1)) / (float)SumHistPix[2];
1400             }
1401 
1402             // NOTE: tmp use yuvae mean
1403             statsInt->aec_stats.ae_data.yuvae.mean[0] = (uint8_t)HistMean[0];
1404             statsInt->aec_stats.ae_data.yuvae.mean[1] = (uint8_t)HistMean[1];
1405             statsInt->aec_stats.ae_data.yuvae.mean[2] = (uint8_t)HistMean[2];
1406         } else {
1407             memcpy(statsInt->aec_stats.ae_data.chn[0].rawhist_lite.bins, stats->params.rawhist0.hist_bin, ISP3X_HIST_BIN_N_MAX * sizeof(u32));
1408             memcpy(statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins, stats->params.rawhist1.hist_bin, ISP3X_HIST_BIN_N_MAX * sizeof(u32));
1409             memcpy(statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins, stats->params.rawhist2.hist_bin, ISP3X_HIST_BIN_N_MAX * sizeof(u32));
1410 
1411 
1412             for (int i = 0; i < ISP2X_HIST_BIN_N_MAX; i++) {
1413                 SumHistPix[0] += statsInt->aec_stats.ae_data.chn[0].rawhist_lite.bins[i];
1414                 SumHistPix[1] += statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins[i];
1415                 SumHistPix[2] += statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins[i];
1416             }
1417 
1418             for (int i = 0; i < ISP2X_HIST_BIN_N_MAX; i++) {
1419                 HistMean[0] += (float)(statsInt->aec_stats.ae_data.chn[0].rawhist_lite.bins[i] * (i + 1)) / (float)SumHistPix[0];
1420                 HistMean[1] += (float)(statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins[i] * (i + 1)) / (float)SumHistPix[1];
1421                 HistMean[2] += (float)(statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins[i] * (i + 1)) / (float)SumHistPix[2];
1422             }
1423 
1424             // NOTE: tmp use yuvae mean
1425             statsInt->aec_stats.ae_data.yuvae.mean[0] = (uint8_t)HistMean[0];
1426             statsInt->aec_stats.ae_data.yuvae.mean[1] = (uint8_t)HistMean[1];
1427             statsInt->aec_stats.ae_data.yuvae.mean[2] = (uint8_t)HistMean[2];
1428 
1429         }
1430 
1431         break;
1432 
1433     case AEC_RAWSWAP_MODE_M_LITE:
1434         meas_type = ((stats->meas_type >> 8) & (0x01)) & ((stats->meas_type >> 12) & (0x01));
1435         statsInt->aec_stats_valid = (meas_type & 0x01) ? true : false;
1436 
1437         for(int i = 0; i < ISP3X_RAWAEBIG_MEAN_NUM; i++) {
1438             if(i < ISP3X_RAWAELITE_MEAN_NUM) {
1439                 statsInt->aec_stats.ae_data.chn[1].rawae_lite.channelr_xy[i] = (u16)CLIP((stats->params.rawae0.data[i].channelr_xy - bls1_val.r) * bls_ratio[0], 0, MAX_10BITS);
1440                 statsInt->aec_stats.ae_data.chn[1].rawae_lite.channelg_xy[i] = (u16)CLIP((stats->params.rawae0.data[i].channelg_xy - bls1_val.gr) * bls_ratio[1], 0, MAX_12BITS);
1441                 statsInt->aec_stats.ae_data.chn[1].rawae_lite.channelb_xy[i] = (u16)CLIP((stats->params.rawae0.data[i].channelb_xy - bls1_val.b) * bls_ratio[2], 0, MAX_10BITS);
1442             }
1443             statsInt->aec_stats.ae_data.chn[0].rawae_big.channelr_xy[i] = (u16)CLIP((stats->params.rawae1.data[i].channelr_xy - bls1_val.r) * bls_ratio[0], 0, MAX_10BITS);
1444             statsInt->aec_stats.ae_data.chn[0].rawae_big.channelg_xy[i] = (u16)CLIP((stats->params.rawae1.data[i].channelg_xy - bls1_val.gr) * bls_ratio[1], 0, MAX_12BITS);
1445             statsInt->aec_stats.ae_data.chn[0].rawae_big.channelb_xy[i] = (u16)CLIP((stats->params.rawae1.data[i].channelb_xy - bls1_val.b) * bls_ratio[2], 0, MAX_10BITS);
1446             statsInt->aec_stats.ae_data.chn[2].rawae_big.channelr_xy[i] = (u16)CLIP((stats->params.rawae2.data[i].channelr_xy - bls1_val.r) * bls_ratio[0], 0, MAX_10BITS);
1447             statsInt->aec_stats.ae_data.chn[2].rawae_big.channelg_xy[i] = (u16)CLIP((stats->params.rawae2.data[i].channelg_xy - bls1_val.gr) * bls_ratio[1], 0, MAX_12BITS);
1448             statsInt->aec_stats.ae_data.chn[2].rawae_big.channelb_xy[i] = (u16)CLIP((stats->params.rawae2.data[i].channelb_xy - bls1_val.b) * bls_ratio[2], 0, MAX_10BITS);
1449 
1450             if(i < ISP3X_RAWAEBIG_SUBWIN_NUM) {
1451                 pixel_num = isp_params->rawae1.subwin[i].h_size * isp_params->rawae1.subwin[i].v_size;
1452                 statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumr[i] = CLIP((s64)((stats->params.rawae1.sumr[i] - (pixel_num >> 2) * bls1_val.r) * bls_ratio[0]), 0, MAX_29BITS);
1453                 statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumg[i] = CLIP((s64)((stats->params.rawae1.sumg[i] - (pixel_num >> 1) * bls1_val.gr) * bls_ratio[1]), 0, MAX_32BITS);
1454                 statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumb[i] = CLIP((s64)((stats->params.rawae1.sumb[i] - (pixel_num >> 2) * bls1_val.b) * bls_ratio[2]), 0, MAX_29BITS);
1455 
1456                 pixel_num = isp_params->rawae2.subwin[i].h_size * isp_params->rawae2.subwin[i].v_size;
1457                 statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumr[i] = CLIP((s64)((stats->params.rawae2.sumr[i] - (pixel_num >> 2) * bls1_val.r) * bls_ratio[0]), 0, MAX_29BITS);
1458                 statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumg[i] = CLIP((s64)((stats->params.rawae2.sumg[i] - (pixel_num >> 1) * bls1_val.gr) * bls_ratio[1]), 0, MAX_32BITS);
1459                 statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumb[i] = CLIP((s64)((stats->params.rawae2.sumb[i] - (pixel_num >> 2) * bls1_val.b) * bls_ratio[2]), 0, MAX_29BITS);
1460             }
1461         }
1462 
1463         if(bls_cfg->bls1_en) {
1464 
1465             memset(statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins, 0, ISP3X_HIST_BIN_N_MAX * sizeof(u32));
1466             memset(statsInt->aec_stats.ae_data.chn[1].rawhist_lite.bins, 0, ISP3X_HIST_BIN_N_MAX * sizeof(u32));
1467             memset(statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins, 0, ISP3X_HIST_BIN_N_MAX * sizeof(u32));
1468 
1469             for(int i = 0; i < ISP3X_HIST_BIN_N_MAX; i++) {
1470                 int tmp;
1471                 switch(isp_params->rawhist1.mode) {
1472                 case 2:
1473                     tmp = (i - (bls1_val.r >> 2) > 0) ? (i - (bls1_val.r >> 2)) * bls_ratio[0] + 0.5 : 0;
1474                     break;
1475                 case 3:
1476                     tmp = (i - (bls1_val.gr >> 4) > 0) ? (i - (bls1_val.gr >> 4)) * bls_ratio[1] + 0.5 : 0;
1477                     break;
1478                 case 4:
1479                     tmp = (i - (bls1_val.b >> 2) > 0) ? (i - (bls1_val.b >> 2)) * bls_ratio[2] + 0.5 : 0;
1480                     break;
1481                 case 5:
1482                 default:
1483                     s16 hist_bls1 = (s16)((bls1_val.gr >> 4) * 0.587 + (bls1_val.r >> 2) * 0.299 + (bls1_val.b >> 2) * 0.114 + 0.5);
1484                     float hist_bls_ratio = (float)((1 << 8) - 1) / ((1 << 8) - 1 - hist_bls1);
1485                     tmp = (i - hist_bls1 > 0) ? (i - hist_bls1) * hist_bls_ratio + 0.5 : 0;
1486                     break;
1487                 }
1488                 if(tmp > ISP3X_HIST_BIN_N_MAX - 1)
1489                     tmp = ISP3X_HIST_BIN_N_MAX - 1;
1490                 statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins[tmp] += stats->params.rawhist1.hist_bin[i];
1491                 statsInt->aec_stats.ae_data.chn[1].rawhist_lite.bins[tmp] += stats->params.rawhist0.hist_bin[i];
1492                 statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins[tmp] += stats->params.rawhist2.hist_bin[i];
1493 
1494                 SumHistPix[0] += stats->params.rawhist0.hist_bin[i];
1495                 SumHistPix[1] += stats->params.rawhist1.hist_bin[i];
1496                 SumHistPix[2] += stats->params.rawhist2.hist_bin[i];
1497             }
1498 
1499             for (int i = 0; i < ISP3X_HIST_BIN_N_MAX; i++) {
1500                 HistMean[0] += (float)(stats->params.rawhist0.hist_bin[i] * (i + 1)) / (float)SumHistPix[0];
1501                 HistMean[1] += (float)(stats->params.rawhist1.hist_bin[i] * (i + 1)) / (float)SumHistPix[1];
1502                 HistMean[2] += (float)(stats->params.rawhist2.hist_bin[i] * (i + 1)) / (float)SumHistPix[2];
1503             }
1504 
1505             // NOTE: tmp use yuvae mean
1506             statsInt->aec_stats.ae_data.yuvae.mean[0] = (uint8_t)HistMean[1];
1507             statsInt->aec_stats.ae_data.yuvae.mean[1] = (uint8_t)HistMean[0];
1508             statsInt->aec_stats.ae_data.yuvae.mean[2] = (uint8_t)HistMean[2];
1509 
1510 
1511         } else {
1512             memcpy(statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins, stats->params.rawhist1.hist_bin, ISP3X_HIST_BIN_N_MAX * sizeof(u32));
1513             memcpy(statsInt->aec_stats.ae_data.chn[1].rawhist_lite.bins, stats->params.rawhist0.hist_bin, ISP3X_HIST_BIN_N_MAX * sizeof(u32));
1514             memcpy(statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins, stats->params.rawhist2.hist_bin, ISP3X_HIST_BIN_N_MAX * sizeof(u32));
1515 
1516 
1517             for (int i = 0; i < ISP2X_HIST_BIN_N_MAX; i++) {
1518                 SumHistPix[0] += statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins[i];
1519                 SumHistPix[1] += statsInt->aec_stats.ae_data.chn[1].rawhist_lite.bins[i];
1520                 SumHistPix[2] += statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins[i];
1521             }
1522 
1523             for (int i = 0; i < ISP2X_HIST_BIN_N_MAX; i++) {
1524                 HistMean[0] += (float)(statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins[i] * (i + 1)) / (float)SumHistPix[0];
1525                 HistMean[1] += (float)(statsInt->aec_stats.ae_data.chn[1].rawhist_lite.bins[i] * (i + 1)) / (float)SumHistPix[1];
1526                 HistMean[2] += (float)(statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins[i] * (i + 1)) / (float)SumHistPix[2];
1527             }
1528 
1529             // NOTE: tmp use yuvae mean
1530             statsInt->aec_stats.ae_data.yuvae.mean[0] = (uint8_t)HistMean[0];
1531             statsInt->aec_stats.ae_data.yuvae.mean[1] = (uint8_t)HistMean[1];
1532             statsInt->aec_stats.ae_data.yuvae.mean[2] = (uint8_t)HistMean[2];
1533 
1534         }
1535 
1536         break;
1537 
1538     case AEC_RAWSWAP_MODE_L_LITE:
1539         meas_type = ((stats->meas_type >> 9) & (0x01)) & ((stats->meas_type >> 13) & (0x01));
1540         statsInt->aec_stats_valid = (meas_type & 0x01) ? true : false;
1541 
1542         for(int i = 0; i < ISP3X_RAWAEBIG_MEAN_NUM; i++) {
1543             if(i < ISP3X_RAWAELITE_MEAN_NUM) {
1544                 statsInt->aec_stats.ae_data.chn[2].rawae_lite.channelr_xy[i] = (u16)CLIP((stats->params.rawae0.data[i].channelr_xy - bls1_val.r) * bls_ratio[0], 0, MAX_10BITS);
1545                 statsInt->aec_stats.ae_data.chn[2].rawae_lite.channelg_xy[i] = (u16)CLIP((stats->params.rawae0.data[i].channelg_xy - bls1_val.gr) * bls_ratio[1], 0, MAX_12BITS);
1546                 statsInt->aec_stats.ae_data.chn[2].rawae_lite.channelb_xy[i] = (u16)CLIP((stats->params.rawae0.data[i].channelb_xy - bls1_val.b) * bls_ratio[2], 0, MAX_10BITS);
1547             }
1548             statsInt->aec_stats.ae_data.chn[0].rawae_big.channelr_xy[i] = (u16)CLIP((stats->params.rawae2.data[i].channelr_xy - bls1_val.r) * bls_ratio[0], 0, MAX_10BITS);
1549             statsInt->aec_stats.ae_data.chn[0].rawae_big.channelg_xy[i] = (u16)CLIP((stats->params.rawae2.data[i].channelg_xy - bls1_val.gr) * bls_ratio[1], 0, MAX_12BITS);
1550             statsInt->aec_stats.ae_data.chn[0].rawae_big.channelb_xy[i] = (u16)CLIP((stats->params.rawae2.data[i].channelb_xy - bls1_val.b) * bls_ratio[2], 0, MAX_10BITS);
1551             statsInt->aec_stats.ae_data.chn[1].rawae_big.channelr_xy[i] = (u16)CLIP((stats->params.rawae1.data[i].channelr_xy - bls1_val.r) * bls_ratio[0], 0, MAX_10BITS);
1552             statsInt->aec_stats.ae_data.chn[1].rawae_big.channelg_xy[i] = (u16)CLIP((stats->params.rawae1.data[i].channelg_xy - bls1_val.gr) * bls_ratio[1], 0, MAX_12BITS);
1553             statsInt->aec_stats.ae_data.chn[1].rawae_big.channelb_xy[i] = (u16)CLIP((stats->params.rawae1.data[i].channelb_xy - bls1_val.b) * bls_ratio[2], 0, MAX_10BITS);
1554 
1555             if(i < ISP3X_RAWAEBIG_SUBWIN_NUM) {
1556                 pixel_num = isp_params->rawae2.subwin[i].h_size * isp_params->rawae2.subwin[i].v_size;
1557                 statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumr[i] = CLIP((s64)((stats->params.rawae2.sumr[i] - (pixel_num >> 2) * bls1_val.r) * bls_ratio[0]), 0, MAX_29BITS);
1558                 statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumg[i] = CLIP((s64)((stats->params.rawae2.sumg[i] - (pixel_num >> 1) * bls1_val.gr) * bls_ratio[1]), 0, MAX_32BITS);
1559                 statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumb[i] = CLIP((s64)((stats->params.rawae2.sumb[i] - (pixel_num >> 2) * bls1_val.b) * bls_ratio[2]), 0, MAX_29BITS);
1560 
1561                 pixel_num = isp_params->rawae1.subwin[i].h_size * isp_params->rawae1.subwin[i].v_size;
1562                 statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumr[i] = CLIP((s64)((stats->params.rawae1.sumr[i] - (pixel_num >> 2) * bls1_val.r) * bls_ratio[0]), 0, MAX_29BITS);
1563                 statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumg[i] = CLIP((s64)((stats->params.rawae1.sumg[i] - (pixel_num >> 1) * bls1_val.gr) * bls_ratio[1]), 0, MAX_32BITS);
1564                 statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumb[i] = CLIP((s64)((stats->params.rawae1.sumb[i] - (pixel_num >> 2) * bls1_val.b) * bls_ratio[2]), 0, MAX_29BITS);
1565             }
1566         }
1567 
1568         if(bls_cfg->bls1_en) {
1569 
1570             memset(statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins, 0, ISP3X_HIST_BIN_N_MAX * sizeof(u32));
1571             memset(statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins, 0, ISP3X_HIST_BIN_N_MAX * sizeof(u32));
1572             memset(statsInt->aec_stats.ae_data.chn[2].rawhist_lite.bins, 0, ISP3X_HIST_BIN_N_MAX * sizeof(u32));
1573 
1574             for(int i = 0; i < ISP3X_HIST_BIN_N_MAX; i++) {
1575                 int tmp;
1576                 switch(isp_params->rawhist2.mode) {
1577                 case 2:
1578                     tmp = (i - (bls1_val.r >> 2) > 0) ? (i - (bls1_val.r >> 2)) * bls_ratio[0] + 0.5 : 0;
1579                     break;
1580                 case 3:
1581                     tmp = (i - (bls1_val.gr >> 4) > 0) ? (i - (bls1_val.gr >> 4)) * bls_ratio[1] + 0.5 : 0;
1582                     break;
1583                 case 4:
1584                     tmp = (i - (bls1_val.b >> 2) > 0) ? (i - (bls1_val.b >> 2)) * bls_ratio[2] + 0.5 : 0;
1585                     break;
1586                 case 5:
1587                 default:
1588                     s16 hist_bls1 = (s16)((bls1_val.gr >> 4) * 0.587 + (bls1_val.r >> 2) * 0.299 + (bls1_val.b >> 2) * 0.114 + 0.5);
1589                     float hist_bls_ratio = (float)((1 << 8) - 1) / ((1 << 8) - 1 - hist_bls1);
1590                     tmp = (i - hist_bls1 > 0) ? (i - hist_bls1) * hist_bls_ratio + 0.5 : 0;
1591                     break;
1592                 }
1593                 if(tmp > ISP3X_HIST_BIN_N_MAX - 1)
1594                     tmp = ISP3X_HIST_BIN_N_MAX - 1;
1595                 statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins[tmp] += stats->params.rawhist2.hist_bin[i];
1596                 statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins[tmp] += stats->params.rawhist1.hist_bin[i];
1597                 statsInt->aec_stats.ae_data.chn[2].rawhist_lite.bins[tmp] += stats->params.rawhist0.hist_bin[i];
1598 
1599                 SumHistPix[0] += stats->params.rawhist0.hist_bin[i];
1600                 SumHistPix[1] += stats->params.rawhist1.hist_bin[i];
1601                 SumHistPix[2] += stats->params.rawhist2.hist_bin[i];
1602             }
1603 
1604             for (int i = 0; i < ISP3X_HIST_BIN_N_MAX; i++) {
1605                 HistMean[0] += (float)(stats->params.rawhist0.hist_bin[i] * (i + 1)) / (float)SumHistPix[0];
1606                 HistMean[1] += (float)(stats->params.rawhist1.hist_bin[i] * (i + 1)) / (float)SumHistPix[1];
1607                 HistMean[2] += (float)(stats->params.rawhist2.hist_bin[i] * (i + 1)) / (float)SumHistPix[2];
1608             }
1609 
1610             // NOTE: tmp use yuvae mean
1611             statsInt->aec_stats.ae_data.yuvae.mean[0] = (uint8_t)HistMean[2];
1612             statsInt->aec_stats.ae_data.yuvae.mean[1] = (uint8_t)HistMean[1];
1613             statsInt->aec_stats.ae_data.yuvae.mean[2] = (uint8_t)HistMean[0];
1614 
1615         } else {
1616             memcpy(statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins, stats->params.rawhist2.hist_bin, ISP3X_HIST_BIN_N_MAX * sizeof(u32));
1617             memcpy(statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins, stats->params.rawhist1.hist_bin, ISP3X_HIST_BIN_N_MAX * sizeof(u32));
1618             memcpy(statsInt->aec_stats.ae_data.chn[2].rawhist_lite.bins, stats->params.rawhist0.hist_bin, ISP3X_HIST_BIN_N_MAX * sizeof(u32));
1619 
1620             for (int i = 0; i < ISP2X_HIST_BIN_N_MAX; i++) {
1621                 SumHistPix[0] += statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins[i];
1622                 SumHistPix[1] += statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins[i];
1623                 SumHistPix[2] += statsInt->aec_stats.ae_data.chn[2].rawhist_lite.bins[i];
1624             }
1625 
1626             for (int i = 0; i < ISP2X_HIST_BIN_N_MAX; i++) {
1627                 HistMean[0] += (float)(statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins[i] * (i + 1)) / (float)SumHistPix[0];
1628                 HistMean[1] += (float)(statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins[i] * (i + 1)) / (float)SumHistPix[1];
1629                 HistMean[2] += (float)(statsInt->aec_stats.ae_data.chn[2].rawhist_lite.bins[i] * (i + 1)) / (float)SumHistPix[2];
1630             }
1631 
1632             // NOTE: tmp use yuvae mean
1633             statsInt->aec_stats.ae_data.yuvae.mean[0] = (uint8_t)HistMean[0];
1634             statsInt->aec_stats.ae_data.yuvae.mean[1] = (uint8_t)HistMean[1];
1635             statsInt->aec_stats.ae_data.yuvae.mean[2] = (uint8_t)HistMean[2];
1636 
1637         }
1638         break;
1639 
1640     default:
1641         LOGE("wrong AeSwapMode=%d\n", AeSwapMode);
1642         return XCAM_RETURN_ERROR_PARAM;
1643         break;
1644     }
1645 
1646     statsInt->af_prior = (AfUseAeBig == 0) ? false : true;
1647 
1648     if(!AfUseAeBig) {
1649         switch(AeSelMode) {
1650         case AEC_RAWSEL_MODE_CHN_0:
1651         case AEC_RAWSEL_MODE_CHN_1:
1652         case AEC_RAWSEL_MODE_CHN_2:
1653             for(int i = 0; i < ISP3X_RAWAEBIG_MEAN_NUM; i++) {
1654 
1655                 statsInt->aec_stats.ae_data.chn[AeSelMode].rawae_big.channelr_xy[i] = (u16)CLIP((stats->params.rawae3.data[i].channelr_xy - bls1_val.r) * bls_ratio[0], 0, MAX_10BITS);
1656                 statsInt->aec_stats.ae_data.chn[AeSelMode].rawae_big.channelg_xy[i] = (u16)CLIP((stats->params.rawae3.data[i].channelg_xy - bls1_val.gr) * bls_ratio[1], 0, MAX_12BITS);
1657                 statsInt->aec_stats.ae_data.chn[AeSelMode].rawae_big.channelb_xy[i] = (u16)CLIP((stats->params.rawae3.data[i].channelb_xy - bls1_val.b) * bls_ratio[2], 0, MAX_10BITS);
1658 
1659                 if(i < ISP3X_RAWAEBIG_SUBWIN_NUM) {
1660                     pixel_num = isp_params->rawae3.subwin[i].h_size * isp_params->rawae3.subwin[i].v_size;
1661                     statsInt->aec_stats.ae_data.chn[AeSelMode].rawae_big.wndx_sumr[i] = CLIP((s64)((stats->params.rawae3.sumr[i] - (pixel_num >> 2) * bls1_val.r) * bls_ratio[0]), 0, MAX_29BITS);
1662                     statsInt->aec_stats.ae_data.chn[AeSelMode].rawae_big.wndx_sumg[i] = CLIP((s64)((stats->params.rawae3.sumg[i] - (pixel_num >> 1) * bls1_val.gr) * bls_ratio[1]), 0, MAX_32BITS);
1663                     statsInt->aec_stats.ae_data.chn[AeSelMode].rawae_big.wndx_sumb[i] = CLIP((s64)((stats->params.rawae3.sumb[i] - (pixel_num >> 2) * bls1_val.b) * bls_ratio[2]), 0, MAX_29BITS);
1664                 }
1665             }
1666 
1667             if(bls_cfg->bls1_en) {
1668                 memset(statsInt->aec_stats.ae_data.chn[AeSelMode].rawhist_big.bins, 0, ISP3X_HIST_BIN_N_MAX * sizeof(u32));
1669                 for(int i = 0; i < ISP3X_HIST_BIN_N_MAX; i++) {
1670                     int tmp;
1671                     switch(isp_params->rawhist3.mode) {
1672                     case 2:
1673                         tmp = (i - (bls1_val.r >> 2) > 0) ? (i - (bls1_val.r >> 2)) * bls_ratio[0] + 0.5 : 0;
1674                         break;
1675                     case 3:
1676                         tmp = (i - (bls1_val.gr >> 4) > 0) ? (i - (bls1_val.gr >> 4)) * bls_ratio[1] + 0.5 : 0;
1677                         break;
1678                     case 4:
1679                         tmp = (i - (bls1_val.b >> 2) > 0) ? (i - (bls1_val.b >> 2)) * bls_ratio[2] + 0.5 : 0;
1680                         break;
1681                     case 5:
1682                     default:
1683                         s16 hist_bls1 = (s16)((bls1_val.gr >> 4) * 0.587 + (bls1_val.r >> 2) * 0.299 + (bls1_val.b >> 2) * 0.114 + 0.5);
1684                         float hist_bls_ratio = (float)((1 << 8) - 1) / ((1 << 8) - 1 - hist_bls1);
1685                         tmp = (i - hist_bls1 > 0) ? (i - hist_bls1) * hist_bls_ratio + 0.5 : 0;
1686                         break;
1687                     }
1688                     if(tmp > ISP3X_HIST_BIN_N_MAX - 1)
1689                         tmp = ISP3X_HIST_BIN_N_MAX - 1;
1690                     statsInt->aec_stats.ae_data.chn[AeSelMode].rawhist_big.bins[tmp] += stats->params.rawhist3.hist_bin[i];
1691                 }
1692             } else {
1693                 memcpy(statsInt->aec_stats.ae_data.chn[AeSelMode].rawhist_big.bins, stats->params.rawhist3.hist_bin, ISP3X_HIST_BIN_N_MAX * sizeof(u32));
1694             }
1695             break;
1696         case AEC_RAWSEL_MODE_TMO:
1697             for(int i = 0; i < ISP3X_RAWAEBIG_MEAN_NUM; i++) {
1698 
1699                 statsInt->aec_stats.ae_data.extra.rawae_big.channelr_xy[i] = stats->params.rawae3.data[i].channelr_xy;
1700                 statsInt->aec_stats.ae_data.extra.rawae_big.channelg_xy[i] = stats->params.rawae3.data[i].channelg_xy;
1701                 statsInt->aec_stats.ae_data.extra.rawae_big.channelb_xy[i] = stats->params.rawae3.data[i].channelb_xy;
1702 
1703                 if(i < ISP3X_RAWAEBIG_SUBWIN_NUM) {
1704                     statsInt->aec_stats.ae_data.extra.rawae_big.wndx_sumr[i] = stats->params.rawae3.sumr[i];
1705                     statsInt->aec_stats.ae_data.extra.rawae_big.wndx_sumg[i] = stats->params.rawae3.sumg[i];
1706                     statsInt->aec_stats.ae_data.extra.rawae_big.wndx_sumb[i] = stats->params.rawae3.sumb[i];
1707                 }
1708             }
1709             memcpy(statsInt->aec_stats.ae_data.extra.rawhist_big.bins, stats->params.rawhist3.hist_bin, ISP3X_HIST_BIN_N_MAX * sizeof(u32));
1710             break;
1711 
1712         default:
1713             LOGE("wrong AeSelMode=%d\n", AeSelMode);
1714             return XCAM_RETURN_ERROR_PARAM;
1715         }
1716     }
1717 
1718 #ifdef AE_STATS_DEBUG
1719     if(AeSwapMode != 0) {
1720         for(int i = 0; i < 15; i++) {
1721             for(int j = 0; j < 15; j++) {
1722                 printf("chn0[%d,%d]:r 0x%x, g 0x%x, b 0x%x\n", i, j,
1723                        statsInt->aec_stats.ae_data.chn[0].rawae_big.channelr_xy[i * 15 + j],
1724                        statsInt->aec_stats.ae_data.chn[0].rawae_big.channelg_xy[i * 15 + j],
1725                        statsInt->aec_stats.ae_data.chn[0].rawae_big.channelb_xy[i * 15 + j]);
1726             }
1727         }
1728         printf("====================sub-win-result======================\n");
1729 
1730         for(int i = 0; i < 4; i++)
1731             printf("chn0_subwin[%d]:sumr 0x%08lx, sumg 0x%08lx, sumb 0x%08lx\n", i,
1732                    statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumr[i],
1733                    statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumg[i],
1734                    statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumb[i]);
1735 
1736         printf("====================hist_result========================\n");
1737 
1738         for(int i = 0; i < 256; i++)
1739             printf("bin[%d]= 0x%08x\n", i, statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins[i]);
1740 
1741     } else {
1742         for(int i = 0; i < 5; i++) {
1743             for(int j = 0; j < 5; j++) {
1744                 printf("chn0[%d,%d]:r 0x%x, g 0x%x, b 0x%x\n", i, j,
1745                        statsInt->aec_stats.ae_data.chn[0].rawae_lite.channelr_xy[i * 5 + j],
1746                        statsInt->aec_stats.ae_data.chn[0].rawae_lite.channelg_xy[i * 5 + j],
1747                        statsInt->aec_stats.ae_data.chn[0].rawae_lite.channelb_xy[i * 5 + j]);
1748             }
1749         }
1750         printf("====================hist_result========================\n");
1751         for(int i = 0; i < 256; i++)
1752             printf("bin[%d]= 0x%08x\n", i, statsInt->aec_stats.ae_data.chn[0].rawhist_lite.bins[i]);
1753     }
1754 
1755 #endif
1756 
1757     //rotate stats for group ae
1758     if(mIsGroupMode) {
1759         RkAiqAecHwStatsRes_t* temp = (RkAiqAecHwStatsRes_t*)calloc(1, sizeof(RkAiqAecHwStatsRes_t));
1760         if(mModuleRotation == 1/*RK_PS_SrcOverlapPosition_90*/) {
1761             //1) clockwise 90
1762             for(int i = 0; i < 3; i++) {
1763                 //BIG
1764                 uint8_t colnum = sqrt(ISP3X_RAWAEBIG_MEAN_NUM);
1765                 for(int row = 0; row < colnum; row++) {
1766                     for(int col = 0; col < colnum; col++) {
1767                         temp->chn[i].rawae_big.channelr_xy[row * colnum + col] = \
1768                                 statsInt->aec_stats.ae_data.chn[i].rawae_big.channelr_xy[(colnum - 1 - col) * colnum + row];
1769                         temp->chn[i].rawae_big.channelg_xy[row * colnum + col] = \
1770                                 statsInt->aec_stats.ae_data.chn[i].rawae_big.channelg_xy[(colnum - 1 - col) * colnum + row];
1771                         temp->chn[i].rawae_big.channelb_xy[row * colnum + col] = \
1772                                 statsInt->aec_stats.ae_data.chn[i].rawae_big.channelb_xy[(colnum - 1 - col) * colnum + row];
1773                     }
1774                 }
1775                 //LITE
1776                 colnum = sqrt(ISP3X_RAWAELITE_MEAN_NUM);
1777                 for(int row = 0; row < colnum; row++) {
1778                     for(int col = 0; col < colnum; col++) {
1779                         temp->chn[i].rawae_lite.channelr_xy[row * colnum + col] = \
1780                                 statsInt->aec_stats.ae_data.chn[i].rawae_lite.channelr_xy[(colnum - 1 - col) * colnum + row];
1781                         temp->chn[i].rawae_lite.channelg_xy[row * colnum + col] = \
1782                                 statsInt->aec_stats.ae_data.chn[i].rawae_lite.channelg_xy[(colnum - 1 - col) * colnum + row];
1783                         temp->chn[i].rawae_lite.channelb_xy[row * colnum + col] = \
1784                                 statsInt->aec_stats.ae_data.chn[i].rawae_lite.channelb_xy[(colnum - 1 - col) * colnum + row];
1785                     }
1786                 }
1787                 memcpy(&statsInt->aec_stats.ae_data.chn[i].rawae_lite, &temp->chn[i].rawae_lite, sizeof(rawaelite_stat_t));
1788                 memcpy(&statsInt->aec_stats.ae_data.chn[i].rawae_big, &temp->chn[i].rawae_big, sizeof(rawaebig_stat_t));
1789             }
1790 
1791             if(!AfUseAeBig) {
1792                 uint8_t colnum = sqrt(ISP3X_RAWAEBIG_MEAN_NUM);
1793                 for(int row = 0; row < colnum; row++) {
1794                     for(int col = 0; col < colnum; col++) {
1795                         temp->extra.rawae_big.channelr_xy[row * colnum + col] = \
1796                                 statsInt->aec_stats.ae_data.extra.rawae_big.channelr_xy[(colnum - 1 - col) * colnum + row];
1797                         temp->extra.rawae_big.channelg_xy[row * colnum + col] = \
1798                                 statsInt->aec_stats.ae_data.extra.rawae_big.channelg_xy[(colnum - 1 - col) * colnum + row];
1799                         temp->extra.rawae_big.channelb_xy[row * colnum + col] = \
1800                                 statsInt->aec_stats.ae_data.extra.rawae_big.channelb_xy[(colnum - 1 - col) * colnum + row];
1801                     }
1802                 }
1803                 memcpy(&statsInt->aec_stats.ae_data.extra.rawae_big, &temp->extra.rawae_big, sizeof(rawaebig_stat_t));
1804             }
1805         } else if(mModuleRotation == 3/*RK_PS_SrcOverlapPosition_270*/) {
1806             //2) counter clockwise 90
1807             for(int i = 0; i < 3; i++) {
1808                 //BIG
1809                 uint8_t colnum = sqrt(ISP3X_RAWAEBIG_MEAN_NUM);
1810                 for(int row = 0; row < colnum; row++) {
1811                     for(int col = 0; col < colnum; col++) {
1812                         temp->chn[i].rawae_big.channelr_xy[row * colnum + col] = \
1813                                 statsInt->aec_stats.ae_data.chn[i].rawae_big.channelr_xy[col * colnum + (colnum - 1 - row)];
1814                         temp->chn[i].rawae_big.channelg_xy[row * colnum + col] = \
1815                                 statsInt->aec_stats.ae_data.chn[i].rawae_big.channelg_xy[col * colnum + (colnum - 1 - row)];
1816                         temp->chn[i].rawae_big.channelb_xy[row * colnum + col] = \
1817                                 statsInt->aec_stats.ae_data.chn[i].rawae_big.channelb_xy[col * colnum + (colnum - 1 - row)];
1818                     }
1819                 }
1820                 //LITE
1821                 colnum = sqrt(ISP3X_RAWAELITE_MEAN_NUM);
1822                 for(int row = 0; row < colnum; row++) {
1823                     for(int col = 0; col < colnum; col++) {
1824                         temp->chn[i].rawae_lite.channelr_xy[row * colnum + col] = \
1825                                 statsInt->aec_stats.ae_data.chn[i].rawae_lite.channelr_xy[col * colnum + (colnum - 1 - row)];
1826                         temp->chn[i].rawae_lite.channelg_xy[row * colnum + col] = \
1827                                 statsInt->aec_stats.ae_data.chn[i].rawae_lite.channelg_xy[col * colnum + (colnum - 1 - row)];
1828                         temp->chn[i].rawae_lite.channelb_xy[row * colnum + col] = \
1829                                 statsInt->aec_stats.ae_data.chn[i].rawae_lite.channelb_xy[col * colnum + (colnum - 1 - row)];
1830                     }
1831                 }
1832 
1833                 memcpy(&statsInt->aec_stats.ae_data.chn[i].rawae_lite, &temp->chn[i].rawae_lite, sizeof(rawaelite_stat_t));
1834                 memcpy(&statsInt->aec_stats.ae_data.chn[i].rawae_big, &temp->chn[i].rawae_big, sizeof(rawaebig_stat_t));
1835             }
1836 
1837             if(!AfUseAeBig) {
1838                 uint8_t colnum = sqrt(ISP3X_RAWAEBIG_MEAN_NUM);
1839                 for(int row = 0; row < colnum; row++) {
1840                     for(int col = 0; col < colnum; col++) {
1841                         temp->extra.rawae_big.channelr_xy[row * colnum + col] = \
1842                                 statsInt->aec_stats.ae_data.extra.rawae_big.channelr_xy[col * colnum + (colnum - 1 - row)];
1843                         temp->extra.rawae_big.channelg_xy[row * colnum + col] = \
1844                                 statsInt->aec_stats.ae_data.extra.rawae_big.channelg_xy[col * colnum + (colnum - 1 - row)];
1845                         temp->extra.rawae_big.channelb_xy[row * colnum + col] = \
1846                                 statsInt->aec_stats.ae_data.extra.rawae_big.channelb_xy[col * colnum + (colnum - 1 - row)];
1847                     }
1848                 }
1849                 memcpy(&statsInt->aec_stats.ae_data.extra.rawae_big, &temp->extra.rawae_big, sizeof(rawaebig_stat_t));
1850             }
1851         } else {
1852             LOGW("not support mModuleRotation %d", mModuleRotation);
1853         }
1854 
1855         if(temp) free(temp);
1856     }
1857 
1858 
1859     /*
1860      *         unsigned long chn0_mean = 0, chn1_mean = 0;
1861      *         for(int i = 0; i < ISP3X_RAWAEBIG_MEAN_NUM; i++) {
1862      *             chn0_mean += stats->params.rawae1.data[i].channelg_xy;
1863      *             chn1_mean += stats->params.rawae3.data[i].channelg_xy;
1864      *         }
1865      *
1866      *
1867      *         printf("frame[%d]: chn[0-1]_g_mean_xy: %ld-%ld\n",
1868      *                 stats->frame_id, chn0_mean/ISP3X_RAWAEBIG_MEAN_NUM,
1869      *                 chn1_mean/ISP3X_RAWAEBIG_MEAN_NUM);
1870      */
1871 
1872     //expsoure params
1873     if (expParams.ptr()) {
1874 
1875         statsInt->aec_stats.ae_exp = expParams->data()->aecExpInfo;
1876         /*printf("frame[%d],gain=%d,time=%d\n", stats->frame_id,
1877                expParams->data()->aecExpInfo.LinearExp.exp_sensor_params.analog_gain_code_global,
1878                expParams->data()->aecExpInfo.LinearExp.exp_sensor_params.coarse_integration_time);*/
1879 
1880 
1881         /*
1882          * printf("%s: L: [0x%x-0x%x], M: [0x%x-0x%x], S: [0x%x-0x%x]\n",
1883          *        __func__,
1884          *        expParams->data()->aecExpInfo.HdrExp[2].exp_sensor_params.coarse_integration_time,
1885          *        expParams->data()->aecExpInfo.HdrExp[2].exp_sensor_params.analog_gain_code_global,
1886          *        expParams->data()->aecExpInfo.HdrExp[1].exp_sensor_params.coarse_integration_time,
1887          *        expParams->data()->aecExpInfo.HdrExp[1].exp_sensor_params.analog_gain_code_global,
1888          *        expParams->data()->aecExpInfo.HdrExp[0].exp_sensor_params.coarse_integration_time,
1889          *        expParams->data()->aecExpInfo.HdrExp[0].exp_sensor_params.analog_gain_code_global);
1890          */
1891     }
1892 
1893     //iris params
1894     if (irisParams.ptr()) {
1895 
1896         float sof_time = (float)irisParams->data()->sofTime / 1000000000.0f;
1897         float start_time = (float)irisParams->data()->PIris.StartTim.tv_sec + (float)irisParams->data()->PIris.StartTim.tv_usec / 1000000.0f;
1898         float end_time = (float)irisParams->data()->PIris.EndTim.tv_sec + (float)irisParams->data()->PIris.EndTim.tv_usec / 1000000.0f;
1899         float frm_intval = 1 / (statsInt->aec_stats.ae_exp.pixel_clock_freq_mhz * 1000000.0f /
1900                                 (float)statsInt->aec_stats.ae_exp.line_length_pixels / (float)statsInt->aec_stats.ae_exp.frame_length_lines);
1901 
1902         /*printf("%s: step=%d,last-step=%d,start-tim=%f,end-tim=%f,sof_tim=%f\n",
1903             __func__,
1904             statsInt->aec_stats.ae_exp.Iris.PIris.step,
1905             irisParams->data()->PIris.laststep,start_time,end_time,sof_time);
1906         */
1907 
1908         if(sof_time < end_time + frm_intval)
1909             statsInt->aec_stats.ae_exp.Iris.PIris.step = irisParams->data()->PIris.laststep;
1910         else
1911             statsInt->aec_stats.ae_exp.Iris.PIris.step = irisParams->data()->PIris.step;
1912     }
1913 
1914     to->set_sequence(stats->frame_id);
1915 #endif
1916     return ret;
1917 }
1918 
1919 
RotationDegAwbBlkStas(rk_aiq_awb_stat_blk_res_v201_t * blockResult,int degree)1920 void RotationDegAwbBlkStas(rk_aiq_awb_stat_blk_res_v201_t *blockResult, int degree)
1921 {
1922 
1923     rk_aiq_awb_stat_blk_res_v201_t blockResult_old[RK_AIQ_AWB_GRID_NUM_TOTAL];
1924     if(degree == 3 /*RK_PS_SrcOverlapPosition_270*/) {
1925         memcpy(blockResult_old, blockResult, sizeof(rk_aiq_awb_stat_blk_res_v201_t)*RK_AIQ_AWB_GRID_NUM_TOTAL);
1926         for(int i = 0; i < RK_AIQ_AWB_GRID_NUM_VERHOR; i++) {
1927             for(int j = 0; j < RK_AIQ_AWB_GRID_NUM_VERHOR; j++) {
1928                 memcpy(&blockResult[(RK_AIQ_AWB_GRID_NUM_VERHOR - j - 1)*RK_AIQ_AWB_GRID_NUM_VERHOR + i], &blockResult_old[i * RK_AIQ_AWB_GRID_NUM_VERHOR + j], sizeof(rk_aiq_awb_stat_blk_res_v201_t));
1929             }
1930         }
1931     } else if(degree == 1 /*RK_PS_SrcOverlapPosition_90*/) {
1932         memcpy(blockResult_old, blockResult, sizeof(rk_aiq_awb_stat_blk_res_v201_t)*RK_AIQ_AWB_GRID_NUM_TOTAL);
1933         for(int i = 0; i < RK_AIQ_AWB_GRID_NUM_VERHOR; i++) {
1934             for(int j = 0; j < RK_AIQ_AWB_GRID_NUM_VERHOR; j++) {
1935                 memcpy(&blockResult[j * RK_AIQ_AWB_GRID_NUM_VERHOR + (RK_AIQ_AWB_GRID_NUM_VERHOR - i - 1)], &blockResult_old[i * RK_AIQ_AWB_GRID_NUM_VERHOR + j], sizeof(rk_aiq_awb_stat_blk_res_v201_t));
1936             }
1937         }
1938     } else {
1939         LOGW_AWBGROUP("not support mModuleRotation %d, abandon to rotate awb blk stas !!!!", degree);
1940     }
1941 }
1942 
1943 
1944 XCamReturn
translateAwbStats(const SmartPtr<VideoBuffer> & from,SmartPtr<RkAiqAwbStatsProxy> & to)1945 RkAiqResourceTranslatorV3x::translateAwbStats (const SmartPtr<VideoBuffer> &from, SmartPtr<RkAiqAwbStatsProxy> &to)
1946 {
1947     XCamReturn ret = XCAM_RETURN_NO_ERROR;
1948 #if defined(ISP_HW_V30)
1949     Isp20StatsBuffer* buf =
1950         from.get_cast_ptr<Isp20StatsBuffer>();
1951     struct rkisp3x_isp_stat_buffer *stats;
1952     SmartPtr<RkAiqAwbStats> statsInt = to->data();
1953 
1954 #if defined(RKAIQ_HAVE_MULTIISP)
1955     if (mIsMultiIsp) {
1956         return translateMultiAwbStats(from, to);
1957     }
1958 #endif
1959 
1960     stats = (struct rkisp3x_isp_stat_buffer*)(buf->get_v4l2_userptr());
1961     if(stats == NULL) {
1962         LOGE("fail to get stats ,ignore\n");
1963         return XCAM_RETURN_BYPASS;
1964     }
1965     LOGI_ANALYZER("camId: %d, awb stats: frame_id: %d,  meas_type; 0x%x",
1966                   mCamPhyId, stats->frame_id, stats->meas_type);
1967 
1968     statsInt->awb_stats_valid = stats->meas_type >> 5 & 1;
1969     if (!statsInt->awb_stats_valid) {
1970         LOGE_ANALYZER("AWB stats invalid, ignore");
1971         return XCAM_RETURN_BYPASS;
1972     }
1973 
1974     rkisp_effect_params_v20 ispParams;
1975     memset(&ispParams, 0, sizeof(ispParams));
1976     if (buf->getEffectiveIspParams(stats->frame_id, ispParams) < 0) {
1977         LOGE("fail to get ispParams ,ignore\n");
1978         return XCAM_RETURN_BYPASS;
1979     }
1980     //awb30
1981     statsInt->awb_stats_v3x.awb_cfg_effect_v201 = ispParams.awb_cfg_v3x;
1982     rk_aiq_isp_blc_t *bls_cfg = &ispParams.blc_cfg.v0;
1983     statsInt->blc_cfg_effect = ispParams.blc_cfg.v0;
1984     statsInt->awb_cfg_effect_valid = true;
1985     statsInt->frame_id = stats->frame_id;
1986     for(int i = 0; i < statsInt->awb_stats_v3x.awb_cfg_effect_v201.lightNum; i++) {
1987         statsInt->awb_stats_v3x.light[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V201].RgainValue =
1988             stats->params.rawawb.ro_rawawb_sum_rgain_nor[i];
1989         statsInt->awb_stats_v3x.light[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V201].BgainValue =
1990             stats->params.rawawb.ro_rawawb_sum_bgain_nor[i];
1991         statsInt->awb_stats_v3x.light[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V201].WpNo =
1992             stats->params.rawawb.ro_rawawb_wp_num_nor[i];
1993         statsInt->awb_stats_v3x.light[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V201].RgainValue =
1994             stats->params.rawawb.ro_rawawb_sum_rgain_big[i];
1995         statsInt->awb_stats_v3x.light[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V201].BgainValue =
1996             stats->params.rawawb.ro_rawawb_sum_bgain_big[i];
1997         statsInt->awb_stats_v3x.light[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V201].WpNo =
1998             stats->params.rawawb.ro_rawawb_wp_num_big[i];
1999 
2000     }
2001 
2002     for(int i = 0; i < RK_AIQ_AWB_GRID_NUM_TOTAL; i++) {
2003         statsInt->awb_stats_v3x.blockResult[i].Rvalue = stats->params.rawawb.ramdata[i].r;
2004         statsInt->awb_stats_v3x.blockResult[i].Gvalue = stats->params.rawawb.ramdata[i].g;
2005         statsInt->awb_stats_v3x.blockResult[i].Bvalue = stats->params.rawawb.ramdata[i].b;
2006         statsInt->awb_stats_v3x.blockResult[i].WpNo = stats->params.rawawb.ramdata[i].wp;
2007     }
2008 
2009     for(int i = 0; i < RK_AIQ_AWB_WP_HIST_BIN_NUM; i++) {
2010         statsInt->awb_stats_v3x.WpNoHist[i] = stats->params.rawawb.ro_yhist_bin[i];
2011         // move the shift code here to make WpNoHist merged by several cameras easily
2012         if( stats->params.rawawb.ro_yhist_bin[i]  & 0x8000 ) {
2013             statsInt->awb_stats_v3x.WpNoHist[i] = stats->params.rawawb.ro_yhist_bin[i] & 0x7FFF;
2014             statsInt->awb_stats_v3x.WpNoHist[i] *=    (1 << 3);
2015         }
2016     }
2017 
2018 #if defined(ISP_HW_V30)
2019     for(int i = 0; i < statsInt->awb_stats_v3x.awb_cfg_effect_v201.lightNum; i++) {
2020         statsInt->awb_stats_v3x.WpNo2[i] =  stats->params.rawawb.ro_wp_num2[i];
2021     }
2022     for(int i = 0; i < RK_AIQ_AWB_MULTIWINDOW_NUM_V201; i++) {
2023         statsInt->awb_stats_v3x.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V201].RgainValue =
2024             stats->params.rawawb.ro_sum_r_nor_multiwindow[i];
2025 
2026         statsInt->awb_stats_v3x.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V201].BgainValue =
2027             stats->params.rawawb.ro_sum_b_nor_multiwindow[i];
2028         statsInt->awb_stats_v3x.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V201].WpNo =
2029             stats->params.rawawb.ro_wp_nm_nor_multiwindow[i];
2030         statsInt->awb_stats_v3x.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V201].RgainValue =
2031             stats->params.rawawb.ro_sum_r_big_multiwindow[i];
2032         statsInt->awb_stats_v3x.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V201].BgainValue =
2033             stats->params.rawawb.ro_sum_b_big_multiwindow[i];
2034         statsInt->awb_stats_v3x.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V201].WpNo =
2035             stats->params.rawawb.ro_wp_nm_big_multiwindow[i];
2036     }
2037 
2038     for(int i = 0; i < RK_AIQ_AWB_STAT_WP_RANGE_NUM_V201; i++) {
2039         statsInt->awb_stats_v3x.excWpRangeResult[i].RgainValue = stats->params.rawawb.ro_sum_r_exc[i];
2040         statsInt->awb_stats_v3x.excWpRangeResult[i].BgainValue = stats->params.rawawb.ro_sum_b_exc[i];
2041         statsInt->awb_stats_v3x.excWpRangeResult[i].WpNo =    stats->params.rawawb.ro_wp_nm_exc[i];
2042 
2043     }
2044 
2045     // to fixed the bug in ic design that some egisters maybe overflow
2046     if(!mIsMultiIsp) {
2047         int w, h;
2048         w = statsInt->awb_stats_v3x.awb_cfg_effect_v201.windowSet[2];
2049         h = statsInt->awb_stats_v3x.awb_cfg_effect_v201.windowSet[3];
2050         float factor1 = (float)((1 << (RK_AIQ_AWB_WP_WEIGHT_BIS_V201 + 1)) - 1) / ((1 << RK_AIQ_AWB_WP_WEIGHT_BIS_V201) - 1);
2051         //float factor1 = (float)(1<<(RK_AIQ_AWB_WP_WEIGHT_BIS_V201+1))/((1<<RK_AIQ_AWB_WP_WEIGHT_BIS_V201)-1);
2052         if(w * h > RK_AIQ_AWB_STAT_MAX_AREA) {
2053             LOGD_AWB("%s ramdata and ro_wp_num2 is fixed", __FUNCTION__);
2054             for(int i = 0; i < RK_AIQ_AWB_GRID_NUM_TOTAL; i++) {
2055                 statsInt->awb_stats_v3x.blockResult[i].WpNo = (float)statsInt->awb_stats_v3x.blockResult[i].WpNo * factor1 + 0.5 ;
2056                 statsInt->awb_stats_v3x.blockResult[i].Rvalue = (float)statsInt->awb_stats_v3x.blockResult[i].Rvalue * factor1 + 0.5 ;
2057                 statsInt->awb_stats_v3x.blockResult[i].Gvalue = (float)statsInt->awb_stats_v3x.blockResult[i].Gvalue * factor1 + 0.5 ;
2058                 statsInt->awb_stats_v3x.blockResult[i].Bvalue = (float)statsInt->awb_stats_v3x.blockResult[i].Bvalue * factor1 + 0.5 ;
2059             }
2060             rk_aiq_awb_xy_type_v201_t typ = statsInt->awb_stats_v3x.awb_cfg_effect_v201.xyRangeTypeForWpHist;
2061             for(int i = 0; i < statsInt->awb_stats_v3x.awb_cfg_effect_v201.lightNum; i++) {
2062                 statsInt->awb_stats_v3x.WpNo2[i] = statsInt->awb_stats_v3x.light[i].xYType[typ].WpNo >> RK_AIQ_WP_GAIN_FRAC_BIS;
2063             }
2064         } else {
2065             if(statsInt->awb_stats_v3x.awb_cfg_effect_v201.blkMeasureMode == RK_AIQ_AWB_BLK_STAT_MODE_REALWP_V201
2066                     && statsInt->awb_stats_v3x.awb_cfg_effect_v201.blkStatisticsWithLumaWeightEn) {
2067                 for(int i = 0; i < RK_AIQ_AWB_GRID_NUM_TOTAL; i++) {
2068                     statsInt->awb_stats_v3x.blockResult[i].WpNo = (float)statsInt->awb_stats_v3x.blockResult[i].WpNo * factor1 + 0.5 ;
2069                     statsInt->awb_stats_v3x.blockResult[i].Rvalue = (float)statsInt->awb_stats_v3x.blockResult[i].Rvalue * factor1 + 0.5 ;
2070                     statsInt->awb_stats_v3x.blockResult[i].Gvalue = (float)statsInt->awb_stats_v3x.blockResult[i].Gvalue * factor1 + 0.5 ;
2071                     statsInt->awb_stats_v3x.blockResult[i].Bvalue = (float)statsInt->awb_stats_v3x.blockResult[i].Bvalue * factor1 + 0.5 ;
2072                 }
2073             }
2074         }
2075     }
2076 
2077 #endif
2078     LOG1_AWB("bls_cfg %p", bls_cfg);
2079     if(bls_cfg) {
2080         LOG1_AWB("bls1_enalbe: %d, b r gb gr:[ %d %d %d %d]", bls_cfg->blc1_enable, bls_cfg->blc1_b,
2081                  bls_cfg->blc1_r, bls_cfg->blc1_gb, bls_cfg->blc1_gr);
2082     }
2083     if(bls_cfg && bls_cfg->blc1_enable && (bls_cfg->blc1_b > 0 || bls_cfg->blc1_r > 0 || bls_cfg->blc1_gb > 0 || bls_cfg->blc1_gr > 0)) {
2084 
2085         for(int i = 0; i < RK_AIQ_AWB_GRID_NUM_TOTAL; i++) {
2086             statsInt->awb_stats_v3x.blockResult[i].Rvalue -=
2087                 (long long)(statsInt->awb_stats_v3x.blockResult[i].WpNo * bls_cfg->blc1_r *
2088                             statsInt->awb_stats_v3x.awb_cfg_effect_v201.pre_wbgain_inv_r + 2048) >> 12 ;
2089             statsInt->awb_stats_v3x.blockResult[i].Gvalue -=
2090                 (long long)(statsInt->awb_stats_v3x.blockResult[i].WpNo * (bls_cfg->blc1_gr + bls_cfg->blc1_gb) *
2091                             statsInt->awb_stats_v3x.awb_cfg_effect_v201.pre_wbgain_inv_g + 4096) >> 13 ;
2092             statsInt->awb_stats_v3x.blockResult[i].Bvalue -=
2093                 (long long)(statsInt->awb_stats_v3x.blockResult[i].WpNo * bls_cfg->blc1_b  *
2094                             statsInt->awb_stats_v3x.awb_cfg_effect_v201.pre_wbgain_inv_b + 2048) >> 12 ;
2095         }
2096     }
2097     LOGV_AWBGROUP("mIsGroupMode %d, mCamPhyId %d,mModuleRotation %d", mIsGroupMode, mCamPhyId, mModuleRotation);
2098     if(mIsGroupMode) {
2099         RotationDegAwbBlkStas(statsInt->awb_stats_v3x.blockResult, mModuleRotation);
2100     }
2101     //statsInt->awb_stats_valid = ISP2X_STAT_RAWAWB(stats->meas_type)? true:false;
2102     statsInt->awb_stats_valid = stats->meas_type >> 5 & 1;
2103     to->set_sequence(stats->frame_id);
2104 #endif
2105     return ret;
2106 }
2107 
2108 #if defined(RKAIQ_HAVE_MULTIISP)
2109 XCamReturn
translateMultiAfStats(const SmartPtr<VideoBuffer> & from,SmartPtr<RkAiqAfStatsProxy> & to)2110 RkAiqResourceTranslatorV3x::translateMultiAfStats (const SmartPtr<VideoBuffer> &from, SmartPtr<RkAiqAfStatsProxy> &to)
2111 {
2112     typedef enum WinSplitMode_s {
2113         LEFT_AND_RIGHT_MODE = 0,
2114         LEFT_MODE,
2115         RIGHT_MODE,
2116         FULL_MODE,
2117     } SplitMode;
2118 
2119     struct AfSplitInfo {
2120         SplitMode wina_side_info;
2121         int32_t wina_l_blknum;
2122         int32_t wina_r_blknum;
2123         int32_t wina_r_skip_blknum;
2124         float wina_l_ratio;
2125         float wina_r_ratio;
2126 
2127         SplitMode winb_side_info;
2128         float winb_l_ratio;
2129         float winb_r_ratio;
2130     };
2131 
2132     XCamReturn ret = XCAM_RETURN_NO_ERROR;
2133     Isp20StatsBuffer* buf =
2134         from.get_cast_ptr<Isp20StatsBuffer>();
2135     struct rkisp3x_isp_stat_buffer *left_stats, *right_stats;
2136     SmartPtr<RkAiqAfStats> statsInt = to->data();
2137     SmartPtr<RkAiqAfInfoProxy> afParams = buf->get_af_params();
2138 
2139     left_stats = (struct rkisp3x_isp_stat_buffer*)(buf->get_v4l2_userptr());
2140     if (left_stats == NULL) {
2141         LOGE("fail to get stats ,ignore\n");
2142         return XCAM_RETURN_BYPASS;
2143     }
2144     right_stats = left_stats + 1;
2145     if (right_stats == NULL) {
2146         LOGE("fail to get right stats ,ignore\n");
2147         return XCAM_RETURN_BYPASS;
2148     }
2149 
2150     if (left_stats->frame_id != right_stats->frame_id || left_stats->meas_type != right_stats->meas_type) {
2151         LOGE_ANALYZER("status params(frmid or meas_type) of left isp and right isp are different");
2152     } else {
2153         LOGI_ANALYZER("stats: frame_id: %d,  meas_type; 0x%x", left_stats->frame_id, left_stats->meas_type);
2154     }
2155 
2156     rkisp_effect_params_v20 ispParams;
2157     memset(&ispParams, 0, sizeof(ispParams));
2158     if (buf->getEffectiveIspParams(left_stats->frame_id, ispParams) < 0) {
2159         LOGE("fail to get ispParams ,ignore\n");
2160         return XCAM_RETURN_BYPASS;
2161     }
2162 
2163     SmartPtr<RkAiqSensorExpParamsProxy> expParams = nullptr;
2164     if (buf->getEffectiveExpParams(left_stats->frame_id, expParams) < 0)
2165         LOGE("fail to get expParams");
2166     if (expParams.ptr())
2167         statsInt->aecExpInfo = expParams->data()->aecExpInfo;
2168 
2169     statsInt->frame_id = left_stats->frame_id;
2170 
2171     struct isp3x_rawaf_meas_cfg &org_af = ispParams.isp_params_v3x[0].meas.rawaf;
2172     int32_t l_isp_st, l_isp_ed, r_isp_st, r_isp_ed;
2173     int32_t l_win_st, l_win_ed, r_win_st, r_win_ed;
2174     int32_t x_st, x_ed, l_blknum, r_blknum, ov_w, blk_w, r_skip_blknum;
2175     struct AfSplitInfo af_split_info;
2176     int32_t i, j, k, dst_idx, l_idx, r_idx, l_lht, r_lht, lht0, lht1;
2177 
2178     memset(&af_split_info, 0, sizeof(af_split_info));
2179     ov_w = left_isp_rect_.w + left_isp_rect_.x - right_isp_rect_.x;
2180     x_st = org_af.win[0].h_offs;
2181     x_ed = x_st + org_af.win[0].h_size;
2182     l_isp_st = left_isp_rect_.x;
2183     l_isp_ed = left_isp_rect_.x + left_isp_rect_.w;
2184     r_isp_st = right_isp_rect_.x;
2185     r_isp_ed = right_isp_rect_.x + right_isp_rect_.w;
2186     LOGD_AF("wina.x_st %d, wina.x_ed %d, l_isp_st %d, l_isp_ed %d, r_isp_st %d, r_isp_ed %d",
2187             x_st, x_ed, l_isp_st, l_isp_ed, r_isp_st, r_isp_ed);
2188 
2189     //// winA ////
2190     af_split_info.wina_l_ratio = 0;
2191     af_split_info.wina_r_ratio = 0;
2192     // af win in both side
2193     if ((x_st < r_isp_st) && (x_ed > l_isp_ed)) {
2194         af_split_info.wina_side_info = LEFT_AND_RIGHT_MODE;
2195         // af win < one isp width
2196         if (org_af.win[0].h_size < left_isp_rect_.w) {
2197             blk_w = org_af.win[0].h_size / ISP2X_RAWAF_SUMDATA_ROW;
2198             l_blknum = (l_isp_ed - x_st + blk_w - 1) / blk_w;
2199             r_blknum = ISP2X_RAWAF_SUMDATA_ROW - l_blknum;
2200             l_win_ed = l_isp_ed - 2;
2201             l_win_st = l_win_ed - blk_w * ISP2X_RAWAF_SUMDATA_ROW;
2202             if (blk_w < ov_w) {
2203                 r_skip_blknum = ov_w / blk_w;
2204                 r_win_st = ov_w - r_skip_blknum * blk_w;
2205                 r_win_ed = ov_w + (ISP2X_RAWAF_SUMDATA_ROW - r_skip_blknum) * blk_w;
2206                 af_split_info.wina_r_skip_blknum = r_skip_blknum;
2207             }
2208             else {
2209                 r_skip_blknum = 0;
2210                 r_win_st = 2;
2211                 r_win_ed = r_win_st + ISP2X_RAWAF_SUMDATA_ROW * blk_w;
2212 
2213                 // blend last block of left isp and first block of right isp
2214                 af_split_info.wina_r_skip_blknum = 0;
2215                 af_split_info.wina_l_ratio = (float)ov_w / (float)blk_w;
2216                 af_split_info.wina_r_ratio = 1 - af_split_info.wina_l_ratio;
2217             }
2218         }
2219         // af win <= one isp width * 1.5
2220         else if (org_af.win[0].h_size < left_isp_rect_.w * 3 / 2) {
2221             l_win_st = x_st;
2222             l_win_ed = l_isp_ed - 2;
2223             blk_w = (l_win_ed - l_win_st) / (ISP2X_RAWAF_SUMDATA_ROW + 1);
2224             l_win_st = l_win_ed - blk_w * ISP2X_RAWAF_SUMDATA_ROW;
2225             l_blknum = ((l_win_ed - l_win_st) * ISP2X_RAWAF_SUMDATA_ROW + org_af.win[0].h_size - 1) / org_af.win[0].h_size;
2226             r_blknum = ISP2X_RAWAF_SUMDATA_ROW - l_blknum;
2227             if (blk_w < ov_w) {
2228                 r_skip_blknum = ov_w / blk_w;
2229                 r_win_st = ov_w - r_skip_blknum * blk_w;
2230                 r_win_ed = ov_w + (ISP2X_RAWAF_SUMDATA_ROW - r_skip_blknum) * blk_w;
2231                 af_split_info.wina_r_skip_blknum = r_skip_blknum;
2232             }
2233             else {
2234                 r_skip_blknum = 0;
2235                 r_win_st = 2;
2236                 r_win_ed = r_win_st + ISP2X_RAWAF_SUMDATA_ROW * blk_w;
2237                 // blend last block of left isp and first block of right isp
2238                 af_split_info.wina_r_skip_blknum = 0;
2239                 af_split_info.wina_l_ratio = (float)ov_w / (float)blk_w;
2240                 af_split_info.wina_r_ratio = 1 - af_split_info.wina_l_ratio;
2241             }
2242         }
2243         else {
2244             l_win_st = x_st;
2245             l_win_ed = l_isp_ed - 2;
2246             blk_w = (l_win_ed - l_win_st) / ISP2X_RAWAF_SUMDATA_ROW;
2247             l_win_st = l_win_ed - blk_w * ISP2X_RAWAF_SUMDATA_ROW;
2248             r_win_st = 2;
2249             r_win_ed = r_win_st + blk_w * ISP2X_RAWAF_SUMDATA_ROW;
2250             af_split_info.wina_side_info = FULL_MODE;
2251             l_blknum = ISP2X_RAWAF_SUMDATA_ROW;
2252             r_blknum = ISP2X_RAWAF_SUMDATA_ROW;
2253         }
2254     }
2255     // af win in right side
2256     else if ((x_st >= r_isp_st) && (x_ed > l_isp_ed)) {
2257         af_split_info.wina_side_info = RIGHT_MODE;
2258         l_blknum = 0;
2259         r_blknum = ISP2X_RAWAF_SUMDATA_ROW;
2260         r_win_st = x_st - right_isp_rect_.x;
2261         r_win_ed = x_ed - right_isp_rect_.x;
2262         l_win_st = r_win_st;
2263         l_win_ed = r_win_ed;
2264     }
2265     // af win in left side
2266     else {
2267         af_split_info.wina_side_info = LEFT_MODE;
2268         l_blknum = ISP2X_RAWAF_SUMDATA_ROW;
2269         r_blknum = 0;
2270         l_win_st = x_st;
2271         l_win_ed = x_ed;
2272         r_win_st = l_win_st;
2273         r_win_ed = l_win_ed;
2274     }
2275 
2276     af_split_info.wina_l_blknum = l_blknum;
2277     af_split_info.wina_r_blknum = r_blknum;
2278 
2279     //// winB ////
2280     af_split_info.winb_l_ratio = 0;
2281     af_split_info.winb_r_ratio = 0;
2282     x_st = org_af.win[1].h_offs;
2283     x_ed = x_st + org_af.win[1].h_size;
2284     LOGD_AF("winb.x_st %d, winb.x_ed %d, l_isp_st %d, l_isp_ed %d, r_isp_st %d, r_isp_ed %d",
2285             x_st, x_ed, l_isp_st, l_isp_ed, r_isp_st, r_isp_ed);
2286 
2287     // af win in both side
2288     if ((x_st < r_isp_st) && (x_ed > l_isp_ed)) {
2289         af_split_info.winb_side_info = LEFT_AND_RIGHT_MODE;
2290         l_win_st = x_st;
2291         l_win_ed = l_isp_ed - 2;
2292         r_win_st = ov_w - 2;
2293         r_win_ed = x_ed - right_isp_rect_.x;
2294         // blend winB by width of left isp winB and right isp winB
2295         af_split_info.winb_l_ratio = (float)(l_win_ed - l_win_st) / (float)(x_ed - x_st);
2296         af_split_info.winb_r_ratio = 1 - af_split_info.winb_l_ratio;
2297     }
2298     // af win in right side
2299     else if ((x_st >= r_isp_st) && (x_ed > l_isp_ed)) {
2300         af_split_info.winb_side_info = RIGHT_MODE;
2301         af_split_info.winb_l_ratio = 0;
2302         af_split_info.winb_r_ratio = 1;
2303         r_win_st = x_st - right_isp_rect_.x;
2304         r_win_ed = x_ed - right_isp_rect_.x;
2305         l_win_st = r_win_st;
2306         l_win_ed = r_win_ed;
2307     }
2308     // af win in left side
2309     else {
2310         af_split_info.winb_side_info = LEFT_MODE;
2311         af_split_info.winb_l_ratio = 1;
2312         af_split_info.winb_r_ratio = 0;
2313         l_win_st = x_st;
2314         l_win_ed = x_ed;
2315         r_win_st = l_win_st;
2316         r_win_ed = l_win_ed;
2317     }
2318 
2319     //af
2320     {
2321         if (((left_stats->meas_type >> 6) & (0x01)) && ((left_stats->meas_type >> 6) & (0x01)))
2322             statsInt->af_stats_valid = true;
2323         else
2324             statsInt->af_stats_valid = false;
2325 
2326         if (af_split_info.winb_side_info == LEFT_AND_RIGHT_MODE) {
2327             statsInt->af_stats_v3x.wndb_luma = left_stats->params.rawaf.afm_lum_b * af_split_info.winb_l_ratio +
2328                                                right_stats->params.rawaf.afm_lum_b * af_split_info.winb_r_ratio;
2329             statsInt->af_stats_v3x.wndb_sharpness = left_stats->params.rawaf.afm_sum_b * af_split_info.winb_l_ratio +
2330                                                     right_stats->params.rawaf.afm_sum_b * af_split_info.winb_r_ratio;
2331             statsInt->af_stats_v3x.winb_highlit_cnt = left_stats->params.rawaf.highlit_cnt_winb +
2332                     right_stats->params.rawaf.highlit_cnt_winb;
2333         } else if (af_split_info.winb_side_info == LEFT_MODE) {
2334             statsInt->af_stats_v3x.wndb_luma = left_stats->params.rawaf.afm_lum_b;
2335             statsInt->af_stats_v3x.wndb_sharpness = left_stats->params.rawaf.afm_sum_b;
2336             statsInt->af_stats_v3x.winb_highlit_cnt = left_stats->params.rawaf.highlit_cnt_winb;
2337         } else {
2338             statsInt->af_stats_v3x.wndb_luma = right_stats->params.rawaf.afm_lum_b;
2339             statsInt->af_stats_v3x.wndb_sharpness = right_stats->params.rawaf.afm_sum_b;
2340             statsInt->af_stats_v3x.winb_highlit_cnt = right_stats->params.rawaf.highlit_cnt_winb;
2341         }
2342 
2343         if (af_split_info.wina_side_info == FULL_MODE) {
2344             for (i = 0; i < ISP2X_RAWAF_SUMDATA_ROW; i++) {
2345                 for (j = 0; j < ISP2X_RAWAF_SUMDATA_COLUMN; j++) {
2346                     dst_idx = i * ISP2X_RAWAF_SUMDATA_ROW + j;
2347                     if (j == 0) {
2348                         l_idx = i * ISP2X_RAWAF_SUMDATA_ROW + j;
2349                         statsInt->af_stats_v3x.wnda_fv_v1[dst_idx] = left_stats->params.rawaf.ramdata[l_idx].v1;
2350                         statsInt->af_stats_v3x.wnda_fv_v2[dst_idx] = left_stats->params.rawaf.ramdata[l_idx].v2;
2351                         statsInt->af_stats_v3x.wnda_fv_h1[dst_idx] = left_stats->params.rawaf.ramdata[l_idx].h1;
2352                         statsInt->af_stats_v3x.wnda_fv_h2[dst_idx] = left_stats->params.rawaf.ramdata[l_idx].h2;
2353                         statsInt->af_stats_v3x.wnda_luma[dst_idx] = left_stats->params.rawae3.data[l_idx].channelg_xy;
2354                         statsInt->af_stats_v3x.wina_highlit_cnt[dst_idx] =
2355                             ((left_stats->params.rawae3.data[l_idx].channelr_xy & 0x3F) << 10) | left_stats->params.rawae3.data[l_idx].channelb_xy;
2356                     } else if (j >= 1 && j <= 7) {
2357                         l_idx = i * ISP2X_RAWAF_SUMDATA_ROW + 2 * (j - 1) + 1;
2358                         statsInt->af_stats_v3x.wnda_fv_v1[dst_idx] =
2359                             left_stats->params.rawaf.ramdata[l_idx].v1 + left_stats->params.rawaf.ramdata[l_idx + 1].v1;
2360                         statsInt->af_stats_v3x.wnda_fv_v2[dst_idx] =
2361                             left_stats->params.rawaf.ramdata[l_idx].v2 + left_stats->params.rawaf.ramdata[l_idx + 1].v2;
2362                         statsInt->af_stats_v3x.wnda_fv_h1[dst_idx] =
2363                             left_stats->params.rawaf.ramdata[l_idx].h1 + left_stats->params.rawaf.ramdata[l_idx + 1].h1;
2364                         statsInt->af_stats_v3x.wnda_fv_h2[dst_idx] =
2365                             left_stats->params.rawaf.ramdata[l_idx].h2 + left_stats->params.rawaf.ramdata[l_idx + 1].h2;
2366                         statsInt->af_stats_v3x.wnda_luma[dst_idx] =
2367                             (left_stats->params.rawae3.data[l_idx].channelg_xy + left_stats->params.rawae3.data[l_idx + 1].channelg_xy) >> 1;
2368                         lht0 = ((left_stats->params.rawae3.data[l_idx].channelr_xy & 0x3F) << 10) | left_stats->params.rawae3.data[l_idx].channelb_xy;
2369                         lht1 = ((left_stats->params.rawae3.data[l_idx + 1].channelr_xy & 0x3F) << 10) | left_stats->params.rawae3.data[l_idx + 1].channelb_xy;
2370                         statsInt->af_stats_v3x.wina_highlit_cnt[dst_idx] = lht0 + lht1;
2371                     } else {
2372                         r_idx = i * ISP2X_RAWAF_SUMDATA_ROW + 2 * (j - 8) + 1;
2373                         statsInt->af_stats_v3x.wnda_fv_v1[dst_idx] =
2374                             right_stats->params.rawaf.ramdata[r_idx].v1 + right_stats->params.rawaf.ramdata[r_idx + 1].v1;
2375                         statsInt->af_stats_v3x.wnda_fv_v2[dst_idx] =
2376                             right_stats->params.rawaf.ramdata[r_idx].v2 + right_stats->params.rawaf.ramdata[r_idx + 1].v2;
2377                         statsInt->af_stats_v3x.wnda_fv_h1[dst_idx] =
2378                             right_stats->params.rawaf.ramdata[r_idx].h1 + right_stats->params.rawaf.ramdata[r_idx + 1].h1;
2379                         statsInt->af_stats_v3x.wnda_fv_h2[dst_idx] =
2380                             right_stats->params.rawaf.ramdata[r_idx].h2 + right_stats->params.rawaf.ramdata[r_idx + 1].h2;
2381                         statsInt->af_stats_v3x.wnda_luma[dst_idx] =
2382                             (right_stats->params.rawae3.data[r_idx].channelg_xy + right_stats->params.rawae3.data[r_idx + 1].channelg_xy) >> 1;
2383                         lht0 = ((right_stats->params.rawae3.data[r_idx].channelr_xy & 0x3F) << 10) | right_stats->params.rawae3.data[r_idx].channelb_xy;
2384                         lht1 = ((right_stats->params.rawae3.data[r_idx + 1].channelr_xy & 0x3F) << 10) | right_stats->params.rawae3.data[r_idx + 1].channelb_xy;
2385                         statsInt->af_stats_v3x.wina_highlit_cnt[dst_idx] = lht0 + lht1;
2386                     }
2387                 }
2388             }
2389         }
2390         else if (af_split_info.wina_side_info == LEFT_AND_RIGHT_MODE) {
2391             for (i = 0; i < ISP2X_RAWAF_SUMDATA_ROW; i++) {
2392                 j = ISP2X_RAWAF_SUMDATA_ROW - af_split_info.wina_l_blknum;
2393                 for (k = 0; k < af_split_info.wina_l_blknum; j++, k++) {
2394                     dst_idx = i * ISP2X_RAWAF_SUMDATA_ROW + k;
2395                     l_idx = i * ISP2X_RAWAF_SUMDATA_ROW + j;
2396                     statsInt->af_stats_v3x.wnda_fv_v1[dst_idx] = left_stats->params.rawaf.ramdata[l_idx].v1;
2397                     statsInt->af_stats_v3x.wnda_fv_v2[dst_idx] = left_stats->params.rawaf.ramdata[l_idx].v2;
2398                     statsInt->af_stats_v3x.wnda_fv_h1[dst_idx] = left_stats->params.rawaf.ramdata[l_idx].h1;
2399                     statsInt->af_stats_v3x.wnda_fv_h2[dst_idx] = left_stats->params.rawaf.ramdata[l_idx].h2;
2400                     statsInt->af_stats_v3x.wnda_luma[dst_idx] = left_stats->params.rawae3.data[l_idx].channelg_xy;
2401                     statsInt->af_stats_v3x.wina_highlit_cnt[dst_idx] =
2402                         ((left_stats->params.rawae3.data[l_idx].channelr_xy & 0x3F) << 10) | left_stats->params.rawae3.data[l_idx].channelb_xy;
2403                 }
2404             }
2405 
2406             for (i = 0; i < ISP2X_RAWAF_SUMDATA_ROW; i++) {
2407                 j = af_split_info.wina_r_skip_blknum;
2408                 for (k = 0; k < af_split_info.wina_r_blknum; j++, k++) {
2409                     dst_idx = i * ISP2X_RAWAF_SUMDATA_ROW + k + af_split_info.wina_l_blknum;
2410                     r_idx = i * ISP2X_RAWAF_SUMDATA_ROW + j;
2411                     statsInt->af_stats_v3x.wnda_fv_v1[dst_idx] = right_stats->params.rawaf.ramdata[r_idx].v1;
2412                     statsInt->af_stats_v3x.wnda_fv_v2[dst_idx] = right_stats->params.rawaf.ramdata[r_idx].v2;
2413                     statsInt->af_stats_v3x.wnda_fv_h1[dst_idx] = right_stats->params.rawaf.ramdata[r_idx].h1;
2414                     statsInt->af_stats_v3x.wnda_fv_h2[dst_idx] = right_stats->params.rawaf.ramdata[r_idx].h2;
2415 
2416                     statsInt->af_stats_v3x.wnda_luma[dst_idx] = right_stats->params.rawae3.data[r_idx].channelg_xy;
2417                     statsInt->af_stats_v3x.wina_highlit_cnt[dst_idx] =
2418                         ((right_stats->params.rawae3.data[r_idx].channelr_xy & 0x3F) << 10) | right_stats->params.rawae3.data[r_idx].channelb_xy;
2419                 }
2420             }
2421 
2422             if (af_split_info.wina_r_skip_blknum == 0) {
2423                 for (j = 0; j < ISP2X_RAWAF_SUMDATA_COLUMN; j++) {
2424                     dst_idx = j * ISP2X_RAWAF_SUMDATA_ROW + (af_split_info.wina_l_blknum - 1);
2425                     l_idx = j * ISP2X_RAWAF_SUMDATA_ROW + (ISP2X_RAWAF_SUMDATA_COLUMN - 1);
2426                     r_idx = j * ISP2X_RAWAF_SUMDATA_ROW;
2427                     statsInt->af_stats_v3x.wnda_fv_v1[dst_idx] =
2428                         left_stats->params.rawaf.ramdata[l_idx].v1 * af_split_info.wina_l_ratio +
2429                         right_stats->params.rawaf.ramdata[r_idx].v1 * af_split_info.wina_r_ratio;
2430                     statsInt->af_stats_v3x.wnda_fv_v2[dst_idx] =
2431                         left_stats->params.rawaf.ramdata[l_idx].v2 * af_split_info.wina_l_ratio +
2432                         right_stats->params.rawaf.ramdata[r_idx].v2 * af_split_info.wina_r_ratio;
2433                     statsInt->af_stats_v3x.wnda_fv_h1[dst_idx] =
2434                         left_stats->params.rawaf.ramdata[l_idx].h1 * af_split_info.wina_l_ratio +
2435                         right_stats->params.rawaf.ramdata[r_idx].h1 * af_split_info.wina_r_ratio;
2436                     statsInt->af_stats_v3x.wnda_fv_h2[dst_idx] =
2437                         left_stats->params.rawaf.ramdata[l_idx].h2 * af_split_info.wina_l_ratio +
2438                         right_stats->params.rawaf.ramdata[r_idx].h2 * af_split_info.wina_r_ratio;
2439 
2440                     statsInt->af_stats_v3x.wnda_luma[dst_idx] =
2441                         left_stats->params.rawae3.data[l_idx].channelg_xy * af_split_info.wina_l_ratio +
2442                         right_stats->params.rawae3.data[r_idx].channelg_xy * af_split_info.wina_r_ratio;
2443                     l_lht = ((left_stats->params.rawae3.data[l_idx].channelr_xy & 0x3F) << 10) | left_stats->params.rawae3.data[l_idx].channelb_xy;
2444                     r_lht = ((right_stats->params.rawae3.data[r_idx].channelr_xy & 0x3F) << 10) | right_stats->params.rawae3.data[r_idx].channelb_xy;
2445                     statsInt->af_stats_v3x.wina_highlit_cnt[dst_idx] = l_lht + r_lht;
2446                 }
2447             }
2448         } else if (af_split_info.wina_side_info == LEFT_MODE) {
2449             for (i = 0; i < RKAIQ_RAWAF_SUMDATA_NUM; i++) {
2450                 statsInt->af_stats_v3x.wnda_fv_v1[i] = left_stats->params.rawaf.ramdata[i].v1;
2451                 statsInt->af_stats_v3x.wnda_fv_v2[i] = left_stats->params.rawaf.ramdata[i].v2;
2452                 statsInt->af_stats_v3x.wnda_fv_h1[i] = left_stats->params.rawaf.ramdata[i].h1;
2453                 statsInt->af_stats_v3x.wnda_fv_h2[i] = left_stats->params.rawaf.ramdata[i].h2;
2454 
2455                 statsInt->af_stats_v3x.wnda_luma[i] = left_stats->params.rawae3.data[i].channelg_xy;
2456                 statsInt->af_stats_v3x.wina_highlit_cnt[i] =
2457                     ((left_stats->params.rawae3.data[i].channelr_xy & 0x3F) << 10) | left_stats->params.rawae3.data[i].channelb_xy;
2458             }
2459         } else {
2460             for (i = 0; i < RKAIQ_RAWAF_SUMDATA_NUM; i++) {
2461                 statsInt->af_stats_v3x.wnda_fv_v1[i] = right_stats->params.rawaf.ramdata[i].v1;
2462                 statsInt->af_stats_v3x.wnda_fv_v2[i] = right_stats->params.rawaf.ramdata[i].v2;
2463                 statsInt->af_stats_v3x.wnda_fv_h1[i] = right_stats->params.rawaf.ramdata[i].h1;
2464                 statsInt->af_stats_v3x.wnda_fv_h2[i] = right_stats->params.rawaf.ramdata[i].h2;
2465 
2466                 statsInt->af_stats_v3x.wnda_luma[i] = right_stats->params.rawae3.data[i].channelg_xy;
2467                 statsInt->af_stats_v3x.wina_highlit_cnt[i] =
2468                     ((right_stats->params.rawae3.data[i].channelr_xy & 0x3F) << 10) | right_stats->params.rawae3.data[i].channelb_xy;
2469             }
2470         }
2471 
2472         LOGD_AF("af_split_info.wina: %d, %d, %d, %d, %f, %f",
2473                 af_split_info.wina_side_info, af_split_info.wina_l_blknum, af_split_info.wina_r_blknum,
2474                 af_split_info.wina_r_skip_blknum, af_split_info.wina_l_ratio, af_split_info.wina_r_ratio);
2475         LOGD_AF("af_split_info.winb: %d, %f, %f",
2476                 af_split_info.winb_side_info, af_split_info.winb_l_ratio, af_split_info.winb_r_ratio);
2477 
2478         if(afParams.ptr()) {
2479             statsInt->af_stats_v3x.focusCode = afParams->data()->focusCode;
2480             statsInt->af_stats_v3x.zoomCode = afParams->data()->zoomCode;
2481             statsInt->af_stats_v3x.focus_endtim = afParams->data()->focusEndTim;
2482             statsInt->af_stats_v3x.focus_starttim = afParams->data()->focusStartTim;
2483             statsInt->af_stats_v3x.zoom_endtim = afParams->data()->zoomEndTim;
2484             statsInt->af_stats_v3x.zoom_starttim = afParams->data()->zoomStartTim;
2485             statsInt->af_stats_v3x.sof_tim = afParams->data()->sofTime;
2486             statsInt->af_stats_v3x.focusCorrection = afParams->data()->focusCorrection;
2487             statsInt->af_stats_v3x.zoomCorrection = afParams->data()->zoomCorrection;
2488             statsInt->af_stats_v3x.angleZ = afParams->data()->angleZ;
2489         }
2490     }
2491 
2492     return ret;
2493 }
2494 #endif
2495 
2496 
2497 XCamReturn
translateAfStats(const SmartPtr<VideoBuffer> & from,SmartPtr<RkAiqAfStatsProxy> & to)2498 RkAiqResourceTranslatorV3x::translateAfStats (const SmartPtr<VideoBuffer> &from, SmartPtr<RkAiqAfStatsProxy> &to)
2499 {
2500     XCamReturn ret = XCAM_RETURN_NO_ERROR;
2501     Isp20StatsBuffer* buf =
2502         from.get_cast_ptr<Isp20StatsBuffer>();
2503     struct rkisp3x_isp_stat_buffer *stats;
2504     SmartPtr<RkAiqAfStats> statsInt = to->data();
2505 
2506 #if defined(RKAIQ_HAVE_MULTIISP)
2507     if (mIsMultiIsp) {
2508         return translateMultiAfStats(from, to);
2509     }
2510 #endif
2511 
2512     stats = (struct rkisp3x_isp_stat_buffer*)(buf->get_v4l2_userptr());
2513     if(stats == NULL) {
2514         LOGE("fail to get stats ,ignore\n");
2515         return XCAM_RETURN_BYPASS;
2516     }
2517     LOGI_ANALYZER("camId: %d, af stats: frame_id: %d,  meas_type; 0x%x",
2518                   mCamPhyId, stats->frame_id, stats->meas_type);
2519 
2520     SmartPtr<RkAiqAfInfoProxy> afParams = buf->get_af_params();
2521 
2522     memset(&statsInt->af_stats_v3x, 0, sizeof(rk_aiq_isp_af_stats_v3x_t));
2523     statsInt->frame_id = stats->frame_id;
2524 
2525     SmartPtr<RkAiqSensorExpParamsProxy> expParams = nullptr;
2526     if (buf->getEffectiveExpParams(stats->frame_id, expParams) < 0)
2527         LOGE("fail to get expParams");
2528     if (expParams.ptr())
2529         statsInt->aecExpInfo = expParams->data()->aecExpInfo;
2530 
2531     //af
2532     {
2533         statsInt->af_stats_valid =
2534             (stats->meas_type >> 6) & (0x01) ? true : false;
2535 
2536         statsInt->af_stats_v3x.wndb_luma = stats->params.rawaf.afm_lum_b;
2537         statsInt->af_stats_v3x.wndb_sharpness = stats->params.rawaf.afm_sum_b;
2538         statsInt->af_stats_v3x.winb_highlit_cnt = stats->params.rawaf.highlit_cnt_winb;
2539         for (int i = 0; i < RKAIQ_RAWAF_SUMDATA_NUM; i++) {
2540             statsInt->af_stats_v3x.wnda_fv_v1[i] = stats->params.rawaf.ramdata[i].v1;
2541             statsInt->af_stats_v3x.wnda_fv_v2[i] = stats->params.rawaf.ramdata[i].v2;
2542             statsInt->af_stats_v3x.wnda_fv_h1[i] = stats->params.rawaf.ramdata[i].h1;
2543             statsInt->af_stats_v3x.wnda_fv_h2[i] = stats->params.rawaf.ramdata[i].h2;
2544 
2545             statsInt->af_stats_v3x.wnda_luma[i] = stats->params.rawae3.data[i].channelg_xy;
2546             statsInt->af_stats_v3x.wina_highlit_cnt[i] =
2547                 ((stats->params.rawae3.data[i].channelr_xy & 0x3F) << 10) | stats->params.rawae3.data[i].channelb_xy;
2548         }
2549 
2550         if(afParams.ptr()) {
2551             statsInt->af_stats_v3x.focusCode = afParams->data()->focusCode;
2552             statsInt->af_stats_v3x.zoomCode = afParams->data()->zoomCode;
2553             statsInt->af_stats_v3x.focus_endtim = afParams->data()->focusEndTim;
2554             statsInt->af_stats_v3x.focus_starttim = afParams->data()->focusStartTim;
2555             statsInt->af_stats_v3x.zoom_endtim = afParams->data()->zoomEndTim;
2556             statsInt->af_stats_v3x.zoom_starttim = afParams->data()->zoomStartTim;
2557             statsInt->af_stats_v3x.sof_tim = afParams->data()->sofTime;
2558             statsInt->af_stats_v3x.focusCorrection = afParams->data()->focusCorrection;
2559             statsInt->af_stats_v3x.zoomCorrection = afParams->data()->zoomCorrection;
2560             statsInt->af_stats_v3x.angleZ = afParams->data()->angleZ;
2561         }
2562     }
2563 
2564     return ret;
2565 }
2566 
2567 #if RKAIQ_HAVE_DEHAZE_V11_DUO
2568 XCamReturn
translateAdehazeStats(const SmartPtr<VideoBuffer> & from,SmartPtr<RkAiqAdehazeStatsProxy> & to)2569 RkAiqResourceTranslatorV3x::translateAdehazeStats (const SmartPtr<VideoBuffer> &from, SmartPtr<RkAiqAdehazeStatsProxy> &to)
2570 {
2571 
2572     XCamReturn ret = XCAM_RETURN_NO_ERROR;
2573 
2574     Isp20StatsBuffer* buf =
2575         from.get_cast_ptr<Isp20StatsBuffer>();
2576     struct rkisp3x_isp_stat_buffer *stats;
2577     SmartPtr<RkAiqAdehazeStats> statsInt = to->data();
2578 
2579 #if defined(RKAIQ_HAVE_MULTIISP)
2580     if (mIsMultiIsp) {
2581         return translateMultiAdehazeStats(from, to);
2582     }
2583 #endif
2584 
2585     stats = (struct rkisp3x_isp_stat_buffer*)(buf->get_v4l2_userptr());
2586     if(stats == NULL) {
2587         LOGE("fail to get stats ,ignore\n");
2588         return XCAM_RETURN_BYPASS;
2589     }
2590     LOGI_ANALYZER("camId: %d, dehaze stats: frame_id: %d,  meas_type; 0x%x",
2591                   mCamPhyId, stats->frame_id, stats->meas_type);
2592     //dehaze
2593     statsInt->adehaze_stats_valid = stats->meas_type >> 17 & 1;
2594     statsInt->adehaze_stats.dehaze_stats_v11_duo.dhaz_adp_air_base =
2595         stats->params.dhaz.dhaz_adp_air_base;
2596     statsInt->adehaze_stats.dehaze_stats_v11_duo.dhaz_adp_wt = stats->params.dhaz.dhaz_adp_wt;
2597     statsInt->adehaze_stats.dehaze_stats_v11_duo.dhaz_adp_gratio =
2598         stats->params.dhaz.dhaz_adp_gratio;
2599     statsInt->adehaze_stats.dehaze_stats_v11_duo.dhaz_adp_wt = stats->params.dhaz.dhaz_adp_wt;
2600     statsInt->adehaze_stats.dehaze_stats_v11_duo.dhaz_pic_sumh_left =
2601         stats->params.dhaz.dhaz_pic_sumh;
2602     for(int i = 0; i < ISP3X_DHAZ_HIST_IIR_NUM; i++)
2603         statsInt->adehaze_stats.dehaze_stats_v11_duo.h_rgb_iir[i] = stats->params.dhaz.h_rgb_iir[i];
2604 
2605     to->set_sequence(stats->frame_id);
2606 
2607     return ret;
2608 }
2609 #endif
2610 
2611 } //namespace RkCam
2612