• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }