• 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 typedef struct hiTEST_MEMORY_S {
31     IVE_SRC_IMAGE_S stSrc1;
32     IVE_SRC_IMAGE_S stSrc2;
33     IVE_DST_IMAGE_S stDst;
34     IVE_DST_MEM_INFO_S stHist;
35     IVE_SUB_CTRL_S stSubCtrl;
36     FILE *pFpSrc;
37     FILE *pFpDst;
38 } TEST_MEMORY_S;
39 
40 static TEST_MEMORY_S s_stTestMem;
41 static HI_BOOL s_bStopSignal = HI_FALSE;
42 
43 /* function : test memory uninit */
SAMPLE_IVE_TestMemory_Uninit(TEST_MEMORY_S * pstTestMem)44 static HI_VOID SAMPLE_IVE_TestMemory_Uninit(TEST_MEMORY_S *pstTestMem)
45 {
46     IVE_MMZ_FREE(pstTestMem->stSrc1.au64PhyAddr[0], pstTestMem->stSrc1.au64VirAddr[0]);
47     IVE_MMZ_FREE(pstTestMem->stSrc2.au64PhyAddr[0], pstTestMem->stSrc2.au64VirAddr[0]);
48     IVE_MMZ_FREE(pstTestMem->stDst.au64PhyAddr[0], pstTestMem->stDst.au64VirAddr[0]);
49     IVE_MMZ_FREE(pstTestMem->stHist.u64PhyAddr, pstTestMem->stHist.u64VirAddr);
50 
51     IVE_CLOSE_FILE(pstTestMem->pFpSrc);
52     IVE_CLOSE_FILE(pstTestMem->pFpDst);
53 }
54 /* function : test memory init */
SAMPLE_IVE_TestMemory_Init(TEST_MEMORY_S * pstTestMem,HI_CHAR * pchSrcFileName,HI_CHAR * pchDstFileName,HI_U32 u32Width,HI_U32 u32Height)55 static HI_S32 SAMPLE_IVE_TestMemory_Init(TEST_MEMORY_S *pstTestMem, HI_CHAR *pchSrcFileName, HI_CHAR *pchDstFileName,
56     HI_U32 u32Width, HI_U32 u32Height)
57 {
58     HI_S32 s32Ret = HI_FAILURE;
59     HI_U32 u32Size;
60 
61     (HI_VOID)memset_s(pstTestMem, sizeof(TEST_MEMORY_S), 0, sizeof(TEST_MEMORY_S));
62 
63     s32Ret = SAMPLE_COMM_IVE_CreateImage(&(pstTestMem->stSrc1), IVE_IMAGE_TYPE_U8C1, u32Width, u32Height);
64     SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, TEST_MEMORY_INIT_FAIL, "Error(%#x),Create src1 image failed!\n",
65         s32Ret);
66 
67     s32Ret = SAMPLE_COMM_IVE_CreateImage(&(pstTestMem->stSrc2), IVE_IMAGE_TYPE_U8C1, u32Width, u32Height);
68     SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, TEST_MEMORY_INIT_FAIL, "Error(%#x),Create src2 image failed!\n",
69         s32Ret);
70 
71     s32Ret = SAMPLE_COMM_IVE_CreateImage(&(pstTestMem->stDst), IVE_IMAGE_TYPE_U8C1, u32Width, u32Height);
72     SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, TEST_MEMORY_INIT_FAIL, "Error(%#x),Create dst image failed!\n",
73         s32Ret);
74 
75     u32Size = IVE_HIST_NUM * sizeof(HI_U32);
76     s32Ret = SAMPLE_COMM_IVE_CreateMemInfo(&(pstTestMem->stHist), u32Size);
77     SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, TEST_MEMORY_INIT_FAIL, "Error(%#x),Create hist mem info failed!\n",
78         s32Ret);
79 
80     pstTestMem->stSubCtrl.enMode = IVE_SUB_MODE_ABS;
81 
82     s32Ret = HI_FAILURE;
83     pstTestMem->pFpSrc = fopen(pchSrcFileName, "rb");
84     SAMPLE_CHECK_EXPR_GOTO(pstTestMem->pFpSrc == HI_NULL, TEST_MEMORY_INIT_FAIL, "Error,Open file %s failed!\n",
85         pchSrcFileName);
86 
87     pstTestMem->pFpDst = fopen(pchDstFileName, "wb");
88     SAMPLE_CHECK_EXPR_GOTO(pstTestMem->pFpDst == HI_NULL, TEST_MEMORY_INIT_FAIL, "Error,Open file %s failed!\n",
89         pchDstFileName);
90 
91     s32Ret = HI_SUCCESS;
92 
93 TEST_MEMORY_INIT_FAIL:
94     if (s32Ret != HI_SUCCESS) {
95         SAMPLE_IVE_TestMemory_Uninit(pstTestMem);
96     }
97     return s32Ret;
98 }
99 
100 /* function : test memory */
SAMPLE_IVE_TestMemoryProc(TEST_MEMORY_S * pstTestMem)101 static HI_S32 SAMPLE_IVE_TestMemoryProc(TEST_MEMORY_S *pstTestMem)
102 {
103     HI_S32 s32Ret;
104     HI_U32 *pu32Hist;
105     HI_U32 i;
106     IVE_HANDLE IveHandle;
107     HI_BOOL bInstant = HI_FALSE;
108     HI_BOOL bBlock = HI_TRUE;
109     HI_BOOL bFinish = HI_FALSE;
110     IVE_SRC_DATA_S stSrcData;
111     IVE_DST_DATA_S stDstData;
112     IVE_DMA_CTRL_S stDmaCtrl;
113 
114     s32Ret = SAMPLE_COMM_IVE_ReadFile(&(pstTestMem->stSrc1), pstTestMem->pFpSrc);
115     SAMPLE_CHECK_EXPR_RET(s32Ret != HI_SUCCESS, s32Ret, "Error(%#x),Read src file failed!\n", s32Ret);
116 
117     stDmaCtrl.enMode = IVE_DMA_MODE_DIRECT_COPY;
118 
119     stSrcData.u64VirAddr = pstTestMem->stSrc1.au64VirAddr[0];
120     stSrcData.u64PhyAddr = pstTestMem->stSrc1.au64PhyAddr[0];
121     stSrcData.u32Width = pstTestMem->stSrc1.u32Width;
122     stSrcData.u32Height = pstTestMem->stSrc1.u32Height;
123     stSrcData.u32Stride = pstTestMem->stSrc1.au32Stride[0];
124 
125     stDstData.u64VirAddr = pstTestMem->stSrc2.au64VirAddr[0];
126     stDstData.u64PhyAddr = pstTestMem->stSrc2.au64PhyAddr[0];
127     stDstData.u32Width = pstTestMem->stSrc2.u32Width;
128     stDstData.u32Height = pstTestMem->stSrc2.u32Height;
129     stDstData.u32Stride = pstTestMem->stSrc2.au32Stride[0];
130     s32Ret = HI_MPI_IVE_DMA(&IveHandle, &stSrcData, &stDstData, &stDmaCtrl, bInstant);
131     SAMPLE_CHECK_EXPR_RET(s32Ret != HI_SUCCESS, s32Ret, "Error(%#x),HI_MPI_IVE_DMA failed!\n", s32Ret);
132 
133     s32Ret = HI_MPI_IVE_Sub(&IveHandle, &pstTestMem->stSrc1, &pstTestMem->stSrc2, &pstTestMem->stDst,
134         &pstTestMem->stSubCtrl, bInstant);
135     SAMPLE_CHECK_EXPR_RET(s32Ret != HI_SUCCESS, s32Ret, "Error(%#x),HI_MPI_IVE_Sub failed!\n", s32Ret);
136 
137     bInstant = HI_TRUE;
138     s32Ret = HI_MPI_IVE_Hist(&IveHandle, &pstTestMem->stDst, &pstTestMem->stHist, bInstant);
139     SAMPLE_CHECK_EXPR_RET(s32Ret != HI_SUCCESS, s32Ret, "Error(%#x),HI_MPI_IVE_Hist failed!\n", s32Ret);
140 
141     s32Ret = HI_MPI_IVE_Query(IveHandle, &bFinish, bBlock);
142     while (s32Ret == HI_ERR_IVE_QUERY_TIMEOUT) {
143         usleep(IVE_QUERY_SLEEP_TIME); // sleep 100 us
144         s32Ret = HI_MPI_IVE_Query(IveHandle, &bFinish, bBlock);
145     }
146     SAMPLE_CHECK_EXPR_RET(s32Ret != HI_SUCCESS, s32Ret, "Error(%#x),HI_MPI_IVE_Query failed!\n", s32Ret);
147 
148     s32Ret = SAMPLE_COMM_IVE_WriteFile(&pstTestMem->stDst, pstTestMem->pFpDst);
149     SAMPLE_CHECK_EXPR_RET(s32Ret != HI_SUCCESS, s32Ret, "Error,Write dst file failed!\n");
150 
151     pu32Hist = SAMPLE_COMM_IVE_CONVERT_64BIT_ADDR(HI_U32, pstTestMem->stHist.u64VirAddr);
152     if (pu32Hist[0] != pstTestMem->stSrc1.u32Width * pstTestMem->stSrc1.u32Height) {
153         s32Ret = HI_FAILURE;
154         SAMPLE_PRT("Test mem error,pu32Hist[0] = %d\n", pu32Hist[0]);
155         for (i = 1; i < IVE_HIST_NUM; i++) {
156             if (pu32Hist[i] != 0) {
157                 SAMPLE_PRT("Test mem error, pu32Hist[%d] = %d\n", i, pu32Hist[i]);
158             }
159         }
160     }
161 
162     return s32Ret;
163 }
164 
SAMPLE_IVE_TestMemoryPause(HI_VOID)165 static HI_VOID SAMPLE_IVE_TestMemoryPause(HI_VOID)
166 {
167     SAMPLE_IVE_TestMemory_Uninit(&s_stTestMem);
168     (HI_VOID)memset_s(&s_stTestMem, sizeof(s_stTestMem), 0, sizeof(s_stTestMem));
169     SAMPLE_COMM_IVE_IveMpiExit();
170     printf("\033[0;31mprogram termination abnormally!\033[0;39m\n");
171 }
172 
173 /* function : Show test memory sample */
SAMPLE_IVE_TestMemory(HI_VOID)174 HI_VOID SAMPLE_IVE_TestMemory(HI_VOID)
175 {
176     HI_S32 s32Ret;
177     HI_U32 u32Width = IVE_D1_WIDTH;
178     HI_U32 u32Height = IVE_D1_HEIGHT;
179     HI_CHAR *pchSrcFile = "./data/input/testmem/test_mem_in.yuv";
180     HI_CHAR achDstFile[PATH_MAX] = {0};
181     HI_CHAR achSrcFile[PATH_MAX] = {0};
182     s_bStopSignal = HI_FALSE;
183 
184     SAMPLE_CHECK_EXPR_RET_VOID((strlen(pchSrcFile) > PATH_MAX) || (realpath(pchSrcFile, achSrcFile) == NULL),
185         "invalid path!\n");
186 
187     SAMPLE_CHECK_EXPR_RET_VOID(realpath("./data/output/testmem", achDstFile) == NULL, "invalid path");
188     s32Ret = strcat_s(achDstFile, PATH_MAX, "/test_mem_out.yuv");
189     SAMPLE_CHECK_EXPR_RET_VOID(s32Ret < 0, "invali param");
190     SAMPLE_CHECK_EXPR_RET_VOID(strlen(achDstFile) > PATH_MAX, "dst file path is invalid!\n");
191 
192     (HI_VOID)memset_s(&s_stTestMem, sizeof(s_stTestMem), 0, sizeof(s_stTestMem));
193     SAMPLE_COMM_IVE_CheckIveMpiInit();
194     s32Ret = SAMPLE_IVE_TestMemory_Init(&s_stTestMem, achSrcFile, achDstFile, u32Width, u32Height);
195     SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, TEST_MEMORY_FAIL, "Error(%#x),SAMPLE_IVE_TestMemory_Init failed!\n",
196         s32Ret);
197     if (s_bStopSignal == HI_TRUE) {
198         SAMPLE_IVE_TestMemoryPause();
199         return;
200     }
201 
202     s32Ret = SAMPLE_IVE_TestMemoryProc(&s_stTestMem);
203     if (s32Ret == HI_SUCCESS) {
204         SAMPLE_PRT("Process success!\n");
205     }
206     if (s_bStopSignal == HI_TRUE) {
207         SAMPLE_IVE_TestMemoryPause();
208         return;
209     }
210     s_bStopSignal = HI_TRUE;
211 
212     SAMPLE_IVE_TestMemory_Uninit(&s_stTestMem);
213     (HI_VOID)memset_s(&s_stTestMem, sizeof(s_stTestMem), 0, sizeof(s_stTestMem));
214 
215 TEST_MEMORY_FAIL:
216     s_bStopSignal = HI_TRUE;
217     SAMPLE_COMM_IVE_IveMpiExit();
218 }
219 
220 /* function : TestMemory sample signal handle */
SAMPLE_IVE_TestMemory_HandleSig(HI_VOID)221 HI_VOID SAMPLE_IVE_TestMemory_HandleSig(HI_VOID)
222 {
223     s_bStopSignal = HI_TRUE;
224 }
225