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