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