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