Files
SDK_SG200x_V2/middleware/v2/sample/vio/sample_vio.c
sophgo-forum-service 62573a835f middleware: weekly rls 2024.07.20
-e90961, fix aac+vqe "reamain data not process AEC" bug.
-3c08de, split module vpu into vi vo vpss rgn gdc.
-b5d998, (ive): add comment to api.
-166849, mw support arm32.

Change-Id: Ied488d392da9eed2e3a94e1244eeee540c389372
2024-07-25 17:11:08 +08:00

1433 lines
47 KiB
C

#include <stdint.h>
#include <string.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/param.h>
#include <sys/prctl.h>
#include <inttypes.h>
#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;
}