1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright 2020 Rockchip Electronics Co. LTD
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Licensed under the Apache License, Version 2.0 (the "License");
5*4882a593Smuzhiyun * you may not use this file except in compliance: 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 <string>
19*4882a593Smuzhiyun #include <cstring>
20*4882a593Smuzhiyun #include <unistd.h>
21*4882a593Smuzhiyun #include <pthread.h>
22*4882a593Smuzhiyun #include <signal.h>
23*4882a593Smuzhiyun #include <fcntl.h>
24*4882a593Smuzhiyun #include <sys/poll.h>
25*4882a593Smuzhiyun #include <sys/types.h>
26*4882a593Smuzhiyun #include <sys/stat.h>
27*4882a593Smuzhiyun #include <sys/ioctl.h>
28*4882a593Smuzhiyun #include <sys/prctl.h>
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun #include "rk_mpi_avs.h"
31*4882a593Smuzhiyun #include "rk_mpi_cal.h"
32*4882a593Smuzhiyun #include "rk_mpi_mb.h"
33*4882a593Smuzhiyun #include "rk_mpi_mmz.h"
34*4882a593Smuzhiyun #include "rk_mpi_venc.h"
35*4882a593Smuzhiyun #include "rk_mpi_vpss.h"
36*4882a593Smuzhiyun #include "rk_mpi_vo.h"
37*4882a593Smuzhiyun #include "rk_mpi_sys.h"
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun #include "test_common.h"
40*4882a593Smuzhiyun #include "test_comm_argparse.h"
41*4882a593Smuzhiyun #include "test_comm_avs.h"
42*4882a593Smuzhiyun #include "test_comm_vpss.h"
43*4882a593Smuzhiyun #include "test_comm_sys.h"
44*4882a593Smuzhiyun #include "test_comm_utils.h"
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun /* for RK3588 */
47*4882a593Smuzhiyun #define RK3588_VO_DEV_HDMI 0
48*4882a593Smuzhiyun #define RK3588_VO_DEV_MIPI 3
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun static RK_BOOL bExit = RK_FALSE;
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun typedef struct rkVPSS_CFG_S {
53*4882a593Smuzhiyun VPSS_GRP VpssGrp;
54*4882a593Smuzhiyun RK_U32 u32VpssChnCnt;
55*4882a593Smuzhiyun VPSS_GRP_ATTR_S stGrpVpssAttr;
56*4882a593Smuzhiyun VPSS_CHN_ATTR_S stVpssChnAttr[VPSS_MAX_CHN_NUM];
57*4882a593Smuzhiyun } VPSS_CFG_S;
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun typedef struct rkVENC_CFG_S {
60*4882a593Smuzhiyun VENC_CHN VencChn;
61*4882a593Smuzhiyun VENC_CHN_ATTR_S stAttr;
62*4882a593Smuzhiyun } VENC_CFG_S;
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun typedef struct _rkVO_CFG_S {
65*4882a593Smuzhiyun VO_DEV s32DevId;
66*4882a593Smuzhiyun VO_CHN s32ChnId;
67*4882a593Smuzhiyun VO_LAYER s32LayerId;
68*4882a593Smuzhiyun VO_VIDEO_LAYER_ATTR_S stVoLayerAttr;
69*4882a593Smuzhiyun VO_CHN_ATTR_S stVoChnAttr;
70*4882a593Smuzhiyun VO_CSC_S stVoCscAttr;
71*4882a593Smuzhiyun } VO_CFG_S;
72*4882a593Smuzhiyun
create_venc(VENC_CFG_S * ctx)73*4882a593Smuzhiyun static RK_S32 create_venc(VENC_CFG_S *ctx) {
74*4882a593Smuzhiyun RK_S32 s32Ret = RK_SUCCESS;
75*4882a593Smuzhiyun VENC_RECV_PIC_PARAM_S stRecvParam;
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun memset(&stRecvParam, 0, sizeof(VENC_RECV_PIC_PARAM_S));
78*4882a593Smuzhiyun stRecvParam.s32RecvPicNum = -1;
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun s32Ret = RK_MPI_VENC_CreateChn(ctx->VencChn, &ctx->stAttr);
81*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
82*4882a593Smuzhiyun RK_LOGE("venc [%d] RK_MPI_VENC_CreateChn failed: %#x!",
83*4882a593Smuzhiyun ctx->VencChn, s32Ret);
84*4882a593Smuzhiyun return s32Ret;
85*4882a593Smuzhiyun }
86*4882a593Smuzhiyun RK_LOGV("venc [%d] RK_MPI_VENC_CreateChn already.", ctx->VencChn);
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun s32Ret = RK_MPI_VENC_StartRecvFrame(ctx->VencChn, &stRecvParam);
89*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
90*4882a593Smuzhiyun RK_LOGE("venc [%d] RK_MPI_VENC_StartRecvFrame failed: %#x!",
91*4882a593Smuzhiyun ctx->VencChn, s32Ret);
92*4882a593Smuzhiyun return s32Ret;
93*4882a593Smuzhiyun }
94*4882a593Smuzhiyun RK_LOGV("venc [%d] RK_MPI_VENC_StartRecvFrame already.", ctx->VencChn);
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun return RK_SUCCESS;
97*4882a593Smuzhiyun }
98*4882a593Smuzhiyun
destroy_venc(VENC_CFG_S * ctx)99*4882a593Smuzhiyun static RK_S32 destroy_venc(VENC_CFG_S *ctx) {
100*4882a593Smuzhiyun RK_S32 s32Ret = RK_SUCCESS;
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun s32Ret = RK_MPI_VENC_StopRecvFrame(ctx->VencChn);
103*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
104*4882a593Smuzhiyun RK_LOGE("venc [%d] RK_MPI_VENC_StopRecvFrame failed: %#x!",
105*4882a593Smuzhiyun ctx->VencChn, s32Ret);
106*4882a593Smuzhiyun return s32Ret;
107*4882a593Smuzhiyun }
108*4882a593Smuzhiyun RK_LOGV("venc [%d] RK_MPI_VENC_StopRecvFrame already.", ctx->VencChn);
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun s32Ret = RK_MPI_VENC_DestroyChn(ctx->VencChn);
111*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
112*4882a593Smuzhiyun RK_LOGE("venc [%d] RK_MPI_VENC_DestroyChn failed: %#x!",
113*4882a593Smuzhiyun ctx->VencChn, s32Ret);
114*4882a593Smuzhiyun return s32Ret;
115*4882a593Smuzhiyun }
116*4882a593Smuzhiyun RK_LOGV("venc [%d] RK_MPI_VENC_DestroyChn already.", ctx->VencChn);
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun return RK_SUCCESS;
119*4882a593Smuzhiyun }
120*4882a593Smuzhiyun
create_vo(VO_CFG_S * ctx)121*4882a593Smuzhiyun static RK_S32 create_vo(VO_CFG_S *ctx) {
122*4882a593Smuzhiyun RK_S32 s32Ret = RK_SUCCESS;
123*4882a593Smuzhiyun RK_U32 u32DispBufLen;
124*4882a593Smuzhiyun VO_PUB_ATTR_S VoPubAttr;
125*4882a593Smuzhiyun VO_LAYER VoLayer = ctx->s32LayerId;
126*4882a593Smuzhiyun VO_DEV VoDev = ctx->s32DevId;
127*4882a593Smuzhiyun VO_CHN VoChn = ctx->s32ChnId;
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun memset(&VoPubAttr, 0, sizeof(VO_PUB_ATTR_S));
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun s32Ret = RK_MPI_VO_GetPubAttr(VoDev, &VoPubAttr);
132*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
133*4882a593Smuzhiyun RK_LOGE("vo [%d, %d, %d] RK_MPI_VO_GetPubAttr failed: %#x!",
134*4882a593Smuzhiyun VoDev, VoLayer, VoChn, s32Ret);
135*4882a593Smuzhiyun return s32Ret;
136*4882a593Smuzhiyun }
137*4882a593Smuzhiyun RK_LOGV("vo [%d, %d, %d] RK_MPI_VO_GetPubAttr already.",
138*4882a593Smuzhiyun VoDev, VoLayer, VoChn);
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun if (RK3588_VO_DEV_HDMI == VoDev) {
141*4882a593Smuzhiyun VoPubAttr.enIntfType = VO_INTF_HDMI;
142*4882a593Smuzhiyun VoPubAttr.enIntfSync = VO_OUTPUT_1080P60;
143*4882a593Smuzhiyun } else if (RK3588_VO_DEV_MIPI == VoDev) {
144*4882a593Smuzhiyun VoPubAttr.enIntfType = VO_INTF_MIPI;
145*4882a593Smuzhiyun VoPubAttr.enIntfSync = VO_OUTPUT_DEFAULT;
146*4882a593Smuzhiyun }
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun s32Ret = RK_MPI_VO_SetPubAttr(VoDev, &VoPubAttr);
149*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
150*4882a593Smuzhiyun RK_LOGE("vo [%d, %d, %d] RK_MPI_VO_GetPubAttr failed: %#x!",
151*4882a593Smuzhiyun VoDev, VoLayer, VoChn, s32Ret);
152*4882a593Smuzhiyun return s32Ret;
153*4882a593Smuzhiyun }
154*4882a593Smuzhiyun RK_LOGV("vo [%d, %d, %d] RK_MPI_VO_SetPubAttr already.",
155*4882a593Smuzhiyun VoDev, VoLayer, VoChn);
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun s32Ret = RK_MPI_VO_Enable(VoDev);
158*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
159*4882a593Smuzhiyun RK_LOGE("vo [%d, %d, %d] RK_MPI_VO_Enable failed: %#x!",
160*4882a593Smuzhiyun VoDev, VoLayer, VoChn, s32Ret);
161*4882a593Smuzhiyun return s32Ret;
162*4882a593Smuzhiyun }
163*4882a593Smuzhiyun RK_LOGV("vo [%d, %d, %d] RK_MPI_VO_Enable already.",
164*4882a593Smuzhiyun VoDev, VoLayer, VoChn);
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun s32Ret = RK_MPI_VO_GetLayerDispBufLen(VoLayer, &u32DispBufLen);
167*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
168*4882a593Smuzhiyun RK_LOGE("vo [%d, %d, %d] RK_MPI_VO_GetLayerDispBufLen failed: %#x!",
169*4882a593Smuzhiyun VoDev, VoLayer, VoChn, s32Ret);
170*4882a593Smuzhiyun return s32Ret;
171*4882a593Smuzhiyun }
172*4882a593Smuzhiyun RK_LOGV("vo [%d, %d, %d] RK_MPI_VO_GetLayerDispBufLen already.",
173*4882a593Smuzhiyun VoDev, VoLayer, VoChn);
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun u32DispBufLen = 3;
176*4882a593Smuzhiyun s32Ret = RK_MPI_VO_SetLayerDispBufLen(VoLayer, u32DispBufLen);
177*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
178*4882a593Smuzhiyun RK_LOGE("vo [%d, %d, %d] RK_MPI_VO_GetLayerDispBufLen %d failed: %#x!",
179*4882a593Smuzhiyun VoDev, VoLayer, VoChn, u32DispBufLen, s32Ret);
180*4882a593Smuzhiyun return s32Ret;
181*4882a593Smuzhiyun }
182*4882a593Smuzhiyun RK_LOGV("vo [%d, %d, %d] RK_MPI_VO_GetLayerDispBufLen %d already.",
183*4882a593Smuzhiyun VoDev, VoLayer, VoChn, u32DispBufLen);
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun s32Ret = RK_MPI_VO_BindLayer(VoLayer, VoDev, VO_LAYER_MODE_GRAPHIC);
186*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
187*4882a593Smuzhiyun RK_LOGE("vo [%d, %d, %d] RK_MPI_VO_BindLayer failed: %#x!",
188*4882a593Smuzhiyun VoDev, VoLayer, VoChn, s32Ret);
189*4882a593Smuzhiyun return s32Ret;
190*4882a593Smuzhiyun }
191*4882a593Smuzhiyun RK_LOGV("vo [%d, %d, %d] RK_MPI_VO_BindLayer already.",
192*4882a593Smuzhiyun VoDev, VoLayer, VoChn);
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun s32Ret = RK_MPI_VO_SetLayerAttr(VoLayer, &ctx->stVoLayerAttr);
195*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
196*4882a593Smuzhiyun RK_LOGE("vo [%d, %d, %d] RK_MPI_VO_SetLayerAttr failed: %#x!",
197*4882a593Smuzhiyun VoDev, VoLayer, VoChn, s32Ret);
198*4882a593Smuzhiyun return s32Ret;
199*4882a593Smuzhiyun }
200*4882a593Smuzhiyun RK_LOGV("vo [%d, %d, %d] RK_MPI_VO_SetLayerAttr already.",
201*4882a593Smuzhiyun VoDev, VoLayer, VoChn);
202*4882a593Smuzhiyun
203*4882a593Smuzhiyun #if VO_RGA
204*4882a593Smuzhiyun s32Ret = RK_MPI_VO_SetLayerSpliceMode(VoLayer, VO_SPLICE_MODE_RGA);
205*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
206*4882a593Smuzhiyun RK_LOGE("RK_MPI_VO_SetLayerSpliceMode failed: %#x", s32Ret);
207*4882a593Smuzhiyun return RK_FAILURE;
208*4882a593Smuzhiyun }
209*4882a593Smuzhiyun #endif
210*4882a593Smuzhiyun
211*4882a593Smuzhiyun s32Ret = RK_MPI_VO_EnableLayer(VoLayer);
212*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
213*4882a593Smuzhiyun RK_LOGE("vo [%d, %d, %d] RK_MPI_VO_EnableLayer failed: %#x!",
214*4882a593Smuzhiyun VoDev, VoLayer, VoChn, s32Ret);
215*4882a593Smuzhiyun return s32Ret;
216*4882a593Smuzhiyun }
217*4882a593Smuzhiyun RK_LOGV("vo [%d, %d, %d] RK_MPI_VO_EnableLayer already.",
218*4882a593Smuzhiyun VoDev, VoLayer, VoChn);
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun s32Ret = RK_MPI_VO_SetChnAttr(VoLayer, VoChn, &ctx->stVoChnAttr);
221*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
222*4882a593Smuzhiyun RK_LOGE("vo [%d, %d, %d] RK_MPI_VO_SetChnAttr failed: %#x!",
223*4882a593Smuzhiyun VoDev, VoLayer, VoChn, s32Ret);
224*4882a593Smuzhiyun return s32Ret;
225*4882a593Smuzhiyun }
226*4882a593Smuzhiyun RK_LOGV("vo [%d, %d, %d] RK_MPI_VO_SetChnAttr already.",
227*4882a593Smuzhiyun VoDev, VoLayer, VoChn);
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun s32Ret = RK_MPI_VO_SetLayerCSC(VoLayer, &ctx->stVoCscAttr);
230*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
231*4882a593Smuzhiyun RK_LOGE("vo [%d, %d, %d] RK_MPI_VO_SetChnAttr failed: %#x!",
232*4882a593Smuzhiyun VoDev, VoLayer, VoChn, s32Ret);
233*4882a593Smuzhiyun return s32Ret;
234*4882a593Smuzhiyun }
235*4882a593Smuzhiyun RK_LOGV("vo [%d, %d, %d] RK_MPI_VO_SetChnAttr already.",
236*4882a593Smuzhiyun VoDev, VoLayer, VoChn);
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun s32Ret = RK_MPI_VO_EnableChn(VoLayer, VoChn);
239*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
240*4882a593Smuzhiyun RK_LOGE("vo [%d, %d, %d] RK_MPI_VO_EnableChn failed: %#x!",
241*4882a593Smuzhiyun VoDev, VoLayer, VoChn, s32Ret);
242*4882a593Smuzhiyun return s32Ret;
243*4882a593Smuzhiyun }
244*4882a593Smuzhiyun RK_LOGV("vo [%d, %d, %d] RK_MPI_VO_EnableChn already.",
245*4882a593Smuzhiyun VoDev, VoLayer, VoChn);
246*4882a593Smuzhiyun
247*4882a593Smuzhiyun return s32Ret;
248*4882a593Smuzhiyun }
249*4882a593Smuzhiyun
destroy_vo(VO_CFG_S * ctx)250*4882a593Smuzhiyun static RK_S32 destroy_vo(VO_CFG_S *ctx) {
251*4882a593Smuzhiyun RK_S32 s32Ret = RK_SUCCESS;
252*4882a593Smuzhiyun VO_LAYER VoLayer = ctx->s32LayerId;
253*4882a593Smuzhiyun VO_DEV VoDev = ctx->s32DevId;
254*4882a593Smuzhiyun VO_CHN VoChn = ctx->s32ChnId;
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun s32Ret = RK_MPI_VO_DisableChn(VoDev, VoChn);
257*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
258*4882a593Smuzhiyun RK_LOGE("vo [%d, %d, %d] RK_MPI_VO_DisableChn failed: %#x!",
259*4882a593Smuzhiyun VoDev, VoLayer, VoChn);
260*4882a593Smuzhiyun return s32Ret;
261*4882a593Smuzhiyun }
262*4882a593Smuzhiyun RK_LOGV("vo [%d, %d, %d] RK_MPI_VO_DisableChn already.",
263*4882a593Smuzhiyun VoDev, VoLayer, VoChn);
264*4882a593Smuzhiyun
265*4882a593Smuzhiyun s32Ret = RK_MPI_VO_DisableLayer(VoLayer);
266*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
267*4882a593Smuzhiyun RK_LOGE("vo [%d, %d, %d] RK_MPI_VO_DisableLayer failed: %#x!",
268*4882a593Smuzhiyun VoDev, VoLayer, VoChn);
269*4882a593Smuzhiyun return s32Ret;
270*4882a593Smuzhiyun }
271*4882a593Smuzhiyun RK_LOGV("vo [%d, %d, %d] RK_MPI_VO_DisableLayer already.",
272*4882a593Smuzhiyun VoDev, VoLayer, VoChn);
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun s32Ret = RK_MPI_VO_Disable(VoDev);
275*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
276*4882a593Smuzhiyun RK_LOGE("vo [%d, %d, %d] RK_MPI_VO_Disable failed: %#x!",
277*4882a593Smuzhiyun VoDev, VoLayer, VoChn);
278*4882a593Smuzhiyun return s32Ret;
279*4882a593Smuzhiyun }
280*4882a593Smuzhiyun RK_LOGV("vo [%d, %d, %d] RK_MPI_VO_Disable already.",
281*4882a593Smuzhiyun VoDev, VoLayer, VoChn);
282*4882a593Smuzhiyun
283*4882a593Smuzhiyun return s32Ret;
284*4882a593Smuzhiyun }
285*4882a593Smuzhiyun
test_single_avs_loop(TEST_AVS_CTX_S * ctx)286*4882a593Smuzhiyun static RK_S32 test_single_avs_loop(TEST_AVS_CTX_S *ctx) {
287*4882a593Smuzhiyun RK_S32 s32Ret = RK_SUCCESS;
288*4882a593Smuzhiyun
289*4882a593Smuzhiyun s32Ret = TEST_AVS_UnitTest(ctx);
290*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
291*4882a593Smuzhiyun RK_LOGE("TEST_AVS_UnitTest failed: %#x!", s32Ret);
292*4882a593Smuzhiyun goto __FAILED;
293*4882a593Smuzhiyun }
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun __FAILED:
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun return s32Ret;
298*4882a593Smuzhiyun }
299*4882a593Smuzhiyun
sigterm_handler(int sig)300*4882a593Smuzhiyun static RK_VOID sigterm_handler(int sig) {
301*4882a593Smuzhiyun RK_PRINT("signal %d\n", sig);
302*4882a593Smuzhiyun bExit = RK_TRUE;
303*4882a593Smuzhiyun }
304*4882a593Smuzhiyun
test_avs_vpss_venc_loop(TEST_AVS_CTX_S * pstAvsCtx)305*4882a593Smuzhiyun static RK_S32 test_avs_vpss_venc_loop(TEST_AVS_CTX_S *pstAvsCtx) {
306*4882a593Smuzhiyun RK_PRINT(" Media link: \n");
307*4882a593Smuzhiyun RK_PRINT(" %d pool -> avs -> vpss -> venc(H264) \n", pstAvsCtx->s32PipeNum);
308*4882a593Smuzhiyun RK_PRINT(" -> venc(H265) \n");
309*4882a593Smuzhiyun
310*4882a593Smuzhiyun RK_S32 s32Ret = RK_SUCCESS;
311*4882a593Smuzhiyun RK_S32 loopCount = 0;
312*4882a593Smuzhiyun RK_S32 vpssChnCnt = 1;
313*4882a593Smuzhiyun RK_S32 vencChnCnt = vpssChnCnt;
314*4882a593Smuzhiyun RK_S32 vpssOutputWidth[vpssChnCnt] = {3840};
315*4882a593Smuzhiyun RK_S32 vpssOutputHeight[vpssChnCnt] = {2160};
316*4882a593Smuzhiyun
317*4882a593Smuzhiyun VPSS_CFG_S pstVpssCtx;
318*4882a593Smuzhiyun VENC_CFG_S *pstVencCtx;
319*4882a593Smuzhiyun VIDEO_FRAME_INFO_S **pstPipeFrames;
320*4882a593Smuzhiyun
321*4882a593Smuzhiyun pstVencCtx = reinterpret_cast<VENC_CFG_S *>
322*4882a593Smuzhiyun (malloc(sizeof(VENC_CFG_S) * vencChnCnt));
323*4882a593Smuzhiyun memset(pstVencCtx, 0, sizeof(VENC_CFG_S) * vencChnCnt);
324*4882a593Smuzhiyun pstPipeFrames = reinterpret_cast<VIDEO_FRAME_INFO_S **>(
325*4882a593Smuzhiyun malloc(sizeof(VIDEO_FRAME_INFO_S *) * AVS_PIPE_NUM));
326*4882a593Smuzhiyun for (RK_S32 i = 0; i < AVS_PIPE_NUM; i++) {
327*4882a593Smuzhiyun pstPipeFrames[i] = reinterpret_cast<VIDEO_FRAME_INFO_S *>(malloc(sizeof(VIDEO_FRAME_INFO_S)));
328*4882a593Smuzhiyun memset(pstPipeFrames[i], 0, sizeof(VIDEO_FRAME_INFO_S));
329*4882a593Smuzhiyun }
330*4882a593Smuzhiyun
331*4882a593Smuzhiyun s32Ret = TEST_AVS_ModCreateFramePool(pstAvsCtx);
332*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
333*4882a593Smuzhiyun goto __FREE_PIPE_FRAME;
334*4882a593Smuzhiyun }
335*4882a593Smuzhiyun
336*4882a593Smuzhiyun /* avs create */
337*4882a593Smuzhiyun s32Ret = TEST_AVS_ModInit(pstAvsCtx);
338*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
339*4882a593Smuzhiyun goto __DESTROY_FRAME_POOL;
340*4882a593Smuzhiyun }
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun /* vpss config init */
343*4882a593Smuzhiyun pstVpssCtx.VpssGrp = 0;
344*4882a593Smuzhiyun pstVpssCtx.u32VpssChnCnt = vpssChnCnt;
345*4882a593Smuzhiyun pstVpssCtx.stGrpVpssAttr.u32MaxW = 8192;
346*4882a593Smuzhiyun pstVpssCtx.stGrpVpssAttr.u32MaxH = 8192;
347*4882a593Smuzhiyun pstVpssCtx.stGrpVpssAttr.enPixelFormat = RK_FMT_YUV420SP;
348*4882a593Smuzhiyun pstVpssCtx.stGrpVpssAttr.stFrameRate.s32SrcFrameRate = -1;
349*4882a593Smuzhiyun pstVpssCtx.stGrpVpssAttr.stFrameRate.s32DstFrameRate = -1;
350*4882a593Smuzhiyun pstVpssCtx.stGrpVpssAttr.enCompressMode = COMPRESS_MODE_NONE;
351*4882a593Smuzhiyun for (RK_S32 i = 0; i < vpssChnCnt; i ++) {
352*4882a593Smuzhiyun pstVpssCtx.stVpssChnAttr[i].enChnMode = VPSS_CHN_MODE_USER;
353*4882a593Smuzhiyun pstVpssCtx.stVpssChnAttr[i].enDynamicRange = DYNAMIC_RANGE_SDR8;
354*4882a593Smuzhiyun pstVpssCtx.stVpssChnAttr[i].enPixelFormat = RK_FMT_YUV420SP;
355*4882a593Smuzhiyun pstVpssCtx.stVpssChnAttr[i].stFrameRate.s32SrcFrameRate = -1;
356*4882a593Smuzhiyun pstVpssCtx.stVpssChnAttr[i].stFrameRate.s32DstFrameRate = -1;
357*4882a593Smuzhiyun pstVpssCtx.stVpssChnAttr[i].u32Width = vpssOutputWidth[i];
358*4882a593Smuzhiyun pstVpssCtx.stVpssChnAttr[i].u32Height = vpssOutputHeight[i];
359*4882a593Smuzhiyun pstVpssCtx.stVpssChnAttr[i].enCompressMode = COMPRESS_AFBC_16x16;
360*4882a593Smuzhiyun pstVpssCtx.stVpssChnAttr[i].u32FrameBufCnt = 3;
361*4882a593Smuzhiyun pstVpssCtx.stVpssChnAttr[i].u32Depth = 1;
362*4882a593Smuzhiyun }
363*4882a593Smuzhiyun
364*4882a593Smuzhiyun /* vpss create */
365*4882a593Smuzhiyun s32Ret = TEST_VPSS_Start(pstVpssCtx.VpssGrp, pstVpssCtx.u32VpssChnCnt,
366*4882a593Smuzhiyun &pstVpssCtx.stGrpVpssAttr, pstVpssCtx.stVpssChnAttr);
367*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
368*4882a593Smuzhiyun goto __DESTROY_AVS;
369*4882a593Smuzhiyun }
370*4882a593Smuzhiyun
371*4882a593Smuzhiyun for (RK_S32 i = 0; i < vencChnCnt; i++) {
372*4882a593Smuzhiyun /* venc config init */
373*4882a593Smuzhiyun PIC_BUF_ATTR_S stPicBufAttr;
374*4882a593Smuzhiyun MB_PIC_CAL_S stMbPicCalResult;
375*4882a593Smuzhiyun
376*4882a593Smuzhiyun stPicBufAttr.u32Width = vpssOutputWidth[i];
377*4882a593Smuzhiyun stPicBufAttr.u32Height = vpssOutputHeight[i];
378*4882a593Smuzhiyun stPicBufAttr.enCompMode = COMPRESS_AFBC_16x16;
379*4882a593Smuzhiyun stPicBufAttr.enPixelFormat = RK_FMT_YUV420SP;
380*4882a593Smuzhiyun
381*4882a593Smuzhiyun s32Ret = RK_MPI_CAL_VGS_GetPicBufferSize(&stPicBufAttr, &stMbPicCalResult);
382*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
383*4882a593Smuzhiyun RK_LOGE("get picture buffer size failed: %#x!", s32Ret);
384*4882a593Smuzhiyun goto __DESTROY_VENC;
385*4882a593Smuzhiyun }
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun pstVencCtx[i].VencChn = i;
388*4882a593Smuzhiyun pstVencCtx[i].stAttr.stVencAttr.enPixelFormat = RK_FMT_YUV420SP;
389*4882a593Smuzhiyun pstVencCtx[i].stAttr.stVencAttr.u32PicWidth = vpssOutputWidth[i];
390*4882a593Smuzhiyun pstVencCtx[i].stAttr.stVencAttr.u32PicHeight = vpssOutputHeight[i];
391*4882a593Smuzhiyun pstVencCtx[i].stAttr.stVencAttr.u32VirWidth = vpssOutputWidth[i];
392*4882a593Smuzhiyun pstVencCtx[i].stAttr.stVencAttr.u32VirHeight = vpssOutputHeight[i];
393*4882a593Smuzhiyun pstVencCtx[i].stAttr.stVencAttr.u32StreamBufCnt = 3;
394*4882a593Smuzhiyun pstVencCtx[i].stAttr.stVencAttr.u32BufSize = stMbPicCalResult.u32MBSize;
395*4882a593Smuzhiyun if (i % 2 == 0) {
396*4882a593Smuzhiyun pstVencCtx[i].stAttr.stVencAttr.enType = RK_VIDEO_ID_AVC;
397*4882a593Smuzhiyun pstVencCtx[i].stAttr.stVencAttr.u32Profile = H264E_PROFILE_HIGH;
398*4882a593Smuzhiyun pstVencCtx[i].stAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR;
399*4882a593Smuzhiyun pstVencCtx[i].stAttr.stRcAttr.stH264Cbr.u32Gop = 60;
400*4882a593Smuzhiyun pstVencCtx[i].stAttr.stRcAttr.stH264Cbr.u32BitRate = 65536;
401*4882a593Smuzhiyun } else {
402*4882a593Smuzhiyun pstVencCtx[i].stAttr.stVencAttr.enType = RK_VIDEO_ID_HEVC;
403*4882a593Smuzhiyun pstVencCtx[i].stAttr.stVencAttr.u32Profile = H265E_PROFILE_MAIN;
404*4882a593Smuzhiyun pstVencCtx[i].stAttr.stRcAttr.enRcMode = VENC_RC_MODE_H265CBR;
405*4882a593Smuzhiyun pstVencCtx[i].stAttr.stRcAttr.stH265Cbr.u32Gop = 60;
406*4882a593Smuzhiyun pstVencCtx[i].stAttr.stRcAttr.stH264Cbr.u32BitRate = 16384;
407*4882a593Smuzhiyun }
408*4882a593Smuzhiyun /* venc create */
409*4882a593Smuzhiyun s32Ret = create_venc(&pstVencCtx[i]);
410*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
411*4882a593Smuzhiyun goto __DESTROY_VENC;
412*4882a593Smuzhiyun }
413*4882a593Smuzhiyun }
414*4882a593Smuzhiyun
415*4882a593Smuzhiyun /* bind avs -> vpss */
416*4882a593Smuzhiyun s32Ret = TEST_SYS_AvsBindVpss(0, 0, pstVpssCtx.VpssGrp);
417*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
418*4882a593Smuzhiyun RK_LOGE("bind failed: %x, avs [%d, %d] -> vpss [%d]",
419*4882a593Smuzhiyun s32Ret, 0, 0, pstVpssCtx.VpssGrp);
420*4882a593Smuzhiyun goto __DESTROY_VENC;
421*4882a593Smuzhiyun }
422*4882a593Smuzhiyun RK_LOGV("bind success, avs [%d, %d] -> vpss [%d]",
423*4882a593Smuzhiyun 0, 0, pstVpssCtx.VpssGrp);
424*4882a593Smuzhiyun
425*4882a593Smuzhiyun /* bind vpss -> venc */
426*4882a593Smuzhiyun for (RK_S32 i = 0; i < vpssChnCnt; i++) {
427*4882a593Smuzhiyun s32Ret = TEST_SYS_VpssBindVenc(0, i, i);
428*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
429*4882a593Smuzhiyun RK_LOGE("bind failed: %x, vpss [%d, %d] -> venc [%d]",
430*4882a593Smuzhiyun s32Ret, 0, i, i);
431*4882a593Smuzhiyun goto __UNBIND_AVS_VPSS;
432*4882a593Smuzhiyun }
433*4882a593Smuzhiyun RK_LOGV("bind success, vpss [%d, %d] -> venc [%d]",
434*4882a593Smuzhiyun 0, i, i);
435*4882a593Smuzhiyun }
436*4882a593Smuzhiyun
437*4882a593Smuzhiyun /* thread: do somethings */
438*4882a593Smuzhiyun signal(SIGINT, sigterm_handler);
439*4882a593Smuzhiyun if (pstAvsCtx->s32LoopCount > 0) {
440*4882a593Smuzhiyun VENC_STREAM_S stVencStream;
441*4882a593Smuzhiyun stVencStream.pstPack = reinterpret_cast<VENC_PACK_S *>(malloc(sizeof(VENC_PACK_S)));
442*4882a593Smuzhiyun
443*4882a593Smuzhiyun while (!bExit && loopCount < pstAvsCtx->s32LoopCount) {
444*4882a593Smuzhiyun s32Ret = TEST_AVS_ModGetFrameFromPool(pstAvsCtx, pstPipeFrames);
445*4882a593Smuzhiyun
446*4882a593Smuzhiyun s32Ret = TEST_AVS_ModSendFrame(pstAvsCtx->s32GrpIndex, pstAvsCtx->s32PipeNum, pstPipeFrames);
447*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
448*4882a593Smuzhiyun TEST_AVS_ModReleaseFrameToPool(pstAvsCtx, pstPipeFrames);
449*4882a593Smuzhiyun continue;
450*4882a593Smuzhiyun }
451*4882a593Smuzhiyun
452*4882a593Smuzhiyun TEST_AVS_ModReleaseFrameToPool(pstAvsCtx, pstPipeFrames);
453*4882a593Smuzhiyun
454*4882a593Smuzhiyun for (RK_S32 i = 0; i < vencChnCnt; i++) {
455*4882a593Smuzhiyun s32Ret = RK_MPI_VENC_GetStream(i, &stVencStream, 100);
456*4882a593Smuzhiyun if (s32Ret >= 0) {
457*4882a593Smuzhiyun RK_MPI_VENC_ReleaseStream(i, &stVencStream);
458*4882a593Smuzhiyun }
459*4882a593Smuzhiyun }
460*4882a593Smuzhiyun
461*4882a593Smuzhiyun usleep(33 * 1000);
462*4882a593Smuzhiyun loopCount++;
463*4882a593Smuzhiyun }
464*4882a593Smuzhiyun
465*4882a593Smuzhiyun if (stVencStream.pstPack) {
466*4882a593Smuzhiyun free(stVencStream.pstPack);
467*4882a593Smuzhiyun }
468*4882a593Smuzhiyun }
469*4882a593Smuzhiyun
470*4882a593Smuzhiyun __UNBIND_VPSS_VENC:
471*4882a593Smuzhiyun /* unbind avs -> vpss */
472*4882a593Smuzhiyun s32Ret = TEST_SYS_AvsUnbindVpss(0, 0, pstVpssCtx.VpssGrp);
473*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
474*4882a593Smuzhiyun RK_LOGE("unbind failed: %x, avs [%d, %d] -> vpss [%d]",
475*4882a593Smuzhiyun s32Ret, 0, 0, pstVpssCtx.VpssGrp);
476*4882a593Smuzhiyun }
477*4882a593Smuzhiyun RK_LOGV("unbind success, avs [%d, %d] -> vpss [%d]",
478*4882a593Smuzhiyun 0 , 0, pstVpssCtx.VpssGrp);
479*4882a593Smuzhiyun
480*4882a593Smuzhiyun __UNBIND_AVS_VPSS:
481*4882a593Smuzhiyun /* unbind vpss -> venc */
482*4882a593Smuzhiyun for (RK_S32 i = 0; i < vpssChnCnt; i++) {
483*4882a593Smuzhiyun s32Ret = TEST_SYS_VpssUnbindVenc(0, i, i);
484*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
485*4882a593Smuzhiyun RK_LOGE("unbind failed: %x, vpss [%d, %d] -> venc [%d]",
486*4882a593Smuzhiyun s32Ret, pstVpssCtx.VpssGrp, i, i);
487*4882a593Smuzhiyun }
488*4882a593Smuzhiyun RK_LOGV("unbind success, vpss [%d, %d] -> venc [%d]",
489*4882a593Smuzhiyun pstVpssCtx.VpssGrp, i, i);
490*4882a593Smuzhiyun }
491*4882a593Smuzhiyun
492*4882a593Smuzhiyun __DESTROY_VENC:
493*4882a593Smuzhiyun /* destroy venc */
494*4882a593Smuzhiyun for (RK_S32 i = 0; i < vencChnCnt; i++) {
495*4882a593Smuzhiyun s32Ret = destroy_venc(&pstVencCtx[i]);
496*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
497*4882a593Smuzhiyun RK_LOGE("venc [%d] destroy_venc failed: %#x", i, s32Ret);
498*4882a593Smuzhiyun }
499*4882a593Smuzhiyun RK_LOGV("venc [%d] destroy_venc already.", i);
500*4882a593Smuzhiyun }
501*4882a593Smuzhiyun
502*4882a593Smuzhiyun __DESTROY_VPSS:
503*4882a593Smuzhiyun /* destroy vpss */
504*4882a593Smuzhiyun s32Ret = TEST_VPSS_Stop(pstVpssCtx.VpssGrp, pstVpssCtx.u32VpssChnCnt);
505*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
506*4882a593Smuzhiyun RK_LOGE("vpss [%d] TEST_VPSS_Stop failed: %#x", pstVpssCtx.VpssGrp, s32Ret);
507*4882a593Smuzhiyun }
508*4882a593Smuzhiyun RK_LOGV("vpss [%d] TEST_VPSS_Stop already.", pstVpssCtx.VpssGrp);
509*4882a593Smuzhiyun
510*4882a593Smuzhiyun __DESTROY_AVS:
511*4882a593Smuzhiyun /* destroy avs */
512*4882a593Smuzhiyun s32Ret = TEST_AVS_ModDeInit(pstAvsCtx);
513*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
514*4882a593Smuzhiyun RK_LOGE("avs [%d] TEST_AVS_ModDeInit failed: %#x", pstAvsCtx->s32GrpIndex, s32Ret);
515*4882a593Smuzhiyun }
516*4882a593Smuzhiyun RK_LOGV("avs [%d] TEST_AVS_ModDeInit already.", pstAvsCtx->s32GrpIndex);
517*4882a593Smuzhiyun
518*4882a593Smuzhiyun __DESTROY_FRAME_POOL:
519*4882a593Smuzhiyun
520*4882a593Smuzhiyun s32Ret = TEST_AVS_ModDestroyFramePool(pstAvsCtx);
521*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
522*4882a593Smuzhiyun RK_LOGE("avs [%d] TEST_AVS_ModDestroyFramePool failed: %#x",
523*4882a593Smuzhiyun pstAvsCtx->s32GrpIndex, s32Ret);
524*4882a593Smuzhiyun }
525*4882a593Smuzhiyun RK_LOGV("avs [%d] TEST_AVS_ModDestroyFramePool already.",
526*4882a593Smuzhiyun pstAvsCtx->s32GrpIndex);
527*4882a593Smuzhiyun
528*4882a593Smuzhiyun __FREE_PIPE_FRAME:
529*4882a593Smuzhiyun
530*4882a593Smuzhiyun for (RK_S32 i = 0; i < AVS_PIPE_NUM; i++) {
531*4882a593Smuzhiyun RK_SAFE_FREE(pstPipeFrames[i]);
532*4882a593Smuzhiyun }
533*4882a593Smuzhiyun
534*4882a593Smuzhiyun RK_SAFE_FREE(pstPipeFrames);
535*4882a593Smuzhiyun
536*4882a593Smuzhiyun __FREE_VENC_CFG:
537*4882a593Smuzhiyun
538*4882a593Smuzhiyun RK_SAFE_FREE(pstVencCtx);
539*4882a593Smuzhiyun
540*4882a593Smuzhiyun return s32Ret;
541*4882a593Smuzhiyun }
542*4882a593Smuzhiyun
test_avs_vo_loop(TEST_AVS_CTX_S * pstAvsCtx)543*4882a593Smuzhiyun static RK_S32 test_avs_vo_loop(TEST_AVS_CTX_S *pstAvsCtx) {
544*4882a593Smuzhiyun RK_PRINT(" Media link: \n");
545*4882a593Smuzhiyun RK_PRINT(" %d avs -> vo (HDMI) \n", pstAvsCtx->s32PipeNum);
546*4882a593Smuzhiyun
547*4882a593Smuzhiyun RK_S32 s32Ret = RK_SUCCESS;
548*4882a593Smuzhiyun RK_S32 loopCount = 0;
549*4882a593Smuzhiyun VO_CFG_S pstVoCtx;
550*4882a593Smuzhiyun VIDEO_FRAME_INFO_S **pstPipeFrames;
551*4882a593Smuzhiyun
552*4882a593Smuzhiyun pstPipeFrames = reinterpret_cast<VIDEO_FRAME_INFO_S **>(
553*4882a593Smuzhiyun malloc(sizeof(VIDEO_FRAME_INFO_S *) * AVS_PIPE_NUM));
554*4882a593Smuzhiyun for (RK_S32 i = 0; i < AVS_PIPE_NUM; i++) {
555*4882a593Smuzhiyun pstPipeFrames[i] = reinterpret_cast<VIDEO_FRAME_INFO_S *>(malloc(sizeof(VIDEO_FRAME_INFO_S)));
556*4882a593Smuzhiyun memset(pstPipeFrames[i], 0, sizeof(VIDEO_FRAME_INFO_S));
557*4882a593Smuzhiyun }
558*4882a593Smuzhiyun
559*4882a593Smuzhiyun s32Ret = TEST_AVS_ModCreateFramePool(pstAvsCtx);
560*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
561*4882a593Smuzhiyun goto __FREE_PIPE_FRAME;
562*4882a593Smuzhiyun }
563*4882a593Smuzhiyun
564*4882a593Smuzhiyun /* avs create */
565*4882a593Smuzhiyun s32Ret = TEST_AVS_ModInit(pstAvsCtx);
566*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
567*4882a593Smuzhiyun goto __DESTROY_FRAME_POOL;
568*4882a593Smuzhiyun }
569*4882a593Smuzhiyun
570*4882a593Smuzhiyun /* vo config init */
571*4882a593Smuzhiyun pstVoCtx.s32LayerId = 0;
572*4882a593Smuzhiyun pstVoCtx.s32DevId = RK3588_VO_DEV_HDMI;
573*4882a593Smuzhiyun
574*4882a593Smuzhiyun if (RK3588_VO_DEV_HDMI == pstVoCtx.s32DevId) {
575*4882a593Smuzhiyun pstVoCtx.stVoLayerAttr.stDispRect.u32Width = 1920;
576*4882a593Smuzhiyun pstVoCtx.stVoLayerAttr.stDispRect.u32Height = 1080;
577*4882a593Smuzhiyun } else if (RK3588_VO_DEV_MIPI == pstVoCtx.s32DevId) {
578*4882a593Smuzhiyun pstVoCtx.stVoLayerAttr.stDispRect.u32Width = 1080;
579*4882a593Smuzhiyun pstVoCtx.stVoLayerAttr.stDispRect.u32Height = 1920;
580*4882a593Smuzhiyun }
581*4882a593Smuzhiyun pstVoCtx.stVoLayerAttr.enPixFormat = RK_FMT_RGB888;
582*4882a593Smuzhiyun
583*4882a593Smuzhiyun pstVoCtx.s32ChnId = 0;
584*4882a593Smuzhiyun pstVoCtx.stVoCscAttr.enCscMatrix = VO_CSC_MATRIX_IDENTITY;
585*4882a593Smuzhiyun pstVoCtx.stVoCscAttr.u32Contrast = 50;
586*4882a593Smuzhiyun pstVoCtx.stVoCscAttr.u32Hue = 50;
587*4882a593Smuzhiyun pstVoCtx.stVoCscAttr.u32Luma = 50;
588*4882a593Smuzhiyun pstVoCtx.stVoCscAttr.u32Satuature = 50;
589*4882a593Smuzhiyun
590*4882a593Smuzhiyun pstVoCtx.stVoLayerAttr.stDispRect.s32X = 0;
591*4882a593Smuzhiyun pstVoCtx.stVoLayerAttr.stDispRect.s32Y = 0;
592*4882a593Smuzhiyun pstVoCtx.stVoLayerAttr.stImageSize.u32Width =
593*4882a593Smuzhiyun pstVoCtx.stVoLayerAttr.stDispRect.u32Width;
594*4882a593Smuzhiyun pstVoCtx.stVoLayerAttr.stImageSize.u32Height =
595*4882a593Smuzhiyun pstVoCtx.stVoLayerAttr.stDispRect.u32Height;
596*4882a593Smuzhiyun
597*4882a593Smuzhiyun pstVoCtx.stVoLayerAttr.u32DispFrmRt = 30;
598*4882a593Smuzhiyun pstVoCtx.stVoChnAttr.stRect.s32X = 0;
599*4882a593Smuzhiyun pstVoCtx.stVoChnAttr.stRect.s32Y = 0;
600*4882a593Smuzhiyun pstVoCtx.stVoChnAttr.stRect.u32Width =
601*4882a593Smuzhiyun pstVoCtx.stVoLayerAttr.stImageSize.u32Width;
602*4882a593Smuzhiyun pstVoCtx.stVoChnAttr.stRect.u32Height =
603*4882a593Smuzhiyun pstVoCtx.stVoLayerAttr.stImageSize.u32Height;
604*4882a593Smuzhiyun pstVoCtx.stVoChnAttr.bDeflicker = RK_FALSE;
605*4882a593Smuzhiyun pstVoCtx.stVoChnAttr.u32Priority = 1;
606*4882a593Smuzhiyun pstVoCtx.stVoChnAttr.u32FgAlpha = 128;
607*4882a593Smuzhiyun pstVoCtx.stVoChnAttr.u32BgAlpha = 0;
608*4882a593Smuzhiyun
609*4882a593Smuzhiyun /* vo creat */
610*4882a593Smuzhiyun s32Ret = create_vo(&pstVoCtx);
611*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
612*4882a593Smuzhiyun RK_LOGE("vo [%d, %d, %d] create failed: %x",
613*4882a593Smuzhiyun pstVoCtx.s32DevId,
614*4882a593Smuzhiyun pstVoCtx.s32LayerId,
615*4882a593Smuzhiyun pstVoCtx.s32ChnId,
616*4882a593Smuzhiyun s32Ret);
617*4882a593Smuzhiyun goto __DESTROY_AVS;
618*4882a593Smuzhiyun }
619*4882a593Smuzhiyun
620*4882a593Smuzhiyun /* bind avs -> vo */
621*4882a593Smuzhiyun s32Ret = TEST_SYS_AvsBindVo(0, 0, 0, 0);
622*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
623*4882a593Smuzhiyun RK_LOGE("bind failed: %x, avs [%d, %d] -> vo [%d, %d]",
624*4882a593Smuzhiyun s32Ret, 0, 0, 0, 0);
625*4882a593Smuzhiyun goto __DESTROY_VO;
626*4882a593Smuzhiyun }
627*4882a593Smuzhiyun RK_LOGV("bind success, avs [%d, %d] -> vo [%d, %d]",
628*4882a593Smuzhiyun 0 , 0, 0, 0);
629*4882a593Smuzhiyun
630*4882a593Smuzhiyun /* thread: do somethings */
631*4882a593Smuzhiyun signal(SIGINT, sigterm_handler);
632*4882a593Smuzhiyun if (pstAvsCtx->s32LoopCount > 0) {
633*4882a593Smuzhiyun while (!bExit && loopCount < pstAvsCtx->s32LoopCount) {
634*4882a593Smuzhiyun s32Ret = TEST_AVS_ModGetFrameFromPool(pstAvsCtx, pstPipeFrames);
635*4882a593Smuzhiyun
636*4882a593Smuzhiyun s32Ret = TEST_AVS_ModSendFrame(pstAvsCtx->s32GrpIndex, pstAvsCtx->s32PipeNum, pstPipeFrames);
637*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
638*4882a593Smuzhiyun TEST_AVS_ModReleaseFrameToPool(pstAvsCtx, pstPipeFrames);
639*4882a593Smuzhiyun continue;
640*4882a593Smuzhiyun }
641*4882a593Smuzhiyun
642*4882a593Smuzhiyun TEST_AVS_ModReleaseFrameToPool(pstAvsCtx, pstPipeFrames);
643*4882a593Smuzhiyun usleep(1000);
644*4882a593Smuzhiyun loopCount++;
645*4882a593Smuzhiyun }
646*4882a593Smuzhiyun }
647*4882a593Smuzhiyun
648*4882a593Smuzhiyun __UNBIND_AVS_VO:
649*4882a593Smuzhiyun /* unbind avs -> vo */
650*4882a593Smuzhiyun s32Ret = TEST_SYS_AvsUnbindVo(0, 0, 0, 0);
651*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
652*4882a593Smuzhiyun RK_LOGE("bind failed: %x, avs [%d, %d] -> vo [%d, %d]",
653*4882a593Smuzhiyun s32Ret, pstAvsCtx->s32GrpIndex, 0,
654*4882a593Smuzhiyun pstVoCtx.s32DevId, pstVoCtx.s32ChnId);
655*4882a593Smuzhiyun }
656*4882a593Smuzhiyun RK_LOGV("unbind success, avs [%d, %d] -> vo [%d, %d]",
657*4882a593Smuzhiyun pstAvsCtx->s32GrpIndex, 0,
658*4882a593Smuzhiyun pstVoCtx.s32DevId, pstVoCtx.s32ChnId);
659*4882a593Smuzhiyun
660*4882a593Smuzhiyun __DESTROY_VO:
661*4882a593Smuzhiyun /* destroy vo */
662*4882a593Smuzhiyun s32Ret = destroy_vo(&pstVoCtx);
663*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
664*4882a593Smuzhiyun RK_LOGE("vo [%d, %d, %d] destroy_vo failed: %#x",
665*4882a593Smuzhiyun pstVoCtx.s32DevId, pstVoCtx.s32LayerId,
666*4882a593Smuzhiyun pstVoCtx.s32ChnId, s32Ret);
667*4882a593Smuzhiyun }
668*4882a593Smuzhiyun RK_LOGV("vo [%d, %d, %d] destroy_vo already.",
669*4882a593Smuzhiyun pstVoCtx.s32DevId, pstVoCtx.s32LayerId,
670*4882a593Smuzhiyun pstVoCtx.s32ChnId);
671*4882a593Smuzhiyun
672*4882a593Smuzhiyun __DESTROY_AVS:
673*4882a593Smuzhiyun /* destroy avs */
674*4882a593Smuzhiyun s32Ret = TEST_AVS_ModDeInit(pstAvsCtx);
675*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
676*4882a593Smuzhiyun RK_LOGE("avs [%d] TEST_AVS_ModDeInit failed: %#x", pstAvsCtx->s32GrpIndex, s32Ret);
677*4882a593Smuzhiyun }
678*4882a593Smuzhiyun RK_LOGV("avs [%d] TEST_AVS_ModDeInit already.", pstAvsCtx->s32GrpIndex);
679*4882a593Smuzhiyun
680*4882a593Smuzhiyun __DESTROY_FRAME_POOL:
681*4882a593Smuzhiyun s32Ret = TEST_AVS_ModDestroyFramePool(pstAvsCtx);
682*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
683*4882a593Smuzhiyun RK_LOGE("avs [%d] TEST_AVS_ModDestroyFramePool failed: %#x",
684*4882a593Smuzhiyun pstAvsCtx->s32GrpIndex, s32Ret);
685*4882a593Smuzhiyun }
686*4882a593Smuzhiyun RK_LOGV("avs [%d] TEST_AVS_ModDestroyFramePool already.",
687*4882a593Smuzhiyun pstAvsCtx->s32GrpIndex);
688*4882a593Smuzhiyun
689*4882a593Smuzhiyun __FREE_PIPE_FRAME:
690*4882a593Smuzhiyun for (RK_S32 i = 0; i < AVS_PIPE_NUM; i++) {
691*4882a593Smuzhiyun RK_SAFE_FREE(pstPipeFrames[i]);
692*4882a593Smuzhiyun }
693*4882a593Smuzhiyun
694*4882a593Smuzhiyun RK_SAFE_FREE(pstPipeFrames);
695*4882a593Smuzhiyun
696*4882a593Smuzhiyun return s32Ret;
697*4882a593Smuzhiyun }
698*4882a593Smuzhiyun
699*4882a593Smuzhiyun static const char *const usages[] = {
700*4882a593Smuzhiyun "./rk_mpi_avs_test [--test_mode TEST_MODE] [-c COMPRESS_MODE] [-n LOOP_COUNT] [-p PIPE_NUM]",
701*4882a593Smuzhiyun RK_NULL,
702*4882a593Smuzhiyun };
703*4882a593Smuzhiyun
mpi_avs_test_show_options(const TEST_AVS_CTX_S * ctx)704*4882a593Smuzhiyun static void mpi_avs_test_show_options(const TEST_AVS_CTX_S *ctx) {
705*4882a593Smuzhiyun RK_PRINT("cmd parse result:\n");
706*4882a593Smuzhiyun RK_PRINT("input file path : %s\n", ctx->srcFilePath);
707*4882a593Smuzhiyun RK_PRINT("output file path : %s\n", ctx->dstFilePath);
708*4882a593Smuzhiyun RK_PRINT("test mode : %d\n", ctx->enTestMode);
709*4882a593Smuzhiyun RK_PRINT("group number : %d\n", ctx->s32GrpNum);
710*4882a593Smuzhiyun RK_PRINT("pipe number : %d\n", ctx->s32PipeNum);
711*4882a593Smuzhiyun RK_PRINT("channel number : %d\n", ctx->s32ChnNum);
712*4882a593Smuzhiyun RK_PRINT("loop count : %d\n", ctx->s32LoopCount);
713*4882a593Smuzhiyun RK_PRINT("input width : %d\n", ctx->u32SrcWidth);
714*4882a593Smuzhiyun RK_PRINT("input height : %d\n", ctx->u32SrcHeight);
715*4882a593Smuzhiyun RK_PRINT("input virtual width : %d\n", ctx->u32SrcVirWidth);
716*4882a593Smuzhiyun RK_PRINT("input virtual height : %d\n", ctx->u32SrcVirHeight);
717*4882a593Smuzhiyun RK_PRINT("input pixel format : %d\n", ctx->enSrcPixFormat);
718*4882a593Smuzhiyun RK_PRINT("input compress mode : %d\n", ctx->enSrcCompressMode);
719*4882a593Smuzhiyun RK_PRINT("output width : %d\n", ctx->u32DstWidth);
720*4882a593Smuzhiyun RK_PRINT("output height : %d\n", ctx->u32DstHeight);
721*4882a593Smuzhiyun RK_PRINT("output pixel format : %d\n", ctx->enDstPixFormat);
722*4882a593Smuzhiyun RK_PRINT("output compress mode : %d\n", ctx->enDstCompressMode);
723*4882a593Smuzhiyun RK_PRINT("work mode : %d\n", ctx->enAvsWorkMode);
724*4882a593Smuzhiyun RK_PRINT("projection mode : %d\n", ctx->enAvsProjMode);
725*4882a593Smuzhiyun RK_PRINT("params sources : %d\n", ctx->enParamSource);
726*4882a593Smuzhiyun RK_PRINT("lut file path : %s\n", ctx->lutFilePath);
727*4882a593Smuzhiyun RK_PRINT("lut accuracy : %d\n", ctx->enLutAccuracy);
728*4882a593Smuzhiyun RK_PRINT("lut fuse width : %d\n", ctx->enLutFuseWidth);
729*4882a593Smuzhiyun RK_PRINT("lut step x : %d\n", ctx->stLutStep.enStepX);
730*4882a593Smuzhiyun RK_PRINT("lut step y : %d\n", ctx->stLutStep.enStepY);
731*4882a593Smuzhiyun RK_PRINT("calib file name : %s\n", ctx->calibFileName);
732*4882a593Smuzhiyun RK_PRINT("mesh file path : %s\n", ctx->meshFilePath);
733*4882a593Smuzhiyun RK_PRINT("avs frame sync : %d\n", ctx->bFrameSync);
734*4882a593Smuzhiyun RK_PRINT("center x : %d\n", ctx->stCenter.s32X);
735*4882a593Smuzhiyun RK_PRINT("center x : %d\n", ctx->stCenter.s32Y);
736*4882a593Smuzhiyun RK_PRINT("fov x : %d\n", ctx->stFov.u32FOVX);
737*4882a593Smuzhiyun RK_PRINT("fov y : %d\n", ctx->stFov.u32FOVY);
738*4882a593Smuzhiyun RK_PRINT("rotation ori yaw : %d\n", ctx->stOriRotation.s32Yaw);
739*4882a593Smuzhiyun RK_PRINT("rotation ori pitch : %d\n", ctx->stOriRotation.s32Pitch);
740*4882a593Smuzhiyun RK_PRINT("rotation ori roll : %d\n", ctx->stOriRotation.s32Roll);
741*4882a593Smuzhiyun RK_PRINT("rotation yaw : %d\n", ctx->stRotation.s32Yaw);
742*4882a593Smuzhiyun RK_PRINT("rotation pitch : %d\n", ctx->stRotation.s32Pitch);
743*4882a593Smuzhiyun RK_PRINT("rotation roll : %d\n", ctx->stRotation.s32Roll);
744*4882a593Smuzhiyun RK_PRINT("distance : %3.2f\n", ctx->fDistance);
745*4882a593Smuzhiyun RK_PRINT("enable comm mb pool : %d\n", ctx->bCommPool);
746*4882a593Smuzhiyun }
747*4882a593Smuzhiyun
main(int argc,const char ** argv)748*4882a593Smuzhiyun RK_S32 main(int argc, const char **argv) {
749*4882a593Smuzhiyun RK_S32 s32Ret = RK_FAILURE;
750*4882a593Smuzhiyun TEST_AVS_CTX_S ctx;
751*4882a593Smuzhiyun
752*4882a593Smuzhiyun memset(&ctx, 0, sizeof(TEST_AVS_CTX_S));
753*4882a593Smuzhiyun
754*4882a593Smuzhiyun ctx.dstFilePath = RK_NULL;
755*4882a593Smuzhiyun
756*4882a593Smuzhiyun ctx.s32LoopCount = 1;
757*4882a593Smuzhiyun ctx.enTestMode = TEST_MODE_AVS_ONLY;
758*4882a593Smuzhiyun ctx.enParamSource = AVS_PARAM_SOURCE_CALIB;
759*4882a593Smuzhiyun ctx.bFrameSync = RK_FALSE;
760*4882a593Smuzhiyun ctx.enAvsWorkMode = AVS_MODE_BLEND;
761*4882a593Smuzhiyun ctx.s32GrpNum = 1;
762*4882a593Smuzhiyun ctx.s32ChnNum = 1;
763*4882a593Smuzhiyun ctx.s32PipeNum = 6;
764*4882a593Smuzhiyun ctx.s32GrpIndex = 0;
765*4882a593Smuzhiyun ctx.u32ChnDepth = 1;
766*4882a593Smuzhiyun ctx.u32FrameBufCnt = 3;
767*4882a593Smuzhiyun ctx.s32SrcChnRate = -1;
768*4882a593Smuzhiyun ctx.s32DstChnRate = -1;
769*4882a593Smuzhiyun ctx.s32SrcGrpRate = -1;
770*4882a593Smuzhiyun ctx.s32DstGrpRate = -1;
771*4882a593Smuzhiyun ctx.fDistance = 1.0;
772*4882a593Smuzhiyun
773*4882a593Smuzhiyun RK_LOGE("avs test running enter!");
774*4882a593Smuzhiyun
775*4882a593Smuzhiyun struct argparse_option options[] = {
776*4882a593Smuzhiyun OPT_HELP(),
777*4882a593Smuzhiyun OPT_GROUP("basic options:"),
778*4882a593Smuzhiyun OPT_STRING('i', "input", &(ctx.srcFilePath),
779*4882a593Smuzhiyun "input file name. e.g.(/userdata/6x_equirectangular/input_image/). default(NULL).", NULL, 0, 0),
780*4882a593Smuzhiyun OPT_STRING('o', "output", &(ctx.dstFilePath),
781*4882a593Smuzhiyun "output file path. e.g.(/userdata/res/). default(NULL).", NULL, 0, 0),
782*4882a593Smuzhiyun OPT_INTEGER('\0', "test_mode", &(ctx.enTestMode),
783*4882a593Smuzhiyun "test mode. default(0. 0: avs single mod test, 1: multi mods bind test).", NULL, 0, 0),
784*4882a593Smuzhiyun OPT_INTEGER('n', "loop count", &(ctx.s32LoopCount),
785*4882a593Smuzhiyun "loop running count. default(1).", NULL, 0, 0),
786*4882a593Smuzhiyun OPT_INTEGER('g', "group_count", &(ctx.s32GrpNum),
787*4882a593Smuzhiyun "the count of avs group. default(1).", NULL, 0, 0),
788*4882a593Smuzhiyun OPT_INTEGER('p', "pipe_count", &(ctx.s32PipeNum),
789*4882a593Smuzhiyun "the count of avs pipe. default(6).", NULL, 0, 0),
790*4882a593Smuzhiyun OPT_INTEGER('c', "channel_count", &(ctx.s32ChnNum),
791*4882a593Smuzhiyun "the count of avs channel. default(1).", NULL, 0, 0),
792*4882a593Smuzhiyun OPT_INTEGER('w', "src_width", &(ctx.u32SrcWidth),
793*4882a593Smuzhiyun "src width. e.g.(2560). <required>.", NULL, 0, 0),
794*4882a593Smuzhiyun OPT_INTEGER('h', "src_height", &(ctx.u32SrcHeight),
795*4882a593Smuzhiyun "src height. e.g.(1520). <required>.", NULL, 0, 0),
796*4882a593Smuzhiyun OPT_INTEGER('\0', "src_vir_width", &(ctx.u32SrcVirWidth),
797*4882a593Smuzhiyun "src virtual width. e.g.(2560). default(0).", NULL, 0, 0),
798*4882a593Smuzhiyun OPT_INTEGER('\0', "src_vir_height", &(ctx.u32SrcVirHeight),
799*4882a593Smuzhiyun "src virtual height. e.g.(1520). default(0).", NULL, 0, 0),
800*4882a593Smuzhiyun OPT_INTEGER('f', "src_format", &(ctx.enSrcPixFormat),
801*4882a593Smuzhiyun "src pixel format. default(only 0. 0 is NV12).", NULL, 0, 0),
802*4882a593Smuzhiyun OPT_INTEGER('m', "src_compress", &(ctx.enSrcCompressMode),
803*4882a593Smuzhiyun "src compress mode. default(0. 0: NONE, 1: AFBC).", NULL, 0, 0),
804*4882a593Smuzhiyun OPT_INTEGER('W', "dst_width", &(ctx.u32DstWidth),
805*4882a593Smuzhiyun "dst width. e.g.(8192). <required>.", NULL, 0, 0),
806*4882a593Smuzhiyun OPT_INTEGER('H', "dst_height", &(ctx.u32DstHeight),
807*4882a593Smuzhiyun "dst height. e.g.(3840). <required>.", NULL, 0, 0),
808*4882a593Smuzhiyun OPT_INTEGER('M', "dst_compress", &(ctx.enDstCompressMode),
809*4882a593Smuzhiyun "dst compress mode. default(0. 0: NONE, 1: AFBC).", NULL, 0, 0),
810*4882a593Smuzhiyun OPT_INTEGER('F', "dst_format", &(ctx.enDstPixFormat),
811*4882a593Smuzhiyun "dst pixel format. default(only 0. 0 is NV12).", NULL, 0, 0),
812*4882a593Smuzhiyun OPT_INTEGER('\0', "work_mode", &(ctx.enAvsWorkMode),
813*4882a593Smuzhiyun "work mode. default(0. 0: BLEND, 1: NOBLEND_VER, 2: NOBLEND_HOR, 3: NOBLEND_QR).",
814*4882a593Smuzhiyun NULL, 0, 0),
815*4882a593Smuzhiyun OPT_INTEGER('\0', "proj_mode", &(ctx.enAvsProjMode),
816*4882a593Smuzhiyun "projection mode. default(0. 0: EQUIRECTANGULAR, 1: RECTILINEAR, 2: CYLINDRICAL,"
817*4882a593Smuzhiyun "3: CUBE_MAP, 4: EQUIRECTANGULAR_TRANS).",
818*4882a593Smuzhiyun NULL, 0, 0),
819*4882a593Smuzhiyun OPT_INTEGER('\0', "frame_sync", &(ctx.bFrameSync),
820*4882a593Smuzhiyun "whether enable avs frame sync. default(0. 0: Disable, 1: Enable).", NULL, 0, 0),
821*4882a593Smuzhiyun OPT_INTEGER('\0', "param_source", &(ctx.enParamSource),
822*4882a593Smuzhiyun "params required for stitch are obtained by lut or calib. default(1. 0: Lut, 1: Calib).",
823*4882a593Smuzhiyun NULL, 0, 0),
824*4882a593Smuzhiyun OPT_STRING('\0', "lut_file_path", &(ctx.lutFilePath),
825*4882a593Smuzhiyun "lut file path. e.g.(/userdata/6x_equirectangular/middle_lut/). default(NULL).", NULL, 0, 0),
826*4882a593Smuzhiyun OPT_INTEGER('\0', "lut_accuracy", &(ctx.enLutAccuracy),
827*4882a593Smuzhiyun "lut accuracy. default(0, 0: HIGH, 1: LOW).", NULL, 0, 0),
828*4882a593Smuzhiyun OPT_INTEGER('\0', "lut_use_width", &(ctx.enLutFuseWidth),
829*4882a593Smuzhiyun "lut fuse width. default(0, 0: 128 pixel, 1: 256 pixel, 2: 512 pixel).", NULL, 0, 0),
830*4882a593Smuzhiyun OPT_INTEGER('\0', "lut_step_x", &(ctx.stLutStep.enStepX),
831*4882a593Smuzhiyun "lut step in the x-axis direction. default(0, 0: 16 pixel, 1: 32 pixel, 2: 64 pixel).", NULL, 0, 0),
832*4882a593Smuzhiyun OPT_INTEGER('\0', "lut_step_y", &(ctx.stLutStep.enStepY),
833*4882a593Smuzhiyun "lut step in the y-axis direction. default(0, 0: 16 pixel, 1: 32 pixel, 2: 64 pixel).", NULL, 0, 0),
834*4882a593Smuzhiyun OPT_STRING('\0', "calib_file_name", &(ctx.calibFileName),
835*4882a593Smuzhiyun "calib file name. e.g.(/userdata/avs/6x_equirectangular/avs_calib/calib_file.pto). default(NULL).",
836*4882a593Smuzhiyun NULL, 0, 0),
837*4882a593Smuzhiyun OPT_STRING('\0', "mesh_file_path", &(ctx.meshFilePath),
838*4882a593Smuzhiyun "mesh file path. e.g.(/userdata/avs/6x_equirectangular/avs_mesh/). default(NULL).", NULL, 0, 0),
839*4882a593Smuzhiyun OPT_INTEGER('\0', "center_x", &(ctx.stCenter.s32X),
840*4882a593Smuzhiyun "center point in the x-axis direction. default(0).", NULL, 0, 0),
841*4882a593Smuzhiyun OPT_INTEGER('\0', "center_y", &(ctx.stCenter.s32Y),
842*4882a593Smuzhiyun "center point in the y-axis direction. default(0).", NULL, 0, 0),
843*4882a593Smuzhiyun OPT_INTEGER('\0', "fov_x", &(ctx.stFov.u32FOVX),
844*4882a593Smuzhiyun "fov size in the x-axis direction. default(0).", NULL, 0, 0),
845*4882a593Smuzhiyun OPT_INTEGER('\0', "fov_y", &(ctx.stFov.u32FOVY),
846*4882a593Smuzhiyun "fov size in the y-axis direction. default(0).", NULL, 0, 0),
847*4882a593Smuzhiyun OPT_INTEGER('\0', "ori_yaw", &(ctx.stOriRotation.s32Yaw),
848*4882a593Smuzhiyun "ori rotation in the yaw direction. default(0).", NULL, 0, 0),
849*4882a593Smuzhiyun OPT_INTEGER('\0', "ori_pitch", &(ctx.stOriRotation.s32Pitch),
850*4882a593Smuzhiyun "ori rotation in the pitch direction. default(0).", NULL, 0, 0),
851*4882a593Smuzhiyun OPT_INTEGER('\0', "ori_roll", &(ctx.stOriRotation.s32Roll),
852*4882a593Smuzhiyun "ori rotation in the roll direction. default(0).", NULL, 0, 0),
853*4882a593Smuzhiyun OPT_INTEGER('\0', "yaw", &(ctx.stRotation.s32Yaw),
854*4882a593Smuzhiyun "rotation in the yaw direction. default(0).", NULL, 0, 0),
855*4882a593Smuzhiyun OPT_INTEGER('\0', "pitch", &(ctx.stRotation.s32Pitch),
856*4882a593Smuzhiyun "rotation in the pitch direction. default(0).", NULL, 0, 0),
857*4882a593Smuzhiyun OPT_INTEGER('\0', "distance", &(ctx.fDistance),
858*4882a593Smuzhiyun "optimal stitch distance. default(1.0).", NULL, 0, 0),
859*4882a593Smuzhiyun OPT_INTEGER('\0', "src_grp_rate", &(ctx.s32SrcGrpRate),
860*4882a593Smuzhiyun "src avs group frame rate, default(-1).", NULL, 0, 0),
861*4882a593Smuzhiyun OPT_INTEGER('\0', "dst_grp_rate", &(ctx.s32DstGrpRate),
862*4882a593Smuzhiyun "dst avs group frame rate, default(-1).", NULL, 0, 0),
863*4882a593Smuzhiyun OPT_INTEGER('d', "chn_depth", &(ctx.u32ChnDepth),
864*4882a593Smuzhiyun "channel output depth, default(3)", NULL, 0, 0),
865*4882a593Smuzhiyun OPT_INTEGER('b', "chn_buf_cnt", &(ctx.u32FrameBufCnt),
866*4882a593Smuzhiyun "channel output buf cnt, default(3)", NULL, 0, 0),
867*4882a593Smuzhiyun OPT_INTEGER('\0', "roll", &(ctx.stRotation.s32Roll),
868*4882a593Smuzhiyun "rotation in the roll direction. default(0).", NULL, 0, 0),
869*4882a593Smuzhiyun OPT_INTEGER('\0', "src_chn_rate", &(ctx.s32SrcChnRate),
870*4882a593Smuzhiyun "src avs channel frame rate, default(-1).", NULL, 0, 0),
871*4882a593Smuzhiyun OPT_INTEGER('\0', "dst_chn_rate", &(ctx.s32DstChnRate),
872*4882a593Smuzhiyun "dst avs channel frame rate, default(-1).", NULL, 0, 0),
873*4882a593Smuzhiyun OPT_BOOLEAN('\0', "comm_mb_pool", &(ctx.bCommPool),
874*4882a593Smuzhiyun "whether enable common mb pool, default(0, 0: Disable, 1: Enable).", NULL, 0, 0),
875*4882a593Smuzhiyun OPT_GROUP("external options:"),
876*4882a593Smuzhiyun OPT_BOOLEAN('\0', "get_final_lut", &(ctx.bGetFinalLut),
877*4882a593Smuzhiyun "whether get final lut, default(0, 0: Disable, 1: Enable).", NULL, 0, 0),
878*4882a593Smuzhiyun OPT_END(),
879*4882a593Smuzhiyun };
880*4882a593Smuzhiyun
881*4882a593Smuzhiyun struct argparse argparse;
882*4882a593Smuzhiyun argparse_init(&argparse, options, usages, 0);
883*4882a593Smuzhiyun argparse_describe(&argparse, "\nselect a test case to run.",
884*4882a593Smuzhiyun "\nuse --help for details.");
885*4882a593Smuzhiyun
886*4882a593Smuzhiyun argc = argparse_parse(&argparse, argc, argv);
887*4882a593Smuzhiyun mpi_avs_test_show_options(&ctx);
888*4882a593Smuzhiyun
889*4882a593Smuzhiyun if (ctx.u32SrcWidth <= 0
890*4882a593Smuzhiyun || ctx.u32SrcHeight <= 0
891*4882a593Smuzhiyun || ctx.u32DstWidth <= 0
892*4882a593Smuzhiyun || ctx.u32DstHeight <= 0) {
893*4882a593Smuzhiyun argparse_usage(&argparse);
894*4882a593Smuzhiyun return RK_FAILURE;
895*4882a593Smuzhiyun }
896*4882a593Smuzhiyun
897*4882a593Smuzhiyun s32Ret = RK_MPI_SYS_Init();
898*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
899*4882a593Smuzhiyun return s32Ret;
900*4882a593Smuzhiyun }
901*4882a593Smuzhiyun
902*4882a593Smuzhiyun switch (ctx.enTestMode) {
903*4882a593Smuzhiyun case TEST_MODE_AVS_ONLY: {
904*4882a593Smuzhiyun s32Ret = test_single_avs_loop(&ctx);
905*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
906*4882a593Smuzhiyun goto __FAILED;
907*4882a593Smuzhiyun }
908*4882a593Smuzhiyun } break;
909*4882a593Smuzhiyun case TEST_MODE_AVS_VO: {
910*4882a593Smuzhiyun s32Ret = test_avs_vo_loop(&ctx);
911*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
912*4882a593Smuzhiyun goto __FAILED;
913*4882a593Smuzhiyun }
914*4882a593Smuzhiyun } break;
915*4882a593Smuzhiyun case TEST_MODE_AVS_VPSS_VENC: {
916*4882a593Smuzhiyun s32Ret = test_avs_vpss_venc_loop(&ctx);
917*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
918*4882a593Smuzhiyun goto __FAILED;
919*4882a593Smuzhiyun }
920*4882a593Smuzhiyun } break;
921*4882a593Smuzhiyun default:
922*4882a593Smuzhiyun RK_LOGE("unsupport test mode: %d", ctx.enTestMode);
923*4882a593Smuzhiyun break;
924*4882a593Smuzhiyun }
925*4882a593Smuzhiyun
926*4882a593Smuzhiyun s32Ret = RK_MPI_SYS_Exit();
927*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
928*4882a593Smuzhiyun return s32Ret;
929*4882a593Smuzhiyun }
930*4882a593Smuzhiyun RK_LOGV("test running ok.");
931*4882a593Smuzhiyun
932*4882a593Smuzhiyun return RK_SUCCESS;
933*4882a593Smuzhiyun
934*4882a593Smuzhiyun __FAILED:
935*4882a593Smuzhiyun RK_LOGE("test running exit: %x", s32Ret);
936*4882a593Smuzhiyun RK_MPI_SYS_Exit();
937*4882a593Smuzhiyun
938*4882a593Smuzhiyun return s32Ret;
939*4882a593Smuzhiyun }
940