#include #include #include #include #include #include #include #include #include #include #include #include "cvi_buffer.h" #include "cvi_ae_comm.h" #include "cvi_awb_comm.h" #include "cvi_comm_isp.h" #include "sample_comm.h" #define VPSS_FILENAME_IN "./res/1080p.yuv420" #define VPSS_FILENAME_OUT "./res/output" CVI_S32 SAMPLE_VIO_TWO_DEV_VO(void) { MMF_VERSION_S stVersion; SAMPLE_INI_CFG_S stIniCfg = {0}; SAMPLE_VI_CONFIG_S stViConfig; COMPRESS_MODE_E enCompressMode = COMPRESS_MODE_NONE; VB_CONFIG_S stVbConf; PIC_SIZE_E enPicSize; CVI_U32 u32BlkSize; CVI_U32 chnID = 0; SIZE_S stSize; CVI_S32 s32Ret = CVI_SUCCESS; LOG_LEVEL_CONF_S log_conf; stIniCfg = (SAMPLE_INI_CFG_S) { .enSource = VI_PIPE_FRAME_SOURCE_DEV, .devNum = 2, .enSnsType[0] = SONY_IMX327_2L_MIPI_2M_30FPS_12BIT, .enWDRMode[0] = WDR_MODE_NONE, .s32BusId[0] = 3, .MipiDev[0] = 0xff, .enSnsType[1] = SONY_IMX327_SLAVE_MIPI_2M_30FPS_12BIT, .s32BusId[1] = 0, .MipiDev[1] = 0xff, }; CVI_SYS_GetVersion(&stVersion); SAMPLE_PRT("MMF Version:%s\n", stVersion.version); log_conf.enModId = CVI_ID_LOG; log_conf.s32Level = CVI_DBG_INFO; CVI_LOG_SetLevelConf(&log_conf); // Get config from ini if found. s32Ret = SAMPLE_COMM_VI_ParseIni(&stIniCfg); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("Parse fail\n"); } else { SAMPLE_PRT("Parse complete\n"); } //Set sensor number CVI_VI_SetDevNum(stIniCfg.devNum); /************************************************ * step1: Config VI ************************************************/ s32Ret = SAMPLE_COMM_VI_IniToViCfg(&stIniCfg, &stViConfig); if (s32Ret != CVI_SUCCESS) return s32Ret; /************************************************ * step2: Get input size ************************************************/ s32Ret = SAMPLE_COMM_VI_GetSizeBySensor(stIniCfg.enSnsType[0], &enPicSize); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "SAMPLE_COMM_VI_GetSizeBySensor failed with %#x\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_SYS_GetPicSize(enPicSize, &stSize); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed with %#x\n", s32Ret); return s32Ret; } /************************************************ * step3: Init modules ************************************************/ memset(&stVbConf, 0, sizeof(VB_CONFIG_S)); stVbConf.u32MaxPoolCnt = 2; u32BlkSize = COMMON_GetPicBufferSize(stSize.u32Width, stSize.u32Height, SAMPLE_PIXEL_FORMAT, DATA_BITWIDTH_8, enCompressMode, DEFAULT_ALIGN); stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; stVbConf.astCommPool[0].u32BlkCnt = 5; SAMPLE_PRT("common pool[0] BlkSize %d\n", u32BlkSize); //Control the second sensor resolution to avoid issues that can't get VB BLK. u32BlkSize = COMMON_GetPicBufferSize(768, 1280, SAMPLE_PIXEL_FORMAT, DATA_BITWIDTH_8, enCompressMode, DEFAULT_ALIGN); stVbConf.astCommPool[1].u32BlkSize = u32BlkSize; stVbConf.astCommPool[1].u32BlkCnt = 8; SAMPLE_PRT("common pool[1] BlkSize %d\n", u32BlkSize); s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("system init failed with %#x\n", s32Ret); return -1; } s32Ret = SAMPLE_PLAT_VI_INIT(&stViConfig); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "vi init failed. s32Ret: 0x%x !\n", s32Ret); return s32Ret; } /************************************************ * step5: Init VPSS ************************************************/ SIZE_S stSizeIn, stSizeOut; stSizeIn.u32Width = stSize.u32Width; stSizeIn.u32Height = stSize.u32Height; stSizeOut.u32Width = 1280; stSizeOut.u32Height = 720; s32Ret = SAMPLE_PLAT_VPSS_INIT(0, stSizeIn, stSizeOut); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("vpss init failed. s32Ret: 0x%x !\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_PLAT_VPSS_INIT(1, stSizeIn, stSizeOut); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("vpss init failed. s32Ret: 0x%x !\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_VI_Bind_VPSS(0, 0, 0); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("vi bind vpss failed. s32Ret: 0x%x !\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_VI_Bind_VPSS(0, 1, 1); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("vi bind vpss failed. s32Ret: 0x%x !\n", s32Ret); return s32Ret; } /************************************************ * step5: Init VO ************************************************/ SAMPLE_VO_CONFIG_S stVoConfig; RECT_S stDefDispRect = {0, 0, 720, 1280}; SIZE_S stDefImageSize = {720, 1280}; // VO_CHN VoChn = 0; s32Ret = SAMPLE_COMM_VO_GetDefConfig(&stVoConfig); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "SAMPLE_COMM_VO_GetDefConfig failed with %#x\n", s32Ret); return s32Ret; } stVoConfig.VoDev = 0; stVoConfig.stVoPubAttr.enIntfType = VO_INTF_MIPI; stVoConfig.stVoPubAttr.enIntfSync = VO_OUTPUT_720x1280_60; stVoConfig.stDispRect = stDefDispRect; stVoConfig.stImageSize = stDefImageSize; stVoConfig.enPixFormat = SAMPLE_PIXEL_FORMAT; stVoConfig.enVoMode = VO_MODE_1MUX; s32Ret = SAMPLE_COMM_VO_StartVO(&stVoConfig); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("SAMPLE_COMM_VO_StartVO failed with %#x\n", s32Ret); return s32Ret; } CVI_VO_SetChnRotation(0, 0, ROTATION_90); CVI_S32 vo_bind_vpssgrp = 0; SAMPLE_COMM_VPSS_Bind_VO(0, 0, 0, 0); sleep(1); do { printf("Please input show sensorID or input 255 to exit\n"); scanf("%d", &chnID); if (chnID == 0) { if (vo_bind_vpssgrp == 0) continue; else if (vo_bind_vpssgrp == 1) { SAMPLE_COMM_VPSS_UnBind_VO(1, 0, 0, 0); SAMPLE_COMM_VPSS_Bind_VO(0, 0, 0, 0); vo_bind_vpssgrp = 0; } } else if (chnID == 1) { if (vo_bind_vpssgrp == 1) continue; else if (vo_bind_vpssgrp == 0) { SAMPLE_COMM_VPSS_UnBind_VO(0, 0, 0, 0); SAMPLE_COMM_VPSS_Bind_VO(1, 0, 0, 0); vo_bind_vpssgrp = 1; } } } while (chnID != 255); SAMPLE_PRT("vo_bind_vpssgrp = %d\n",vo_bind_vpssgrp); if (vo_bind_vpssgrp == 0) SAMPLE_COMM_VPSS_UnBind_VO(0, 0, 0, 0); else if (vo_bind_vpssgrp == 1) { SAMPLE_COMM_VPSS_UnBind_VO(1, 0, 0, 0); vo_bind_vpssgrp = 0; } SAMPLE_COMM_VO_StopVO(&stVoConfig); SAMPLE_COMM_VI_UnBind_VPSS(0, 0, 0); SAMPLE_COMM_VI_UnBind_VPSS(0, 1, 1); CVI_BOOL abChnEnable[VPSS_MAX_PHY_CHN_NUM] = {0}; abChnEnable[0] = CVI_TRUE; SAMPLE_COMM_VPSS_Stop(0, abChnEnable); abChnEnable[0] = CVI_TRUE; SAMPLE_COMM_VPSS_Stop(1, abChnEnable); SAMPLE_COMM_VI_DestroyIsp(&stViConfig); SAMPLE_COMM_VI_DestroyVi(&stViConfig); SAMPLE_COMM_SYS_Exit(); return s32Ret; } CVI_S32 SAMPLE_VIO_VoRotation(void) { COMPRESS_MODE_E enCompressMode = COMPRESS_MODE_NONE; VB_CONFIG_S stVbConf; PIC_SIZE_E enPicSize; CVI_U32 u32BlkSize; SIZE_S stSize; CVI_S32 s32Ret = CVI_SUCCESS; VI_DEV ViDev = 0; VI_PIPE ViPipe = 0; VI_CHN ViChn = 0; CVI_S32 s32WorkSnsId = 0; SAMPLE_VI_CONFIG_S stViConfig; VI_PIPE_ATTR_S stPipeAttr; SAMPLE_INI_CFG_S stIniCfg = {0}; stIniCfg = (SAMPLE_INI_CFG_S) { .enSource = VI_PIPE_FRAME_SOURCE_DEV, .devNum = 1, .enSnsType[0] = SONY_IMX327_2L_MIPI_2M_30FPS_12BIT, .enWDRMode[0] = WDR_MODE_NONE, .s32BusId[0] = 3, .MipiDev[0] = 0xff, .enSnsType[1] = SONY_IMX327_SLAVE_MIPI_2M_30FPS_12BIT, .s32BusId[1] = 0, .MipiDev[1] = 0xff, }; // Get config from ini if found. s32Ret = SAMPLE_COMM_VI_ParseIni(&stIniCfg); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("Parse fail\n"); } else { SAMPLE_PRT("Parse complete\n"); } if (stIniCfg.devNum > 1) { SAMPLE_PRT("Only support 1 sensor device\n"); return CVI_FAILURE; } CVI_VI_SetDevNum(stIniCfg.devNum); /************************************************ * step1: Config VI ************************************************/ s32Ret = SAMPLE_COMM_VI_IniToViCfg(&stIniCfg, &stViConfig); if (s32Ret != CVI_SUCCESS) return s32Ret; /************************************************ * step2: Get input size ************************************************/ s32Ret = SAMPLE_COMM_VI_GetSizeBySensor(stViConfig.astViInfo[s32WorkSnsId].stSnsInfo.enSnsType, &enPicSize); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("SAMPLE_COMM_VI_GetSizeBySensor failed with %#x\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_SYS_GetPicSize(enPicSize, &stSize); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed with %#x\n", s32Ret); return s32Ret; } /************************************************ * step3: Init SYS and common VB ************************************************/ memset(&stVbConf, 0, sizeof(VB_CONFIG_S)); stVbConf.u32MaxPoolCnt = 1; u32BlkSize = COMMON_GetPicBufferSize(stSize.u32Width, stSize.u32Height, SAMPLE_PIXEL_FORMAT, DATA_BITWIDTH_8 , enCompressMode, DEFAULT_ALIGN); stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; stVbConf.astCommPool[0].u32BlkCnt = 8; SAMPLE_PRT("common pool[0] BlkSize %d\n", u32BlkSize); s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("system init failed with %#x\n", s32Ret); return -1; } /************************************************ * step4: Init VI ISP ************************************************/ s32Ret = SAMPLE_COMM_VI_StartSensor(&stViConfig); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "system start sensor failed with %#x\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_VI_StartDev(&stViConfig.astViInfo[ViDev]); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "VI_StartDev failed with %#x!\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_VI_StartMIPI(&stViConfig); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "system start MIPI failed with %#x\n", s32Ret); return s32Ret; } stPipeAttr.bYuvSkip = CVI_FALSE; stPipeAttr.u32MaxW = stSize.u32Width; stPipeAttr.u32MaxH = stSize.u32Height; stPipeAttr.enPixFmt = PIXEL_FORMAT_RGB_BAYER_12BPP; stPipeAttr.enBitWidth = DATA_BITWIDTH_12; stPipeAttr.stFrameRate.s32SrcFrameRate = -1; stPipeAttr.stFrameRate.s32DstFrameRate = -1; stPipeAttr.bNrEn = CVI_TRUE; stPipeAttr.bYuvBypassPath = CVI_FALSE; stPipeAttr.enCompressMode = stViConfig.astViInfo[0].stChnInfo.enCompressMode; s32Ret = CVI_VI_CreatePipe(ViPipe, &stPipeAttr); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("CVI_VI_CreatePipe failed with %#x!\n", s32Ret); return s32Ret; } s32Ret = CVI_VI_StartPipe(ViPipe); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("CVI_VI_StartPipe failed with %#x!\n", s32Ret); return s32Ret; } s32Ret = CVI_VI_GetPipeAttr(ViPipe, &stPipeAttr); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("CVI_VI_StartPipe failed with %#x!\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_VI_CreateIsp(&stViConfig); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "VI_CreateIsp failed with %#x!\n", s32Ret); return s32Ret; } SAMPLE_COMM_VI_StartViChn(&stViConfig); /************************************************ * step5: Init VPSS ************************************************/ VPSS_GRP VpssGrp = 0; VPSS_GRP_ATTR_S stVpssGrpAttr; VPSS_CHN VpssChn = VPSS_CHN0; CVI_BOOL abChnEnable[VPSS_MAX_PHY_CHN_NUM] = {0}; VPSS_CHN_ATTR_S astVpssChnAttr[VPSS_MAX_PHY_CHN_NUM] = {0}; stVpssGrpAttr.stFrameRate.s32SrcFrameRate = -1; stVpssGrpAttr.stFrameRate.s32DstFrameRate = -1; stVpssGrpAttr.enPixelFormat = SAMPLE_PIXEL_FORMAT; stVpssGrpAttr.u32MaxW = stSize.u32Width; stVpssGrpAttr.u32MaxH = stSize.u32Height; stVpssGrpAttr.u8VpssDev = 0; astVpssChnAttr[VpssChn].u32Width = 1280; astVpssChnAttr[VpssChn].u32Height = 720; astVpssChnAttr[VpssChn].enVideoFormat = VIDEO_FORMAT_LINEAR; astVpssChnAttr[VpssChn].enPixelFormat = SAMPLE_PIXEL_FORMAT; astVpssChnAttr[VpssChn].stFrameRate.s32SrcFrameRate = 30; astVpssChnAttr[VpssChn].stFrameRate.s32DstFrameRate = 30; astVpssChnAttr[VpssChn].u32Depth = 0; astVpssChnAttr[VpssChn].bMirror = CVI_FALSE; astVpssChnAttr[VpssChn].bFlip = CVI_FALSE; astVpssChnAttr[VpssChn].stAspectRatio.enMode = ASPECT_RATIO_NONE; astVpssChnAttr[VpssChn].stNormalize.bEnable = CVI_FALSE; /*start vpss*/ abChnEnable[0] = CVI_TRUE; s32Ret = SAMPLE_COMM_VPSS_Init(VpssGrp, abChnEnable, &stVpssGrpAttr, astVpssChnAttr); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("init vpss group failed. s32Ret: 0x%x !\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_VPSS_Start(VpssGrp, abChnEnable, &stVpssGrpAttr, astVpssChnAttr); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("start vpss group failed. s32Ret: 0x%x !\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_VI_Bind_VPSS(ViPipe, ViChn, VpssGrp); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("vi bind vpss failed. s32Ret: 0x%x !\n", s32Ret); return s32Ret; } /************************************************ * step6: Init VO ************************************************/ SAMPLE_VO_CONFIG_S stVoConfig; RECT_S stDefDispRect = {0, 0, 720, 1280}; SIZE_S stDefImageSize = {720, 1280}; VO_CHN VoChn = 0; s32Ret = SAMPLE_COMM_VO_GetDefConfig(&stVoConfig); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "SAMPLE_COMM_VO_GetDefConfig failed with %#x\n", s32Ret); return s32Ret; } stVoConfig.VoDev = 0; stVoConfig.stVoPubAttr.enIntfType = VO_INTF_MIPI; stVoConfig.stVoPubAttr.enIntfSync = VO_OUTPUT_720x1280_60; stVoConfig.stDispRect = stDefDispRect; stVoConfig.stImageSize = stDefImageSize; stVoConfig.enPixFormat = SAMPLE_PIXEL_FORMAT; stVoConfig.enVoMode = VO_MODE_1MUX; s32Ret = SAMPLE_COMM_VO_StartVO(&stVoConfig); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("SAMPLE_COMM_VO_StartVO failed with %#x\n", s32Ret); return s32Ret; } CVI_VO_SetChnRotation(stVoConfig.VoDev, VoChn, ROTATION_90); SAMPLE_COMM_VPSS_Bind_VO(VpssGrp, VpssChn, stVoConfig.VoDev, VoChn); PAUSE(); SAMPLE_COMM_VPSS_UnBind_VO(VpssGrp, VpssChn, stVoConfig.VoDev, VoChn); SAMPLE_COMM_VO_StopVO(&stVoConfig); SAMPLE_COMM_VI_UnBind_VPSS(ViPipe, ViChn, VpssGrp); SAMPLE_COMM_VPSS_Stop(VpssGrp, abChnEnable); SAMPLE_COMM_VI_DestroyIsp(&stViConfig); SAMPLE_COMM_VI_DestroyVi(&stViConfig); SAMPLE_COMM_SYS_Exit(); return s32Ret; } CVI_S32 SAMPLE_VIO_ViVpssAspectRatio(void) { COMPRESS_MODE_E enCompressMode = COMPRESS_MODE_NONE; VB_CONFIG_S stVbConf; PIC_SIZE_E enPicSize; CVI_U32 u32BlkSize; SIZE_S stSize; CVI_S32 s32Ret = CVI_SUCCESS; VI_DEV ViDev = 0; VI_PIPE ViPipe = 0; VI_CHN ViChn = 0; CVI_S32 s32WorkSnsId = 0; SAMPLE_VI_CONFIG_S stViConfig; VI_PIPE_ATTR_S stPipeAttr; SAMPLE_INI_CFG_S stIniCfg = {0}; stIniCfg = (SAMPLE_INI_CFG_S) { .enSource = VI_PIPE_FRAME_SOURCE_DEV, .devNum = 1, .enSnsType[0] = SONY_IMX327_2L_MIPI_2M_30FPS_12BIT, .enWDRMode[0] = WDR_MODE_NONE, .s32BusId[0] = 3, .MipiDev[0] = 0xff, .enSnsType[1] = SONY_IMX327_SLAVE_MIPI_2M_30FPS_12BIT, .s32BusId[1] = 0, .MipiDev[1] = 0xff, }; // Get config from ini if found. s32Ret = SAMPLE_COMM_VI_ParseIni(&stIniCfg); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("Parse fail\n"); } else { SAMPLE_PRT("Parse complete\n"); } if (stIniCfg.devNum > 1) { SAMPLE_PRT("Only support 1 sensor device\n"); return CVI_FAILURE; } CVI_VI_SetDevNum(stIniCfg.devNum); /************************************************ * step1: Config VI ************************************************/ s32Ret = SAMPLE_COMM_VI_IniToViCfg(&stIniCfg, &stViConfig); if (s32Ret != CVI_SUCCESS) return s32Ret; /************************************************ * step2: Get input size ************************************************/ s32Ret = SAMPLE_COMM_VI_GetSizeBySensor(stViConfig.astViInfo[s32WorkSnsId].stSnsInfo.enSnsType, &enPicSize); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("SAMPLE_COMM_VI_GetSizeBySensor failed with %#x\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_SYS_GetPicSize(enPicSize, &stSize); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed with %#x\n", s32Ret); return s32Ret; } /************************************************ * step3: Init SYS and common VB ************************************************/ memset(&stVbConf, 0, sizeof(VB_CONFIG_S)); stVbConf.u32MaxPoolCnt = 1; u32BlkSize = COMMON_GetPicBufferSize(stSize.u32Width, stSize.u32Height, SAMPLE_PIXEL_FORMAT, DATA_BITWIDTH_8 , enCompressMode, DEFAULT_ALIGN); stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; stVbConf.astCommPool[0].u32BlkCnt = 8; SAMPLE_PRT("common pool[0] BlkSize %d\n", u32BlkSize); s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("system init failed with %#x\n", s32Ret); return -1; } /************************************************ * step4: Init VI ISP ************************************************/ s32Ret = SAMPLE_COMM_VI_StartSensor(&stViConfig); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "system start sensor failed with %#x\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_VI_StartDev(&stViConfig.astViInfo[ViDev]); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "VI_StartDev failed with %#x!\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_VI_StartMIPI(&stViConfig); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "system start MIPI failed with %#x\n", s32Ret); return s32Ret; } stPipeAttr.bYuvSkip = CVI_FALSE; stPipeAttr.u32MaxW = stSize.u32Width; stPipeAttr.u32MaxH = stSize.u32Height; stPipeAttr.enPixFmt = PIXEL_FORMAT_RGB_BAYER_12BPP; stPipeAttr.enBitWidth = DATA_BITWIDTH_12; stPipeAttr.stFrameRate.s32SrcFrameRate = -1; stPipeAttr.stFrameRate.s32DstFrameRate = -1; stPipeAttr.bNrEn = CVI_TRUE; stPipeAttr.bYuvBypassPath = CVI_FALSE; stPipeAttr.enCompressMode = stViConfig.astViInfo[0].stChnInfo.enCompressMode; s32Ret = CVI_VI_CreatePipe(ViPipe, &stPipeAttr); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("CVI_VI_CreatePipe failed with %#x!\n", s32Ret); return s32Ret; } s32Ret = CVI_VI_StartPipe(ViPipe); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("CVI_VI_StartPipe failed with %#x!\n", s32Ret); return s32Ret; } s32Ret = CVI_VI_GetPipeAttr(ViPipe, &stPipeAttr); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("CVI_VI_StartPipe failed with %#x!\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_VI_CreateIsp(&stViConfig); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "VI_CreateIsp failed with %#x!\n", s32Ret); return s32Ret; } SAMPLE_COMM_VI_StartViChn(&stViConfig); /************************************************ * step5: Init VPSS ************************************************/ VPSS_GRP VpssGrp = 0; VPSS_GRP_ATTR_S stVpssGrpAttr; VPSS_CHN VpssChn = VPSS_CHN0; CVI_BOOL abChnEnable[VPSS_MAX_PHY_CHN_NUM] = {0}; VPSS_CHN_ATTR_S astVpssChnAttr[VPSS_MAX_PHY_CHN_NUM] = {0}; stVpssGrpAttr.stFrameRate.s32SrcFrameRate = -1; stVpssGrpAttr.stFrameRate.s32DstFrameRate = -1; stVpssGrpAttr.enPixelFormat = SAMPLE_PIXEL_FORMAT; stVpssGrpAttr.u32MaxW = stSize.u32Width; stVpssGrpAttr.u32MaxH = stSize.u32Height; stVpssGrpAttr.u8VpssDev = 0; astVpssChnAttr[VpssChn].u32Width = 720; astVpssChnAttr[VpssChn].u32Height = 1280; astVpssChnAttr[VpssChn].enVideoFormat = VIDEO_FORMAT_LINEAR; astVpssChnAttr[VpssChn].enPixelFormat = PIXEL_FORMAT_RGB_888_PLANAR; astVpssChnAttr[VpssChn].stFrameRate.s32SrcFrameRate = 30; astVpssChnAttr[VpssChn].stFrameRate.s32DstFrameRate = 30; astVpssChnAttr[VpssChn].u32Depth = 0; astVpssChnAttr[VpssChn].bMirror = CVI_FALSE; astVpssChnAttr[VpssChn].bFlip = CVI_FALSE; astVpssChnAttr[VpssChn].stAspectRatio.enMode = ASPECT_RATIO_AUTO; astVpssChnAttr[VpssChn].stAspectRatio.bEnableBgColor = CVI_TRUE; astVpssChnAttr[VpssChn].stAspectRatio.u32BgColor = COLOR_RGB_BLACK; astVpssChnAttr[VpssChn].stNormalize.bEnable = CVI_FALSE; /*start vpss*/ abChnEnable[0] = CVI_TRUE; s32Ret = SAMPLE_COMM_VPSS_Init(VpssGrp, abChnEnable, &stVpssGrpAttr, astVpssChnAttr); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("init vpss group failed. s32Ret: 0x%x !\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_VPSS_Start(VpssGrp, abChnEnable, &stVpssGrpAttr, astVpssChnAttr); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("start vpss group failed. s32Ret: 0x%x !\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_VI_Bind_VPSS(ViPipe, ViChn, VpssGrp); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("vi bind vpss failed. s32Ret: 0x%x !\n", s32Ret); return s32Ret; } /************************************************ * step5: Init VO ************************************************/ SAMPLE_VO_CONFIG_S stVoConfig; RECT_S stDefDispRect = {0, 0, 720, 1280}; SIZE_S stDefImageSize = {720, 1280}; VO_CHN VoChn = 0; s32Ret = SAMPLE_COMM_VO_GetDefConfig(&stVoConfig); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "SAMPLE_COMM_VO_GetDefConfig failed with %#x\n", s32Ret); return s32Ret; } stVoConfig.VoDev = 0; stVoConfig.stVoPubAttr.enIntfType = VO_INTF_MIPI; stVoConfig.stVoPubAttr.enIntfSync = VO_OUTPUT_720x1280_60; stVoConfig.stDispRect = stDefDispRect; stVoConfig.stImageSize = stDefImageSize; stVoConfig.enPixFormat = PIXEL_FORMAT_RGB_888_PLANAR; stVoConfig.enVoMode = VO_MODE_1MUX; s32Ret = SAMPLE_COMM_VO_StartVO(&stVoConfig); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("SAMPLE_COMM_VO_StartVO failed with %#x\n", s32Ret); return s32Ret; } SAMPLE_COMM_VPSS_Bind_VO(VpssGrp, VpssChn, stVoConfig.VoDev, VoChn); PAUSE(); SAMPLE_COMM_VPSS_UnBind_VO(VpssGrp, VpssChn, stVoConfig.VoDev, VoChn); SAMPLE_COMM_VO_StopVO(&stVoConfig); SAMPLE_COMM_VI_UnBind_VPSS(ViPipe, ViChn, VpssGrp); SAMPLE_COMM_VPSS_Stop(VpssGrp, abChnEnable); SAMPLE_COMM_VI_DestroyIsp(&stViConfig); SAMPLE_COMM_VI_DestroyVi(&stViConfig); SAMPLE_COMM_SYS_Exit(); return s32Ret; } CVI_S32 SAMPLE_VIO_ViRotation(void) { COMPRESS_MODE_E enCompressMode = COMPRESS_MODE_NONE; VB_CONFIG_S stVbConf; PIC_SIZE_E enPicSize; CVI_U32 u32BlkSize, u32BlkRotSize; SIZE_S stSize; CVI_S32 s32Ret = CVI_SUCCESS; VI_DEV ViDev = 0; VI_PIPE ViPipe = 0; VI_CHN ViChn = 0; CVI_S32 s32WorkSnsId = 0; SAMPLE_VI_CONFIG_S stViConfig; VI_PIPE_ATTR_S stPipeAttr; SAMPLE_INI_CFG_S stIniCfg = {0}; stIniCfg = (SAMPLE_INI_CFG_S) { .enSource = VI_PIPE_FRAME_SOURCE_DEV, .devNum = 1, .enSnsType[0] = SONY_IMX327_2L_MIPI_2M_30FPS_12BIT, .enWDRMode[0] = WDR_MODE_NONE, .s32BusId[0] = 3, .MipiDev[0] = 0xff, .enSnsType[1] = SONY_IMX327_SLAVE_MIPI_2M_30FPS_12BIT, .s32BusId[1] = 0, .MipiDev[1] = 0xff, }; // Get config from ini if found. s32Ret = SAMPLE_COMM_VI_ParseIni(&stIniCfg); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("Parse fail\n"); } else { SAMPLE_PRT("Parse complete\n"); } if (stIniCfg.devNum > 1) { SAMPLE_PRT("Only support 1 sensor device\n"); return CVI_FAILURE; } CVI_VI_SetDevNum(stIniCfg.devNum); /************************************************ * step1: Config VI ************************************************/ SAMPLE_COMM_VI_GetSensorInfo(&stViConfig); s32Ret = SAMPLE_COMM_VI_IniToViCfg(&stIniCfg, &stViConfig); if (s32Ret != CVI_SUCCESS) return s32Ret; /************************************************ * step2: Get input size ************************************************/ s32Ret = SAMPLE_COMM_VI_GetSizeBySensor(stViConfig.astViInfo[s32WorkSnsId].stSnsInfo.enSnsType, &enPicSize); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("SAMPLE_COMM_VI_GetSizeBySensor failed with %#x\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_SYS_GetPicSize(enPicSize, &stSize); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed with %#x\n", s32Ret); return s32Ret; } /************************************************ * step3: Init SYS and common VB ************************************************/ memset(&stVbConf, 0, sizeof(VB_CONFIG_S)); stVbConf.u32MaxPoolCnt = 1; u32BlkSize = COMMON_GetPicBufferSize(stSize.u32Width, stSize.u32Height, SAMPLE_PIXEL_FORMAT, DATA_BITWIDTH_8 , enCompressMode, DEFAULT_ALIGN); u32BlkRotSize = COMMON_GetPicBufferSize(stSize.u32Height, stSize.u32Width, SAMPLE_PIXEL_FORMAT, DATA_BITWIDTH_8 , enCompressMode, DEFAULT_ALIGN); u32BlkSize = MAX(u32BlkSize, u32BlkRotSize); stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; stVbConf.astCommPool[0].u32BlkCnt = 8; SAMPLE_PRT("common pool[0] BlkSize %d\n", u32BlkSize); s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("system init failed with %#x\n", s32Ret); return -1; } /************************************************ * step4: Init VI ISP ************************************************/ s32Ret = SAMPLE_COMM_VI_StartSensor(&stViConfig); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "system start sensor failed with %#x\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_VI_StartDev(&stViConfig.astViInfo[ViDev]); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "VI_StartDev failed with %#x!\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_VI_StartMIPI(&stViConfig); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "system start MIPI failed with %#x\n", s32Ret); return s32Ret; } stPipeAttr.bYuvSkip = CVI_FALSE; stPipeAttr.u32MaxW = stSize.u32Width; stPipeAttr.u32MaxH = stSize.u32Height; stPipeAttr.enPixFmt = PIXEL_FORMAT_RGB_BAYER_12BPP; stPipeAttr.enBitWidth = DATA_BITWIDTH_12; stPipeAttr.stFrameRate.s32SrcFrameRate = -1; stPipeAttr.stFrameRate.s32DstFrameRate = -1; stPipeAttr.bNrEn = CVI_TRUE; stPipeAttr.bYuvBypassPath = CVI_FALSE; stPipeAttr.enCompressMode = stViConfig.astViInfo[0].stChnInfo.enCompressMode; s32Ret = CVI_VI_CreatePipe(ViPipe, &stPipeAttr); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("CVI_VI_CreatePipe failed with %#x!\n", s32Ret); return s32Ret; } s32Ret = CVI_VI_StartPipe(ViPipe); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("CVI_VI_StartPipe failed with %#x!\n", s32Ret); return s32Ret; } s32Ret = CVI_VI_GetPipeAttr(ViPipe, &stPipeAttr); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("CVI_VI_StartPipe failed with %#x!\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_VI_CreateIsp(&stViConfig); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "VI_CreateIsp failed with %#x!\n", s32Ret); return s32Ret; } SAMPLE_COMM_VI_StartViChn(&stViConfig); s32Ret = CVI_VI_SetChnRotation(ViPipe, ViChn, ROTATION_90); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("CVI_VI_SetChnRotation failed with %d\n", s32Ret); return s32Ret; } /************************************************ * step5: Init VPSS ************************************************/ VPSS_GRP VpssGrp = 0; VPSS_GRP_ATTR_S stVpssGrpAttr; VPSS_CHN VpssChn = VPSS_CHN0; CVI_BOOL abChnEnable[VPSS_MAX_PHY_CHN_NUM] = {0}; VPSS_CHN_ATTR_S astVpssChnAttr[VPSS_MAX_PHY_CHN_NUM] = {0}; stVpssGrpAttr.stFrameRate.s32SrcFrameRate = -1; stVpssGrpAttr.stFrameRate.s32DstFrameRate = -1; stVpssGrpAttr.enPixelFormat = SAMPLE_PIXEL_FORMAT; stVpssGrpAttr.u32MaxW = stSize.u32Height; stVpssGrpAttr.u32MaxH = stSize.u32Width; stVpssGrpAttr.u8VpssDev = 0; astVpssChnAttr[VpssChn].u32Width = 720; astVpssChnAttr[VpssChn].u32Height = 1280; astVpssChnAttr[VpssChn].enVideoFormat = VIDEO_FORMAT_LINEAR; astVpssChnAttr[VpssChn].enPixelFormat = SAMPLE_PIXEL_FORMAT; astVpssChnAttr[VpssChn].stFrameRate.s32SrcFrameRate = 30; astVpssChnAttr[VpssChn].stFrameRate.s32DstFrameRate = 30; astVpssChnAttr[VpssChn].u32Depth = 0; astVpssChnAttr[VpssChn].bMirror = CVI_FALSE; astVpssChnAttr[VpssChn].bFlip = CVI_FALSE; astVpssChnAttr[VpssChn].stAspectRatio.enMode = ASPECT_RATIO_NONE; astVpssChnAttr[VpssChn].stAspectRatio.u32BgColor = COLOR_RGB_BLACK; astVpssChnAttr[VpssChn].stNormalize.bEnable = CVI_FALSE; /*start vpss*/ abChnEnable[0] = CVI_TRUE; s32Ret = SAMPLE_COMM_VPSS_Init(VpssGrp, abChnEnable, &stVpssGrpAttr, astVpssChnAttr); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("init vpss group failed. s32Ret: 0x%x !\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_VPSS_Start(VpssGrp, abChnEnable, &stVpssGrpAttr, astVpssChnAttr); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("start vpss group failed. s32Ret: 0x%x !\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_VI_Bind_VPSS(ViPipe, ViChn, VpssGrp); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("vi bind vpss failed. s32Ret: 0x%x !\n", s32Ret); return s32Ret; } /************************************************ * step5: Init VO ************************************************/ SAMPLE_VO_CONFIG_S stVoConfig; RECT_S stDefDispRect = {0, 0, 720, 1280}; SIZE_S stDefImageSize = {720, 1280}; VO_CHN VoChn = 0; s32Ret = SAMPLE_COMM_VO_GetDefConfig(&stVoConfig); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "SAMPLE_COMM_VO_GetDefConfig failed with %#x\n", s32Ret); return s32Ret; } stVoConfig.VoDev = 0; stVoConfig.stVoPubAttr.enIntfType = VO_INTF_MIPI; stVoConfig.stVoPubAttr.enIntfSync = VO_OUTPUT_720x1280_60; stVoConfig.stDispRect = stDefDispRect; stVoConfig.stImageSize = stDefImageSize; stVoConfig.enPixFormat = SAMPLE_PIXEL_FORMAT; stVoConfig.enVoMode = VO_MODE_1MUX; s32Ret = SAMPLE_COMM_VO_StartVO(&stVoConfig); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("SAMPLE_COMM_VO_StartVO failed with %#x\n", s32Ret); return s32Ret; } SAMPLE_COMM_VPSS_Bind_VO(VpssGrp, VpssChn, stVoConfig.VoDev, VoChn); PAUSE(); SAMPLE_COMM_VPSS_UnBind_VO(VpssGrp, VpssChn, stVoConfig.VoDev, VoChn); SAMPLE_COMM_VO_StopVO(&stVoConfig); SAMPLE_COMM_VI_UnBind_VPSS(ViPipe, ViChn, VpssGrp); SAMPLE_COMM_VPSS_Stop(VpssGrp, abChnEnable); SAMPLE_COMM_VI_DestroyIsp(&stViConfig); SAMPLE_COMM_VI_DestroyVi(&stViConfig); SAMPLE_COMM_SYS_Exit(); return s32Ret; } CVI_S32 SAMPLE_VIO_VpssRotation(void) { COMPRESS_MODE_E enCompressMode = COMPRESS_MODE_NONE; VB_CONFIG_S stVbConf; PIC_SIZE_E enPicSize; CVI_U32 u32BlkSize; SIZE_S stSize; CVI_S32 s32Ret = CVI_SUCCESS; VI_DEV ViDev = 0; VI_PIPE ViPipe = 0; VI_CHN ViChn = 0; CVI_S32 s32WorkSnsId = 0; SAMPLE_VI_CONFIG_S stViConfig; VI_PIPE_ATTR_S stPipeAttr; SAMPLE_INI_CFG_S stIniCfg = {0}; stIniCfg = (SAMPLE_INI_CFG_S) { .enSource = VI_PIPE_FRAME_SOURCE_DEV, .devNum = 1, .enSnsType[0] = SONY_IMX327_2L_MIPI_2M_30FPS_12BIT, .enWDRMode[0] = WDR_MODE_NONE, .s32BusId[0] = 3, .MipiDev[0] = 0xff, .enSnsType[1] = SONY_IMX327_SLAVE_MIPI_2M_30FPS_12BIT, .s32BusId[1] = 0, .MipiDev[1] = 0xff, }; // Get config from ini if found. s32Ret = SAMPLE_COMM_VI_ParseIni(&stIniCfg); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("Parse fail\n"); } else { SAMPLE_PRT("Parse complete\n"); } if (stIniCfg.devNum > 1) { SAMPLE_PRT("Only support 1 sensor device\n"); return CVI_FAILURE; } CVI_VI_SetDevNum(stIniCfg.devNum); /************************************************ * step1: Config VI ************************************************/ s32Ret = SAMPLE_COMM_VI_IniToViCfg(&stIniCfg, &stViConfig); if (s32Ret != CVI_SUCCESS) return s32Ret; /************************************************ * step2: Get input size ************************************************/ s32Ret = SAMPLE_COMM_VI_GetSizeBySensor(stViConfig.astViInfo[s32WorkSnsId].stSnsInfo.enSnsType, &enPicSize); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("SAMPLE_COMM_VI_GetSizeBySensor failed with %#x\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_SYS_GetPicSize(enPicSize, &stSize); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed with %#x\n", s32Ret); return s32Ret; } /************************************************ * step3: Init SYS and common VB ************************************************/ memset(&stVbConf, 0, sizeof(VB_CONFIG_S)); stVbConf.u32MaxPoolCnt = 1; u32BlkSize = COMMON_GetPicBufferSize(stSize.u32Width, stSize.u32Height, SAMPLE_PIXEL_FORMAT, DATA_BITWIDTH_8, enCompressMode, DEFAULT_ALIGN); stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; stVbConf.astCommPool[0].u32BlkCnt = 8; SAMPLE_PRT("common pool[0] BlkSize %d\n", u32BlkSize); s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("system init failed with %#x\n", s32Ret); return -1; } /************************************************ * step4: Init VI ISP ************************************************/ s32Ret = SAMPLE_COMM_VI_StartSensor(&stViConfig); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "system start sensor failed with %#x\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_VI_StartDev(&stViConfig.astViInfo[ViDev]); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "VI_StartDev failed with %#x!\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_VI_StartMIPI(&stViConfig); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "system start MIPI failed with %#x\n", s32Ret); return s32Ret; } stPipeAttr.bYuvSkip = CVI_FALSE; stPipeAttr.u32MaxW = stSize.u32Width; stPipeAttr.u32MaxH = stSize.u32Height; stPipeAttr.enPixFmt = PIXEL_FORMAT_RGB_BAYER_12BPP; stPipeAttr.enBitWidth = DATA_BITWIDTH_12; stPipeAttr.stFrameRate.s32SrcFrameRate = -1; stPipeAttr.stFrameRate.s32DstFrameRate = -1; stPipeAttr.bNrEn = CVI_TRUE; stPipeAttr.bYuvBypassPath = CVI_FALSE; stPipeAttr.enCompressMode = stViConfig.astViInfo[0].stChnInfo.enCompressMode; s32Ret = CVI_VI_CreatePipe(ViPipe, &stPipeAttr); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("CVI_VI_CreatePipe failed with %#x!\n", s32Ret); return s32Ret; } s32Ret = CVI_VI_StartPipe(ViPipe); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("CVI_VI_StartPipe failed with %#x!\n", s32Ret); return s32Ret; } s32Ret = CVI_VI_GetPipeAttr(ViPipe, &stPipeAttr); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("CVI_VI_StartPipe failed with %#x!\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_VI_CreateIsp(&stViConfig); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "VI_CreateIsp failed with %#x!\n", s32Ret); return s32Ret; } SAMPLE_COMM_VI_StartViChn(&stViConfig); /************************************************ * step5: Init VPSS ************************************************/ VPSS_GRP VpssGrp = 0; VPSS_GRP_ATTR_S stVpssGrpAttr; VPSS_CHN VpssChn = VPSS_CHN0; CVI_BOOL abChnEnable[VPSS_MAX_PHY_CHN_NUM] = {0}; VPSS_CHN_ATTR_S astVpssChnAttr[VPSS_MAX_PHY_CHN_NUM] = {0}; stVpssGrpAttr.stFrameRate.s32SrcFrameRate = -1; stVpssGrpAttr.stFrameRate.s32DstFrameRate = -1; stVpssGrpAttr.enPixelFormat = SAMPLE_PIXEL_FORMAT; stVpssGrpAttr.u32MaxW = stSize.u32Width; stVpssGrpAttr.u32MaxH = stSize.u32Height; stVpssGrpAttr.u8VpssDev = 0; astVpssChnAttr[VpssChn].u32Width = 1280; astVpssChnAttr[VpssChn].u32Height = 720; astVpssChnAttr[VpssChn].enVideoFormat = VIDEO_FORMAT_LINEAR; astVpssChnAttr[VpssChn].enPixelFormat = SAMPLE_PIXEL_FORMAT; astVpssChnAttr[VpssChn].stFrameRate.s32SrcFrameRate = 30; astVpssChnAttr[VpssChn].stFrameRate.s32DstFrameRate = 30; astVpssChnAttr[VpssChn].u32Depth = 0; astVpssChnAttr[VpssChn].bMirror = CVI_FALSE; astVpssChnAttr[VpssChn].bFlip = CVI_FALSE; astVpssChnAttr[VpssChn].stAspectRatio.enMode = ASPECT_RATIO_NONE; astVpssChnAttr[VpssChn].stNormalize.bEnable = CVI_FALSE; /*start vpss*/ abChnEnable[0] = CVI_TRUE; s32Ret = SAMPLE_COMM_VPSS_Init(VpssGrp, abChnEnable, &stVpssGrpAttr, astVpssChnAttr); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("init vpss group failed. s32Ret: 0x%x !\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_VPSS_Start(VpssGrp, abChnEnable, &stVpssGrpAttr, astVpssChnAttr); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("start vpss group failed. s32Ret: 0x%x !\n", s32Ret); return s32Ret; } CVI_VPSS_SetChnRotation(VpssGrp, VpssChn, ROTATION_90); s32Ret = SAMPLE_COMM_VI_Bind_VPSS(ViPipe, ViChn, VpssGrp); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("vi bind vpss failed. s32Ret: 0x%x !\n", s32Ret); return s32Ret; } /************************************************ * step6: Init VO ************************************************/ SAMPLE_VO_CONFIG_S stVoConfig; RECT_S stDefDispRect = {0, 0, 720, 1280}; SIZE_S stDefImageSize = {720, 1280}; VO_CHN VoChn = 0; s32Ret = SAMPLE_COMM_VO_GetDefConfig(&stVoConfig); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "SAMPLE_COMM_VO_GetDefConfig failed with %#x\n", s32Ret); return s32Ret; } stVoConfig.VoDev = 0; stVoConfig.stVoPubAttr.enIntfType = VO_INTF_MIPI; stVoConfig.stVoPubAttr.enIntfSync = VO_OUTPUT_720x1280_60; stVoConfig.stDispRect = stDefDispRect; stVoConfig.stImageSize = stDefImageSize; stVoConfig.enPixFormat = SAMPLE_PIXEL_FORMAT; stVoConfig.enVoMode = VO_MODE_1MUX; s32Ret = SAMPLE_COMM_VO_StartVO(&stVoConfig); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("SAMPLE_COMM_VO_StartVO failed with %#x\n", s32Ret); return s32Ret; } SAMPLE_COMM_VPSS_Bind_VO(VpssGrp, VpssChn, stVoConfig.VoDev, VoChn); PAUSE(); SAMPLE_COMM_VPSS_UnBind_VO(VpssGrp, VpssChn, stVoConfig.VoDev, VoChn); SAMPLE_COMM_VO_StopVO(&stVoConfig); SAMPLE_COMM_VI_UnBind_VPSS(ViPipe, ViChn, VpssGrp); SAMPLE_COMM_VPSS_Stop(VpssGrp, abChnEnable); SAMPLE_COMM_VI_DestroyIsp(&stViConfig); SAMPLE_COMM_VI_DestroyVi(&stViConfig); SAMPLE_COMM_SYS_Exit(); return s32Ret; } CVI_S32 SAMPLE_VIO_VpssFileIO(SIZE_S stSize) { VB_CONFIG_S stVbConf; CVI_U32 u32BlkSize; CVI_S32 s32Ret = CVI_SUCCESS; /************************************************ * step1: Init SYS and common VB ************************************************/ memset(&stVbConf, 0, sizeof(VB_CONFIG_S)); stVbConf.u32MaxPoolCnt = 1; u32BlkSize = COMMON_GetPicBufferSize(stSize.u32Width, stSize.u32Height, PIXEL_FORMAT_YUV_PLANAR_420, DATA_BITWIDTH_8, COMPRESS_MODE_NONE, DEFAULT_ALIGN); stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; stVbConf.astCommPool[0].u32BlkCnt = 3; SAMPLE_PRT("common pool[0] BlkSize %d\n", u32BlkSize); s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("system init failed with %#x\n", s32Ret); return -1; } /************************************************ * step2: Init VPSS ************************************************/ VPSS_GRP VpssGrp = 0; VPSS_GRP_ATTR_S stVpssGrpAttr; VPSS_CHN VpssChn = VPSS_CHN1; CVI_BOOL abChnEnable[VPSS_MAX_PHY_CHN_NUM] = {0}; VPSS_CHN_ATTR_S astVpssChnAttr[VPSS_MAX_PHY_CHN_NUM] = {0}; stVpssGrpAttr.stFrameRate.s32SrcFrameRate = -1; stVpssGrpAttr.stFrameRate.s32DstFrameRate = -1; stVpssGrpAttr.enPixelFormat = PIXEL_FORMAT_YUV_PLANAR_420; stVpssGrpAttr.u32MaxW = stSize.u32Width; stVpssGrpAttr.u32MaxH = stSize.u32Height; stVpssGrpAttr.u8VpssDev = 0; astVpssChnAttr[VpssChn].u32Width = 1280; astVpssChnAttr[VpssChn].u32Height = 720; astVpssChnAttr[VpssChn].enVideoFormat = VIDEO_FORMAT_LINEAR; astVpssChnAttr[VpssChn].enPixelFormat = PIXEL_FORMAT_YUV_PLANAR_420; astVpssChnAttr[VpssChn].stFrameRate.s32SrcFrameRate = 30; astVpssChnAttr[VpssChn].stFrameRate.s32DstFrameRate = 30; astVpssChnAttr[VpssChn].u32Depth = 0; astVpssChnAttr[VpssChn].bMirror = CVI_FALSE; astVpssChnAttr[VpssChn].bFlip = CVI_FALSE; astVpssChnAttr[VpssChn].stAspectRatio.enMode = ASPECT_RATIO_NONE; astVpssChnAttr[VpssChn].stNormalize.bEnable = CVI_FALSE; /*start vpss*/ abChnEnable[1] = CVI_TRUE; s32Ret = SAMPLE_COMM_VPSS_Init(VpssGrp, abChnEnable, &stVpssGrpAttr, astVpssChnAttr); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("init vpss group failed. s32Ret: 0x%x !\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_VPSS_Start(VpssGrp, abChnEnable, &stVpssGrpAttr, astVpssChnAttr); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("start vpss group failed. s32Ret: 0x%x !\n", s32Ret); return s32Ret; } /************************************************ * step3: VPSS work ************************************************/ VIDEO_FRAME_INFO_S stVideoFrame; SAMPLE_COMM_VPSS_SendFrame(VpssGrp, &stSize, PIXEL_FORMAT_YUV_PLANAR_420, VPSS_FILENAME_IN); s32Ret = CVI_VPSS_GetChnFrame(VpssGrp, VpssChn, &stVideoFrame, 50); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "CVI_VPSS_GetChnFrame for grp%d chn%d. s32Ret: 0x%x !\n" , VpssGrp, VpssChn, s32Ret); } else { SAMPLE_COMM_FRAME_SaveToFile(VPSS_FILENAME_OUT, &stVideoFrame); CVI_VPSS_ReleaseChnFrame(VpssGrp, VpssGrp, &stVideoFrame); } SAMPLE_COMM_VPSS_Stop(VpssGrp, abChnEnable); SAMPLE_COMM_SYS_Exit(); return s32Ret; } CVI_S32 SAMPLE_VIO_VpssCombine2File(SIZE_S stSize) { VB_CONFIG_S stVbConf; CVI_U32 u32BlkSize; CVI_S32 s32Ret = CVI_SUCCESS; /************************************************ * step1: Init SYS and common VB ************************************************/ memset(&stVbConf, 0, sizeof(VB_CONFIG_S)); stVbConf.u32MaxPoolCnt = 1; u32BlkSize = COMMON_GetPicBufferSize(stSize.u32Width * 2, stSize.u32Height, PIXEL_FORMAT_YUV_PLANAR_420, DATA_BITWIDTH_8, COMPRESS_MODE_NONE, DEFAULT_ALIGN); stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; stVbConf.astCommPool[0].u32BlkCnt = 5; SAMPLE_PRT("common pool[0] BlkSize %d\n", u32BlkSize); s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("system init failed with %#x\n", s32Ret); return -1; } /************************************************ * step2: Init VPSS ************************************************/ VPSS_GRP VpssGrp = 0; VPSS_GRP_ATTR_S stVpssGrpAttr; VPSS_CHN VpssChn = VPSS_CHN0; CVI_BOOL abChnEnable[VPSS_MAX_PHY_CHN_NUM] = {0}; VPSS_CHN_ATTR_S astVpssChnAttr[VPSS_MAX_PHY_CHN_NUM] = {0}; // grp0 for right half stVpssGrpAttr.stFrameRate.s32SrcFrameRate = -1; stVpssGrpAttr.stFrameRate.s32DstFrameRate = -1; stVpssGrpAttr.enPixelFormat = PIXEL_FORMAT_YUV_PLANAR_420; stVpssGrpAttr.u32MaxW = stSize.u32Width; stVpssGrpAttr.u32MaxH = stSize.u32Height; stVpssGrpAttr.u8VpssDev = 0; astVpssChnAttr[VpssChn].u32Width = stSize.u32Width * 2; astVpssChnAttr[VpssChn].u32Height = stSize.u32Height; astVpssChnAttr[VpssChn].enVideoFormat = VIDEO_FORMAT_LINEAR; astVpssChnAttr[VpssChn].enPixelFormat = PIXEL_FORMAT_YUV_PLANAR_420; astVpssChnAttr[VpssChn].stFrameRate.s32SrcFrameRate = 30; astVpssChnAttr[VpssChn].stFrameRate.s32DstFrameRate = 30; astVpssChnAttr[VpssChn].u32Depth = 1; astVpssChnAttr[VpssChn].bMirror = CVI_FALSE; astVpssChnAttr[VpssChn].bFlip = CVI_FALSE; astVpssChnAttr[VpssChn].stAspectRatio.enMode = ASPECT_RATIO_MANUAL; astVpssChnAttr[VpssChn].stAspectRatio.bEnableBgColor = CVI_FALSE; astVpssChnAttr[VpssChn].stAspectRatio.stVideoRect.s32X = 0; astVpssChnAttr[VpssChn].stAspectRatio.stVideoRect.s32Y = 0; astVpssChnAttr[VpssChn].stAspectRatio.stVideoRect.u32Width = stSize.u32Width; astVpssChnAttr[VpssChn].stAspectRatio.stVideoRect.u32Height = stSize.u32Height; astVpssChnAttr[VpssChn].stNormalize.bEnable = CVI_FALSE; /*start vpss*/ abChnEnable[0] = CVI_TRUE; s32Ret = SAMPLE_COMM_VPSS_Init(VpssGrp, abChnEnable, &stVpssGrpAttr, astVpssChnAttr); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("init vpss group failed. s32Ret: 0x%x !\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_VPSS_Start(VpssGrp, abChnEnable, &stVpssGrpAttr, astVpssChnAttr); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("start vpss group failed. s32Ret: 0x%x !\n", s32Ret); return s32Ret; } // grp1 for right half VpssGrp = 1; stVpssGrpAttr.stFrameRate.s32SrcFrameRate = -1; stVpssGrpAttr.stFrameRate.s32DstFrameRate = -1; stVpssGrpAttr.enPixelFormat = PIXEL_FORMAT_YUV_PLANAR_420; stVpssGrpAttr.u32MaxW = stSize.u32Width; stVpssGrpAttr.u32MaxH = stSize.u32Height; stVpssGrpAttr.u8VpssDev = 0; astVpssChnAttr[VpssChn].u32Width = stSize.u32Width * 2; astVpssChnAttr[VpssChn].u32Height = stSize.u32Height; astVpssChnAttr[VpssChn].enVideoFormat = VIDEO_FORMAT_LINEAR; astVpssChnAttr[VpssChn].enPixelFormat = PIXEL_FORMAT_YUV_PLANAR_420; astVpssChnAttr[VpssChn].stFrameRate.s32SrcFrameRate = 30; astVpssChnAttr[VpssChn].stFrameRate.s32DstFrameRate = 30; astVpssChnAttr[VpssChn].u32Depth = 1; astVpssChnAttr[VpssChn].bMirror = CVI_FALSE; astVpssChnAttr[VpssChn].bFlip = CVI_FALSE; astVpssChnAttr[VpssChn].stAspectRatio.enMode = ASPECT_RATIO_MANUAL; astVpssChnAttr[VpssChn].stAspectRatio.bEnableBgColor = CVI_FALSE; astVpssChnAttr[VpssChn].stAspectRatio.stVideoRect.s32X = stSize.u32Width; astVpssChnAttr[VpssChn].stAspectRatio.stVideoRect.s32Y = 0; astVpssChnAttr[VpssChn].stAspectRatio.stVideoRect.u32Width = stSize.u32Width; astVpssChnAttr[VpssChn].stAspectRatio.stVideoRect.u32Height = stSize.u32Height; astVpssChnAttr[VpssChn].stNormalize.bEnable = CVI_FALSE; /*start vpss*/ abChnEnable[0] = CVI_TRUE; s32Ret = SAMPLE_COMM_VPSS_Init(VpssGrp, abChnEnable, &stVpssGrpAttr, astVpssChnAttr); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("init vpss group failed. s32Ret: 0x%x !\n", s32Ret); return s32Ret; } s32Ret = SAMPLE_COMM_VPSS_Start(VpssGrp, abChnEnable, &stVpssGrpAttr, astVpssChnAttr); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("start vpss group failed. s32Ret: 0x%x !\n", s32Ret); return s32Ret; } /************************************************ * step3: VPSS work ************************************************/ VIDEO_FRAME_INFO_S stVideoFrame; SAMPLE_COMM_VPSS_SendFrame(0, &stSize, PIXEL_FORMAT_YUV_PLANAR_420, VPSS_FILENAME_IN); s32Ret = CVI_VPSS_GetChnFrame(0, 0, &stVideoFrame, 100); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "CVI_VPSS_GetChnFrame for grp0 chn0. s32Ret: 0x%x !\n", s32Ret); goto ERR_VPSS_COMBINE; } CVI_VPSS_SendChnFrame(1, 0, &stVideoFrame, -1); CVI_VPSS_ReleaseChnFrame(0, 0, &stVideoFrame); SAMPLE_COMM_VPSS_SendFrame(1, &stSize, PIXEL_FORMAT_YUV_PLANAR_420, VPSS_FILENAME_IN); s32Ret = CVI_VPSS_GetChnFrame(1, 0, &stVideoFrame, 100); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "CVI_VPSS_GetChnFrame for grp1 chn0. s32Ret: 0x%x !\n", s32Ret); goto ERR_VPSS_COMBINE; } SAMPLE_COMM_FRAME_SaveToFile(VPSS_FILENAME_OUT, &stVideoFrame); CVI_VPSS_ReleaseChnFrame(1, 0, &stVideoFrame); SAMPLE_COMM_VPSS_Stop(0, abChnEnable); SAMPLE_COMM_VPSS_Stop(1, abChnEnable); SAMPLE_COMM_SYS_Exit(); return s32Ret; ERR_VPSS_COMBINE: SAMPLE_COMM_SYS_Exit(); return s32Ret; }