1 /*
2 * Copyright (c) 2022 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include <stdio.h>
16 #include <stdlib.h>
17 #include <string.h>
18 #include <errno.h>
19 #include <fcntl.h>
20 #include <sys/mman.h>
21 #include <sys/stat.h>
22 #include <sys/types.h>
23 #include <unistd.h>
24 #include <signal.h>
25 #include <semaphore.h>
26 #include <pthread.h>
27
28 #include "sample_comm_ive.h"
29
30 #define SAMPLE_IVE_LK_MAX_POINT_NUM 500
31 #define SAMPLE_IVE_LK_MIN_DIST 5
32 #define SAMPLE_IVE_LK_PYR_MAX_LEVEL 4
33 #define SAMPLE_IVE_LK_PYR_LEVEL_3 3
34 #define SAMPLE_IVE_LK_MIN_EIG_THR 100
35 #define SAMPLE_IVE_LK_ITER_CNT 10
36 #define SAMPLE_IVE_LK_EPS 2
37 #define SAMPLE_IVE_LK_QUALITY_LEVEL 25
38 #define SAMPLE_IVE_LK_FRM_NUM 10
39 #define SAMPLE_IVE_LK_FIX_POINT_7 7
40
41 typedef struct hiSAMPLE_IVE_ST_LK_S {
42 IVE_SRC_IMAGE_S astPrevPyr[SAMPLE_IVE_LK_PYR_MAX_LEVEL];
43 IVE_SRC_IMAGE_S astNextPyr[SAMPLE_IVE_LK_PYR_MAX_LEVEL];
44 IVE_SRC_MEM_INFO_S stPrevPts;
45 IVE_MEM_INFO_S stNextPts;
46 IVE_DST_MEM_INFO_S stStatus;
47 IVE_DST_MEM_INFO_S stErr;
48 IVE_LK_OPTICAL_FLOW_PYR_CTRL_S stLkPyrCtrl;
49
50 IVE_SRC_IMAGE_S stStSrc;
51 IVE_IMAGE_S stStDst;
52 IVE_DST_MEM_INFO_S stCorner;
53 IVE_ST_CANDI_CORNER_CTRL_S stStCandiCornerCtrl;
54 IVE_ST_CORNER_CTRL_S stStCornerCtrl;
55
56 IVE_IMAGE_S stPyrTmp;
57 IVE_IMAGE_S stSrcYuv;
58 FILE *pFpSrc;
59 } SAMPLE_IVE_ST_LK_S;
60
61 static SAMPLE_IVE_ST_LK_S s_stStLk;
62 static HI_BOOL s_bStopSignal = HI_FALSE;
63
SAMPLE_IVE_St_Lk_DMA(IVE_HANDLE * pIveHandle,IVE_SRC_IMAGE_S * pstSrc,IVE_DST_IMAGE_S * pstDst,IVE_DMA_CTRL_S * pstDmaCtrl,HI_BOOL bInstant)64 static HI_S32 SAMPLE_IVE_St_Lk_DMA(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, IVE_DST_IMAGE_S *pstDst,
65 IVE_DMA_CTRL_S *pstDmaCtrl, HI_BOOL bInstant)
66 {
67 HI_S32 s32Ret = HI_FAILURE;
68 IVE_SRC_DATA_S stDataSrc;
69 IVE_DST_DATA_S stDataDst;
70
71 stDataSrc.u64VirAddr = pstSrc->au64VirAddr[0];
72 stDataSrc.u64PhyAddr = pstSrc->au64PhyAddr[0];
73 stDataSrc.u32Width = pstSrc->u32Width;
74 stDataSrc.u32Height = pstSrc->u32Height;
75 stDataSrc.u32Stride = pstSrc->au32Stride[0];
76
77 stDataDst.u64VirAddr = pstDst->au64VirAddr[0];
78 stDataDst.u64PhyAddr = pstDst->au64PhyAddr[0];
79 stDataDst.u32Width = pstDst->u32Width;
80 stDataDst.u32Height = pstDst->u32Height;
81 stDataDst.u32Stride = pstDst->au32Stride[0];
82 s32Ret = HI_MPI_IVE_DMA(pIveHandle, &stDataSrc, &stDataDst, pstDmaCtrl, bInstant);
83 SAMPLE_CHECK_EXPR_RET(s32Ret != HI_SUCCESS, s32Ret, "Error(%#x),HI_MPI_IVE_DMA failed!\n", s32Ret);
84
85 return s32Ret;
86 }
87
88 /* function : Copy pyr */
SAMPLE_IVE_St_Lk_CopyPyr(IVE_SRC_IMAGE_S astPyrSrc[],IVE_DST_IMAGE_S astPyrDst[],HI_U8 u8MaxLevel)89 static HI_VOID SAMPLE_IVE_St_Lk_CopyPyr(IVE_SRC_IMAGE_S astPyrSrc[], IVE_DST_IMAGE_S astPyrDst[], HI_U8 u8MaxLevel)
90 {
91 HI_U8 i;
92 HI_S32 s32Ret = HI_FAILURE;
93 IVE_HANDLE hIveHandle;
94
95 IVE_DMA_CTRL_S stCtrl;
96 (HI_VOID)memset_s(&stCtrl, sizeof(stCtrl), 0, sizeof(stCtrl));
97 stCtrl.enMode = IVE_DMA_MODE_DIRECT_COPY;
98
99 for (i = 0; i <= u8MaxLevel; i++) {
100 s32Ret = SAMPLE_IVE_St_Lk_DMA(&hIveHandle, &astPyrSrc[i], &astPyrDst[i], &stCtrl, HI_FALSE);
101 if (s32Ret != HI_SUCCESS) {
102 SAMPLE_PRT("SAMPLE_IVE_St_Lk_DMA fail,Error(%d)\n", s32Ret);
103 break;
104 }
105 }
106 }
107
108 /* function : St lk uninit */
SAMPLE_IVE_St_Lk_Uninit(SAMPLE_IVE_ST_LK_S * pstStLk)109 static HI_VOID SAMPLE_IVE_St_Lk_Uninit(SAMPLE_IVE_ST_LK_S *pstStLk)
110 {
111 HI_U16 i;
112 for (i = 0; i <= pstStLk->stLkPyrCtrl.u8MaxLevel; i++) {
113 IVE_MMZ_FREE(pstStLk->astPrevPyr[i].au64PhyAddr[0], pstStLk->astPrevPyr[i].au64VirAddr[0]);
114 IVE_MMZ_FREE(pstStLk->astNextPyr[i].au64PhyAddr[0], pstStLk->astNextPyr[i].au64VirAddr[0]);
115 }
116
117 IVE_MMZ_FREE(pstStLk->stPrevPts.u64PhyAddr, pstStLk->stPrevPts.u64VirAddr);
118 IVE_MMZ_FREE(pstStLk->stNextPts.u64PhyAddr, pstStLk->stNextPts.u64VirAddr);
119 IVE_MMZ_FREE(pstStLk->stStatus.u64PhyAddr, pstStLk->stStatus.u64VirAddr);
120 IVE_MMZ_FREE(pstStLk->stErr.u64PhyAddr, pstStLk->stErr.u64VirAddr);
121
122 IVE_MMZ_FREE(pstStLk->stStSrc.au64PhyAddr[0], pstStLk->stStSrc.au64VirAddr[0]);
123 IVE_MMZ_FREE(pstStLk->stStDst.au64PhyAddr[0], pstStLk->stStDst.au64VirAddr[0]);
124 IVE_MMZ_FREE(pstStLk->stCorner.u64PhyAddr, pstStLk->stCorner.u64VirAddr);
125
126 IVE_MMZ_FREE(pstStLk->stStCandiCornerCtrl.stMem.u64PhyAddr, pstStLk->stStCandiCornerCtrl.stMem.u64VirAddr);
127
128 IVE_MMZ_FREE(pstStLk->stPyrTmp.au64PhyAddr[0], pstStLk->stPyrTmp.au64VirAddr[0]);
129 IVE_MMZ_FREE(pstStLk->stSrcYuv.au64PhyAddr[0], pstStLk->stSrcYuv.au64VirAddr[0]);
130
131 IVE_CLOSE_FILE(pstStLk->pFpSrc);
132 }
133
134 /* function : St lk init */
SAMPLE_IVE_St_Lk_Init(SAMPLE_IVE_ST_LK_S * pstStLk,HI_CHAR * pchSrcFileName,HI_U32 u32Width,HI_U32 u32Height,HI_U32 u32PyrWidth,HI_U32 u32PyrHeight,HI_U8 u8MaxLevel)135 static HI_S32 SAMPLE_IVE_St_Lk_Init(SAMPLE_IVE_ST_LK_S *pstStLk, HI_CHAR *pchSrcFileName, HI_U32 u32Width,
136 HI_U32 u32Height, HI_U32 u32PyrWidth, HI_U32 u32PyrHeight, HI_U8 u8MaxLevel)
137 {
138 HI_S32 s32Ret = HI_SUCCESS;
139 HI_U32 u32Size = 0;
140 HI_U16 i;
141
142 (HI_VOID)memset_s(pstStLk, sizeof(SAMPLE_IVE_ST_LK_S), 0, sizeof(SAMPLE_IVE_ST_LK_S));
143
144 pstStLk->stLkPyrCtrl.enOutMode = IVE_LK_OPTICAL_FLOW_PYR_OUT_MODE_BOTH;
145 pstStLk->stLkPyrCtrl.bUseInitFlow = HI_TRUE;
146 pstStLk->stLkPyrCtrl.u16PtsNum = SAMPLE_IVE_LK_MAX_POINT_NUM;
147 pstStLk->stLkPyrCtrl.u8MaxLevel = u8MaxLevel;
148 pstStLk->stLkPyrCtrl.u0q8MinEigThr = SAMPLE_IVE_LK_MIN_EIG_THR; /* Minimum eigenvalue threshold: 100 */
149 pstStLk->stLkPyrCtrl.u8IterCnt = SAMPLE_IVE_LK_ITER_CNT; /* Maximum iteration times: 10 */
150 pstStLk->stLkPyrCtrl.u0q8Eps = SAMPLE_IVE_LK_EPS; /* Threshold of iteration: 2 */
151 // Init Pyr
152 for (i = 0; i <= u8MaxLevel; i++) {
153 s32Ret =
154 SAMPLE_COMM_IVE_CreateImage(&pstStLk->astPrevPyr[i], IVE_IMAGE_TYPE_U8C1, u32Width >> i, u32Height >> i);
155 SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, ST_LK_INIT_FAIL, "Error(%#x),Create prevPyr[%d] image failed!\n",
156 s32Ret, i);
157
158 s32Ret = SAMPLE_COMM_IVE_CreateImage(&pstStLk->astNextPyr[i], IVE_IMAGE_TYPE_U8C1,
159 pstStLk->astPrevPyr[i].u32Width, pstStLk->astPrevPyr[i].u32Height);
160 SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, ST_LK_INIT_FAIL, "Error(%#x),Create nextPyr[%d] image failed!\n",
161 s32Ret, i);
162 }
163 // Init prev pts
164 u32Size = sizeof(IVE_POINT_S25Q7_S) * SAMPLE_IVE_LK_MAX_POINT_NUM;
165 u32Size = SAMPLE_COMM_IVE_CalcStride(u32Size, IVE_ALIGN);
166 s32Ret = SAMPLE_COMM_IVE_CreateMemInfo(&(pstStLk->stPrevPts), u32Size);
167 SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, ST_LK_INIT_FAIL, "Error(%#x),Create prevPts mem info failed!\n",
168 s32Ret);
169 // Init next pts
170 s32Ret = SAMPLE_COMM_IVE_CreateMemInfo(&(pstStLk->stNextPts), u32Size);
171 SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, ST_LK_INIT_FAIL, "Error(%#x),Create nextPts mem info failed!\n",
172 s32Ret);
173
174 // Init status
175 u32Size = sizeof(HI_U8) * SAMPLE_IVE_LK_MAX_POINT_NUM;
176 u32Size = SAMPLE_COMM_IVE_CalcStride(u32Size, IVE_ALIGN);
177 s32Ret = SAMPLE_COMM_IVE_CreateMemInfo(&(pstStLk->stStatus), u32Size);
178 SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, ST_LK_INIT_FAIL, "Error(%#x),Create status mem info failed!\n",
179 s32Ret);
180
181 // Init err
182 u32Size = sizeof(HI_U9Q7) * SAMPLE_IVE_LK_MAX_POINT_NUM;
183 u32Size = SAMPLE_COMM_IVE_CalcStride(u32Size, IVE_ALIGN);
184 s32Ret = SAMPLE_COMM_IVE_CreateMemInfo(&(pstStLk->stErr), u32Size);
185 SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, ST_LK_INIT_FAIL, "Error(%#x),Create err mem info failed!\n", s32Ret);
186
187 // Init St
188 s32Ret = SAMPLE_COMM_IVE_CreateImage(&pstStLk->stStSrc, IVE_IMAGE_TYPE_U8C1, u32Width, u32Height);
189 SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, ST_LK_INIT_FAIL, "Error(%#x),Create src image failed!\n", s32Ret);
190
191 s32Ret = SAMPLE_COMM_IVE_CreateImage(&pstStLk->stStDst, IVE_IMAGE_TYPE_U8C1, u32Width, u32Height);
192 SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, ST_LK_INIT_FAIL, "Error(%#x),Create dst image failed!\n", s32Ret);
193
194 pstStLk->stStCandiCornerCtrl.u0q8QualityLevel = SAMPLE_IVE_LK_QUALITY_LEVEL; /* quality level: 25 */
195 u32Size = 4 * SAMPLE_COMM_IVE_CalcStride(u32Width, IVE_ALIGN) * u32Height + sizeof(IVE_ST_MAX_EIG_S); /* 4 */
196 s32Ret = SAMPLE_COMM_IVE_CreateMemInfo(&(pstStLk->stStCandiCornerCtrl.stMem), u32Size);
197 SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, ST_LK_INIT_FAIL,
198 "Error(%#x),Create CandiCornerCtrl.stMem mem info failed!\n", s32Ret);
199
200 u32Size = sizeof(IVE_ST_CORNER_INFO_S);
201 s32Ret = SAMPLE_COMM_IVE_CreateMemInfo(&(pstStLk->stCorner), u32Size);
202 SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, ST_LK_INIT_FAIL, "Error(%#x),Create corner mem info failed!\n",
203 s32Ret);
204
205 pstStLk->stStCornerCtrl.u16MaxCornerNum = SAMPLE_IVE_LK_MAX_POINT_NUM;
206 pstStLk->stStCornerCtrl.u16MinDist = SAMPLE_IVE_LK_MIN_DIST;
207
208 s32Ret = SAMPLE_COMM_IVE_CreateImage(&pstStLk->stPyrTmp, IVE_IMAGE_TYPE_U8C1, u32PyrWidth, u32PyrHeight);
209 SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, ST_LK_INIT_FAIL, "Error(%#x),Create pyrTmp image failed!\n", s32Ret);
210
211 s32Ret = SAMPLE_COMM_IVE_CreateImage(&pstStLk->stSrcYuv, IVE_IMAGE_TYPE_YUV420SP, u32Width, u32Height);
212 SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, ST_LK_INIT_FAIL, "Error(%#x),Create srcYuv image failed!\n", s32Ret);
213
214 s32Ret = HI_FAILURE;
215 pstStLk->pFpSrc = fopen(pchSrcFileName, "rb");
216 SAMPLE_CHECK_EXPR_GOTO(pstStLk->pFpSrc == HI_NULL, ST_LK_INIT_FAIL, "Error,Open file %s failed!\n", pchSrcFileName);
217
218 s32Ret = HI_SUCCESS;
219
220 ST_LK_INIT_FAIL:
221 if (s32Ret != HI_SUCCESS) {
222 SAMPLE_IVE_St_Lk_Uninit(pstStLk);
223 }
224 return s32Ret;
225 }
226
227 /* function : Pyr down */
SAMPLE_IVE_St_Lk_PyrDown(SAMPLE_IVE_ST_LK_S * pstStLk,IVE_SRC_IMAGE_S * pstSrc,IVE_DST_IMAGE_S * pstDst)228 static HI_S32 SAMPLE_IVE_St_Lk_PyrDown(SAMPLE_IVE_ST_LK_S *pstStLk, IVE_SRC_IMAGE_S *pstSrc, IVE_DST_IMAGE_S *pstDst)
229 {
230 HI_S32 s32Ret = HI_SUCCESS;
231 IVE_HANDLE hIveHandle;
232 IVE_DMA_CTRL_S stDmaCtrl = { IVE_DMA_MODE_INTERVAL_COPY, 0, 2, 1, 2 };
233 IVE_FILTER_CTRL_S stFltCtrl = { { 1, 2, 3, 2, 1, 2, 5, 6, 5, 2, 3, 6, 8, 6, 3, 2, 5, 6, 5, 2, 1, 2, 3, 2, 1 }, 7 };
234
235 pstStLk->stPyrTmp.u32Width = pstSrc->u32Width;
236 pstStLk->stPyrTmp.u32Height = pstSrc->u32Height;
237
238 s32Ret = HI_MPI_IVE_Filter(&hIveHandle, pstSrc, &pstStLk->stPyrTmp, &stFltCtrl, HI_FALSE);
239 SAMPLE_CHECK_EXPR_RET(s32Ret != HI_SUCCESS, s32Ret, "Error(%#x),HI_MPI_IVE_Filter failed!\n", s32Ret);
240
241 s32Ret = SAMPLE_IVE_St_Lk_DMA(&hIveHandle, &pstStLk->stPyrTmp, pstDst, &stDmaCtrl, HI_FALSE);
242 SAMPLE_CHECK_EXPR_RET(s32Ret != HI_SUCCESS, s32Ret, "Error(%#x),SAMPLE_IVE_St_Lk_DMA failed!\n", s32Ret);
243
244 return s32Ret;
245 }
246
247 /* function : St lk proc */
SAMPLE_IVE_St_LkProc(SAMPLE_IVE_ST_LK_S * pstStLk)248 static HI_S32 SAMPLE_IVE_St_LkProc(SAMPLE_IVE_ST_LK_S *pstStLk)
249 {
250 HI_U32 u32FrameNum = SAMPLE_IVE_LK_FRM_NUM;
251 HI_U32 i, k;
252 HI_U16 u16RectNum;
253 HI_S32 s32Ret = HI_SUCCESS;
254 HI_BOOL bBlock = HI_TRUE;
255 HI_BOOL bFinish = HI_FALSE;
256 IVE_HANDLE hIveHandle;
257 IVE_DMA_CTRL_S stDmaCtrl;
258 IVE_ST_CORNER_INFO_S *pstCornerInfo =
259 SAMPLE_COMM_IVE_CONVERT_64BIT_ADDR(IVE_ST_CORNER_INFO_S, pstStLk->stCorner.u64VirAddr);
260 IVE_POINT_S25Q7_S *psts25q7NextPts =
261 SAMPLE_COMM_IVE_CONVERT_64BIT_ADDR(IVE_POINT_S25Q7_S, pstStLk->stNextPts.u64VirAddr);
262
263 (HI_VOID)memset_s(&stDmaCtrl, sizeof(stDmaCtrl), 0, sizeof(stDmaCtrl));
264 stDmaCtrl.enMode = IVE_DMA_MODE_DIRECT_COPY;
265
266 for (i = 0; i < u32FrameNum && s_bStopSignal == HI_FALSE; i++) {
267 SAMPLE_PRT("Proc frame %d\n", i);
268 s32Ret = SAMPLE_COMM_IVE_ReadFile(&pstStLk->stSrcYuv, pstStLk->pFpSrc);
269 SAMPLE_CHECK_EXPR_RET(s32Ret != HI_SUCCESS, s32Ret, "Error(%#x),Read src file failed!\n", s32Ret);
270
271 s32Ret = SAMPLE_IVE_St_Lk_DMA(&hIveHandle, &pstStLk->stSrcYuv, &pstStLk->astNextPyr[0], &stDmaCtrl, HI_FALSE);
272 SAMPLE_CHECK_EXPR_RET(s32Ret != HI_SUCCESS, s32Ret, "Error(%#x),SAMPLE_IVE_St_Lk_DMA failed!\n", s32Ret);
273
274 for (k = 1; k <= pstStLk->stLkPyrCtrl.u8MaxLevel; k++) {
275 s32Ret = SAMPLE_IVE_St_Lk_PyrDown(pstStLk, &pstStLk->astNextPyr[k - 1], &pstStLk->astNextPyr[k]);
276 SAMPLE_CHECK_EXPR_RET(s32Ret != HI_SUCCESS, s32Ret,
277 "Error(%#x),SAMPLE_IVE_St_Lk_PyrDown level %d failed!\n", s32Ret, k);
278 }
279
280 if (i == 0) {
281 s32Ret = HI_MPI_IVE_STCandiCorner(&hIveHandle, &pstStLk->astNextPyr[0], &pstStLk->stStDst,
282 &pstStLk->stStCandiCornerCtrl, HI_TRUE);
283 SAMPLE_CHECK_EXPR_RET(s32Ret != HI_SUCCESS, s32Ret, "Error(%#x),HI_MPI_IVE_STCandiCorner failed!\n",
284 s32Ret);
285
286 s32Ret = HI_MPI_IVE_Query(hIveHandle, &bFinish, bBlock);
287 while (s32Ret == HI_ERR_IVE_QUERY_TIMEOUT) {
288 usleep(IVE_QUERY_SLEEP_TIME);
289 s32Ret = HI_MPI_IVE_Query(hIveHandle, &bFinish, bBlock);
290 }
291 SAMPLE_CHECK_EXPR_RET(s32Ret != HI_SUCCESS, s32Ret, "Error(%#x),HI_MPI_IVE_Query failed!\n", s32Ret);
292
293 s32Ret = HI_MPI_IVE_STCorner(&pstStLk->stStDst, &pstStLk->stCorner, &pstStLk->stStCornerCtrl);
294 SAMPLE_CHECK_EXPR_RET(s32Ret != HI_SUCCESS, s32Ret, "Error(%#x),HI_MPI_IVE_STCorner failed!\n", s32Ret);
295
296 pstStLk->stLkPyrCtrl.u16PtsNum = pstCornerInfo->u16CornerNum;
297 for (k = 0; k < pstStLk->stLkPyrCtrl.u16PtsNum; k++) {
298 psts25q7NextPts[k].s25q7X = (HI_S32)(pstCornerInfo->astCorner[k].u16X << SAMPLE_IVE_LK_FIX_POINT_7);
299 psts25q7NextPts[k].s25q7Y = (HI_S32)(pstCornerInfo->astCorner[k].u16Y << SAMPLE_IVE_LK_FIX_POINT_7);
300 }
301 } else {
302 s32Ret =
303 HI_MPI_IVE_LKOpticalFlowPyr(&hIveHandle, pstStLk->astPrevPyr, pstStLk->astNextPyr, &pstStLk->stPrevPts,
304 &pstStLk->stNextPts, &pstStLk->stStatus, &pstStLk->stErr, &pstStLk->stLkPyrCtrl, HI_TRUE);
305 SAMPLE_CHECK_EXPR_RET(s32Ret != HI_SUCCESS, s32Ret, "Error(%#x),HI_MPI_IVE_LKOpticalFlowPyr failed!\n",
306 s32Ret);
307
308 s32Ret = HI_MPI_IVE_Query(hIveHandle, &bFinish, bBlock);
309 while (s32Ret == HI_ERR_IVE_QUERY_TIMEOUT) {
310 usleep(IVE_QUERY_SLEEP_TIME);
311 s32Ret = HI_MPI_IVE_Query(hIveHandle, &bFinish, bBlock);
312 }
313 SAMPLE_CHECK_EXPR_RET(s32Ret != HI_SUCCESS, s32Ret, "Error(%#x),HI_MPI_IVE_Query failed!\n", s32Ret);
314
315 u16RectNum = 0;
316 for (k = 0; k < pstStLk->stLkPyrCtrl.u16PtsNum; k++) {
317 if (!(SAMPLE_COMM_IVE_CONVERT_64BIT_ADDR(HI_U8, pstStLk->stStatus.u64VirAddr))[k]) {
318 continue;
319 }
320 psts25q7NextPts[u16RectNum].s25q7X = psts25q7NextPts[k].s25q7X;
321 psts25q7NextPts[u16RectNum].s25q7Y = psts25q7NextPts[k].s25q7Y;
322 u16RectNum++;
323 }
324
325 pstStLk->stLkPyrCtrl.u16PtsNum = u16RectNum;
326 }
327 /* pre pts address and next pts address can not be overlap */
328 (HI_VOID)memcpy_s(SAMPLE_COMM_IVE_CONVERT_64BIT_ADDR(HI_VOID, pstStLk->stPrevPts.u64VirAddr),
329 sizeof(IVE_POINT_S25Q7_S) * pstStLk->stLkPyrCtrl.u16PtsNum,
330 SAMPLE_COMM_IVE_CONVERT_64BIT_ADDR(HI_VOID, pstStLk->stNextPts.u64VirAddr),
331 sizeof(IVE_POINT_S25Q7_S) * pstStLk->stLkPyrCtrl.u16PtsNum);
332
333 SAMPLE_IVE_St_Lk_CopyPyr(pstStLk->astNextPyr, pstStLk->astPrevPyr, pstStLk->stLkPyrCtrl.u8MaxLevel);
334 }
335
336 return s32Ret;
337 }
338
SAMPLE_IVE_St_LkPause(HI_VOID)339 static HI_VOID SAMPLE_IVE_St_LkPause(HI_VOID)
340 {
341 SAMPLE_IVE_St_Lk_Uninit(&s_stStLk);
342 (HI_VOID)memset_s(&s_stStLk, sizeof(s_stStLk), 0, sizeof(s_stStLk));
343 SAMPLE_COMM_IVE_IveMpiExit();
344 printf("\033[0;31mprogram termination abnormally!\033[0;39m\n");
345 }
346
SAMPLE_IVE_St_Lk(HI_VOID)347 HI_VOID SAMPLE_IVE_St_Lk(HI_VOID)
348 {
349 HI_CHAR *pchSrcFileName = "./data/input/stlk/st_lk_720x576_420sp.yuv";
350 HI_CHAR achSrcFileName[PATH_MAX] = {0};
351 HI_U16 u16Width = IVE_D1_WIDTH;
352 HI_U16 u16Height = IVE_D1_HEIGHT;
353 HI_U16 u16PyrWidth = IVE_D1_WIDTH;
354 HI_U16 u16PyrHeight = IVE_D1_HEIGHT;
355
356 HI_S32 s32Ret;
357 HI_U8 u8MaxLevel = SAMPLE_IVE_LK_PYR_LEVEL_3;
358 s_bStopSignal = HI_FALSE;
359
360 SAMPLE_CHECK_EXPR_RET_VOID(
361 (strlen(pchSrcFileName) > PATH_MAX) || (realpath(pchSrcFileName, achSrcFileName) == NULL), "invalid path!\n");
362 (HI_VOID)memset_s(&s_stStLk, sizeof(s_stStLk), 0, sizeof(s_stStLk));
363 SAMPLE_COMM_IVE_CheckIveMpiInit();
364
365 s32Ret =
366 SAMPLE_IVE_St_Lk_Init(&s_stStLk, achSrcFileName, u16Width, u16Height, u16PyrWidth, u16PyrHeight, u8MaxLevel);
367 SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, ST_LK_FAIL, "Error(%#x),SAMPLE_IVE_St_Lk_Init failed!\n", s32Ret);
368 if (s_bStopSignal == HI_TRUE) {
369 SAMPLE_IVE_St_LkPause();
370 return;
371 }
372 s32Ret = SAMPLE_IVE_St_LkProc(&s_stStLk);
373 if (s32Ret == HI_SUCCESS) {
374 SAMPLE_PRT("Process success!\n");
375 }
376
377 if (s_bStopSignal == HI_TRUE) {
378 SAMPLE_IVE_St_LkPause();
379 return;
380 }
381 s_bStopSignal = HI_TRUE;
382 SAMPLE_IVE_St_Lk_Uninit(&s_stStLk);
383 (HI_VOID)memset_s(&s_stStLk, sizeof(s_stStLk), 0, sizeof(s_stStLk));
384
385 ST_LK_FAIL:
386 s_bStopSignal = HI_TRUE;
387 SAMPLE_COMM_IVE_IveMpiExit();
388 }
389
390 /* function : St_Lk sample signal handle */
SAMPLE_IVE_St_Lk_HandleSig(HI_VOID)391 HI_VOID SAMPLE_IVE_St_Lk_HandleSig(HI_VOID)
392 {
393 s_bStopSignal = HI_TRUE;
394 }