xref: /OK3568_Linux_fs/external/rockit/mpi/example/common/test_comm_utils.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright 2020 Rockchip Electronics Co. LTD
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
5*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
6*4882a593Smuzhiyun  * You may obtain a copy of the License at
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *      http://www.apache.org/licenses/LICENSE-2.0
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
11*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
12*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
14*4882a593Smuzhiyun  * limitations under the License.
15*4882a593Smuzhiyun  */
16*4882a593Smuzhiyun #include <sys/stat.h>
17*4882a593Smuzhiyun #include <sys/types.h>
18*4882a593Smuzhiyun #include <time.h>
19*4882a593Smuzhiyun #include <cstring>
20*4882a593Smuzhiyun #include <stdlib.h>
21*4882a593Smuzhiyun #include <cerrno>
22*4882a593Smuzhiyun #include <unistd.h>
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #include "test_comm_utils.h"
25*4882a593Smuzhiyun #include "rk_mpi_cal.h"
26*4882a593Smuzhiyun #include "rk_mpi_mb.h"
27*4882a593Smuzhiyun #include "rk_mpi_sys.h"
28*4882a593Smuzhiyun #include "rk_debug.h"
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #ifdef __cplusplus
31*4882a593Smuzhiyun #if __cplusplus
32*4882a593Smuzhiyun extern "C" {
33*4882a593Smuzhiyun #endif
34*4882a593Smuzhiyun #endif /* End of #ifdef __cplusplus */
35*4882a593Smuzhiyun static RKSocType gEnRkSocType;
36*4882a593Smuzhiyun 
TEST_COMM_GetNowUs()37*4882a593Smuzhiyun RK_U64 TEST_COMM_GetNowUs() {
38*4882a593Smuzhiyun     struct timespec time = {0, 0};
39*4882a593Smuzhiyun     clock_gettime(CLOCK_MONOTONIC, &time);
40*4882a593Smuzhiyun     return (RK_U64)time.tv_sec * 1000000 + (RK_U64)time.tv_nsec / 1000; /* microseconds */
41*4882a593Smuzhiyun }
42*4882a593Smuzhiyun 
TEST_COMM_GetUriSchemeType(const char * uri)43*4882a593Smuzhiyun URI_SCHEME_TYPE TEST_COMM_GetUriSchemeType(const char* uri) {
44*4882a593Smuzhiyun     URI_SCHEME_TYPE schemeType = RK_URI_SCHEME_LOCAL;
45*4882a593Smuzhiyun     if ((RK_NULL == uri) || (strlen(uri) < 4)) {
46*4882a593Smuzhiyun         return schemeType;
47*4882a593Smuzhiyun     }
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun     if (!strncmp("http://", uri, 7) || !strncmp("https://", uri, 8)) {
50*4882a593Smuzhiyun         schemeType = RK_URI_SCHEME_HTTP;
51*4882a593Smuzhiyun     } else if (!strncmp("rtsp://", uri, 7) || !strncmp("rtmp://", uri, 7)) {
52*4882a593Smuzhiyun         RK_LOGD("uri is with rtsp or rtmp scheme type");
53*4882a593Smuzhiyun         schemeType = RK_URI_SCHEME_RTSP;
54*4882a593Smuzhiyun     } else if (!strncmp("/data/smb/", uri, 10)) {
55*4882a593Smuzhiyun         RK_LOGD("uri is with /data/smb scheme type");
56*4882a593Smuzhiyun         schemeType = RK_URI_SCHEME_SAMBA;
57*4882a593Smuzhiyun     } else if (!strncmp("/data/nfs/", uri, 10)) {
58*4882a593Smuzhiyun         RK_LOGD("uri is with /data/nfs schemeType (signed as samba)");
59*4882a593Smuzhiyun         schemeType = RK_URI_SCHEME_SAMBA;
60*4882a593Smuzhiyun     } else if (strstr(uri, "m3u8")) {
61*4882a593Smuzhiyun         RK_LOGD("uri is with m3u8 scheme type");
62*4882a593Smuzhiyun         schemeType = RK_URI_SCHEME_HLS;
63*4882a593Smuzhiyun     } else if (!strncmp("rtp:", uri, 4)) {
64*4882a593Smuzhiyun         RK_LOGD("uri is with rtp scheme type");
65*4882a593Smuzhiyun         schemeType = RK_URI_SCHEME_RTP;
66*4882a593Smuzhiyun     } else if (!strncmp("udp:", uri, 4)) {
67*4882a593Smuzhiyun         RK_LOGD("uri is with udp scheme type");
68*4882a593Smuzhiyun         schemeType = RK_URI_SCHEME_UDP;
69*4882a593Smuzhiyun     } else if (!strncmp("mms://", uri, 6)) {
70*4882a593Smuzhiyun         RK_LOGD("uri is with mms scheme type");
71*4882a593Smuzhiyun         schemeType = RK_URI_SCHEME_MMS;
72*4882a593Smuzhiyun     } else if (!strncmp("mmsh://", uri, 7)) {
73*4882a593Smuzhiyun         RK_LOGD("uri is with mmsh scheme type");
74*4882a593Smuzhiyun         schemeType = RK_URI_SCHEME_MMSH;
75*4882a593Smuzhiyun     } else if (!strncmp("mmst://", uri, 7)) {
76*4882a593Smuzhiyun         RK_LOGD("uri is with mmst scheme type");
77*4882a593Smuzhiyun         schemeType = RK_URI_SCHEME_MMST;
78*4882a593Smuzhiyun     } else if (strstr(uri, "app_tts-cache")) {
79*4882a593Smuzhiyun         RK_LOGD("uri is with tts scheme type");
80*4882a593Smuzhiyun         schemeType = RK_URI_SCHEME_TTS;
81*4882a593Smuzhiyun     }  else if (strstr(uri, "cache://")) {
82*4882a593Smuzhiyun         schemeType = RK_URI_SCHEME_IPTV;
83*4882a593Smuzhiyun     }
84*4882a593Smuzhiyun     return schemeType;
85*4882a593Smuzhiyun }
86*4882a593Smuzhiyun 
TEST_COMM_OpenFileUris(const char * pCfgFileUri,char ** pFileUris,RK_U32 u32UriCount)87*4882a593Smuzhiyun RK_S32 TEST_COMM_OpenFileUris(const char *pCfgFileUri, char **pFileUris, RK_U32 u32UriCount) {
88*4882a593Smuzhiyun     FILE *fp = RK_NULL;
89*4882a593Smuzhiyun     RK_U32 u32Count = 0;
90*4882a593Smuzhiyun     RK_U32 u32FileLen = 0;
91*4882a593Smuzhiyun     RK_U32 u32Len = 0;
92*4882a593Smuzhiyun     RK_S32 s32Ret = 0;
93*4882a593Smuzhiyun     char *pLine = RK_NULL;
94*4882a593Smuzhiyun     char *pBuffer = RK_NULL;
95*4882a593Smuzhiyun     size_t sLen = 0;
96*4882a593Smuzhiyun     size_t sReadLen = 0;
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun     if ((fp = fopen(pCfgFileUri, "r")) == RK_NULL) {
99*4882a593Smuzhiyun         RK_LOGE("Error! opening file %s error is %s", pCfgFileUri, strerror(errno));
100*4882a593Smuzhiyun         return RK_FAILURE;
101*4882a593Smuzhiyun     }
102*4882a593Smuzhiyun     fseek(fp, 0L, SEEK_END);
103*4882a593Smuzhiyun     u32FileLen = ftell(fp);
104*4882a593Smuzhiyun     fseek(fp, 0, SEEK_SET);
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun     while (sReadLen = getline(&pLine, &sLen, fp) != -1) {
107*4882a593Smuzhiyun         RK_S32 len = strlen(pLine) + 1;
108*4882a593Smuzhiyun         pBuffer = reinterpret_cast<char *>(malloc(len));
109*4882a593Smuzhiyun         snprintf(pBuffer, len, "%s", pLine);
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun         while (len) {
112*4882a593Smuzhiyun             len--;
113*4882a593Smuzhiyun             if (pBuffer[len] == '\r') {
114*4882a593Smuzhiyun                 pBuffer[len] = '\0';
115*4882a593Smuzhiyun                 break;
116*4882a593Smuzhiyun             }
117*4882a593Smuzhiyun         }
118*4882a593Smuzhiyun         pFileUris[u32Count] = pBuffer;
119*4882a593Smuzhiyun         free(pLine);
120*4882a593Smuzhiyun         sLen = RK_NULL;
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun         RK_LOGV("url %s", pFileUris[u32Count]);
123*4882a593Smuzhiyun         u32Count++;
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun         if (u32Count >= u32UriCount)
126*4882a593Smuzhiyun             break;
127*4882a593Smuzhiyun     }
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun     fclose(fp);
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun     return RK_SUCCESS;
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun 
TEST_COMM_CloseFileUris(char ** pFileUris,RK_U32 u32UriCount)134*4882a593Smuzhiyun void TEST_COMM_CloseFileUris(char **pFileUris, RK_U32 u32UriCount) {
135*4882a593Smuzhiyun     RK_U32 u32Index = 0;
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun     for (u32Index = 0; u32Index < u32UriCount; u32Index++) {
138*4882a593Smuzhiyun         if (pFileUris[u32Index] != RK_NULL) {
139*4882a593Smuzhiyun             free(pFileUris[u32Index]);
140*4882a593Smuzhiyun             pFileUris[u32Index] = RK_NULL;
141*4882a593Smuzhiyun         }
142*4882a593Smuzhiyun     }
143*4882a593Smuzhiyun }
144*4882a593Smuzhiyun 
TEST_COMM_FileReadOneFrame(const char * pFileName,VIDEO_FRAME_INFO_S * pstVideoFrame)145*4882a593Smuzhiyun RK_S32 TEST_COMM_FileReadOneFrame(const char *pFileName, VIDEO_FRAME_INFO_S *pstVideoFrame) {
146*4882a593Smuzhiyun     RK_U32 u32ReadSize = 0;
147*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
148*4882a593Smuzhiyun     FILE *fp = RK_NULL;
149*4882a593Smuzhiyun     PIC_BUF_ATTR_S stPicBufAttr;
150*4882a593Smuzhiyun     MB_PIC_CAL_S stMbPicCalResult;
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun     if (!pFileName || !pstVideoFrame) {
153*4882a593Smuzhiyun         return RK_FAILURE;
154*4882a593Smuzhiyun     }
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun     stPicBufAttr.u32Width = pstVideoFrame->stVFrame.u32VirWidth;
157*4882a593Smuzhiyun     stPicBufAttr.u32Height = pstVideoFrame->stVFrame.u32VirHeight;
158*4882a593Smuzhiyun     stPicBufAttr.enPixelFormat = pstVideoFrame->stVFrame.enPixelFormat;
159*4882a593Smuzhiyun     stPicBufAttr.enCompMode = pstVideoFrame->stVFrame.enCompressMode;
160*4882a593Smuzhiyun     s32Ret = RK_MPI_CAL_VGS_GetPicBufferSize(&stPicBufAttr, &stMbPicCalResult);
161*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
162*4882a593Smuzhiyun         RK_LOGE("RK_MPI_CAL_VGS_GetPicBufferSize failed. err=0x%x", s32Ret);
163*4882a593Smuzhiyun         return s32Ret;
164*4882a593Smuzhiyun     }
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun     fp = fopen(pFileName, "rb");
167*4882a593Smuzhiyun     if (fp == RK_NULL) {
168*4882a593Smuzhiyun         RK_LOGE("fopen %s failed, error: %s", pFileName, strerror(errno));
169*4882a593Smuzhiyun         s32Ret = RK_FAILURE;
170*4882a593Smuzhiyun         goto __FAILED;
171*4882a593Smuzhiyun     }
172*4882a593Smuzhiyun     u32ReadSize = fread(RK_MPI_MB_Handle2VirAddr(pstVideoFrame->stVFrame.pMbBlk),
173*4882a593Smuzhiyun                         1, stMbPicCalResult.u32MBSize, fp);
174*4882a593Smuzhiyun     if (u32ReadSize == 0) {
175*4882a593Smuzhiyun         RK_LOGE("fread %p failed! request %d", pFileName, stMbPicCalResult.u32MBSize);
176*4882a593Smuzhiyun         s32Ret = RK_FAILURE;
177*4882a593Smuzhiyun         goto __FAILED;
178*4882a593Smuzhiyun     }
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun     RK_MPI_SYS_MmzFlushCache(pstVideoFrame->stVFrame.pMbBlk, RK_FALSE);
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun __FAILED:
183*4882a593Smuzhiyun     if (fp) {
184*4882a593Smuzhiyun         fclose(fp);
185*4882a593Smuzhiyun     }
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun     return s32Ret;
188*4882a593Smuzhiyun }
189*4882a593Smuzhiyun 
TEST_COMM_FileWriteOneFrame(const char * pFileName,VIDEO_FRAME_INFO_S * pstVideoFrame)190*4882a593Smuzhiyun RK_S32 TEST_COMM_FileWriteOneFrame(const char *pFileName, VIDEO_FRAME_INFO_S *pstVideoFrame) {
191*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
192*4882a593Smuzhiyun     FILE *fp = RK_NULL;
193*4882a593Smuzhiyun     PIC_BUF_ATTR_S stPicBufAttr;
194*4882a593Smuzhiyun     MB_PIC_CAL_S stMbPicCalResult;
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun     if (!pFileName || !pstVideoFrame) {
197*4882a593Smuzhiyun         return RK_FAILURE;
198*4882a593Smuzhiyun     }
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun     stPicBufAttr.u32Width = pstVideoFrame->stVFrame.u32VirWidth;
201*4882a593Smuzhiyun     stPicBufAttr.u32Height = pstVideoFrame->stVFrame.u32VirHeight;
202*4882a593Smuzhiyun     stPicBufAttr.enPixelFormat = pstVideoFrame->stVFrame.enPixelFormat;
203*4882a593Smuzhiyun     stPicBufAttr.enCompMode = pstVideoFrame->stVFrame.enCompressMode;
204*4882a593Smuzhiyun     s32Ret = RK_MPI_CAL_VGS_GetPicBufferSize(&stPicBufAttr, &stMbPicCalResult);
205*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
206*4882a593Smuzhiyun         RK_LOGE("RK_MPI_CAL_VGS_GetPicBufferSize failed. err=0x%x", s32Ret);
207*4882a593Smuzhiyun         return s32Ret;
208*4882a593Smuzhiyun     }
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun     RK_MPI_SYS_MmzFlushCache(pstVideoFrame->stVFrame.pMbBlk, RK_TRUE);
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun     fp = fopen(pFileName, "wb");
213*4882a593Smuzhiyun     if (fp == RK_NULL) {
214*4882a593Smuzhiyun         RK_LOGE("open %s failed, error: %s", pFileName, strerror(errno));
215*4882a593Smuzhiyun         s32Ret = RK_FAILURE;
216*4882a593Smuzhiyun         goto __FAILED;
217*4882a593Smuzhiyun     }
218*4882a593Smuzhiyun     fwrite(RK_MPI_MB_Handle2VirAddr(pstVideoFrame->stVFrame.pMbBlk),
219*4882a593Smuzhiyun             1, stMbPicCalResult.u32MBSize, fp);
220*4882a593Smuzhiyun     fflush(fp);
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun __FAILED:
223*4882a593Smuzhiyun     if (fp) {
224*4882a593Smuzhiyun         fclose(fp);
225*4882a593Smuzhiyun     }
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun     return RK_SUCCESS;
228*4882a593Smuzhiyun }
229*4882a593Smuzhiyun 
TEST_COMM_MkDirs(const char * muldir,RK_S32 mode)230*4882a593Smuzhiyun void TEST_COMM_MkDirs(const char *muldir, RK_S32 mode) {
231*4882a593Smuzhiyun     RK_S32 i, len;
232*4882a593Smuzhiyun     char str[512];
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun     strncpy(str, muldir, 512);
235*4882a593Smuzhiyun     len = strlen(str);
236*4882a593Smuzhiyun     for (i = 0; i < len; i++) {
237*4882a593Smuzhiyun         if (str[i] == '/') {
238*4882a593Smuzhiyun             str[i] = '\0';
239*4882a593Smuzhiyun             if (access(str, 0)) {
240*4882a593Smuzhiyun                 mkdir(str, mode);
241*4882a593Smuzhiyun             }
242*4882a593Smuzhiyun             str[i]='/';
243*4882a593Smuzhiyun         }
244*4882a593Smuzhiyun     }
245*4882a593Smuzhiyun     if (len > 0 && access(str, 0)) {
246*4882a593Smuzhiyun         mkdir(str, mode);
247*4882a593Smuzhiyun     }
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun     return;
250*4882a593Smuzhiyun }
251*4882a593Smuzhiyun 
TEST_COMM_CheckFileSizeInRange(const char * pFilePath,RK_S32 minSize,RK_S32 maxSize)252*4882a593Smuzhiyun RK_S32 TEST_COMM_CheckFileSizeInRange(const char *pFilePath,
253*4882a593Smuzhiyun                                                           RK_S32 minSize,
254*4882a593Smuzhiyun                                                           RK_S32 maxSize) {
255*4882a593Smuzhiyun     struct stat st;
256*4882a593Smuzhiyun     FILE *fp;
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun     if (access(pFilePath, 0)) {
259*4882a593Smuzhiyun         RK_LOGE("can't find file %s!", pFilePath);
260*4882a593Smuzhiyun         return RK_FAILURE;
261*4882a593Smuzhiyun     }
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun     if (stat(pFilePath, &st) == 0) {
264*4882a593Smuzhiyun         if (st.st_size >= minSize && st.st_size <= maxSize) {
265*4882a593Smuzhiyun             return RK_SUCCESS;
266*4882a593Smuzhiyun         } else {
267*4882a593Smuzhiyun             RK_LOGE("file %s size:%lld is out range[%d,%d]!",
268*4882a593Smuzhiyun                      pFilePath, st.st_size, minSize, maxSize);
269*4882a593Smuzhiyun             return RK_FAILURE;
270*4882a593Smuzhiyun         }
271*4882a593Smuzhiyun     } else {
272*4882a593Smuzhiyun         RK_LOGE("can't determine size of %s: %s!", pFilePath, strerror(errno));
273*4882a593Smuzhiyun         return RK_FAILURE;
274*4882a593Smuzhiyun     }
275*4882a593Smuzhiyun }
276*4882a593Smuzhiyun 
TEST_COMM_GetSocType()277*4882a593Smuzhiyun RKSocType TEST_COMM_GetSocType() {
278*4882a593Smuzhiyun     char achBuf[1024] = "";
279*4882a593Smuzhiyun     FILE *fd = NULL;
280*4882a593Smuzhiyun     RKSocType socType = RK_SOC_1126;
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun     if (gEnRkSocType)
283*4882a593Smuzhiyun         return gEnRkSocType;
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun     fd = fopen("/proc/device-tree/compatible", "r");
286*4882a593Smuzhiyun     memset(achBuf, 0, sizeof(achBuf));
287*4882a593Smuzhiyun     if (fd != NULL) {
288*4882a593Smuzhiyun         fread(achBuf, 1, sizeof(achBuf), fd);
289*4882a593Smuzhiyun         if ((strstr(achBuf, "rockchip")) ||
290*4882a593Smuzhiyun             (strstr(achBuf, "Rockchip")) ||
291*4882a593Smuzhiyun             (strstr(achBuf, "RK30board"))) {
292*4882a593Smuzhiyun             if (strstr(achBuf, "1126") || (strstr(achBuf, "1109")))
293*4882a593Smuzhiyun                 socType = RK_SOC_1126;
294*4882a593Smuzhiyun             else if (strstr(achBuf, "3566") || (strstr(achBuf, "3568")))
295*4882a593Smuzhiyun                 socType = RK_SOC_3568;
296*4882a593Smuzhiyun             else if (strstr(achBuf, "3588"))
297*4882a593Smuzhiyun                 socType = RK_SOC_3588;
298*4882a593Smuzhiyun         } else {
299*4882a593Smuzhiyun             RK_LOGE("not match rockchips device.");
300*4882a593Smuzhiyun         }
301*4882a593Smuzhiyun         fclose(fd);
302*4882a593Smuzhiyun     } else {
303*4882a593Smuzhiyun         RK_LOGE("open failed.");
304*4882a593Smuzhiyun     }
305*4882a593Smuzhiyun     gEnRkSocType = socType;
306*4882a593Smuzhiyun     RK_LOGD("get the rkchip:%d.", socType);
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun     return socType;
309*4882a593Smuzhiyun }
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun #ifdef __cplusplus
312*4882a593Smuzhiyun #if __cplusplus
313*4882a593Smuzhiyun }
314*4882a593Smuzhiyun #endif
315*4882a593Smuzhiyun #endif /* End of #ifdef __cplusplus */
316