-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
1433 lines
47 KiB
C
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;
|
|
} |