xref: /OK3568_Linux_fs/external/rockit/mpi/example/mod/test_mpi_vo.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 with the License.
6*4882a593Smuzhiyun  * You may obtain a copy of the License at
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *      http://www.apache.org/licenses/LICENSE-2.0
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
11*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
12*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
14*4882a593Smuzhiyun  * limitations under the License.
15*4882a593Smuzhiyun  *
16*4882a593Smuzhiyun  */
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #include <fcntl.h>
19*4882a593Smuzhiyun #include <unistd.h>
20*4882a593Smuzhiyun #include <string.h>
21*4882a593Smuzhiyun #include <stdlib.h>
22*4882a593Smuzhiyun #include <sys/prctl.h>
23*4882a593Smuzhiyun #include <pthread.h>
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #include "rk_debug.h"
26*4882a593Smuzhiyun #include "rk_mpi_sys.h"
27*4882a593Smuzhiyun #include "rk_mpi_vo.h"
28*4882a593Smuzhiyun #include "rk_mpi_vdec.h"
29*4882a593Smuzhiyun #include "rk_mpi_mb.h"
30*4882a593Smuzhiyun #include "rk_common.h"
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #include "test_comm_argparse.h"
33*4882a593Smuzhiyun #include "test_comm_utils.h"
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun #define MAX_FRAME_QUEUE              8
36*4882a593Smuzhiyun #define MAX_TIME_OUT_MS              20
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun #ifndef VDEC_INT64_MIN
39*4882a593Smuzhiyun #define VDEC_INT64_MIN               (-0x7fffffffffffffffLL-1)
40*4882a593Smuzhiyun #endif
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #ifndef VDEC_INT64_MAX
43*4882a593Smuzhiyun #define VDEC_INT64_MAX               INT64_C(9223372036854775807)
44*4882a593Smuzhiyun #endif
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun #ifndef rk_safe_free
47*4882a593Smuzhiyun #define rk_safe_free(p)              { if (p) {free(p); (p)=RK_NULL;} }
48*4882a593Smuzhiyun #endif
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun #ifndef rk_safe_delete
51*4882a593Smuzhiyun #define rk_safe_delete(p)            { if (p) {delete(p); (p)=RK_NULL;} }
52*4882a593Smuzhiyun #endif
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun #define VDEC_ARRAY_ELEMS(a)          (sizeof(a) / sizeof((a)[0]))
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun typedef struct rkVO_Timing_S {
57*4882a593Smuzhiyun     RK_S32  enIntfSync;
58*4882a593Smuzhiyun     RK_U32  u32Width;
59*4882a593Smuzhiyun     RK_U32  u32Height;
60*4882a593Smuzhiyun } VO_Timing_S;
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun typedef struct _rkWbcCfg {
63*4882a593Smuzhiyun     VO_WBC_SOURCE_S stWbcSource;
64*4882a593Smuzhiyun     VO_WBC_ATTR_S stWbcAttr;
65*4882a593Smuzhiyun     RK_S32 s32ChnId;
66*4882a593Smuzhiyun     RK_S32 s32VdecChnId;
67*4882a593Smuzhiyun } WBC_CFG;
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun typedef struct _rkVdecCfg {
70*4882a593Smuzhiyun     RK_U32 u32FrameBufferCnt;
71*4882a593Smuzhiyun     COMPRESS_MODE_E enCompressMode;
72*4882a593Smuzhiyun } VDEC_CFG;
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun typedef struct _rkVOCfg {
75*4882a593Smuzhiyun     RK_U32 u32Screen0VoLayer;
76*4882a593Smuzhiyun     RK_U32 u32Screen1VoLayer;
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun     RK_U32 u32Screen0Rows;
79*4882a593Smuzhiyun     RK_U32 u32Screen1Rows;
80*4882a593Smuzhiyun     RK_BOOL bDoubleScreen;
81*4882a593Smuzhiyun } VO_CFG;
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun typedef struct _rkParserCfg {
84*4882a593Smuzhiyun     char *srcFileUri[VDEC_MAX_CHN_NUM];
85*4882a593Smuzhiyun     RK_CODEC_ID_E enCodecId;
86*4882a593Smuzhiyun     RK_U32 u32SrcWidth;
87*4882a593Smuzhiyun     RK_U32 u32SrcHeight;
88*4882a593Smuzhiyun     RK_U32 u32StreamIndex;
89*4882a593Smuzhiyun     void  *pExtraData;
90*4882a593Smuzhiyun     RK_U32 u32ExtraDataSize;
91*4882a593Smuzhiyun } PARSER_CFG;
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun typedef struct _rkBorderCfg {
94*4882a593Smuzhiyun     RK_U32 u32LeftWidth;
95*4882a593Smuzhiyun     RK_U32 u32RightWidth;
96*4882a593Smuzhiyun     RK_U32 u32TopWidth;
97*4882a593Smuzhiyun     RK_U32 u32BottomWidth;
98*4882a593Smuzhiyun } Border_CFG;
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun #define RK356X_VOP_LAYER_CLUSTER_0      0
101*4882a593Smuzhiyun #define RK356X_VOP_LAYER_CLUSTER_1      2
102*4882a593Smuzhiyun #define RK356X_VOP_LAYER_ESMART_0       4
103*4882a593Smuzhiyun #define RK356X_VOP_LAYER_ESMART_1       5
104*4882a593Smuzhiyun #define RK356X_VOP_LAYER_SMART_0        6
105*4882a593Smuzhiyun #define RK356X_VOP_LAYER_SMART_1        7
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun #define RK356X_VO_DEV_HD0               0
108*4882a593Smuzhiyun #define RK356X_VO_DEV_HD1               1
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun #define DISPLAY_TYPE_HDMI               0
111*4882a593Smuzhiyun #define DISPLAY_TYPE_EDP                1
112*4882a593Smuzhiyun #define DISPLAY_TYPE_VGA                2
113*4882a593Smuzhiyun #define DISPLAY_TYPE_DP                 3
114*4882a593Smuzhiyun #define DISPLAY_TYPE_HDMI_EDP           4
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun typedef struct _PixelFormatMap {
117*4882a593Smuzhiyun     RK_U32 index;
118*4882a593Smuzhiyun     PIXEL_FORMAT_E format;
119*4882a593Smuzhiyun } PixelFormatMap;
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun const static PixelFormatMap testPixelFormat[] = {
122*4882a593Smuzhiyun     // usual yuv/rga formats
123*4882a593Smuzhiyun     {1,              RK_FMT_YUV420SP},
124*4882a593Smuzhiyun     {2,              RK_FMT_YUV420SP_VU},
125*4882a593Smuzhiyun     {3,              RK_FMT_RGB565},
126*4882a593Smuzhiyun     {4,              RK_FMT_BGR565},
127*4882a593Smuzhiyun     {5,              RK_FMT_RGB888},
128*4882a593Smuzhiyun     {6,              RK_FMT_BGR888},
129*4882a593Smuzhiyun     {7,              RK_FMT_BGRA8888},
130*4882a593Smuzhiyun     {8,              RK_FMT_RGBA8888},
131*4882a593Smuzhiyun     {9,              RK_FMT_RGBA5551},
132*4882a593Smuzhiyun     {10,             RK_FMT_BGRA5551}
133*4882a593Smuzhiyun };
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun #define MAX_VO_FORMAT_RGB_NUM        17
136*4882a593Smuzhiyun #define WBC_FORMAT_BGRA8888          0
137*4882a593Smuzhiyun #define WBC_FORMAT_RGBA8888          1
138*4882a593Smuzhiyun #define WBC_FORMAT_RGB888            2
139*4882a593Smuzhiyun #define WBC_FORMAT_BGR888            3
140*4882a593Smuzhiyun #define WBC_FORMAT_YUV420SP          4
141*4882a593Smuzhiyun #define WBC_FORMAT_YUV420SP_VU       5
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun #define VO_CHANNEL_PLAY_NORMAL           0
144*4882a593Smuzhiyun #define VO_CHANNEL_PLAY_PAUSE            1
145*4882a593Smuzhiyun #define VO_CHANNEL_PLAY_STEP             2
146*4882a593Smuzhiyun #define VO_CHANNEL_PLAY_SPEED            3
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun #define WBC_SOURCE_DEV                0
149*4882a593Smuzhiyun #define WBC_SOURCE_VIDEO              1
150*4882a593Smuzhiyun #define WBC_SOURCE_GRAPHIC            2
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun #define MAX_WINDOWS_NUM               64
153*4882a593Smuzhiyun #define MAX_STEP_FRAME_NUM            50
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun #define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0])
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun typedef struct _TEST_MODE {
158*4882a593Smuzhiyun     RK_U32 mode;
159*4882a593Smuzhiyun     VO_INTF_SYNC_E enIntfSync;
160*4882a593Smuzhiyun } TEST_MODE_S;
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun static VO_DEV VoLayer = RK356X_VOP_LAYER_CLUSTER_0;
163*4882a593Smuzhiyun static VO_DEV VoLayer_second = RK356X_VOP_LAYER_CLUSTER_1;
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun TEST_MODE_S test_mode_table[] = {
166*4882a593Smuzhiyun     {0,     VO_OUTPUT_640x480_60},
167*4882a593Smuzhiyun     {1,     VO_OUTPUT_PAL},
168*4882a593Smuzhiyun     {2,     VO_OUTPUT_576P50},
169*4882a593Smuzhiyun     {3,     VO_OUTPUT_NTSC},
170*4882a593Smuzhiyun     {4,     VO_OUTPUT_480P60},
171*4882a593Smuzhiyun     {5,     VO_OUTPUT_800x600_60},
172*4882a593Smuzhiyun     {6,     VO_OUTPUT_1024x768_60},
173*4882a593Smuzhiyun     {7,     VO_OUTPUT_720P50},
174*4882a593Smuzhiyun     {8,     VO_OUTPUT_720P60},
175*4882a593Smuzhiyun     {9,     VO_OUTPUT_1280x1024_60},
176*4882a593Smuzhiyun     {10,    VO_OUTPUT_1080P24},
177*4882a593Smuzhiyun     {11,    VO_OUTPUT_1080P25},
178*4882a593Smuzhiyun     {12,    VO_OUTPUT_1080P30},
179*4882a593Smuzhiyun     {13,    VO_OUTPUT_1080I50},
180*4882a593Smuzhiyun     {14,    VO_OUTPUT_1080I60},
181*4882a593Smuzhiyun     {15,    VO_OUTPUT_1080P50},
182*4882a593Smuzhiyun     {16,    VO_OUTPUT_1080P60},
183*4882a593Smuzhiyun     {17,    VO_OUTPUT_3840x2160_24},
184*4882a593Smuzhiyun     {18,    VO_OUTPUT_3840x2160_25},
185*4882a593Smuzhiyun     {19,    VO_OUTPUT_3840x2160_30},
186*4882a593Smuzhiyun     {20,    VO_OUTPUT_3840x2160_50},
187*4882a593Smuzhiyun     {21,    VO_OUTPUT_3840x2160_60},
188*4882a593Smuzhiyun     {22,    VO_OUTPUT_4096x2160_24},
189*4882a593Smuzhiyun     {23,    VO_OUTPUT_4096x2160_25},
190*4882a593Smuzhiyun     {24,    VO_OUTPUT_4096x2160_30},
191*4882a593Smuzhiyun     {25,    VO_OUTPUT_4096x2160_50},
192*4882a593Smuzhiyun     {26,    VO_OUTPUT_4096x2160_60},
193*4882a593Smuzhiyun };
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun static VO_Timing_S stVoTimings[] = {
196*4882a593Smuzhiyun     {VO_OUTPUT_640x480_60, 640, 480},
197*4882a593Smuzhiyun     {VO_OUTPUT_800x600_60, 800, 600},
198*4882a593Smuzhiyun     {VO_OUTPUT_1024x768_60, 1024, 768},
199*4882a593Smuzhiyun     {VO_OUTPUT_1280x1024_60, 1280, 1024},
200*4882a593Smuzhiyun     {VO_OUTPUT_1366x768_60, 1366, 768},
201*4882a593Smuzhiyun     {VO_OUTPUT_1440x900_60, 1440, 900},
202*4882a593Smuzhiyun     {VO_OUTPUT_1280x800_60, 1280, 800},
203*4882a593Smuzhiyun     {VO_OUTPUT_1600x1200_60, 1600, 1200},
204*4882a593Smuzhiyun     {VO_OUTPUT_1680x1050_60, 1680, 1050},
205*4882a593Smuzhiyun     {VO_OUTPUT_1920x1200_60, 1920, 1200},
206*4882a593Smuzhiyun };
207*4882a593Smuzhiyun static void Sample_VO_GetDisplaySize(RK_S32 enIntfSync, RK_U32 *s32W, RK_U32 *s32H) {
208*4882a593Smuzhiyun     switch (enIntfSync) {
209*4882a593Smuzhiyun         case VO_OUTPUT_640x480_60:
210*4882a593Smuzhiyun             *s32W = 640;
211*4882a593Smuzhiyun             *s32H = 480;
212*4882a593Smuzhiyun             break;
213*4882a593Smuzhiyun         case VO_OUTPUT_PAL:
214*4882a593Smuzhiyun         case VO_OUTPUT_576P50:
215*4882a593Smuzhiyun             *s32W = 720;
216*4882a593Smuzhiyun             *s32H = 576;
217*4882a593Smuzhiyun             break;
218*4882a593Smuzhiyun         case VO_OUTPUT_NTSC:
219*4882a593Smuzhiyun         case VO_OUTPUT_480P60:
220*4882a593Smuzhiyun             *s32W = 720;
221*4882a593Smuzhiyun             *s32H = 480;
222*4882a593Smuzhiyun             break;
223*4882a593Smuzhiyun         case VO_OUTPUT_800x600_60:
224*4882a593Smuzhiyun             *s32W = 800;
225*4882a593Smuzhiyun             *s32H = 600;
226*4882a593Smuzhiyun             break;
227*4882a593Smuzhiyun         case VO_OUTPUT_1024x768_60:
228*4882a593Smuzhiyun             *s32W = 1024;
229*4882a593Smuzhiyun             *s32H = 768;
230*4882a593Smuzhiyun             break;
231*4882a593Smuzhiyun         case VO_OUTPUT_720P50:
232*4882a593Smuzhiyun         case VO_OUTPUT_720P60:
233*4882a593Smuzhiyun             *s32W = 1280;
234*4882a593Smuzhiyun             *s32H = 720;
235*4882a593Smuzhiyun             break;
236*4882a593Smuzhiyun         case VO_OUTPUT_1280x1024_60:
237*4882a593Smuzhiyun             *s32W = 1280;
238*4882a593Smuzhiyun             *s32H = 1024;
239*4882a593Smuzhiyun             break;
240*4882a593Smuzhiyun         case VO_OUTPUT_1080P24:
241*4882a593Smuzhiyun         case VO_OUTPUT_1080P25:
242*4882a593Smuzhiyun         case VO_OUTPUT_1080P30:
243*4882a593Smuzhiyun         case VO_OUTPUT_1080I50:
244*4882a593Smuzhiyun         case VO_OUTPUT_1080I60:
245*4882a593Smuzhiyun         case VO_OUTPUT_1080P50:
246*4882a593Smuzhiyun         case VO_OUTPUT_1080P60:
247*4882a593Smuzhiyun             *s32W = 1920;
248*4882a593Smuzhiyun             *s32H = 1080;
249*4882a593Smuzhiyun             break;
250*4882a593Smuzhiyun         case VO_OUTPUT_3840x2160_24:
251*4882a593Smuzhiyun         case VO_OUTPUT_3840x2160_25:
252*4882a593Smuzhiyun         case VO_OUTPUT_3840x2160_30:
253*4882a593Smuzhiyun         case VO_OUTPUT_3840x2160_50:
254*4882a593Smuzhiyun         case VO_OUTPUT_3840x2160_60:
255*4882a593Smuzhiyun             *s32W = 3840;
256*4882a593Smuzhiyun             *s32H = 2160;
257*4882a593Smuzhiyun             break;
258*4882a593Smuzhiyun         case VO_OUTPUT_4096x2160_24:
259*4882a593Smuzhiyun         case VO_OUTPUT_4096x2160_25:
260*4882a593Smuzhiyun         case VO_OUTPUT_4096x2160_30:
261*4882a593Smuzhiyun         case VO_OUTPUT_4096x2160_50:
262*4882a593Smuzhiyun         case VO_OUTPUT_4096x2160_60:
263*4882a593Smuzhiyun             *s32W = 4096;
264*4882a593Smuzhiyun             *s32H = 2160;
265*4882a593Smuzhiyun             break;
266*4882a593Smuzhiyun         default:
267*4882a593Smuzhiyun             for (RK_S32 i = 0; i < ARRAY_LENGTH(stVoTimings); i++) {
268*4882a593Smuzhiyun                 if (stVoTimings[i].enIntfSync == enIntfSync) {
269*4882a593Smuzhiyun                     *s32W = stVoTimings[i].u32Width;
270*4882a593Smuzhiyun                     *s32H = stVoTimings[i].u32Height;
271*4882a593Smuzhiyun                     break;
272*4882a593Smuzhiyun                 }
273*4882a593Smuzhiyun             }
274*4882a593Smuzhiyun             break;
275*4882a593Smuzhiyun     }
276*4882a593Smuzhiyun }
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun #define Sample_Print(format, ...)       RK_LOGI(format, ##__VA_ARGS__)
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun typedef struct _rkMpiVOCtx {
281*4882a593Smuzhiyun     RK_S32  VoDev;
282*4882a593Smuzhiyun     RK_S32  VoLayer;
283*4882a593Smuzhiyun     RK_S32  VoLayerMode;
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun     RK_S32  u32Windows;
286*4882a593Smuzhiyun     RK_U32  enIntfType; /* 0 HDMI 1 edp */
287*4882a593Smuzhiyun     RK_U32  enIntfSync; /* VO_OUTPUT_1080P50 */
288*4882a593Smuzhiyun     RK_U32  enIntfSync_second;
289*4882a593Smuzhiyun     RK_U32  s32X;
290*4882a593Smuzhiyun     RK_U32  s32Y;
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun     RK_U32  u32Screen0DisplayWidth;
293*4882a593Smuzhiyun     RK_U32  u32Screen0DisplayHeight;
294*4882a593Smuzhiyun     RK_U32  u32Screen1DisplayWidth;
295*4882a593Smuzhiyun     RK_U32  u32Screen1DisplayHeight;
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun     RK_U32  u32Screen0ImageWidth;
298*4882a593Smuzhiyun     RK_U32  u32Screen0ImageHeight;
299*4882a593Smuzhiyun     RK_U32  u32Screen1ImageWidth;
300*4882a593Smuzhiyun     RK_U32  u32Screen1ImageHeight;
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun     RK_U32  bDoubleScreen;
303*4882a593Smuzhiyun     RK_U32  u32DispWidth;
304*4882a593Smuzhiyun     RK_U32  u32DispHeight;
305*4882a593Smuzhiyun     RK_U32  u32ImgeWidth;
306*4882a593Smuzhiyun     RK_U32  u32ImageHeight;
307*4882a593Smuzhiyun     RK_U32  s32PixFormat;
308*4882a593Smuzhiyun     RK_U32  u32DispFrmRt;
309*4882a593Smuzhiyun     RK_U32  u32DispFrmRtRatio;
310*4882a593Smuzhiyun     RK_U32  uEnMode;
311*4882a593Smuzhiyun     RK_BOOL bBorder;
312*4882a593Smuzhiyun     RK_S32  loopCount;
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun     RK_U32  wbc_enable;
315*4882a593Smuzhiyun     RK_BOOL wbc_auto;
316*4882a593Smuzhiyun     RK_U32  ui;
317*4882a593Smuzhiyun     RK_U32  ui_alpha;
318*4882a593Smuzhiyun     RK_U32  u32WbcWidth;
319*4882a593Smuzhiyun     RK_S32  u32WbcHeight;
320*4882a593Smuzhiyun     COMPRESS_MODE_E  u32WbcCompressMode;
321*4882a593Smuzhiyun     RK_S32  u32WbcPixFormat;
322*4882a593Smuzhiyun     RK_U32  u32WbcSourceType;
323*4882a593Smuzhiyun     RK_U32  u32WbcSourceId;
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun     VO_LAYER   VoVideoLayer;
326*4882a593Smuzhiyun     RK_U32     u32VideoWindows;
327*4882a593Smuzhiyun     RK_U32     u32GFXLayers;
328*4882a593Smuzhiyun     VO_LAYER   VOGfxLayer;
329*4882a593Smuzhiyun     RK_BOOL    threadExit;
330*4882a593Smuzhiyun 
331*4882a593Smuzhiyun     RK_BOOL     bVoPlay;
332*4882a593Smuzhiyun     const char *cfgFileUri;
333*4882a593Smuzhiyun     RK_S32      s32LoopCount;
334*4882a593Smuzhiyun     RK_U32      u32ChnIndex;
335*4882a593Smuzhiyun     RK_U32      u32Screen0Chn;
336*4882a593Smuzhiyun     RK_U32      u32ChnDismode;
337*4882a593Smuzhiyun     RK_U32      u32Screen1Chn;
338*4882a593Smuzhiyun     RK_BOOL     bThreadExit;
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun     RK_BOOL     bEnWbc;
341*4882a593Smuzhiyun     RK_BOOL     bEnWbcToVO;
342*4882a593Smuzhiyun     RK_BOOL     bChnPriority;
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun     PARSER_CFG  stParserCfg;
345*4882a593Smuzhiyun     VDEC_CFG    stVdecCfg;
346*4882a593Smuzhiyun     VO_CFG      stVoCfg;
347*4882a593Smuzhiyun     WBC_CFG     stWbcCfg;
348*4882a593Smuzhiyun     RK_BOOL     wbc_bind;
349*4882a593Smuzhiyun     RK_U32      bHomologous;
350*4882a593Smuzhiyun     Border_CFG  stBorderCfg;
351*4882a593Smuzhiyun } TEST_VO_CTX_S;
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun typedef struct _VO_Send_Thread_Param {
354*4882a593Smuzhiyun     RK_U32 u32VideoWindows;
355*4882a593Smuzhiyun     VO_LAYER VoVideoLayer;
356*4882a593Smuzhiyun     RK_U32 u32GFXLayers;
357*4882a593Smuzhiyun     VO_LAYER VOGfxLayer;
358*4882a593Smuzhiyun     RK_U32 u32Exit;
359*4882a593Smuzhiyun } VoThreadParam;
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun static RK_S32 SampleSetVoInterfacetiming(VO_PUB_ATTR_S *stVoPubAttr, RK_U32 enIntfSync) {
362*4882a593Smuzhiyun     RK_U32 i;
363*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun     for (i = 0; i < ARRAY_LENGTH(test_mode_table); i++) {
366*4882a593Smuzhiyun         if (enIntfSync == test_mode_table[i].mode)
367*4882a593Smuzhiyun             break;
368*4882a593Smuzhiyun     }
369*4882a593Smuzhiyun 
370*4882a593Smuzhiyun     if (i == ARRAY_LENGTH(test_mode_table)) {
371*4882a593Smuzhiyun         Sample_Print("%s not found supported mode in test mode_table\n", __func__);
372*4882a593Smuzhiyun         return RK_FAILURE;
373*4882a593Smuzhiyun      }
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun     stVoPubAttr->enIntfSync = test_mode_table[i].enIntfSync;
376*4882a593Smuzhiyun 
377*4882a593Smuzhiyun     return s32Ret;
378*4882a593Smuzhiyun }
379*4882a593Smuzhiyun static PIXEL_FORMAT_E Sample_wbc_formt(RK_S32 format) {
380*4882a593Smuzhiyun     switch (format) {
381*4882a593Smuzhiyun         case WBC_FORMAT_BGRA8888:
382*4882a593Smuzhiyun             return RK_FMT_BGRA8888;
383*4882a593Smuzhiyun         case WBC_FORMAT_RGBA8888:
384*4882a593Smuzhiyun             return RK_FMT_RGBA8888;
385*4882a593Smuzhiyun         case WBC_FORMAT_RGB888:
386*4882a593Smuzhiyun             return RK_FMT_RGB888;
387*4882a593Smuzhiyun         case WBC_FORMAT_BGR888:
388*4882a593Smuzhiyun             return RK_FMT_BGR888;
389*4882a593Smuzhiyun         case WBC_FORMAT_YUV420SP:
390*4882a593Smuzhiyun             return RK_FMT_YUV420SP;
391*4882a593Smuzhiyun         case WBC_FORMAT_YUV420SP_VU:
392*4882a593Smuzhiyun             return RK_FMT_YUV420SP_VU;
393*4882a593Smuzhiyun         default:
394*4882a593Smuzhiyun             return RK_FMT_BUTT;
395*4882a593Smuzhiyun     }
396*4882a593Smuzhiyun }
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun static void* vochn_test_thread_func(void *pArgs) {
399*4882a593Smuzhiyun     TEST_VO_CTX_S *ctx = reinterpret_cast<TEST_VO_CTX_S *>(pArgs);
400*4882a593Smuzhiyun     RK_S32 i, j;
401*4882a593Smuzhiyun 
402*4882a593Smuzhiyun     while (1) {
403*4882a593Smuzhiyun         if (ctx->u32ChnDismode == VO_CHANNEL_PLAY_PAUSE) {
404*4882a593Smuzhiyun             for (i = 0; i < ctx->u32Screen0Chn; i++) {
405*4882a593Smuzhiyun                 RK_MPI_VO_PauseChn(VoLayer, i);
406*4882a593Smuzhiyun             }
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun             usleep(1000llu * 2000);
409*4882a593Smuzhiyun 
410*4882a593Smuzhiyun             for (i = 0; i < ctx->u32Screen0Chn; i++) {
411*4882a593Smuzhiyun                 RK_MPI_VO_ResumeChn(VoLayer, i);
412*4882a593Smuzhiyun             }
413*4882a593Smuzhiyun         } else if (ctx->u32ChnDismode == VO_CHANNEL_PLAY_STEP) {
414*4882a593Smuzhiyun             for (i = 0; i < ctx->u32Screen0Chn; i++) {
415*4882a593Smuzhiyun                 for (RK_S32 j = 0; j < MAX_STEP_FRAME_NUM; j++) {
416*4882a593Smuzhiyun                     RK_MPI_VO_StepChn(VoLayer, i);
417*4882a593Smuzhiyun                 }
418*4882a593Smuzhiyun             }
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun             usleep(1000llu * 2000);
421*4882a593Smuzhiyun 
422*4882a593Smuzhiyun             for (i = 0; i < ctx->u32Screen0Chn; i++) {
423*4882a593Smuzhiyun                 RK_MPI_VO_ResumeChn(VoLayer, i);
424*4882a593Smuzhiyun             }
425*4882a593Smuzhiyun         } else if (ctx->u32ChnDismode == VO_CHANNEL_PLAY_SPEED) {
426*4882a593Smuzhiyun             for (i = 0; i < ctx->u32Screen0Chn; i++) {
427*4882a593Smuzhiyun                 RK_MPI_VO_SetChnFrameRate(VoLayer, i, ctx->u32DispFrmRt * ctx->u32DispFrmRtRatio);
428*4882a593Smuzhiyun             }
429*4882a593Smuzhiyun 
430*4882a593Smuzhiyun             usleep(1000llu * 2000);
431*4882a593Smuzhiyun 
432*4882a593Smuzhiyun             for (i = 0; i < ctx->u32Screen0Chn; i++) {
433*4882a593Smuzhiyun                 RK_MPI_VO_ResumeChn(VoLayer, i);
434*4882a593Smuzhiyun             }
435*4882a593Smuzhiyun         }
436*4882a593Smuzhiyun 
437*4882a593Smuzhiyun         if (ctx->stVoCfg.bDoubleScreen) {
438*4882a593Smuzhiyun             if (ctx->u32ChnDismode == VO_CHANNEL_PLAY_PAUSE) {
439*4882a593Smuzhiyun                 for (i = 0; i < ctx->u32Screen1Chn; i++) {
440*4882a593Smuzhiyun                     RK_MPI_VO_PauseChn(VoLayer_second, i);
441*4882a593Smuzhiyun                 }
442*4882a593Smuzhiyun                 usleep(1000llu * 2000);
443*4882a593Smuzhiyun                 for (i = 0; i < ctx->u32Screen1Chn; i++) {
444*4882a593Smuzhiyun                     RK_MPI_VO_ResumeChn(VoLayer_second, i);
445*4882a593Smuzhiyun                 }
446*4882a593Smuzhiyun             } else if (ctx->u32ChnDismode == VO_CHANNEL_PLAY_STEP) {
447*4882a593Smuzhiyun                 for (i = 0; i < ctx->u32Screen1Chn; i++) {
448*4882a593Smuzhiyun                     for (RK_S32 j = 0; j < MAX_STEP_FRAME_NUM; j++) {
449*4882a593Smuzhiyun                         RK_MPI_VO_StepChn(VoLayer_second, i);
450*4882a593Smuzhiyun                     }
451*4882a593Smuzhiyun                 }
452*4882a593Smuzhiyun 
453*4882a593Smuzhiyun                 usleep(1000llu * 2000);
454*4882a593Smuzhiyun 
455*4882a593Smuzhiyun                 for (i = 0; i < ctx->u32Screen1Chn; i++) {
456*4882a593Smuzhiyun                     RK_MPI_VO_ResumeChn(VoLayer_second, i);
457*4882a593Smuzhiyun                 }
458*4882a593Smuzhiyun            } else if (ctx->u32ChnDismode == VO_CHANNEL_PLAY_SPEED) {
459*4882a593Smuzhiyun                 for (i = 0; i < ctx->u32Screen1Chn; i++) {
460*4882a593Smuzhiyun                     RK_MPI_VO_SetChnFrameRate(VoLayer_second, i, ctx->u32DispFrmRt * ctx->u32DispFrmRtRatio);
461*4882a593Smuzhiyun                 }
462*4882a593Smuzhiyun 
463*4882a593Smuzhiyun                 usleep(1000llu * 2000);
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun                 for (i = 0; i < ctx->u32Screen1Chn; i++) {
466*4882a593Smuzhiyun                     RK_MPI_VO_ResumeChn(VoLayer_second, i);
467*4882a593Smuzhiyun                 }
468*4882a593Smuzhiyun             }
469*4882a593Smuzhiyun         }
470*4882a593Smuzhiyun     }
471*4882a593Smuzhiyun 
472*4882a593Smuzhiyun     return RK_NULL;
473*4882a593Smuzhiyun }
474*4882a593Smuzhiyun 
475*4882a593Smuzhiyun static RK_S32 mpi_vo_init_sample(const TEST_VO_CTX_S *ctx, RK_S32 primRows , RK_S32 secondRows) {
476*4882a593Smuzhiyun     VO_PUB_ATTR_S VoPubAttr;
477*4882a593Smuzhiyun     VO_VIDEO_LAYER_ATTR_S stLayerAttr;
478*4882a593Smuzhiyun     VO_CSC_S  VideoCSC;
479*4882a593Smuzhiyun     VO_CHN_ATTR_S VoChnAttr[64];
480*4882a593Smuzhiyun     VO_BORDER_S border;
481*4882a593Smuzhiyun     RK_S32  i;
482*4882a593Smuzhiyun     RK_U32 count = 0;
483*4882a593Smuzhiyun     RK_U32 u32DispBufLen;
484*4882a593Smuzhiyun     RK_U32 s32Ret;
485*4882a593Smuzhiyun     RK_U32 u32DispWidth = ctx->u32DispWidth;
486*4882a593Smuzhiyun     RK_U32 u32DispHeight = ctx->u32DispHeight;
487*4882a593Smuzhiyun     RK_U32 u32ImageWidth = u32DispWidth;
488*4882a593Smuzhiyun     RK_U32 u32ImageHeight = u32DispHeight;
489*4882a593Smuzhiyun 
490*4882a593Smuzhiyun     memset(&VoPubAttr, 0, sizeof(VO_PUB_ATTR_S));
491*4882a593Smuzhiyun     memset(&stLayerAttr, 0, sizeof(VO_VIDEO_LAYER_ATTR_S));
492*4882a593Smuzhiyun     memset(&VideoCSC, 0, sizeof(VO_CSC_S));
493*4882a593Smuzhiyun     memset(&VoChnAttr, 0, sizeof(VoChnAttr));
494*4882a593Smuzhiyun     memset(&border, 0, sizeof(VO_BORDER_S));
495*4882a593Smuzhiyun 
496*4882a593Smuzhiyun     VoPubAttr.enIntfType = VO_INTF_HDMI;
497*4882a593Smuzhiyun     VoPubAttr.enIntfSync = VO_OUTPUT_1080P60;
498*4882a593Smuzhiyun 
499*4882a593Smuzhiyun     s32Ret = RK_MPI_VO_SetPubAttr(RK356X_VO_DEV_HD0, &VoPubAttr);
500*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
501*4882a593Smuzhiyun         return s32Ret;
502*4882a593Smuzhiyun     }
503*4882a593Smuzhiyun     s32Ret = RK_MPI_VO_Enable(RK356X_VO_DEV_HD0);
504*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
505*4882a593Smuzhiyun         return s32Ret;
506*4882a593Smuzhiyun     }
507*4882a593Smuzhiyun     if (ctx->stVoCfg.bDoubleScreen) {
508*4882a593Smuzhiyun         VO_PUB_ATTR_S VoPubAttr1;
509*4882a593Smuzhiyun         VoPubAttr1.enIntfType = VO_INTF_EDP;
510*4882a593Smuzhiyun         VoPubAttr1.enIntfSync = VO_OUTPUT_1024x768_60;
511*4882a593Smuzhiyun         VoPubAttr1.u32BgColor = 0x000000;
512*4882a593Smuzhiyun         s32Ret = RK_MPI_VO_SetPubAttr(RK356X_VO_DEV_HD1, &VoPubAttr1);
513*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
514*4882a593Smuzhiyun             return s32Ret;
515*4882a593Smuzhiyun         }
516*4882a593Smuzhiyun         s32Ret = RK_MPI_VO_Enable(RK356X_VO_DEV_HD1);
517*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
518*4882a593Smuzhiyun             return s32Ret;
519*4882a593Smuzhiyun         }
520*4882a593Smuzhiyun 
521*4882a593Smuzhiyun         s32Ret = RK_MPI_VO_GetLayerDispBufLen(VoLayer_second, &u32DispBufLen);
522*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
523*4882a593Smuzhiyun             RK_LOGE("Get display buf len failed with error code %d!\n", s32Ret);
524*4882a593Smuzhiyun             return s32Ret;
525*4882a593Smuzhiyun         }
526*4882a593Smuzhiyun         u32DispBufLen = 4;
527*4882a593Smuzhiyun         s32Ret = RK_MPI_VO_SetLayerDispBufLen(VoLayer_second, u32DispBufLen);
528*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
529*4882a593Smuzhiyun             return s32Ret;
530*4882a593Smuzhiyun         }
531*4882a593Smuzhiyun     }
532*4882a593Smuzhiyun 
533*4882a593Smuzhiyun     s32Ret = RK_MPI_VO_GetLayerDispBufLen(VoLayer, &u32DispBufLen);
534*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
535*4882a593Smuzhiyun         RK_LOGE("Get display buf len failed with error code %d!\n", s32Ret);
536*4882a593Smuzhiyun         return s32Ret;
537*4882a593Smuzhiyun     }
538*4882a593Smuzhiyun     u32DispBufLen = 4;
539*4882a593Smuzhiyun     s32Ret = RK_MPI_VO_SetLayerDispBufLen(VoLayer, u32DispBufLen);
540*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
541*4882a593Smuzhiyun         return s32Ret;
542*4882a593Smuzhiyun     }
543*4882a593Smuzhiyun     Sample_VO_GetDisplaySize(VoPubAttr.enIntfSync, &u32DispWidth, &u32DispHeight);
544*4882a593Smuzhiyun     stLayerAttr.stDispRect.s32X = 0;
545*4882a593Smuzhiyun     stLayerAttr.stDispRect.s32Y = 0;
546*4882a593Smuzhiyun     stLayerAttr.stDispRect.u32Width = u32DispWidth;
547*4882a593Smuzhiyun     stLayerAttr.stDispRect.u32Height = u32DispHeight;
548*4882a593Smuzhiyun     stLayerAttr.stImageSize.u32Width = u32ImageWidth;
549*4882a593Smuzhiyun     stLayerAttr.stImageSize.u32Height = u32ImageHeight;
550*4882a593Smuzhiyun 
551*4882a593Smuzhiyun     stLayerAttr.u32DispFrmRt = 30;
552*4882a593Smuzhiyun     if (VoLayer == RK356X_VOP_LAYER_ESMART_0) {
553*4882a593Smuzhiyun         stLayerAttr.enPixFormat = RK_FMT_YUV420SP;
554*4882a593Smuzhiyun     } else {
555*4882a593Smuzhiyun        stLayerAttr.enPixFormat = RK_FMT_RGBA8888;
556*4882a593Smuzhiyun     }
557*4882a593Smuzhiyun     VideoCSC.enCscMatrix = VO_CSC_MATRIX_IDENTITY;
558*4882a593Smuzhiyun     VideoCSC.u32Contrast =  50;
559*4882a593Smuzhiyun     VideoCSC.u32Hue = 50;
560*4882a593Smuzhiyun     VideoCSC.u32Luma = 50;
561*4882a593Smuzhiyun     VideoCSC.u32Satuature = 50;
562*4882a593Smuzhiyun 
563*4882a593Smuzhiyun     s32Ret = RK_MPI_VO_SetLayerAttr(VoLayer, &stLayerAttr);
564*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
565*4882a593Smuzhiyun         return s32Ret;
566*4882a593Smuzhiyun     }
567*4882a593Smuzhiyun     s32Ret = RK_MPI_VO_EnableLayer(VoLayer);
568*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
569*4882a593Smuzhiyun         return s32Ret;
570*4882a593Smuzhiyun     }
571*4882a593Smuzhiyun     s32Ret = RK_MPI_VO_SetLayerCSC(VoLayer, &VideoCSC);
572*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
573*4882a593Smuzhiyun         return s32Ret;
574*4882a593Smuzhiyun     }
575*4882a593Smuzhiyun 
576*4882a593Smuzhiyun     RK_S32 totalCH = primRows * primRows;
577*4882a593Smuzhiyun     for (i = 0; i < totalCH; i++) {
578*4882a593Smuzhiyun         VoChnAttr[i].bDeflicker = RK_FALSE;
579*4882a593Smuzhiyun         VoChnAttr[i].u32Priority = 1;
580*4882a593Smuzhiyun         VoChnAttr[i].stRect.s32X = (u32ImageWidth/primRows)*(i%primRows);
581*4882a593Smuzhiyun         VoChnAttr[i].stRect.s32Y = (u32ImageHeight/primRows)*(i/primRows);
582*4882a593Smuzhiyun         VoChnAttr[i].stRect.u32Width = u32ImageWidth/primRows;
583*4882a593Smuzhiyun         VoChnAttr[i].stRect.u32Width = VoChnAttr[i].stRect.u32Width;
584*4882a593Smuzhiyun         VoChnAttr[i].stRect.u32Height = u32ImageHeight/primRows;
585*4882a593Smuzhiyun         VoChnAttr[i].stRect.u32Height = VoChnAttr[i].stRect.u32Height;
586*4882a593Smuzhiyun     }
587*4882a593Smuzhiyun 
588*4882a593Smuzhiyun     for (i = 0; i < totalCH; i++) {
589*4882a593Smuzhiyun         RK_S32 s32ret = RK_MPI_VO_SetChnAttr(VoLayer, i, &VoChnAttr[i]);
590*4882a593Smuzhiyun         if (RK_SUCCESS != s32ret) {
591*4882a593Smuzhiyun             RK_LOGE("vo set dev %d chn %d attr failed! \n", VoLayer, i);
592*4882a593Smuzhiyun         }
593*4882a593Smuzhiyun         border.bBorderEn = RK_TRUE;
594*4882a593Smuzhiyun         border.stBorder.u32Color = 0x191970;
595*4882a593Smuzhiyun         border.stBorder.u32LeftWidth = 2;
596*4882a593Smuzhiyun         border.stBorder.u32RightWidth = 2;
597*4882a593Smuzhiyun         border.stBorder.u32TopWidth = 2;
598*4882a593Smuzhiyun         border.stBorder.u32BottomWidth = 2;
599*4882a593Smuzhiyun         s32Ret = RK_MPI_VO_SetChnBorder(VoLayer, i, &border);
600*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
601*4882a593Smuzhiyun             return s32Ret;
602*4882a593Smuzhiyun         }
603*4882a593Smuzhiyun     }
604*4882a593Smuzhiyun 
605*4882a593Smuzhiyun     if (ctx->stVoCfg.bDoubleScreen) {
606*4882a593Smuzhiyun         u32DispWidth = ctx->u32Screen1DisplayWidth;
607*4882a593Smuzhiyun         u32DispHeight = ctx->u32Screen1DisplayHeight;
608*4882a593Smuzhiyun         u32ImageWidth = u32DispWidth;
609*4882a593Smuzhiyun         u32ImageHeight = u32DispHeight;
610*4882a593Smuzhiyun         Sample_VO_GetDisplaySize(VO_OUTPUT_1024x768_60, &u32DispWidth, &u32DispHeight);
611*4882a593Smuzhiyun         stLayerAttr.stDispRect.s32X = 0;
612*4882a593Smuzhiyun         stLayerAttr.stDispRect.s32Y = 0;
613*4882a593Smuzhiyun         stLayerAttr.stDispRect.u32Width = u32DispWidth;
614*4882a593Smuzhiyun         stLayerAttr.stDispRect.u32Height = u32DispHeight;
615*4882a593Smuzhiyun         stLayerAttr.stImageSize.u32Width = u32ImageWidth;
616*4882a593Smuzhiyun         stLayerAttr.stImageSize.u32Height = u32ImageHeight;
617*4882a593Smuzhiyun 
618*4882a593Smuzhiyun         stLayerAttr.u32DispFrmRt = 30;
619*4882a593Smuzhiyun         if (VoLayer_second == RK356X_VOP_LAYER_ESMART_1) {
620*4882a593Smuzhiyun             stLayerAttr.enPixFormat = RK_FMT_YUV420SP;
621*4882a593Smuzhiyun         } else {
622*4882a593Smuzhiyun            stLayerAttr.enPixFormat = RK_FMT_BGR888;
623*4882a593Smuzhiyun         }
624*4882a593Smuzhiyun 
625*4882a593Smuzhiyun         s32Ret = RK_MPI_VO_SetLayerAttr(VoLayer_second, &stLayerAttr);
626*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
627*4882a593Smuzhiyun             return s32Ret;
628*4882a593Smuzhiyun         }
629*4882a593Smuzhiyun         s32Ret = RK_MPI_VO_EnableLayer(VoLayer_second);
630*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
631*4882a593Smuzhiyun             return s32Ret;
632*4882a593Smuzhiyun         }
633*4882a593Smuzhiyun         s32Ret = RK_MPI_VO_SetLayerCSC(VoLayer_second, &VideoCSC);
634*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
635*4882a593Smuzhiyun             return s32Ret;
636*4882a593Smuzhiyun         }
637*4882a593Smuzhiyun 
638*4882a593Smuzhiyun         totalCH = secondRows * secondRows;
639*4882a593Smuzhiyun         for (i = 0; i < totalCH; i++) {
640*4882a593Smuzhiyun             VoChnAttr[i].bDeflicker = RK_FALSE;
641*4882a593Smuzhiyun             VoChnAttr[i].u32Priority = 1;
642*4882a593Smuzhiyun             VoChnAttr[i].stRect.s32X = (u32ImageWidth/secondRows)*(i%secondRows);
643*4882a593Smuzhiyun             VoChnAttr[i].stRect.s32Y = (u32ImageHeight/secondRows)*(i/secondRows);
644*4882a593Smuzhiyun             VoChnAttr[i].stRect.u32Width = u32ImageWidth/secondRows;
645*4882a593Smuzhiyun             VoChnAttr[i].stRect.u32Width = VoChnAttr[i].stRect.u32Width;
646*4882a593Smuzhiyun             VoChnAttr[i].stRect.u32Height = u32ImageHeight/secondRows;
647*4882a593Smuzhiyun             VoChnAttr[i].stRect.u32Height = VoChnAttr[i].stRect.u32Height;
648*4882a593Smuzhiyun         }
649*4882a593Smuzhiyun         /* demo Chn Priority test */
650*4882a593Smuzhiyun         if (ctx->bChnPriority) {
651*4882a593Smuzhiyun             VoChnAttr[0].u32Priority = 15;
652*4882a593Smuzhiyun 
653*4882a593Smuzhiyun             VoChnAttr[1].u32Priority = 10;
654*4882a593Smuzhiyun             VoChnAttr[1].stRect.s32X = (u32ImageWidth/secondRows)*(1%secondRows) -  100;
655*4882a593Smuzhiyun             VoChnAttr[1].stRect.s32Y = (u32ImageHeight/secondRows)*(1/secondRows) + 100;
656*4882a593Smuzhiyun             VoChnAttr[1].stRect.u32Width = u32ImageWidth/secondRows + 200;
657*4882a593Smuzhiyun             VoChnAttr[1].stRect.u32Width = VoChnAttr[1].stRect.u32Width;
658*4882a593Smuzhiyun             VoChnAttr[1].stRect.u32Height = u32ImageWidth/secondRows + 200;
659*4882a593Smuzhiyun             VoChnAttr[1].stRect.u32Height = VoChnAttr[1].stRect.u32Height;
660*4882a593Smuzhiyun 
661*4882a593Smuzhiyun             VoChnAttr[2].u32Priority = 5;
662*4882a593Smuzhiyun         }
663*4882a593Smuzhiyun 
664*4882a593Smuzhiyun         for (i = 0; i < totalCH; i++) {
665*4882a593Smuzhiyun             RK_S32 s32ret = RK_MPI_VO_SetChnAttr(VoLayer_second, i, &VoChnAttr[i]);
666*4882a593Smuzhiyun             if (RK_SUCCESS != s32ret) {
667*4882a593Smuzhiyun                 RK_LOGE("vo set dev %d chn %d attr failed! \n", VoLayer_second, i);
668*4882a593Smuzhiyun             }
669*4882a593Smuzhiyun             border.bBorderEn = RK_TRUE;
670*4882a593Smuzhiyun             border.stBorder.u32Color = 0x191970;
671*4882a593Smuzhiyun             border.stBorder.u32LeftWidth = 2;
672*4882a593Smuzhiyun             border.stBorder.u32RightWidth = 2;
673*4882a593Smuzhiyun             border.stBorder.u32TopWidth = 2;
674*4882a593Smuzhiyun             border.stBorder.u32BottomWidth = 2;
675*4882a593Smuzhiyun             s32Ret = RK_MPI_VO_SetChnBorder(VoLayer_second, i, &border);
676*4882a593Smuzhiyun             if (s32Ret != RK_SUCCESS) {
677*4882a593Smuzhiyun                 return s32Ret;
678*4882a593Smuzhiyun             }
679*4882a593Smuzhiyun         }
680*4882a593Smuzhiyun     }
681*4882a593Smuzhiyun 
682*4882a593Smuzhiyun     return RK_SUCCESS;
683*4882a593Smuzhiyun }
684*4882a593Smuzhiyun 
685*4882a593Smuzhiyun 
686*4882a593Smuzhiyun static RK_S32 mpi_vo_deinit_sample(const TEST_VO_CTX_S *ctx) {
687*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
688*4882a593Smuzhiyun 
689*4882a593Smuzhiyun     s32Ret = RK_MPI_VO_DisableLayer(VoLayer);
690*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
691*4882a593Smuzhiyun         return s32Ret;
692*4882a593Smuzhiyun     }
693*4882a593Smuzhiyun     if (ctx->stVoCfg.bDoubleScreen) {
694*4882a593Smuzhiyun         s32Ret = RK_MPI_VO_DisableLayer(VoLayer_second);
695*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
696*4882a593Smuzhiyun             return s32Ret;
697*4882a593Smuzhiyun         }
698*4882a593Smuzhiyun     }
699*4882a593Smuzhiyun 
700*4882a593Smuzhiyun     s32Ret = RK_MPI_VO_Disable(RK356X_VO_DEV_HD0);
701*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
702*4882a593Smuzhiyun         return s32Ret;
703*4882a593Smuzhiyun     }
704*4882a593Smuzhiyun     if (ctx->stVoCfg.bDoubleScreen) {
705*4882a593Smuzhiyun         s32Ret = RK_MPI_VO_Disable(RK356X_VO_DEV_HD1);
706*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
707*4882a593Smuzhiyun             return s32Ret;
708*4882a593Smuzhiyun         }
709*4882a593Smuzhiyun     }
710*4882a593Smuzhiyun 
711*4882a593Smuzhiyun     return s32Ret;
712*4882a593Smuzhiyun }
713*4882a593Smuzhiyun 
714*4882a593Smuzhiyun 
715*4882a593Smuzhiyun static RK_S32 open_config(TEST_VO_CTX_S *ctx) {
716*4882a593Smuzhiyun     FILE *fp = RK_NULL;
717*4882a593Smuzhiyun     RK_U32 u32Count = 0;
718*4882a593Smuzhiyun     RK_U32 u32FileLen = 0;
719*4882a593Smuzhiyun     RK_U32 u32Len = 0;
720*4882a593Smuzhiyun     RK_S32 s32Ret = 0;
721*4882a593Smuzhiyun     char *line = RK_NULL;
722*4882a593Smuzhiyun     char *pBuffer = RK_NULL;
723*4882a593Smuzhiyun 
724*4882a593Smuzhiyun     if ((fp = fopen(ctx->cfgFileUri, "r")) == RK_NULL) {
725*4882a593Smuzhiyun         RK_LOGE("Error! opening file");
726*4882a593Smuzhiyun         return RK_FAILURE;
727*4882a593Smuzhiyun     }
728*4882a593Smuzhiyun     fseek(fp, 0L, SEEK_END);
729*4882a593Smuzhiyun     u32FileLen = ftell(fp);
730*4882a593Smuzhiyun     fseek(fp, 0, SEEK_SET);
731*4882a593Smuzhiyun 
732*4882a593Smuzhiyun     size_t sLen = 0;
733*4882a593Smuzhiyun     size_t read = 0;
734*4882a593Smuzhiyun     while (read = getline(&line, &sLen, fp) != -1) {
735*4882a593Smuzhiyun         pBuffer = reinterpret_cast<char *>(malloc(strlen(line)));
736*4882a593Smuzhiyun         RK_S32 len = strlen(line);
737*4882a593Smuzhiyun         snprintf(pBuffer, strlen(line), "%s", line);
738*4882a593Smuzhiyun         while (len) {
739*4882a593Smuzhiyun             if (pBuffer[len] == '\r') {
740*4882a593Smuzhiyun                 memcpy(&(pBuffer[len]), &(pBuffer[len + 1]), strlen(line) - len);
741*4882a593Smuzhiyun             }
742*4882a593Smuzhiyun             len--;
743*4882a593Smuzhiyun         }
744*4882a593Smuzhiyun         ctx->stParserCfg.srcFileUri[u32Count] = pBuffer;
745*4882a593Smuzhiyun 
746*4882a593Smuzhiyun         RK_LOGI("url %s", ctx->stParserCfg.srcFileUri[u32Count]);
747*4882a593Smuzhiyun         u32Count++;
748*4882a593Smuzhiyun 
749*4882a593Smuzhiyun         if (u32Count >= VDEC_MAX_CHN_NUM)
750*4882a593Smuzhiyun             break;
751*4882a593Smuzhiyun     }
752*4882a593Smuzhiyun 
753*4882a593Smuzhiyun     fclose(fp);
754*4882a593Smuzhiyun     return RK_SUCCESS;
755*4882a593Smuzhiyun }
756*4882a593Smuzhiyun 
757*4882a593Smuzhiyun static RK_S32 close_config(TEST_VO_CTX_S *ctx) {
758*4882a593Smuzhiyun     RK_S32 i;
759*4882a593Smuzhiyun 
760*4882a593Smuzhiyun     for (i = 0; i < VDEC_MAX_CHN_NUM; i++) {
761*4882a593Smuzhiyun         if (ctx->stParserCfg.srcFileUri[i] != RK_NULL) {
762*4882a593Smuzhiyun             rk_safe_free(ctx->stParserCfg.srcFileUri[i]);
763*4882a593Smuzhiyun         }
764*4882a593Smuzhiyun     }
765*4882a593Smuzhiyun     return RK_SUCCESS;
766*4882a593Smuzhiyun }
767*4882a593Smuzhiyun 
768*4882a593Smuzhiyun static RK_S32 creat_wbc(TEST_VO_CTX_S *ctx, RK_U32 u32Ch) {
769*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
770*4882a593Smuzhiyun     VO_WBC VoWbc = u32Ch;
771*4882a593Smuzhiyun 
772*4882a593Smuzhiyun     switch (ctx->u32WbcSourceType) {
773*4882a593Smuzhiyun         case WBC_SOURCE_DEV:
774*4882a593Smuzhiyun             ctx->stWbcCfg.stWbcSource.enSourceType = VO_WBC_SOURCE_DEV;
775*4882a593Smuzhiyun             break;
776*4882a593Smuzhiyun         default:
777*4882a593Smuzhiyun             ctx->stWbcCfg.stWbcSource.enSourceType = VO_WBC_SOURCE_VIDEO;
778*4882a593Smuzhiyun     }
779*4882a593Smuzhiyun     s32Ret = RK_MPI_VO_SetWbcSource(VoWbc, &ctx->stWbcCfg.stWbcSource);
780*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
781*4882a593Smuzhiyun         return s32Ret;
782*4882a593Smuzhiyun     }
783*4882a593Smuzhiyun     s32Ret = RK_MPI_VO_SetWbcAttr(VoWbc, &ctx->stWbcCfg.stWbcAttr);
784*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
785*4882a593Smuzhiyun         return s32Ret;
786*4882a593Smuzhiyun     }
787*4882a593Smuzhiyun     s32Ret = RK_MPI_VO_EnableWbc(VoWbc);
788*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
789*4882a593Smuzhiyun         return s32Ret;
790*4882a593Smuzhiyun     }
791*4882a593Smuzhiyun 
792*4882a593Smuzhiyun     return RK_SUCCESS;
793*4882a593Smuzhiyun }
794*4882a593Smuzhiyun 
795*4882a593Smuzhiyun static RK_S32 destory_wbc(RK_U32 u32Ch) {
796*4882a593Smuzhiyun     VO_WBC VoWbc = u32Ch;
797*4882a593Smuzhiyun     RK_MPI_VO_DisableWbc(VoWbc);
798*4882a593Smuzhiyun 
799*4882a593Smuzhiyun     return RK_SUCCESS;
800*4882a593Smuzhiyun }
801*4882a593Smuzhiyun 
802*4882a593Smuzhiyun static RK_S32 creat_vdec(TEST_VO_CTX_S *ctx, RK_U32 u32Ch) {
803*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
804*4882a593Smuzhiyun     VDEC_CHN_ATTR_S pstAttr;
805*4882a593Smuzhiyun     VDEC_CHN_PARAM_S stVdecParam;
806*4882a593Smuzhiyun 
807*4882a593Smuzhiyun     pstAttr.enMode = VIDEO_MODE_FRAME;
808*4882a593Smuzhiyun     pstAttr.enType = ctx->stParserCfg.enCodecId;
809*4882a593Smuzhiyun     pstAttr.u32PicWidth = ctx->stParserCfg.u32SrcWidth;
810*4882a593Smuzhiyun     pstAttr.u32PicHeight = ctx->stParserCfg.u32SrcHeight;
811*4882a593Smuzhiyun     pstAttr.u32FrameBufCnt = ctx->stVdecCfg.u32FrameBufferCnt;
812*4882a593Smuzhiyun 
813*4882a593Smuzhiyun     s32Ret = RK_MPI_VDEC_CreateChn(u32Ch, &pstAttr);
814*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
815*4882a593Smuzhiyun         RK_LOGE("create %d vdec failed! ", u32Ch);
816*4882a593Smuzhiyun         RK_LOGE(R"(enMode %d enType %d u32PicWidth %d u32PicHeight %d \
817*4882a593Smuzhiyun             u32PicVirWidth %d u32PicVirHeight %d u32FrameBufCnt %d)", \
818*4882a593Smuzhiyun             pstAttr.enMode, pstAttr.enType, pstAttr.u32PicWidth, pstAttr.u32PicHeight, \
819*4882a593Smuzhiyun             pstAttr.u32PicVirWidth, pstAttr.u32PicVirHeight, pstAttr.u32FrameBufCnt);
820*4882a593Smuzhiyun         return s32Ret;
821*4882a593Smuzhiyun     }
822*4882a593Smuzhiyun 
823*4882a593Smuzhiyun     stVdecParam.stVdecVideoParam.enCompressMode = ctx->stVdecCfg.enCompressMode;
824*4882a593Smuzhiyun     s32Ret = RK_MPI_VDEC_SetChnParam(u32Ch, &stVdecParam);
825*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
826*4882a593Smuzhiyun         return s32Ret;
827*4882a593Smuzhiyun     }
828*4882a593Smuzhiyun     s32Ret = RK_MPI_VDEC_StartRecvStream(u32Ch);
829*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
830*4882a593Smuzhiyun         return s32Ret;
831*4882a593Smuzhiyun     }
832*4882a593Smuzhiyun 
833*4882a593Smuzhiyun     if (TEST_COMM_GetUriSchemeType(ctx->stParserCfg.srcFileUri[u32Ch]) != RK_URI_SCHEME_LOCAL) {
834*4882a593Smuzhiyun         s32Ret = RK_MPI_VDEC_SetDisplayMode(u32Ch, VIDEO_DISPLAY_MODE_PREVIEW);
835*4882a593Smuzhiyun     } else {
836*4882a593Smuzhiyun         s32Ret = RK_MPI_VDEC_SetDisplayMode(u32Ch, VIDEO_DISPLAY_MODE_PLAYBACK);
837*4882a593Smuzhiyun     }
838*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
839*4882a593Smuzhiyun         return s32Ret;
840*4882a593Smuzhiyun     }
841*4882a593Smuzhiyun 
842*4882a593Smuzhiyun     RK_LOGI("create %d vdec success", u32Ch);
843*4882a593Smuzhiyun     return RK_SUCCESS;
844*4882a593Smuzhiyun }
845*4882a593Smuzhiyun 
846*4882a593Smuzhiyun static RK_S32 screen1_process(TEST_VO_CTX_S *ctx, RK_U32 u32Index) {
847*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
848*4882a593Smuzhiyun     MPP_CHN_S stSrcChn, stDstChn;
849*4882a593Smuzhiyun 
850*4882a593Smuzhiyun     s32Ret = creat_vdec(ctx, u32Index);
851*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
852*4882a593Smuzhiyun         RK_LOGE("creat %d ch vdec failed!", u32Index);
853*4882a593Smuzhiyun         return s32Ret;
854*4882a593Smuzhiyun     }
855*4882a593Smuzhiyun 
856*4882a593Smuzhiyun     s32Ret = RK_MPI_VO_EnableChn(ctx->stVoCfg.u32Screen1VoLayer, u32Index - ctx->u32Screen0Chn);
857*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
858*4882a593Smuzhiyun         RK_LOGE("creat %d layer %d ch vo failed!",
859*4882a593Smuzhiyun             ctx->stVoCfg.u32Screen1VoLayer, u32Index - ctx->u32Screen0Chn);
860*4882a593Smuzhiyun         return s32Ret;
861*4882a593Smuzhiyun     }
862*4882a593Smuzhiyun     RK_LOGD("create vo layer %d ch %d", ctx->stVoCfg.u32Screen1VoLayer,  u32Index - ctx->u32Screen0Chn);
863*4882a593Smuzhiyun 
864*4882a593Smuzhiyun     stSrcChn.enModId = RK_ID_VDEC;
865*4882a593Smuzhiyun     stSrcChn.s32DevId = 0;
866*4882a593Smuzhiyun     stSrcChn.s32ChnId = u32Index;
867*4882a593Smuzhiyun 
868*4882a593Smuzhiyun     RK_LOGD("vdec  Ch %d", stSrcChn.s32ChnId);
869*4882a593Smuzhiyun     stDstChn.enModId = RK_ID_VO;
870*4882a593Smuzhiyun     stDstChn.s32DevId = ctx->stVoCfg.u32Screen1VoLayer;
871*4882a593Smuzhiyun     stDstChn.s32ChnId = u32Index - ctx->u32Screen0Chn;
872*4882a593Smuzhiyun 
873*4882a593Smuzhiyun     RK_LOGD("VoLayer %d, voCh %d", ctx->stVoCfg.u32Screen1VoLayer,  u32Index - ctx->u32Screen0Chn);
874*4882a593Smuzhiyun 
875*4882a593Smuzhiyun     s32Ret = RK_MPI_SYS_Bind(&stSrcChn, &stDstChn);
876*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
877*4882a593Smuzhiyun         RK_LOGE("vdec and vo bind error");
878*4882a593Smuzhiyun         return s32Ret;
879*4882a593Smuzhiyun     }
880*4882a593Smuzhiyun 
881*4882a593Smuzhiyun     return RK_SUCCESS;
882*4882a593Smuzhiyun }
883*4882a593Smuzhiyun 
884*4882a593Smuzhiyun static RK_S32 screen0_process(TEST_VO_CTX_S *ctx, RK_U32 u32Index) {
885*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
886*4882a593Smuzhiyun     MPP_CHN_S stSrcChn, stDstChn;
887*4882a593Smuzhiyun 
888*4882a593Smuzhiyun     s32Ret = creat_vdec(ctx, u32Index);
889*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
890*4882a593Smuzhiyun         RK_LOGE("creat %d ch vdec failed!", u32Index);
891*4882a593Smuzhiyun         return s32Ret;
892*4882a593Smuzhiyun     }
893*4882a593Smuzhiyun 
894*4882a593Smuzhiyun     s32Ret = RK_MPI_VO_EnableChn(ctx->stVoCfg.u32Screen0VoLayer, u32Index);
895*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
896*4882a593Smuzhiyun          RK_LOGE("creat %d layer %d ch vo failed!", ctx->stVoCfg.u32Screen0VoLayer, u32Index);
897*4882a593Smuzhiyun          return s32Ret;
898*4882a593Smuzhiyun     }
899*4882a593Smuzhiyun 
900*4882a593Smuzhiyun     RK_LOGD("create vo layer %d ch %d", ctx->stVoCfg.u32Screen0VoLayer, u32Index);
901*4882a593Smuzhiyun 
902*4882a593Smuzhiyun     stSrcChn.enModId = RK_ID_VDEC;
903*4882a593Smuzhiyun     stSrcChn.s32DevId = 0;
904*4882a593Smuzhiyun     stSrcChn.s32ChnId = u32Index;
905*4882a593Smuzhiyun     RK_LOGD("vdec  Ch %d", stSrcChn.s32ChnId);
906*4882a593Smuzhiyun 
907*4882a593Smuzhiyun     stDstChn.enModId = RK_ID_VO;
908*4882a593Smuzhiyun     stDstChn.s32DevId = ctx->stVoCfg.u32Screen0VoLayer;
909*4882a593Smuzhiyun     stDstChn.s32ChnId = u32Index;
910*4882a593Smuzhiyun     RK_LOGD("voLayer %d, voCh %d", stDstChn.s32DevId,  stDstChn.s32ChnId);
911*4882a593Smuzhiyun 
912*4882a593Smuzhiyun     s32Ret = RK_MPI_SYS_Bind(&stSrcChn, &stDstChn);
913*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
914*4882a593Smuzhiyun         RK_LOGE("vdec and vo bind error ");
915*4882a593Smuzhiyun         return s32Ret;
916*4882a593Smuzhiyun     }
917*4882a593Smuzhiyun 
918*4882a593Smuzhiyun     return RK_SUCCESS;
919*4882a593Smuzhiyun }
920*4882a593Smuzhiyun 
921*4882a593Smuzhiyun static RK_S32 wbc_process(TEST_VO_CTX_S *ctx) {
922*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
923*4882a593Smuzhiyun     MPP_CHN_S stSrcChn, stDstChn;
924*4882a593Smuzhiyun 
925*4882a593Smuzhiyun     s32Ret = creat_wbc(ctx, 0);
926*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
927*4882a593Smuzhiyun         RK_LOGE("create wbc failed");
928*4882a593Smuzhiyun         return s32Ret;
929*4882a593Smuzhiyun     }
930*4882a593Smuzhiyun 
931*4882a593Smuzhiyun     stSrcChn.enModId = RK_ID_WBC;
932*4882a593Smuzhiyun     stSrcChn.s32DevId = 0;
933*4882a593Smuzhiyun     stSrcChn.s32ChnId = 0;
934*4882a593Smuzhiyun 
935*4882a593Smuzhiyun     if (ctx->bEnWbcToVO) {
936*4882a593Smuzhiyun         stDstChn.enModId   = RK_ID_VO;
937*4882a593Smuzhiyun 
938*4882a593Smuzhiyun         if (ctx->stWbcCfg.stWbcSource.u32SourceId == RK356X_VO_DEV_HD1) {
939*4882a593Smuzhiyun             s32Ret = RK_MPI_VO_EnableChn(ctx->stVoCfg.u32Screen0VoLayer, ctx->u32Screen0Chn);
940*4882a593Smuzhiyun             if (s32Ret != RK_SUCCESS) {
941*4882a593Smuzhiyun                 RK_LOGE("creat %d layer %d ch vo failed!",
942*4882a593Smuzhiyun                     ctx->stVoCfg.u32Screen0VoLayer, ctx->u32Screen0Chn);
943*4882a593Smuzhiyun                 return s32Ret;
944*4882a593Smuzhiyun             }
945*4882a593Smuzhiyun             stDstChn.s32DevId  = ctx->stVoCfg.u32Screen0VoLayer;
946*4882a593Smuzhiyun         } else {
947*4882a593Smuzhiyun             s32Ret = RK_MPI_VO_EnableChn(ctx->stVoCfg.u32Screen1VoLayer, ctx->u32Screen1Chn);
948*4882a593Smuzhiyun             if (s32Ret != RK_SUCCESS) {
949*4882a593Smuzhiyun                 RK_LOGE("creat %d layer %d ch vo failed!",
950*4882a593Smuzhiyun                     ctx->stVoCfg.u32Screen1VoLayer, ctx->u32Screen1Chn);
951*4882a593Smuzhiyun                 return s32Ret;
952*4882a593Smuzhiyun             }
953*4882a593Smuzhiyun             stDstChn.s32DevId  = ctx->stVoCfg.u32Screen1VoLayer;
954*4882a593Smuzhiyun         }
955*4882a593Smuzhiyun         stDstChn.s32ChnId  = ctx->u32Screen1Chn;
956*4882a593Smuzhiyun 
957*4882a593Smuzhiyun         if (ctx->wbc_bind == RK_TRUE) {
958*4882a593Smuzhiyun             s32Ret = RK_MPI_SYS_Bind(&stSrcChn, &stDstChn);
959*4882a593Smuzhiyun             if (s32Ret != RK_SUCCESS) {
960*4882a593Smuzhiyun                 RK_LOGE("creat wbc bind vo failed!");
961*4882a593Smuzhiyun                 return RK_FAILURE;
962*4882a593Smuzhiyun             }
963*4882a593Smuzhiyun         } else {
964*4882a593Smuzhiyun             RK_LOGD("WBC enabled,but not bind");
965*4882a593Smuzhiyun         }
966*4882a593Smuzhiyun     }
967*4882a593Smuzhiyun 
968*4882a593Smuzhiyun     return RK_SUCCESS;
969*4882a593Smuzhiyun }
970*4882a593Smuzhiyun 
971*4882a593Smuzhiyun 
972*4882a593Smuzhiyun RK_S32 unit_mpi_voplay_test(TEST_VO_CTX_S *ctx) {
973*4882a593Smuzhiyun     RK_U32  i, k;
974*4882a593Smuzhiyun 
975*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
976*4882a593Smuzhiyun     RK_U32 u32MaxCh = 0;
977*4882a593Smuzhiyun     RK_U32 u32step = 0;
978*4882a593Smuzhiyun     RK_S32 u32VpssGrap = 0;
979*4882a593Smuzhiyun 
980*4882a593Smuzhiyun     MPP_CHN_S stSrcChn, stDstChn;
981*4882a593Smuzhiyun 
982*4882a593Smuzhiyun     TEST_VO_CTX_S mpiVdecCtx[VDEC_MAX_CHN_NUM];
983*4882a593Smuzhiyun     TEST_VO_CTX_S mpiVencCtx[VENC_MAX_CHN_NUM];
984*4882a593Smuzhiyun 
985*4882a593Smuzhiyun     pthread_t vdecSendThread[VDEC_MAX_CHN_NUM];
986*4882a593Smuzhiyun     pthread_t vdecGetThread[VDEC_MAX_CHN_NUM];
987*4882a593Smuzhiyun 
988*4882a593Smuzhiyun     pthread_t voThread;
989*4882a593Smuzhiyun     RK_U32 u32VdecSendThreadNum = 0;
990*4882a593Smuzhiyun     RK_U32 u32VdecGetThreadNum = 0;
991*4882a593Smuzhiyun     RK_U32 u32Ch = 0;
992*4882a593Smuzhiyun 
993*4882a593Smuzhiyun     if (open_config(ctx) < 0) {
994*4882a593Smuzhiyun         RK_LOGE("parser cfg failed!");
995*4882a593Smuzhiyun         return RK_FAILURE;
996*4882a593Smuzhiyun     }
997*4882a593Smuzhiyun 
998*4882a593Smuzhiyun     mpi_vo_init_sample(ctx, ctx->stVoCfg.u32Screen0Rows, ctx->stVoCfg.u32Screen1Rows);
999*4882a593Smuzhiyun 
1000*4882a593Smuzhiyun     u32MaxCh =  ctx->u32Screen1Chn + ctx->u32Screen0Chn;
1001*4882a593Smuzhiyun 
1002*4882a593Smuzhiyun     RK_LOGD("screen0Ch %d screen1Ch %d maxCh %d", ctx->u32Screen0Chn, ctx->u32Screen1Chn, u32MaxCh);
1003*4882a593Smuzhiyun 
1004*4882a593Smuzhiyun     for (i = 0; i < ctx->u32Screen0Chn; i++) {
1005*4882a593Smuzhiyun         s32Ret = screen0_process(ctx, i);
1006*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
1007*4882a593Smuzhiyun             RK_LOGE("screen0_process failed!", i);
1008*4882a593Smuzhiyun             continue;
1009*4882a593Smuzhiyun         }
1010*4882a593Smuzhiyun         ctx->u32ChnIndex = i;
1011*4882a593Smuzhiyun         memcpy(&(mpiVdecCtx[i]), ctx, sizeof(TEST_VO_CTX_S));
1012*4882a593Smuzhiyun         u32VdecSendThreadNum++;
1013*4882a593Smuzhiyun     }
1014*4882a593Smuzhiyun 
1015*4882a593Smuzhiyun 
1016*4882a593Smuzhiyun     for (i = ctx->u32Screen0Chn; i < u32MaxCh; i++) {
1017*4882a593Smuzhiyun             s32Ret = screen1_process(ctx, i);
1018*4882a593Smuzhiyun             if (s32Ret != RK_SUCCESS) {
1019*4882a593Smuzhiyun                 RK_LOGE("screen1_process failed!", i);
1020*4882a593Smuzhiyun                 continue;
1021*4882a593Smuzhiyun             }
1022*4882a593Smuzhiyun             ctx->u32ChnIndex = i;
1023*4882a593Smuzhiyun             memcpy(&(mpiVdecCtx[i]), ctx, sizeof(TEST_VO_CTX_S));
1024*4882a593Smuzhiyun             u32VdecSendThreadNum++;
1025*4882a593Smuzhiyun         }
1026*4882a593Smuzhiyun 
1027*4882a593Smuzhiyun     pthread_create(&voThread, 0, vochn_test_thread_func, reinterpret_cast<void *>(ctx));
1028*4882a593Smuzhiyun 
1029*4882a593Smuzhiyun     if (ctx->bEnWbc) {
1030*4882a593Smuzhiyun         s32Ret = wbc_process(ctx);
1031*4882a593Smuzhiyun         if (s32Ret == RK_SUCCESS) {
1032*4882a593Smuzhiyun             RK_LOGE("wb process ok");
1033*4882a593Smuzhiyun         } else {
1034*4882a593Smuzhiyun             RK_LOGE("wb process failed");
1035*4882a593Smuzhiyun         }
1036*4882a593Smuzhiyun     }
1037*4882a593Smuzhiyun 
1038*4882a593Smuzhiyun     u32VdecSendThreadNum = 0;
1039*4882a593Smuzhiyun     for (i = 0; i< ctx->u32Screen0Chn; i++) {
1040*4882a593Smuzhiyun         pthread_join(vdecSendThread[u32VdecSendThreadNum], RK_NULL);
1041*4882a593Smuzhiyun         u32VdecSendThreadNum++;
1042*4882a593Smuzhiyun 
1043*4882a593Smuzhiyun         stSrcChn.enModId = RK_ID_VDEC;
1044*4882a593Smuzhiyun         stSrcChn.s32DevId = 0;
1045*4882a593Smuzhiyun         stSrcChn.s32ChnId = i;
1046*4882a593Smuzhiyun 
1047*4882a593Smuzhiyun         stDstChn.enModId = RK_ID_VO;
1048*4882a593Smuzhiyun         stDstChn.s32DevId = ctx->stVoCfg.u32Screen0VoLayer;
1049*4882a593Smuzhiyun         stDstChn.s32ChnId = i;
1050*4882a593Smuzhiyun 
1051*4882a593Smuzhiyun         s32Ret = RK_MPI_SYS_UnBind(&stSrcChn, &stDstChn);
1052*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
1053*4882a593Smuzhiyun             return s32Ret;
1054*4882a593Smuzhiyun         }
1055*4882a593Smuzhiyun 
1056*4882a593Smuzhiyun         s32Ret = RK_MPI_VDEC_StopRecvStream(i);
1057*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
1058*4882a593Smuzhiyun             return s32Ret;
1059*4882a593Smuzhiyun         }
1060*4882a593Smuzhiyun         s32Ret = RK_MPI_VDEC_DestroyChn(i);
1061*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
1062*4882a593Smuzhiyun             return s32Ret;
1063*4882a593Smuzhiyun         }
1064*4882a593Smuzhiyun         s32Ret = RK_MPI_VO_DisableChn(ctx->stVoCfg.u32Screen0VoLayer, i);
1065*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
1066*4882a593Smuzhiyun             return s32Ret;
1067*4882a593Smuzhiyun         }
1068*4882a593Smuzhiyun     }
1069*4882a593Smuzhiyun 
1070*4882a593Smuzhiyun     for (i = ctx->u32Screen0Chn; i < u32MaxCh; i++) {
1071*4882a593Smuzhiyun             pthread_join(vdecSendThread[u32VdecSendThreadNum], RK_NULL);
1072*4882a593Smuzhiyun             u32VdecSendThreadNum++;
1073*4882a593Smuzhiyun 
1074*4882a593Smuzhiyun             stSrcChn.enModId = RK_ID_VDEC;
1075*4882a593Smuzhiyun             stSrcChn.s32DevId = 0;
1076*4882a593Smuzhiyun             stSrcChn.s32ChnId = i;
1077*4882a593Smuzhiyun 
1078*4882a593Smuzhiyun             stDstChn.enModId = RK_ID_VO;
1079*4882a593Smuzhiyun             stDstChn.s32DevId = ctx->stVoCfg.u32Screen1VoLayer;
1080*4882a593Smuzhiyun             stDstChn.s32ChnId = i;
1081*4882a593Smuzhiyun 
1082*4882a593Smuzhiyun             s32Ret = RK_MPI_SYS_UnBind(&stSrcChn, &stDstChn);
1083*4882a593Smuzhiyun             if (s32Ret != RK_SUCCESS) {
1084*4882a593Smuzhiyun                 return s32Ret;
1085*4882a593Smuzhiyun             }
1086*4882a593Smuzhiyun             s32Ret = RK_MPI_VDEC_StopRecvStream(i);
1087*4882a593Smuzhiyun             if (s32Ret != RK_SUCCESS) {
1088*4882a593Smuzhiyun                 return s32Ret;
1089*4882a593Smuzhiyun             }
1090*4882a593Smuzhiyun             s32Ret = RK_MPI_VDEC_DestroyChn(i);
1091*4882a593Smuzhiyun             if (s32Ret != RK_SUCCESS) {
1092*4882a593Smuzhiyun                 return s32Ret;
1093*4882a593Smuzhiyun             }
1094*4882a593Smuzhiyun             s32Ret = RK_MPI_VO_DisableChn(ctx->stVoCfg.u32Screen1VoLayer, i);
1095*4882a593Smuzhiyun             if (s32Ret != RK_SUCCESS) {
1096*4882a593Smuzhiyun                 return s32Ret;
1097*4882a593Smuzhiyun             }
1098*4882a593Smuzhiyun         }
1099*4882a593Smuzhiyun 
1100*4882a593Smuzhiyun     if (ctx->bEnWbc) {
1101*4882a593Smuzhiyun         if (ctx->bEnWbcToVO) {
1102*4882a593Smuzhiyun             stSrcChn.enModId    = RK_ID_WBC;
1103*4882a593Smuzhiyun             stSrcChn.s32DevId   = 0;
1104*4882a593Smuzhiyun             stSrcChn.s32ChnId   = 0;
1105*4882a593Smuzhiyun 
1106*4882a593Smuzhiyun             stDstChn.enModId   = RK_ID_VO;
1107*4882a593Smuzhiyun             stDstChn.s32DevId  = ctx->stVoCfg.u32Screen0VoLayer;
1108*4882a593Smuzhiyun             stDstChn.s32ChnId  = 0;
1109*4882a593Smuzhiyun 
1110*4882a593Smuzhiyun             s32Ret = RK_MPI_SYS_UnBind(&stSrcChn, &stDstChn);
1111*4882a593Smuzhiyun             if (s32Ret != RK_SUCCESS) {
1112*4882a593Smuzhiyun                 return s32Ret;
1113*4882a593Smuzhiyun             }
1114*4882a593Smuzhiyun             s32Ret = destory_wbc(0);
1115*4882a593Smuzhiyun             if (s32Ret != RK_SUCCESS) {
1116*4882a593Smuzhiyun                 return s32Ret;
1117*4882a593Smuzhiyun             }
1118*4882a593Smuzhiyun             s32Ret = RK_MPI_VO_DisableChn(ctx->stVoCfg.u32Screen0VoLayer, 0);
1119*4882a593Smuzhiyun             if (s32Ret != RK_SUCCESS) {
1120*4882a593Smuzhiyun                 return s32Ret;
1121*4882a593Smuzhiyun             }
1122*4882a593Smuzhiyun         }
1123*4882a593Smuzhiyun     }
1124*4882a593Smuzhiyun 
1125*4882a593Smuzhiyun     mpi_vo_deinit_sample(ctx);
1126*4882a593Smuzhiyun     close_config(ctx);
1127*4882a593Smuzhiyun     return RK_SUCCESS;
1128*4882a593Smuzhiyun }
1129*4882a593Smuzhiyun 
1130*4882a593Smuzhiyun static void Sample_VO_GetPictureData(VO_FRAME_INFO_S *pstFrameInfo, const char *pFileName) {
1131*4882a593Smuzhiyun     RK_S32 u32Fd;
1132*4882a593Smuzhiyun     RK_U32 u32Size, u32Bpp, u32Stride;
1133*4882a593Smuzhiyun 
1134*4882a593Smuzhiyun     switch (pstFrameInfo->enPixelFormat) {
1135*4882a593Smuzhiyun     case RK_FMT_RGBA8888:
1136*4882a593Smuzhiyun         u32Bpp = 4;
1137*4882a593Smuzhiyun         break;
1138*4882a593Smuzhiyun     case RK_FMT_RGB888:
1139*4882a593Smuzhiyun     case RK_FMT_BGR888:
1140*4882a593Smuzhiyun         u32Bpp = 3;
1141*4882a593Smuzhiyun         break;
1142*4882a593Smuzhiyun     case RK_FMT_YUV420SP:
1143*4882a593Smuzhiyun     case RK_FMT_YUV420SP_VU:
1144*4882a593Smuzhiyun         u32Bpp = 1;
1145*4882a593Smuzhiyun         break;
1146*4882a593Smuzhiyun     default:
1147*4882a593Smuzhiyun         Sample_Print("%s Unsupported Format %d\n", __func__, pstFrameInfo->enPixelFormat);
1148*4882a593Smuzhiyun     return;
1149*4882a593Smuzhiyun     }
1150*4882a593Smuzhiyun 
1151*4882a593Smuzhiyun     u32Fd = open(pFileName, O_RDONLY);
1152*4882a593Smuzhiyun     if (u32Fd < 0) {
1153*4882a593Smuzhiyun         Sample_Print("cat not find file\n");
1154*4882a593Smuzhiyun         return;
1155*4882a593Smuzhiyun     }
1156*4882a593Smuzhiyun     u32Size = lseek(u32Fd, 0, SEEK_END);
1157*4882a593Smuzhiyun     lseek(u32Fd, 0, SEEK_SET);
1158*4882a593Smuzhiyun 
1159*4882a593Smuzhiyun     Sample_Print("%dx%d %dx%d\n",
1160*4882a593Smuzhiyun                   pstFrameInfo->u32Width, pstFrameInfo->u32Height,
1161*4882a593Smuzhiyun                   pstFrameInfo->u32VirWidth, pstFrameInfo->u32VirHeight);
1162*4882a593Smuzhiyun 
1163*4882a593Smuzhiyun     if (pstFrameInfo->u32Width != pstFrameInfo->u32VirWidth) {
1164*4882a593Smuzhiyun         u32Stride = pstFrameInfo->u32VirWidth * u32Bpp;
1165*4882a593Smuzhiyun 
1166*4882a593Smuzhiyun         for (RK_S32 i = 0; i < pstFrameInfo->u32Height; i++)
1167*4882a593Smuzhiyun             read(u32Fd, reinterpret_cast<RK_S8 *>(pstFrameInfo->pData) + u32Stride * i,
1168*4882a593Smuzhiyun                         pstFrameInfo->u32Width * u32Bpp);
1169*4882a593Smuzhiyun 
1170*4882a593Smuzhiyun             if (pstFrameInfo->enPixelFormat == RK_FMT_YUV420SP ||
1171*4882a593Smuzhiyun                 pstFrameInfo->enPixelFormat == RK_FMT_YUV420SP_VU) {
1172*4882a593Smuzhiyun                 for (RK_S32 i = 0; i < pstFrameInfo->u32Height / 2; i++)
1173*4882a593Smuzhiyun                     read(u32Fd, reinterpret_cast<RK_S8 *>(pstFrameInfo->pData)
1174*4882a593Smuzhiyun                                 + u32Stride * pstFrameInfo->u32VirHeight + i * u32Stride,
1175*4882a593Smuzhiyun                                 pstFrameInfo->u32Width);
1176*4882a593Smuzhiyun                 }
1177*4882a593Smuzhiyun             } else {
1178*4882a593Smuzhiyun                 read(u32Fd, pstFrameInfo->pData, u32Size);
1179*4882a593Smuzhiyun             }
1180*4882a593Smuzhiyun             close(u32Fd);
1181*4882a593Smuzhiyun }
1182*4882a593Smuzhiyun 
1183*4882a593Smuzhiyun static void filewrite(void *buf, uint32_t size, char *file) {
1184*4882a593Smuzhiyun     int fd = open(file, O_WRONLY | O_CREAT);
1185*4882a593Smuzhiyun 
1186*4882a593Smuzhiyun     if (fd < 0) {
1187*4882a593Smuzhiyun         printf("cat not open file\n");
1188*4882a593Smuzhiyun         return;
1189*4882a593Smuzhiyun     }
1190*4882a593Smuzhiyun 
1191*4882a593Smuzhiyun     write(fd, buf, size);
1192*4882a593Smuzhiyun     close(fd);
1193*4882a593Smuzhiyun }
1194*4882a593Smuzhiyun 
1195*4882a593Smuzhiyun static void Sample_VO_DrawUI(VO_FRAME_INFO_S *pstFrameInfo, RK_S32 format, RK_S32 value) {
1196*4882a593Smuzhiyun     RK_S32 PixelVal0, PixelVal1;
1197*4882a593Smuzhiyun     RK_S8 *pData = reinterpret_cast<RK_S8 *>(pstFrameInfo->pData);
1198*4882a593Smuzhiyun     RK_U32 u32Offset;
1199*4882a593Smuzhiyun 
1200*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstFrameInfo->u32Height; i++) {
1201*4882a593Smuzhiyun         for (RK_S32 j = 0; j < pstFrameInfo->u32Width; j++) {
1202*4882a593Smuzhiyun             u32Offset = i * pstFrameInfo->u32VirWidth + j;
1203*4882a593Smuzhiyun             if (format == RK_FMT_BGRA5551) {
1204*4882a593Smuzhiyun                 u32Offset = u32Offset * 2;
1205*4882a593Smuzhiyun                 PixelVal0 = value | 0x8000;
1206*4882a593Smuzhiyun                 PixelVal1 = value & 0x7FFF;
1207*4882a593Smuzhiyun             } else if (format == RK_FMT_BGRA8888) {
1208*4882a593Smuzhiyun                 u32Offset = u32Offset * 4;
1209*4882a593Smuzhiyun                 PixelVal0 = 0x000000FF;
1210*4882a593Smuzhiyun             } else {
1211*4882a593Smuzhiyun                 continue;
1212*4882a593Smuzhiyun             }
1213*4882a593Smuzhiyun 
1214*4882a593Smuzhiyun             if (j < pstFrameInfo->u32Width / 2) {
1215*4882a593Smuzhiyun                 if (format == RK_FMT_BGRA5551) {
1216*4882a593Smuzhiyun                     pData[u32Offset] = PixelVal0 & 0xff;
1217*4882a593Smuzhiyun                     pData[u32Offset + 1] = (PixelVal0 >> 8) & 0xff;
1218*4882a593Smuzhiyun                 } else if (format == RK_FMT_BGRA8888) {
1219*4882a593Smuzhiyun                     pData[u32Offset] = PixelVal0 & 0xff;
1220*4882a593Smuzhiyun                     pData[u32Offset + 1] = (PixelVal0 >> 8) & 0xff;
1221*4882a593Smuzhiyun                     pData[u32Offset + 1] = (PixelVal0 >> 16) & 0xff;
1222*4882a593Smuzhiyun                     pData[u32Offset + 1] = (PixelVal0 >> 24) & 0xff;
1223*4882a593Smuzhiyun                 }
1224*4882a593Smuzhiyun             } else {
1225*4882a593Smuzhiyun                 if (format == RK_FMT_BGRA5551) {
1226*4882a593Smuzhiyun                     pData[u32Offset] = PixelVal1 & 0xff;
1227*4882a593Smuzhiyun                     pData[u32Offset + 1] = (PixelVal1 >> 8) & 0xff;
1228*4882a593Smuzhiyun                 } else if (format == RK_FMT_BGRA8888) {
1229*4882a593Smuzhiyun                     pData[u32Offset] = PixelVal0 & 0xff;
1230*4882a593Smuzhiyun                     pData[u32Offset + 1] = (PixelVal0 >> 8) & 0xff;
1231*4882a593Smuzhiyun                     pData[u32Offset + 1] = (PixelVal0 >> 16) & 0xff;
1232*4882a593Smuzhiyun                     pData[u32Offset + 1] = (PixelVal0 >> 24) & 0xff;
1233*4882a593Smuzhiyun                }
1234*4882a593Smuzhiyun             }
1235*4882a593Smuzhiyun         }
1236*4882a593Smuzhiyun     }
1237*4882a593Smuzhiyun }
1238*4882a593Smuzhiyun 
1239*4882a593Smuzhiyun static RK_S32 Sample_VO_MultiGFXLayer_Start(VO_LAYER VoLayer, RK_U32 u32Layers) {
1240*4882a593Smuzhiyun     VO_VIDEO_LAYER_ATTR_S    stLayerAttr;
1241*4882a593Smuzhiyun     VO_CHN_ATTR_S            stChnAttr;
1242*4882a593Smuzhiyun     VO_CHN_PARAM_S           stParam;
1243*4882a593Smuzhiyun     VO_BORDER_S              stBorder;
1244*4882a593Smuzhiyun     RK_U32                   u32Row, u32Column, i;
1245*4882a593Smuzhiyun     RK_U32                   u32WinWidth, u32WinHeight;
1246*4882a593Smuzhiyun     RK_S32                   s32Ret = RK_SUCCESS;
1247*4882a593Smuzhiyun 
1248*4882a593Smuzhiyun     s32Ret = RK_MPI_VO_GetLayerAttr(VoLayer, &stLayerAttr);
1249*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
1250*4882a593Smuzhiyun         Sample_Print("[%s] Get Layer Attr failed\n", __func__);
1251*4882a593Smuzhiyun         return RK_FAILURE;
1252*4882a593Smuzhiyun     }
1253*4882a593Smuzhiyun 
1254*4882a593Smuzhiyun     for (i = 0; i < u32Layers; i++) {
1255*4882a593Smuzhiyun         stChnAttr.stRect.s32X = 0;
1256*4882a593Smuzhiyun         stChnAttr.stRect.s32Y = 0;
1257*4882a593Smuzhiyun         stChnAttr.stRect.u32Width = stLayerAttr.stDispRect.u32Width;
1258*4882a593Smuzhiyun         stChnAttr.stRect.u32Height = stLayerAttr.stDispRect.u32Height;
1259*4882a593Smuzhiyun         stChnAttr.u32Priority = i;
1260*4882a593Smuzhiyun         if (i == 0) {
1261*4882a593Smuzhiyun             stChnAttr.u32FgAlpha = 128;
1262*4882a593Smuzhiyun             stChnAttr.u32BgAlpha = 0;
1263*4882a593Smuzhiyun         } else {
1264*4882a593Smuzhiyun             stChnAttr.u32FgAlpha = 0;
1265*4882a593Smuzhiyun             stChnAttr.u32BgAlpha = 128;
1266*4882a593Smuzhiyun         }
1267*4882a593Smuzhiyun 
1268*4882a593Smuzhiyun         s32Ret = RK_MPI_VO_SetChnAttr(VoLayer, i, &stChnAttr);
1269*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
1270*4882a593Smuzhiyun             Sample_Print("[%s] set chn Attr failed\n", __func__);
1271*4882a593Smuzhiyun             return RK_FAILURE;
1272*4882a593Smuzhiyun         }
1273*4882a593Smuzhiyun 
1274*4882a593Smuzhiyun         s32Ret = RK_MPI_VO_EnableChn(VoLayer, i);
1275*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
1276*4882a593Smuzhiyun             Sample_Print("[%s] Enalbe chn failed\n", __func__);
1277*4882a593Smuzhiyun             return RK_FAILURE;
1278*4882a593Smuzhiyun         }
1279*4882a593Smuzhiyun     }
1280*4882a593Smuzhiyun 
1281*4882a593Smuzhiyun     Sample_Print("[%s] success\n", __func__);
1282*4882a593Smuzhiyun     return s32Ret;
1283*4882a593Smuzhiyun }
1284*4882a593Smuzhiyun 
1285*4882a593Smuzhiyun static RK_S32 Sample_VO_MultiWindowns_Start(TEST_VO_CTX_S *ctx) {
1286*4882a593Smuzhiyun     VO_VIDEO_LAYER_ATTR_S    stLayerAttr;
1287*4882a593Smuzhiyun     VO_CHN_ATTR_S            stChnAttr;
1288*4882a593Smuzhiyun     VO_CHN_PARAM_S           stChnParam;
1289*4882a593Smuzhiyun     VO_BORDER_S              stBorder;
1290*4882a593Smuzhiyun     RK_U32                   u32Row, u32Column, i;
1291*4882a593Smuzhiyun     RK_U32                   u32WinWidth, u32WinHeight;
1292*4882a593Smuzhiyun     RK_U32                   u32X, u32Y;
1293*4882a593Smuzhiyun     RK_S32                   s32Ret = RK_SUCCESS;
1294*4882a593Smuzhiyun     RK_U32 disp_width = 1920;
1295*4882a593Smuzhiyun     RK_U32 disp_height = 1080;
1296*4882a593Smuzhiyun 
1297*4882a593Smuzhiyun     if (ctx->u32Windows <= 2)
1298*4882a593Smuzhiyun         u32Row = 1;
1299*4882a593Smuzhiyun     else if (ctx->u32Windows <= 4)
1300*4882a593Smuzhiyun         u32Row = 2;
1301*4882a593Smuzhiyun     else if (ctx->u32Windows <= 9)
1302*4882a593Smuzhiyun         u32Row = 3;
1303*4882a593Smuzhiyun     else if (ctx->u32Windows <= 16)
1304*4882a593Smuzhiyun         u32Row = 4;
1305*4882a593Smuzhiyun     else if (ctx->u32Windows <= 36)
1306*4882a593Smuzhiyun         u32Row = 6;
1307*4882a593Smuzhiyun     else if (ctx->u32Windows <= 64)
1308*4882a593Smuzhiyun         u32Row = 8;
1309*4882a593Smuzhiyun     else
1310*4882a593Smuzhiyun         return RK_FAILURE;
1311*4882a593Smuzhiyun 
1312*4882a593Smuzhiyun     u32Column = ctx->u32Windows / u32Row + ((ctx->u32Windows % u32Row)? 1: 0);
1313*4882a593Smuzhiyun 
1314*4882a593Smuzhiyun     s32Ret = RK_MPI_VO_GetLayerAttr(ctx->VoLayer, &stLayerAttr);
1315*4882a593Smuzhiyun 
1316*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS)
1317*4882a593Smuzhiyun         return RK_FAILURE;
1318*4882a593Smuzhiyun 
1319*4882a593Smuzhiyun     u32WinWidth = stLayerAttr.stDispRect.u32Width / u32Column;
1320*4882a593Smuzhiyun     u32WinHeight = stLayerAttr.stDispRect.u32Height / u32Row;
1321*4882a593Smuzhiyun 
1322*4882a593Smuzhiyun     for (i = 0; i <ctx->u32Windows; i++) {
1323*4882a593Smuzhiyun         u32X = i % u32Column;
1324*4882a593Smuzhiyun         u32Y = i / u32Column;
1325*4882a593Smuzhiyun         stChnAttr.stRect.s32X = stLayerAttr.stDispRect.s32X + u32X * u32WinWidth;
1326*4882a593Smuzhiyun         stChnAttr.stRect.s32Y = stLayerAttr.stDispRect.s32Y + u32Y * u32WinHeight;
1327*4882a593Smuzhiyun         stChnAttr.stRect.u32Width = u32WinWidth;
1328*4882a593Smuzhiyun         stChnAttr.stRect.u32Height = u32WinHeight;
1329*4882a593Smuzhiyun         stChnAttr.u32FgAlpha = 255;
1330*4882a593Smuzhiyun         stChnAttr.u32BgAlpha = 0;
1331*4882a593Smuzhiyun         // set priority
1332*4882a593Smuzhiyun         stChnAttr.u32Priority = 1;
1333*4882a593Smuzhiyun 
1334*4882a593Smuzhiyun         s32Ret = RK_MPI_VO_SetChnAttr(ctx->VoLayer, i, &stChnAttr);
1335*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS)
1336*4882a593Smuzhiyun             return RK_FAILURE;
1337*4882a593Smuzhiyun 
1338*4882a593Smuzhiyun         // set video aspect ratio
1339*4882a593Smuzhiyun         if (ctx->uEnMode == 2) {
1340*4882a593Smuzhiyun             stChnParam.stAspectRatio.enMode = ASPECT_RATIO_MANUAL;
1341*4882a593Smuzhiyun             stChnParam.stAspectRatio.stVideoRect.s32X = stLayerAttr.stDispRect.s32X + u32X * u32WinWidth;
1342*4882a593Smuzhiyun             stChnParam.stAspectRatio.stVideoRect.s32Y = stLayerAttr.stDispRect.s32Y + u32Y * u32WinHeight;
1343*4882a593Smuzhiyun             stChnParam.stAspectRatio.stVideoRect.u32Width = u32WinWidth/2;
1344*4882a593Smuzhiyun             stChnParam.stAspectRatio.stVideoRect.u32Height = u32WinHeight/2;
1345*4882a593Smuzhiyun             RK_MPI_VO_SetChnParam(ctx->VoLayer, i, &stChnParam);
1346*4882a593Smuzhiyun         } else if (ctx->uEnMode == 1) {
1347*4882a593Smuzhiyun             stChnParam.stAspectRatio.enMode = ASPECT_RATIO_AUTO;
1348*4882a593Smuzhiyun             stChnParam.stAspectRatio.stVideoRect.s32X = stLayerAttr.stDispRect.s32X + u32X * u32WinWidth;
1349*4882a593Smuzhiyun             stChnParam.stAspectRatio.stVideoRect.s32Y = stLayerAttr.stDispRect.s32Y + u32Y * u32WinHeight;
1350*4882a593Smuzhiyun             stChnParam.stAspectRatio.stVideoRect.u32Width = u32WinWidth;
1351*4882a593Smuzhiyun             stChnParam.stAspectRatio.stVideoRect.u32Height = u32WinHeight;
1352*4882a593Smuzhiyun             RK_MPI_VO_SetChnParam(ctx->VoLayer, i, &stChnParam);
1353*4882a593Smuzhiyun         }
1354*4882a593Smuzhiyun 
1355*4882a593Smuzhiyun         stBorder.stBorder.u32Color = 0xFFFAFA;
1356*4882a593Smuzhiyun         stBorder.stBorder.u32TopWidth = ctx->stBorderCfg.u32TopWidth;
1357*4882a593Smuzhiyun         stBorder.stBorder.u32BottomWidth = ctx->stBorderCfg.u32BottomWidth;
1358*4882a593Smuzhiyun         stBorder.stBorder.u32LeftWidth = ctx->stBorderCfg.u32LeftWidth;
1359*4882a593Smuzhiyun         stBorder.stBorder.u32RightWidth = ctx->stBorderCfg.u32RightWidth;
1360*4882a593Smuzhiyun         stBorder.bBorderEn = ctx->bBorder;
1361*4882a593Smuzhiyun         s32Ret = RK_MPI_VO_SetChnBorder(ctx->VoLayer, i, &stBorder);
1362*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS)
1363*4882a593Smuzhiyun             return RK_FAILURE;
1364*4882a593Smuzhiyun 
1365*4882a593Smuzhiyun         s32Ret = RK_MPI_VO_EnableChn(ctx->VoLayer, i);
1366*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS)
1367*4882a593Smuzhiyun             return RK_FAILURE;
1368*4882a593Smuzhiyun     }
1369*4882a593Smuzhiyun 
1370*4882a593Smuzhiyun     return s32Ret;
1371*4882a593Smuzhiyun }
1372*4882a593Smuzhiyun 
1373*4882a593Smuzhiyun static RK_S32 Sample_VO_MultiWindowns_Stop(VO_LAYER VoLayer, RK_U32 u32Windows) {
1374*4882a593Smuzhiyun     RK_U32 i;
1375*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
1376*4882a593Smuzhiyun 
1377*4882a593Smuzhiyun     for (i = 0; i < u32Windows; i++) {
1378*4882a593Smuzhiyun         s32Ret = RK_MPI_VO_DisableChn(VoLayer, i);
1379*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS)
1380*4882a593Smuzhiyun             return RK_FAILURE;
1381*4882a593Smuzhiyun     }
1382*4882a593Smuzhiyun 
1383*4882a593Smuzhiyun     return s32Ret;
1384*4882a593Smuzhiyun }
1385*4882a593Smuzhiyun 
1386*4882a593Smuzhiyun static RK_S32 Sample_VO_StartDev(VO_DEV VoDev, VO_PUB_ATTR_S *pstPubAttr) {
1387*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
1388*4882a593Smuzhiyun 
1389*4882a593Smuzhiyun     s32Ret = RK_MPI_VO_SetPubAttr(VoDev, pstPubAttr);
1390*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS)
1391*4882a593Smuzhiyun         return RK_FAILURE;
1392*4882a593Smuzhiyun 
1393*4882a593Smuzhiyun     s32Ret = RK_MPI_VO_Enable(VoDev);
1394*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS)
1395*4882a593Smuzhiyun         return RK_FAILURE;
1396*4882a593Smuzhiyun 
1397*4882a593Smuzhiyun      return s32Ret;
1398*4882a593Smuzhiyun }
1399*4882a593Smuzhiyun 
1400*4882a593Smuzhiyun static RK_S32 Sample_VO_StopDev(VO_DEV VoDev) {
1401*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
1402*4882a593Smuzhiyun 
1403*4882a593Smuzhiyun     s32Ret = RK_MPI_VO_Disable(VoDev);
1404*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS)
1405*4882a593Smuzhiyun         return RK_FAILURE;
1406*4882a593Smuzhiyun 
1407*4882a593Smuzhiyun     return s32Ret;
1408*4882a593Smuzhiyun }
1409*4882a593Smuzhiyun 
1410*4882a593Smuzhiyun static RK_S32 Sample_VO_StartLayer(VO_LAYER VoLayer, const VO_VIDEO_LAYER_ATTR_S *pstLayerAttr) {
1411*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
1412*4882a593Smuzhiyun 
1413*4882a593Smuzhiyun     s32Ret = RK_MPI_VO_SetLayerAttr(VoLayer, pstLayerAttr);
1414*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS)
1415*4882a593Smuzhiyun         return RK_FAILURE;
1416*4882a593Smuzhiyun 
1417*4882a593Smuzhiyun     s32Ret = RK_MPI_VO_EnableLayer(VoLayer);
1418*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS)
1419*4882a593Smuzhiyun         return RK_FAILURE;
1420*4882a593Smuzhiyun 
1421*4882a593Smuzhiyun     return s32Ret;
1422*4882a593Smuzhiyun }
1423*4882a593Smuzhiyun 
1424*4882a593Smuzhiyun static RK_S32 Sample_VO_StopLayer(VO_LAYER VoLayer) {
1425*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
1426*4882a593Smuzhiyun 
1427*4882a593Smuzhiyun     s32Ret = RK_MPI_VO_DisableLayer(VoLayer);
1428*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS)
1429*4882a593Smuzhiyun         return RK_FAILURE;
1430*4882a593Smuzhiyun 
1431*4882a593Smuzhiyun     return s32Ret;
1432*4882a593Smuzhiyun }
1433*4882a593Smuzhiyun 
1434*4882a593Smuzhiyun static RK_S32 Sample_VO_SetVFrame(VIDEO_FRAME_INFO_S *pVFrame,
1435*4882a593Smuzhiyun                                    RK_U32              u32Width,
1436*4882a593Smuzhiyun                                    RK_U32              u32Height,
1437*4882a593Smuzhiyun                                    RK_U32              u32VirWidth,
1438*4882a593Smuzhiyun                                    RK_U32              u32VirHeight,
1439*4882a593Smuzhiyun                                    PIXEL_FORMAT_E      enPixelFormat,
1440*4882a593Smuzhiyun                                    RK_VOID             *pMblk) {
1441*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
1442*4882a593Smuzhiyun 
1443*4882a593Smuzhiyun     if (pVFrame == NULL && pMblk == NULL)
1444*4882a593Smuzhiyun         return RK_FAILURE;
1445*4882a593Smuzhiyun 
1446*4882a593Smuzhiyun     if (!u32Width || !u32Height ||
1447*4882a593Smuzhiyun         !u32VirWidth || !u32VirHeight ||
1448*4882a593Smuzhiyun         enPixelFormat >= RK_FMT_BUTT)
1449*4882a593Smuzhiyun         s32Ret = RK_FAILURE;
1450*4882a593Smuzhiyun 
1451*4882a593Smuzhiyun     pVFrame->stVFrame.pMbBlk = pMblk;
1452*4882a593Smuzhiyun     pVFrame->stVFrame.u32Width = u32Width;
1453*4882a593Smuzhiyun     pVFrame->stVFrame.u32Height = u32Height;
1454*4882a593Smuzhiyun     pVFrame->stVFrame.u32VirWidth = u32VirWidth;
1455*4882a593Smuzhiyun     pVFrame->stVFrame.u32VirHeight = u32VirHeight;
1456*4882a593Smuzhiyun     pVFrame->stVFrame.enPixelFormat = enPixelFormat;
1457*4882a593Smuzhiyun 
1458*4882a593Smuzhiyun     return s32Ret;
1459*4882a593Smuzhiyun }
1460*4882a593Smuzhiyun static RK_S32 Sample_VO_BindVoWbc(VO_DEV VoWbcDev, VO_LAYER VoLayer, VO_CHN VoChn) {
1461*4882a593Smuzhiyun     MPP_CHN_S stSrcChn, stDestChn;
1462*4882a593Smuzhiyun 
1463*4882a593Smuzhiyun     stSrcChn.enModId    = RK_ID_WBC;
1464*4882a593Smuzhiyun     stSrcChn.s32DevId   = VoWbcDev;
1465*4882a593Smuzhiyun     stSrcChn.s32ChnId   = 0;
1466*4882a593Smuzhiyun 
1467*4882a593Smuzhiyun     stDestChn.enModId   = RK_ID_VO;
1468*4882a593Smuzhiyun     stDestChn.s32ChnId  = VoChn;
1469*4882a593Smuzhiyun     stDestChn.s32DevId  = VoLayer;
1470*4882a593Smuzhiyun 
1471*4882a593Smuzhiyun     return RK_MPI_SYS_Bind(&stSrcChn, &stDestChn);
1472*4882a593Smuzhiyun }
1473*4882a593Smuzhiyun 
1474*4882a593Smuzhiyun static RK_S32 Sample_VO_UnBindVoWbc(VO_DEV VoWbcDev, VO_LAYER VoLayer, VO_CHN VoChn) {
1475*4882a593Smuzhiyun     MPP_CHN_S stSrcChn, stDestChn;
1476*4882a593Smuzhiyun 
1477*4882a593Smuzhiyun     stSrcChn.enModId    = RK_ID_WBC;
1478*4882a593Smuzhiyun     stSrcChn.s32DevId   = VoWbcDev;
1479*4882a593Smuzhiyun     stSrcChn.s32ChnId   = 0;
1480*4882a593Smuzhiyun 
1481*4882a593Smuzhiyun     stDestChn.enModId   = RK_ID_VO;
1482*4882a593Smuzhiyun     stDestChn.s32ChnId  = VoChn;
1483*4882a593Smuzhiyun     stDestChn.s32DevId  = VoLayer;
1484*4882a593Smuzhiyun 
1485*4882a593Smuzhiyun     return RK_MPI_SYS_UnBind(&stSrcChn, &stDestChn);
1486*4882a593Smuzhiyun }
1487*4882a593Smuzhiyun 
1488*4882a593Smuzhiyun static RK_S32 Sample_VO_CreateGFXData(RK_U32 u32Width, RK_U32 u32Height, RK_U32 foramt, RK_U32 value, RK_VOID **pMblk) {
1489*4882a593Smuzhiyun     VO_FRAME_INFO_S stFrameInfo;
1490*4882a593Smuzhiyun     RK_U32 u32BuffSize;
1491*4882a593Smuzhiyun 
1492*4882a593Smuzhiyun     u32BuffSize = RK_MPI_VO_CreateGraphicsFrameBuffer(u32Width, u32Height, foramt, pMblk);
1493*4882a593Smuzhiyun     if (u32BuffSize == 0) {
1494*4882a593Smuzhiyun         Sample_Print("can not create gfx buffer\n");
1495*4882a593Smuzhiyun         return RK_FAILURE;
1496*4882a593Smuzhiyun     }
1497*4882a593Smuzhiyun 
1498*4882a593Smuzhiyun     RK_MPI_VO_GetFrameInfo(*pMblk, &stFrameInfo);
1499*4882a593Smuzhiyun     if (foramt == RK_FMT_RGB888) {
1500*4882a593Smuzhiyun         if (u32Width == 1920 && u32Height == 1080 && value == 0)
1501*4882a593Smuzhiyun             Sample_VO_GetPictureData(&stFrameInfo, "/userdata/test/vo/res_1080P_RGB_0.yuv");
1502*4882a593Smuzhiyun         else if (u32Width == 1920 && u32Height == 1080 && value == 1 )
1503*4882a593Smuzhiyun             Sample_VO_GetPictureData(&stFrameInfo, "/userdata/test/vo/res_1080P_RGB_1.yuv");
1504*4882a593Smuzhiyun         else if (u32Width == 1024 && u32Height == 768 && value == 0 )
1505*4882a593Smuzhiyun             Sample_VO_GetPictureData(&stFrameInfo, "/userdata/test/vo/res_768P_RGB_0.yuv");
1506*4882a593Smuzhiyun         else if (u32Width == 1024 && u32Height == 768 && value == 1)
1507*4882a593Smuzhiyun             Sample_VO_GetPictureData(&stFrameInfo, "/userdata/test/vo/res_768P_RGB_1.yuv");
1508*4882a593Smuzhiyun         else
1509*4882a593Smuzhiyun             Sample_VO_GetPictureData(&stFrameInfo, "/userdata/test/vo/res_480P_RGB.yuv");
1510*4882a593Smuzhiyun     } else if (foramt == RK_FMT_RGBA8888) {
1511*4882a593Smuzhiyun         if (u32Width == 1920 && u32Height == 1080 && value == 0 )
1512*4882a593Smuzhiyun             Sample_VO_GetPictureData(&stFrameInfo, "/userdata/test/vo/res_1080P_RGBA.yuv");
1513*4882a593Smuzhiyun         else if (u32Width == 1920 && u32Height == 1080 && value == 1 )
1514*4882a593Smuzhiyun             Sample_VO_GetPictureData(&stFrameInfo, "/userdata/test/vo/res_1080P2_RGBA.yuv");
1515*4882a593Smuzhiyun         else if (u32Width == 1024 && u32Height == 768)
1516*4882a593Smuzhiyun             Sample_VO_GetPictureData(&stFrameInfo, "/userdata/test/vo/res_768P_RGBA.yuv");
1517*4882a593Smuzhiyun         else
1518*4882a593Smuzhiyun             Sample_VO_GetPictureData(&stFrameInfo, "/userdata/test/vo/res_480P_RGBA.yuv");
1519*4882a593Smuzhiyun     } else {
1520*4882a593Smuzhiyun         Sample_VO_DrawUI(&stFrameInfo, foramt, value);
1521*4882a593Smuzhiyun     }
1522*4882a593Smuzhiyun 
1523*4882a593Smuzhiyun     return RK_SUCCESS;
1524*4882a593Smuzhiyun }
1525*4882a593Smuzhiyun 
1526*4882a593Smuzhiyun static RK_VOID * Sample_VO_SendPicture_Mosaic(RK_VOID *pArg) {
1527*4882a593Smuzhiyun     VoThreadParam *pParam = reinterpret_cast<VoThreadParam *>(pArg);
1528*4882a593Smuzhiyun     VIDEO_FRAME_INFO_S *pstVFrame;
1529*4882a593Smuzhiyun     RK_VOID *pMblk, *pMblk_1080P, *pMblk_1080P2, *pMblk_768P, *pMblk_480P, *pMblk_G0, *pMblk_G1;
1530*4882a593Smuzhiyun     RK_U32 count;
1531*4882a593Smuzhiyun 
1532*4882a593Smuzhiyun     Sample_VO_CreateGFXData(1920, 1080, RK_FMT_RGBA8888, 0, &pMblk_1080P);
1533*4882a593Smuzhiyun     Sample_VO_CreateGFXData(1920, 1080, RK_FMT_RGBA8888, 1, &pMblk_1080P2);
1534*4882a593Smuzhiyun     Sample_VO_CreateGFXData(720,  480,  RK_FMT_RGBA8888, 0, &pMblk_480P);
1535*4882a593Smuzhiyun     Sample_VO_CreateGFXData(1024, 768,  RK_FMT_RGBA8888, 0, &pMblk_768P);
1536*4882a593Smuzhiyun     Sample_VO_CreateGFXData(1920, 1080, RK_FMT_BGRA5551, 0x1F, &pMblk_G0);
1537*4882a593Smuzhiyun     Sample_VO_CreateGFXData(1920, 1080, RK_FMT_BGRA5551, 0x1F << 10, &pMblk_G1);
1538*4882a593Smuzhiyun 
1539*4882a593Smuzhiyun     pstVFrame = reinterpret_cast<VIDEO_FRAME_INFO_S *>(malloc(sizeof(VIDEO_FRAME_INFO_S)));
1540*4882a593Smuzhiyun 
1541*4882a593Smuzhiyun     while (!pParam->u32Exit) {
1542*4882a593Smuzhiyun         if (pParam->VoVideoLayer >= 0) {
1543*4882a593Smuzhiyun             for (RK_U32 i = 0; i < pParam->u32VideoWindows; i++) {
1544*4882a593Smuzhiyun                 if (pParam->u32VideoWindows > 10) {
1545*4882a593Smuzhiyun                     pstVFrame->stVFrame.u32Width = 720;
1546*4882a593Smuzhiyun                     pstVFrame->stVFrame.u32Height = 480;
1547*4882a593Smuzhiyun                     pstVFrame->stVFrame.u32VirWidth = 720;
1548*4882a593Smuzhiyun                     pstVFrame->stVFrame.u32VirHeight = 480;
1549*4882a593Smuzhiyun                     pstVFrame->stVFrame.enPixelFormat = RK_FMT_RGBA8888;
1550*4882a593Smuzhiyun                     pMblk = pMblk_480P;
1551*4882a593Smuzhiyun                 } else if (count % 2) {
1552*4882a593Smuzhiyun                     pMblk = pMblk_1080P;
1553*4882a593Smuzhiyun                     pstVFrame->stVFrame.u32Width = 1920;
1554*4882a593Smuzhiyun                     pstVFrame->stVFrame.u32Height = 1080;
1555*4882a593Smuzhiyun                     pstVFrame->stVFrame.u32VirWidth = 1920;
1556*4882a593Smuzhiyun                     pstVFrame->stVFrame.u32VirHeight = 1080;
1557*4882a593Smuzhiyun                     pstVFrame->stVFrame.enPixelFormat = RK_FMT_RGBA8888;
1558*4882a593Smuzhiyun                     pstVFrame->stVFrame.pMbBlk = pMblk;
1559*4882a593Smuzhiyun                 } else {
1560*4882a593Smuzhiyun                     pMblk = pMblk_1080P2;
1561*4882a593Smuzhiyun                     pstVFrame->stVFrame.u32Width = 1920;
1562*4882a593Smuzhiyun                     pstVFrame->stVFrame.u32Height = 1080;
1563*4882a593Smuzhiyun                     pstVFrame->stVFrame.u32VirWidth = 1920;
1564*4882a593Smuzhiyun                     pstVFrame->stVFrame.u32VirHeight = 1080;
1565*4882a593Smuzhiyun                     pstVFrame->stVFrame.enPixelFormat = RK_FMT_RGBA8888;
1566*4882a593Smuzhiyun                     pstVFrame->stVFrame.pMbBlk = pMblk;
1567*4882a593Smuzhiyun                 }
1568*4882a593Smuzhiyun 
1569*4882a593Smuzhiyun                 pstVFrame->stVFrame.pMbBlk = pMblk;
1570*4882a593Smuzhiyun                 RK_MPI_VO_SendFrame(pParam->VoVideoLayer, i, pstVFrame, 0);
1571*4882a593Smuzhiyun             }
1572*4882a593Smuzhiyun         }
1573*4882a593Smuzhiyun         if (pParam->VOGfxLayer >= 0) {
1574*4882a593Smuzhiyun             for (RK_U32 i = 0; i < pParam->u32GFXLayers; i++) {
1575*4882a593Smuzhiyun                 if (i == 0)
1576*4882a593Smuzhiyun                     pMblk = pMblk_G0;
1577*4882a593Smuzhiyun                 else if (i == 1)
1578*4882a593Smuzhiyun                     pMblk = pMblk_G1;
1579*4882a593Smuzhiyun                 else
1580*4882a593Smuzhiyun                    continue;
1581*4882a593Smuzhiyun 
1582*4882a593Smuzhiyun                 pstVFrame->stVFrame.u32Width = 1920;
1583*4882a593Smuzhiyun                 pstVFrame->stVFrame.u32Height = 1080;
1584*4882a593Smuzhiyun                 pstVFrame->stVFrame.u32VirWidth = 1920;
1585*4882a593Smuzhiyun                 pstVFrame->stVFrame.u32VirHeight = 1080;
1586*4882a593Smuzhiyun                 pstVFrame->stVFrame.enPixelFormat = RK_FMT_BGRA5551;
1587*4882a593Smuzhiyun                 pstVFrame->stVFrame.pMbBlk = pMblk;
1588*4882a593Smuzhiyun                 RK_MPI_VO_SendFrame(pParam->VOGfxLayer, i, pstVFrame, 0);
1589*4882a593Smuzhiyun             }
1590*4882a593Smuzhiyun         }
1591*4882a593Smuzhiyun         usleep(1000000);
1592*4882a593Smuzhiyun         count++;
1593*4882a593Smuzhiyun     }
1594*4882a593Smuzhiyun     free(pstVFrame);
1595*4882a593Smuzhiyun     RK_MPI_VO_DestroyGraphicsFrameBuffer(pMblk);
1596*4882a593Smuzhiyun     Sample_Print("%s exit\n", __func__);
1597*4882a593Smuzhiyun 
1598*4882a593Smuzhiyun     return NULL;
1599*4882a593Smuzhiyun }
1600*4882a593Smuzhiyun 
1601*4882a593Smuzhiyun static RK_VOID Sample_VO_StartSendPicture_Mosaic(pthread_t *pThreadID, VoThreadParam *pstParam) {
1602*4882a593Smuzhiyun     pthread_create(pThreadID, NULL, Sample_VO_SendPicture_Mosaic, reinterpret_cast<RK_VOID *>(pstParam));
1603*4882a593Smuzhiyun }
1604*4882a593Smuzhiyun 
1605*4882a593Smuzhiyun static RK_VOID Sample_VO_StopSendPicture_Mosaic(pthread_t tThreadID, VoThreadParam *pstParam) {
1606*4882a593Smuzhiyun     pstParam->u32Exit = 1;
1607*4882a593Smuzhiyun     pthread_join(tThreadID, RK_NULL);
1608*4882a593Smuzhiyun }
1609*4882a593Smuzhiyun 
1610*4882a593Smuzhiyun static RK_S32 Sample_VO_Demo_Video_Mosaic(TEST_VO_CTX_S *ctx) {
1611*4882a593Smuzhiyun     VO_PUB_ATTR_S            stVoPubAttr;
1612*4882a593Smuzhiyun     VO_VIDEO_LAYER_ATTR_S    stLayerAttr;
1613*4882a593Smuzhiyun     RK_U32                   u32DispWidth, u32DispHeight;
1614*4882a593Smuzhiyun     RK_U32                   u32ImageWidth, u32ImageHeight;
1615*4882a593Smuzhiyun     VO_LAYER                 VoLayer;
1616*4882a593Smuzhiyun     VO_DEV                   VoDev;
1617*4882a593Smuzhiyun     RK_S32                   u32Windows;
1618*4882a593Smuzhiyun     RK_U32                   u32Fps, i;
1619*4882a593Smuzhiyun     pthread_t                tThreadID;
1620*4882a593Smuzhiyun     RK_S32                   s32Ret = RK_SUCCESS;
1621*4882a593Smuzhiyun     VO_LAYER_MODE_E          Vo_layer_mode;
1622*4882a593Smuzhiyun     VoThreadParam            stThreadParam;
1623*4882a593Smuzhiyun     PIXEL_FORMAT_E           video_format;
1624*4882a593Smuzhiyun 
1625*4882a593Smuzhiyun     VoDev = ctx->VoDev;
1626*4882a593Smuzhiyun     u32Windows = ctx->u32Windows;
1627*4882a593Smuzhiyun     u32Fps =  ctx->u32DispFrmRt;
1628*4882a593Smuzhiyun     VoLayer = ctx->VoLayer;
1629*4882a593Smuzhiyun     for (RK_U32 j = 0; j < VDEC_ARRAY_ELEMS(testPixelFormat); j++) {
1630*4882a593Smuzhiyun         if (ctx->s32PixFormat == testPixelFormat[j].index) {
1631*4882a593Smuzhiyun             video_format =  testPixelFormat[j].format;
1632*4882a593Smuzhiyun             break;
1633*4882a593Smuzhiyun         }
1634*4882a593Smuzhiyun     }
1635*4882a593Smuzhiyun 
1636*4882a593Smuzhiyun     Sample_Print("%s VoDev %u Windows %u video_format %x\n", __func__, VoDev, u32Windows, video_format);
1637*4882a593Smuzhiyun 
1638*4882a593Smuzhiyun     /* Bind Layer */
1639*4882a593Smuzhiyun     switch (ctx->VoLayerMode) {
1640*4882a593Smuzhiyun         case 0:
1641*4882a593Smuzhiyun             Vo_layer_mode = VO_LAYER_MODE_CURSOR;
1642*4882a593Smuzhiyun             break;
1643*4882a593Smuzhiyun         case 1:
1644*4882a593Smuzhiyun             Vo_layer_mode = VO_LAYER_MODE_GRAPHIC;
1645*4882a593Smuzhiyun             break;
1646*4882a593Smuzhiyun         case 2:
1647*4882a593Smuzhiyun             Vo_layer_mode = VO_LAYER_MODE_VIDEO;
1648*4882a593Smuzhiyun             break;
1649*4882a593Smuzhiyun         default:
1650*4882a593Smuzhiyun             Vo_layer_mode = VO_LAYER_MODE_VIDEO;
1651*4882a593Smuzhiyun     }
1652*4882a593Smuzhiyun 
1653*4882a593Smuzhiyun     RK_MPI_VO_BindLayer(VoLayer, VoDev, Vo_layer_mode);
1654*4882a593Smuzhiyun 
1655*4882a593Smuzhiyun     switch (ctx->enIntfType) {
1656*4882a593Smuzhiyun         case DISPLAY_TYPE_VGA:
1657*4882a593Smuzhiyun             stVoPubAttr.enIntfType = VO_INTF_VGA;
1658*4882a593Smuzhiyun             break;
1659*4882a593Smuzhiyun         case DISPLAY_TYPE_HDMI:
1660*4882a593Smuzhiyun             stVoPubAttr.enIntfType = VO_INTF_HDMI;
1661*4882a593Smuzhiyun             break;
1662*4882a593Smuzhiyun         case DISPLAY_TYPE_EDP:
1663*4882a593Smuzhiyun             stVoPubAttr.enIntfType = VO_INTF_EDP;
1664*4882a593Smuzhiyun             break;
1665*4882a593Smuzhiyun         case DISPLAY_TYPE_DP:
1666*4882a593Smuzhiyun             stVoPubAttr.enIntfType = VO_INTF_DP;
1667*4882a593Smuzhiyun             break;
1668*4882a593Smuzhiyun         case DISPLAY_TYPE_HDMI_EDP :
1669*4882a593Smuzhiyun             stVoPubAttr.enIntfType = VO_INTF_HDMI | VO_INTF_EDP;
1670*4882a593Smuzhiyun             break;
1671*4882a593Smuzhiyun         default:
1672*4882a593Smuzhiyun             stVoPubAttr.enIntfType = VO_INTF_HDMI;
1673*4882a593Smuzhiyun             Sample_Print("IntfType not set,use INTF_HDMI default\n");
1674*4882a593Smuzhiyun     }
1675*4882a593Smuzhiyun 
1676*4882a593Smuzhiyun     for (i = 0; i < ARRAY_LENGTH(test_mode_table); i++) {
1677*4882a593Smuzhiyun         if (ctx->enIntfSync == test_mode_table[i].mode)
1678*4882a593Smuzhiyun             break;
1679*4882a593Smuzhiyun     }
1680*4882a593Smuzhiyun 
1681*4882a593Smuzhiyun     if (i == ARRAY_LENGTH(test_mode_table)) {
1682*4882a593Smuzhiyun         Sample_Print("%s not found supported mode in test mode_table\n", __func__);
1683*4882a593Smuzhiyun         return RK_FAILURE;
1684*4882a593Smuzhiyun     }
1685*4882a593Smuzhiyun 
1686*4882a593Smuzhiyun     stVoPubAttr.enIntfSync = test_mode_table[i].enIntfSync;
1687*4882a593Smuzhiyun     stVoPubAttr.u32BgColor = 0x000000;
1688*4882a593Smuzhiyun     Sample_VO_StartDev(VoDev, &stVoPubAttr);
1689*4882a593Smuzhiyun 
1690*4882a593Smuzhiyun      /* Enable Layer */
1691*4882a593Smuzhiyun     stLayerAttr.enPixFormat           = video_format;
1692*4882a593Smuzhiyun     stLayerAttr.stDispRect.s32X       = 0;
1693*4882a593Smuzhiyun     stLayerAttr.stDispRect.s32Y       = 0;
1694*4882a593Smuzhiyun     Sample_VO_GetDisplaySize(stVoPubAttr.enIntfSync, &u32DispWidth, &u32DispHeight);
1695*4882a593Smuzhiyun 
1696*4882a593Smuzhiyun     u32ImageWidth  = u32DispWidth;
1697*4882a593Smuzhiyun     u32ImageHeight = u32DispHeight;
1698*4882a593Smuzhiyun     stLayerAttr.stDispRect.u32Width   = u32DispWidth;
1699*4882a593Smuzhiyun     stLayerAttr.stDispRect.u32Height  = u32DispHeight;
1700*4882a593Smuzhiyun     stLayerAttr.stImageSize.u32Width  = u32ImageWidth;
1701*4882a593Smuzhiyun     stLayerAttr.stImageSize.u32Height = u32ImageHeight;
1702*4882a593Smuzhiyun     stLayerAttr.u32DispFrmRt          = ctx->u32DispFrmRt;
1703*4882a593Smuzhiyun 
1704*4882a593Smuzhiyun     Sample_VO_StartLayer(VoLayer, &stLayerAttr);
1705*4882a593Smuzhiyun     Sample_VO_MultiWindowns_Start(ctx);
1706*4882a593Smuzhiyun     stThreadParam.u32Exit = 0;
1707*4882a593Smuzhiyun     stThreadParam.u32VideoWindows = u32Windows;
1708*4882a593Smuzhiyun     stThreadParam.VoVideoLayer = VoLayer;
1709*4882a593Smuzhiyun     stThreadParam.VOGfxLayer = -1;
1710*4882a593Smuzhiyun     stThreadParam.u32GFXLayers = -1;
1711*4882a593Smuzhiyun 
1712*4882a593Smuzhiyun     Sample_Print("Start Send Picture\n");
1713*4882a593Smuzhiyun     Sample_VO_StartSendPicture_Mosaic(&tThreadID, &stThreadParam);
1714*4882a593Smuzhiyun 
1715*4882a593Smuzhiyun     while (1) {
1716*4882a593Smuzhiyun         Sample_Print("Press 'q' to quit\n");
1717*4882a593Smuzhiyun         if (getchar() == 'q')
1718*4882a593Smuzhiyun             break;
1719*4882a593Smuzhiyun     }
1720*4882a593Smuzhiyun 
1721*4882a593Smuzhiyun     Sample_VO_StopSendPicture_Mosaic(tThreadID, &stThreadParam);
1722*4882a593Smuzhiyun     Sample_VO_MultiWindowns_Stop(VoLayer, u32Windows);
1723*4882a593Smuzhiyun     Sample_VO_StopLayer(VoLayer);
1724*4882a593Smuzhiyun     Sample_VO_StopDev(VoDev);
1725*4882a593Smuzhiyun  end:
1726*4882a593Smuzhiyun     RK_MPI_VO_UnBindLayer(VoLayer, VoDev);
1727*4882a593Smuzhiyun     RK_MPI_VO_CloseFd();
1728*4882a593Smuzhiyun 
1729*4882a593Smuzhiyun     return s32Ret;
1730*4882a593Smuzhiyun }
1731*4882a593Smuzhiyun 
1732*4882a593Smuzhiyun static RK_S32 Sample_VO_Demo_UI(TEST_VO_CTX_S *ctx) {
1733*4882a593Smuzhiyun     VO_PUB_ATTR_S            stVoPubAttr;
1734*4882a593Smuzhiyun     VO_VIDEO_LAYER_ATTR_S    stLayerAttr;
1735*4882a593Smuzhiyun     VIDEO_FRAME_INFO_S       *pstVFrame;
1736*4882a593Smuzhiyun     RK_U32                   u32DispWidth, u32DispHeight;
1737*4882a593Smuzhiyun     RK_U32                   u32ImgWidth, u32ImgHeight;
1738*4882a593Smuzhiyun     VO_LAYER                 VoLayer;
1739*4882a593Smuzhiyun     RK_S32                   VoDev;
1740*4882a593Smuzhiyun     RK_S32                   VoDev_second;
1741*4882a593Smuzhiyun     VO_LAYER                 VoLayer_second;
1742*4882a593Smuzhiyun     RK_VOID *pMblk_1080P_1   = RK_NULL;
1743*4882a593Smuzhiyun     RK_VOID *pMblk_1080P_2   = RK_NULL;
1744*4882a593Smuzhiyun     RK_VOID *pMblk_768P_1    = RK_NULL;
1745*4882a593Smuzhiyun     RK_VOID *pMblk_768P_2    = RK_NULL;
1746*4882a593Smuzhiyun     RK_U32   s32Ret          = RK_SUCCESS;
1747*4882a593Smuzhiyun     RK_S32   count           = 0;
1748*4882a593Smuzhiyun     PIXEL_FORMAT_E           plane_format;
1749*4882a593Smuzhiyun 
1750*4882a593Smuzhiyun     for (RK_U32 j = 0; j < VDEC_ARRAY_ELEMS(testPixelFormat); j++) {
1751*4882a593Smuzhiyun         if (ctx->s32PixFormat == testPixelFormat[j].index) {
1752*4882a593Smuzhiyun             plane_format =  testPixelFormat[j].format;
1753*4882a593Smuzhiyun             break;
1754*4882a593Smuzhiyun         }
1755*4882a593Smuzhiyun     }
1756*4882a593Smuzhiyun 
1757*4882a593Smuzhiyun     pstVFrame = reinterpret_cast<VIDEO_FRAME_INFO_S *>(malloc(sizeof(VIDEO_FRAME_INFO_S)));
1758*4882a593Smuzhiyun     /* GFX buffer dispaly on VoDev 0 */
1759*4882a593Smuzhiyun     Sample_VO_CreateGFXData(1920, 1080,
1760*4882a593Smuzhiyun                             RK_FMT_RGB888, 0, &pMblk_1080P_1);
1761*4882a593Smuzhiyun     Sample_VO_CreateGFXData(1920, 1080,
1762*4882a593Smuzhiyun                             RK_FMT_RGB888, 1, &pMblk_1080P_2);
1763*4882a593Smuzhiyun 
1764*4882a593Smuzhiyun     /* GFX buffer dispaly on VoDev 1 */
1765*4882a593Smuzhiyun     if (ctx->bDoubleScreen) {
1766*4882a593Smuzhiyun         Sample_Print("DoubleScreen UI Demo test");
1767*4882a593Smuzhiyun         Sample_VO_CreateGFXData(1024, 768,
1768*4882a593Smuzhiyun                                 RK_FMT_RGB888, 0, &pMblk_768P_1);
1769*4882a593Smuzhiyun         Sample_VO_CreateGFXData(1024, 768,
1770*4882a593Smuzhiyun                                 RK_FMT_RGB888, 1, &pMblk_768P_2);
1771*4882a593Smuzhiyun     } else if (ctx->bHomologous) {
1772*4882a593Smuzhiyun          Sample_Print("Homologous UI Demo test");
1773*4882a593Smuzhiyun     } else {
1774*4882a593Smuzhiyun         Sample_Print("Single HDMI Screen UI Demo test");
1775*4882a593Smuzhiyun     }
1776*4882a593Smuzhiyun     /* Bind Layer */
1777*4882a593Smuzhiyun     VoLayer = RK356X_VOP_LAYER_ESMART_0;
1778*4882a593Smuzhiyun     VoDev   = RK356X_VO_DEV_HD0;
1779*4882a593Smuzhiyun     if (ctx->bDoubleScreen) {
1780*4882a593Smuzhiyun         VoLayer_second = RK356X_VOP_LAYER_ESMART_1;
1781*4882a593Smuzhiyun         VoDev_second   = RK356X_VO_DEV_HD1;
1782*4882a593Smuzhiyun         RK_MPI_VO_BindLayer(VoLayer_second, VoDev_second, VO_LAYER_MODE_GRAPHIC);
1783*4882a593Smuzhiyun     }
1784*4882a593Smuzhiyun     RK_MPI_VO_BindLayer(VoLayer, VoDev, VO_LAYER_MODE_GRAPHIC);
1785*4882a593Smuzhiyun 
1786*4882a593Smuzhiyun     if (ctx->bHomologous) {
1787*4882a593Smuzhiyun         stVoPubAttr.enIntfType = VO_INTF_HDMI | VO_INTF_EDP;
1788*4882a593Smuzhiyun         stVoPubAttr.u32BgColor = 0x000000;
1789*4882a593Smuzhiyun     } else {
1790*4882a593Smuzhiyun         stVoPubAttr.enIntfType = VO_INTF_HDMI;
1791*4882a593Smuzhiyun     }
1792*4882a593Smuzhiyun     SampleSetVoInterfacetiming(&stVoPubAttr, ctx->enIntfSync);
1793*4882a593Smuzhiyun     Sample_VO_StartDev(VoDev, &stVoPubAttr);
1794*4882a593Smuzhiyun 
1795*4882a593Smuzhiyun     stLayerAttr.enPixFormat                  = plane_format;
1796*4882a593Smuzhiyun     stLayerAttr.stDispRect.s32X              = 0;
1797*4882a593Smuzhiyun     stLayerAttr.stDispRect.s32Y              = 0;
1798*4882a593Smuzhiyun     stLayerAttr.stDispRect.u32Width          = ctx->u32Screen0DisplayWidth;
1799*4882a593Smuzhiyun     stLayerAttr.stDispRect.u32Height         = ctx->u32Screen0DisplayHeight;
1800*4882a593Smuzhiyun     stLayerAttr.stImageSize.u32Width         = ctx->u32Screen0ImageWidth;
1801*4882a593Smuzhiyun     stLayerAttr.stImageSize.u32Height        = ctx->u32Screen0ImageHeight;
1802*4882a593Smuzhiyun     Sample_VO_StartLayer(VoLayer, &stLayerAttr);
1803*4882a593Smuzhiyun 
1804*4882a593Smuzhiyun     if (ctx->bDoubleScreen) {
1805*4882a593Smuzhiyun         stVoPubAttr.enIntfType = VO_INTF_EDP;
1806*4882a593Smuzhiyun         stVoPubAttr.u32BgColor = 0x000000;
1807*4882a593Smuzhiyun         SampleSetVoInterfacetiming(&stVoPubAttr, ctx->enIntfSync_second);
1808*4882a593Smuzhiyun         Sample_VO_StartDev(VoDev_second, &stVoPubAttr);
1809*4882a593Smuzhiyun         stLayerAttr.enPixFormat                  = plane_format;
1810*4882a593Smuzhiyun         stLayerAttr.stDispRect.s32X              = 0;
1811*4882a593Smuzhiyun         stLayerAttr.stDispRect.s32Y              = 0;
1812*4882a593Smuzhiyun         stLayerAttr.stDispRect.u32Width          = ctx->u32Screen1DisplayWidth;
1813*4882a593Smuzhiyun         stLayerAttr.stDispRect.u32Height         = ctx->u32Screen1DisplayHeight;
1814*4882a593Smuzhiyun         stLayerAttr.stImageSize.u32Width         = ctx->u32Screen1ImageWidth;
1815*4882a593Smuzhiyun         stLayerAttr.stImageSize.u32Height        = ctx->u32Screen1ImageHeight;
1816*4882a593Smuzhiyun         Sample_VO_StartLayer(VoLayer_second, &stLayerAttr);
1817*4882a593Smuzhiyun     }
1818*4882a593Smuzhiyun 
1819*4882a593Smuzhiyun     while (1) {
1820*4882a593Smuzhiyun         sleep(1);
1821*4882a593Smuzhiyun         count++;
1822*4882a593Smuzhiyun         if (count % 2) {
1823*4882a593Smuzhiyun             Sample_VO_SetVFrame(pstVFrame,
1824*4882a593Smuzhiyun                                 1920,
1825*4882a593Smuzhiyun                                 1080,
1826*4882a593Smuzhiyun                                 1920,
1827*4882a593Smuzhiyun                                 1080,
1828*4882a593Smuzhiyun                                 RK_FMT_RGB888,
1829*4882a593Smuzhiyun                                 pMblk_1080P_1);
1830*4882a593Smuzhiyun             RK_MPI_VO_SendLayerFrame(VoLayer, pstVFrame);
1831*4882a593Smuzhiyun             if (ctx->bDoubleScreen) {
1832*4882a593Smuzhiyun                 Sample_VO_SetVFrame(pstVFrame,
1833*4882a593Smuzhiyun                                     ctx->u32Screen1DisplayWidth,
1834*4882a593Smuzhiyun                                     ctx->u32Screen1DisplayHeight,
1835*4882a593Smuzhiyun                                     ctx->u32Screen1DisplayWidth,
1836*4882a593Smuzhiyun                                     ctx->u32Screen1DisplayHeight,
1837*4882a593Smuzhiyun                                     RK_FMT_RGB888,
1838*4882a593Smuzhiyun                                     pMblk_768P_1);
1839*4882a593Smuzhiyun                 RK_MPI_VO_SendLayerFrame(VoLayer_second, pstVFrame);
1840*4882a593Smuzhiyun             }
1841*4882a593Smuzhiyun         } else {
1842*4882a593Smuzhiyun             Sample_VO_SetVFrame(pstVFrame,
1843*4882a593Smuzhiyun                                 1920,
1844*4882a593Smuzhiyun                                 1080,
1845*4882a593Smuzhiyun                                 1920,
1846*4882a593Smuzhiyun                                 1080,
1847*4882a593Smuzhiyun                                 RK_FMT_RGB888,
1848*4882a593Smuzhiyun                                 pMblk_1080P_2);
1849*4882a593Smuzhiyun             RK_MPI_VO_SendLayerFrame(VoLayer, pstVFrame);
1850*4882a593Smuzhiyun             if (ctx->bDoubleScreen) {
1851*4882a593Smuzhiyun                 Sample_VO_SetVFrame(pstVFrame,
1852*4882a593Smuzhiyun                                     ctx->u32Screen1DisplayWidth,
1853*4882a593Smuzhiyun                                     ctx->u32Screen1DisplayHeight,
1854*4882a593Smuzhiyun                                     ctx->u32Screen1DisplayWidth,
1855*4882a593Smuzhiyun                                     ctx->u32Screen1DisplayHeight,
1856*4882a593Smuzhiyun                                     RK_FMT_RGB888,
1857*4882a593Smuzhiyun                                     pMblk_768P_2);
1858*4882a593Smuzhiyun                 RK_MPI_VO_SendLayerFrame(VoLayer_second, pstVFrame);
1859*4882a593Smuzhiyun             }
1860*4882a593Smuzhiyun         }
1861*4882a593Smuzhiyun 
1862*4882a593Smuzhiyun         if (count == ctx->loopCount )
1863*4882a593Smuzhiyun             break;
1864*4882a593Smuzhiyun     }
1865*4882a593Smuzhiyun 
1866*4882a593Smuzhiyun     Sample_VO_StopLayer(VoLayer);
1867*4882a593Smuzhiyun     Sample_VO_StopDev(VoDev);
1868*4882a593Smuzhiyun     RK_MPI_VO_UnBindLayer(VoLayer, VoDev);
1869*4882a593Smuzhiyun     RK_MPI_VO_DestroyGraphicsFrameBuffer(pMblk_1080P_1);
1870*4882a593Smuzhiyun     RK_MPI_VO_DestroyGraphicsFrameBuffer(pMblk_1080P_2);
1871*4882a593Smuzhiyun 
1872*4882a593Smuzhiyun     if (ctx->bDoubleScreen) {
1873*4882a593Smuzhiyun         Sample_VO_StopLayer(VoLayer_second);
1874*4882a593Smuzhiyun         Sample_VO_StopDev(VoDev_second);
1875*4882a593Smuzhiyun         RK_MPI_VO_UnBindLayer(VoLayer_second, VoDev_second);
1876*4882a593Smuzhiyun         RK_MPI_VO_DestroyGraphicsFrameBuffer(pMblk_768P_1);
1877*4882a593Smuzhiyun         RK_MPI_VO_DestroyGraphicsFrameBuffer(pMblk_768P_2);
1878*4882a593Smuzhiyun     }
1879*4882a593Smuzhiyun end:
1880*4882a593Smuzhiyun     RK_MPI_VO_CloseFd();
1881*4882a593Smuzhiyun 
1882*4882a593Smuzhiyun     return s32Ret;
1883*4882a593Smuzhiyun }
1884*4882a593Smuzhiyun 
1885*4882a593Smuzhiyun static RK_S32 Sample_VO_Demo_Alpha(TEST_VO_CTX_S *ctx) {
1886*4882a593Smuzhiyun     VO_PUB_ATTR_S           stVoPubAttr;
1887*4882a593Smuzhiyun     VO_VIDEO_LAYER_ATTR_S   stLayerAttr;
1888*4882a593Smuzhiyun     VoThreadParam           stThreadParam;
1889*4882a593Smuzhiyun     RK_U32                  u32DispWidth, u32DispHeight, u32GfxLayers;
1890*4882a593Smuzhiyun     VO_LAYER                VoGfxLayer, VoVideoLayer;
1891*4882a593Smuzhiyun     RK_S32                  s32Ret = RK_SUCCESS;
1892*4882a593Smuzhiyun     RK_U32                  u32VideoWindows;
1893*4882a593Smuzhiyun     pthread_t               tThreadDev0;
1894*4882a593Smuzhiyun     PIXEL_FORMAT_E          video_format;
1895*4882a593Smuzhiyun     RK_U32                  VoWbc;
1896*4882a593Smuzhiyun     PIXEL_FORMAT_E          wbc_format;
1897*4882a593Smuzhiyun     VO_LAYER                VoLayer;
1898*4882a593Smuzhiyun     VO_DEV                  VoDev;
1899*4882a593Smuzhiyun 
1900*4882a593Smuzhiyun     u32VideoWindows =  ctx->u32Windows;
1901*4882a593Smuzhiyun     for (RK_U32 j = 0; j < VDEC_ARRAY_ELEMS(testPixelFormat); j++) {
1902*4882a593Smuzhiyun         if (ctx->s32PixFormat == testPixelFormat[j].index) {
1903*4882a593Smuzhiyun             video_format =  testPixelFormat[j].format;
1904*4882a593Smuzhiyun             break;
1905*4882a593Smuzhiyun         }
1906*4882a593Smuzhiyun     }
1907*4882a593Smuzhiyun     /* Bind Layer */
1908*4882a593Smuzhiyun     VoDev == RK356X_VO_DEV_HD0;
1909*4882a593Smuzhiyun     VoGfxLayer = RK356X_VOP_LAYER_ESMART_0;
1910*4882a593Smuzhiyun     VoVideoLayer = RK356X_VOP_LAYER_CLUSTER_0;
1911*4882a593Smuzhiyun     RK_MPI_VO_BindLayer(VoGfxLayer, VoDev, VO_LAYER_MODE_GRAPHIC);
1912*4882a593Smuzhiyun     RK_MPI_VO_BindLayer(VoVideoLayer, VoDev, VO_LAYER_MODE_VIDEO);
1913*4882a593Smuzhiyun     /* Enable VO Dev0 Device */
1914*4882a593Smuzhiyun     u32DispWidth = 1920;
1915*4882a593Smuzhiyun     u32DispHeight = 1080;
1916*4882a593Smuzhiyun     stVoPubAttr.enIntfType = VO_INTF_HDMI;
1917*4882a593Smuzhiyun     stVoPubAttr.enIntfSync = VO_OUTPUT_1080P60;
1918*4882a593Smuzhiyun     Sample_VO_StartDev(VoDev, &stVoPubAttr);
1919*4882a593Smuzhiyun     /* Enable Vodev 0  Video Layer */
1920*4882a593Smuzhiyun     if (VoVideoLayer != -1) {
1921*4882a593Smuzhiyun         stLayerAttr.enPixFormat              = video_format;
1922*4882a593Smuzhiyun         stLayerAttr.stDispRect.s32X          = 0;
1923*4882a593Smuzhiyun         stLayerAttr.stDispRect.s32Y          = 0;
1924*4882a593Smuzhiyun         stLayerAttr.stDispRect.u32Width      = u32DispWidth;
1925*4882a593Smuzhiyun         stLayerAttr.stDispRect.u32Height     = u32DispHeight;
1926*4882a593Smuzhiyun         stLayerAttr.stImageSize.u32Width     = u32DispWidth;
1927*4882a593Smuzhiyun         stLayerAttr.stImageSize.u32Height    = u32DispHeight;
1928*4882a593Smuzhiyun         stLayerAttr.u32DispFrmRt             = 25;
1929*4882a593Smuzhiyun         Sample_VO_StartLayer(VoVideoLayer, &stLayerAttr);
1930*4882a593Smuzhiyun         ctx->VoLayer = VoVideoLayer;
1931*4882a593Smuzhiyun         Sample_VO_MultiWindowns_Start(ctx);
1932*4882a593Smuzhiyun     }
1933*4882a593Smuzhiyun     /* Enable Vodev 0  GFX Layer */
1934*4882a593Smuzhiyun     u32GfxLayers = 2;
1935*4882a593Smuzhiyun     if (VoGfxLayer != -1) {
1936*4882a593Smuzhiyun         stLayerAttr.enPixFormat                  = video_format;
1937*4882a593Smuzhiyun         stLayerAttr.stDispRect.s32X              = 0;
1938*4882a593Smuzhiyun         stLayerAttr.stDispRect.s32Y              = 0;
1939*4882a593Smuzhiyun         stLayerAttr.stDispRect.u32Width          = u32DispWidth;
1940*4882a593Smuzhiyun         stLayerAttr.stDispRect.u32Height         = u32DispHeight;
1941*4882a593Smuzhiyun         stLayerAttr.stImageSize.u32Width         = u32DispWidth;
1942*4882a593Smuzhiyun         stLayerAttr.stImageSize.u32Height        = u32DispHeight;
1943*4882a593Smuzhiyun         stLayerAttr.u32DispFrmRt                 = 25;
1944*4882a593Smuzhiyun         Sample_VO_StartLayer(VoGfxLayer, &stLayerAttr);
1945*4882a593Smuzhiyun         Sample_VO_MultiGFXLayer_Start(VoGfxLayer, u32GfxLayers);
1946*4882a593Smuzhiyun     }
1947*4882a593Smuzhiyun 
1948*4882a593Smuzhiyun     Sample_Print("HD0: Start Send Picture\n");
1949*4882a593Smuzhiyun 
1950*4882a593Smuzhiyun     stThreadParam.u32Exit         = 0;
1951*4882a593Smuzhiyun     stThreadParam.u32VideoWindows = u32VideoWindows;
1952*4882a593Smuzhiyun     stThreadParam.VoVideoLayer    = VoVideoLayer;
1953*4882a593Smuzhiyun     stThreadParam.u32GFXLayers    = u32GfxLayers;
1954*4882a593Smuzhiyun     stThreadParam.VOGfxLayer      = VoGfxLayer;
1955*4882a593Smuzhiyun     Sample_VO_StartSendPicture_Mosaic(&tThreadDev0, &stThreadParam);
1956*4882a593Smuzhiyun 
1957*4882a593Smuzhiyun     Sample_Print("Start HD1\n");
1958*4882a593Smuzhiyun     VoDev = RK356X_VO_DEV_HD1;
1959*4882a593Smuzhiyun     /* Bind Vodev1 Layer */
1960*4882a593Smuzhiyun     VoLayer = RK356X_VOP_LAYER_CLUSTER_1;
1961*4882a593Smuzhiyun     RK_MPI_VO_BindLayer(VoLayer, VoDev, VO_LAYER_MODE_VIDEO);
1962*4882a593Smuzhiyun     /* Enable VO Dev1 Device */
1963*4882a593Smuzhiyun     u32DispWidth = 1024;
1964*4882a593Smuzhiyun     u32DispHeight = 768;
1965*4882a593Smuzhiyun     stVoPubAttr.enIntfType = VO_INTF_EDP;
1966*4882a593Smuzhiyun     stVoPubAttr.enIntfSync = VO_OUTPUT_1024x768_60;
1967*4882a593Smuzhiyun     stVoPubAttr.u32BgColor = 0x000000;
1968*4882a593Smuzhiyun     Sample_VO_StartDev(VoDev, &stVoPubAttr);
1969*4882a593Smuzhiyun     /* Enable Layer */
1970*4882a593Smuzhiyun     stLayerAttr.enPixFormat              = RK_FMT_BGR888;
1971*4882a593Smuzhiyun     stLayerAttr.stDispRect.s32X          = 0;
1972*4882a593Smuzhiyun     stLayerAttr.stDispRect.s32Y          = 0;
1973*4882a593Smuzhiyun     stLayerAttr.stDispRect.u32Width      = u32DispWidth;
1974*4882a593Smuzhiyun     stLayerAttr.stDispRect.u32Height     = u32DispHeight;
1975*4882a593Smuzhiyun     stLayerAttr.stImageSize.u32Width     = u32DispWidth;
1976*4882a593Smuzhiyun     stLayerAttr.stImageSize.u32Height    = u32DispHeight;
1977*4882a593Smuzhiyun     stLayerAttr.u32DispFrmRt             = 25;
1978*4882a593Smuzhiyun     Sample_VO_StartLayer(VoLayer, &stLayerAttr);
1979*4882a593Smuzhiyun 
1980*4882a593Smuzhiyun     ctx->VoLayer = VoLayer;
1981*4882a593Smuzhiyun     ctx->u32Windows = 1;
1982*4882a593Smuzhiyun     Sample_VO_MultiWindowns_Start(ctx);
1983*4882a593Smuzhiyun 
1984*4882a593Smuzhiyun     Sample_Print("Start DEV0 WBC\n");
1985*4882a593Smuzhiyun     /* Start WBC and bind to HD0 */
1986*4882a593Smuzhiyun     VoWbc = 0;
1987*4882a593Smuzhiyun     /* WBC bind source */
1988*4882a593Smuzhiyun     ctx->stWbcCfg.stWbcSource.enSourceType = VO_WBC_SOURCE_DEV;
1989*4882a593Smuzhiyun     ctx->stWbcCfg.stWbcSource.u32SourceId = RK356X_VO_DEV_HD0;
1990*4882a593Smuzhiyun 
1991*4882a593Smuzhiyun     RK_MPI_VO_SetWbcSource(VoWbc, &ctx->stWbcCfg.stWbcSource);
1992*4882a593Smuzhiyun     /* Start WBC */
1993*4882a593Smuzhiyun     wbc_format = Sample_wbc_formt(ctx->u32WbcPixFormat);
1994*4882a593Smuzhiyun 
1995*4882a593Smuzhiyun     ctx->stWbcCfg.stWbcAttr.enPixelFormat = wbc_format;
1996*4882a593Smuzhiyun     Sample_Print("wbc format is %x\n", ctx->stWbcCfg.stWbcAttr.enPixelFormat);
1997*4882a593Smuzhiyun 
1998*4882a593Smuzhiyun     RK_MPI_VO_SetWbcAttr(VoWbc, &ctx->stWbcCfg.stWbcAttr);
1999*4882a593Smuzhiyun     RK_MPI_VO_EnableWbc(VoWbc);
2000*4882a593Smuzhiyun 
2001*4882a593Smuzhiyun     if (ctx->wbc_bind == RK_TRUE)
2002*4882a593Smuzhiyun         Sample_VO_BindVoWbc(VoWbc, VoLayer, 0);
2003*4882a593Smuzhiyun     sleep(2);
2004*4882a593Smuzhiyun     while (1) {
2005*4882a593Smuzhiyun         Sample_Print("Press 'q' to quit\n");
2006*4882a593Smuzhiyun         if (getchar() == 'q')
2007*4882a593Smuzhiyun             break;
2008*4882a593Smuzhiyun     }
2009*4882a593Smuzhiyun     Sample_VO_StopSendPicture_Mosaic(tThreadDev0, &stThreadParam);
2010*4882a593Smuzhiyun     Sample_VO_UnBindVoWbc(VoWbc, VoLayer, 0);
2011*4882a593Smuzhiyun     Sample_Print("Stop dev0 WBC\n");
2012*4882a593Smuzhiyun     RK_MPI_VO_DisableWbc(VoWbc);
2013*4882a593Smuzhiyun 
2014*4882a593Smuzhiyun     Sample_Print("Stop HD1\n");
2015*4882a593Smuzhiyun     Sample_VO_MultiWindowns_Stop(VoLayer, 1);
2016*4882a593Smuzhiyun     Sample_VO_StopLayer(VoLayer);
2017*4882a593Smuzhiyun     Sample_VO_StopDev(VoDev);
2018*4882a593Smuzhiyun     RK_MPI_VO_UnBindLayer(VoLayer, VoDev);
2019*4882a593Smuzhiyun 
2020*4882a593Smuzhiyun     Sample_Print("Stop HD0");
2021*4882a593Smuzhiyun     VoGfxLayer   = RK356X_VOP_LAYER_ESMART_0;
2022*4882a593Smuzhiyun     VoVideoLayer = RK356X_VOP_LAYER_CLUSTER_0;
2023*4882a593Smuzhiyun     VoDev        = RK356X_VO_DEV_HD0;
2024*4882a593Smuzhiyun     Sample_VO_MultiWindowns_Stop(VoGfxLayer, u32GfxLayers);
2025*4882a593Smuzhiyun     Sample_VO_StopLayer(VoGfxLayer);
2026*4882a593Smuzhiyun     Sample_VO_MultiWindowns_Stop(VoVideoLayer, u32VideoWindows);
2027*4882a593Smuzhiyun     Sample_VO_StopLayer(VoVideoLayer);
2028*4882a593Smuzhiyun     RK_MPI_VO_UnBindLayer(VoGfxLayer, VoDev);
2029*4882a593Smuzhiyun     RK_MPI_VO_UnBindLayer(VoVideoLayer, VoDev);
2030*4882a593Smuzhiyun     Sample_VO_StopDev(VoDev);
2031*4882a593Smuzhiyun 
2032*4882a593Smuzhiyun     RK_MPI_VO_CloseFd();
2033*4882a593Smuzhiyun 
2034*4882a593Smuzhiyun     return s32Ret;
2035*4882a593Smuzhiyun }
2036*4882a593Smuzhiyun 
2037*4882a593Smuzhiyun static RK_S32 Sample_VO_Video_Homologous(TEST_VO_CTX_S *ctx) {
2038*4882a593Smuzhiyun     VO_WBC_SOURCE_S          stWbcSource;
2039*4882a593Smuzhiyun     VO_WBC_ATTR_S            stWbcAttr;
2040*4882a593Smuzhiyun     RK_U32 VoWbc;
2041*4882a593Smuzhiyun     VIDEO_FRAME_INFO_S       *pFrame;
2042*4882a593Smuzhiyun     VO_PUB_ATTR_S            stVoPubAttr;
2043*4882a593Smuzhiyun     VO_VIDEO_LAYER_ATTR_S    stLayerAttr;
2044*4882a593Smuzhiyun     RK_U32                   u32DispWidth, u32DispHeight;
2045*4882a593Smuzhiyun     VO_LAYER                 VoLayer;
2046*4882a593Smuzhiyun     VO_DEV                   VoDev;
2047*4882a593Smuzhiyun     RK_S32                   u32Windows;
2048*4882a593Smuzhiyun     RK_U32                   u32Fps, i;
2049*4882a593Smuzhiyun     pthread_t                tThreadID;
2050*4882a593Smuzhiyun     RK_S32                   s32Ret = RK_SUCCESS;
2051*4882a593Smuzhiyun     VO_LAYER_MODE_E          Vo_layer_mode;
2052*4882a593Smuzhiyun     VoThreadParam            stThreadParam;
2053*4882a593Smuzhiyun     PIXEL_FORMAT_E           video_format;
2054*4882a593Smuzhiyun     TEST_VO_CTX_S   stVoCtx;
2055*4882a593Smuzhiyun     PIXEL_FORMAT_E  wbc_format;
2056*4882a593Smuzhiyun     VoDev = ctx->VoDev;
2057*4882a593Smuzhiyun     u32Windows = ctx->u32Windows;
2058*4882a593Smuzhiyun     u32Fps =  ctx->u32DispFrmRt;
2059*4882a593Smuzhiyun     VoLayer = ctx->VoLayer;
2060*4882a593Smuzhiyun     for (RK_U32 j = 0; j < VDEC_ARRAY_ELEMS(testPixelFormat); j++) {
2061*4882a593Smuzhiyun         if (ctx->s32PixFormat == testPixelFormat[j].index) {
2062*4882a593Smuzhiyun             video_format =  testPixelFormat[j].format;
2063*4882a593Smuzhiyun             break;
2064*4882a593Smuzhiyun         }
2065*4882a593Smuzhiyun     }
2066*4882a593Smuzhiyun 
2067*4882a593Smuzhiyun     Sample_Print("%s VoDev %u Windows %u video_format %x\n", __func__, VoDev, u32Windows, video_format);
2068*4882a593Smuzhiyun 
2069*4882a593Smuzhiyun     /* Bind Layer */
2070*4882a593Smuzhiyun     switch (ctx->VoLayerMode) {
2071*4882a593Smuzhiyun         case 0:
2072*4882a593Smuzhiyun             Vo_layer_mode = VO_LAYER_MODE_CURSOR;
2073*4882a593Smuzhiyun             break;
2074*4882a593Smuzhiyun         case 1:
2075*4882a593Smuzhiyun             Vo_layer_mode = VO_LAYER_MODE_GRAPHIC;
2076*4882a593Smuzhiyun             break;
2077*4882a593Smuzhiyun         case 2:
2078*4882a593Smuzhiyun             Vo_layer_mode = VO_LAYER_MODE_VIDEO;
2079*4882a593Smuzhiyun             break;
2080*4882a593Smuzhiyun         default:
2081*4882a593Smuzhiyun             Vo_layer_mode = VO_LAYER_MODE_VIDEO;
2082*4882a593Smuzhiyun     }
2083*4882a593Smuzhiyun 
2084*4882a593Smuzhiyun     RK_MPI_VO_BindLayer(VoLayer, VoDev, VO_LAYER_MODE_VIDEO);
2085*4882a593Smuzhiyun 
2086*4882a593Smuzhiyun     switch (ctx->enIntfType) {
2087*4882a593Smuzhiyun         case DISPLAY_TYPE_VGA:
2088*4882a593Smuzhiyun             stVoPubAttr.enIntfType = VO_INTF_VGA;
2089*4882a593Smuzhiyun             break;
2090*4882a593Smuzhiyun         case DISPLAY_TYPE_HDMI:
2091*4882a593Smuzhiyun             stVoPubAttr.enIntfType = VO_INTF_HDMI;
2092*4882a593Smuzhiyun             break;
2093*4882a593Smuzhiyun         case DISPLAY_TYPE_EDP:
2094*4882a593Smuzhiyun             stVoPubAttr.enIntfType = VO_INTF_EDP;
2095*4882a593Smuzhiyun             break;
2096*4882a593Smuzhiyun         case DISPLAY_TYPE_DP:
2097*4882a593Smuzhiyun             stVoPubAttr.enIntfType = VO_INTF_DP;
2098*4882a593Smuzhiyun             break;
2099*4882a593Smuzhiyun         default:
2100*4882a593Smuzhiyun             stVoPubAttr.enIntfType = VO_INTF_HDMI;
2101*4882a593Smuzhiyun             Sample_Print("IntfType not set,use INTF_HDMI default\n");
2102*4882a593Smuzhiyun     }
2103*4882a593Smuzhiyun 
2104*4882a593Smuzhiyun     for (i = 0; i < ARRAY_LENGTH(test_mode_table); i++) {
2105*4882a593Smuzhiyun         if (ctx->enIntfSync == test_mode_table[i].mode)
2106*4882a593Smuzhiyun             break;
2107*4882a593Smuzhiyun     }
2108*4882a593Smuzhiyun 
2109*4882a593Smuzhiyun     if (i == ARRAY_LENGTH(test_mode_table)) {
2110*4882a593Smuzhiyun         Sample_Print("%s not found supported mode in test mode_table\n", __func__);
2111*4882a593Smuzhiyun         return RK_FAILURE;
2112*4882a593Smuzhiyun     }
2113*4882a593Smuzhiyun 
2114*4882a593Smuzhiyun     stVoPubAttr.enIntfSync = test_mode_table[i].enIntfSync;
2115*4882a593Smuzhiyun     Sample_VO_StartDev(VoDev, &stVoPubAttr);
2116*4882a593Smuzhiyun 
2117*4882a593Smuzhiyun      /* Enable Layer */
2118*4882a593Smuzhiyun     stLayerAttr.enPixFormat                  = video_format;
2119*4882a593Smuzhiyun     stLayerAttr.stDispRect.s32X              = ctx->s32Y;
2120*4882a593Smuzhiyun     stLayerAttr.stDispRect.s32Y              = ctx->s32Y;
2121*4882a593Smuzhiyun     if (ctx->VoDev== RK356X_VO_DEV_HD0) {
2122*4882a593Smuzhiyun     stLayerAttr.stDispRect.u32Width          = ctx->u32DispWidth;
2123*4882a593Smuzhiyun     stLayerAttr.stDispRect.u32Height         = ctx->u32DispHeight;
2124*4882a593Smuzhiyun     stLayerAttr.stImageSize.u32Width         = ctx->u32ImgeWidth;
2125*4882a593Smuzhiyun     stLayerAttr.stImageSize.u32Height        = ctx->u32ImageHeight;
2126*4882a593Smuzhiyun     } else if (ctx->VoDev== RK356X_VO_DEV_HD1) {
2127*4882a593Smuzhiyun     stLayerAttr.stDispRect.u32Width          = 1024;
2128*4882a593Smuzhiyun     stLayerAttr.stDispRect.u32Height         = 768;
2129*4882a593Smuzhiyun     stLayerAttr.stImageSize.u32Width         = 1024;
2130*4882a593Smuzhiyun     stLayerAttr.stImageSize.u32Height        = 768;
2131*4882a593Smuzhiyun     }
2132*4882a593Smuzhiyun     stLayerAttr.u32DispFrmRt                 = ctx->u32DispFrmRt;
2133*4882a593Smuzhiyun     Sample_VO_StartLayer(VoLayer, &stLayerAttr);
2134*4882a593Smuzhiyun     Sample_VO_MultiWindowns_Start(ctx);
2135*4882a593Smuzhiyun     stThreadParam.u32Exit = 0;
2136*4882a593Smuzhiyun     stThreadParam.u32VideoWindows = u32Windows;
2137*4882a593Smuzhiyun     stThreadParam.VoVideoLayer = VoLayer;
2138*4882a593Smuzhiyun     stThreadParam.VOGfxLayer = -1;
2139*4882a593Smuzhiyun     stThreadParam.u32GFXLayers = -1;
2140*4882a593Smuzhiyun 
2141*4882a593Smuzhiyun     Sample_Print("Start Send Picture\n");
2142*4882a593Smuzhiyun     Sample_VO_StartSendPicture_Mosaic(&tThreadID, &stThreadParam);
2143*4882a593Smuzhiyun 
2144*4882a593Smuzhiyun     Sample_Print("Start HD1\n");
2145*4882a593Smuzhiyun     /* Start HD1 Device */
2146*4882a593Smuzhiyun     VoDev = RK356X_VO_DEV_HD1;
2147*4882a593Smuzhiyun     /* Bind Layer */
2148*4882a593Smuzhiyun     VoLayer = RK356X_VOP_LAYER_CLUSTER_1;
2149*4882a593Smuzhiyun     RK_MPI_VO_BindLayer(VoLayer, VoDev, VO_LAYER_MODE_VIDEO);
2150*4882a593Smuzhiyun 
2151*4882a593Smuzhiyun     /* Enable VO Device */
2152*4882a593Smuzhiyun     if (VoDev == RK356X_VO_DEV_HD0) {
2153*4882a593Smuzhiyun         u32DispWidth = 1920;
2154*4882a593Smuzhiyun         u32DispHeight = 1080;
2155*4882a593Smuzhiyun         stVoPubAttr.enIntfType = VO_INTF_HDMI;
2156*4882a593Smuzhiyun         stVoPubAttr.enIntfSync = VO_OUTPUT_1080P50;
2157*4882a593Smuzhiyun     } else if (VoDev == RK356X_VO_DEV_HD1) {
2158*4882a593Smuzhiyun         u32DispWidth = 1024;
2159*4882a593Smuzhiyun         u32DispHeight = 768;
2160*4882a593Smuzhiyun         stVoPubAttr.u32BgColor = 0x000000;
2161*4882a593Smuzhiyun         stVoPubAttr.enIntfType = VO_INTF_EDP;
2162*4882a593Smuzhiyun         stVoPubAttr.enIntfSync = VO_OUTPUT_1024x768_60;
2163*4882a593Smuzhiyun     } else {
2164*4882a593Smuzhiyun         s32Ret = RK_FAILURE;
2165*4882a593Smuzhiyun        // goto end;
2166*4882a593Smuzhiyun     }
2167*4882a593Smuzhiyun     Sample_VO_StartDev(VoDev, &stVoPubAttr);
2168*4882a593Smuzhiyun 
2169*4882a593Smuzhiyun     /* Enable Layer */
2170*4882a593Smuzhiyun     stLayerAttr.enPixFormat              = RK_FMT_BGR888;
2171*4882a593Smuzhiyun     stLayerAttr.stDispRect.s32X          = 0;
2172*4882a593Smuzhiyun     stLayerAttr.stDispRect.s32Y          = 0;
2173*4882a593Smuzhiyun     stLayerAttr.stDispRect.u32Width      = u32DispWidth;
2174*4882a593Smuzhiyun     stLayerAttr.stDispRect.u32Height     = u32DispHeight;
2175*4882a593Smuzhiyun     stLayerAttr.stImageSize.u32Width     = u32DispWidth;
2176*4882a593Smuzhiyun     stLayerAttr.stImageSize.u32Height    = u32DispHeight;
2177*4882a593Smuzhiyun     stLayerAttr.u32DispFrmRt             = 25;
2178*4882a593Smuzhiyun     Sample_VO_StartLayer(VoLayer, &stLayerAttr);
2179*4882a593Smuzhiyun 
2180*4882a593Smuzhiyun     ctx->VoLayer = RK356X_VOP_LAYER_CLUSTER_1;
2181*4882a593Smuzhiyun     ctx->u32Windows = 1;
2182*4882a593Smuzhiyun     Sample_VO_MultiWindowns_Start(ctx);
2183*4882a593Smuzhiyun 
2184*4882a593Smuzhiyun     Sample_Print("Start Cluster0 WBC\n");
2185*4882a593Smuzhiyun 
2186*4882a593Smuzhiyun     /* Start WBC and bind to HD0 */
2187*4882a593Smuzhiyun     VoWbc = 0;
2188*4882a593Smuzhiyun     /* WBC bind source */
2189*4882a593Smuzhiyun     ctx->stWbcCfg.stWbcSource.enSourceType = VO_WBC_SOURCE_VIDEO;
2190*4882a593Smuzhiyun     ctx->stWbcCfg.stWbcSource.u32SourceId = RK356X_VO_DEV_HD0;
2191*4882a593Smuzhiyun 
2192*4882a593Smuzhiyun     RK_MPI_VO_SetWbcSource(VoWbc, &ctx->stWbcCfg.stWbcSource);
2193*4882a593Smuzhiyun 
2194*4882a593Smuzhiyun     /* Start WBC */
2195*4882a593Smuzhiyun     wbc_format = Sample_wbc_formt(ctx->u32WbcPixFormat);
2196*4882a593Smuzhiyun 
2197*4882a593Smuzhiyun     ctx->stWbcCfg.stWbcAttr.enPixelFormat = wbc_format;
2198*4882a593Smuzhiyun     if (ctx->u32WbcWidth > 1920 && ctx->u32WbcHeight > 1080) {
2199*4882a593Smuzhiyun         Sample_Print("WBC resolution exceeding 1080P\n");
2200*4882a593Smuzhiyun         ctx->u32WbcWidth = 1920;
2201*4882a593Smuzhiyun         ctx->u32WbcHeight = 1080;
2202*4882a593Smuzhiyun     }
2203*4882a593Smuzhiyun 
2204*4882a593Smuzhiyun     ctx->stWbcCfg.stWbcAttr.stTargetSize.u32Width =  ctx->u32WbcWidth;
2205*4882a593Smuzhiyun     ctx->stWbcCfg.stWbcAttr.stTargetSize.u32Height =  ctx->u32WbcHeight;
2206*4882a593Smuzhiyun 
2207*4882a593Smuzhiyun     Sample_Print("wbc format is %x\n", ctx->stWbcCfg.stWbcAttr.enPixelFormat);
2208*4882a593Smuzhiyun 
2209*4882a593Smuzhiyun     RK_MPI_VO_SetWbcAttr(VoWbc, &ctx->stWbcCfg.stWbcAttr);
2210*4882a593Smuzhiyun     RK_MPI_VO_EnableWbc(VoWbc);
2211*4882a593Smuzhiyun 
2212*4882a593Smuzhiyun     Sample_Print("--------------\nWBC Enabled\n---------------\n");
2213*4882a593Smuzhiyun 
2214*4882a593Smuzhiyun     if (ctx->wbc_auto == RK_TRUE) {
2215*4882a593Smuzhiyun         /* Bind WBC to HD1 */
2216*4882a593Smuzhiyun         if (ctx->wbc_bind == RK_TRUE)
2217*4882a593Smuzhiyun             Sample_VO_BindVoWbc(VoWbc, VoLayer, 0);
2218*4882a593Smuzhiyun 
2219*4882a593Smuzhiyun         while (1) {
2220*4882a593Smuzhiyun             Sample_Print("Press 'q' to quit\n");
2221*4882a593Smuzhiyun             if (getchar() == 'q')
2222*4882a593Smuzhiyun                 break;
2223*4882a593Smuzhiyun         }
2224*4882a593Smuzhiyun         Sample_VO_StopSendPicture_Mosaic(tThreadID, &stThreadParam);
2225*4882a593Smuzhiyun         Sample_Print("Stop WBC\n");
2226*4882a593Smuzhiyun         Sample_VO_UnBindVoWbc(VoWbc, VoLayer, 0);
2227*4882a593Smuzhiyun         RK_MPI_VO_DisableWbc(VoWbc);
2228*4882a593Smuzhiyun         Sample_Print("Stop HD1\n");
2229*4882a593Smuzhiyun         Sample_VO_MultiWindowns_Stop(VoLayer, 1);
2230*4882a593Smuzhiyun         Sample_VO_StopLayer(VoLayer);
2231*4882a593Smuzhiyun         Sample_VO_StopDev(VoDev);
2232*4882a593Smuzhiyun         RK_MPI_VO_UnBindLayer(VoLayer, VoDev);
2233*4882a593Smuzhiyun         Sample_Print("Stop HD0\n");
2234*4882a593Smuzhiyun         VoDev = RK356X_VO_DEV_HD0;
2235*4882a593Smuzhiyun         VoLayer = RK356X_VOP_LAYER_CLUSTER_0;
2236*4882a593Smuzhiyun 
2237*4882a593Smuzhiyun         Sample_VO_MultiWindowns_Stop(VoLayer, u32Windows);
2238*4882a593Smuzhiyun         Sample_VO_StopLayer(VoLayer);
2239*4882a593Smuzhiyun         Sample_VO_StopDev(VoDev);
2240*4882a593Smuzhiyun         RK_MPI_VO_CloseFd();
2241*4882a593Smuzhiyun     }
2242*4882a593Smuzhiyun 
2243*4882a593Smuzhiyun     return s32Ret;
2244*4882a593Smuzhiyun }
2245*4882a593Smuzhiyun 
2246*4882a593Smuzhiyun static RK_S32 check_options(const TEST_VO_CTX_S *ctx) {
2247*4882a593Smuzhiyun     if (ctx->VoDev > VO_MAX_DEV_NUM) {
2248*4882a593Smuzhiyun         RK_LOGE("illegal param, pls enter 0 or 1 max Vodev is %d!", VO_MAX_DEV_NUM);
2249*4882a593Smuzhiyun         goto __FAILED;
2250*4882a593Smuzhiyun     }
2251*4882a593Smuzhiyun     if ((ctx->VoLayerMode == 2) && (ctx->VoLayer > VO_MAX_LAYER_NUM)) {
2252*4882a593Smuzhiyun         RK_LOGE("illegal param, pls enter 0 or 2 max VoLyer is %d!", VO_MAX_LAYER_NUM);
2253*4882a593Smuzhiyun         goto __FAILED;
2254*4882a593Smuzhiyun     }
2255*4882a593Smuzhiyun     if ((ctx->VoLayerMode == 1) && (ctx->VoLayer > VO_MAX_LAYER_NUM)) {
2256*4882a593Smuzhiyun         RK_LOGE("illegal param, pls enter 4 or 5 max VoLyer is %d!", VO_MAX_LAYER_NUM);
2257*4882a593Smuzhiyun         goto __FAILED;
2258*4882a593Smuzhiyun     }
2259*4882a593Smuzhiyun     if (ctx->u32Windows <= 0 || ctx->u32Windows >= MAX_WINDOWS_NUM) {
2260*4882a593Smuzhiyun         RK_LOGE("illegal param, windos rang [1,63] max u32Windows is %d!", MAX_WINDOWS_NUM);
2261*4882a593Smuzhiyun         goto __FAILED;
2262*4882a593Smuzhiyun     }
2263*4882a593Smuzhiyun     if (ctx->u32WbcPixFormat >= MAX_VO_FORMAT_RGB_NUM) {
2264*4882a593Smuzhiyun         RK_LOGE("illegal param, WBC PixFormat rang [0,3]");
2265*4882a593Smuzhiyun         goto __FAILED;
2266*4882a593Smuzhiyun     }
2267*4882a593Smuzhiyun     if (ctx->s32PixFormat > MAX_VO_FORMAT_RGB_NUM) {
2268*4882a593Smuzhiyun         RK_LOGE("illegal param, Vidoe PixFormat rang [0,17]");
2269*4882a593Smuzhiyun         goto __FAILED;
2270*4882a593Smuzhiyun     }
2271*4882a593Smuzhiyun 
2272*4882a593Smuzhiyun     return RK_SUCCESS;
2273*4882a593Smuzhiyun 
2274*4882a593Smuzhiyun __FAILED:
2275*4882a593Smuzhiyun     return RK_FAILURE;
2276*4882a593Smuzhiyun }
2277*4882a593Smuzhiyun 
2278*4882a593Smuzhiyun static const char *const usages[] = {
2279*4882a593Smuzhiyun     "./rk_mpi_vo_test [-i SRC_PATH] [--imag_width IMG_WIDTH]"
2280*4882a593Smuzhiyun     "[--imag_height IMG_HEIGHT] [--dis_width DIS_WIDTH] [--dis_height DIS_HEIGHT]...",
2281*4882a593Smuzhiyun     NULL,
2282*4882a593Smuzhiyun };
2283*4882a593Smuzhiyun 
2284*4882a593Smuzhiyun static void  mpi_vo_test_show_options(const TEST_VO_CTX_S *ctx) {
2285*4882a593Smuzhiyun     RK_PRINT("cmd parse result:\n");
2286*4882a593Smuzhiyun     RK_PRINT("vop device id                   : %d\n", ctx->VoDev);
2287*4882a593Smuzhiyun     RK_PRINT("vop layer id                    : %d\n", ctx->VoLayer);
2288*4882a593Smuzhiyun     RK_PRINT("window size                     : %d\n", ctx->u32Windows);
2289*4882a593Smuzhiyun     RK_PRINT("connector type                  : %d\n", ctx->enIntfType);
2290*4882a593Smuzhiyun     RK_PRINT("display mode                    : %d\n", ctx->enIntfSync);
2291*4882a593Smuzhiyun     RK_PRINT("layer mode                      : %d\n", ctx->VoLayerMode);
2292*4882a593Smuzhiyun     RK_PRINT("display resolution rect X       : %d\n", ctx->s32X);
2293*4882a593Smuzhiyun     RK_PRINT("display resolution rect Y       : %d\n", ctx->s32Y);
2294*4882a593Smuzhiyun     RK_PRINT("display pixel format            : %d\n", ctx->s32PixFormat);
2295*4882a593Smuzhiyun     RK_PRINT("display resolution width        : %d\n", ctx->u32DispWidth);
2296*4882a593Smuzhiyun     RK_PRINT("display resolution height       : %d\n", ctx->u32DispHeight);
2297*4882a593Smuzhiyun     RK_PRINT("display resolution0 width       : %d\n", ctx->u32Screen0DisplayWidth);
2298*4882a593Smuzhiyun     RK_PRINT("display resolution0 height      : %d\n", ctx->u32Screen0DisplayHeight);
2299*4882a593Smuzhiyun     RK_PRINT("display resolution1 width       : %d\n", ctx->u32Screen1DisplayWidth);
2300*4882a593Smuzhiyun     RK_PRINT("display resolution1 height      : %d\n", ctx->u32Screen1DisplayHeight);
2301*4882a593Smuzhiyun     RK_PRINT("double screen                   : %d\n", ctx->bDoubleScreen);
2302*4882a593Smuzhiyun     RK_PRINT("display rate                    : %d\n", ctx->u32DispFrmRt);
2303*4882a593Smuzhiyun     RK_PRINT("display rate ratio              : %d\n", ctx->u32DispFrmRtRatio);
2304*4882a593Smuzhiyun     RK_PRINT("chn display mode                : %d\n", ctx->u32ChnDismode);
2305*4882a593Smuzhiyun     RK_PRINT("chn Border lpx                  : %d\n", ctx->stBorderCfg.u32LeftWidth);
2306*4882a593Smuzhiyun     RK_PRINT("chn Border rpx                  : %d\n", ctx->stBorderCfg.u32RightWidth);
2307*4882a593Smuzhiyun     RK_PRINT("chn Border tpx                  : %d\n", ctx->stBorderCfg.u32TopWidth);
2308*4882a593Smuzhiyun     RK_PRINT("chn Border bpx                  : %d\n", ctx->stBorderCfg.u32BottomWidth);
2309*4882a593Smuzhiyun     RK_PRINT("video aspect ratio mode         : %d\n", ctx->uEnMode);
2310*4882a593Smuzhiyun     RK_PRINT("input ImgWidth                  : %d\n", ctx->u32ImgeWidth);
2311*4882a593Smuzhiyun     RK_PRINT("input ImgHeight                 : %d\n", ctx->u32ImageHeight);
2312*4882a593Smuzhiyun     RK_PRINT("ui                              : %d\n", ctx->ui);
2313*4882a593Smuzhiyun     RK_PRINT("loopcount                       : %d\n", ctx->loopCount);
2314*4882a593Smuzhiyun     RK_PRINT("ui alpha                        : %d\n", ctx->ui_alpha);
2315*4882a593Smuzhiyun     RK_PRINT("wbc enable                      : %d\n", ctx->wbc_enable);
2316*4882a593Smuzhiyun     RK_PRINT("wbc bind enable                 : %d\n", ctx->wbc_bind);
2317*4882a593Smuzhiyun     RK_PRINT("wbc width                       : %d\n", ctx->u32WbcWidth);
2318*4882a593Smuzhiyun     RK_PRINT("wbc height                      : %d\n", ctx->u32WbcHeight);
2319*4882a593Smuzhiyun     RK_PRINT("wbc compress mode               : %d\n", ctx->u32WbcCompressMode);
2320*4882a593Smuzhiyun     RK_PRINT("wbc pixel format                : %d\n", ctx->u32WbcPixFormat);
2321*4882a593Smuzhiyun     RK_PRINT("wbc source type                 : %d\n", ctx->u32WbcSourceType);
2322*4882a593Smuzhiyun     RK_PRINT("wbc souce id                    : %d\n", ctx->u32WbcSourceId);
2323*4882a593Smuzhiyun }
2324*4882a593Smuzhiyun 
2325*4882a593Smuzhiyun void init_cfg(TEST_VO_CTX_S *ctx) {
2326*4882a593Smuzhiyun     RK_S32 i = 0;
2327*4882a593Smuzhiyun 
2328*4882a593Smuzhiyun     ctx->loopCount = 10;
2329*4882a593Smuzhiyun     ctx->u32Windows = 4;
2330*4882a593Smuzhiyun     ctx->enIntfType = 0;  /* 0: HDMI 1: EDP 2: VGA 3: DP */
2331*4882a593Smuzhiyun     ctx->enIntfSync = 16; /* 1080P60 */
2332*4882a593Smuzhiyun     ctx->enIntfSync_second = 6; /* 768P */
2333*4882a593Smuzhiyun 
2334*4882a593Smuzhiyun     ctx->VoDev = RK356X_VO_DEV_HD0;
2335*4882a593Smuzhiyun     ctx->VoLayer = RK356X_VOP_LAYER_CLUSTER_0;
2336*4882a593Smuzhiyun     ctx->VoLayerMode = 1; /* CURSOR = 0,GRAPHIC = 1,VIDEO = 2,*/
2337*4882a593Smuzhiyun 
2338*4882a593Smuzhiyun     ctx->u32ImgeWidth = 1920;
2339*4882a593Smuzhiyun     ctx->u32ImageHeight = 1080;
2340*4882a593Smuzhiyun 
2341*4882a593Smuzhiyun     ctx->bDoubleScreen = RK_TRUE;
2342*4882a593Smuzhiyun     ctx->stVoCfg.bDoubleScreen = RK_TRUE;
2343*4882a593Smuzhiyun     ctx->s32X = 0;
2344*4882a593Smuzhiyun     ctx->s32Y = 0;
2345*4882a593Smuzhiyun     ctx->u32Screen0DisplayWidth  = 1920;
2346*4882a593Smuzhiyun     ctx->u32Screen0DisplayHeight = 1080;
2347*4882a593Smuzhiyun     ctx->u32Screen1DisplayWidth  = 1024;
2348*4882a593Smuzhiyun     ctx->u32Screen1DisplayHeight = 768;
2349*4882a593Smuzhiyun 
2350*4882a593Smuzhiyun     ctx->u32Screen0ImageWidth  = 1920;
2351*4882a593Smuzhiyun     ctx->u32Screen0ImageHeight = 1080;
2352*4882a593Smuzhiyun     ctx->u32Screen1ImageWidth  = 1024;
2353*4882a593Smuzhiyun     ctx->u32Screen1ImageHeight = 768;
2354*4882a593Smuzhiyun 
2355*4882a593Smuzhiyun     ctx->u32DispWidth  = 1920;
2356*4882a593Smuzhiyun     ctx->u32DispHeight = 1080;
2357*4882a593Smuzhiyun     ctx->s32PixFormat = 5;
2358*4882a593Smuzhiyun     ctx->u32DispFrmRt = 30;
2359*4882a593Smuzhiyun     ctx->u32DispFrmRtRatio = 1;
2360*4882a593Smuzhiyun     ctx->uEnMode = 1;
2361*4882a593Smuzhiyun 
2362*4882a593Smuzhiyun     ctx->wbc_auto = RK_TRUE;
2363*4882a593Smuzhiyun     ctx->u32WbcWidth = 1024;
2364*4882a593Smuzhiyun     ctx->u32WbcHeight = 768;
2365*4882a593Smuzhiyun     ctx->u32WbcPixFormat = WBC_FORMAT_BGR888;
2366*4882a593Smuzhiyun     ctx->u32WbcCompressMode = COMPRESS_MODE_NONE;
2367*4882a593Smuzhiyun     ctx->u32WbcSourceType = WBC_SOURCE_VIDEO;
2368*4882a593Smuzhiyun     ctx->u32WbcSourceId = RK356X_VO_DEV_HD0;
2369*4882a593Smuzhiyun 
2370*4882a593Smuzhiyun     ctx->bVoPlay = RK_FALSE;
2371*4882a593Smuzhiyun     ctx->bBorder = RK_FALSE;
2372*4882a593Smuzhiyun     ctx->bHomologous = RK_FALSE;
2373*4882a593Smuzhiyun     ctx->u32Screen0Chn = 16;
2374*4882a593Smuzhiyun     ctx->u32Screen1Chn = 4;
2375*4882a593Smuzhiyun     ctx->bEnWbc = RK_FALSE;
2376*4882a593Smuzhiyun     ctx->wbc_bind = RK_FALSE;
2377*4882a593Smuzhiyun     ctx->bChnPriority = RK_FALSE;
2378*4882a593Smuzhiyun     ctx->bEnWbcToVO = RK_TRUE;
2379*4882a593Smuzhiyun     ctx->s32LoopCount = -1;
2380*4882a593Smuzhiyun     ctx->u32ChnDismode = VO_CHANNEL_PLAY_NORMAL;
2381*4882a593Smuzhiyun 
2382*4882a593Smuzhiyun     ctx->stVoCfg.u32Screen0VoLayer = RK356X_VOP_LAYER_CLUSTER_0;
2383*4882a593Smuzhiyun     ctx->stVoCfg.u32Screen1VoLayer = RK356X_VOP_LAYER_CLUSTER_1;
2384*4882a593Smuzhiyun     ctx->stVoCfg.u32Screen0Rows = 4;
2385*4882a593Smuzhiyun     ctx->stVoCfg.u32Screen1Rows = 3;
2386*4882a593Smuzhiyun 
2387*4882a593Smuzhiyun     ctx->stVdecCfg.u32FrameBufferCnt = MAX_FRAME_QUEUE;
2388*4882a593Smuzhiyun     ctx->stVdecCfg.enCompressMode = COMPRESS_AFBC_16x16;
2389*4882a593Smuzhiyun     ctx->stWbcCfg.stWbcSource.enSourceType = VO_WBC_SOURCE_VIDEO;
2390*4882a593Smuzhiyun     ctx->stWbcCfg.stWbcSource.u32SourceId = RK356X_VO_DEV_HD0;
2391*4882a593Smuzhiyun     ctx->stWbcCfg.stWbcAttr.enPixelFormat = RK_FMT_YUV420SP;
2392*4882a593Smuzhiyun     ctx->stWbcCfg.stWbcAttr.stTargetSize.u32Width = 1024;
2393*4882a593Smuzhiyun     ctx->stWbcCfg.stWbcAttr.stTargetSize.u32Height = 768;
2394*4882a593Smuzhiyun     ctx->stWbcCfg.stWbcAttr.u32FrameRate = 25;
2395*4882a593Smuzhiyun     ctx->stWbcCfg.stWbcAttr.enCompressMode = COMPRESS_MODE_NONE;
2396*4882a593Smuzhiyun     ctx->stWbcCfg.s32ChnId = 0;
2397*4882a593Smuzhiyun     ctx->stWbcCfg.s32VdecChnId = -1;
2398*4882a593Smuzhiyun 
2399*4882a593Smuzhiyun     ctx->stBorderCfg.u32BottomWidth = 2;
2400*4882a593Smuzhiyun     ctx->stBorderCfg.u32TopWidth = 2;
2401*4882a593Smuzhiyun     ctx->stBorderCfg.u32LeftWidth = 2;
2402*4882a593Smuzhiyun     ctx->stBorderCfg.u32RightWidth = 2;
2403*4882a593Smuzhiyun }
2404*4882a593Smuzhiyun 
2405*4882a593Smuzhiyun int main(int argc, const char **argv) {
2406*4882a593Smuzhiyun     RK_S32  s32Ret;
2407*4882a593Smuzhiyun     TEST_VO_CTX_S ctx;
2408*4882a593Smuzhiyun 
2409*4882a593Smuzhiyun     memset(&ctx, 0, sizeof(TEST_VO_CTX_S));
2410*4882a593Smuzhiyun 
2411*4882a593Smuzhiyun     init_cfg(&ctx);
2412*4882a593Smuzhiyun 
2413*4882a593Smuzhiyun     struct argparse_option options[] = {
2414*4882a593Smuzhiyun         OPT_HELP(),
2415*4882a593Smuzhiyun         OPT_GROUP("basic options:"),
2416*4882a593Smuzhiyun         OPT_STRING('i', "input",  &(ctx.cfgFileUri),
2417*4882a593Smuzhiyun                    "input config file. <required>", NULL, 0, 0),
2418*4882a593Smuzhiyun         OPT_INTEGER('d', "device_id", &(ctx.VoDev),
2419*4882a593Smuzhiyun                      "Vop id. e.g.(0/1). default(0).", NULL, 0, 0),
2420*4882a593Smuzhiyun         OPT_INTEGER('l', "layer_id", &(ctx.VoLayer),
2421*4882a593Smuzhiyun                      "Layer id. e.g.(0/2/4/6) default(0).", NULL, 0, 0),
2422*4882a593Smuzhiyun         OPT_INTEGER('\0', "wbc_enable", &(ctx.wbc_enable),
2423*4882a593Smuzhiyun                      "wbc_enalbe. e.g.(0) default(0).", NULL, 0, 0),
2424*4882a593Smuzhiyun         OPT_INTEGER('\0', "wbc_bind",  &(ctx.wbc_bind),
2425*4882a593Smuzhiyun                    "enable wbc bind, default(1): 0: disable, 1: enable", NULL, 0, 0),
2426*4882a593Smuzhiyun         OPT_INTEGER('\0', "ui", &(ctx.ui),
2427*4882a593Smuzhiyun                      "ui. e.g.(0) default(0).", NULL, 0, 0),
2428*4882a593Smuzhiyun         OPT_INTEGER('\0', "loopCount", &(ctx.loopCount),
2429*4882a593Smuzhiyun                      "loopCount. e.g.(0) default(10).", NULL, 0, 0),
2430*4882a593Smuzhiyun         OPT_INTEGER('\0', "ui_alpha", &(ctx.ui_alpha),
2431*4882a593Smuzhiyun                      "ui_alpha. e.g.(0) default(0).", NULL, 0, 0),
2432*4882a593Smuzhiyun         OPT_INTEGER('w', "Windows", &(ctx.u32Windows),
2433*4882a593Smuzhiyun                      "windows num. e.g [1-64] default(4),max is 63.", NULL, 0, 0),
2434*4882a593Smuzhiyun         OPT_INTEGER('\0', "ConnectorType", &(ctx.enIntfType),
2435*4882a593Smuzhiyun                      "Connctor Type. e.g.(0: HDMI 1: EDP 2: VGA). <required>", NULL, 0, 0),
2436*4882a593Smuzhiyun         OPT_INTEGER('\0', "layer_mode", &(ctx.VoLayerMode),
2437*4882a593Smuzhiyun                      "Layer type. e.g.(0: CURSOR 1: UI 2: Video). <required>", NULL, 0, 0),
2438*4882a593Smuzhiyun         OPT_INTEGER('\0', "display_mode", &(ctx.enIntfSync),
2439*4882a593Smuzhiyun                      "dispaly. e.g.(12/14) default (12. 12 is 1080P60). <required>", NULL, 0, 0),
2440*4882a593Smuzhiyun         OPT_INTEGER('\0', "display0_mode", &(ctx.enIntfSync_second),
2441*4882a593Smuzhiyun                      "dispaly. e.g.(12/14) default (12. 12 is 1080P60). <required>", NULL, 0, 0),
2442*4882a593Smuzhiyun         OPT_INTEGER('\0', "disp_frmrt", &(ctx.u32DispFrmRt),
2443*4882a593Smuzhiyun                      "disp_frmrt. default(25).", NULL, 0, 0),
2444*4882a593Smuzhiyun         OPT_INTEGER('\0', "disp_frmrt_ratio", &(ctx.u32DispFrmRtRatio),
2445*4882a593Smuzhiyun                      "disp_frmrt_ratio. e.g.(32, 16, 8, 4, 2 ,1). default(1).", NULL, 0, 0),
2446*4882a593Smuzhiyun         OPT_INTEGER('\0', "aspect_mode", &(ctx.uEnMode),
2447*4882a593Smuzhiyun                      "video aspect ratio."
2448*4882a593Smuzhiyun                      "e.g.(1: ratio no change 2: ratio manual set). default(1).", NULL, 0, 0),
2449*4882a593Smuzhiyun         OPT_INTEGER('\0', "border_lpx", &(ctx.stBorderCfg.u32LeftWidth),
2450*4882a593Smuzhiyun                      "chn Border lpx. default(2).", NULL, 0, 0),
2451*4882a593Smuzhiyun         OPT_INTEGER('\0', "border_rpx", &(ctx.stBorderCfg.u32RightWidth),
2452*4882a593Smuzhiyun                       "chn Border rpx. default(2).", NULL, 0, 0),
2453*4882a593Smuzhiyun         OPT_INTEGER('\0', "border_tpx", &(ctx.stBorderCfg.u32TopWidth),
2454*4882a593Smuzhiyun                      "chn Border tpx. default(2).", NULL, 0, 0),
2455*4882a593Smuzhiyun         OPT_INTEGER('\0', "border_bpx", &(ctx.stBorderCfg.u32BottomWidth),
2456*4882a593Smuzhiyun                      "chn Border bpx. default(2).", NULL, 0, 0),
2457*4882a593Smuzhiyun         OPT_INTEGER('\0', "disp_x", &(ctx.s32X),
2458*4882a593Smuzhiyun                      "disp_x. default(0).", NULL, 0, 0),
2459*4882a593Smuzhiyun         OPT_INTEGER('\0', "disp_y", &(ctx.s32Y),
2460*4882a593Smuzhiyun                     "disp_y. default(0).", NULL, 0, 0),
2461*4882a593Smuzhiyun         OPT_INTEGER('\0', "video_format", &(ctx.s32PixFormat),
2462*4882a593Smuzhiyun                      "video pixel format."
2463*4882a593Smuzhiyun                      "e.g.(0: ARGB8888 1: ABGR888 2: RGB888 3: BGR888 4: RK_FMT_YUV420SP)."
2464*4882a593Smuzhiyun                      "default(4. 4 is RGB888).", NULL, 0, 0),
2465*4882a593Smuzhiyun         OPT_INTEGER('\0', "disp_width", &(ctx.u32DispWidth),
2466*4882a593Smuzhiyun                      "dst width. e.g.(1920). <required>", NULL, 0, 0),
2467*4882a593Smuzhiyun         OPT_INTEGER('\0', "disp_height", &(ctx.u32DispHeight),
2468*4882a593Smuzhiyun                      "dst height. e.g.(1080). <required>", NULL, 0, 0),
2469*4882a593Smuzhiyun         OPT_INTEGER('\0', "image0_width", &(ctx.u32Screen0ImageWidth),
2470*4882a593Smuzhiyun                      "image0 width. e.g.(1920). <required>", NULL, 0, 0),
2471*4882a593Smuzhiyun         OPT_INTEGER('\0', "image0_height", &(ctx.u32Screen0ImageHeight),
2472*4882a593Smuzhiyun                      "image0 height. e.g.(1080). <required>", NULL, 0, 0),
2473*4882a593Smuzhiyun         OPT_INTEGER('\0', "image1_width", &(ctx.u32Screen1ImageWidth),
2474*4882a593Smuzhiyun                      "image1 width. e.g.(1024). <required>", NULL, 0, 0),
2475*4882a593Smuzhiyun         OPT_INTEGER('\0', "image1_height", &(ctx.u32Screen1ImageHeight),
2476*4882a593Smuzhiyun                      "image1 height. e.g.(768). <required>", NULL, 0, 0),
2477*4882a593Smuzhiyun         OPT_INTEGER('\0', "disp0_width", &(ctx.u32Screen0DisplayWidth),
2478*4882a593Smuzhiyun                      "dst width. e.g.(1920). <required>", NULL, 0, 0),
2479*4882a593Smuzhiyun         OPT_INTEGER('\0', "disp0_height", &(ctx.u32Screen0DisplayHeight),
2480*4882a593Smuzhiyun                      "dst height. e.g.(1080). <required>", NULL, 0, 0),
2481*4882a593Smuzhiyun         OPT_INTEGER('\0', "disp1_width", &(ctx.u32Screen1DisplayWidth),
2482*4882a593Smuzhiyun                      "dst width. e.g.(1024). <required>", NULL, 0, 0),
2483*4882a593Smuzhiyun         OPT_INTEGER('\0', "disp1_height", &(ctx.u32Screen1DisplayHeight),
2484*4882a593Smuzhiyun                      "dst height. e.g.(768). <required>", NULL, 0, 0),
2485*4882a593Smuzhiyun         OPT_INTEGER('\0', "image_width", &(ctx.u32ImgeWidth),
2486*4882a593Smuzhiyun                      "dst width. e.g.(1920). <required>", NULL, 0, 0),
2487*4882a593Smuzhiyun         OPT_INTEGER('\0', "image_height", &(ctx.u32ImageHeight),
2488*4882a593Smuzhiyun                      "dst height. e.g.(1080). <required>", NULL, 0, 0),
2489*4882a593Smuzhiyun         OPT_INTEGER('\0', "wbc_width", &(ctx.u32WbcWidth),
2490*4882a593Smuzhiyun                      "dst width. e.g.(1920). <required>", NULL, 0, 0),
2491*4882a593Smuzhiyun         OPT_INTEGER('\0', "wbc_height", &(ctx.u32WbcHeight),
2492*4882a593Smuzhiyun                      "dst height. e.g.(1080). <required>", NULL, 0, 0),
2493*4882a593Smuzhiyun         OPT_INTEGER('\0', "wbc_compress", &(ctx.u32WbcCompressMode),
2494*4882a593Smuzhiyun                      "wbc compress mode. default(0).", NULL, 0, 0),
2495*4882a593Smuzhiyun         OPT_INTEGER('\0', "wbc_format", &(ctx.u32WbcPixFormat),
2496*4882a593Smuzhiyun                      "wbc pixel format."
2497*4882a593Smuzhiyun                      "e.g.(0: ARGB8888 1: ABGR888 2: RGB888 3: BGR888)."
2498*4882a593Smuzhiyun                      "default(0).", NULL, 0, 0),
2499*4882a593Smuzhiyun         OPT_INTEGER('\0', "wbc_type", &(ctx.u32WbcSourceType),
2500*4882a593Smuzhiyun                      "wbc souce type. e.g.(0: dev 1: video default(1).", NULL, 0, 0),
2501*4882a593Smuzhiyun         OPT_INTEGER('\0', "wbc_id", &(ctx.u32WbcSourceId),
2502*4882a593Smuzhiyun                      "wbc souce id. default(0).", NULL, 0, 0),
2503*4882a593Smuzhiyun         OPT_STRING('\0', "voplay",  &(ctx.bVoPlay),
2504*4882a593Smuzhiyun                    "play video test, default(0): 0: RK_FALSE, 1: RK_TRUE", NULL, 0, 0),
2505*4882a593Smuzhiyun         OPT_STRING('\0', "bBorder",  &(ctx.bBorder),
2506*4882a593Smuzhiyun                    "Border enable, default(0): 0: RK_FALSE, 1: RK_TRUE", NULL, 0, 0),
2507*4882a593Smuzhiyun         OPT_STRING('\0', "wbc_auto",  &(ctx.wbc_auto),
2508*4882a593Smuzhiyun                    "wbc auto bind, default(1): 0: RK_FALSE, 1: RK_TRUE", NULL, 0, 0),
2509*4882a593Smuzhiyun         OPT_INTEGER('\0', "screen0_chn", &(ctx.u32Screen0Chn),
2510*4882a593Smuzhiyun                     "the channel num of screen0. default(16)", NULL, 0, 0),
2511*4882a593Smuzhiyun         OPT_INTEGER('\0', "chn_display", &(ctx.u32ChnDismode),
2512*4882a593Smuzhiyun                      "the chn dispaly mode."
2513*4882a593Smuzhiyun                      "e.g.(0: normol 1: pause 2: step 3: speed).default(0).", NULL, 0, 0),
2514*4882a593Smuzhiyun         OPT_INTEGER('\0', "screen1_chn", &(ctx.u32Screen1Chn),
2515*4882a593Smuzhiyun                     "the channel num of screen1 default(4)", NULL, 0, 0),
2516*4882a593Smuzhiyun         OPT_INTEGER('\0', "screen0_rows", &(ctx.stVoCfg.u32Screen0Rows),
2517*4882a593Smuzhiyun                     "the rows/cols of screen0 display. default(4: 4x4)", NULL, 0, 0),
2518*4882a593Smuzhiyun         OPT_INTEGER('\0', "screen1_rows", &(ctx.stVoCfg.u32Screen1Rows),
2519*4882a593Smuzhiyun                     "the rows/cols of screen1 display.default(3 : 3x3)", NULL, 0, 0),
2520*4882a593Smuzhiyun         OPT_INTEGER('\0', "en_wbc", &(ctx.bEnWbc),
2521*4882a593Smuzhiyun                     "enable wbc. default(0)", NULL, 0, 0),
2522*4882a593Smuzhiyun         OPT_INTEGER('\0', "en_chnPriority", &(ctx.bChnPriority),
2523*4882a593Smuzhiyun                     "enable Chn Priority. default(0)", NULL, 0, 0),
2524*4882a593Smuzhiyun         OPT_INTEGER('\0', "wbc_src",  &(ctx.stWbcCfg.stWbcSource.u32SourceId),
2525*4882a593Smuzhiyun                    "the source of wbc, default(1)", NULL, 0, 0),
2526*4882a593Smuzhiyun         OPT_INTEGER('\0', "double_screen",  &(ctx.bDoubleScreen),
2527*4882a593Smuzhiyun                    "double screen or not, default(1): 0: FALSE, 1: TRUE", NULL, 0, 0),
2528*4882a593Smuzhiyun         OPT_INTEGER('\0', "Homologous",  &(ctx.bHomologous),
2529*4882a593Smuzhiyun                    "Homologous Display, default(0)", NULL, 0, 0),
2530*4882a593Smuzhiyun         OPT_END(),
2531*4882a593Smuzhiyun     };
2532*4882a593Smuzhiyun 
2533*4882a593Smuzhiyun     struct argparse argparse;
2534*4882a593Smuzhiyun     argparse_init(&argparse, options, usages, 0);
2535*4882a593Smuzhiyun     argparse_describe(&argparse, "\nselect a test case to run.",
2536*4882a593Smuzhiyun                                  "\nuse --help for details.");
2537*4882a593Smuzhiyun 
2538*4882a593Smuzhiyun     argc = argparse_parse(&argparse, argc, argv);
2539*4882a593Smuzhiyun 
2540*4882a593Smuzhiyun     mpi_vo_test_show_options(&ctx);
2541*4882a593Smuzhiyun 
2542*4882a593Smuzhiyun     if (check_options(&ctx)) {
2543*4882a593Smuzhiyun         RK_LOGE("illegal input parameters");
2544*4882a593Smuzhiyun         argparse_usage(&argparse);
2545*4882a593Smuzhiyun         goto __FAILED;
2546*4882a593Smuzhiyun     }
2547*4882a593Smuzhiyun 
2548*4882a593Smuzhiyun     if (RK_MPI_SYS_Init() != RK_SUCCESS) {
2549*4882a593Smuzhiyun         goto __FAILED;
2550*4882a593Smuzhiyun     }
2551*4882a593Smuzhiyun 
2552*4882a593Smuzhiyun     if (ctx.wbc_enable) {
2553*4882a593Smuzhiyun         Sample_VO_Video_Homologous(&ctx);
2554*4882a593Smuzhiyun     } else if (ctx.ui_alpha) {
2555*4882a593Smuzhiyun         Sample_VO_Demo_Alpha(&ctx);
2556*4882a593Smuzhiyun     } else if (ctx.ui) {
2557*4882a593Smuzhiyun         Sample_VO_Demo_UI(&ctx);
2558*4882a593Smuzhiyun     } else if (ctx.bVoPlay) {
2559*4882a593Smuzhiyun          unit_mpi_voplay_test(&ctx);
2560*4882a593Smuzhiyun     } else {
2561*4882a593Smuzhiyun         Sample_VO_Demo_Video_Mosaic(&ctx);
2562*4882a593Smuzhiyun     }
2563*4882a593Smuzhiyun 
2564*4882a593Smuzhiyun     Sample_Print("test running ok.");
2565*4882a593Smuzhiyun 
2566*4882a593Smuzhiyun     return RK_SUCCESS;
2567*4882a593Smuzhiyun __FAILED:
2568*4882a593Smuzhiyun     RK_LOGE("test running failed!");
2569*4882a593Smuzhiyun     return RK_FAILURE;
2570*4882a593Smuzhiyun }
2571