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