版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mao0514/article/details/84134096
不废话
/******************************************************************************
A simple program of Hisilicon HI3531 video encode implementation.
Copyright (C), 2010-2011, Hisilicon Tech. Co., Ltd.
******************************************************************************
Modification: 2011-2 Created
******************************************************************************/
#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* End of #ifdef __cplusplus */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>
#include "sample_comm.h"
#include "time.h"
VIDEO_NORM_E gs_enNorm = VIDEO_ENCODING_MODE_PAL;
//#define SAMPLE_YUV_D1_FILEPATH "SAMPLE_420_D1.yuv"
#define SAMPLE_YUV_D1_FILEPATH "VIDEO720576.yuv"
/******************************************************************************
* function : show usage
******************************************************************************/
void SAMPLE_VENC_Usage(char *sPrgNm)
{
printf("Usage : %s <index>\n", sPrgNm);
printf("index:\n");
printf("\t 0) 16D1 H264 encode.\n");
printf("\t 1) 4*1080p H264 encode.\n");
printf("\t 2) 1D1 MJPEG encode.\n");
printf("\t 3) 16D1 JPEG snap.\n");
printf("\t 4) 1D1 User send pictures for H264 encode.\n");
printf("\t 5) 16D1 H264 encode with color2grey.\n");
return;
}
/******************************************************************************
* function : to process abnormal case
******************************************************************************/
void SAMPLE_VENC_HandleSig(HI_S32 signo)
{
if (SIGINT == signo || SIGTSTP == signo)
{
SAMPLE_COMM_SYS_Exit();
printf("\033[0;31mprogram termination abnormally!\033[0;39m\n");
}
exit(-1);
}
/******************************************************************************
* function : to process abnormal case - the case of stream venc
******************************************************************************/
void SAMPLE_VENC_StreamHandleSig(HI_S32 signo)
{
if (SIGINT == signo || SIGTSTP == signo)
{
SAMPLE_COMM_SYS_Exit();
printf("\033[0;31mprogram exit abnormally!\033[0;39m\n");
}
exit(0);
}
/******************************************************************************
* function : 16D1 H264 encode
******************************************************************************/
HI_S32 SAMPLE_VENC_16D1_H264(HI_VOID)
{
SAMPLE_VI_MODE_E enViMode = SAMPLE_VI_MODE_16_D1;
HI_U32 u32ViChnCnt = 16;
HI_S32 s32VpssGrpCnt = 16;
PAYLOAD_TYPE_E enPayLoad[2]= {PT_H264, PT_H264};
PIC_SIZE_E enSize[2] = {PIC_D1, PIC_CIF};
VB_CONF_S stVbConf;
VPSS_GRP VpssGrp;
VPSS_CHN VpssChn;
VPSS_GRP_ATTR_S stGrpAttr;
VENC_GRP VencGrp;
VENC_CHN VencChn;
SAMPLE_RC_E enRcMode;
HI_S32 i;
HI_S32 s32Ret = HI_SUCCESS;
HI_U32 u32BlkSize;
HI_CHAR ch;
SIZE_S stSize;
/******************************************
step 1: init variable
******************************************/
memset(&stVbConf,0,sizeof(VB_CONF_S));
u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\
PIC_D1, SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH);
stVbConf.u32MaxPoolCnt = 128;
/*ddr0 video buffer*/
stVbConf.astCommPool[0].u32BlkSize = u32BlkSize;
stVbConf.astCommPool[0].u32BlkCnt = u32ViChnCnt * 3;
memset(stVbConf.astCommPool[0].acMmzName,0,
sizeof(stVbConf.astCommPool[0].acMmzName));
/*ddr0 hist buf*/
stVbConf.astCommPool[1].u32BlkSize = (196*4);
stVbConf.astCommPool[1].u32BlkCnt = u32ViChnCnt * 3;
memset(stVbConf.astCommPool[1].acMmzName,0,
sizeof(stVbConf.astCommPool[1].acMmzName));
/*ddr1 video buffer*/
stVbConf.astCommPool[2].u32BlkSize = u32BlkSize;
stVbConf.astCommPool[2].u32BlkCnt = u32ViChnCnt * 3;
strcpy(stVbConf.astCommPool[2].acMmzName,"ddr1");
/*ddr1 hist buf*/
stVbConf.astCommPool[3].u32BlkSize = (196*4);
stVbConf.astCommPool[3].u32BlkCnt = u32ViChnCnt * 3;
strcpy(stVbConf.astCommPool[3].acMmzName,"ddr1");
/******************************************
step 2: mpp system init.
******************************************/
s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("system init failed with %d!\n", s32Ret);
goto END_VENC_16D1_0;
}
s32Ret = SAMPLE_COMM_VI_MemConfig(enViMode);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_VI_MemConfig failed with %d!\n", s32Ret);
goto END_VENC_16D1_0;
}
s32Ret = SAMPLE_COMM_VPSS_MemConfig();
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_VPSS_MemConfig failed with %d!\n", s32Ret);
goto END_VENC_16D1_0;
}
s32Ret = SAMPLE_COMM_VENC_MemConfig();
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_VPSS_MemConfig failed with %d!\n", s32Ret);
goto END_VENC_16D1_0;
}
/******************************************
step 3: start vi dev & chn to capture
******************************************/
s32Ret = SAMPLE_COMM_VI_Start(enViMode, gs_enNorm);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("start vi failed!\n");
goto END_VENC_16D1_0;
}
/******************************************
step 4: start vpss and vi bind vpss
******************************************/
s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, PIC_D1, &stSize);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n");
goto END_VENC_16D1_0;
}
stGrpAttr.u32MaxW = stSize.u32Width;
stGrpAttr.u32MaxH = stSize.u32Height;
stGrpAttr.bDrEn = HI_FALSE;
stGrpAttr.bDbEn = HI_FALSE;
stGrpAttr.bIeEn = HI_TRUE;
stGrpAttr.bNrEn = HI_TRUE;
stGrpAttr.bHistEn = HI_TRUE;
stGrpAttr.enDieMode = VPSS_DIE_MODE_AUTO;
stGrpAttr.enPixFmt = SAMPLE_PIXEL_FORMAT;
s32Ret = SAMPLE_COMM_VPSS_Start(s32VpssGrpCnt, &stSize, VPSS_MAX_CHN_NUM,NULL);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Vpss failed!\n");
goto END_VENC_16D1_1;
}
s32Ret = SAMPLE_COMM_VI_BindVpss(enViMode);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Vi bind Vpss failed!\n");
goto END_VENC_16D1_2;
}
/******************************************
step 5: select rc mode
******************************************/
while(1)
{
printf("please choose rc mode:\n");
printf("\t0) CBR\n");
printf("\t1) VBR\n");
printf("\t2) FIXQP\n");
ch = getchar();
getchar();
if ('0' == ch)
{
enRcMode = SAMPLE_RC_CBR;
break;
}
else if ('1' == ch)
{
enRcMode = SAMPLE_RC_VBR;
break;
}
else if ('2' == ch)
{
enRcMode = SAMPLE_RC_FIXQP;
break;
}
else
{
printf("rc mode invaild! please try again.\n");
continue;
}
}
/******************************************
step 5: start stream venc (big + little)
******************************************/
for (i=0; i<u32ViChnCnt; i++)
{
/*** main frame **/
VencGrp = i*2;
VencChn = i*2;
VpssGrp = i;
s32Ret = SAMPLE_COMM_VENC_Start(VencGrp, VencChn, enPayLoad[0],\
gs_enNorm, enSize[0], enRcMode);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Venc failed!\n");
goto END_VENC_16D1_3;
}
s32Ret = SAMPLE_COMM_VENC_BindVpss(VencGrp, VpssGrp, VPSS_BSTR_CHN);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Venc failed!\n");
goto END_VENC_16D1_3;
}
/*** Sub frame **/
VencGrp ++;
VencChn ++;
s32Ret = SAMPLE_COMM_VENC_Start(VencGrp, VencChn, enPayLoad[1], \
gs_enNorm, enSize[1], enRcMode);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Venc failed!\n");
goto END_VENC_16D1_3;
}
s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VPSS_PRE0_CHN);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Venc failed!\n");
goto END_VENC_16D1_3;
}
}
/******************************************
step 6: stream venc process -- get stream, then save it to file.
******************************************/
s32Ret = SAMPLE_COMM_VENC_StartGetStream(u32ViChnCnt*2);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Venc failed!\n");
goto END_VENC_16D1_3;
}
printf("please press twice ENTER to exit this sample\n");
getchar();
getchar();
/******************************************
step 8: exit process
******************************************/
SAMPLE_COMM_VENC_StopGetStream();
END_VENC_16D1_3:
for (i=0; i<u32ViChnCnt*2; i++)
{
VencGrp = i;
VencChn = i;
VpssGrp = i/2;
VpssChn = (VpssGrp%2)?VPSS_PRE0_CHN:VPSS_BSTR_CHN;
SAMPLE_COMM_VENC_UnBindVpss(VencGrp, VpssGrp, VpssChn);
SAMPLE_COMM_VENC_Stop(VencGrp,VencChn);
}
SAMPLE_COMM_VI_UnBindVpss(enViMode);
END_VENC_16D1_2: //vpss stop
SAMPLE_COMM_VPSS_Stop(s32VpssGrpCnt, VPSS_MAX_CHN_NUM);
END_VENC_16D1_1: //vi stop
SAMPLE_COMM_VI_Stop(enViMode);
END_VENC_16D1_0: //system exit
SAMPLE_COMM_SYS_Exit();
return s32Ret;
}
/******************************************************************************
* function : 4HD H264 encode
******************************************************************************/
HI_S32 SAMPLE_VENC_4HD_H264(HI_VOID)
{
SAMPLE_VI_MODE_E enViMode = SAMPLE_VI_MODE_4_1080P;
HI_U32 u32ViChnCnt = 4;
HI_S32 s32VpssGrpCnt = 4;
PAYLOAD_TYPE_E enPayLoad[2]= {PT_H264, PT_H264};
PIC_SIZE_E enSize[2] = {PIC_HD1080, PIC_D1};
VB_CONF_S stVbConf;
VPSS_GRP VpssGrp;
VPSS_CHN VpssChn;
VPSS_GRP_ATTR_S stGrpAttr;
VENC_GRP VencGrp;
VENC_CHN VencChn;
SAMPLE_RC_E enRcMode;
HI_S32 i;
HI_S32 s32Ret = HI_SUCCESS;
HI_U32 u32BlkSize;
HI_CHAR ch;
SIZE_S stSize;
/******************************************
step 1: init variable
******************************************/
memset(&stVbConf,0,sizeof(VB_CONF_S));
u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\
PIC_HD1080, SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH);
stVbConf.u32MaxPoolCnt = 128;
/*ddr0 video buffer*/
stVbConf.astCommPool[0].u32BlkSize = u32BlkSize;
stVbConf.astCommPool[0].u32BlkCnt = u32ViChnCnt * 4;
memset(stVbConf.astCommPool[0].acMmzName,0,
sizeof(stVbConf.astCommPool[0].acMmzName));
/*ddr0 hist buf*/
stVbConf.astCommPool[1].u32BlkSize = (196*4);
stVbConf.astCommPool[1].u32BlkCnt = u32ViChnCnt * 4;
memset(stVbConf.astCommPool[1].acMmzName,0,
sizeof(stVbConf.astCommPool[1].acMmzName));
/*ddr1 video buffer*/
stVbConf.astCommPool[2].u32BlkSize = u32BlkSize;
stVbConf.astCommPool[2].u32BlkCnt = u32ViChnCnt * 4;
strcpy(stVbConf.astCommPool[2].acMmzName,"ddr1");
/*ddr1 hist buf*/
stVbConf.astCommPool[3].u32BlkSize = (196*4);
stVbConf.astCommPool[3].u32BlkCnt = u32ViChnCnt * 4;
strcpy(stVbConf.astCommPool[3].acMmzName,"ddr1");
/******************************************
step 2: mpp system init.
******************************************/
s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("system init failed with %d!\n", s32Ret);
goto END_VENC_4HD_0;
}
s32Ret = SAMPLE_COMM_VI_MemConfig(enViMode);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_VI_MemConfig failed with %d!\n", s32Ret);
goto END_VENC_4HD_0;
}
s32Ret = SAMPLE_COMM_VPSS_MemConfig();
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_VPSS_MemConfig failed with %d!\n", s32Ret);
goto END_VENC_4HD_0;
}
s32Ret = SAMPLE_COMM_VENC_MemConfig();
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_VPSS_MemConfig failed with %d!\n", s32Ret);
goto END_VENC_4HD_0;
}
/******************************************
step 3: start vi dev & chn to capture
******************************************/
s32Ret = SAMPLE_COMM_VI_Start(enViMode, gs_enNorm);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("start vi failed!\n");
goto END_VENC_4HD_0;
}
/******************************************
step 4: start vpss and vi bind vpss
******************************************/
s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, PIC_HD1080, &stSize);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n");
goto END_VENC_4HD_0;
}
stGrpAttr.u32MaxW = stSize.u32Width;
stGrpAttr.u32MaxH = stSize.u32Height;
stGrpAttr.bDrEn = HI_FALSE;
stGrpAttr.bDbEn = HI_FALSE;
stGrpAttr.bIeEn = HI_TRUE;
stGrpAttr.bNrEn = HI_TRUE;
stGrpAttr.bHistEn = HI_TRUE;
stGrpAttr.enDieMode = VPSS_DIE_MODE_AUTO;
stGrpAttr.enPixFmt = SAMPLE_PIXEL_FORMAT;
s32Ret = SAMPLE_COMM_VPSS_Start(s32VpssGrpCnt, &stSize, VPSS_MAX_CHN_NUM,NULL);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Vpss failed!\n");
goto END_VENC_4HD_1;
}
s32Ret = SAMPLE_COMM_VI_BindVpss(enViMode);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Vi bind Vpss failed!\n");
goto END_VENC_4HD_2;
}
/******************************************
step 5: select rc mode
******************************************/
while(1)
{
printf("please choose rc mode:\n");
printf("\t0) CBR\n");
printf("\t1) VBR\n");
printf("\t2) FIXQP\n");
ch = getchar();
getchar();
if ('0' == ch)
{
enRcMode = SAMPLE_RC_CBR;
break;
}
else if ('1' == ch)
{
enRcMode = SAMPLE_RC_VBR;
break;
}
else if ('2' == ch)
{
enRcMode = SAMPLE_RC_FIXQP;
break;
}
else
{
printf("rc mode invaild! please try again.\n");
continue;
}
}
/******************************************
step 6: start stream venc (big + little)
******************************************/
for (i=0; i<u32ViChnCnt; i++)
{
/*** main frame **/
VencGrp = i*2;
VencChn = i*2;
VpssGrp = i;
s32Ret = SAMPLE_COMM_VENC_Start(VencGrp, VencChn, enPayLoad[0],\
gs_enNorm, enSize[0], enRcMode);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Venc failed!\n");
goto END_VENC_4HD_3;
}
s32Ret = SAMPLE_COMM_VENC_BindVpss(VencGrp, VpssGrp, VPSS_BSTR_CHN);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Venc failed!\n");
goto END_VENC_4HD_3;
}
/*** Sub frame **/
VencGrp ++;
VencChn ++;
s32Ret = SAMPLE_COMM_VENC_Start(VencGrp, VencChn, enPayLoad[1], \
gs_enNorm, enSize[1], enRcMode);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Venc failed!\n");
goto END_VENC_4HD_3;
}
s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VPSS_LSTR_CHN);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Venc failed!\n");
goto END_VENC_4HD_3;
}
}
/******************************************
step 7: stream venc process -- get stream, then save it to file.
******************************************/
s32Ret = SAMPLE_COMM_VENC_StartGetStream(u32ViChnCnt*2);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Venc failed!\n");
goto END_VENC_4HD_3;
}
printf("please press twice ENTER to exit this sample\n");
getchar();
getchar();
/******************************************
step 8: exit process
******************************************/
SAMPLE_COMM_VENC_StopGetStream();
END_VENC_4HD_3:
for (i=0; i<u32ViChnCnt*2; i++)
{
VencGrp = i;
VencChn = i;
VpssGrp = i/2;
VpssChn = (VpssGrp%2)?VPSS_PRE0_CHN:VPSS_BSTR_CHN;
SAMPLE_COMM_VENC_UnBindVpss(VencGrp, VpssGrp, VpssChn);
SAMPLE_COMM_VENC_Stop(VencGrp,VencChn);
}
SAMPLE_COMM_VI_UnBindVpss(enViMode);
END_VENC_4HD_2: //vpss stop
SAMPLE_COMM_VPSS_Stop(s32VpssGrpCnt, VPSS_MAX_CHN_NUM);
END_VENC_4HD_1: //vi stop
SAMPLE_COMM_VI_Stop(enViMode);
END_VENC_4HD_0: //system exit
SAMPLE_COMM_SYS_Exit();
return s32Ret;
}
/******************************************************************************
* function : 1D1 MJPEG encode
******************************************************************************/
HI_S32 SAMPLE_VENC_1D1_MJPEG(HI_VOID)
{
SAMPLE_VI_MODE_E enViMode = SAMPLE_VI_MODE_1_D1;
HI_U32 u32ViChnCnt = 1;
HI_S32 s32VpssGrpCnt = 1;
PAYLOAD_TYPE_E enPayLoad = PT_MJPEG;
PIC_SIZE_E enSize = PIC_D1;
VB_CONF_S stVbConf;
VPSS_GRP VpssGrp;
VPSS_CHN VpssChn;
VPSS_GRP_ATTR_S stGrpAttr;
VENC_GRP VencGrp;
VENC_CHN VencChn;
SAMPLE_RC_E enRcMode;
HI_S32 i;
HI_S32 s32Ret = HI_SUCCESS;
HI_U32 u32BlkSize;
HI_CHAR ch;
SIZE_S stSize;
/******************************************
step 1: init variable
******************************************/
memset(&stVbConf,0,sizeof(VB_CONF_S));
u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\
PIC_D1, SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH);
stVbConf.u32MaxPoolCnt = 128;
/*ddr0 video buffer*/
stVbConf.astCommPool[0].u32BlkSize = u32BlkSize;
stVbConf.astCommPool[0].u32BlkCnt = u32ViChnCnt * 6;
memset(stVbConf.astCommPool[0].acMmzName,0,
sizeof(stVbConf.astCommPool[0].acMmzName));
/*ddr1 hist buf*/
stVbConf.astCommPool[1].u32BlkSize = (196*4);
stVbConf.astCommPool[1].u32BlkCnt = u32ViChnCnt * 6;
memset(stVbConf.astCommPool[1].acMmzName,0,
sizeof(stVbConf.astCommPool[1].acMmzName));
/******************************************
step 2: mpp system init.
******************************************/
s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("system init failed with %d!\n", s32Ret);
goto END_VENC_MJPEG_0;
}
s32Ret = SAMPLE_COMM_VI_MemConfig(enViMode);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_VI_MemConfig failed with %d!\n", s32Ret);
goto END_VENC_MJPEG_0;
}
s32Ret = SAMPLE_COMM_VPSS_MemConfig();
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_VPSS_MemConfig failed with %d!\n", s32Ret);
goto END_VENC_MJPEG_0;
}
s32Ret = SAMPLE_COMM_VENC_MemConfig();
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_VPSS_MemConfig failed with %d!\n", s32Ret);
goto END_VENC_MJPEG_0;
}
/******************************************
step 3: start vi dev & chn to capture
******************************************/
s32Ret = SAMPLE_COMM_VI_Start(enViMode, gs_enNorm);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("start vi failed!\n");
goto END_VENC_MJPEG_0;
}
/******************************************
step 4: start vpss and vi bind vpss
******************************************/
s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, PIC_D1, &stSize);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n");
goto END_VENC_MJPEG_0;
}
stGrpAttr.u32MaxW = stSize.u32Width;
stGrpAttr.u32MaxH = stSize.u32Height;
stGrpAttr.bDrEn = HI_FALSE;
stGrpAttr.bDbEn = HI_FALSE;
stGrpAttr.bIeEn = HI_TRUE;
stGrpAttr.bNrEn = HI_TRUE;
stGrpAttr.bHistEn = HI_TRUE;
stGrpAttr.enDieMode = VPSS_DIE_MODE_AUTO;
stGrpAttr.enPixFmt = SAMPLE_PIXEL_FORMAT;
s32Ret = SAMPLE_COMM_VPSS_Start(s32VpssGrpCnt, &stSize, VPSS_MAX_CHN_NUM,NULL);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Vpss failed!\n");
goto END_VENC_MJPEG_1;
}
s32Ret = SAMPLE_COMM_VI_BindVpss(enViMode);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Vi bind Vpss failed!\n");
goto END_VENC_MJPEG_2;
}
/******************************************
step 5: select rc mode
******************************************/
while(1)
{
printf("please choose rc mode:\n");
printf("\t0) CBR\n");
printf("\t1) VBR\n");
printf("\t2) FIXQP\n");
ch = getchar();
getchar();
if ('0' == ch)
{
enRcMode = SAMPLE_RC_CBR;
break;
}
else if ('1' == ch)
{
enRcMode = SAMPLE_RC_VBR;
break;
}
else if ('2' == ch)
{
enRcMode = SAMPLE_RC_FIXQP;
break;
}
else
{
printf("rc mode invaild! please try again.\n");
continue;
}
}
/******************************************
step 5: start stream venc
******************************************/
for (i=0; i<u32ViChnCnt; i++)
{
/*** main frame **/
VencGrp = i;
VencChn = i;
VpssGrp = i;
s32Ret = SAMPLE_COMM_VENC_Start(VencGrp, VencChn, enPayLoad,\
gs_enNorm, enSize, enRcMode);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Venc failed!\n");
goto END_VENC_MJPEG_3;
}
s32Ret = SAMPLE_COMM_VENC_BindVpss(VencGrp, VpssGrp, VPSS_BSTR_CHN);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Venc failed!\n");
goto END_VENC_MJPEG_3;
}
}
/******************************************
step 6: stream venc process -- get stream, then save it to file.
******************************************/
s32Ret = SAMPLE_COMM_VENC_StartGetStream(u32ViChnCnt);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Venc failed!\n");
goto END_VENC_MJPEG_3;
}
printf("please press twice ENTER to exit this sample\n");
getchar();
getchar();
/******************************************
step 8: exit process
******************************************/
SAMPLE_COMM_VENC_StopGetStream();
END_VENC_MJPEG_3:
for (i=0; i<u32ViChnCnt; i++)
{
VencGrp = i;
VencChn = i;
VpssGrp = i;
VpssChn =VPSS_BSTR_CHN;
SAMPLE_COMM_VENC_UnBindVpss(VencGrp, VpssGrp, VpssChn);
SAMPLE_COMM_VENC_Stop(VencGrp,VencChn);
}
SAMPLE_COMM_VI_UnBindVpss(enViMode);
END_VENC_MJPEG_2: //vpss stop
SAMPLE_COMM_VPSS_Stop(s32VpssGrpCnt, VPSS_MAX_CHN_NUM);
END_VENC_MJPEG_1: //vi stop
SAMPLE_COMM_VI_Stop(enViMode);
END_VENC_MJPEG_0: //system exit
SAMPLE_COMM_SYS_Exit();
return s32Ret;
}
/******************************************************************************
* function : 16D1 SNAP
******************************************************************************/
HI_S32 SAMPLE_VENC_16D1_Snap(HI_VOID)
{
SAMPLE_VI_MODE_E enViMode = SAMPLE_VI_MODE_16_D1;
HI_U32 u32ViChnCnt = 16;
HI_S32 s32VpssGrpCnt = 16;
PIC_SIZE_E enSize = PIC_D1;
VB_CONF_S stVbConf;
VPSS_GRP VpssGrp;
VPSS_GRP_ATTR_S stGrpAttr;
VENC_GRP VencGrp;
VENC_CHN VencChn;
HI_S32 i;
HI_S32 s32Ret = HI_SUCCESS;
HI_U32 u32BlkSize;
SIZE_S stSize;
/******************************************
step 1: init variable
******************************************/
memset(&stVbConf,0,sizeof(VB_CONF_S));
u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\
enSize, SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH);
stVbConf.u32MaxPoolCnt = 128;
/*ddr0 video buffer*/
stVbConf.astCommPool[0].u32BlkSize = u32BlkSize;
stVbConf.astCommPool[0].u32BlkCnt = u32ViChnCnt * 3;
memset(stVbConf.astCommPool[0].acMmzName,0,
sizeof(stVbConf.astCommPool[0].acMmzName));
/*ddr0 hist buf*/
stVbConf.astCommPool[1].u32BlkSize = (196*4);
stVbConf.astCommPool[1].u32BlkCnt = u32ViChnCnt * 3;
memset(stVbConf.astCommPool[1].acMmzName,0,
sizeof(stVbConf.astCommPool[1].acMmzName));
/*ddr1 video buffer*/
stVbConf.astCommPool[2].u32BlkSize = u32BlkSize;
stVbConf.astCommPool[2].u32BlkCnt = u32ViChnCnt * 3;
strcpy(stVbConf.astCommPool[2].acMmzName,"ddr1");
/*ddr1 hist buf*/
stVbConf.astCommPool[3].u32BlkSize = (196*4);
stVbConf.astCommPool[3].u32BlkCnt = u32ViChnCnt * 3;
strcpy(stVbConf.astCommPool[3].acMmzName,"ddr1");
/******************************************
step 2: mpp system init.
******************************************/
s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("system init failed with %d!\n", s32Ret);
goto END_VENC_SNAP_0;
}
s32Ret = SAMPLE_COMM_VI_MemConfig(enViMode);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_VI_MemConfig failed with %d!\n", s32Ret);
goto END_VENC_SNAP_0;
}
s32Ret = SAMPLE_COMM_VPSS_MemConfig();
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_VPSS_MemConfig failed with %d!\n", s32Ret);
goto END_VENC_SNAP_0;
}
s32Ret = SAMPLE_COMM_VENC_MemConfig();
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_VPSS_MemConfig failed with %d!\n", s32Ret);
goto END_VENC_SNAP_0;
}
/******************************************
step 3: start vi dev & chn to capture
******************************************/
s32Ret = SAMPLE_COMM_VI_Start(enViMode, gs_enNorm);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("start vi failed!\n");
goto END_VENC_SNAP_0;
}
/******************************************
step 4: start vpss and vi bind vpss
******************************************/
s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize, &stSize);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n");
goto END_VENC_SNAP_0;
}
stGrpAttr.u32MaxW = stSize.u32Width;
stGrpAttr.u32MaxH = stSize.u32Height;
stGrpAttr.bDrEn = HI_FALSE;
stGrpAttr.bDbEn = HI_FALSE;
stGrpAttr.bIeEn = HI_TRUE;
stGrpAttr.bNrEn = HI_TRUE;
stGrpAttr.bHistEn = HI_TRUE;
stGrpAttr.enDieMode = VPSS_DIE_MODE_AUTO;
stGrpAttr.enPixFmt = SAMPLE_PIXEL_FORMAT;
s32Ret = SAMPLE_COMM_VPSS_Start(s32VpssGrpCnt, &stSize, VPSS_MAX_CHN_NUM,NULL);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Vpss failed!\n");
goto END_VENC_SNAP_1;
}
s32Ret = SAMPLE_COMM_VI_BindVpss(enViMode);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Vi bind Vpss failed!\n");
goto END_VENC_SNAP_2;
}
/******************************************
step 5: snap process
******************************************/
VencGrp = 0;
VencChn = 0;
s32Ret = SAMPLE_COMM_VENC_SnapStart(VencGrp, VencChn, &stSize);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start snap failed!\n");
goto END_VENC_SNAP_3;
}
for (i=0; i<u32ViChnCnt; i++)
{
/*** main frame **/
VpssGrp = i;
s32Ret = SAMPLE_COMM_VENC_SnapProcess(VencGrp, VencChn, VpssGrp, VPSS_BSTR_CHN);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("snap process failed!\n");
goto END_VENC_SNAP_4;
}
printf("snap chn %d ok!\n", i);
sleep(1);
}
/******************************************
step 8: exit process
******************************************/
printf("snap over!\n");
END_VENC_SNAP_4:
s32Ret = SAMPLE_COMM_VENC_SnapStop(VencGrp, VencChn);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Stop snap failed!\n");
goto END_VENC_SNAP_3;
}
END_VENC_SNAP_3:
SAMPLE_COMM_VI_UnBindVpss(enViMode);
END_VENC_SNAP_2: //vpss stop
SAMPLE_COMM_VPSS_Stop(s32VpssGrpCnt, VPSS_MAX_CHN_NUM);
END_VENC_SNAP_1: //vi stop
SAMPLE_COMM_VI_Stop(enViMode);
END_VENC_SNAP_0: //system exit
SAMPLE_COMM_SYS_Exit();
return s32Ret;
}
/******************************************************************************
* function : 1D1 User send pictures for H264 encode
******************************************************************************/
HI_S32 SAMPLE_VENC_1D1_USER_SEND_PICTURES(HI_VOID)
{
VB_CONF_S stVbConf;
VENC_GRP VencGrp = 0;
VENC_CHN VencChn = 0;
PIC_SIZE_E enSize = PIC_D1;
HI_S32 s32Ret = HI_SUCCESS;
HI_U32 u32BlkSize;
SIZE_S stSize;
VB_POOL hPool = VB_INVALID_POOLID;
FILE *pfp_img = HI_NULL;
HI_U32 u32PicLStride = 0;
HI_U32 u32PicCStride = 0;
HI_U32 u32LumaSize = 0;
HI_U32 u32ChrmSize = 0;
HI_U32 u32Cnt = 0;
HI_U32 u32ChnCnt = 1;
GROUP_COLOR2GREY_CONF_S stGrpColor2GreyConf;
GROUP_COLOR2GREY_S stGrpColor2Grey;
clock_t start_time1,start_time, finish_time;
float duration;
struct timeval tv1,tv2,tv3;
gettimeofday(&tv1,NULL);
start_time1 = clock();
/******************************************
step 1: init variable
******************************************/
memset(&stVbConf,0,sizeof(VB_CONF_S));
u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\
enSize, SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH);
stVbConf.u32MaxPoolCnt = 128;
/*ddr0 video buffer*/
stVbConf.astCommPool[0].u32BlkSize = u32BlkSize;
stVbConf.astCommPool[0].u32BlkCnt = 10;
memset(stVbConf.astCommPool[0].acMmzName,0,
sizeof(stVbConf.astCommPool[0].acMmzName));
/******************************************
step 2: mpp system init.
******************************************/
s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("system init failed with %d!\n", s32Ret);
goto END_VENC_USER_0;
}
s32Ret = SAMPLE_COMM_VENC_MemConfig();
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_VENC_MemConfig failed with %d!\n", s32Ret);
goto END_VENC_USER_0;
}
/******************************************
step 3: open yuv file
******************************************/
if (pfp_img != HI_NULL)
{
fclose(pfp_img);
pfp_img = HI_NULL;
}
pfp_img = fopen(SAMPLE_YUV_D1_FILEPATH, "rb" );
if (pfp_img == HI_NULL)
{
SAMPLE_PRT("Open yuv file failed!Check if the file %s exit\n",SAMPLE_YUV_D1_FILEPATH);
goto END_VENC_USER_0;
}
/******************************************
step 4: create private pool on ddr0
******************************************/
hPool = HI_MPI_VB_CreatePool( u32BlkSize, 10,NULL );
if (hPool == VB_INVALID_POOLID)
{
SAMPLE_PRT("HI_MPI_VB_CreatePool failed! \n");
goto END_VENC_USER_1;
}
stGrpColor2GreyConf.bEnable = HI_TRUE;
stGrpColor2GreyConf.u32MaxWidth = 720;
stGrpColor2GreyConf.u32MaxHeight = 576;
s32Ret = HI_MPI_VENC_SetColor2GreyConf(&stGrpColor2GreyConf);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SetColor2GreyConf failed!\n");
goto END_VENC_USER_2;
}
/******************************************
step 5: encode process
******************************************/
s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize, &stSize);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n");
goto END_VENC_USER_2;
}
s32Ret = SAMPLE_COMM_VENC_Start(VencGrp, VencChn, PT_H264, gs_enNorm, enSize, SAMPLE_RC_CBR);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start snap failed!\n");
goto END_VENC_USER_2;
}
/*** Enable a grp with color2grey **/
#if 0
stGrpColor2Grey.bColor2Grey = HI_TRUE;
s32Ret = HI_MPI_VENC_SetGrpColor2Grey(VencGrp, &stGrpColor2Grey);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SetGrpColor2Grey failed!\n");
goto END_VENC_USER_2;
}
#endif
/******************************************
step 6: stream venc process -- get stream, then save it to file.
******************************************/
s32Ret = SAMPLE_COMM_VENC_StartGetStream(u32ChnCnt);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("StartGetStream failed!\n");
goto END_VENC_USER_3;
}
u32PicLStride = CEILING_2_POWER(stSize.u32Width, SAMPLE_SYS_ALIGN_WIDTH);
u32PicCStride = CEILING_2_POWER(stSize.u32Width, SAMPLE_SYS_ALIGN_WIDTH);
u32LumaSize = (u32PicLStride * stSize.u32Height);
u32ChrmSize = (u32PicCStride * stSize.u32Height) >> 2;
///////////////////////////////////////////
//HI_S32 s32Ret = HI_FAILURE;
VENC_PARAM_H264_VUI_S stVui;
VENC_CHN VeChnId = 0;
//...omit other thing
s32Ret = HI_MPI_VENC_GetH264Vui(VeChnId, &stVui);
if (HI_SUCCESS != s32Ret)
{
printf("HI_MPI_VENC_GetH264Vui err 0x%x\n",s32Ret);
return HI_FAILURE;
}
printf("\n:%d %d-%d\n",stVui.timing_info_present_flag,stVui.num_units_in_tick,stVui.time_scale);
stVui.timing_info_present_flag = 1;
stVui.num_units_in_tick = 1;
stVui.time_scale = 200;
stVui.fixed_frame_rate_flag=0;
s32Ret = HI_MPI_VENC_SetH264Vui(VeChnId, &stVui);
if (HI_SUCCESS != s32Ret)
{
printf("HI_MPI_VENC_SetH264Vui err 0x%x\n",s32Ret);
return HI_FAILURE;
}
////////////////////////////////////////////
start_time = clock();
gettimeofday(&tv2,NULL);
while(0 == feof(pfp_img))
{
SAMPLE_MEMBUF_S stMem = {0};
VIDEO_FRAME_INFO_S stFrmInfo;
if(0)//(u32Cnt>300)
{
stVui.timing_info_present_flag = 1;
stVui.num_units_in_tick = 1;
stVui.time_scale = 50;
stVui.fixed_frame_rate_flag=0;
s32Ret = HI_MPI_VENC_SetH264Vui(VeChnId, &stVui);
}
stMem.hPool = hPool;
u32Cnt ++;
while((stMem.hBlock = HI_MPI_VB_GetBlock(stMem.hPool, u32BlkSize,NULL)) == VB_INVALID_HANDLE)
{
;
}
stMem.u32PhyAddr = HI_MPI_VB_Handle2PhysAddr(stMem.hBlock);
stMem.pVirAddr = (HI_U8 *) HI_MPI_SYS_Mmap( stMem.u32PhyAddr, u32BlkSize );
if(stMem.pVirAddr == NULL)
{
SAMPLE_PRT("Mem dev may not open\n");
goto END_VENC_USER_4;
}
memset(&stFrmInfo.stVFrame, 0, sizeof(VIDEO_FRAME_S));
stFrmInfo.stVFrame.u32PhyAddr[0] = stMem.u32PhyAddr;
stFrmInfo.stVFrame.u32PhyAddr[1] = stFrmInfo.stVFrame.u32PhyAddr[0] + u32LumaSize;
stFrmInfo.stVFrame.u32PhyAddr[2] = stFrmInfo.stVFrame.u32PhyAddr[1] + u32ChrmSize;
stFrmInfo.stVFrame.pVirAddr[0] = stMem.pVirAddr;
stFrmInfo.stVFrame.pVirAddr[1] = (HI_U8 *) stFrmInfo.stVFrame.pVirAddr[0] + u32LumaSize;
stFrmInfo.stVFrame.pVirAddr[2] = (HI_U8 *) stFrmInfo.stVFrame.pVirAddr[1] + u32ChrmSize;
stFrmInfo.stVFrame.u32Width = stSize.u32Width;
stFrmInfo.stVFrame.u32Height = stSize.u32Height;
stFrmInfo.stVFrame.u32Stride[0] = u32PicLStride;
stFrmInfo.stVFrame.u32Stride[1] = u32PicLStride;
stFrmInfo.stVFrame.u32Stride[2] = u32PicLStride;
stFrmInfo.stVFrame.u64pts = (u32Cnt * 40);
stFrmInfo.stVFrame.u32TimeRef = (u32Cnt * 2);
// printf("%d--%d",stFrmInfo.stVFrame.u32Width, stFrmInfo.stVFrame.u32Height);
/* Different channsel with different picture sequence */
SAMPLE_COMM_VENC_ReadOneFrame( pfp_img, stFrmInfo.stVFrame.pVirAddr[0],
stFrmInfo.stVFrame.pVirAddr[1], stFrmInfo.stVFrame.pVirAddr[2],
stFrmInfo.stVFrame.u32Width, stFrmInfo.stVFrame.u32Height,
stFrmInfo.stVFrame.u32Stride[0], stFrmInfo.stVFrame.u32Stride[1] >> 1 );
if(0 != feof(pfp_img))
{
break;
}
#if 1
SAMPLE_COMM_VENC_PlanToSemi( stFrmInfo.stVFrame.pVirAddr[0], stFrmInfo.stVFrame.u32Stride[0],
stFrmInfo.stVFrame.pVirAddr[1], stFrmInfo.stVFrame.u32Stride[1],
stFrmInfo.stVFrame.pVirAddr[2], stFrmInfo.stVFrame.u32Stride[1],
stFrmInfo.stVFrame.u32Width, stFrmInfo.stVFrame.u32Height );
#endif
stFrmInfo.stVFrame.enPixelFormat = SAMPLE_PIXEL_FORMAT;
stFrmInfo.stVFrame.u32Field = VIDEO_FIELD_FRAME;
stMem.u32PoolId = HI_MPI_VB_Handle2PoolId( stMem.hBlock );
stFrmInfo.u32PoolId = stMem.u32PoolId;
s32Ret = HI_MPI_VENC_SendFrame(VencGrp, &stFrmInfo);
HI_MPI_SYS_Munmap( stMem.pVirAddr, u32BlkSize );
HI_MPI_VB_ReleaseBlock(stMem.hBlock);
}
finish_time = clock();
gettimeofday(&tv3,NULL);
duration = (double)(finish_time - start_time)/1000;
printf( "used sec: %2.1f frames:%d(%d,%d,%d)\n",duration ,u32Cnt-1,finish_time , start_time,start_time1);
// printf("tv1:%d %d\n", tv1.tv_sec,tv1.tv_usec);
printf("used sec:%d ",tv3.tv_sec-tv2.tv_sec);
printf("tv2:%d %d ", tv2.tv_sec,tv2.tv_usec);
printf("tv3:%d %d\n", tv3.tv_sec,tv3.tv_usec);
/******************************************
step 7: exit process
******************************************/
END_VENC_USER_4:
SAMPLE_COMM_VENC_StopGetStream();
END_VENC_USER_3:
s32Ret = SAMPLE_COMM_VENC_Stop(VencGrp,VencChn);;
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Stop encode failed!\n");
goto END_VENC_USER_2;
}
END_VENC_USER_2:
//before destroy private pool,must stop venc
HI_MPI_VB_DestroyPool( hPool );
END_VENC_USER_1:
//close the yuv file
fclose( pfp_img );
pfp_img = HI_NULL;
END_VENC_USER_0:
//system exit
SAMPLE_COMM_SYS_Exit();
return s32Ret;
}
/******************************************************************************
* function : 16D1 H264 encode with color2grey
******************************************************************************/
HI_S32 SAMPLE_VENC_16D1_H264_COLOR2GREY(HI_VOID)
{
SAMPLE_VI_MODE_E enViMode = SAMPLE_VI_MODE_16_D1;
HI_U32 u32ViChnCnt = 16;
HI_S32 s32VpssGrpCnt = 16;
PAYLOAD_TYPE_E enPayLoad[2]= {PT_H264, PT_H264};
PIC_SIZE_E enSize[2] = {PIC_D1, PIC_CIF};
VB_CONF_S stVbConf;
VPSS_GRP VpssGrp;
VPSS_CHN VpssChn;
VPSS_GRP_ATTR_S stGrpAttr;
VENC_GRP VencGrp;
VENC_CHN VencChn;
SAMPLE_RC_E enRcMode;
GROUP_COLOR2GREY_CONF_S stGrpColor2GreyConf;
GROUP_COLOR2GREY_S stGrpColor2Grey;
HI_S32 i;
HI_S32 s32Ret = HI_SUCCESS;
HI_U32 u32BlkSize;
HI_CHAR ch;
SIZE_S stSize;
/******************************************
step 1: init variable
******************************************/
memset(&stVbConf,0,sizeof(VB_CONF_S));
u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\
PIC_D1, SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH);
stVbConf.u32MaxPoolCnt = 128;
/*ddr0 video buffer*/
stVbConf.astCommPool[0].u32BlkSize = u32BlkSize;
stVbConf.astCommPool[0].u32BlkCnt = u32ViChnCnt * 3;
memset(stVbConf.astCommPool[0].acMmzName,0,
sizeof(stVbConf.astCommPool[0].acMmzName));
/*ddr0 hist buf*/
stVbConf.astCommPool[1].u32BlkSize = (196*4);
stVbConf.astCommPool[1].u32BlkCnt = u32ViChnCnt * 3;
memset(stVbConf.astCommPool[1].acMmzName,0,
sizeof(stVbConf.astCommPool[1].acMmzName));
/*ddr1 video buffer*/
stVbConf.astCommPool[2].u32BlkSize = u32BlkSize;
stVbConf.astCommPool[2].u32BlkCnt = u32ViChnCnt * 3;
strcpy(stVbConf.astCommPool[2].acMmzName,"ddr1");
/*ddr1 hist buf*/
stVbConf.astCommPool[3].u32BlkSize = (196*4);
stVbConf.astCommPool[3].u32BlkCnt = u32ViChnCnt * 3;
strcpy(stVbConf.astCommPool[3].acMmzName,"ddr1");
/******************************************
step 2: mpp system init.
******************************************/
s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("system init failed with %d!\n", s32Ret);
goto END_VENC_16D1_0;
}
s32Ret = SAMPLE_COMM_VI_MemConfig(enViMode);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_VI_MemConfig failed with %d!\n", s32Ret);
goto END_VENC_16D1_0;
}
s32Ret = SAMPLE_COMM_VPSS_MemConfig();
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_VPSS_MemConfig failed with %d!\n", s32Ret);
goto END_VENC_16D1_0;
}
s32Ret = SAMPLE_COMM_VENC_MemConfig();
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_VPSS_MemConfig failed with %d!\n", s32Ret);
goto END_VENC_16D1_0;
}
/******************************************
step 3: start vi dev & chn to capture
******************************************/
s32Ret = SAMPLE_COMM_VI_Start(enViMode, gs_enNorm);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("start vi failed!\n");
goto END_VENC_16D1_0;
}
/******************************************
step 4: start vpss and vi bind vpss
******************************************/
s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, PIC_D1, &stSize);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n");
goto END_VENC_16D1_0;
}
stGrpAttr.u32MaxW = stSize.u32Width;
stGrpAttr.u32MaxH = stSize.u32Height;
stGrpAttr.bDrEn = HI_FALSE;
stGrpAttr.bDbEn = HI_FALSE;
stGrpAttr.bIeEn = HI_TRUE;
stGrpAttr.bNrEn = HI_TRUE;
stGrpAttr.bHistEn = HI_TRUE;
stGrpAttr.enDieMode = VPSS_DIE_MODE_AUTO;
stGrpAttr.enPixFmt = SAMPLE_PIXEL_FORMAT;
s32Ret = SAMPLE_COMM_VPSS_Start(s32VpssGrpCnt, &stSize, VPSS_MAX_CHN_NUM,NULL);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Vpss failed!\n");
goto END_VENC_16D1_1;
}
s32Ret = SAMPLE_COMM_VI_BindVpss(enViMode);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Vi bind Vpss failed!\n");
goto END_VENC_16D1_2;
}
/******************************************
step 5: Set color2grey conf
******************************************/
stGrpColor2GreyConf.bEnable = HI_TRUE;
stGrpColor2GreyConf.u32MaxWidth = 720;
stGrpColor2GreyConf.u32MaxHeight = 576;
s32Ret = HI_MPI_VENC_SetColor2GreyConf(&stGrpColor2GreyConf);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SetColor2GreyConf failed!\n");
goto END_VENC_16D1_2;
}
/******************************************
step 6: select rc mode
******************************************/
while(1)
{
printf("please choose rc mode:\n");
printf("\t0) CBR\n");
printf("\t1) VBR\n");
printf("\t2) FIXQP\n");
ch = getchar();
getchar();
if ('0' == ch)
{
enRcMode = SAMPLE_RC_CBR;
break;
}
else if ('1' == ch)
{
enRcMode = SAMPLE_RC_VBR;
break;
}
else if ('2' == ch)
{
enRcMode = SAMPLE_RC_FIXQP;
break;
}
else
{
printf("rc mode invaild! please try again.\n");
continue;
}
}
/******************************************
step 7: start stream venc (big + little)
******************************************/
for (i=0; i<u32ViChnCnt; i++)
{
/*** main frame **/
VencGrp = i*2;
VencChn = i*2;
VpssGrp = i;
s32Ret = SAMPLE_COMM_VENC_Start(VencGrp, VencChn, enPayLoad[0],\
gs_enNorm, enSize[0], enRcMode);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Venc failed!\n");
goto END_VENC_16D1_3;
}
s32Ret = SAMPLE_COMM_VENC_BindVpss(VencGrp, VpssGrp, VPSS_BSTR_CHN);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Venc failed!\n");
goto END_VENC_16D1_3;
}
/*** Enable a grp with color2grey **/
stGrpColor2Grey.bColor2Grey = HI_TRUE;
s32Ret = HI_MPI_VENC_SetGrpColor2Grey(VencGrp, &stGrpColor2Grey);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SetGrpColor2Grey failed!\n");
goto END_VENC_16D1_3;
}
/*** Sub frame **/
VencGrp ++;
VencChn ++;
s32Ret = SAMPLE_COMM_VENC_Start(VencGrp, VencChn, enPayLoad[1], \
gs_enNorm, enSize[1], enRcMode);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Venc failed!\n");
goto END_VENC_16D1_3;
}
s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VPSS_PRE0_CHN);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Venc failed!\n");
goto END_VENC_16D1_3;
}
/*** Enable a grp with color2grey **/
stGrpColor2Grey.bColor2Grey = HI_TRUE;
s32Ret = HI_MPI_VENC_SetGrpColor2Grey(VencGrp, &stGrpColor2Grey);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SetGrpColor2Grey failed!\n");
goto END_VENC_16D1_3;
}
}
/******************************************
step 8: stream venc process -- get stream, then save it to file.
******************************************/
s32Ret = SAMPLE_COMM_VENC_StartGetStream(u32ViChnCnt*2);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Venc failed!\n");
goto END_VENC_16D1_3;
}
printf("please press twice ENTER to exit this sample\n");
getchar();
getchar();
/******************************************
step 9: exit process
******************************************/
SAMPLE_COMM_VENC_StopGetStream();
END_VENC_16D1_3:
for (i=0; i<u32ViChnCnt*2; i++)
{
VencGrp = i;
VencChn = i;
VpssGrp = i/2;
VpssChn = (VpssGrp%2)?VPSS_PRE0_CHN:VPSS_BSTR_CHN;
SAMPLE_COMM_VENC_UnBindVpss(VencGrp, VpssGrp, VpssChn);
SAMPLE_COMM_VENC_Stop(VencGrp,VencChn);
}
SAMPLE_COMM_VI_UnBindVpss(enViMode);
END_VENC_16D1_2: //vpss stop
SAMPLE_COMM_VPSS_Stop(s32VpssGrpCnt, VPSS_MAX_CHN_NUM);
END_VENC_16D1_1: //vi stop
SAMPLE_COMM_VI_Stop(enViMode);
END_VENC_16D1_0: //system exit
SAMPLE_COMM_SYS_Exit();
return s32Ret;
}
/******************************************************************************
* function : main()
* Description : video venc sample
******************************************************************************/
int main(int argc, char *argv[])
{
HI_S32 s32Ret;
if ( (argc < 2) || (1 != strlen(argv[1])))
{
SAMPLE_VENC_Usage(argv[0]);
return HI_FAILURE;
}
signal(SIGINT, SAMPLE_VENC_HandleSig);
signal(SIGTERM, SAMPLE_VENC_HandleSig);
switch (*argv[1])
{
case '0':/* 16D1 H264 encode */
s32Ret = SAMPLE_VENC_16D1_H264();
break;
case '1':/* 4*1080p H264 encode */
s32Ret = SAMPLE_VENC_4HD_H264();
break;
case '2':/* 1D1 MJPEG encode */
s32Ret = SAMPLE_VENC_1D1_MJPEG();
break;
case '3':/* 16D1 JPEG snap */
s32Ret = SAMPLE_VENC_16D1_Snap();
break;
case '4':/* 1D1 User send pictures for H264 encode */
s32Ret = SAMPLE_VENC_1D1_USER_SEND_PICTURES();
break;
case '5':/* 16D1 H264 encode with color2grey */
s32Ret = SAMPLE_VENC_16D1_H264_COLOR2GREY();
break;
default:
printf("the index is invaild!\n");
SAMPLE_VENC_Usage(argv[0]);
return HI_FAILURE;
}
if (HI_SUCCESS == s32Ret)
printf("program exit normally!\n");
else
printf("program exit abnormally!\n");
exit(s32Ret);
}
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* End of #ifdef __cplusplus */