xref: /OK3568_Linux_fs/external/rockit/mpi/example/common/test_comm_vdec.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright 2021 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 
17*4882a593Smuzhiyun #include <pthread.h>
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun #include "test_comm_tmd.h"
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #include "rk_debug.h"
22*4882a593Smuzhiyun #include "rk_mpi_vdec.h"
23*4882a593Smuzhiyun #include "rk_mpi_sys.h"
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #ifdef __cplusplus
26*4882a593Smuzhiyun #if __cplusplus
27*4882a593Smuzhiyun extern "C" {
28*4882a593Smuzhiyun #endif
29*4882a593Smuzhiyun #endif /* End of #ifdef __cplusplus */
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun typedef struct test_vdec_thread_s {
32*4882a593Smuzhiyun      RK_BOOL bThreadStart;
33*4882a593Smuzhiyun      pthread_t VdecPid;
34*4882a593Smuzhiyun      STREAM_INFO_S stStreamInfo;
35*4882a593Smuzhiyun } TEST_VDEC_THREAD_S;
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun // get pic thread info
38*4882a593Smuzhiyun static TEST_VDEC_THREAD_S gGetPicThread[VDEC_MAX_CHN_NUM];
39*4882a593Smuzhiyun // send stream thread info
40*4882a593Smuzhiyun static TEST_VDEC_THREAD_S gSendStremThread[VDEC_MAX_CHN_NUM];
41*4882a593Smuzhiyun 
TEST_VDEC_Start(VDEC_CHN VdecChn,VDEC_CHN_ATTR_S * pstVdecAttr,VDEC_CHN_PARAM_S * pstVdecParam,VIDEO_DISPLAY_MODE_E enDispMode)42*4882a593Smuzhiyun RK_S32 TEST_VDEC_Start(VDEC_CHN VdecChn,
43*4882a593Smuzhiyun                         VDEC_CHN_ATTR_S *pstVdecAttr,
44*4882a593Smuzhiyun                         VDEC_CHN_PARAM_S *pstVdecParam,
45*4882a593Smuzhiyun                         VIDEO_DISPLAY_MODE_E enDispMode) {
46*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun     s32Ret = RK_MPI_VDEC_CreateChn(VdecChn, pstVdecAttr);
49*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
50*4882a593Smuzhiyun         RK_LOGE("create %d vdec failed with %#x!", VdecChn, s32Ret);
51*4882a593Smuzhiyun         return s32Ret;
52*4882a593Smuzhiyun     }
53*4882a593Smuzhiyun     s32Ret = RK_MPI_VDEC_SetChnParam(VdecChn, pstVdecParam);
54*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
55*4882a593Smuzhiyun         RK_LOGE("RK_MPI_VDEC_SetChnParam failed with %#x!", s32Ret);
56*4882a593Smuzhiyun         return s32Ret;
57*4882a593Smuzhiyun     }
58*4882a593Smuzhiyun     s32Ret = RK_MPI_VDEC_StartRecvStream(VdecChn);
59*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
60*4882a593Smuzhiyun         RK_LOGE("RK_MPI_VDEC_StartRecvStream failed with %#x!", s32Ret);
61*4882a593Smuzhiyun         return s32Ret;
62*4882a593Smuzhiyun     }
63*4882a593Smuzhiyun     s32Ret = RK_MPI_VDEC_SetDisplayMode(VdecChn, enDispMode);
64*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
65*4882a593Smuzhiyun         RK_LOGE("RK_MPI_VDEC_SetDisplayMode failed with %#x!", s32Ret);
66*4882a593Smuzhiyun         return s32Ret;
67*4882a593Smuzhiyun     }
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun     return RK_SUCCESS;
70*4882a593Smuzhiyun }
71*4882a593Smuzhiyun 
TEST_VDEC_Stop(VDEC_CHN VdecChn)72*4882a593Smuzhiyun RK_S32 TEST_VDEC_Stop(VDEC_CHN VdecChn) {
73*4882a593Smuzhiyun     RK_S32 s32Ret;
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun     s32Ret = RK_MPI_VDEC_StopRecvStream(VdecChn);
76*4882a593Smuzhiyun     if (RK_SUCCESS != s32Ret) {
77*4882a593Smuzhiyun         RK_LOGE("RK_MPI_VDEC_StopRecvStream failed with %#x!", s32Ret);
78*4882a593Smuzhiyun     }
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun     s32Ret = RK_MPI_VDEC_DestroyChn(VdecChn);
81*4882a593Smuzhiyun     if (RK_SUCCESS != s32Ret) {
82*4882a593Smuzhiyun         RK_LOGE("RK_MPI_VDEC_DestroyChn failed with %#x!", s32Ret);
83*4882a593Smuzhiyun     }
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun     return s32Ret;
86*4882a593Smuzhiyun }
87*4882a593Smuzhiyun 
TEST_VDEC_SendStreamProc(void * pArgs)88*4882a593Smuzhiyun static void* TEST_VDEC_SendStreamProc(void *pArgs) {
89*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
90*4882a593Smuzhiyun     RK_BOOL bReachEos = RK_FALSE;
91*4882a593Smuzhiyun     MB_BLK pStreamBlk = MB_INVALID_HANDLE;
92*4882a593Smuzhiyun     STREAM_DATA_S stStreamData;
93*4882a593Smuzhiyun     MB_EXT_CONFIG_S stMbExtConfig;
94*4882a593Smuzhiyun     VDEC_STREAM_S stStream;
95*4882a593Smuzhiyun     TEST_VDEC_THREAD_S *pstThreadInfo = (TEST_VDEC_THREAD_S *)pArgs;
96*4882a593Smuzhiyun     STREAM_INFO_S *pstStreamInfo = &pstThreadInfo->stStreamInfo;
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun     memset(&stMbExtConfig, 0, sizeof(MB_EXT_CONFIG_S));
99*4882a593Smuzhiyun     memset(&stStream, 0, sizeof(VDEC_STREAM_S));
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun     while (pstThreadInfo->bThreadStart) {
102*4882a593Smuzhiyun         memset(&stStreamData, 0, sizeof(STREAM_DATA_S));
103*4882a593Smuzhiyun         s32Ret = TEST_COMM_TmdParserRead(pstStreamInfo, &stStreamData);
104*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
105*4882a593Smuzhiyun             RK_LOGE("TEST_COMM_FFmParserRead failed with 0x%x!", s32Ret);
106*4882a593Smuzhiyun             break;
107*4882a593Smuzhiyun         }
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun         stMbExtConfig.pFreeCB = stStreamData.pFreeCB;
110*4882a593Smuzhiyun         stMbExtConfig.pOpaque = stStreamData.pOpaque;
111*4882a593Smuzhiyun         stMbExtConfig.pu8VirAddr = stStreamData.pu8VirAddr;
112*4882a593Smuzhiyun         stMbExtConfig.u64Size = stStreamData.u64Size;
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun         RK_MPI_SYS_CreateMB(&pStreamBlk, &stMbExtConfig);
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun         stStream.u64PTS = stStreamData.u64PTS;
117*4882a593Smuzhiyun         stStream.pMbBlk = pStreamBlk;
118*4882a593Smuzhiyun         stStream.u32Len = stStreamData.u64Size;
119*4882a593Smuzhiyun         stStream.bEndOfStream = stStreamData.bEndOfStream;
120*4882a593Smuzhiyun         stStream.bEndOfFrame = stStreamData.bEndOfFrame;
121*4882a593Smuzhiyun         stStream.bBypassMbBlk = RK_TRUE;
122*4882a593Smuzhiyun __RETRY:
123*4882a593Smuzhiyun         s32Ret = RK_MPI_VDEC_SendStream(pstStreamInfo->VdecChn, &stStream, 200);
124*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
125*4882a593Smuzhiyun             if (!pstThreadInfo->bThreadStart) {
126*4882a593Smuzhiyun                 break;
127*4882a593Smuzhiyun             }
128*4882a593Smuzhiyun             RK_LOGV("RK_MPI_VDEC_SendStream failed with 0x%x", s32Ret);
129*4882a593Smuzhiyun             goto  __RETRY;
130*4882a593Smuzhiyun         }
131*4882a593Smuzhiyun         RK_MPI_SYS_Free(stStream.pMbBlk);
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun         if (stStreamData.bEndOfStream) {
134*4882a593Smuzhiyun             RK_LOGE("reach eos");
135*4882a593Smuzhiyun             break;
136*4882a593Smuzhiyun         }
137*4882a593Smuzhiyun     }
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun     RK_LOGD("%s out\n", __FUNCTION__);
140*4882a593Smuzhiyun     return RK_NULL;
141*4882a593Smuzhiyun }
142*4882a593Smuzhiyun 
TEST_VDEC_StartSendStream(VDEC_CHN VdecChn,STREAM_INFO_S * pstStreamInfo)143*4882a593Smuzhiyun RK_S32 TEST_VDEC_StartSendStream(VDEC_CHN VdecChn, STREAM_INFO_S *pstStreamInfo) {
144*4882a593Smuzhiyun     RK_S32 s32Ret = 0;
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun     gSendStremThread[VdecChn].bThreadStart = RK_TRUE;
147*4882a593Smuzhiyun     memcpy(&gSendStremThread[VdecChn].stStreamInfo, pstStreamInfo, sizeof(STREAM_INFO_S));
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun     s32Ret = pthread_create(&(gSendStremThread[VdecChn].VdecPid), 0,
150*4882a593Smuzhiyun                             TEST_VDEC_SendStreamProc,
151*4882a593Smuzhiyun                             (RK_VOID *)&(gSendStremThread[VdecChn]));
152*4882a593Smuzhiyun     if (s32Ret < 0)
153*4882a593Smuzhiyun         return RK_FAILURE;
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun     return RK_SUCCESS;
156*4882a593Smuzhiyun }
157*4882a593Smuzhiyun 
TEST_VENC_StopSendFrame(VDEC_CHN VdecChn)158*4882a593Smuzhiyun RK_S32 TEST_VENC_StopSendFrame(VDEC_CHN VdecChn) {
159*4882a593Smuzhiyun     if (RK_TRUE == gSendStremThread[VdecChn].bThreadStart) {
160*4882a593Smuzhiyun         gSendStremThread[VdecChn].bThreadStart = RK_FALSE;
161*4882a593Smuzhiyun         pthread_join(gSendStremThread[VdecChn].VdecPid, 0);
162*4882a593Smuzhiyun     }
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun     return RK_SUCCESS;
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun #ifdef __cplusplus
169*4882a593Smuzhiyun #if __cplusplus
170*4882a593Smuzhiyun }
171*4882a593Smuzhiyun #endif
172*4882a593Smuzhiyun #endif /* End of #ifdef __cplusplus */
173