1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright 2018 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
18*4882a593Smuzhiyun #include <cstdio>
19*4882a593Smuzhiyun #include <cerrno>
20*4882a593Smuzhiyun #include <cstring>
21*4882a593Smuzhiyun #include <cstdlib>
22*4882a593Smuzhiyun #include <unistd.h>
23*4882a593Smuzhiyun #include <pthread.h>
24*4882a593Smuzhiyun #include <sys/stat.h>
25*4882a593Smuzhiyun #include <sys/poll.h>
26*4882a593Smuzhiyun #include <sys/types.h>
27*4882a593Smuzhiyun #include "rk_debug.h"
28*4882a593Smuzhiyun #include "rk_mpi_vdec.h"
29*4882a593Smuzhiyun #include "rk_mpi_sys.h"
30*4882a593Smuzhiyun #include "rk_mpi_mb.h"
31*4882a593Smuzhiyun #include "rk_mpi_cal.h"
32*4882a593Smuzhiyun #include "rk_mpi_vo.h"
33*4882a593Smuzhiyun #include "rk_mpi_vi.h"
34*4882a593Smuzhiyun #include "rk_mpi_vpss.h"
35*4882a593Smuzhiyun #include "rk_mpi_venc.h"
36*4882a593Smuzhiyun #include "test_comm_argparse.h"
37*4882a593Smuzhiyun #include "test_comm_utils.h"
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun #define MAX_STREAM_CNT 8
40*4882a593Smuzhiyun #define MAX_TIME_OUT_MS 20
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun #ifndef VDEC_INT64_MIN
43*4882a593Smuzhiyun #define VDEC_INT64_MIN (-0x7fffffffffffffffLL-1)
44*4882a593Smuzhiyun #endif
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun #ifndef VDEC_INT64_MAX
47*4882a593Smuzhiyun #define VDEC_INT64_MAX INT64_C(9223372036854775807)
48*4882a593Smuzhiyun #endif
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun #define VDEC_CH_CNT 2
51*4882a593Smuzhiyun #define VO_CH_CNT 4
52*4882a593Smuzhiyun #define HDMI_W 1920
53*4882a593Smuzhiyun #define HDMI_H 1080
54*4882a593Smuzhiyun #define MIPI_W 1080
55*4882a593Smuzhiyun #define MIPI_H 1920
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun typedef struct _rkMpiVDECCtx {
58*4882a593Smuzhiyun const char *srcFileUri;
59*4882a593Smuzhiyun RK_U32 u32SrcWidth;
60*4882a593Smuzhiyun RK_U32 u32SrcHeight;
61*4882a593Smuzhiyun RK_U32 u32SrcWidth1;
62*4882a593Smuzhiyun RK_U32 u32SrcHeight1;
63*4882a593Smuzhiyun RK_S32 s32LoopCount;
64*4882a593Smuzhiyun const char *aEntityName;
65*4882a593Smuzhiyun PIXEL_FORMAT_E enPixelFormat;
66*4882a593Smuzhiyun RK_U32 u32ReadSize;
67*4882a593Smuzhiyun RK_CODEC_ID_E enCodecId;
68*4882a593Smuzhiyun RK_BOOL threadExit;
69*4882a593Smuzhiyun RK_U32 u32ChnIndex;
70*4882a593Smuzhiyun RK_S32 s32ChnFd;
71*4882a593Smuzhiyun } TEST_ALL_CTX_S;
72*4882a593Smuzhiyun
check_options(const TEST_ALL_CTX_S * ctx)73*4882a593Smuzhiyun static RK_S32 check_options(const TEST_ALL_CTX_S *ctx) {
74*4882a593Smuzhiyun if (ctx->srcFileUri == RK_NULL) {
75*4882a593Smuzhiyun goto __FAILED;
76*4882a593Smuzhiyun }
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun if (ctx->enCodecId <= RK_VIDEO_ID_Unused ||
79*4882a593Smuzhiyun ctx->u32SrcWidth <= 0 ||
80*4882a593Smuzhiyun ctx->u32SrcHeight <= 0) {
81*4882a593Smuzhiyun goto __FAILED;
82*4882a593Smuzhiyun }
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun return RK_SUCCESS;
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun __FAILED:
87*4882a593Smuzhiyun return RK_FAILURE;
88*4882a593Smuzhiyun }
89*4882a593Smuzhiyun
mpi_create_vdec(TEST_ALL_CTX_S * ctx,RK_S32 s32Ch,VIDEO_MODE_E enMode)90*4882a593Smuzhiyun RK_S32 mpi_create_vdec(TEST_ALL_CTX_S *ctx, RK_S32 s32Ch, VIDEO_MODE_E enMode) {
91*4882a593Smuzhiyun RK_S32 s32Ret = RK_SUCCESS;
92*4882a593Smuzhiyun VDEC_CHN_ATTR_S stAttr;
93*4882a593Smuzhiyun VDEC_CHN_PARAM_S stVdecParam;
94*4882a593Smuzhiyun MB_POOL_CONFIG_S stMbPoolCfg;
95*4882a593Smuzhiyun VDEC_PIC_BUF_ATTR_S stVdecPicBufAttr;
96*4882a593Smuzhiyun MB_PIC_CAL_S stMbPicCalResult;
97*4882a593Smuzhiyun VDEC_MOD_PARAM_S stModParam;
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun memset(&stAttr, 0, sizeof(VDEC_CHN_ATTR_S));
100*4882a593Smuzhiyun memset(&stVdecParam, 0, sizeof(VDEC_CHN_PARAM_S));
101*4882a593Smuzhiyun memset(&stModParam, 0, sizeof(VDEC_MOD_PARAM_S));
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun stAttr.enMode = enMode;
104*4882a593Smuzhiyun stAttr.enType = ctx->enCodecId;
105*4882a593Smuzhiyun stAttr.u32PicWidth = ctx->u32SrcWidth;
106*4882a593Smuzhiyun stAttr.u32PicHeight = ctx->u32SrcHeight;
107*4882a593Smuzhiyun stAttr.u32FrameBufCnt = 8;
108*4882a593Smuzhiyun stAttr.u32StreamBufCnt = MAX_STREAM_CNT;
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun s32Ret = RK_MPI_VDEC_CreateChn(ctx->u32ChnIndex, &stAttr);
111*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
112*4882a593Smuzhiyun RK_LOGE("create %d vdec failed! ", ctx->u32ChnIndex);
113*4882a593Smuzhiyun return s32Ret;
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun if (ctx->enCodecId == RK_VIDEO_ID_MJPEG) {
117*4882a593Smuzhiyun stVdecParam.stVdecPictureParam.enPixelFormat = RK_FMT_YUV420SP;
118*4882a593Smuzhiyun } else {
119*4882a593Smuzhiyun stVdecParam.stVdecVideoParam.enCompressMode = COMPRESS_MODE_NONE;
120*4882a593Smuzhiyun }
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun // it is only effective to disable MV when decoding sequence output
123*4882a593Smuzhiyun stVdecParam.stVdecVideoParam.enOutputOrder = VIDEO_OUTPUT_ORDER_DISP;
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun s32Ret = RK_MPI_VDEC_SetChnParam(ctx->u32ChnIndex, &stVdecParam);
126*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
127*4882a593Smuzhiyun RK_LOGE("set chn %d param failed %x! ", ctx->u32ChnIndex, s32Ret);
128*4882a593Smuzhiyun return s32Ret;
129*4882a593Smuzhiyun }
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun ctx->s32ChnFd = RK_MPI_VDEC_GetFd(ctx->u32ChnIndex);
132*4882a593Smuzhiyun if (ctx->s32ChnFd <= 0) {
133*4882a593Smuzhiyun RK_LOGE("get fd chn %d failed %d", ctx->u32ChnIndex, ctx->s32ChnFd);
134*4882a593Smuzhiyun return s32Ret;
135*4882a593Smuzhiyun }
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun s32Ret = RK_MPI_VDEC_StartRecvStream(ctx->u32ChnIndex);
138*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
139*4882a593Smuzhiyun RK_LOGE("start recv chn %d failed %x! ", ctx->u32ChnIndex, s32Ret);
140*4882a593Smuzhiyun return s32Ret;
141*4882a593Smuzhiyun }
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun return RK_SUCCESS;
144*4882a593Smuzhiyun }
145*4882a593Smuzhiyun
mpi_destory_vdec(TEST_ALL_CTX_S * ctx,RK_S32 s32Ch)146*4882a593Smuzhiyun RK_S32 mpi_destory_vdec(TEST_ALL_CTX_S *ctx, RK_S32 s32Ch) {
147*4882a593Smuzhiyun RK_MPI_VDEC_StopRecvStream(s32Ch);
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun if (ctx->s32ChnFd > 0) {
150*4882a593Smuzhiyun RK_MPI_VDEC_CloseFd(s32Ch);
151*4882a593Smuzhiyun }
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun RK_MPI_VDEC_DestroyChn(s32Ch);
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun return RK_SUCCESS;
156*4882a593Smuzhiyun }
157*4882a593Smuzhiyun
mpi_create_stream_mode(TEST_ALL_CTX_S * ctx,RK_S32 s32Ch)158*4882a593Smuzhiyun RK_S32 mpi_create_stream_mode(TEST_ALL_CTX_S *ctx, RK_S32 s32Ch) {
159*4882a593Smuzhiyun VIDEO_MODE_E enMode;
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun if (ctx->enCodecId == RK_VIDEO_ID_MJPEG || ctx->enCodecId == RK_VIDEO_ID_JPEG) {
162*4882a593Smuzhiyun ctx->u32ReadSize = ctx->u32SrcWidth * ctx->u32SrcHeight;
163*4882a593Smuzhiyun enMode = VIDEO_MODE_FRAME;
164*4882a593Smuzhiyun } else {
165*4882a593Smuzhiyun enMode = VIDEO_MODE_STREAM;
166*4882a593Smuzhiyun }
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun return mpi_create_vdec(ctx, s32Ch, enMode);
169*4882a593Smuzhiyun }
170*4882a593Smuzhiyun
mpi_vdec_free(void * opaque)171*4882a593Smuzhiyun static RK_S32 mpi_vdec_free(void *opaque) {
172*4882a593Smuzhiyun if (opaque)
173*4882a593Smuzhiyun free(opaque);
174*4882a593Smuzhiyun return 0;
175*4882a593Smuzhiyun }
176*4882a593Smuzhiyun
mpi_send_stream(void * pArgs)177*4882a593Smuzhiyun static void* mpi_send_stream(void *pArgs) {
178*4882a593Smuzhiyun TEST_ALL_CTX_S *ctx = reinterpret_cast<TEST_ALL_CTX_S *>(pArgs);
179*4882a593Smuzhiyun RK_S32 s32Size = 0;
180*4882a593Smuzhiyun RK_S32 s32Ret = 0;
181*4882a593Smuzhiyun RK_U8 *data = RK_NULL;
182*4882a593Smuzhiyun FILE *fp = RK_NULL;
183*4882a593Smuzhiyun MB_BLK buffer = RK_NULL;
184*4882a593Smuzhiyun MB_EXT_CONFIG_S pstMbExtConfig;
185*4882a593Smuzhiyun VDEC_CHN_STATUS_S staus;
186*4882a593Smuzhiyun VDEC_CHN_ATTR_S stAttr;
187*4882a593Smuzhiyun VDEC_CHN_PARAM_S stVdecParam;
188*4882a593Smuzhiyun VDEC_STREAM_S stStream;
189*4882a593Smuzhiyun RK_S32 s32PacketCount = 0;
190*4882a593Smuzhiyun RK_S32 s32ReachEOS = 0;
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun memset(&stStream, 0, sizeof(VDEC_STREAM_S));
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun fp = fopen(ctx->srcFileUri, "r");
195*4882a593Smuzhiyun if (fp == RK_NULL) {
196*4882a593Smuzhiyun RK_LOGE("open file %s failed", ctx->srcFileUri);
197*4882a593Smuzhiyun return RK_NULL;
198*4882a593Smuzhiyun }
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun while (!ctx->threadExit) {
201*4882a593Smuzhiyun data = reinterpret_cast<RK_U8 *>(calloc(ctx->u32ReadSize, sizeof(RK_U8)));
202*4882a593Smuzhiyun memset(data, 0, ctx->u32ReadSize);
203*4882a593Smuzhiyun s32Size = fread(data, 1, ctx->u32ReadSize, fp);
204*4882a593Smuzhiyun if (s32Size <= 0) {
205*4882a593Smuzhiyun s32ReachEOS = 1;
206*4882a593Smuzhiyun }
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun memset(&pstMbExtConfig, 0, sizeof(MB_EXT_CONFIG_S));
209*4882a593Smuzhiyun pstMbExtConfig.pFreeCB = mpi_vdec_free;
210*4882a593Smuzhiyun pstMbExtConfig.pOpaque = data;
211*4882a593Smuzhiyun pstMbExtConfig.pu8VirAddr = data;
212*4882a593Smuzhiyun pstMbExtConfig.u64Size = s32Size;
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun RK_MPI_SYS_CreateMB(&buffer, &pstMbExtConfig);
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun stStream.u64PTS = 0;
217*4882a593Smuzhiyun stStream.pMbBlk = buffer;
218*4882a593Smuzhiyun stStream.u32Len = s32Size;
219*4882a593Smuzhiyun stStream.bEndOfStream = s32ReachEOS ? RK_TRUE : RK_FALSE;
220*4882a593Smuzhiyun stStream.bEndOfFrame = s32ReachEOS ? RK_TRUE : RK_FALSE;
221*4882a593Smuzhiyun stStream.bBypassMbBlk = RK_TRUE;
222*4882a593Smuzhiyun __RETRY:
223*4882a593Smuzhiyun s32Ret = RK_MPI_VDEC_SendStream(ctx->u32ChnIndex, &stStream, MAX_TIME_OUT_MS);
224*4882a593Smuzhiyun if (s32Ret < 0) {
225*4882a593Smuzhiyun if (ctx->threadExit) {
226*4882a593Smuzhiyun mpi_vdec_free(data);
227*4882a593Smuzhiyun RK_MPI_MB_ReleaseMB(stStream.pMbBlk);
228*4882a593Smuzhiyun break;
229*4882a593Smuzhiyun }
230*4882a593Smuzhiyun usleep(1000llu);
231*4882a593Smuzhiyun goto __RETRY;
232*4882a593Smuzhiyun } else {
233*4882a593Smuzhiyun s32PacketCount++;
234*4882a593Smuzhiyun RK_MPI_MB_ReleaseMB(stStream.pMbBlk);
235*4882a593Smuzhiyun //RK_LOGI("send chn %d packet %d", ctx->u32ChnIndex, s32PacketCount);
236*4882a593Smuzhiyun }
237*4882a593Smuzhiyun if (s32ReachEOS) {
238*4882a593Smuzhiyun RK_LOGI("chn %d input reach EOS", ctx->u32ChnIndex);
239*4882a593Smuzhiyun break;
240*4882a593Smuzhiyun }
241*4882a593Smuzhiyun }
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun if (fp)
244*4882a593Smuzhiyun fclose(fp);
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun RK_LOGI("%s out\n", __FUNCTION__);
247*4882a593Smuzhiyun return RK_NULL;
248*4882a593Smuzhiyun }
249*4882a593Smuzhiyun
create_vo(TEST_ALL_CTX_S * ctx)250*4882a593Smuzhiyun static RK_S32 create_vo(TEST_ALL_CTX_S *ctx) {
251*4882a593Smuzhiyun /* Enable VO */
252*4882a593Smuzhiyun VO_PUB_ATTR_S VoPubAttr;
253*4882a593Smuzhiyun VO_VIDEO_LAYER_ATTR_S stLayerAttr;
254*4882a593Smuzhiyun RK_S32 s32Ret = RK_SUCCESS;
255*4882a593Smuzhiyun VO_CHN_ATTR_S stChnAttr;
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun memset(&VoPubAttr, 0, sizeof(VO_PUB_ATTR_S));
258*4882a593Smuzhiyun memset(&stLayerAttr, 0, sizeof(VO_VIDEO_LAYER_ATTR_S));
259*4882a593Smuzhiyun
260*4882a593Smuzhiyun stLayerAttr.enPixFormat = RK_FMT_RGB888;
261*4882a593Smuzhiyun stLayerAttr.stDispRect.s32X = 0;
262*4882a593Smuzhiyun stLayerAttr.stDispRect.s32Y = 0;
263*4882a593Smuzhiyun stLayerAttr.u32DispFrmRt = 30;
264*4882a593Smuzhiyun stLayerAttr.stDispRect.u32Width = HDMI_W;
265*4882a593Smuzhiyun stLayerAttr.stDispRect.u32Height = HDMI_H;
266*4882a593Smuzhiyun stLayerAttr.stImageSize.u32Width = HDMI_W;
267*4882a593Smuzhiyun stLayerAttr.stImageSize.u32Height = HDMI_H;
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun s32Ret = RK_MPI_VO_GetPubAttr(0, &VoPubAttr);
270*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
271*4882a593Smuzhiyun return s32Ret;
272*4882a593Smuzhiyun }
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun VoPubAttr.enIntfType = VO_INTF_HDMI;
275*4882a593Smuzhiyun VoPubAttr.enIntfSync = VO_OUTPUT_DEFAULT;
276*4882a593Smuzhiyun
277*4882a593Smuzhiyun s32Ret = RK_MPI_VO_SetPubAttr(0, &VoPubAttr);
278*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
279*4882a593Smuzhiyun return s32Ret;
280*4882a593Smuzhiyun }
281*4882a593Smuzhiyun s32Ret = RK_MPI_VO_Enable(0);
282*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
283*4882a593Smuzhiyun return s32Ret;
284*4882a593Smuzhiyun }
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun s32Ret = RK_MPI_VO_GetPubAttr(3, &VoPubAttr);
287*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
288*4882a593Smuzhiyun return s32Ret;
289*4882a593Smuzhiyun }
290*4882a593Smuzhiyun
291*4882a593Smuzhiyun VoPubAttr.enIntfType = VO_INTF_MIPI;
292*4882a593Smuzhiyun VoPubAttr.enIntfSync = VO_OUTPUT_DEFAULT;
293*4882a593Smuzhiyun
294*4882a593Smuzhiyun s32Ret = RK_MPI_VO_SetPubAttr(3, &VoPubAttr);
295*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
296*4882a593Smuzhiyun return s32Ret;
297*4882a593Smuzhiyun }
298*4882a593Smuzhiyun s32Ret = RK_MPI_VO_Enable(3);
299*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
300*4882a593Smuzhiyun return s32Ret;
301*4882a593Smuzhiyun }
302*4882a593Smuzhiyun
303*4882a593Smuzhiyun s32Ret = RK_MPI_VO_BindLayer(0, 0, VO_LAYER_MODE_VIDEO);
304*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
305*4882a593Smuzhiyun RK_LOGE("RK_MPI_VO_BindLayer failed,s32Ret:%x\n", s32Ret);
306*4882a593Smuzhiyun return RK_FAILURE;
307*4882a593Smuzhiyun }
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun s32Ret = RK_MPI_VO_BindLayer(1, 3, VO_LAYER_MODE_GRAPHIC);
310*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
311*4882a593Smuzhiyun RK_LOGE("RK_MPI_VO_BindLayer failed,s32Ret:%x\n", s32Ret);
312*4882a593Smuzhiyun return RK_FAILURE;
313*4882a593Smuzhiyun }
314*4882a593Smuzhiyun
315*4882a593Smuzhiyun s32Ret = RK_MPI_VO_SetLayerAttr(0, &stLayerAttr);
316*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
317*4882a593Smuzhiyun RK_LOGE("RK_MPI_VO_SetLayerAttr failed,s32Ret:%x\n", s32Ret);
318*4882a593Smuzhiyun return RK_FAILURE;
319*4882a593Smuzhiyun }
320*4882a593Smuzhiyun
321*4882a593Smuzhiyun RK_MPI_VO_SetLayerPriority(0, 7);
322*4882a593Smuzhiyun
323*4882a593Smuzhiyun stLayerAttr.stDispRect.u32Width = MIPI_W;
324*4882a593Smuzhiyun stLayerAttr.stDispRect.u32Height = MIPI_H;
325*4882a593Smuzhiyun stLayerAttr.stImageSize.u32Width = MIPI_W;
326*4882a593Smuzhiyun stLayerAttr.stImageSize.u32Height = MIPI_H;
327*4882a593Smuzhiyun s32Ret = RK_MPI_VO_SetLayerAttr(1, &stLayerAttr);
328*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
329*4882a593Smuzhiyun RK_LOGE("RK_MPI_VO_SetLayerAttr failed,s32Ret:%x\n", s32Ret);
330*4882a593Smuzhiyun return RK_FAILURE;
331*4882a593Smuzhiyun }
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun RK_MPI_VO_SetLayerPriority(1, 7);
334*4882a593Smuzhiyun RK_MPI_VO_SetLayerSpliceMode(1, VO_SPLICE_MODE_RGA);
335*4882a593Smuzhiyun
336*4882a593Smuzhiyun s32Ret = RK_MPI_VO_EnableLayer(0);
337*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
338*4882a593Smuzhiyun RK_LOGE("RK_MPI_VO_EnableLayer failed,s32Ret:%x\n", s32Ret);
339*4882a593Smuzhiyun return RK_FAILURE;
340*4882a593Smuzhiyun }
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun s32Ret = RK_MPI_VO_EnableLayer(1);
343*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
344*4882a593Smuzhiyun RK_LOGE("RK_MPI_VO_EnableLayer failed,s32Ret:%x\n", s32Ret);
345*4882a593Smuzhiyun return RK_FAILURE;
346*4882a593Smuzhiyun }
347*4882a593Smuzhiyun
348*4882a593Smuzhiyun for (int i = 0; i < VO_CH_CNT; i++) {
349*4882a593Smuzhiyun stChnAttr.stRect.u32Width = HDMI_W / (VO_CH_CNT / 2);
350*4882a593Smuzhiyun stChnAttr.stRect.u32Height = HDMI_H / (VO_CH_CNT / 2);
351*4882a593Smuzhiyun stChnAttr.stRect.s32X = (i % (VO_CH_CNT / 2)) * stChnAttr.stRect.u32Width;
352*4882a593Smuzhiyun stChnAttr.stRect.s32Y = (i / (VO_CH_CNT / 2)) * stChnAttr.stRect.u32Height;
353*4882a593Smuzhiyun stChnAttr.u32Priority = i;
354*4882a593Smuzhiyun stChnAttr.u32FgAlpha = 128;
355*4882a593Smuzhiyun stChnAttr.u32BgAlpha = 0;
356*4882a593Smuzhiyun
357*4882a593Smuzhiyun s32Ret = RK_MPI_VO_SetChnAttr(0, i, &stChnAttr);
358*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
359*4882a593Smuzhiyun RK_LOGE("set chn Attr failed,s32Ret:%x\n", s32Ret);
360*4882a593Smuzhiyun return RK_FAILURE;
361*4882a593Smuzhiyun }
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun stChnAttr.stRect.u32Width = MIPI_W / (VO_CH_CNT / 2);
364*4882a593Smuzhiyun stChnAttr.stRect.u32Height = MIPI_H / (VO_CH_CNT / 2);
365*4882a593Smuzhiyun stChnAttr.stRect.s32X = (i % (VO_CH_CNT / 2)) * stChnAttr.stRect.u32Width;
366*4882a593Smuzhiyun stChnAttr.stRect.s32Y = (i / (VO_CH_CNT / 2)) * stChnAttr.stRect.u32Height;
367*4882a593Smuzhiyun s32Ret = RK_MPI_VO_SetChnAttr(1, i, &stChnAttr);
368*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
369*4882a593Smuzhiyun RK_LOGE("set chn Attr failed,s32Ret:%x\n", s32Ret);
370*4882a593Smuzhiyun return RK_FAILURE;
371*4882a593Smuzhiyun }
372*4882a593Smuzhiyun }
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun return s32Ret;
375*4882a593Smuzhiyun }
376*4882a593Smuzhiyun
destory_vo(void)377*4882a593Smuzhiyun static RK_S32 destory_vo(void) {
378*4882a593Smuzhiyun
379*4882a593Smuzhiyun RK_S32 s32Ret = RK_SUCCESS;
380*4882a593Smuzhiyun
381*4882a593Smuzhiyun s32Ret = RK_MPI_VO_DisableLayer(0);
382*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
383*4882a593Smuzhiyun RK_LOGE("RK_MPI_VO_DisableLayer failed,s32Ret:%x\n", s32Ret);
384*4882a593Smuzhiyun return RK_FAILURE;
385*4882a593Smuzhiyun }
386*4882a593Smuzhiyun s32Ret = RK_MPI_VO_DisableLayer(1);
387*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
388*4882a593Smuzhiyun RK_LOGE("RK_MPI_VO_DisableLayer failed,s32Ret:%x\n", s32Ret);
389*4882a593Smuzhiyun return RK_FAILURE;
390*4882a593Smuzhiyun }
391*4882a593Smuzhiyun
392*4882a593Smuzhiyun s32Ret = RK_MPI_VO_UnBindLayer(0, 0);
393*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
394*4882a593Smuzhiyun RK_LOGE("RK_MPI_VO_UnBindLayer failed,s32Ret:%x\n", s32Ret);
395*4882a593Smuzhiyun return RK_FAILURE;
396*4882a593Smuzhiyun }
397*4882a593Smuzhiyun
398*4882a593Smuzhiyun s32Ret = RK_MPI_VO_UnBindLayer(1, 3);
399*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
400*4882a593Smuzhiyun RK_LOGE("RK_MPI_VO_UnBindLayer failed,s32Ret:%x\n", s32Ret);
401*4882a593Smuzhiyun return RK_FAILURE;
402*4882a593Smuzhiyun }
403*4882a593Smuzhiyun
404*4882a593Smuzhiyun s32Ret = RK_MPI_VO_Disable(0);
405*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
406*4882a593Smuzhiyun return s32Ret;
407*4882a593Smuzhiyun }
408*4882a593Smuzhiyun s32Ret = RK_MPI_VO_Disable(3);
409*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
410*4882a593Smuzhiyun return s32Ret;
411*4882a593Smuzhiyun }
412*4882a593Smuzhiyun return s32Ret;
413*4882a593Smuzhiyun }
414*4882a593Smuzhiyun
create_vi(TEST_ALL_CTX_S * ctx)415*4882a593Smuzhiyun static RK_S32 create_vi(TEST_ALL_CTX_S *ctx) {
416*4882a593Smuzhiyun RK_S32 s32Ret = RK_FAILURE;
417*4882a593Smuzhiyun VI_DEV_ATTR_S stDevAttr;
418*4882a593Smuzhiyun VI_DEV_BIND_PIPE_S stBindPipe;
419*4882a593Smuzhiyun VI_CHN_ATTR_S stChnAttr;
420*4882a593Smuzhiyun // 0. get dev config status
421*4882a593Smuzhiyun s32Ret = RK_MPI_VI_GetDevAttr(0, &stDevAttr);
422*4882a593Smuzhiyun if (s32Ret == RK_ERR_VI_NOT_CONFIG) {
423*4882a593Smuzhiyun // 0-1.config dev
424*4882a593Smuzhiyun s32Ret = RK_MPI_VI_SetDevAttr(0, &stDevAttr);
425*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
426*4882a593Smuzhiyun RK_LOGE("RK_MPI_VI_SetDevAttr %x", s32Ret);
427*4882a593Smuzhiyun goto __FAILED;
428*4882a593Smuzhiyun }
429*4882a593Smuzhiyun } else {
430*4882a593Smuzhiyun RK_LOGE("RK_MPI_VI_SetDevAttr already");
431*4882a593Smuzhiyun }
432*4882a593Smuzhiyun // 1.get dev enable status
433*4882a593Smuzhiyun s32Ret = RK_MPI_VI_GetDevIsEnable(0);
434*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
435*4882a593Smuzhiyun // 1-2.enable dev
436*4882a593Smuzhiyun s32Ret = RK_MPI_VI_EnableDev(0);
437*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
438*4882a593Smuzhiyun RK_LOGE("RK_MPI_VI_EnableDev %x", s32Ret);
439*4882a593Smuzhiyun goto __FAILED;
440*4882a593Smuzhiyun }
441*4882a593Smuzhiyun // 1-3.bind dev/pipe
442*4882a593Smuzhiyun stBindPipe.u32Num = 0;
443*4882a593Smuzhiyun stBindPipe.PipeId[0] = 0;
444*4882a593Smuzhiyun s32Ret = RK_MPI_VI_SetDevBindPipe(0, &stBindPipe);
445*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
446*4882a593Smuzhiyun RK_LOGE("RK_MPI_VI_SetDevBindPipe %x", s32Ret);
447*4882a593Smuzhiyun goto __FAILED;
448*4882a593Smuzhiyun }
449*4882a593Smuzhiyun } else {
450*4882a593Smuzhiyun RK_LOGE("RK_MPI_VI_EnableDev already");
451*4882a593Smuzhiyun }
452*4882a593Smuzhiyun // 2.config channel
453*4882a593Smuzhiyun memset(&stChnAttr, 0, sizeof(VI_CHN_ATTR_S));
454*4882a593Smuzhiyun stChnAttr.stIspOpt.u32BufCount = 6;
455*4882a593Smuzhiyun stChnAttr.stIspOpt.enMemoryType = VI_V4L2_MEMORY_TYPE_MMAP;
456*4882a593Smuzhiyun stChnAttr.stIspOpt.enCaptureType = VI_V4L2_CAPTURE_TYPE_VIDEO_CAPTURE;
457*4882a593Smuzhiyun stChnAttr.u32Depth = 0;
458*4882a593Smuzhiyun stChnAttr.enPixelFormat = ctx->enPixelFormat;
459*4882a593Smuzhiyun stChnAttr.stFrameRate.s32SrcFrameRate = -1;
460*4882a593Smuzhiyun stChnAttr.stFrameRate.s32DstFrameRate = -1;
461*4882a593Smuzhiyun stChnAttr.stSize.u32Width = ctx->u32SrcWidth1;
462*4882a593Smuzhiyun stChnAttr.stSize.u32Height = ctx->u32SrcHeight1;
463*4882a593Smuzhiyun stChnAttr.stSize.u32Width = ctx->u32SrcWidth1;
464*4882a593Smuzhiyun stChnAttr.stSize.u32Height = ctx->u32SrcHeight1;
465*4882a593Smuzhiyun stChnAttr.enCompressMode = COMPRESS_MODE_NONE;
466*4882a593Smuzhiyun strcpy(stChnAttr.stIspOpt.aEntityName, ctx->aEntityName);
467*4882a593Smuzhiyun s32Ret = RK_MPI_VI_SetChnAttr(0, 0, &stChnAttr);
468*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
469*4882a593Smuzhiyun RK_LOGE("RK_MPI_VI_SetChnAttr %x", s32Ret);
470*4882a593Smuzhiyun goto __FAILED;
471*4882a593Smuzhiyun }
472*4882a593Smuzhiyun // 3.enable channel
473*4882a593Smuzhiyun s32Ret = RK_MPI_VI_EnableChn(0, 0);
474*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
475*4882a593Smuzhiyun RK_LOGE("RK_MPI_VI_EnableChn %x", s32Ret);
476*4882a593Smuzhiyun goto __FAILED;
477*4882a593Smuzhiyun }
478*4882a593Smuzhiyun __FAILED:
479*4882a593Smuzhiyun return s32Ret;
480*4882a593Smuzhiyun }
481*4882a593Smuzhiyun
destroy_vi()482*4882a593Smuzhiyun static RK_S32 destroy_vi() {
483*4882a593Smuzhiyun RK_S32 s32Ret = RK_FAILURE;
484*4882a593Smuzhiyun s32Ret = RK_MPI_VI_DisableChn(0, 0);
485*4882a593Smuzhiyun RK_LOGE("RK_MPI_VI_DisableChn pipe=%d ret:%x", 0, s32Ret);
486*4882a593Smuzhiyun
487*4882a593Smuzhiyun s32Ret = RK_MPI_VI_DisableDev(0);
488*4882a593Smuzhiyun RK_LOGE("RK_MPI_VI_DisableDev device=%d ret:%x", 0, s32Ret);
489*4882a593Smuzhiyun return s32Ret;
490*4882a593Smuzhiyun }
491*4882a593Smuzhiyun
create_venc(TEST_ALL_CTX_S * ctx)492*4882a593Smuzhiyun static RK_S32 create_venc(TEST_ALL_CTX_S *ctx) {
493*4882a593Smuzhiyun VENC_RECV_PIC_PARAM_S stRecvParam;
494*4882a593Smuzhiyun VENC_CHN_ATTR_S stAttr;
495*4882a593Smuzhiyun memset(&stAttr, 0, sizeof(VENC_CHN_ATTR_S));
496*4882a593Smuzhiyun stAttr.stVencAttr.enType = RK_VIDEO_ID_AVC;
497*4882a593Smuzhiyun stAttr.stVencAttr.enPixelFormat = RK_FMT_YUV420SP;
498*4882a593Smuzhiyun stAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR;
499*4882a593Smuzhiyun stAttr.stRcAttr.stH264Cbr.u32Gop = 60;
500*4882a593Smuzhiyun stAttr.stVencAttr.u32PicWidth = ctx->u32SrcWidth;
501*4882a593Smuzhiyun stAttr.stVencAttr.u32PicHeight = ctx->u32SrcHeight;
502*4882a593Smuzhiyun stAttr.stVencAttr.u32VirWidth = ctx->u32SrcWidth;
503*4882a593Smuzhiyun stAttr.stVencAttr.u32VirHeight = ctx->u32SrcHeight;
504*4882a593Smuzhiyun stAttr.stVencAttr.u32StreamBufCnt = 5;
505*4882a593Smuzhiyun stAttr.stVencAttr.u32BufSize = ctx->u32SrcWidth * ctx->u32SrcHeight * 3 / 2;
506*4882a593Smuzhiyun stRecvParam.s32RecvPicNum = -1;
507*4882a593Smuzhiyun RK_MPI_VENC_CreateChn(0, &stAttr);
508*4882a593Smuzhiyun RK_MPI_VENC_StartRecvFrame(0, &stRecvParam);
509*4882a593Smuzhiyun return RK_SUCCESS;
510*4882a593Smuzhiyun }
511*4882a593Smuzhiyun
destory_venc(void)512*4882a593Smuzhiyun static RK_S32 destory_venc(void) {
513*4882a593Smuzhiyun VENC_RECV_PIC_PARAM_S stRecvParam;
514*4882a593Smuzhiyun VENC_CHN_ATTR_S stAttr;
515*4882a593Smuzhiyun RK_S32 s32Ret = RK_SUCCESS;
516*4882a593Smuzhiyun s32Ret = RK_MPI_VENC_StopRecvFrame(0);
517*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
518*4882a593Smuzhiyun return s32Ret;
519*4882a593Smuzhiyun }
520*4882a593Smuzhiyun RK_LOGE("destroy enc chn:%d", 0);
521*4882a593Smuzhiyun s32Ret = RK_MPI_VENC_DestroyChn(0);
522*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
523*4882a593Smuzhiyun RK_LOGE("RK_MPI_VDEC_DestroyChn fail %x", s32Ret);
524*4882a593Smuzhiyun }
525*4882a593Smuzhiyun return RK_SUCCESS;
526*4882a593Smuzhiyun }
527*4882a593Smuzhiyun
528*4882a593Smuzhiyun
529*4882a593Smuzhiyun
create_vpss(RK_S32 s32Grp,RK_S32 s32OutChnNum,TEST_ALL_CTX_S * ctx)530*4882a593Smuzhiyun static RK_S32 create_vpss(RK_S32 s32Grp, RK_S32 s32OutChnNum, TEST_ALL_CTX_S *ctx) {
531*4882a593Smuzhiyun RK_S32 s32Ret = RK_SUCCESS;
532*4882a593Smuzhiyun VPSS_CHN VpssChn[VPSS_MAX_CHN_NUM] = { VPSS_CHN0, VPSS_CHN1, VPSS_CHN2, VPSS_CHN3 };
533*4882a593Smuzhiyun VPSS_GRP_ATTR_S stGrpVpssAttr;
534*4882a593Smuzhiyun VPSS_CHN_ATTR_S stVpssChnAttr;
535*4882a593Smuzhiyun /* vpss */
536*4882a593Smuzhiyun memset(&stGrpVpssAttr, 0, sizeof(VPSS_GRP_ATTR_S));
537*4882a593Smuzhiyun stGrpVpssAttr.u32MaxW = 4096;
538*4882a593Smuzhiyun stGrpVpssAttr.u32MaxH = 4096;
539*4882a593Smuzhiyun stGrpVpssAttr.enPixelFormat = RK_FMT_YUV420SP;
540*4882a593Smuzhiyun stGrpVpssAttr.stFrameRate.s32SrcFrameRate = -1;
541*4882a593Smuzhiyun stGrpVpssAttr.stFrameRate.s32DstFrameRate = -1;
542*4882a593Smuzhiyun stGrpVpssAttr.enCompressMode = COMPRESS_MODE_NONE;
543*4882a593Smuzhiyun
544*4882a593Smuzhiyun s32Ret = RK_MPI_VPSS_CreateGrp(s32Grp, &stGrpVpssAttr);
545*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
546*4882a593Smuzhiyun return s32Ret;
547*4882a593Smuzhiyun }
548*4882a593Smuzhiyun
549*4882a593Smuzhiyun for (RK_S32 i = 0; i < s32OutChnNum; i++) {
550*4882a593Smuzhiyun memset(&stVpssChnAttr, 0, sizeof(VPSS_CHN_ATTR_S));
551*4882a593Smuzhiyun stVpssChnAttr.enChnMode = VPSS_CHN_MODE_AUTO;
552*4882a593Smuzhiyun stVpssChnAttr.enDynamicRange = DYNAMIC_RANGE_SDR8;
553*4882a593Smuzhiyun stVpssChnAttr.enPixelFormat = RK_FMT_YUV420SP;
554*4882a593Smuzhiyun stVpssChnAttr.stFrameRate.s32SrcFrameRate = -1;
555*4882a593Smuzhiyun stVpssChnAttr.stFrameRate.s32DstFrameRate = -1;
556*4882a593Smuzhiyun stVpssChnAttr.u32Width = ctx->u32SrcWidth / (i + 1);
557*4882a593Smuzhiyun stVpssChnAttr.u32Height = ctx->u32SrcHeight / (i + 1);
558*4882a593Smuzhiyun stVpssChnAttr.enCompressMode = COMPRESS_MODE_NONE;
559*4882a593Smuzhiyun s32Ret = RK_MPI_VPSS_SetChnAttr(s32Grp, VpssChn[i], &stVpssChnAttr);
560*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
561*4882a593Smuzhiyun return s32Ret;
562*4882a593Smuzhiyun }
563*4882a593Smuzhiyun s32Ret = RK_MPI_VPSS_EnableChn(s32Grp, VpssChn[i]);
564*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
565*4882a593Smuzhiyun return s32Ret;
566*4882a593Smuzhiyun }
567*4882a593Smuzhiyun }
568*4882a593Smuzhiyun
569*4882a593Smuzhiyun s32Ret = RK_MPI_VPSS_SetVProcDev(s32Grp, VIDEO_PROC_DEV_RGA);
570*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
571*4882a593Smuzhiyun return s32Ret;
572*4882a593Smuzhiyun }
573*4882a593Smuzhiyun
574*4882a593Smuzhiyun s32Ret = RK_MPI_VPSS_StartGrp(s32Grp);
575*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
576*4882a593Smuzhiyun return s32Ret;
577*4882a593Smuzhiyun }
578*4882a593Smuzhiyun
579*4882a593Smuzhiyun return RK_SUCCESS;
580*4882a593Smuzhiyun }
581*4882a593Smuzhiyun
destory_vpss(RK_S32 s32Grp,RK_S32 s32OutChnNum)582*4882a593Smuzhiyun static RK_S32 destory_vpss(RK_S32 s32Grp, RK_S32 s32OutChnNum) {
583*4882a593Smuzhiyun RK_S32 s32Ret = RK_SUCCESS;
584*4882a593Smuzhiyun VPSS_CHN VpssChn[VPSS_MAX_CHN_NUM] = { VPSS_CHN0, VPSS_CHN1, VPSS_CHN2, VPSS_CHN3 };
585*4882a593Smuzhiyun
586*4882a593Smuzhiyun s32Ret = RK_MPI_VPSS_StopGrp(s32Grp);
587*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
588*4882a593Smuzhiyun return s32Ret;
589*4882a593Smuzhiyun }
590*4882a593Smuzhiyun
591*4882a593Smuzhiyun for (RK_S32 i = 0; i < s32OutChnNum; i++) {
592*4882a593Smuzhiyun s32Ret = RK_MPI_VPSS_DisableChn(s32Grp, VpssChn[i]);
593*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
594*4882a593Smuzhiyun return s32Ret;
595*4882a593Smuzhiyun }
596*4882a593Smuzhiyun }
597*4882a593Smuzhiyun
598*4882a593Smuzhiyun s32Ret = RK_MPI_VPSS_DisableBackupFrame(s32Grp);
599*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
600*4882a593Smuzhiyun return s32Ret;
601*4882a593Smuzhiyun }
602*4882a593Smuzhiyun
603*4882a593Smuzhiyun s32Ret = RK_MPI_VPSS_DestroyGrp(s32Grp);
604*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
605*4882a593Smuzhiyun return s32Ret;
606*4882a593Smuzhiyun }
607*4882a593Smuzhiyun
608*4882a593Smuzhiyun return RK_SUCCESS;
609*4882a593Smuzhiyun }
610*4882a593Smuzhiyun
unit_test_mpi_all(TEST_ALL_CTX_S * ctx)611*4882a593Smuzhiyun RK_S32 unit_test_mpi_all(TEST_ALL_CTX_S *ctx) {
612*4882a593Smuzhiyun MPP_CHN_S stSrcChn, stDestChn;
613*4882a593Smuzhiyun RK_S32 s32Ret = RK_FAILURE;
614*4882a593Smuzhiyun RK_U32 u32Ch = 0;
615*4882a593Smuzhiyun TEST_ALL_CTX_S vdecCtx[VDEC_CH_CNT];
616*4882a593Smuzhiyun pthread_t vdecThread[VDEC_CH_CNT];
617*4882a593Smuzhiyun
618*4882a593Smuzhiyun for (u32Ch = 0; u32Ch < VDEC_CH_CNT; u32Ch++) {
619*4882a593Smuzhiyun ctx->u32ChnIndex = u32Ch;
620*4882a593Smuzhiyun memcpy(&(vdecCtx[u32Ch]), ctx, sizeof(TEST_ALL_CTX_S));
621*4882a593Smuzhiyun
622*4882a593Smuzhiyun // Does not support JPEG stream framing, read the size of one picture at a time
623*4882a593Smuzhiyun // and send it to the decoder.
624*4882a593Smuzhiyun mpi_create_stream_mode(&vdecCtx[u32Ch], u32Ch);
625*4882a593Smuzhiyun if (u32Ch < VDEC_CH_CNT - 1)
626*4882a593Smuzhiyun pthread_create(&vdecThread[u32Ch], 0, mpi_send_stream, reinterpret_cast<void *>(&vdecCtx[u32Ch]));
627*4882a593Smuzhiyun }
628*4882a593Smuzhiyun
629*4882a593Smuzhiyun //create vo layer 0, layer 1, chn 0 -- 3
630*4882a593Smuzhiyun s32Ret = create_vo(ctx);
631*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
632*4882a593Smuzhiyun RK_LOGE("create vo ch failed");
633*4882a593Smuzhiyun return -1;
634*4882a593Smuzhiyun }
635*4882a593Smuzhiyun
636*4882a593Smuzhiyun //create vi 0, 0
637*4882a593Smuzhiyun s32Ret = create_vi(ctx);
638*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
639*4882a593Smuzhiyun RK_LOGE("create vi ch failed");
640*4882a593Smuzhiyun return -1;
641*4882a593Smuzhiyun }
642*4882a593Smuzhiyun
643*4882a593Smuzhiyun //create vpss grp 0, chn 0 -- 1
644*4882a593Smuzhiyun s32Ret = create_vpss(0, 2, ctx);
645*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
646*4882a593Smuzhiyun RK_LOGE("create vpss ch failed");
647*4882a593Smuzhiyun return -1;
648*4882a593Smuzhiyun }
649*4882a593Smuzhiyun
650*4882a593Smuzhiyun //create venc 0, 0
651*4882a593Smuzhiyun s32Ret = create_venc(ctx);
652*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
653*4882a593Smuzhiyun RK_LOGE("create venc ch failed");
654*4882a593Smuzhiyun return -1;
655*4882a593Smuzhiyun }
656*4882a593Smuzhiyun
657*4882a593Smuzhiyun // bind vdec[0] to vo [0, 0] [1, 0]
658*4882a593Smuzhiyun // bind vdec[1] to vo [0, 1] [1, 1]
659*4882a593Smuzhiyun for (int i = 0; i < VDEC_CH_CNT; i++) {
660*4882a593Smuzhiyun stSrcChn.enModId = RK_ID_VDEC;
661*4882a593Smuzhiyun stSrcChn.s32DevId = 0;
662*4882a593Smuzhiyun stSrcChn.s32ChnId = i;
663*4882a593Smuzhiyun stDestChn.enModId = RK_ID_VO;
664*4882a593Smuzhiyun stDestChn.s32DevId = 0;
665*4882a593Smuzhiyun stDestChn.s32ChnId = i;
666*4882a593Smuzhiyun s32Ret = RK_MPI_SYS_Bind(&stSrcChn, &stDestChn);
667*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
668*4882a593Smuzhiyun RK_LOGE("vi band vo fail:%x", s32Ret);
669*4882a593Smuzhiyun return -1;
670*4882a593Smuzhiyun }
671*4882a593Smuzhiyun
672*4882a593Smuzhiyun stDestChn.enModId = RK_ID_VO;
673*4882a593Smuzhiyun stDestChn.s32DevId = 1;
674*4882a593Smuzhiyun stDestChn.s32ChnId = i;
675*4882a593Smuzhiyun s32Ret = RK_MPI_SYS_Bind(&stSrcChn, &stDestChn);
676*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
677*4882a593Smuzhiyun RK_LOGE("vi band vo fail:%x", s32Ret);
678*4882a593Smuzhiyun return -1;
679*4882a593Smuzhiyun }
680*4882a593Smuzhiyun
681*4882a593Smuzhiyun // enable vo
682*4882a593Smuzhiyun s32Ret = RK_MPI_VO_EnableChn(0, i);
683*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
684*4882a593Smuzhiyun RK_LOGE("Enalbe vo chn failed, s32Ret = %d\n", s32Ret);
685*4882a593Smuzhiyun return -1;
686*4882a593Smuzhiyun }
687*4882a593Smuzhiyun s32Ret = RK_MPI_VO_EnableChn(1, i);
688*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
689*4882a593Smuzhiyun RK_LOGE("Enalbe vo chn failed, s32Ret = %d\n", s32Ret);
690*4882a593Smuzhiyun return -1;
691*4882a593Smuzhiyun }
692*4882a593Smuzhiyun }
693*4882a593Smuzhiyun
694*4882a593Smuzhiyun //bind vi[0] to vo [0, 2] [1, 2]
695*4882a593Smuzhiyun stSrcChn.enModId = RK_ID_VI;
696*4882a593Smuzhiyun stSrcChn.s32DevId = 0;
697*4882a593Smuzhiyun stSrcChn.s32ChnId = 0;
698*4882a593Smuzhiyun stDestChn.enModId = RK_ID_VO;
699*4882a593Smuzhiyun stDestChn.s32DevId = 0;
700*4882a593Smuzhiyun stDestChn.s32ChnId = VDEC_CH_CNT;
701*4882a593Smuzhiyun s32Ret = RK_MPI_SYS_Bind(&stSrcChn, &stDestChn);
702*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
703*4882a593Smuzhiyun RK_LOGE("vi band vo fail:%x", s32Ret);
704*4882a593Smuzhiyun return -1;
705*4882a593Smuzhiyun }
706*4882a593Smuzhiyun
707*4882a593Smuzhiyun stDestChn.enModId = RK_ID_VO;
708*4882a593Smuzhiyun stDestChn.s32DevId = 1;
709*4882a593Smuzhiyun stDestChn.s32ChnId = VDEC_CH_CNT;
710*4882a593Smuzhiyun s32Ret = RK_MPI_SYS_Bind(&stSrcChn, &stDestChn);
711*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
712*4882a593Smuzhiyun RK_LOGE("vi band vo fail:%x", s32Ret);
713*4882a593Smuzhiyun return -1;
714*4882a593Smuzhiyun }
715*4882a593Smuzhiyun
716*4882a593Smuzhiyun //bind vi [0, 0] to vpss grp 0
717*4882a593Smuzhiyun stDestChn.enModId = RK_ID_VPSS;
718*4882a593Smuzhiyun stDestChn.s32DevId = 0;
719*4882a593Smuzhiyun stDestChn.s32ChnId = 0;
720*4882a593Smuzhiyun s32Ret = RK_MPI_SYS_Bind(&stSrcChn, &stDestChn);
721*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
722*4882a593Smuzhiyun RK_LOGE("vi band vpss fail:%x", s32Ret);
723*4882a593Smuzhiyun return -1;
724*4882a593Smuzhiyun }
725*4882a593Smuzhiyun
726*4882a593Smuzhiyun //bind vpss ch 0 to venc 0
727*4882a593Smuzhiyun stSrcChn.enModId = RK_ID_VPSS;
728*4882a593Smuzhiyun stSrcChn.s32DevId = 0;
729*4882a593Smuzhiyun stSrcChn.s32ChnId = 0;
730*4882a593Smuzhiyun stDestChn.enModId = RK_ID_VENC;
731*4882a593Smuzhiyun stDestChn.s32DevId = 0;
732*4882a593Smuzhiyun stDestChn.s32ChnId = 0;
733*4882a593Smuzhiyun s32Ret = RK_MPI_SYS_Bind(&stSrcChn, &stDestChn);
734*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
735*4882a593Smuzhiyun RK_LOGE("vpss ch 0 band venc fail:%x", s32Ret);
736*4882a593Smuzhiyun return -1;
737*4882a593Smuzhiyun }
738*4882a593Smuzhiyun
739*4882a593Smuzhiyun //bind venc 0 to vdec 1
740*4882a593Smuzhiyun stSrcChn.enModId = RK_ID_VENC;
741*4882a593Smuzhiyun stSrcChn.s32DevId = 0;
742*4882a593Smuzhiyun stSrcChn.s32ChnId = 0;
743*4882a593Smuzhiyun stDestChn.enModId = RK_ID_VDEC;
744*4882a593Smuzhiyun stDestChn.s32DevId = 0;
745*4882a593Smuzhiyun stDestChn.s32ChnId = VDEC_CH_CNT - 1;
746*4882a593Smuzhiyun s32Ret = RK_MPI_SYS_Bind(&stSrcChn, &stDestChn);
747*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
748*4882a593Smuzhiyun RK_LOGE("vpss ch 0 band venc fail:%x", s32Ret);
749*4882a593Smuzhiyun return -1;
750*4882a593Smuzhiyun }
751*4882a593Smuzhiyun
752*4882a593Smuzhiyun //bind vpss ch 1 to vo [0, 3] [1, 3]
753*4882a593Smuzhiyun stSrcChn.enModId = RK_ID_VPSS;
754*4882a593Smuzhiyun stSrcChn.s32DevId = 0;
755*4882a593Smuzhiyun stSrcChn.s32ChnId = 1;
756*4882a593Smuzhiyun stDestChn.enModId = RK_ID_VO;
757*4882a593Smuzhiyun stDestChn.s32DevId = 0;
758*4882a593Smuzhiyun stDestChn.s32ChnId = VDEC_CH_CNT + 1;
759*4882a593Smuzhiyun s32Ret = RK_MPI_SYS_Bind(&stSrcChn, &stDestChn);
760*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
761*4882a593Smuzhiyun RK_LOGE("vpss ch 0 band vo fail:%x", s32Ret);
762*4882a593Smuzhiyun return -1;
763*4882a593Smuzhiyun }
764*4882a593Smuzhiyun
765*4882a593Smuzhiyun stDestChn.enModId = RK_ID_VO;
766*4882a593Smuzhiyun stDestChn.s32DevId = 1;
767*4882a593Smuzhiyun stDestChn.s32ChnId = VDEC_CH_CNT + 1;
768*4882a593Smuzhiyun s32Ret = RK_MPI_SYS_Bind(&stSrcChn, &stDestChn);
769*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
770*4882a593Smuzhiyun RK_LOGE("vpss ch 0 band vo fail:%x", s32Ret);
771*4882a593Smuzhiyun return -1;
772*4882a593Smuzhiyun }
773*4882a593Smuzhiyun
774*4882a593Smuzhiyun // enable vo
775*4882a593Smuzhiyun s32Ret = RK_MPI_VO_EnableChn(0, VDEC_CH_CNT);
776*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
777*4882a593Smuzhiyun RK_LOGE("Enalbe vo %d chn failed, s32Ret = %d\n", VDEC_CH_CNT, s32Ret);
778*4882a593Smuzhiyun return -1;
779*4882a593Smuzhiyun }
780*4882a593Smuzhiyun s32Ret = RK_MPI_VO_EnableChn(0, VDEC_CH_CNT + 1);
781*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
782*4882a593Smuzhiyun RK_LOGE("Enalbe vo chn failed, s32Ret = %d\n", VDEC_CH_CNT + 1, s32Ret);
783*4882a593Smuzhiyun return -1;
784*4882a593Smuzhiyun }
785*4882a593Smuzhiyun s32Ret = RK_MPI_VO_EnableChn(1, VDEC_CH_CNT);
786*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
787*4882a593Smuzhiyun RK_LOGE("Enalbe vo %d chn failed, s32Ret = %d\n", VDEC_CH_CNT, s32Ret);
788*4882a593Smuzhiyun return -1;
789*4882a593Smuzhiyun }
790*4882a593Smuzhiyun s32Ret = RK_MPI_VO_EnableChn(1, VDEC_CH_CNT + 1);
791*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
792*4882a593Smuzhiyun RK_LOGE("Enalbe vo chn failed, s32Ret = %d\n", VDEC_CH_CNT + 1, s32Ret);
793*4882a593Smuzhiyun return -1;
794*4882a593Smuzhiyun }
795*4882a593Smuzhiyun
796*4882a593Smuzhiyun //destory
797*4882a593Smuzhiyun for (u32Ch = 0; u32Ch < VDEC_CH_CNT - 1; u32Ch++) {
798*4882a593Smuzhiyun pthread_join(vdecThread[u32Ch], RK_NULL);
799*4882a593Smuzhiyun }
800*4882a593Smuzhiyun
801*4882a593Smuzhiyun for (int i = 0; i < VDEC_CH_CNT; i++) {
802*4882a593Smuzhiyun stSrcChn.enModId = RK_ID_VDEC;
803*4882a593Smuzhiyun stSrcChn.s32DevId = 0;
804*4882a593Smuzhiyun stSrcChn.s32ChnId = i;
805*4882a593Smuzhiyun stDestChn.enModId = RK_ID_VO;
806*4882a593Smuzhiyun stDestChn.s32DevId = 0;
807*4882a593Smuzhiyun stDestChn.s32ChnId = i;
808*4882a593Smuzhiyun s32Ret = RK_MPI_SYS_UnBind(&stSrcChn, &stDestChn);
809*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
810*4882a593Smuzhiyun RK_LOGE("vi unband vo fail:%x", s32Ret);
811*4882a593Smuzhiyun return -1;
812*4882a593Smuzhiyun }
813*4882a593Smuzhiyun
814*4882a593Smuzhiyun stDestChn.enModId = RK_ID_VO;
815*4882a593Smuzhiyun stDestChn.s32DevId = 1;
816*4882a593Smuzhiyun stDestChn.s32ChnId = i;
817*4882a593Smuzhiyun s32Ret = RK_MPI_SYS_UnBind(&stSrcChn, &stDestChn);
818*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
819*4882a593Smuzhiyun RK_LOGE("vi band vo fail:%x", s32Ret);
820*4882a593Smuzhiyun return -1;
821*4882a593Smuzhiyun }
822*4882a593Smuzhiyun
823*4882a593Smuzhiyun // disable vo
824*4882a593Smuzhiyun s32Ret = RK_MPI_VO_DisableChn(0, i);
825*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
826*4882a593Smuzhiyun RK_LOGE("Enalbe vo chn failed, s32Ret = %d\n", s32Ret);
827*4882a593Smuzhiyun return -1;
828*4882a593Smuzhiyun }
829*4882a593Smuzhiyun s32Ret = RK_MPI_VO_DisableChn(1, i);
830*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
831*4882a593Smuzhiyun RK_LOGE("Enalbe vo chn failed, s32Ret = %d\n", s32Ret);
832*4882a593Smuzhiyun return -1;
833*4882a593Smuzhiyun }
834*4882a593Smuzhiyun mpi_destory_vdec(&vdecCtx[u32Ch], u32Ch);
835*4882a593Smuzhiyun }
836*4882a593Smuzhiyun
837*4882a593Smuzhiyun //unbind vi[0] to vo [0, 2] [1, 2]
838*4882a593Smuzhiyun stSrcChn.enModId = RK_ID_VI;
839*4882a593Smuzhiyun stSrcChn.s32DevId = 0;
840*4882a593Smuzhiyun stSrcChn.s32ChnId = 0;
841*4882a593Smuzhiyun stDestChn.enModId = RK_ID_VO;
842*4882a593Smuzhiyun stDestChn.s32DevId = 0;
843*4882a593Smuzhiyun stDestChn.s32ChnId = VDEC_CH_CNT;
844*4882a593Smuzhiyun s32Ret = RK_MPI_SYS_UnBind(&stSrcChn, &stDestChn);
845*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
846*4882a593Smuzhiyun RK_LOGE("vi band vo fail:%x", s32Ret);
847*4882a593Smuzhiyun return -1;
848*4882a593Smuzhiyun }
849*4882a593Smuzhiyun
850*4882a593Smuzhiyun stDestChn.enModId = RK_ID_VO;
851*4882a593Smuzhiyun stDestChn.s32DevId = 1;
852*4882a593Smuzhiyun stDestChn.s32ChnId = VDEC_CH_CNT;
853*4882a593Smuzhiyun s32Ret = RK_MPI_SYS_UnBind(&stSrcChn, &stDestChn);
854*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
855*4882a593Smuzhiyun RK_LOGE("vi unband vo fail:%x", s32Ret);
856*4882a593Smuzhiyun return -1;
857*4882a593Smuzhiyun }
858*4882a593Smuzhiyun
859*4882a593Smuzhiyun //bind vi [0, 0] to vpss grp 0
860*4882a593Smuzhiyun stDestChn.enModId = RK_ID_VPSS;
861*4882a593Smuzhiyun stDestChn.s32DevId = 0;
862*4882a593Smuzhiyun stDestChn.s32ChnId = 0;
863*4882a593Smuzhiyun s32Ret = RK_MPI_SYS_UnBind(&stSrcChn, &stDestChn);
864*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
865*4882a593Smuzhiyun RK_LOGE("vi unband vpss fail:%x", s32Ret);
866*4882a593Smuzhiyun return -1;
867*4882a593Smuzhiyun }
868*4882a593Smuzhiyun
869*4882a593Smuzhiyun //bind vpss ch 0 to venc 0
870*4882a593Smuzhiyun stSrcChn.enModId = RK_ID_VPSS;
871*4882a593Smuzhiyun stSrcChn.s32DevId = 0;
872*4882a593Smuzhiyun stSrcChn.s32ChnId = 0;
873*4882a593Smuzhiyun stDestChn.enModId = RK_ID_VENC;
874*4882a593Smuzhiyun stDestChn.s32DevId = 0;
875*4882a593Smuzhiyun stDestChn.s32ChnId = 0;
876*4882a593Smuzhiyun s32Ret = RK_MPI_SYS_UnBind(&stSrcChn, &stDestChn);
877*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
878*4882a593Smuzhiyun RK_LOGE("vpss ch 0 unband venc fail:%x", s32Ret);
879*4882a593Smuzhiyun return -1;
880*4882a593Smuzhiyun }
881*4882a593Smuzhiyun
882*4882a593Smuzhiyun //unbind venc 0 to vdec 1
883*4882a593Smuzhiyun stSrcChn.enModId = RK_ID_VENC;
884*4882a593Smuzhiyun stSrcChn.s32DevId = 0;
885*4882a593Smuzhiyun stSrcChn.s32ChnId = 0;
886*4882a593Smuzhiyun stDestChn.enModId = RK_ID_VDEC;
887*4882a593Smuzhiyun stDestChn.s32DevId = 0;
888*4882a593Smuzhiyun stDestChn.s32ChnId = VDEC_CH_CNT - 1;
889*4882a593Smuzhiyun s32Ret = RK_MPI_SYS_UnBind(&stSrcChn, &stDestChn);
890*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
891*4882a593Smuzhiyun RK_LOGE("vpss ch 0 unband venc fail:%x", s32Ret);
892*4882a593Smuzhiyun return -1;
893*4882a593Smuzhiyun }
894*4882a593Smuzhiyun
895*4882a593Smuzhiyun //unbind vpss ch 1 to vo [0, 3] [1, 3]
896*4882a593Smuzhiyun stSrcChn.enModId = RK_ID_VPSS;
897*4882a593Smuzhiyun stSrcChn.s32DevId = 0;
898*4882a593Smuzhiyun stSrcChn.s32ChnId = 1;
899*4882a593Smuzhiyun stDestChn.enModId = RK_ID_VO;
900*4882a593Smuzhiyun stDestChn.s32DevId = 0;
901*4882a593Smuzhiyun stDestChn.s32ChnId = VDEC_CH_CNT + 1;
902*4882a593Smuzhiyun s32Ret = RK_MPI_SYS_UnBind(&stSrcChn, &stDestChn);
903*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
904*4882a593Smuzhiyun RK_LOGE("vpss ch 0 unband vo fail:%x", s32Ret);
905*4882a593Smuzhiyun return -1;
906*4882a593Smuzhiyun }
907*4882a593Smuzhiyun
908*4882a593Smuzhiyun stDestChn.enModId = RK_ID_VO;
909*4882a593Smuzhiyun stDestChn.s32DevId = 1;
910*4882a593Smuzhiyun stDestChn.s32ChnId = VDEC_CH_CNT + 1;
911*4882a593Smuzhiyun s32Ret = RK_MPI_SYS_UnBind(&stSrcChn, &stDestChn);
912*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
913*4882a593Smuzhiyun RK_LOGE("vpss ch 0 unband vo fail:%x", s32Ret);
914*4882a593Smuzhiyun return -1;
915*4882a593Smuzhiyun }
916*4882a593Smuzhiyun
917*4882a593Smuzhiyun // enable vo
918*4882a593Smuzhiyun s32Ret = RK_MPI_VO_DisableChn(0, VDEC_CH_CNT);
919*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
920*4882a593Smuzhiyun RK_LOGE("Disable vo %d chn failed, s32Ret = %d\n", VDEC_CH_CNT, s32Ret);
921*4882a593Smuzhiyun return -1;
922*4882a593Smuzhiyun }
923*4882a593Smuzhiyun s32Ret = RK_MPI_VO_DisableChn(0, VDEC_CH_CNT + 1);
924*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
925*4882a593Smuzhiyun RK_LOGE("Disable vo chn failed, s32Ret = %d\n", VDEC_CH_CNT + 1, s32Ret);
926*4882a593Smuzhiyun return -1;
927*4882a593Smuzhiyun }
928*4882a593Smuzhiyun s32Ret = RK_MPI_VO_DisableChn(1, VDEC_CH_CNT);
929*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
930*4882a593Smuzhiyun RK_LOGE("Disable vo %d chn failed, s32Ret = %d\n", VDEC_CH_CNT, s32Ret);
931*4882a593Smuzhiyun return -1;
932*4882a593Smuzhiyun }
933*4882a593Smuzhiyun s32Ret = RK_MPI_VO_DisableChn(1, VDEC_CH_CNT + 1);
934*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
935*4882a593Smuzhiyun RK_LOGE("Disable vo chn failed, s32Ret = %d\n", VDEC_CH_CNT + 1, s32Ret);
936*4882a593Smuzhiyun return -1;
937*4882a593Smuzhiyun }
938*4882a593Smuzhiyun
939*4882a593Smuzhiyun destroy_vi();
940*4882a593Smuzhiyun destory_vpss(0, 2);
941*4882a593Smuzhiyun destory_venc();
942*4882a593Smuzhiyun destory_vo();
943*4882a593Smuzhiyun return RK_SUCCESS;
944*4882a593Smuzhiyun }
945*4882a593Smuzhiyun
mpi_all_test_show_options(const TEST_ALL_CTX_S * ctx)946*4882a593Smuzhiyun static void mpi_all_test_show_options(const TEST_ALL_CTX_S *ctx) {
947*4882a593Smuzhiyun RK_PRINT("cmd parse result:\n");
948*4882a593Smuzhiyun RK_PRINT("video file name : %s\n", ctx->srcFileUri);
949*4882a593Smuzhiyun RK_PRINT("vdec width : %d\n", ctx->u32SrcWidth);
950*4882a593Smuzhiyun RK_PRINT("vdec height : %d\n", ctx->u32SrcHeight);
951*4882a593Smuzhiyun RK_PRINT("vdec codecId : %d\n", ctx->enCodecId);
952*4882a593Smuzhiyun RK_PRINT("loop count : %d\n", ctx->s32LoopCount);
953*4882a593Smuzhiyun RK_PRINT("aEntityName : %s\n", ctx->aEntityName);
954*4882a593Smuzhiyun RK_PRINT("enPixelFormat : %d\n", ctx->enPixelFormat);
955*4882a593Smuzhiyun RK_PRINT("vi width : %d\n", ctx->u32SrcWidth1);
956*4882a593Smuzhiyun RK_PRINT("vi height : %d\n", ctx->u32SrcHeight1);
957*4882a593Smuzhiyun return;
958*4882a593Smuzhiyun }
959*4882a593Smuzhiyun
960*4882a593Smuzhiyun static const char *const usages[] = {
961*4882a593Smuzhiyun "./rk_mpi_all_test -i /data/xxx.h264 -w 1920 -h 1080 -W 1920 -H 1080 -n /dev/vide20 -f 65543",
962*4882a593Smuzhiyun NULL,
963*4882a593Smuzhiyun };
964*4882a593Smuzhiyun
main(int argc,const char ** argv)965*4882a593Smuzhiyun int main(int argc, const char **argv) {
966*4882a593Smuzhiyun TEST_ALL_CTX_S ctx;
967*4882a593Smuzhiyun memset(&ctx, 0, sizeof(TEST_ALL_CTX_S));
968*4882a593Smuzhiyun ctx.s32LoopCount = 1;
969*4882a593Smuzhiyun ctx.u32ReadSize = 1024;
970*4882a593Smuzhiyun ctx.u32SrcWidth = 1920;
971*4882a593Smuzhiyun ctx.u32SrcHeight = 1080;
972*4882a593Smuzhiyun ctx.u32SrcWidth1 = 1920;
973*4882a593Smuzhiyun ctx.u32SrcHeight1 = 1080;
974*4882a593Smuzhiyun ctx.enCodecId = RK_VIDEO_ID_AVC;
975*4882a593Smuzhiyun
976*4882a593Smuzhiyun struct argparse_option options[] = {
977*4882a593Smuzhiyun OPT_HELP(),
978*4882a593Smuzhiyun OPT_GROUP("basic options:"),
979*4882a593Smuzhiyun OPT_STRING('i', "input", &(ctx.srcFileUri),
980*4882a593Smuzhiyun "video file name. <required>", NULL, 0, 0),
981*4882a593Smuzhiyun OPT_INTEGER('C', "codec", &(ctx.enCodecId),
982*4882a593Smuzhiyun "video stream codec(8:h264, 9:mjpeg, 12:h265,...) <required on StreamMode>", NULL, 0, 0),
983*4882a593Smuzhiyun OPT_INTEGER('w', "vdec_width", &(ctx.u32SrcWidth),
984*4882a593Smuzhiyun "video source width <required on StreamMode>", NULL, 0, 0),
985*4882a593Smuzhiyun OPT_INTEGER('h', "vdec_height", &(ctx.u32SrcHeight),
986*4882a593Smuzhiyun "video source height <required on StreamMode>", NULL, 0, 0),
987*4882a593Smuzhiyun OPT_INTEGER('l', "loop_count", &(ctx.s32LoopCount),
988*4882a593Smuzhiyun "loop running count. default(1)", NULL, 0, 0),
989*4882a593Smuzhiyun OPT_INTEGER('W', "vi_width", &(ctx.u32SrcWidth1),
990*4882a593Smuzhiyun "video source width <required on StreamMode>", NULL, 0, 0),
991*4882a593Smuzhiyun OPT_INTEGER('H', "vi_height", &(ctx.u32SrcHeight1),
992*4882a593Smuzhiyun "video source height <required on StreamMode>", NULL, 0, 0),
993*4882a593Smuzhiyun OPT_STRING('n', "name", &(ctx.aEntityName),
994*4882a593Smuzhiyun "set the entityName (required, default null;\n\t"
995*4882a593Smuzhiyun "rv1126 sensor:rkispp_m_bypass rkispp_scale0 rkispp_scale1 rkispp_scale2;\n\t"
996*4882a593Smuzhiyun "rv1126 hdmiin/bt1120/sensor:/dev/videox such as /dev/video19 /dev/video20;\n\t"
997*4882a593Smuzhiyun "rk356x hdmiin/bt1120/sensor:/dev/videox such as /dev/video0 /dev/video1", NULL, 0, 0),
998*4882a593Smuzhiyun OPT_INTEGER('f', "format", &(ctx.enPixelFormat),
999*4882a593Smuzhiyun "set the format(default 0; 0:RK_FMT_YUV420SP 10:RK_FMT_YUV422_UYVY"
1000*4882a593Smuzhiyun "131080:RK_FMT_RGB_BAYER_SBGGR_12BPP.....)", NULL, 0, 0),
1001*4882a593Smuzhiyun OPT_END(),
1002*4882a593Smuzhiyun };
1003*4882a593Smuzhiyun
1004*4882a593Smuzhiyun struct argparse argparse;
1005*4882a593Smuzhiyun argparse_init(&argparse, options, usages, 0);
1006*4882a593Smuzhiyun argparse_describe(&argparse, "\nselect a test case to run.",
1007*4882a593Smuzhiyun "\nuse --help for details.");
1008*4882a593Smuzhiyun
1009*4882a593Smuzhiyun argc = argparse_parse(&argparse, argc, argv);
1010*4882a593Smuzhiyun mpi_all_test_show_options(&ctx);
1011*4882a593Smuzhiyun
1012*4882a593Smuzhiyun if (check_options(&ctx)) {
1013*4882a593Smuzhiyun RK_LOGE("illegal input parameters");
1014*4882a593Smuzhiyun argparse_usage(&argparse);
1015*4882a593Smuzhiyun goto __FAILED;
1016*4882a593Smuzhiyun }
1017*4882a593Smuzhiyun
1018*4882a593Smuzhiyun if (RK_MPI_SYS_Init() != RK_SUCCESS) {
1019*4882a593Smuzhiyun goto __FAILED;
1020*4882a593Smuzhiyun }
1021*4882a593Smuzhiyun
1022*4882a593Smuzhiyun while (ctx.s32LoopCount > 0) {
1023*4882a593Smuzhiyun if (unit_test_mpi_all(&ctx) < 0) {
1024*4882a593Smuzhiyun goto __FAILED;
1025*4882a593Smuzhiyun }
1026*4882a593Smuzhiyun ctx.s32LoopCount--;
1027*4882a593Smuzhiyun }
1028*4882a593Smuzhiyun
1029*4882a593Smuzhiyun if (RK_MPI_SYS_Exit() != RK_SUCCESS) {
1030*4882a593Smuzhiyun goto __FAILED;
1031*4882a593Smuzhiyun }
1032*4882a593Smuzhiyun
1033*4882a593Smuzhiyun RK_LOGE("test running success!");
1034*4882a593Smuzhiyun return RK_SUCCESS;
1035*4882a593Smuzhiyun __FAILED:
1036*4882a593Smuzhiyun RK_LOGE("test running failed! %d count running done not yet.", ctx.s32LoopCount);
1037*4882a593Smuzhiyun pause();
1038*4882a593Smuzhiyun return RK_FAILURE;
1039*4882a593Smuzhiyun }
1040*4882a593Smuzhiyun
1041