1 /*
2 * RkAiqConfigTranslator.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 //#define PDAF_RAW_DUMP
20
21 #include "isp20/Isp20Evts.h"
22 #include "isp20/Isp20StatsBuffer.h"
23 #include "isp20/rkispp-config.h"
24 #include "RkAiqResourceTranslator.h"
25 #include "PdafStreamProcUnit.h"
26 #ifdef PDAF_RAW_DUMP
27 #include <fcntl.h>
28 #include <unistd.h>
29 #include <arpa/inet.h>
30 #endif
31 #ifdef __ARM_NEON
32 #define NEON_OPT
33 #endif
34 #ifdef NEON_OPT
35 #include <arm_neon.h>
36 #endif
37
38 #define DEFAULT_PD_RAW_PATH "/data/pdaf/frm%04d_pdAll.raw"
39 #define DEFAULT_PD_LRAW_PATH "/data/pdaf/frm%04d_pdLeft.raw"
40 #define DEFAULT_PD_RRAW_PATH "/data/pdaf/frm%04d_pdRight.raw"
41
42 namespace RkCam {
43
translateIspStats(const SmartPtr<VideoBuffer> & from,SmartPtr<RkAiqIspStatsIntProxy> & to,const SmartPtr<RkAiqAecStatsProxy> & aecStat,const SmartPtr<RkAiqAwbStatsProxy> & awbStat,const SmartPtr<RkAiqAfStatsProxy> & afStat,const SmartPtr<RkAiqAtmoStatsProxy> & tmoStat,const SmartPtr<RkAiqAdehazeStatsProxy> & dehazeStat)44 XCamReturn RkAiqResourceTranslator::translateIspStats(
45 const SmartPtr<VideoBuffer>& from, SmartPtr<RkAiqIspStatsIntProxy>& to,
46 const SmartPtr<RkAiqAecStatsProxy>& aecStat, const SmartPtr<RkAiqAwbStatsProxy>& awbStat,
47 const SmartPtr<RkAiqAfStatsProxy>& afStat, const SmartPtr<RkAiqAtmoStatsProxy>& tmoStat,
48 const SmartPtr<RkAiqAdehazeStatsProxy>& dehazeStat) {
49 XCamReturn ret = XCAM_RETURN_NO_ERROR;
50 Isp20StatsBuffer* buf = from.get_cast_ptr<Isp20StatsBuffer>();
51 struct rkisp_isp2x_stat_buffer* stats;
52 SmartPtr<RkAiqIspStats> statsInt = to->data();
53
54 stats = (struct rkisp_isp2x_stat_buffer*)(buf->get_v4l2_userptr());
55 if (stats == NULL) {
56 LOGE("fail to get stats ,ignore\n");
57 return XCAM_RETURN_BYPASS;
58 }
59 LOGD_ANALYZER("stats frame_id(%d), meas_type; 0x%x, buf sequence(%d)", stats->frame_id,
60 stats->meas_type, buf->get_sequence());
61
62 statsInt->frame_id = stats->frame_id;
63
64 statsInt->AecStatsProxy = aecStat;
65 statsInt->AwbStatsProxy = awbStat;
66 statsInt->AfStatsProxy = afStat;
67 statsInt->AtmoStatsProxy = tmoStat;
68 statsInt->AdehazeStatsProxy = dehazeStat;
69
70 to->set_sequence(stats->frame_id);
71
72 return ret;
73 }
74
75 XCamReturn
translateAecStats(const SmartPtr<VideoBuffer> & from,SmartPtr<RkAiqAecStatsProxy> & to)76 RkAiqResourceTranslator::translateAecStats (const SmartPtr<VideoBuffer> &from, SmartPtr<RkAiqAecStatsProxy> &to)
77 {
78 XCamReturn ret = XCAM_RETURN_NO_ERROR;
79 #if defined(ISP_HW_V20) || defined(ISP_HW_V21)
80 Isp20StatsBuffer* buf =
81 from.get_cast_ptr<Isp20StatsBuffer>();
82 #if defined(ISP_HW_V21)
83 struct rkisp_isp21_stat_buffer *stats;
84 #else
85 struct rkisp_isp2x_stat_buffer *stats;
86 #endif
87 SmartPtr<RkAiqAecStats> statsInt = to->data();
88
89 if (getWorkingMode() == RK_AIQ_WORKING_MODE_ISP_HDR2) {
90 // Do something;
91 }
92
93 #if defined(ISP_HW_V21)
94 stats = (struct rkisp_isp21_stat_buffer *)(buf->get_v4l2_userptr());
95 #else
96 stats = (struct rkisp_isp2x_stat_buffer *)(buf->get_v4l2_userptr());
97 #endif
98 if(stats == NULL) {
99 LOGE("fail to get stats ,ignore\n");
100 return XCAM_RETURN_BYPASS;
101 }
102
103 LOGD_ANALYZER("stats frame_id(%u), meas_type; 0x%x, buf sequence(%d)", stats->frame_id,
104 stats->meas_type, buf->get_sequence());
105
106 SmartPtr<RkAiqIrisParamsProxy> irisParams = buf->get_iris_params();
107 SmartPtr<RkAiqSensorExpParamsProxy> expParams = nullptr;
108 rkisp_effect_params_v20 ispParams;
109 memset(&ispParams, 0, sizeof(ispParams));
110 if (buf->getEffectiveExpParams(stats->frame_id, expParams) < 0)
111 LOGE("fail to get expParams");
112 if (buf->getEffectiveIspParams(stats->frame_id, ispParams) < 0) {
113 LOGE("fail to get ispParams ,ignore\n");
114 return XCAM_RETURN_BYPASS;
115 }
116
117 statsInt->frame_id = stats->frame_id;
118 //ae
119
120 /*rawae stats*/
121 uint8_t AeSwapMode, AeSelMode;
122 #if defined(ISP_HW_V21)
123 AeSwapMode = ispParams.isp_params_v21.meas.rawae0.rawae_sel;
124 AeSelMode = ispParams.isp_params_v21.meas.rawae3.rawae_sel;
125 #else
126 AeSwapMode = ispParams.isp_params.meas.rawae0.rawae_sel;
127 AeSelMode = ispParams.isp_params.meas.rawae3.rawae_sel;
128 #endif
129 unsigned int meas_type = 0;
130 uint64_t SumHistPix[3] = {0, 0, 0};
131 float HistMean[3] = {0.0f, 0.0f, 0.0f};
132
133 switch(AeSwapMode) {
134 case AEC_RAWSWAP_MODE_S_LITE:
135
136 meas_type = ((stats->meas_type >> 7) & (0x01)) & ((stats->meas_type >> 11) & (0x01));
137 statsInt->aec_stats_valid = (meas_type & 0x01) ? true : false;
138
139 for(int i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) {
140 if(i < ISP2X_RAWAELITE_MEAN_NUM) {
141 statsInt->aec_stats.ae_data.chn[0].rawae_lite.channelr_xy[i] = stats->params.rawae0.data[i].channelr_xy;
142 statsInt->aec_stats.ae_data.chn[0].rawae_lite.channelg_xy[i] = stats->params.rawae0.data[i].channelg_xy;
143 statsInt->aec_stats.ae_data.chn[0].rawae_lite.channelb_xy[i] = stats->params.rawae0.data[i].channelb_xy;
144 }
145 statsInt->aec_stats.ae_data.chn[1].rawae_big.channelr_xy[i] = stats->params.rawae1.data[i].channelr_xy;
146 statsInt->aec_stats.ae_data.chn[1].rawae_big.channelg_xy[i] = stats->params.rawae1.data[i].channelg_xy;
147 statsInt->aec_stats.ae_data.chn[1].rawae_big.channelb_xy[i] = stats->params.rawae1.data[i].channelb_xy;
148 statsInt->aec_stats.ae_data.chn[2].rawae_big.channelr_xy[i] = stats->params.rawae2.data[i].channelr_xy;
149 statsInt->aec_stats.ae_data.chn[2].rawae_big.channelg_xy[i] = stats->params.rawae2.data[i].channelg_xy;
150 statsInt->aec_stats.ae_data.chn[2].rawae_big.channelb_xy[i] = stats->params.rawae2.data[i].channelb_xy;
151 if(i < ISP2X_RAWAEBIG_SUBWIN_NUM) {
152 statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumr[i] = stats->params.rawae1.sumr[i];
153 statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumg[i] = stats->params.rawae1.sumg[i];
154 statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumb[i] = stats->params.rawae1.sumb[i];
155 statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumr[i] = stats->params.rawae2.sumr[i];
156 statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumg[i] = stats->params.rawae2.sumg[i];
157 statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumb[i] = stats->params.rawae2.sumb[i];
158 }
159 }
160 memcpy(statsInt->aec_stats.ae_data.chn[0].rawhist_lite.bins, stats->params.rawhist0.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32));
161 memcpy(statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins, stats->params.rawhist1.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32));
162 memcpy(statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins, stats->params.rawhist2.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32));
163
164 for (int i = 0; i < ISP2X_HIST_BIN_N_MAX; i++) {
165 SumHistPix[0] += statsInt->aec_stats.ae_data.chn[0].rawhist_lite.bins[i];
166 SumHistPix[1] += statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins[i];
167 SumHistPix[2] += statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins[i];
168 }
169
170 for (int i = 0; i < ISP2X_HIST_BIN_N_MAX; i++) {
171 HistMean[0] += (float)(statsInt->aec_stats.ae_data.chn[0].rawhist_lite.bins[i] * (i + 1)) / (float)SumHistPix[0];
172 HistMean[1] += (float)(statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins[i] * (i + 1)) / (float)SumHistPix[1];
173 HistMean[2] += (float)(statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins[i] * (i + 1)) / (float)SumHistPix[2];
174 }
175
176 break;
177
178 case AEC_RAWSWAP_MODE_M_LITE:
179
180 meas_type = ((stats->meas_type >> 8) & (0x01)) & ((stats->meas_type >> 12) & (0x01));
181 statsInt->aec_stats_valid = (meas_type & 0x01) ? true : false;
182
183 for(int i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) {
184 if(i < ISP2X_RAWAELITE_MEAN_NUM) {
185 statsInt->aec_stats.ae_data.chn[1].rawae_lite.channelr_xy[i] = stats->params.rawae0.data[i].channelr_xy;
186 statsInt->aec_stats.ae_data.chn[1].rawae_lite.channelg_xy[i] = stats->params.rawae0.data[i].channelg_xy;
187 statsInt->aec_stats.ae_data.chn[1].rawae_lite.channelb_xy[i] = stats->params.rawae0.data[i].channelb_xy;
188 }
189 statsInt->aec_stats.ae_data.chn[0].rawae_big.channelr_xy[i] = stats->params.rawae1.data[i].channelr_xy;
190 statsInt->aec_stats.ae_data.chn[0].rawae_big.channelg_xy[i] = stats->params.rawae1.data[i].channelg_xy;
191 statsInt->aec_stats.ae_data.chn[0].rawae_big.channelb_xy[i] = stats->params.rawae1.data[i].channelb_xy;
192 statsInt->aec_stats.ae_data.chn[2].rawae_big.channelr_xy[i] = stats->params.rawae2.data[i].channelr_xy;
193 statsInt->aec_stats.ae_data.chn[2].rawae_big.channelg_xy[i] = stats->params.rawae2.data[i].channelg_xy;
194 statsInt->aec_stats.ae_data.chn[2].rawae_big.channelb_xy[i] = stats->params.rawae2.data[i].channelb_xy;
195
196 if(i < ISP2X_RAWAEBIG_SUBWIN_NUM) {
197 statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumr[i] = stats->params.rawae1.sumr[i];
198 statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumg[i] = stats->params.rawae1.sumg[i];
199 statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumb[i] = stats->params.rawae1.sumb[i];
200 statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumr[i] = stats->params.rawae2.sumr[i];
201 statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumg[i] = stats->params.rawae2.sumg[i];
202 statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumb[i] = stats->params.rawae2.sumb[i];
203 }
204 }
205 memcpy(statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins, stats->params.rawhist1.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32));
206 memcpy(statsInt->aec_stats.ae_data.chn[1].rawhist_lite.bins, stats->params.rawhist0.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32));
207 memcpy(statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins, stats->params.rawhist2.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32));
208
209 for (int i = 0; i < ISP2X_HIST_BIN_N_MAX; i++) {
210 SumHistPix[0] += statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins[i];
211 SumHistPix[1] += statsInt->aec_stats.ae_data.chn[1].rawhist_lite.bins[i];
212 SumHistPix[2] += statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins[i];
213 }
214
215 for (int i = 0; i < ISP2X_HIST_BIN_N_MAX; i++) {
216 HistMean[0] += (float)(statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins[i] * (i + 1)) / (float)SumHistPix[0];
217 HistMean[1] += (float)(statsInt->aec_stats.ae_data.chn[1].rawhist_lite.bins[i] * (i + 1)) / (float)SumHistPix[1];
218 HistMean[2] += (float)(statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins[i] * (i + 1)) / (float)SumHistPix[2];
219 }
220
221 break;
222
223 case AEC_RAWSWAP_MODE_L_LITE:
224
225 meas_type = ((stats->meas_type >> 9) & (0x01)) & ((stats->meas_type >> 13) & (0x01));
226 statsInt->aec_stats_valid = (meas_type & 0x01) ? true : false;
227
228 for(int i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) {
229 if(i < ISP2X_RAWAELITE_MEAN_NUM) {
230 statsInt->aec_stats.ae_data.chn[2].rawae_lite.channelr_xy[i] = stats->params.rawae0.data[i].channelr_xy;
231 statsInt->aec_stats.ae_data.chn[2].rawae_lite.channelg_xy[i] = stats->params.rawae0.data[i].channelg_xy;
232 statsInt->aec_stats.ae_data.chn[2].rawae_lite.channelb_xy[i] = stats->params.rawae0.data[i].channelb_xy;
233 }
234 statsInt->aec_stats.ae_data.chn[0].rawae_big.channelr_xy[i] = stats->params.rawae2.data[i].channelr_xy;
235 statsInt->aec_stats.ae_data.chn[0].rawae_big.channelg_xy[i] = stats->params.rawae2.data[i].channelg_xy;
236 statsInt->aec_stats.ae_data.chn[0].rawae_big.channelb_xy[i] = stats->params.rawae2.data[i].channelb_xy;
237 statsInt->aec_stats.ae_data.chn[1].rawae_big.channelr_xy[i] = stats->params.rawae1.data[i].channelr_xy;
238 statsInt->aec_stats.ae_data.chn[1].rawae_big.channelg_xy[i] = stats->params.rawae1.data[i].channelg_xy;
239 statsInt->aec_stats.ae_data.chn[1].rawae_big.channelb_xy[i] = stats->params.rawae1.data[i].channelb_xy;
240
241 if(i < ISP2X_RAWAEBIG_SUBWIN_NUM) {
242 statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumr[i] = stats->params.rawae2.sumr[i];
243 statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumg[i] = stats->params.rawae2.sumg[i];
244 statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumb[i] = stats->params.rawae2.sumb[i];
245 statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumr[i] = stats->params.rawae1.sumr[i];
246 statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumg[i] = stats->params.rawae1.sumg[i];
247 statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumb[i] = stats->params.rawae1.sumb[i];
248 }
249 }
250 memcpy(statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins, stats->params.rawhist2.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32));
251 memcpy(statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins, stats->params.rawhist1.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32));
252 memcpy(statsInt->aec_stats.ae_data.chn[2].rawhist_lite.bins, stats->params.rawhist0.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32));
253
254 for (int i = 0; i < ISP2X_HIST_BIN_N_MAX; i++) {
255 SumHistPix[0] += statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins[i];
256 SumHistPix[1] += statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins[i];
257 SumHistPix[2] += statsInt->aec_stats.ae_data.chn[2].rawhist_lite.bins[i];
258 }
259
260 for (int i = 0; i < ISP2X_HIST_BIN_N_MAX; i++) {
261 HistMean[0] += (float)(statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins[i] * (i + 1)) / (float)SumHistPix[0];
262 HistMean[1] += (float)(statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins[i] * (i + 1)) / (float)SumHistPix[1];
263 HistMean[2] += (float)(statsInt->aec_stats.ae_data.chn[2].rawhist_lite.bins[i] * (i + 1)) / (float)SumHistPix[2];
264 }
265
266 break;
267
268 default:
269 LOGE("wrong AeSwapMode=%d\n", AeSwapMode);
270 return XCAM_RETURN_ERROR_PARAM;
271 break;
272 }
273
274 // NOTE: tmp use yuvae mean
275 statsInt->aec_stats.ae_data.yuvae.mean[0] = (uint8_t)HistMean[0];
276 statsInt->aec_stats.ae_data.yuvae.mean[1] = (uint8_t)HistMean[1];
277 statsInt->aec_stats.ae_data.yuvae.mean[2] = (uint8_t)HistMean[2];
278
279 switch(AeSelMode) {
280 case AEC_RAWSEL_MODE_CHN_0:
281 for(int i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) {
282
283 statsInt->aec_stats.ae_data.chn[0].rawae_big.channelr_xy[i] = stats->params.rawae3.data[i].channelr_xy;
284 statsInt->aec_stats.ae_data.chn[0].rawae_big.channelg_xy[i] = stats->params.rawae3.data[i].channelg_xy;
285 statsInt->aec_stats.ae_data.chn[0].rawae_big.channelb_xy[i] = stats->params.rawae3.data[i].channelb_xy;
286
287 if(i < ISP2X_RAWAEBIG_SUBWIN_NUM) {
288 statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumr[i] = stats->params.rawae3.sumr[i];
289 statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumg[i] = stats->params.rawae3.sumg[i];
290 statsInt->aec_stats.ae_data.chn[0].rawae_big.wndx_sumb[i] = stats->params.rawae3.sumb[i];
291 }
292 }
293 memcpy(statsInt->aec_stats.ae_data.chn[0].rawhist_big.bins, stats->params.rawhist3.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32));
294 break;
295
296 case AEC_RAWSEL_MODE_CHN_1:
297 for(int i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) {
298
299 statsInt->aec_stats.ae_data.chn[1].rawae_big.channelr_xy[i] = stats->params.rawae3.data[i].channelr_xy;
300 statsInt->aec_stats.ae_data.chn[1].rawae_big.channelg_xy[i] = stats->params.rawae3.data[i].channelg_xy;
301 statsInt->aec_stats.ae_data.chn[1].rawae_big.channelb_xy[i] = stats->params.rawae3.data[i].channelb_xy;
302
303 if(i < ISP2X_RAWAEBIG_SUBWIN_NUM) {
304 statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumr[i] = stats->params.rawae3.sumr[i];
305 statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumg[i] = stats->params.rawae3.sumg[i];
306 statsInt->aec_stats.ae_data.chn[1].rawae_big.wndx_sumb[i] = stats->params.rawae3.sumb[i];
307 }
308 }
309 memcpy(statsInt->aec_stats.ae_data.chn[1].rawhist_big.bins, stats->params.rawhist3.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32));
310 break;
311
312 case AEC_RAWSEL_MODE_CHN_2:
313 for(int i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) {
314
315 statsInt->aec_stats.ae_data.chn[2].rawae_big.channelr_xy[i] = stats->params.rawae3.data[i].channelr_xy;
316 statsInt->aec_stats.ae_data.chn[2].rawae_big.channelg_xy[i] = stats->params.rawae3.data[i].channelg_xy;
317 statsInt->aec_stats.ae_data.chn[2].rawae_big.channelb_xy[i] = stats->params.rawae3.data[i].channelb_xy;
318
319 if(i < ISP2X_RAWAEBIG_SUBWIN_NUM) {
320 statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumr[i] = stats->params.rawae3.sumr[i];
321 statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumg[i] = stats->params.rawae3.sumg[i];
322 statsInt->aec_stats.ae_data.chn[2].rawae_big.wndx_sumb[i] = stats->params.rawae3.sumb[i];
323 }
324 }
325 memcpy(statsInt->aec_stats.ae_data.chn[2].rawhist_big.bins, stats->params.rawhist3.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32));
326 break;
327
328 case AEC_RAWSEL_MODE_TMO:
329 for(int i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) {
330
331 statsInt->aec_stats.ae_data.extra.rawae_big.channelr_xy[i] = stats->params.rawae3.data[i].channelr_xy;
332 statsInt->aec_stats.ae_data.extra.rawae_big.channelg_xy[i] = stats->params.rawae3.data[i].channelg_xy;
333 statsInt->aec_stats.ae_data.extra.rawae_big.channelb_xy[i] = stats->params.rawae3.data[i].channelb_xy;
334
335 if(i < ISP2X_RAWAEBIG_SUBWIN_NUM) {
336 statsInt->aec_stats.ae_data.extra.rawae_big.wndx_sumr[i] = stats->params.rawae3.sumr[i];
337 statsInt->aec_stats.ae_data.extra.rawae_big.wndx_sumg[i] = stats->params.rawae3.sumg[i];
338 statsInt->aec_stats.ae_data.extra.rawae_big.wndx_sumb[i] = stats->params.rawae3.sumb[i];
339 }
340 }
341 memcpy(statsInt->aec_stats.ae_data.extra.rawhist_big.bins, stats->params.rawhist3.hist_bin, ISP2X_HIST_BIN_N_MAX * sizeof(u32));
342 break;
343
344 default:
345 LOGE("wrong AeSelMode=%d\n", AeSelMode);
346 return XCAM_RETURN_ERROR_PARAM;
347 }
348
349 //yuvae
350 #if 0
351 for(int i = 0; i < ISP2X_YUVAE_MEAN_NUM; i++) {
352 statsInt->aec_stats.ae_data.yuvae.mean[i] = stats->params.yuvae.mean[i];
353 if(i < ISP2X_YUVAE_SUBWIN_NUM)
354 statsInt->aec_stats.ae_data.yuvae.ro_yuvae_sumy[i] = stats->params.yuvae.ro_yuvae_sumy[i];
355 }
356 memcpy(statsInt->aec_stats.ae_data.sihist.bins, stats->params.sihst.win_stat[0].hist_bins, ISP2X_SIHIST_WIN_NUM * sizeof(u32));
357 #endif
358
359 if (expParams.ptr()) {
360
361 statsInt->aec_stats.ae_exp = expParams->data()->aecExpInfo;
362 /*
363 * printf("%s: L: [0x%x-0x%x], M: [0x%x-0x%x], S: [0x%x-0x%x]\n",
364 * __func__,
365 * expParams->data()->aecExpInfo.HdrExp[2].exp_sensor_params.coarse_integration_time,
366 * expParams->data()->aecExpInfo.HdrExp[2].exp_sensor_params.analog_gain_code_global,
367 * expParams->data()->aecExpInfo.HdrExp[1].exp_sensor_params.coarse_integration_time,
368 * expParams->data()->aecExpInfo.HdrExp[1].exp_sensor_params.analog_gain_code_global,
369 * expParams->data()->aecExpInfo.HdrExp[0].exp_sensor_params.coarse_integration_time,
370 * expParams->data()->aecExpInfo.HdrExp[0].exp_sensor_params.analog_gain_code_global);
371 */
372 }
373
374 if (irisParams.ptr()) {
375
376 float sof_time = (float)irisParams->data()->sofTime / 1000000000.0f;
377 float start_time = (float)irisParams->data()->PIris.StartTim.tv_sec + (float)irisParams->data()->PIris.StartTim.tv_usec / 1000000.0f;
378 float end_time = (float)irisParams->data()->PIris.EndTim.tv_sec + (float)irisParams->data()->PIris.EndTim.tv_usec / 1000000.0f;
379 float frm_intval = 1 / (statsInt->aec_stats.ae_exp.pixel_clock_freq_mhz * 1000000.0f /
380 (float)statsInt->aec_stats.ae_exp.line_length_pixels / (float)statsInt->aec_stats.ae_exp.frame_length_lines);
381
382 /*printf("%s: step=%d,last-step=%d,start-tim=%f,end-tim=%f,sof_tim=%f\n",
383 __func__,
384 statsInt->aec_stats.ae_exp.Iris.PIris.step,
385 irisParams->data()->PIris.laststep,start_time,end_time,sof_time);
386 */
387
388 if(sof_time < end_time + frm_intval)
389 statsInt->aec_stats.ae_exp.Iris.PIris.step = irisParams->data()->PIris.laststep;
390 else
391 statsInt->aec_stats.ae_exp.Iris.PIris.step = irisParams->data()->PIris.step;
392 }
393
394 to->set_sequence(stats->frame_id);
395 #endif
396 return ret;
397 }
398
399 XCamReturn
translateAwbStats(const SmartPtr<VideoBuffer> & from,SmartPtr<RkAiqAwbStatsProxy> & to)400 RkAiqResourceTranslator::translateAwbStats (const SmartPtr<VideoBuffer> &from, SmartPtr<RkAiqAwbStatsProxy> &to)
401 {
402 XCamReturn ret = XCAM_RETURN_NO_ERROR;
403 #if defined(ISP_HW_V20)
404 Isp20StatsBuffer* buf =
405 from.get_cast_ptr <Isp20StatsBuffer>();
406 struct rkisp_isp2x_stat_buffer *stats;
407 SmartPtr<RkAiqAwbStats> statsInt = to->data();
408
409 stats = (struct rkisp_isp2x_stat_buffer *)(buf->get_v4l2_userptr());
410 if(stats == NULL) {
411 LOGE("fail to get stats ,ignore\n");
412 return XCAM_RETURN_BYPASS;
413 }
414 LOGD_ANALYZER("stats frame_id(%d), meas_type; 0x%x, buf sequence(%d)",
415 stats->frame_id, stats->meas_type, buf->get_sequence());
416
417 statsInt->awb_stats_valid = stats->meas_type >> 5 & 1;
418 if (!statsInt->awb_stats_valid) {
419 LOGE_ANALYZER("AWB stats invalid, ignore");
420 return XCAM_RETURN_BYPASS;
421 }
422
423 rkisp_effect_params_v20 ispParams;
424 memset(&ispParams, 0, sizeof(ispParams));
425 if (buf->getEffectiveIspParams(stats->frame_id, ispParams) < 0) {
426 LOGE("fail to get ispParams ,ignore\n");
427 return XCAM_RETURN_BYPASS;
428 }
429
430 statsInt->frame_id = stats->frame_id;
431 //awb2.0
432
433 statsInt->awb_stats.awb_cfg_effect_v200 = ispParams.awb_cfg;
434 statsInt->awb_cfg_effect_valid = true;
435
436 for(int i = 0; i < statsInt->awb_stats.awb_cfg_effect_v200.lightNum; i++) {
437 statsInt->awb_stats.light[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V200].Rvalue =
438 stats->params.rawawb.ro_rawawb_sum_r_nor[i];
439 statsInt->awb_stats.light[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V200].Gvalue =
440 stats->params.rawawb.ro_rawawb_sum_g_nor[i];
441 statsInt->awb_stats.light[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V200].Bvalue =
442 stats->params.rawawb.ro_rawawb_sum_b_nor[i];
443 statsInt->awb_stats.light[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V200].WpNo =
444 stats->params.rawawb.ro_rawawb_wp_num_nor[i];
445 statsInt->awb_stats.light[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V200].Rvalue =
446 stats->params.rawawb.ro_rawawb_sum_r_big[i];
447 statsInt->awb_stats.light[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V200].Gvalue =
448 stats->params.rawawb.ro_rawawb_sum_g_big[i];
449 statsInt->awb_stats.light[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V200].Bvalue =
450 stats->params.rawawb.ro_rawawb_sum_b_big[i];
451 statsInt->awb_stats.light[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V200].WpNo =
452 stats->params.rawawb.ro_rawawb_wp_num_big[i];
453 statsInt->awb_stats.light[i].xYType[RK_AIQ_AWB_XY_TYPE_SMALL_V200].Rvalue =
454 stats->params.rawawb.ro_rawawb_sum_r_sma[i];
455 statsInt->awb_stats.light[i].xYType[RK_AIQ_AWB_XY_TYPE_SMALL_V200].Gvalue =
456 stats->params.rawawb.ro_rawawb_sum_g_sma[i];
457 statsInt->awb_stats.light[i].xYType[RK_AIQ_AWB_XY_TYPE_SMALL_V200].Bvalue =
458 stats->params.rawawb.ro_rawawb_sum_b_sma[i];
459 statsInt->awb_stats.light[i].xYType[RK_AIQ_AWB_XY_TYPE_SMALL_V200].WpNo =
460 stats->params.rawawb.ro_rawawb_wp_num_sma[i];
461 }
462 for(int i = 0; i < statsInt->awb_stats.awb_cfg_effect_v200.lightNum; i++) {
463 statsInt->awb_stats.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V200].Rvalue =
464 stats->params.rawawb.ro_sum_r_nor_multiwindow[i];
465 statsInt->awb_stats.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V200].Gvalue =
466 stats->params.rawawb.ro_sum_g_nor_multiwindow[i];
467 statsInt->awb_stats.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V200].Bvalue =
468 stats->params.rawawb.ro_sum_b_nor_multiwindow[i];
469 statsInt->awb_stats.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_NORMAL_V200].WpNo =
470 stats->params.rawawb.ro_wp_nm_nor_multiwindow[i];
471 statsInt->awb_stats.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V200].Rvalue =
472 stats->params.rawawb.ro_sum_r_big_multiwindow[i];
473 statsInt->awb_stats.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V200].Gvalue =
474 stats->params.rawawb.ro_sum_g_big_multiwindow[i];
475 statsInt->awb_stats.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V200].Bvalue =
476 stats->params.rawawb.ro_sum_b_big_multiwindow[i];
477 statsInt->awb_stats.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_BIG_V200].WpNo =
478 stats->params.rawawb.ro_wp_nm_big_multiwindow[i];
479 statsInt->awb_stats.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_SMALL_V200].Rvalue =
480 stats->params.rawawb.ro_sum_r_sma_multiwindow[i];
481 statsInt->awb_stats.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_SMALL_V200].Gvalue =
482 stats->params.rawawb.ro_sum_g_sma_multiwindow[i];
483 statsInt->awb_stats.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_SMALL_V200].Bvalue =
484 stats->params.rawawb.ro_sum_b_sma_multiwindow[i];
485 statsInt->awb_stats.multiwindowLightResult[i].xYType[RK_AIQ_AWB_XY_TYPE_SMALL_V200].WpNo =
486 stats->params.rawawb.ro_wp_nm_sma_multiwindow[i];
487 }
488 for(int i = 0; i < RK_AIQ_AWB_STAT_WP_RANGE_NUM_V200; i++) {
489 statsInt->awb_stats.excWpRangeResult[i].Rvalue = stats->params.rawawb.ro_sum_r_exc[i];
490 statsInt->awb_stats.excWpRangeResult[i].Gvalue = stats->params.rawawb.ro_sum_g_exc[i];
491 statsInt->awb_stats.excWpRangeResult[i].Bvalue = stats->params.rawawb.ro_sum_b_exc[i];
492 statsInt->awb_stats.excWpRangeResult[i].WpNo = stats->params.rawawb.ro_wp_nm_exc[i];
493
494 }
495 for(int i = 0; i < RK_AIQ_AWB_GRID_NUM_TOTAL; i++) {
496 statsInt->awb_stats.blockResult[i].Rvalue = stats->params.rawawb.ramdata[i].r;
497 statsInt->awb_stats.blockResult[i].Gvalue = stats->params.rawawb.ramdata[i].g;
498 statsInt->awb_stats.blockResult[i].Bvalue = stats->params.rawawb.ramdata[i].b;
499 statsInt->awb_stats.blockResult[i].isWP[2] = stats->params.rawawb.ramdata[i].wp & 0x1;
500 statsInt->awb_stats.blockResult[i].isWP[1] = (stats->params.rawawb.ramdata[i].wp >> 1) & 0x1;
501 statsInt->awb_stats.blockResult[i].isWP[0] = (stats->params.rawawb.ramdata[i].wp >> 2) & 0x1;
502 }
503 //statsInt->awb_stats_valid = ISP2X_STAT_RAWAWB(stats->meas_type)? true:false;
504 statsInt->awb_stats_valid = stats->meas_type >> 5 & 1;
505
506 to->set_sequence(stats->frame_id);
507 #endif
508 return ret;
509 }
510
511 XCamReturn
translateAtmoStats(const SmartPtr<VideoBuffer> & from,SmartPtr<RkAiqAtmoStatsProxy> & to)512 RkAiqResourceTranslator::translateAtmoStats (const SmartPtr<VideoBuffer> &from, SmartPtr<RkAiqAtmoStatsProxy> &to)
513 {
514 XCamReturn ret = XCAM_RETURN_NO_ERROR;
515 Isp20StatsBuffer* buf =
516 from.get_cast_ptr <Isp20StatsBuffer>();
517 struct rkisp_isp2x_stat_buffer *stats;
518 SmartPtr<RkAiqAtmoStats> statsInt = to->data();
519
520 stats = (struct rkisp_isp2x_stat_buffer *)(buf->get_v4l2_userptr());
521 if(stats == NULL) {
522 LOGE("fail to get stats ,ignore\n");
523 return XCAM_RETURN_BYPASS;
524 }
525
526 LOGD_ANALYZER("stats frame_id(%d), meas_type; 0x%x, buf sequence(%d)",
527 stats->frame_id, stats->meas_type, buf->get_sequence());
528
529 statsInt->frame_id = stats->frame_id;
530
531 //ahdr
532 statsInt->atmo_stats_valid = stats->meas_type >> 16 & 1;
533 statsInt->atmo_stats.tmo_stats.ro_hdrtmo_lglow = stats->params.hdrtmo.lglow;
534 statsInt->atmo_stats.tmo_stats.ro_hdrtmo_lgmin = stats->params.hdrtmo.lgmin;
535 statsInt->atmo_stats.tmo_stats.ro_hdrtmo_lghigh = stats->params.hdrtmo.lghigh;
536 statsInt->atmo_stats.tmo_stats.ro_hdrtmo_lgmax = stats->params.hdrtmo.lgmax;
537 statsInt->atmo_stats.tmo_stats.ro_hdrtmo_weightkey = stats->params.hdrtmo.weightkey;
538 statsInt->atmo_stats.tmo_stats.ro_hdrtmo_lgmean = stats->params.hdrtmo.lgmean;
539 statsInt->atmo_stats.tmo_stats.ro_hdrtmo_lgrange0 = stats->params.hdrtmo.lgrange0;
540 statsInt->atmo_stats.tmo_stats.ro_hdrtmo_lgrange1 = stats->params.hdrtmo.lgrange1;
541 statsInt->atmo_stats.tmo_stats.ro_hdrtmo_palpha = stats->params.hdrtmo.palpha;
542 statsInt->atmo_stats.tmo_stats.ro_hdrtmo_lgavgmax = stats->params.hdrtmo.lgavgmax;
543 statsInt->atmo_stats.tmo_stats.ro_hdrtmo_linecnt = stats->params.hdrtmo.linecnt;
544 for(int i = 0; i < 32; i++)
545 statsInt->atmo_stats.tmo_stats.ro_array_min_max[i] = stats->params.hdrtmo.min_max[i];
546
547 to->set_sequence(stats->frame_id);
548
549 return ret;
550 }
551
552 #if RKAIQ_HAVE_DEHAZE_V10
553 XCamReturn
translateAdehazeStats(const SmartPtr<VideoBuffer> & from,SmartPtr<RkAiqAdehazeStatsProxy> & to)554 RkAiqResourceTranslator::translateAdehazeStats (const SmartPtr<VideoBuffer> &from, SmartPtr<RkAiqAdehazeStatsProxy> &to)
555 {
556 XCamReturn ret = XCAM_RETURN_NO_ERROR;
557 Isp20StatsBuffer* buf =
558 from.get_cast_ptr <Isp20StatsBuffer>();
559 struct rkisp_isp2x_stat_buffer *stats;
560 SmartPtr<RkAiqAdehazeStats> statsInt = to->data();
561
562 stats = (struct rkisp_isp2x_stat_buffer *)(buf->get_v4l2_userptr());
563 if(stats == NULL) {
564 LOGE("fail to get stats ,ignore\n");
565 return XCAM_RETURN_BYPASS;
566 }
567
568 LOGD_ANALYZER("stats frame_id(%d), meas_type; 0x%x, buf sequence(%d)",
569 stats->frame_id, stats->meas_type, buf->get_sequence());
570
571 statsInt->frame_id = stats->frame_id;
572
573 //dehaze
574 statsInt->adehaze_stats_valid = stats->meas_type >> 17 & 1;
575 statsInt->adehaze_stats.dehaze_stats_v10.dhaz_adp_air_base =
576 stats->params.dhaz.dhaz_adp_air_base;
577 statsInt->adehaze_stats.dehaze_stats_v10.dhaz_adp_wt = stats->params.dhaz.dhaz_adp_wt;
578 statsInt->adehaze_stats.dehaze_stats_v10.dhaz_adp_gratio = stats->params.dhaz.dhaz_adp_gratio;
579 statsInt->adehaze_stats.dehaze_stats_v10.dhaz_adp_wt = stats->params.dhaz.dhaz_adp_wt;
580 for(int i = 0; i < 64; i++) {
581 statsInt->adehaze_stats.dehaze_stats_v10.h_b_iir[i] = stats->params.dhaz.h_b_iir[i];
582 statsInt->adehaze_stats.dehaze_stats_v10.h_g_iir[i] = stats->params.dhaz.h_g_iir[i];
583 statsInt->adehaze_stats.dehaze_stats_v10.h_r_iir[i] = stats->params.dhaz.h_r_iir[i];
584 }
585
586 to->set_sequence(stats->frame_id);
587
588 return ret;
589 }
590 #endif
591
592 XCamReturn
translateAfStats(const SmartPtr<VideoBuffer> & from,SmartPtr<RkAiqAfStatsProxy> & to)593 RkAiqResourceTranslator::translateAfStats (const SmartPtr<VideoBuffer> &from, SmartPtr<RkAiqAfStatsProxy> &to)
594 {
595 XCamReturn ret = XCAM_RETURN_NO_ERROR;
596 Isp20StatsBuffer* buf =
597 from.get_cast_ptr<Isp20StatsBuffer>();
598 #if defined(ISP_HW_V21)
599 struct rkisp_isp21_stat_buffer *stats;
600 #else
601 struct rkisp_isp2x_stat_buffer *stats;
602 #endif
603 SmartPtr<RkAiqAfStats> statsInt = to->data();
604
605 #if defined(ISP_HW_V21)
606 stats = (struct rkisp_isp21_stat_buffer *)(buf->get_v4l2_userptr());
607 #else
608 stats = (struct rkisp_isp2x_stat_buffer *)(buf->get_v4l2_userptr());
609 #endif
610 if(stats == NULL) {
611 LOGE("fail to get stats ,ignore\n");
612 return XCAM_RETURN_BYPASS;
613 }
614
615 LOGD_ANALYZER("stats frame_id(%d), meas_type; 0x%x, buf sequence(%d)",
616 stats->frame_id, stats->meas_type, buf->get_sequence());
617
618 SmartPtr<RkAiqAfInfoProxy> afParams = buf->get_af_params();
619
620 statsInt->frame_id = stats->frame_id;
621
622 //af
623 {
624 statsInt->af_stats_valid =
625 (stats->meas_type >> 6) & (0x01) ? true : false;
626 statsInt->af_stats.roia_luminance =
627 stats->params.rawaf.afm_lum[0];
628 statsInt->af_stats.roib_sharpness =
629 stats->params.rawaf.afm_sum[1];
630 statsInt->af_stats.roib_luminance =
631 stats->params.rawaf.afm_lum[1];
632 memcpy(statsInt->af_stats.global_sharpness,
633 stats->params.rawaf.ramdata, ISP2X_RAWAF_SUMDATA_NUM * sizeof(u32));
634
635 statsInt->af_stats.roia_sharpness = 0LL;
636 for (int i = 0; i < ISP2X_RAWAF_SUMDATA_NUM; i++)
637 statsInt->af_stats.roia_sharpness += stats->params.rawaf.ramdata[i];
638
639 if(afParams.ptr()) {
640 statsInt->af_stats.focusCode = afParams->data()->focusCode;
641 statsInt->af_stats.zoomCode = afParams->data()->zoomCode;
642 statsInt->af_stats.focus_endtim = afParams->data()->focusEndTim;
643 statsInt->af_stats.focus_starttim = afParams->data()->focusStartTim;
644 statsInt->af_stats.zoom_endtim = afParams->data()->zoomEndTim;
645 statsInt->af_stats.zoom_starttim = afParams->data()->zoomStartTim;
646 statsInt->af_stats.sof_tim = afParams->data()->sofTime;
647 statsInt->af_stats.lowpass_id = afParams->data()->lowPassId;
648 statsInt->af_stats.focusCorrection = afParams->data()->focusCorrection;
649 statsInt->af_stats.zoomCorrection = afParams->data()->zoomCorrection;
650 memcpy(statsInt->af_stats.lowpass_fv4_4,
651 afParams->data()->lowPassFv4_4, ISP2X_RAWAF_SUMDATA_NUM * sizeof(u32));
652 memcpy(statsInt->af_stats.lowpass_fv8_8,
653 afParams->data()->lowPassFv8_8, ISP2X_RAWAF_SUMDATA_NUM * sizeof(u32));
654 memcpy(statsInt->af_stats.lowpass_highlht,
655 afParams->data()->lowPassHighLht, ISP2X_RAWAF_SUMDATA_NUM * sizeof(u32));
656 memcpy(statsInt->af_stats.lowpass_highlht2,
657 afParams->data()->lowPassHighLht2, ISP2X_RAWAF_SUMDATA_NUM * sizeof(u32));
658
659 statsInt->af_stats.angleZ = afParams->data()->angleZ;
660 }
661
662 if (_expParams.ptr())
663 statsInt->aecExpInfo = _expParams->data()->aecExpInfo;
664 }
665
666 to->set_sequence(stats->frame_id);
667
668 return ret;
669 }
670
671 #if RKAIQ_HAVE_PDAF
672 XCamReturn
translatePdafStats(const SmartPtr<VideoBuffer> & from,SmartPtr<RkAiqPdafStatsProxy> & to,bool sns_mirror)673 RkAiqResourceTranslator::translatePdafStats (const SmartPtr<VideoBuffer> &from, SmartPtr<RkAiqPdafStatsProxy> &to, bool sns_mirror)
674 {
675 XCamReturn ret = XCAM_RETURN_NO_ERROR;
676 PdafBufferProxy* buf =
677 from.get_cast_ptr<PdafBufferProxy>();
678 void *pdafstats = (void *)(buf->get_v4l2_userptr());
679 SmartPtr<RkAiqPdafStats> statsInt = to->data();
680
681 if (pdafstats == NULL) {
682 LOGE("fail to get stats ,ignore\n");
683 return XCAM_RETURN_BYPASS;
684 }
685
686 rk_aiq_isp_pdaf_meas_t* pdaf = &buf->pdaf_meas;
687 uint16_t *pdLData, *pdRData, *pdData;
688 uint32_t i, j, pixelperline;
689 unsigned short pdWidth;
690 unsigned short pdHeight;
691
692 pdLData = statsInt->pdaf_stats.pdLData;
693 pdRData = statsInt->pdaf_stats.pdRData;
694 pdData = (uint16_t *)pdafstats;
695
696 //LOGD_AF("%s: frame_id %d, timestamp %lld, pdLData %p, pdRData %p, pdData %p",
697 // __func__, buf->get_sequence(), buf->get_timestamp(), pdLData, pdRData, pdData);
698
699 #ifdef PDAF_RAW_DUMP
700 {
701 FILE* fp;
702 char name[64];
703 uint32_t frame_id = buf->get_sequence() % 10;
704
705 ALOGD("@%s: pdWidthxpdHeight: %dx%d !\n", __FUNCTION__, pdaf->pdWidth, pdaf->pdHeight);
706 memset(name, 0, sizeof(name));
707 if (frame_id < 3) {
708 sprintf(name, DEFAULT_PD_RAW_PATH, frame_id);
709 fp = fopen(name, "wb");
710 fwrite(pdData, pdaf->pdWidth * pdaf->pdHeight, 2, fp);
711 fflush(fp);
712 fclose(fp);
713 }
714 }
715 #endif
716
717 if (pdaf->pdLRInDiffLine == 0) {
718 pdWidth = pdaf->pdWidth >> 1;
719 pdHeight = pdaf->pdHeight;
720
721 #ifdef NEON_OPT
722 uint16x8x2_t vld2_data;
723 uint16x8_t vrev_data;
724 pixelperline = 2 * pdWidth;
725 for (j = 0; j < pdHeight; j++) {
726 pdData = (uint16_t *)pdafstats + j * pixelperline;
727 for (i = 0; i < pixelperline / 16 * 16; i += 16) {
728 vld2_data = vld2q_u16(pdData);
729 vst1q_u16(pdLData, vld2_data.val[0]);
730 vst1q_u16(pdRData, vld2_data.val[1]);
731 pdLData += 8;
732 pdRData += 8;
733 pdData += 16;
734 }
735
736 if (pixelperline % 16) {
737 for (i = 0; i < pixelperline % 16; i += 2) {
738 *pdLData++ = pdData[i];
739 *pdRData++ = pdData[i + 1];
740 }
741 }
742 }
743 #else
744 pixelperline = 2 * pdWidth;
745 for (j = 0; j < pdHeight; j++) {
746 pdData = (uint16_t *)pdafstats + j * pixelperline;
747 for (i = 0; i < pixelperline; i += 2) {
748 *pdLData++ = pdData[i];
749 *pdRData++ = pdData[i + 1];
750 }
751 }
752 #endif
753 } else {
754 pdWidth = pdaf->pdWidth;
755 pdHeight = pdaf->pdHeight >> 1;
756 pixelperline = pdaf->pdWidth;
757 for (j = 0; j < 2 * pdHeight; j += 2) {
758 memcpy(pdRData, pdData, pixelperline * sizeof(uint16_t));
759 pdData += pixelperline;
760 memcpy(pdLData, pdData, pixelperline * sizeof(uint16_t));
761 pdData += pixelperline;
762 pdLData += pixelperline;
763 pdRData += pixelperline;
764 }
765 }
766
767 #ifdef PDAF_RAW_DUMP
768 {
769 FILE* fp;
770 char name[64];
771 int frame_id = buf->get_sequence() % 10;
772
773 if (frame_id < 3) {
774 memset(name, 0, sizeof(name));
775 sprintf(name, DEFAULT_PD_LRAW_PATH, frame_id);
776 fp = fopen(name, "wb");
777 fwrite(statsInt->pdaf_stats.pdLData, pdWidth * pdHeight, 2, fp);
778 fflush(fp);
779 fclose(fp);
780
781 memset(name, 0, sizeof(name));
782 sprintf(name, DEFAULT_PD_RRAW_PATH, frame_id);
783 fp = fopen(name, "wb");
784 fwrite(statsInt->pdaf_stats.pdRData, pdWidth * pdHeight, 2, fp);
785 fflush(fp);
786 fclose(fp);
787 }
788 }
789 #endif
790
791 statsInt->pdaf_stats_valid = true;
792 statsInt->frame_id = buf->get_sequence();
793 statsInt->pdaf_stats.pdWidth = pdWidth;
794 statsInt->pdaf_stats.pdHeight = pdHeight;
795 statsInt->pdaf_stats.pdMirror = sns_mirror;
796 statsInt->pdaf_stats.pdMean = 0;
797
798 return ret;
799 }
800 #endif
801
802 XCamReturn
translateOrbStats(const SmartPtr<VideoBuffer> & from,SmartPtr<RkAiqOrbStatsProxy> & to)803 RkAiqResourceTranslator::translateOrbStats (const SmartPtr<VideoBuffer> &from,
804 SmartPtr<RkAiqOrbStatsProxy> &to)
805 {
806 XCamReturn ret = XCAM_RETURN_NO_ERROR;
807 V4l2BufferProxy* nr_stats_buf =
808 from.get_cast_ptr<V4l2BufferProxy>();
809 SmartPtr<RkAiqOrbStats> statsInt = to->data();
810
811 struct rkispp_stats_nrbuf *stats = NULL;
812 stats = (struct rkispp_stats_nrbuf *)(nr_stats_buf->get_v4l2_userptr());
813
814 // orbStats->data()->valid = true;//(stats->meas_type >> 4) & (0x01) ? true : false;
815 statsInt->orb_stats.frame_id = stats->frame_id;
816 statsInt->orb_stats.num_points = stats->total_num;
817 if (stats->total_num > 0 && stats->total_num <= ORB_DATA_NUM)
818 memcpy(statsInt->orb_stats.points, stats->data, stats->total_num * sizeof(stats->data[0]));
819
820 to->set_sequence(stats->frame_id);
821
822 return ret;
823 }
824
825 XCamReturn
getParams(const SmartPtr<VideoBuffer> & from)826 RkAiqResourceTranslator::getParams(const SmartPtr<VideoBuffer>& from)
827 {
828 Isp20StatsBuffer* buf = from.get_cast_ptr<Isp20StatsBuffer>();
829 #ifdef ISP_HW_V32_LITE
830 auto stats = (struct rkisp32_lite_stat_buffer*)(buf->get_v4l2_userptr());
831 #elif ISP_HW_V32
832 auto stats = (struct rkisp32_isp_stat_buffer*)(buf->get_v4l2_userptr());
833 #elif defined(ISP_HW_V30)
834 auto stats = (struct rkisp3x_isp_stat_buffer*)(buf->get_v4l2_userptr());
835 #elif defined(ISP_HW_V21)
836 auto stats = (struct rkisp_isp21_stat_buffer*)(buf->get_v4l2_userptr());
837 #elif defined(ISP_HW_V20)
838 auto stats = (struct rkisp_isp2x_stat_buffer*)(buf->get_v4l2_userptr());
839 #endif
840
841 //TODO: check if needed
842 //memset(&ispParams, 0, sizeof(_expParams));
843
844 if (buf->getEffectiveExpParams(stats->frame_id, _expParams) < 0)
845 LOGE("fail to get expParams");
846 #ifdef ISP_HW_V20
847 if (buf->getEffectiveIspParams(stats->frame_id, _ispParams) < 0) {
848 #else
849 if (buf->getEffectiveIspParams(stats->params_id, _ispParams) < 0) {
850 #endif
851 LOGE("fail to get ispParams ,ignore\n");
852 return XCAM_RETURN_BYPASS;
853 }
854
855 return XCAM_RETURN_NO_ERROR;
856 }
857
858 void
859 RkAiqResourceTranslator::releaseParams()
860 {
861 _expParams.release();
862 }
863
864 } //namespace RkCam
865