xref: /OK3568_Linux_fs/external/rockit/mpi/example/mod/test_mpi_avs.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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