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 "test_comm_argparse.h"
34*4882a593Smuzhiyun #include "test_comm_utils.h"
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun #define MAX_STREAM_CNT 8
37*4882a593Smuzhiyun #define MAX_TIME_OUT_MS 20
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun #ifndef VDEC_INT64_MIN
40*4882a593Smuzhiyun #define VDEC_INT64_MIN (-0x7fffffffffffffffLL-1)
41*4882a593Smuzhiyun #endif
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun #ifndef VDEC_INT64_MAX
44*4882a593Smuzhiyun #define VDEC_INT64_MAX INT64_C(9223372036854775807)
45*4882a593Smuzhiyun #endif
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun typedef struct _rkMpiVDECCtx {
48*4882a593Smuzhiyun const char *srcFileUri;
49*4882a593Smuzhiyun const char *dstFilePath;
50*4882a593Smuzhiyun RK_U32 u32SrcWidth;
51*4882a593Smuzhiyun RK_U32 u32SrcHeight;
52*4882a593Smuzhiyun RK_S32 s32LoopCount;
53*4882a593Smuzhiyun RK_U32 u32ChnIndex;
54*4882a593Smuzhiyun RK_U32 u32ChNum;
55*4882a593Smuzhiyun RK_U32 u32InputMode;
56*4882a593Smuzhiyun RK_CODEC_ID_E enCodecId;
57*4882a593Smuzhiyun RK_U32 u32CompressMode;
58*4882a593Smuzhiyun RK_U32 u32FrameBufferCnt;
59*4882a593Smuzhiyun pthread_t pVdecThread;
60*4882a593Smuzhiyun pthread_t pGetPicThread;
61*4882a593Smuzhiyun RK_U32 u32StreamIndex;
62*4882a593Smuzhiyun void *pExtraData;
63*4882a593Smuzhiyun RK_U32 u32ExtraDataSize;
64*4882a593Smuzhiyun RK_U32 u32ReadSize;
65*4882a593Smuzhiyun RK_BOOL threadExit;
66*4882a593Smuzhiyun RK_S32 s32ChnFd;
67*4882a593Smuzhiyun RK_BOOL bEnableMbPool;
68*4882a593Smuzhiyun MB_POOL s32Pool;
69*4882a593Smuzhiyun RK_S32 s32OutputPixFmt;
70*4882a593Smuzhiyun RK_BOOL bEnableDei;
71*4882a593Smuzhiyun RK_BOOL bEnableColmv;
72*4882a593Smuzhiyun } TEST_VDEC_CTX_S;
73*4882a593Smuzhiyun
dump_frame_to_file(VIDEO_FRAME_INFO_S * pstFrame,FILE * fp)74*4882a593Smuzhiyun static void dump_frame_to_file(VIDEO_FRAME_INFO_S *pstFrame, FILE *fp) {
75*4882a593Smuzhiyun RK_U32 i;
76*4882a593Smuzhiyun RK_U32 width = 0;
77*4882a593Smuzhiyun RK_U32 height = 0;
78*4882a593Smuzhiyun RK_U32 h_stride = 0;
79*4882a593Smuzhiyun RK_U32 v_stride = 0;
80*4882a593Smuzhiyun RK_U8 *base_y = RK_NULL;
81*4882a593Smuzhiyun RK_U8 *base_c = RK_NULL;
82*4882a593Smuzhiyun RK_U8 *base = RK_NULL;
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun if (NULL == fp)
85*4882a593Smuzhiyun return;
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun base = (RK_U8 *)RK_MPI_MB_Handle2VirAddr(pstFrame->stVFrame.pMbBlk);
88*4882a593Smuzhiyun RK_MPI_SYS_MmzFlushCache(pstFrame->stVFrame.pMbBlk, RK_TRUE);
89*4882a593Smuzhiyun width = pstFrame->stVFrame.u32Width;
90*4882a593Smuzhiyun height = pstFrame->stVFrame.u32Height;
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun switch (pstFrame->stVFrame.enPixelFormat) {
93*4882a593Smuzhiyun case RK_FMT_YUV420SP_VU :
94*4882a593Smuzhiyun case RK_FMT_YUV420SP : {
95*4882a593Smuzhiyun h_stride = pstFrame->stVFrame.u32VirWidth;
96*4882a593Smuzhiyun v_stride = pstFrame->stVFrame.u32VirHeight;
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun base_y = base;
99*4882a593Smuzhiyun base_c = base + h_stride * v_stride;
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun for (i = 0; i < height; i++, base_y += h_stride) {
102*4882a593Smuzhiyun fwrite(base_y, 1, width, fp);
103*4882a593Smuzhiyun }
104*4882a593Smuzhiyun for (i = 0; i < height / 2; i++, base_c += h_stride) {
105*4882a593Smuzhiyun fwrite(base_c, 1, width, fp);
106*4882a593Smuzhiyun }
107*4882a593Smuzhiyun } break;
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun case RK_FMT_YUV420SP_10BIT : {
110*4882a593Smuzhiyun h_stride = pstFrame->stVFrame.u32VirWidth * 10 / 8;
111*4882a593Smuzhiyun v_stride = pstFrame->stVFrame.u32VirHeight;
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun base_y = base;
114*4882a593Smuzhiyun base_c = base + h_stride * v_stride;
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun for (i = 0; i < height; i++, base_y += h_stride) {
117*4882a593Smuzhiyun fwrite(base_y, 1, width, fp);
118*4882a593Smuzhiyun }
119*4882a593Smuzhiyun for (i = 0; i < height / 2; i++, base_c += h_stride) {
120*4882a593Smuzhiyun fwrite(base_c, 1, width, fp);
121*4882a593Smuzhiyun }
122*4882a593Smuzhiyun } break;
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun case RK_FMT_RGB565:
125*4882a593Smuzhiyun case RK_FMT_BGR565: {
126*4882a593Smuzhiyun h_stride = pstFrame->stVFrame.u32VirWidth * 2;
127*4882a593Smuzhiyun v_stride = pstFrame->stVFrame.u32VirHeight;
128*4882a593Smuzhiyun base_y = base;
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun for (i = 0; i < height; i++, base_y += h_stride)
131*4882a593Smuzhiyun fwrite(base_y, 1, width * 2, fp);
132*4882a593Smuzhiyun } break;
133*4882a593Smuzhiyun case RK_FMT_RGB888:
134*4882a593Smuzhiyun case RK_FMT_BGR888: {
135*4882a593Smuzhiyun h_stride = pstFrame->stVFrame.u32VirWidth * 3;
136*4882a593Smuzhiyun v_stride = pstFrame->stVFrame.u32VirHeight;
137*4882a593Smuzhiyun base_y = base;
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun for (i = 0; i < height; i++, base_y += h_stride)
140*4882a593Smuzhiyun fwrite(base_y, 1, width * 3, fp);
141*4882a593Smuzhiyun } break;
142*4882a593Smuzhiyun default : {
143*4882a593Smuzhiyun RK_LOGE("not supported format %d\n", pstFrame->stVFrame.enPixelFormat);
144*4882a593Smuzhiyun } break;
145*4882a593Smuzhiyun }
146*4882a593Smuzhiyun }
147*4882a593Smuzhiyun
check_options(const TEST_VDEC_CTX_S * ctx)148*4882a593Smuzhiyun static RK_S32 check_options(const TEST_VDEC_CTX_S *ctx) {
149*4882a593Smuzhiyun if (ctx->srcFileUri == RK_NULL) {
150*4882a593Smuzhiyun goto __FAILED;
151*4882a593Smuzhiyun }
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun if (ctx->u32InputMode == VIDEO_MODE_STREAM) {
154*4882a593Smuzhiyun if (ctx->enCodecId <= RK_VIDEO_ID_Unused ||
155*4882a593Smuzhiyun ctx->u32SrcWidth <= 0 ||
156*4882a593Smuzhiyun ctx->u32SrcHeight <= 0) {
157*4882a593Smuzhiyun goto __FAILED;
158*4882a593Smuzhiyun }
159*4882a593Smuzhiyun }
160*4882a593Smuzhiyun return RK_SUCCESS;
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun __FAILED:
163*4882a593Smuzhiyun return RK_FAILURE;
164*4882a593Smuzhiyun }
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun
mpi_vdec_poll_event(RK_S32 timeoutMsec,RK_S32 fd)167*4882a593Smuzhiyun RK_S32 mpi_vdec_poll_event(RK_S32 timeoutMsec, RK_S32 fd) {
168*4882a593Smuzhiyun RK_S32 num_fds = 1;
169*4882a593Smuzhiyun struct pollfd pollFds[num_fds];
170*4882a593Smuzhiyun RK_S32 ret = 0;
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun RK_ASSERT(fd > 0);
173*4882a593Smuzhiyun memset(pollFds, 0, sizeof(pollFds));
174*4882a593Smuzhiyun pollFds[0].fd = fd;
175*4882a593Smuzhiyun pollFds[0].events = (POLLPRI | POLLIN | POLLERR | POLLNVAL | POLLHUP);
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun ret = poll(pollFds, num_fds, timeoutMsec);
178*4882a593Smuzhiyun if (ret > 0 && (pollFds[0].revents & (POLLERR | POLLNVAL | POLLHUP))) {
179*4882a593Smuzhiyun RK_LOGE("fd:%d polled error", fd);
180*4882a593Smuzhiyun return -1;
181*4882a593Smuzhiyun }
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun return ret;
184*4882a593Smuzhiyun }
185*4882a593Smuzhiyun
mpi_create_vdec(TEST_VDEC_CTX_S * ctx,RK_S32 s32Ch,VIDEO_MODE_E enMode)186*4882a593Smuzhiyun RK_S32 mpi_create_vdec(TEST_VDEC_CTX_S *ctx, RK_S32 s32Ch, VIDEO_MODE_E enMode) {
187*4882a593Smuzhiyun RK_S32 s32Ret = RK_SUCCESS;
188*4882a593Smuzhiyun VDEC_CHN_ATTR_S stAttr;
189*4882a593Smuzhiyun VDEC_CHN_PARAM_S stVdecParam;
190*4882a593Smuzhiyun MB_POOL_CONFIG_S stMbPoolCfg;
191*4882a593Smuzhiyun VDEC_PIC_BUF_ATTR_S stVdecPicBufAttr;
192*4882a593Smuzhiyun MB_PIC_CAL_S stMbPicCalResult;
193*4882a593Smuzhiyun VDEC_MOD_PARAM_S stModParam;
194*4882a593Smuzhiyun
195*4882a593Smuzhiyun memset(&stAttr, 0, sizeof(VDEC_CHN_ATTR_S));
196*4882a593Smuzhiyun memset(&stVdecParam, 0, sizeof(VDEC_CHN_PARAM_S));
197*4882a593Smuzhiyun memset(&stModParam, 0, sizeof(VDEC_MOD_PARAM_S));
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun if (ctx->bEnableMbPool) {
200*4882a593Smuzhiyun stModParam.enVdecMBSource = MB_SOURCE_USER;
201*4882a593Smuzhiyun s32Ret = RK_MPI_VDEC_SetModParam(&stModParam);
202*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
203*4882a593Smuzhiyun RK_LOGE("vdec %d SetModParam failed! errcode %x", ctx->u32ChnIndex, s32Ret);
204*4882a593Smuzhiyun return s32Ret;
205*4882a593Smuzhiyun }
206*4882a593Smuzhiyun }
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun stAttr.enMode = enMode;
209*4882a593Smuzhiyun stAttr.enType = ctx->enCodecId;
210*4882a593Smuzhiyun stAttr.u32PicWidth = ctx->u32SrcWidth;
211*4882a593Smuzhiyun stAttr.u32PicHeight = ctx->u32SrcHeight;
212*4882a593Smuzhiyun stAttr.u32FrameBufCnt = ctx->u32FrameBufferCnt;
213*4882a593Smuzhiyun stAttr.u32StreamBufCnt = MAX_STREAM_CNT;
214*4882a593Smuzhiyun
215*4882a593Smuzhiyun if (!ctx->bEnableColmv) {
216*4882a593Smuzhiyun stAttr.stVdecVideoAttr.bTemporalMvpEnable = RK_FALSE;
217*4882a593Smuzhiyun }
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun s32Ret = RK_MPI_VDEC_CreateChn(ctx->u32ChnIndex, &stAttr);
220*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
221*4882a593Smuzhiyun RK_LOGE("create %d vdec failed! ", ctx->u32ChnIndex);
222*4882a593Smuzhiyun return s32Ret;
223*4882a593Smuzhiyun }
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun if (ctx->enCodecId == RK_VIDEO_ID_MJPEG) {
226*4882a593Smuzhiyun stVdecParam.stVdecPictureParam.enPixelFormat = (PIXEL_FORMAT_E)ctx->s32OutputPixFmt;
227*4882a593Smuzhiyun } else {
228*4882a593Smuzhiyun stVdecParam.stVdecVideoParam.enCompressMode = (COMPRESS_MODE_E)ctx->u32CompressMode;
229*4882a593Smuzhiyun }
230*4882a593Smuzhiyun if (ctx->bEnableDei) {
231*4882a593Smuzhiyun stVdecParam.stVdecVideoParam.bDeiEn = ctx->bEnableDei;
232*4882a593Smuzhiyun }
233*4882a593Smuzhiyun // it is only effective to disable MV when decoding sequence output
234*4882a593Smuzhiyun if (!ctx->bEnableColmv) {
235*4882a593Smuzhiyun stVdecParam.stVdecVideoParam.enOutputOrder = VIDEO_OUTPUT_ORDER_DEC;
236*4882a593Smuzhiyun }
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun s32Ret = RK_MPI_VDEC_SetChnParam(ctx->u32ChnIndex, &stVdecParam);
239*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
240*4882a593Smuzhiyun RK_LOGE("set chn %d param failed %x! ", ctx->u32ChnIndex, s32Ret);
241*4882a593Smuzhiyun return s32Ret;
242*4882a593Smuzhiyun }
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun ctx->s32ChnFd = RK_MPI_VDEC_GetFd(ctx->u32ChnIndex);
245*4882a593Smuzhiyun if (ctx->s32ChnFd <= 0) {
246*4882a593Smuzhiyun RK_LOGE("get fd chn %d failed %d", ctx->u32ChnIndex, ctx->s32ChnFd);
247*4882a593Smuzhiyun return s32Ret;
248*4882a593Smuzhiyun }
249*4882a593Smuzhiyun
250*4882a593Smuzhiyun if (ctx->bEnableMbPool) {
251*4882a593Smuzhiyun memset(&stMbPoolCfg, 0, sizeof(MB_POOL_CONFIG_S));
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun stVdecPicBufAttr.enCodecType = ctx->enCodecId;
254*4882a593Smuzhiyun stVdecPicBufAttr.stPicBufAttr.u32Width = ctx->u32SrcWidth;
255*4882a593Smuzhiyun stVdecPicBufAttr.stPicBufAttr.u32Height = ctx->u32SrcHeight;
256*4882a593Smuzhiyun stVdecPicBufAttr.stPicBufAttr.enPixelFormat = (PIXEL_FORMAT_E)ctx->s32OutputPixFmt;
257*4882a593Smuzhiyun stVdecPicBufAttr.stPicBufAttr.enCompMode = (COMPRESS_MODE_E)ctx->u32CompressMode;
258*4882a593Smuzhiyun s32Ret = RK_MPI_CAL_VDEC_GetPicBufferSize(&stVdecPicBufAttr, &stMbPicCalResult);
259*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
260*4882a593Smuzhiyun RK_LOGE("get picture buffer size failed. err 0x%x", s32Ret);
261*4882a593Smuzhiyun return s32Ret;
262*4882a593Smuzhiyun }
263*4882a593Smuzhiyun
264*4882a593Smuzhiyun stMbPoolCfg.u64MBSize = stMbPicCalResult.u32MBSize;;
265*4882a593Smuzhiyun stMbPoolCfg.u32MBCnt = 10;
266*4882a593Smuzhiyun stMbPoolCfg.enRemapMode = MB_REMAP_MODE_CACHED;
267*4882a593Smuzhiyun stMbPoolCfg.bPreAlloc = RK_TRUE;
268*4882a593Smuzhiyun ctx->s32Pool = RK_MPI_MB_CreatePool(&stMbPoolCfg);
269*4882a593Smuzhiyun if (ctx->s32Pool == MB_INVALID_POOLID) {
270*4882a593Smuzhiyun RK_LOGE("create pool failed!");
271*4882a593Smuzhiyun return s32Ret;
272*4882a593Smuzhiyun }
273*4882a593Smuzhiyun s32Ret = RK_MPI_VDEC_AttachMbPool(ctx->u32ChnIndex, ctx->s32Pool);
274*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
275*4882a593Smuzhiyun RK_LOGE("attatc vdec mb pool %d failed! ", ctx->u32ChnIndex);
276*4882a593Smuzhiyun return s32Ret;
277*4882a593Smuzhiyun }
278*4882a593Smuzhiyun }
279*4882a593Smuzhiyun
280*4882a593Smuzhiyun s32Ret = RK_MPI_VDEC_StartRecvStream(ctx->u32ChnIndex);
281*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
282*4882a593Smuzhiyun RK_LOGE("start recv chn %d failed %x! ", ctx->u32ChnIndex, s32Ret);
283*4882a593Smuzhiyun return s32Ret;
284*4882a593Smuzhiyun }
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun return RK_SUCCESS;
287*4882a593Smuzhiyun }
288*4882a593Smuzhiyun
mpi_destory_vdec(TEST_VDEC_CTX_S * ctx,RK_S32 s32Ch)289*4882a593Smuzhiyun RK_S32 mpi_destory_vdec(TEST_VDEC_CTX_S *ctx, RK_S32 s32Ch) {
290*4882a593Smuzhiyun RK_MPI_VDEC_StopRecvStream(s32Ch);
291*4882a593Smuzhiyun
292*4882a593Smuzhiyun if (ctx->s32ChnFd > 0) {
293*4882a593Smuzhiyun RK_MPI_VDEC_CloseFd(s32Ch);
294*4882a593Smuzhiyun }
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun if (ctx->bEnableMbPool) {
297*4882a593Smuzhiyun RK_MPI_VDEC_DetachMbPool(s32Ch);
298*4882a593Smuzhiyun RK_MPI_VDEC_DestroyChn(s32Ch);
299*4882a593Smuzhiyun RK_MPI_MB_DestroyPool(ctx->s32Pool);
300*4882a593Smuzhiyun } else {
301*4882a593Smuzhiyun RK_MPI_VDEC_DestroyChn(s32Ch);
302*4882a593Smuzhiyun }
303*4882a593Smuzhiyun
304*4882a593Smuzhiyun return RK_SUCCESS;
305*4882a593Smuzhiyun }
306*4882a593Smuzhiyun
mpi_create_stream_mode(TEST_VDEC_CTX_S * ctx,RK_S32 s32Ch)307*4882a593Smuzhiyun RK_S32 mpi_create_stream_mode(TEST_VDEC_CTX_S *ctx, RK_S32 s32Ch) {
308*4882a593Smuzhiyun VIDEO_MODE_E enMode;
309*4882a593Smuzhiyun
310*4882a593Smuzhiyun if (ctx->enCodecId == RK_VIDEO_ID_MJPEG || ctx->enCodecId == RK_VIDEO_ID_JPEG) {
311*4882a593Smuzhiyun ctx->u32ReadSize = ctx->u32SrcWidth * ctx->u32SrcHeight;
312*4882a593Smuzhiyun enMode = VIDEO_MODE_FRAME;
313*4882a593Smuzhiyun } else {
314*4882a593Smuzhiyun enMode = VIDEO_MODE_STREAM;
315*4882a593Smuzhiyun }
316*4882a593Smuzhiyun
317*4882a593Smuzhiyun return mpi_create_vdec(ctx, s32Ch, enMode);
318*4882a593Smuzhiyun }
319*4882a593Smuzhiyun
mpi_create_frame_mode(TEST_VDEC_CTX_S * ctx,RK_S32 s32Ch)320*4882a593Smuzhiyun RK_S32 mpi_create_frame_mode(TEST_VDEC_CTX_S *ctx, RK_S32 s32Ch) {
321*4882a593Smuzhiyun RK_S32 s32Ret = RK_SUCCESS;
322*4882a593Smuzhiyun
323*4882a593Smuzhiyun s32Ret = mpi_create_vdec(ctx, s32Ch, VIDEO_MODE_FRAME);
324*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
325*4882a593Smuzhiyun goto __FAILED;
326*4882a593Smuzhiyun }
327*4882a593Smuzhiyun
328*4882a593Smuzhiyun return s32Ret;
329*4882a593Smuzhiyun __FAILED:
330*4882a593Smuzhiyun
331*4882a593Smuzhiyun return RK_FAILURE;
332*4882a593Smuzhiyun }
333*4882a593Smuzhiyun
mpi_get_pic(void * pArgs)334*4882a593Smuzhiyun void* mpi_get_pic(void *pArgs) {
335*4882a593Smuzhiyun TEST_VDEC_CTX_S *ctx = reinterpret_cast<TEST_VDEC_CTX_S *>(pArgs);
336*4882a593Smuzhiyun FILE *fp = RK_NULL;
337*4882a593Smuzhiyun VIDEO_FRAME_INFO_S sFrame;
338*4882a593Smuzhiyun RK_S32 s32Ret;
339*4882a593Smuzhiyun char name[256] = {0};
340*4882a593Smuzhiyun RK_S32 s32FrameCount = 0;
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun memset(&sFrame, 0, sizeof(VIDEO_FRAME_INFO_S));
343*4882a593Smuzhiyun
344*4882a593Smuzhiyun if (ctx->dstFilePath != RK_NULL) {
345*4882a593Smuzhiyun mkdir(ctx->dstFilePath, 0777);
346*4882a593Smuzhiyun snprintf(name, sizeof(name), "%stest_%d.bin", ctx->dstFilePath, ctx->u32ChnIndex);
347*4882a593Smuzhiyun
348*4882a593Smuzhiyun fp = fopen(name, "wb");
349*4882a593Smuzhiyun if (fp == RK_NULL) {
350*4882a593Smuzhiyun RK_LOGE("can't open output file %s\n", name);
351*4882a593Smuzhiyun return NULL;
352*4882a593Smuzhiyun }
353*4882a593Smuzhiyun }
354*4882a593Smuzhiyun
355*4882a593Smuzhiyun while (!ctx->threadExit) {
356*4882a593Smuzhiyun if (ctx->s32ChnFd > 0) {
357*4882a593Smuzhiyun s32Ret = mpi_vdec_poll_event(-1, ctx->s32ChnFd);
358*4882a593Smuzhiyun if (s32Ret < 0) {
359*4882a593Smuzhiyun if (ctx->threadExit)
360*4882a593Smuzhiyun break;
361*4882a593Smuzhiyun
362*4882a593Smuzhiyun usleep(1000llu);
363*4882a593Smuzhiyun continue;
364*4882a593Smuzhiyun }
365*4882a593Smuzhiyun }
366*4882a593Smuzhiyun
367*4882a593Smuzhiyun s32Ret = RK_MPI_VDEC_GetFrame(ctx->u32ChnIndex, &sFrame, MAX_TIME_OUT_MS);
368*4882a593Smuzhiyun if (s32Ret >= 0) {
369*4882a593Smuzhiyun s32FrameCount++;
370*4882a593Smuzhiyun RK_LOGI("get chn %d frame %d", ctx->u32ChnIndex, s32FrameCount);
371*4882a593Smuzhiyun if ((sFrame.stVFrame.u32FrameFlag & FRAME_FLAG_SNAP_END) == FRAME_FLAG_SNAP_END) {
372*4882a593Smuzhiyun RK_MPI_VDEC_ReleaseFrame(ctx->u32ChnIndex, &sFrame);
373*4882a593Smuzhiyun RK_LOGI("chn %d reach eos frame.", ctx->u32ChnIndex);
374*4882a593Smuzhiyun break;
375*4882a593Smuzhiyun }
376*4882a593Smuzhiyun
377*4882a593Smuzhiyun dump_frame_to_file(&sFrame, fp);
378*4882a593Smuzhiyun RK_MPI_VDEC_ReleaseFrame(ctx->u32ChnIndex, &sFrame);
379*4882a593Smuzhiyun } else {
380*4882a593Smuzhiyun if (ctx->threadExit)
381*4882a593Smuzhiyun break;
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun usleep(1000llu);
384*4882a593Smuzhiyun }
385*4882a593Smuzhiyun }
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun if (fp)
388*4882a593Smuzhiyun fclose(fp);
389*4882a593Smuzhiyun RK_LOGI("%s out", __FUNCTION__);
390*4882a593Smuzhiyun return RK_NULL;
391*4882a593Smuzhiyun }
392*4882a593Smuzhiyun
393*4882a593Smuzhiyun
mpi_vdec_free(void * opaque)394*4882a593Smuzhiyun static RK_S32 mpi_vdec_free(void *opaque) {
395*4882a593Smuzhiyun if (opaque)
396*4882a593Smuzhiyun free(opaque);
397*4882a593Smuzhiyun return 0;
398*4882a593Smuzhiyun }
399*4882a593Smuzhiyun
mpi_send_stream(void * pArgs)400*4882a593Smuzhiyun static void* mpi_send_stream(void *pArgs) {
401*4882a593Smuzhiyun TEST_VDEC_CTX_S *ctx = reinterpret_cast<TEST_VDEC_CTX_S *>(pArgs);
402*4882a593Smuzhiyun RK_S32 s32Size = 0;
403*4882a593Smuzhiyun RK_S32 s32Ret = 0;
404*4882a593Smuzhiyun RK_U8 *data = RK_NULL;
405*4882a593Smuzhiyun FILE *fp = RK_NULL;
406*4882a593Smuzhiyun MB_BLK buffer = RK_NULL;
407*4882a593Smuzhiyun MB_EXT_CONFIG_S pstMbExtConfig;
408*4882a593Smuzhiyun VDEC_CHN_STATUS_S staus;
409*4882a593Smuzhiyun VDEC_CHN_ATTR_S stAttr;
410*4882a593Smuzhiyun VDEC_CHN_PARAM_S stVdecParam;
411*4882a593Smuzhiyun VDEC_STREAM_S stStream;
412*4882a593Smuzhiyun RK_S32 s32PacketCount = 0;
413*4882a593Smuzhiyun RK_S32 s32ReachEOS = 0;
414*4882a593Smuzhiyun
415*4882a593Smuzhiyun memset(&stStream, 0, sizeof(VDEC_STREAM_S));
416*4882a593Smuzhiyun
417*4882a593Smuzhiyun fp = fopen(ctx->srcFileUri, "r");
418*4882a593Smuzhiyun if (fp == RK_NULL) {
419*4882a593Smuzhiyun RK_LOGE("open file %s failed", ctx->srcFileUri);
420*4882a593Smuzhiyun return RK_NULL;
421*4882a593Smuzhiyun }
422*4882a593Smuzhiyun
423*4882a593Smuzhiyun while (!ctx->threadExit) {
424*4882a593Smuzhiyun data = reinterpret_cast<RK_U8 *>(calloc(ctx->u32ReadSize, sizeof(RK_U8)));
425*4882a593Smuzhiyun memset(data, 0, ctx->u32ReadSize);
426*4882a593Smuzhiyun s32Size = fread(data, 1, ctx->u32ReadSize, fp);
427*4882a593Smuzhiyun if (s32Size <= 0) {
428*4882a593Smuzhiyun if (ctx->s32LoopCount--) {
429*4882a593Smuzhiyun mpi_vdec_free(data);
430*4882a593Smuzhiyun s32ReachEOS = 0;
431*4882a593Smuzhiyun fseek(fp, 0, SEEK_SET);
432*4882a593Smuzhiyun RK_LOGI("ctx->s32LoopCount = %d",ctx->s32LoopCount);
433*4882a593Smuzhiyun if (ctx->u32ChnIndex) {
434*4882a593Smuzhiyun for (int i = 0; i < ctx->u32ChNum; i++) {
435*4882a593Smuzhiyun VO_CHN_ATTR_S stChnAttr;
436*4882a593Smuzhiyun RK_MPI_VO_GetChnAttr(0, i, &stChnAttr);
437*4882a593Smuzhiyun if (ctx->s32LoopCount % 2)
438*4882a593Smuzhiyun stChnAttr.u32Priority = ctx->u32ChNum - i;
439*4882a593Smuzhiyun else
440*4882a593Smuzhiyun stChnAttr.u32Priority = i;
441*4882a593Smuzhiyun RK_MPI_VO_SetChnAttr(0, i, &stChnAttr);
442*4882a593Smuzhiyun }
443*4882a593Smuzhiyun }
444*4882a593Smuzhiyun continue;
445*4882a593Smuzhiyun } else
446*4882a593Smuzhiyun s32ReachEOS = 1;
447*4882a593Smuzhiyun }
448*4882a593Smuzhiyun
449*4882a593Smuzhiyun memset(&pstMbExtConfig, 0, sizeof(MB_EXT_CONFIG_S));
450*4882a593Smuzhiyun pstMbExtConfig.pFreeCB = mpi_vdec_free;
451*4882a593Smuzhiyun pstMbExtConfig.pOpaque = data;
452*4882a593Smuzhiyun pstMbExtConfig.pu8VirAddr = data;
453*4882a593Smuzhiyun pstMbExtConfig.u64Size = s32Size;
454*4882a593Smuzhiyun
455*4882a593Smuzhiyun RK_MPI_SYS_CreateMB(&buffer, &pstMbExtConfig);
456*4882a593Smuzhiyun
457*4882a593Smuzhiyun stStream.u64PTS = 0;
458*4882a593Smuzhiyun stStream.pMbBlk = buffer;
459*4882a593Smuzhiyun stStream.u32Len = s32Size;
460*4882a593Smuzhiyun stStream.bEndOfStream = s32ReachEOS ? RK_TRUE : RK_FALSE;
461*4882a593Smuzhiyun stStream.bEndOfFrame = s32ReachEOS ? RK_TRUE : RK_FALSE;
462*4882a593Smuzhiyun stStream.bBypassMbBlk = RK_TRUE;
463*4882a593Smuzhiyun __RETRY:
464*4882a593Smuzhiyun s32Ret = RK_MPI_VDEC_SendStream(ctx->u32ChnIndex, &stStream, MAX_TIME_OUT_MS);
465*4882a593Smuzhiyun if (s32Ret < 0) {
466*4882a593Smuzhiyun if (ctx->threadExit) {
467*4882a593Smuzhiyun mpi_vdec_free(data);
468*4882a593Smuzhiyun RK_MPI_MB_ReleaseMB(stStream.pMbBlk);
469*4882a593Smuzhiyun break;
470*4882a593Smuzhiyun }
471*4882a593Smuzhiyun usleep(1000llu);
472*4882a593Smuzhiyun goto __RETRY;
473*4882a593Smuzhiyun } else {
474*4882a593Smuzhiyun s32PacketCount++;
475*4882a593Smuzhiyun RK_MPI_MB_ReleaseMB(stStream.pMbBlk);
476*4882a593Smuzhiyun //RK_LOGI("send chn %d packet %d", ctx->u32ChnIndex, s32PacketCount);
477*4882a593Smuzhiyun }
478*4882a593Smuzhiyun if (s32ReachEOS) {
479*4882a593Smuzhiyun RK_LOGI("chn %d input reach EOS", ctx->u32ChnIndex);
480*4882a593Smuzhiyun break;
481*4882a593Smuzhiyun }
482*4882a593Smuzhiyun }
483*4882a593Smuzhiyun
484*4882a593Smuzhiyun if (fp)
485*4882a593Smuzhiyun fclose(fp);
486*4882a593Smuzhiyun
487*4882a593Smuzhiyun RK_LOGI("%s out\n", __FUNCTION__);
488*4882a593Smuzhiyun return RK_NULL;
489*4882a593Smuzhiyun }
490*4882a593Smuzhiyun
create_vo(RK_U32 ChCnt)491*4882a593Smuzhiyun static RK_S32 create_vo(RK_U32 ChCnt) {
492*4882a593Smuzhiyun /* Enable VO */
493*4882a593Smuzhiyun VO_PUB_ATTR_S VoPubAttr;
494*4882a593Smuzhiyun VO_VIDEO_LAYER_ATTR_S stLayerAttr;
495*4882a593Smuzhiyun RK_S32 s32Ret = RK_SUCCESS;
496*4882a593Smuzhiyun VO_CHN_ATTR_S stChnAttr;
497*4882a593Smuzhiyun VO_LAYER VoLayer = 0;
498*4882a593Smuzhiyun VO_DEV VoDev = 0;
499*4882a593Smuzhiyun
500*4882a593Smuzhiyun RK_MPI_VO_DisableLayer(VoLayer);
501*4882a593Smuzhiyun RK_MPI_VO_DisableLayer(4);
502*4882a593Smuzhiyun RK_MPI_VO_DisableLayer(5);
503*4882a593Smuzhiyun RK_MPI_VO_DisableLayer(6);
504*4882a593Smuzhiyun RK_MPI_VO_DisableLayer(7);
505*4882a593Smuzhiyun RK_MPI_VO_Disable(VoDev);
506*4882a593Smuzhiyun
507*4882a593Smuzhiyun memset(&VoPubAttr, 0, sizeof(VO_PUB_ATTR_S));
508*4882a593Smuzhiyun memset(&stLayerAttr, 0, sizeof(VO_VIDEO_LAYER_ATTR_S));
509*4882a593Smuzhiyun
510*4882a593Smuzhiyun stLayerAttr.enPixFormat = RK_FMT_RGB888;
511*4882a593Smuzhiyun stLayerAttr.stDispRect.s32X = 0;
512*4882a593Smuzhiyun stLayerAttr.stDispRect.s32Y = 0;
513*4882a593Smuzhiyun stLayerAttr.u32DispFrmRt = 30;
514*4882a593Smuzhiyun stLayerAttr.stDispRect.u32Width = 1920;
515*4882a593Smuzhiyun stLayerAttr.stDispRect.u32Height = 1080;
516*4882a593Smuzhiyun stLayerAttr.stImageSize.u32Width = 1920;
517*4882a593Smuzhiyun stLayerAttr.stImageSize.u32Height = 1080;
518*4882a593Smuzhiyun
519*4882a593Smuzhiyun s32Ret = RK_MPI_VO_GetPubAttr(VoDev, &VoPubAttr);
520*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
521*4882a593Smuzhiyun return s32Ret;
522*4882a593Smuzhiyun }
523*4882a593Smuzhiyun
524*4882a593Smuzhiyun VoPubAttr.enIntfType = VO_INTF_HDMI;
525*4882a593Smuzhiyun VoPubAttr.enIntfSync = VO_OUTPUT_DEFAULT;
526*4882a593Smuzhiyun
527*4882a593Smuzhiyun s32Ret = RK_MPI_VO_SetPubAttr(VoDev, &VoPubAttr);
528*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
529*4882a593Smuzhiyun return s32Ret;
530*4882a593Smuzhiyun }
531*4882a593Smuzhiyun s32Ret = RK_MPI_VO_Enable(VoDev);
532*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
533*4882a593Smuzhiyun return s32Ret;
534*4882a593Smuzhiyun }
535*4882a593Smuzhiyun
536*4882a593Smuzhiyun s32Ret = RK_MPI_VO_BindLayer(VoLayer, VoDev, VO_LAYER_MODE_VIDEO);
537*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
538*4882a593Smuzhiyun RK_LOGE("RK_MPI_VO_BindLayer failed,s32Ret:%d\n", s32Ret);
539*4882a593Smuzhiyun return RK_FAILURE;
540*4882a593Smuzhiyun }
541*4882a593Smuzhiyun
542*4882a593Smuzhiyun s32Ret = RK_MPI_VO_SetLayerAttr(VoLayer, &stLayerAttr);
543*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
544*4882a593Smuzhiyun RK_LOGE("RK_MPI_VO_SetLayerAttr failed,s32Ret:%d\n", s32Ret);
545*4882a593Smuzhiyun return RK_FAILURE;
546*4882a593Smuzhiyun }
547*4882a593Smuzhiyun
548*4882a593Smuzhiyun s32Ret = RK_MPI_VO_EnableLayer(VoLayer);
549*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
550*4882a593Smuzhiyun RK_LOGE("RK_MPI_VO_EnableLayer failed,s32Ret:%d\n", s32Ret);
551*4882a593Smuzhiyun return RK_FAILURE;
552*4882a593Smuzhiyun }
553*4882a593Smuzhiyun
554*4882a593Smuzhiyun for (int i = 0; i < ChCnt; i++) {
555*4882a593Smuzhiyun stChnAttr.stRect.u32Width = stLayerAttr.stImageSize.u32Width / ChCnt;
556*4882a593Smuzhiyun stChnAttr.stRect.u32Height = stLayerAttr.stImageSize.u32Height / ChCnt;
557*4882a593Smuzhiyun stChnAttr.stRect.s32X = i * stChnAttr.stRect.u32Width / 2;
558*4882a593Smuzhiyun stChnAttr.stRect.s32Y = i * stChnAttr.stRect.u32Height / 2;
559*4882a593Smuzhiyun stChnAttr.u32Priority = i;
560*4882a593Smuzhiyun stChnAttr.u32FgAlpha = 128;
561*4882a593Smuzhiyun stChnAttr.u32BgAlpha = 0;
562*4882a593Smuzhiyun
563*4882a593Smuzhiyun s32Ret = RK_MPI_VO_SetChnAttr(VoLayer, i, &stChnAttr);
564*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
565*4882a593Smuzhiyun RK_LOGE("set chn Attr failed,s32Ret:%d\n", s32Ret);
566*4882a593Smuzhiyun return RK_FAILURE;
567*4882a593Smuzhiyun }
568*4882a593Smuzhiyun }
569*4882a593Smuzhiyun
570*4882a593Smuzhiyun return s32Ret;
571*4882a593Smuzhiyun }
572*4882a593Smuzhiyun
573*4882a593Smuzhiyun
unit_test_mpi_vdec(TEST_VDEC_CTX_S * ctx)574*4882a593Smuzhiyun RK_S32 unit_test_mpi_vdec(TEST_VDEC_CTX_S *ctx) {
575*4882a593Smuzhiyun MPP_CHN_S stSrcChn, stDestChn;
576*4882a593Smuzhiyun RK_S32 s32Ret = RK_FAILURE;
577*4882a593Smuzhiyun RK_U32 u32Ch = 0;
578*4882a593Smuzhiyun TEST_VDEC_CTX_S vdecCtx[VDEC_MAX_CHN_NUM];
579*4882a593Smuzhiyun pthread_t vdecThread[VDEC_MAX_CHN_NUM];
580*4882a593Smuzhiyun pthread_t getPicThread[VDEC_MAX_CHN_NUM];
581*4882a593Smuzhiyun
582*4882a593Smuzhiyun for (u32Ch = 0; u32Ch < ctx->u32ChNum; u32Ch++) {
583*4882a593Smuzhiyun if (ctx->u32ChNum > 1) {
584*4882a593Smuzhiyun ctx->u32ChnIndex = u32Ch;
585*4882a593Smuzhiyun }
586*4882a593Smuzhiyun memcpy(&(vdecCtx[u32Ch]), ctx, sizeof(TEST_VDEC_CTX_S));
587*4882a593Smuzhiyun
588*4882a593Smuzhiyun // Does not support JPEG stream framing, read the size of one picture at a time
589*4882a593Smuzhiyun // and send it to the decoder.
590*4882a593Smuzhiyun if (ctx->u32InputMode == VIDEO_MODE_STREAM || ctx->enCodecId == RK_VIDEO_ID_MJPEG ||
591*4882a593Smuzhiyun ctx->enCodecId == RK_VIDEO_ID_JPEG) {
592*4882a593Smuzhiyun mpi_create_stream_mode(&vdecCtx[u32Ch], u32Ch);
593*4882a593Smuzhiyun pthread_create(&vdecThread[u32Ch], 0, mpi_send_stream, reinterpret_cast<void *>(&vdecCtx[u32Ch]));
594*4882a593Smuzhiyun } else {
595*4882a593Smuzhiyun return -1;
596*4882a593Smuzhiyun }
597*4882a593Smuzhiyun
598*4882a593Smuzhiyun //pthread_create(&getPicThread[u32Ch], 0, mpi_get_pic, reinterpret_cast<void *>(&vdecCtx[u32Ch]));
599*4882a593Smuzhiyun }
600*4882a593Smuzhiyun
601*4882a593Smuzhiyun s32Ret = create_vo(ctx->u32ChNum);
602*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
603*4882a593Smuzhiyun RK_LOGE("create vo ch failed");
604*4882a593Smuzhiyun return -1;
605*4882a593Smuzhiyun }
606*4882a593Smuzhiyun // bind vi to vo
607*4882a593Smuzhiyun for (int i = 0; i < ctx->u32ChNum; i++) {
608*4882a593Smuzhiyun stSrcChn.enModId = RK_ID_VDEC;
609*4882a593Smuzhiyun stSrcChn.s32DevId = 0;
610*4882a593Smuzhiyun stSrcChn.s32ChnId = i;
611*4882a593Smuzhiyun
612*4882a593Smuzhiyun stDestChn.enModId = RK_ID_VO;
613*4882a593Smuzhiyun stDestChn.s32DevId = 0;
614*4882a593Smuzhiyun stDestChn.s32ChnId = i;
615*4882a593Smuzhiyun
616*4882a593Smuzhiyun s32Ret = RK_MPI_SYS_Bind(&stSrcChn, &stDestChn);
617*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
618*4882a593Smuzhiyun RK_LOGE("vi band vo fail:%x", s32Ret);
619*4882a593Smuzhiyun return -1;
620*4882a593Smuzhiyun }
621*4882a593Smuzhiyun
622*4882a593Smuzhiyun // enable vo
623*4882a593Smuzhiyun s32Ret = RK_MPI_VO_EnableChn(0, i);
624*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
625*4882a593Smuzhiyun RK_LOGE("Enalbe vo chn failed, s32Ret = %d\n", s32Ret);
626*4882a593Smuzhiyun return -1;
627*4882a593Smuzhiyun }
628*4882a593Smuzhiyun }
629*4882a593Smuzhiyun
630*4882a593Smuzhiyun for (u32Ch = 0; u32Ch < ctx->u32ChNum; u32Ch++) {
631*4882a593Smuzhiyun pthread_join(vdecThread[u32Ch], RK_NULL);
632*4882a593Smuzhiyun pthread_join(getPicThread[u32Ch], RK_NULL);
633*4882a593Smuzhiyun
634*4882a593Smuzhiyun vdecCtx[u32Ch].threadExit = RK_TRUE;
635*4882a593Smuzhiyun if (ctx->u32ChNum > 1) {
636*4882a593Smuzhiyun mpi_destory_vdec(&vdecCtx[u32Ch], u32Ch);
637*4882a593Smuzhiyun } else {
638*4882a593Smuzhiyun mpi_destory_vdec(&vdecCtx[u32Ch], ctx->u32ChnIndex);
639*4882a593Smuzhiyun }
640*4882a593Smuzhiyun }
641*4882a593Smuzhiyun
642*4882a593Smuzhiyun return RK_SUCCESS;
643*4882a593Smuzhiyun }
644*4882a593Smuzhiyun
mpi_vdec_test_show_options(const TEST_VDEC_CTX_S * ctx)645*4882a593Smuzhiyun static void mpi_vdec_test_show_options(const TEST_VDEC_CTX_S *ctx) {
646*4882a593Smuzhiyun RK_PRINT("cmd parse result:\n");
647*4882a593Smuzhiyun RK_PRINT("input file name : %s\n", ctx->srcFileUri);
648*4882a593Smuzhiyun RK_PRINT("output path : %s\n", ctx->dstFilePath);
649*4882a593Smuzhiyun RK_PRINT("input width : %d\n", ctx->u32SrcWidth);
650*4882a593Smuzhiyun RK_PRINT("input height : %d\n", ctx->u32SrcHeight);
651*4882a593Smuzhiyun RK_PRINT("input codecId : %d\n", ctx->enCodecId);
652*4882a593Smuzhiyun RK_PRINT("loop count : %d\n", ctx->s32LoopCount);
653*4882a593Smuzhiyun RK_PRINT("channel index : %d\n", ctx->u32ChnIndex);
654*4882a593Smuzhiyun RK_PRINT("channel number : %d\n", ctx->u32ChNum);
655*4882a593Smuzhiyun RK_PRINT("output compress mode : %d\n", ctx->u32CompressMode);
656*4882a593Smuzhiyun RK_PRINT("input mode : %d\n", ctx->u32InputMode);
657*4882a593Smuzhiyun RK_PRINT("enable mb pool : %d\n", ctx->bEnableMbPool);
658*4882a593Smuzhiyun RK_PRINT("output pix format : %d\n", ctx->s32OutputPixFmt);
659*4882a593Smuzhiyun RK_PRINT("enable deinterlace : %d\n", ctx->bEnableDei);
660*4882a593Smuzhiyun RK_PRINT("enable colmv : %d\n", ctx->bEnableColmv);
661*4882a593Smuzhiyun return;
662*4882a593Smuzhiyun }
663*4882a593Smuzhiyun
664*4882a593Smuzhiyun static const char *const usages[] = {
665*4882a593Smuzhiyun "./rk_mpi_vdec_test [-i SRC_PATH] [-o OUTPUT_PATH]...",
666*4882a593Smuzhiyun NULL,
667*4882a593Smuzhiyun };
668*4882a593Smuzhiyun
main(int argc,const char ** argv)669*4882a593Smuzhiyun int main(int argc, const char **argv) {
670*4882a593Smuzhiyun TEST_VDEC_CTX_S ctx;
671*4882a593Smuzhiyun memset(&ctx, 0, sizeof(TEST_VDEC_CTX_S));
672*4882a593Smuzhiyun
673*4882a593Smuzhiyun ctx.u32InputMode = VIDEO_MODE_STREAM;
674*4882a593Smuzhiyun ctx.s32LoopCount = 1;
675*4882a593Smuzhiyun ctx.u32CompressMode = COMPRESS_MODE_NONE; // Suggest::COMPRESS_AFBC_16x16;
676*4882a593Smuzhiyun ctx.u32FrameBufferCnt = 8;
677*4882a593Smuzhiyun ctx.u32ReadSize = 1024;
678*4882a593Smuzhiyun ctx.u32ChNum = 1;
679*4882a593Smuzhiyun ctx.bEnableColmv = RK_TRUE;
680*4882a593Smuzhiyun ctx.s32OutputPixFmt = (RK_S32)RK_FMT_YUV420SP;
681*4882a593Smuzhiyun ctx.u32SrcWidth = 1920;
682*4882a593Smuzhiyun ctx.u32SrcHeight = 1080;
683*4882a593Smuzhiyun ctx.enCodecId = RK_VIDEO_ID_AVC;
684*4882a593Smuzhiyun
685*4882a593Smuzhiyun struct argparse_option options[] = {
686*4882a593Smuzhiyun OPT_HELP(),
687*4882a593Smuzhiyun OPT_GROUP("basic options:"),
688*4882a593Smuzhiyun OPT_STRING('i', "input", &(ctx.srcFileUri),
689*4882a593Smuzhiyun "input file name. <required>", NULL, 0, 0),
690*4882a593Smuzhiyun OPT_STRING('o', "output", &(ctx.dstFilePath),
691*4882a593Smuzhiyun "the directory of decoder output", NULL, 0, 0),
692*4882a593Smuzhiyun OPT_INTEGER('C', "codec", &(ctx.enCodecId),
693*4882a593Smuzhiyun "input stream codec(8:h264, 9:mjpeg, 12:h265,...) <required on StreamMode>", NULL, 0, 0),
694*4882a593Smuzhiyun OPT_INTEGER('n', "loop_count", &(ctx.s32LoopCount),
695*4882a593Smuzhiyun "loop running count. default(1)", NULL, 0, 0),
696*4882a593Smuzhiyun OPT_INTEGER('w', "width", &(ctx.u32SrcWidth),
697*4882a593Smuzhiyun "input source width <required on StreamMode>", NULL, 0, 0),
698*4882a593Smuzhiyun OPT_INTEGER('h', "height", &(ctx.u32SrcHeight),
699*4882a593Smuzhiyun "input source height <required on StreamMode>", NULL, 0, 0),
700*4882a593Smuzhiyun OPT_INTEGER('\0', "channel_index", &(ctx.u32ChnIndex),
701*4882a593Smuzhiyun "vdec channel index. default(0).", NULL, 0, 0),
702*4882a593Smuzhiyun OPT_INTEGER('c', "channel_count", &(ctx.u32ChNum),
703*4882a593Smuzhiyun "vdec channel count. default(1).", NULL, 0, 0),
704*4882a593Smuzhiyun OPT_INTEGER('\0', "dec_mode", &(ctx.u32InputMode),
705*4882a593Smuzhiyun "vdec decode mode. range(0:StreamMode, 1:FrameMode). default(0)", NULL, 0, 0),
706*4882a593Smuzhiyun OPT_INTEGER('\0', "dec_buf_cnt", &(ctx.u32FrameBufferCnt),
707*4882a593Smuzhiyun "vdec decode output buffer count, default(8)", NULL, 0, 0),
708*4882a593Smuzhiyun OPT_INTEGER('\0', "compress_mode", &(ctx.u32CompressMode),
709*4882a593Smuzhiyun "vdec compress mode, default(0); 0: NONE, 1: AFBC_16X16", NULL, 0, 0),
710*4882a593Smuzhiyun OPT_INTEGER('\0', "en_mbpool", &(ctx.bEnableMbPool),
711*4882a593Smuzhiyun "enable mb pool, default(0).", NULL, 0, 0),
712*4882a593Smuzhiyun OPT_INTEGER('\0', "pixfmt", &(ctx.s32OutputPixFmt),
713*4882a593Smuzhiyun "jpeg output pixel format, default(0); 0: YUV420SP", NULL, 0, 0),
714*4882a593Smuzhiyun OPT_INTEGER('\0', "en_dei", &(ctx.bEnableDei),
715*4882a593Smuzhiyun "enable deinterlace, default(0);", NULL, 0, 0),
716*4882a593Smuzhiyun OPT_INTEGER('\0', "en_colmv", &(ctx.bEnableColmv),
717*4882a593Smuzhiyun "enable colmv, default(1);", NULL, 0, 0),
718*4882a593Smuzhiyun OPT_END(),
719*4882a593Smuzhiyun };
720*4882a593Smuzhiyun
721*4882a593Smuzhiyun struct argparse argparse;
722*4882a593Smuzhiyun argparse_init(&argparse, options, usages, 0);
723*4882a593Smuzhiyun argparse_describe(&argparse, "\nselect a test case to run.",
724*4882a593Smuzhiyun "\nuse --help for details.");
725*4882a593Smuzhiyun
726*4882a593Smuzhiyun argc = argparse_parse(&argparse, argc, argv);
727*4882a593Smuzhiyun mpi_vdec_test_show_options(&ctx);
728*4882a593Smuzhiyun
729*4882a593Smuzhiyun if (check_options(&ctx)) {
730*4882a593Smuzhiyun RK_LOGE("illegal input parameters");
731*4882a593Smuzhiyun argparse_usage(&argparse);
732*4882a593Smuzhiyun goto __FAILED;
733*4882a593Smuzhiyun }
734*4882a593Smuzhiyun
735*4882a593Smuzhiyun if (RK_MPI_SYS_Init() != RK_SUCCESS) {
736*4882a593Smuzhiyun goto __FAILED;
737*4882a593Smuzhiyun }
738*4882a593Smuzhiyun
739*4882a593Smuzhiyun while (ctx.s32LoopCount > 0) {
740*4882a593Smuzhiyun if (unit_test_mpi_vdec(&ctx) < 0) {
741*4882a593Smuzhiyun goto __FAILED;
742*4882a593Smuzhiyun }
743*4882a593Smuzhiyun ctx.s32LoopCount--;
744*4882a593Smuzhiyun }
745*4882a593Smuzhiyun
746*4882a593Smuzhiyun if (RK_MPI_SYS_Exit() != RK_SUCCESS) {
747*4882a593Smuzhiyun goto __FAILED;
748*4882a593Smuzhiyun }
749*4882a593Smuzhiyun
750*4882a593Smuzhiyun RK_LOGE("test running success!");
751*4882a593Smuzhiyun return RK_SUCCESS;
752*4882a593Smuzhiyun __FAILED:
753*4882a593Smuzhiyun RK_LOGE("test running failed! %d count running done not yet.", ctx.s32LoopCount);
754*4882a593Smuzhiyun return RK_FAILURE;
755*4882a593Smuzhiyun }
756*4882a593Smuzhiyun
757