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