不多说了,直接上源码+分析......
/****************************************************************************** A simple program of Hisilicon HI3531 video encode implementation. Copyright (C), 2010-2011, Hisilicon Tech. Co., Ltd. ****************************************************************************** Modification: 2011-2 Created ******************************************************************************/ #ifdef __cplusplus //__cplusplus是C++中定义的一个宏,如果这个宏被定义,说明这个程序是C++程序 #if __cplusplus //那么如果C++程序要调用C实现的函数或库等,则需要使用extern "C"{ extern "C"{ //这是实现C++调用C库或函数的一种手段,原因是因为C++和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" //VIDEO_NORM_E gs_enNorm = VIDEO_ENCODING_MODE_PAL; //PAL(德国制@25帧),中国主要也是使用这种。 VIDEO_NORM_E gs_enNorm = VIDEO_ENCODING_MODE_NTSC; //NTSC(美国制@30帧),(来自网络)更换N制的镜头后,VI VO的属性都要设置成N制的 //VIDEO_NORM_E gs_enNorm = VIDEO_ENCODING_MODE_AUTO, //VIDEO_NORM_E gs_enNorm = VIDEO_ENCODING_MODE_BUTT; #ifdef hi3518ev201 HI_U32 g_u32BlkCnt = 4; #endif #ifdef hi3518ev200 HI_U32 g_u32BlkCnt = 4; //啥意思?块大小? #endif #ifdef hi3516cv200 HI_U32 g_u32BlkCnt = 10; #endif //2018.06.02 /****************************************************************************** * function : show usage 介绍使用方法 ******************************************************************************/ void SAMPLE_VENC_Usage(char *sPrgNm) //接收的字符串为argv[0] { printf("Usage : %s <index>\n", sPrgNm); //string program number printf("index:\n"); printf("\t 0) 1*1080p H264 + 1*VGA H264.\n"); printf("\t 1) 1*1080p MJPEG encode + 1*1080p jpeg.\n"); printf("\t 2) low delay encode(only vi-vpss online).\n"); printf("\t 3) roi background framerate.\n"); printf("\t 4) Thumbnail of 1*1080p jpeg.\n"); #ifndef hi3518ev201 printf("\t 5) svc-t H264\n"); #endif return; } //2018.06.02 /****************************************************************************** * function : to process abnormal case 处理异常情况,譬如中断处理、结束进程 ******************************************************************************/ void SAMPLE_VENC_HandleSig(HI_S32 signo) { if (SIGINT == signo || SIGTERM == signo) { SAMPLE_COMM_ISP_Stop(); SAMPLE_COMM_SYS_Exit(); printf("\033[0;31mprogram termination abnormally!\033[0;39m\n"); } exit(-1); } //2018.06.02 /****************************************************************************** * function : to process abnormal case - the case of stream venc 编码异常处理 ******************************************************************************/ void SAMPLE_VENC_StreamHandleSig(HI_S32 signo) { if (SIGINT == signo || SIGTSTP == signo) { SAMPLE_COMM_ISP_Stop(); SAMPLE_COMM_SYS_Exit(); printf("\033[0;31mprogram exit abnormally!\033[0;39m\n"); } exit(0); } //2018.06.02 /****************************************************************************** * function : H.264@1080p@30fps+H.264@VGA@30fps 支持同时编码2路码流 ******************************************************************************/ HI_S32 SAMPLE_VENC_1080P_CLASSIC(HI_VOID) /* 最重要的函数 */ { PAYLOAD_TYPE_E enPayLoad[3]= {PT_H264, PT_H264,PT_H264}; /*枚举类型、数组、3路码流的编码类型 */ PIC_SIZE_E enSize[3] = {PIC_HD1080, PIC_VGA,PIC_QVGA}; /* 3路码流的分辨率 */ HI_U32 u32Profile = 0; VB_CONF_S stVbConf; /* 视频缓存池 */ SAMPLE_VI_CONFIG_S stViConfig = {0}; VPSS_GRP VpssGrp; /* 这部分是和VPSS相关的 */ VPSS_CHN VpssChn; VPSS_GRP_ATTR_S stVpssGrpAttr; VPSS_CHN_ATTR_S stVpssChnAttr; VPSS_CHN_MODE_S stVpssChnMode; VENC_CHN VencChn; SAMPLE_RC_E enRcMode= SAMPLE_RC_CBR; /* 恒定比特率方式进行编码 */ /* H.264编码方式有好种,这是其中一种 */ HI_S32 s32ChnNum=0; HI_S32 s32Ret = HI_SUCCESS; HI_U32 u32BlkSize; SIZE_S stSize; char c; /****************************************** step 1: init sys variable ## 1.这里的sys指“mpp”,指的是初始化mpp的变量 ## ******************************************/ memset(&stVbConf,0,sizeof(VB_CONF_S)); /* 刷新缓存池*/ SAMPLE_COMM_VI_GetSizeBySensor(&enSize[0]); /* 获取SENSOR,在这个函数里面添加 */ if (PIC_HD1080 == enSize[0]) { enSize[1] = PIC_VGA; s32ChnNum = 2; } else if (PIC_HD720 == enSize[0]) /* 走的是这条路 */ { enSize[1] = PIC_VGA; /* 通过对VI原始图像(720P)进行裁剪、缩放成这两路(VGA、QVGA) */ enSize[2] = PIC_QVGA; s32ChnNum = 3; /* 这里的3表示3路码流,分别是720P、VGA、QVGA */ } else { printf("not support this sensor\n"); return HI_FAILURE; } #ifdef hi3518ev201 s32ChnNum = 1; #endif printf("s32ChnNum = %d\n",s32ChnNum); stVbConf.u32MaxPoolCnt = 128; /* 缓存池的数量为128 */ /*video buffer*/ if(s32ChnNum >= 1) /* 走这条通道 */ { /* “enSize”表示传进去是多少像素的,“SAMPLE_PIXEL_FORMAT”表示像素格式(RGB888或RGB565) “SAMPLE_SYS_ALIGN_WIDTH”表示对齐*/ u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ enSize[0], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; stVbConf.astCommPool[0].u32BlkCnt = g_u32BlkCnt; } if(s32ChnNum >= 2) { u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ enSize[1], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); stVbConf.astCommPool[1].u32BlkSize = u32BlkSize; stVbConf.astCommPool[1].u32BlkCnt =g_u32BlkCnt; } if(s32ChnNum >= 3) /* */ { u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ enSize[2], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); stVbConf.astCommPool[2].u32BlkSize = u32BlkSize; stVbConf.astCommPool[2].u32BlkCnt = g_u32BlkCnt; } /****************************************** step 2: mpp system init. ## 2.初始化MMP系统 ## ******************************************/ s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("system init failed with %d!\n", s32Ret); goto END_VENC_1080P_CLASSIC_0; /* 倒影式处理,MPP初始化失败直接结束编码 */ } /****************************************** step 3: start vi dev & chn to capture ## 3.启动输入和通道捕获 ## ******************************************/ stViConfig.enViMode = SENSOR_TYPE; stViConfig.enRotate = ROTATE_NONE; /* 图像不旋转 */ stViConfig.enNorm = VIDEO_ENCODING_MODE_AUTO; /* 图像制式标准 */ stViConfig.enViChnSet = VI_CHN_SET_NORMAL; /* */ stViConfig.enWDRMode = WDR_MODE_NONE; /* 不支持宽动态 */ s32Ret = SAMPLE_COMM_VI_StartVi(&stViConfig); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("start vi failed!\n"); goto END_VENC_1080P_CLASSIC_1; } /****************************************** step 4: start vpss and vi bind vpss ##4:启动视频处理和绑定视频输入(通道)## ******************************************/ s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize[0], &stSize); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); goto END_VENC_1080P_CLASSIC_1; } if(s32ChnNum >= 1) /* 走这个通道 */ { VpssGrp = 0; stVpssGrpAttr.u32MaxW = stSize.u32Width; stVpssGrpAttr.u32MaxH = stSize.u32Height; stVpssGrpAttr.bIeEn = HI_FALSE; stVpssGrpAttr.bNrEn = HI_TRUE; stVpssGrpAttr.bHistEn = HI_FALSE; stVpssGrpAttr.bDciEn = HI_FALSE; stVpssGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE; stVpssGrpAttr.enPixFmt = PIXEL_FORMAT_YUV_SEMIPLANAR_420; s32Ret = SAMPLE_COMM_VPSS_StartGroup(VpssGrp, &stVpssGrpAttr); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Vpss failed!\n"); goto END_VENC_1080P_CLASSIC_2; } s32Ret = SAMPLE_COMM_VI_BindVpss(stViConfig.enViMode); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Vi bind Vpss failed!\n"); goto END_VENC_1080P_CLASSIC_3; } VpssChn = 0; stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; stVpssChnMode.bDouble = HI_FALSE; stVpssChnMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; stVpssChnMode.u32Width = stSize.u32Width; stVpssChnMode.u32Height = stSize.u32Height; stVpssChnMode.enCompressMode = COMPRESS_MODE_SEG; memset(&stVpssChnAttr, 0, sizeof(stVpssChnAttr)); stVpssChnAttr.s32SrcFrameRate = -1; stVpssChnAttr.s32DstFrameRate = -1; s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Enable vpss chn failed!\n"); goto END_VENC_1080P_CLASSIC_4; } } if(s32ChnNum >= 2) { s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize[1], &stSize); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); goto END_VENC_1080P_CLASSIC_4; } VpssChn = 1; stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; stVpssChnMode.bDouble = HI_FALSE; stVpssChnMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; stVpssChnMode.u32Width = stSize.u32Width; stVpssChnMode.u32Height = stSize.u32Height; stVpssChnMode.enCompressMode = COMPRESS_MODE_SEG; stVpssChnAttr.s32SrcFrameRate = -1; stVpssChnAttr.s32DstFrameRate = -1; s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Enable vpss chn failed!\n"); goto END_VENC_1080P_CLASSIC_4; } } if(s32ChnNum >= 3) { s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize[2], &stSize); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); goto END_VENC_1080P_CLASSIC_4; } VpssChn = 2; stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; stVpssChnMode.bDouble = HI_FALSE; stVpssChnMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; stVpssChnMode.u32Width = stSize.u32Width; stVpssChnMode.u32Height = stSize.u32Height; stVpssChnMode.enCompressMode = COMPRESS_MODE_NONE; stVpssChnAttr.s32SrcFrameRate = -1; stVpssChnAttr.s32DstFrameRate = -1; s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Enable vpss chn failed!\n"); goto END_VENC_1080P_CLASSIC_4; } } /****************************************** step 5: start stream venc # 可以在这里叠加OSD信息,并研究哪些码流 # ******************************************/ /*** HD1080P **/ printf("\t c) cbr.\n"); printf("\t v) vbr.\n"); printf("\t f) fixQp\n"); printf("please input choose rc mode!\n"); c = (char)getchar(); switch(c) { case 'c': enRcMode = SAMPLE_RC_CBR; break; case 'v': enRcMode = SAMPLE_RC_VBR; break; case 'f': enRcMode = SAMPLE_RC_FIXQP; break; default: printf("rc mode! is invaild!\n"); goto END_VENC_1080P_CLASSIC_4; } /*** enSize[0] ***/ if(s32ChnNum >= 1) { VpssGrp = 0; VpssChn = 0; /* 媒体处理通道0 */ VencChn = 0; /* 编码通道0 */ /* 通道0、负载类型PT_H264、NTSC制式、PIC_HD1080()、恒定比特率编码、0 */ s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad[0],\ gs_enNorm, enSize[0], enRcMode,u32Profile); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Venc failed!\n"); goto END_VENC_1080P_CLASSIC_5; } s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Venc failed!\n"); goto END_VENC_1080P_CLASSIC_5; } } /*** enSize[1] **/ if(s32ChnNum >= 2) { VpssChn = 1; /* 媒体处理通道1 */ VencChn = 1; /* 编码通道1 */ /* 通道1、负载类型PT_H264、NTSC制式、PIC_VGA(640 * 480)、恒定比特率编码、0 */ s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad[1], \ gs_enNorm, enSize[1], enRcMode,u32Profile); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Venc failed!\n"); goto END_VENC_1080P_CLASSIC_5; } s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Venc failed!\n"); goto END_VENC_1080P_CLASSIC_5; } } /*** enSize[2] **/ if(s32ChnNum >= 3) { VpssChn = 2; /* 媒体处理通道2 */ VencChn = 2; /* 编码通道2 */ /* 通道2、负载类型PT_H264、NTSC制式、PIC_QVGA(320 * 240)、恒定比特率编码、0 */ s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad[2], \ gs_enNorm, enSize[2], enRcMode,u32Profile); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Venc failed!\n"); goto END_VENC_1080P_CLASSIC_5; } s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Venc failed!\n"); goto END_VENC_1080P_CLASSIC_5; } } /****************************************** step 6: stream venc process -- get stream, then save it to file.
#在step 5中只是得到了一段裸流,并把这段码流保存为一个文件#******************************************/ s32Ret = SAMPLE_COMM_VENC_StartGetStream(s32ChnNum); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Venc failed!\n"); goto END_VENC_1080P_CLASSIC_5; } printf("please press twice ENTER to exit this sample\n"); getchar(); getchar(); /****************************************** step 7: exit process ******************************************/ SAMPLE_COMM_VENC_StopGetStream(); /* 停止去获取码流,不过前面产生码流的6部分并没有停止 */ END_VENC_1080P_CLASSIC_5: /* 倒影式处理产生码流的前六个步骤 */ VpssGrp = 0;switch(s32ChnNum){case 3:VpssChn = 2; VencChn = 2; SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn); SAMPLE_COMM_VENC_Stop(VencChn);case 2:VpssChn = 1; VencChn = 1; SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn); SAMPLE_COMM_VENC_Stop(VencChn);case 1:VpssChn = 0; VencChn = 0; SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn); SAMPLE_COMM_VENC_Stop(VencChn);break;} SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode);END_VENC_1080P_CLASSIC_4: //vpss stop VpssGrp = 0;switch(s32ChnNum){case 3:VpssChn = 2;SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn);case 2:VpssChn = 1;SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn);case 1:VpssChn = 0;SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn);break;}END_VENC_1080P_CLASSIC_3: //vpss stop SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode);END_VENC_1080P_CLASSIC_2: //vpss stop SAMPLE_COMM_VPSS_StopGroup(VpssGrp);END_VENC_1080P_CLASSIC_1: //vi stop SAMPLE_COMM_VI_StopVi(&stViConfig);END_VENC_1080P_CLASSIC_0: //system exit SAMPLE_COMM_SYS_Exit(); return s32Ret; }
/*---------end of------ H.264@1080p@30fps+H.265@1080p@30fps+H.264@D1@30fps ------------------*/ /*----------------分界线:上面是一个高清编码回合,是一种编码情况,下面这些是另外一种情况---------------*/ /****************************************************************************** * function : 1*1080p MJPEG encode + 1*1080p jpeg ******************************************************************************/ HI_S32 SAMPLE_VENC_1080P_MJPEG_JPEG(HI_VOID) { PAYLOAD_TYPE_E enPayLoad = PT_MJPEG; PIC_SIZE_E enSize = PIC_HD1080; HI_U32 u32Profile = 0; VB_CONF_S stVbConf; SAMPLE_VI_CONFIG_S stViConfig = {0}; VPSS_GRP VpssGrp; VPSS_CHN VpssChn; VPSS_GRP_ATTR_S stVpssGrpAttr; VPSS_CHN_ATTR_S stVpssChnAttr; VPSS_CHN_MODE_S stVpssChnMode; VENC_CHN VencChn; SAMPLE_RC_E enRcMode = SAMPLE_RC_CBR; HI_S32 s32ChnNum = 1; HI_S32 s32Ret = HI_SUCCESS; HI_U32 u32BlkSize; SIZE_S stSize; HI_S32 i = 0; char ch; /****************************************** step 1: init sys variable ******************************************/ memset(&stVbConf,0,sizeof(VB_CONF_S)); stVbConf.u32MaxPoolCnt = 128; SAMPLE_COMM_VI_GetSizeBySensor(&enSize); /*video buffer*/ u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ enSize, SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; stVbConf.astCommPool[0].u32BlkCnt = g_u32BlkCnt; /****************************************** 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_JPEG_0; } /****************************************** step 3: start vi dev & chn to capture ******************************************/ stViConfig.enViMode = SENSOR_TYPE; stViConfig.enRotate = ROTATE_NONE; stViConfig.enNorm = VIDEO_ENCODING_MODE_AUTO; stViConfig.enViChnSet = VI_CHN_SET_NORMAL; s32Ret = SAMPLE_COMM_VI_StartVi(&stViConfig); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("start vi failed!\n"); goto END_VENC_MJPEG_JPEG_1; } /****************************************** 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_MJPEG_JPEG_1; } VpssGrp = 0; stVpssGrpAttr.u32MaxW = stSize.u32Width; stVpssGrpAttr.u32MaxH = stSize.u32Height; stVpssGrpAttr.bIeEn = HI_FALSE; stVpssGrpAttr.bNrEn = HI_TRUE; stVpssGrpAttr.bHistEn = HI_FALSE; stVpssGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE; stVpssGrpAttr.enPixFmt = PIXEL_FORMAT_YUV_SEMIPLANAR_420; stVpssGrpAttr.bDciEn = HI_FALSE; s32Ret = SAMPLE_COMM_VPSS_StartGroup(VpssGrp, &stVpssGrpAttr); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Vpss failed!\n"); goto END_VENC_MJPEG_JPEG_2; } s32Ret = SAMPLE_COMM_VI_BindVpss(stViConfig.enViMode); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Vi bind Vpss failed!\n"); goto END_VENC_MJPEG_JPEG_3; } VpssChn = 0; stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; stVpssChnMode.bDouble = HI_FALSE; stVpssChnMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; stVpssChnMode.u32Width = stSize.u32Width; stVpssChnMode.u32Height = stSize.u32Height; stVpssChnMode.enCompressMode = COMPRESS_MODE_NONE; memset(&stVpssChnAttr, 0, sizeof(stVpssChnAttr)); stVpssChnAttr.s32SrcFrameRate = -1; stVpssChnAttr.s32DstFrameRate = -1; s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Enable vpss chn failed!\n"); goto END_VENC_MJPEG_JPEG_4; } VpssChn = 1; stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; stVpssChnMode.bDouble = HI_FALSE; stVpssChnMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; stVpssChnMode.u32Width = stSize.u32Width; stVpssChnMode.u32Height = stSize.u32Height; stVpssChnMode.enCompressMode = COMPRESS_MODE_NONE; memset(&stVpssChnAttr, 0, sizeof(stVpssChnAttr)); stVpssChnAttr.s32SrcFrameRate = -1; stVpssChnAttr.s32DstFrameRate = -1; s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Enable vpss chn failed!\n"); goto END_VENC_MJPEG_JPEG_4; } /****************************************** step 5: start stream venc ******************************************/ VpssGrp = 0; VpssChn = 0; VencChn = 0; s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad,\ gs_enNorm, enSize, enRcMode,u32Profile); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Venc failed!\n"); goto END_VENC_MJPEG_JPEG_5; } s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Venc failed!\n"); goto END_VENC_MJPEG_JPEG_5; } VpssGrp = 0; VpssChn = 1; VencChn = 1; s32Ret = SAMPLE_COMM_VENC_SnapStart(VencChn, &stSize, HI_FALSE); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start snap failed!\n"); goto END_VENC_MJPEG_JPEG_5; } s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Venc failed!\n"); goto END_VENC_MJPEG_JPEG_5; } /****************************************** step 6: stream venc process -- get stream, then save it to file. ******************************************/ s32Ret = SAMPLE_COMM_VENC_StartGetStream(s32ChnNum); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Venc failed!\n"); goto END_VENC_MJPEG_JPEG_5; } printf("press 'q' to exit sample!\nperess ENTER to capture one picture to file\n"); i = 0; while ((ch = (char)getchar()) != 'q') { s32Ret = SAMPLE_COMM_VENC_SnapProcess(VencChn, HI_TRUE, HI_FALSE); if (HI_SUCCESS != s32Ret) { printf("%s: sanp process failed!\n", __FUNCTION__); break; } printf("snap %d success!\n", i); i++; } printf("please press ENTER to exit this sample\n"); getchar(); getchar(); /****************************************** step 8: exit process ******************************************/ SAMPLE_COMM_VENC_StopGetStream(); END_VENC_MJPEG_JPEG_5: VpssGrp = 0; VpssChn = 0; VencChn = 0; SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn); SAMPLE_COMM_VENC_Stop(VencChn); VpssChn = 1; VencChn = 1; SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn); SAMPLE_COMM_VENC_Stop(VencChn); END_VENC_MJPEG_JPEG_4: //vpss stop VpssGrp = 0; VpssChn = 0; SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); VpssChn = 1; SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); END_VENC_MJPEG_JPEG_3: //vpss stop SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode); END_VENC_MJPEG_JPEG_2: //vpss stop SAMPLE_COMM_VPSS_StopGroup(VpssGrp); END_VENC_MJPEG_JPEG_1: //vi stop SAMPLE_COMM_VI_StopVi(&stViConfig); END_VENC_MJPEG_JPEG_0: //system exit SAMPLE_COMM_SYS_Exit(); return s32Ret; } /****************************************************************************** * function : low delay encode(only vi-vpss online). ******************************************************************************/ HI_S32 SAMPLE_VENC_LOW_DELAY(HI_VOID) { PAYLOAD_TYPE_E enPayLoad[2]= {PT_H264, PT_H264}; PIC_SIZE_E enSize[2] = {PIC_HD1080, PIC_VGA}; HI_U32 u32Profile = 0; VB_CONF_S stVbConf; SAMPLE_VI_CONFIG_S stViConfig = {0}; HI_U32 u32Priority; VPSS_GRP VpssGrp; VPSS_CHN VpssChn; VPSS_GRP_ATTR_S stVpssGrpAttr; VPSS_CHN_ATTR_S stVpssChnAttr; VPSS_CHN_MODE_S stVpssChnMode; VPSS_LOW_DELAY_INFO_S stLowDelayInfo; VENC_CHN VencChn; SAMPLE_RC_E enRcMode= SAMPLE_RC_CBR; HI_S32 s32ChnNum = 2; HI_S32 s32Ret = HI_SUCCESS; HI_U32 u32BlkSize; SIZE_S stSize; char c; /****************************************** step 1: init sys variable ******************************************/ memset(&stVbConf,0,sizeof(VB_CONF_S)); SAMPLE_COMM_VI_GetSizeBySensor(&enSize[0]); if (PIC_HD1080 == enSize[0]) { enSize[1] = PIC_VGA; s32ChnNum = 2; } else if (PIC_HD720 == enSize[0]) { enSize[1] = PIC_VGA; s32ChnNum = 2; } else { printf("not support this sensor\n"); return HI_FAILURE; } #ifdef hi3518ev201 s32ChnNum = 1; #endif stVbConf.u32MaxPoolCnt = 128; /*video buffer*/ u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ enSize[0], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); if(s32ChnNum >= 1) { printf("u32BlkSize: %d\n", u32BlkSize); stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; stVbConf.astCommPool[0].u32BlkCnt = g_u32BlkCnt; } if(s32ChnNum >= 2) { u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ enSize[1], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); stVbConf.astCommPool[1].u32BlkSize = u32BlkSize; stVbConf.astCommPool[1].u32BlkCnt = g_u32BlkCnt; } /****************************************** 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_LOW_DELAY_0; } /****************************************** step 3: start vi dev & chn to capture ******************************************/ stViConfig.enViMode = SENSOR_TYPE; stViConfig.enRotate = ROTATE_NONE; stViConfig.enNorm = VIDEO_ENCODING_MODE_AUTO; stViConfig.enViChnSet = VI_CHN_SET_NORMAL; s32Ret = SAMPLE_COMM_VI_StartVi(&stViConfig); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("start vi failed!\n"); goto END_VENC_LOW_DELAY_1; } /****************************************** step 4: start vpss and vi bind vpss ******************************************/ s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize[0], &stSize); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); goto END_VENC_LOW_DELAY_1; } VpssGrp = 0; stVpssGrpAttr.u32MaxW = stSize.u32Width; stVpssGrpAttr.u32MaxH = stSize.u32Height; stVpssGrpAttr.bIeEn = HI_FALSE; stVpssGrpAttr.bNrEn = HI_TRUE; stVpssGrpAttr.bHistEn = HI_FALSE; stVpssGrpAttr.bDciEn = HI_FALSE; stVpssGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE; stVpssGrpAttr.enPixFmt = PIXEL_FORMAT_YUV_SEMIPLANAR_420; s32Ret = SAMPLE_COMM_VPSS_StartGroup(VpssGrp, &stVpssGrpAttr); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Vpss failed!\n"); goto END_VENC_LOW_DELAY_2; } s32Ret = SAMPLE_COMM_VI_BindVpss(stViConfig.enViMode); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Vi bind Vpss failed!\n"); goto END_VENC_LOW_DELAY_3; } VpssChn = 0; stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; stVpssChnMode.bDouble = HI_FALSE; stVpssChnMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; stVpssChnMode.u32Width = stSize.u32Width; stVpssChnMode.u32Height = stSize.u32Height; stVpssChnMode.enCompressMode = COMPRESS_MODE_NONE; memset(&stVpssChnAttr, 0, sizeof(stVpssChnAttr)); stVpssChnAttr.s32SrcFrameRate = -1; stVpssChnAttr.s32DstFrameRate = -1; s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Enable vpss chn failed!\n"); goto END_VENC_LOW_DELAY_4; } s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize[1], &stSize); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); goto END_VENC_LOW_DELAY_4; } VpssChn = 1; stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; stVpssChnMode.bDouble = HI_FALSE; stVpssChnMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; stVpssChnMode.u32Width = stSize.u32Width; stVpssChnMode.u32Height = stSize.u32Height; stVpssChnMode.enCompressMode = COMPRESS_MODE_NONE; stVpssChnAttr.s32SrcFrameRate = -1; stVpssChnAttr.s32DstFrameRate = -1; s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Enable vpss chn failed!\n"); goto END_VENC_LOW_DELAY_4; } /****************************************** step 5: start stream venc ******************************************/ /*** HD1080P **/ printf("\t c) cbr.\n"); printf("\t v) vbr.\n"); printf("\t f) fixQp\n"); printf("please input choose rc mode!\n"); c = (char)getchar(); switch(c) { case 'c': enRcMode = SAMPLE_RC_CBR; break; case 'v': enRcMode = SAMPLE_RC_VBR; break; case 'f': enRcMode = SAMPLE_RC_FIXQP; break; default: printf("rc mode! is invaild!\n"); goto END_VENC_LOW_DELAY_4; } if(s32ChnNum >= 1) { VpssGrp = 0; VpssChn = 0; VencChn = 0; s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad[0],\ gs_enNorm, enSize[0], enRcMode,u32Profile); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Venc failed!\n"); goto END_VENC_LOW_DELAY_5; } s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Venc failed!\n"); goto END_VENC_LOW_DELAY_5; } /*set chnl Priority*/ s32Ret = HI_MPI_VENC_GetChnlPriority(VencChn,&u32Priority); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Get Chnl Priority failed!\n"); goto END_VENC_LOW_DELAY_5; } u32Priority = 1; s32Ret = HI_MPI_VENC_SetChnlPriority(VencChn,u32Priority); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Set Chnl Priority failed!\n"); goto END_VENC_LOW_DELAY_5; } /*set low delay*/ #if 1 s32Ret = HI_MPI_VPSS_GetLowDelayAttr(VpssGrp,VpssChn,&stLowDelayInfo); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("HI_MPI_VPSS_GetLowDelayAttr failed!\n"); goto END_VENC_LOW_DELAY_5; } stLowDelayInfo.bEnable = HI_TRUE; stLowDelayInfo.u32LineCnt = stVpssChnMode.u32Height/2; s32Ret = HI_MPI_VPSS_SetLowDelayAttr(VpssGrp,VpssChn,&stLowDelayInfo); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("HI_MPI_VPSS_SetLowDelayAttr failed!\n"); goto END_VENC_LOW_DELAY_5; } #endif } /*** 1080p **/ if(s32ChnNum >= 2) { VpssChn = 1; VencChn = 1; s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad[1], \ gs_enNorm, enSize[1], enRcMode,u32Profile); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Venc failed!\n"); goto END_VENC_LOW_DELAY_5; } s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Venc failed!\n"); goto END_VENC_LOW_DELAY_5; } } /****************************************** step 6: stream venc process -- get stream, then save it to file. ******************************************/ s32Ret = SAMPLE_COMM_VENC_StartGetStream(s32ChnNum); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Venc failed!\n"); goto END_VENC_LOW_DELAY_5; } printf("please press twice ENTER to exit this sample\n"); getchar(); getchar(); /****************************************** step 7: exit process ******************************************/ SAMPLE_COMM_VENC_StopGetStream(); END_VENC_LOW_DELAY_5: VpssGrp = 0; if(s32ChnNum >= 1) { VpssChn = 0; VencChn = 0; SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn); SAMPLE_COMM_VENC_Stop(VencChn); } if(s32ChnNum >= 2) { VpssChn = 1; VencChn = 1; SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn); SAMPLE_COMM_VENC_Stop(VencChn); } SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode); END_VENC_LOW_DELAY_4: //vpss stop VpssGrp = 0; VpssChn = 0; SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); VpssChn = 1; SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); END_VENC_LOW_DELAY_3: //vpss stop SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode); END_VENC_LOW_DELAY_2: //vpss stop SAMPLE_COMM_VPSS_StopGroup(VpssGrp); END_VENC_LOW_DELAY_1: //vi stop SAMPLE_COMM_VI_StopVi(&stViConfig); END_VENC_LOW_DELAY_0: //system exit SAMPLE_COMM_SYS_Exit(); return s32Ret; } HI_S32 SAMPLE_VENC_ROIBG_CLASSIC(HI_VOID) { PAYLOAD_TYPE_E enPayLoad= PT_H264; PIC_SIZE_E enSize[3] = {PIC_HD1080,PIC_VGA,PIC_QVGA}; HI_U32 u32Profile = 0; VB_CONF_S stVbConf; SAMPLE_VI_CONFIG_S stViConfig = {0}; VPSS_GRP VpssGrp; VPSS_CHN VpssChn; VPSS_GRP_ATTR_S stVpssGrpAttr; VPSS_CHN_ATTR_S stVpssChnAttr; VPSS_CHN_MODE_S stVpssChnMode; VENC_ROI_CFG_S stVencRoiCfg; VENC_ROIBG_FRAME_RATE_S stRoiBgFrameRate; VENC_CHN VencChn; SAMPLE_RC_E enRcMode= SAMPLE_RC_CBR; HI_S32 s32ChnNum = 1; HI_S32 s32Ret = HI_SUCCESS; HI_U32 u32BlkSize; SIZE_S stSize; char c; /****************************************** step 1: init sys variable ******************************************/ memset(&stVbConf,0,sizeof(VB_CONF_S)); SAMPLE_COMM_VI_GetSizeBySensor(&enSize[0]); if (PIC_HD1080 == enSize[0]) { s32ChnNum = 1; } else if (PIC_HD720 == enSize[0]) { s32ChnNum = 1; } else { printf("not support this sensor\n"); return HI_FAILURE; } stVbConf.u32MaxPoolCnt = 128; /*video buffer*/ if(s32ChnNum >= 1) { u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ enSize[0], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; stVbConf.astCommPool[0].u32BlkCnt = g_u32BlkCnt; } if(s32ChnNum >= 2) { u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ enSize[1], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); stVbConf.astCommPool[1].u32BlkSize = u32BlkSize; stVbConf.astCommPool[1].u32BlkCnt = g_u32BlkCnt; } if(s32ChnNum >= 3) { u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ enSize[2], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); stVbConf.astCommPool[2].u32BlkSize = u32BlkSize; stVbConf.astCommPool[2].u32BlkCnt = g_u32BlkCnt; } /****************************************** 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_1080P_CLASSIC_0; } /****************************************** step 3: start vi dev & chn to capture ******************************************/ stViConfig.enViMode = SENSOR_TYPE; stViConfig.enRotate = ROTATE_NONE; stViConfig.enNorm = VIDEO_ENCODING_MODE_AUTO; stViConfig.enViChnSet = VI_CHN_SET_NORMAL; s32Ret = SAMPLE_COMM_VI_StartVi(&stViConfig); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("start vi failed!\n"); goto END_VENC_1080P_CLASSIC_1; } /****************************************** step 4: start vpss and vi bind vpss ******************************************/ s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize[0], &stSize); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); goto END_VENC_1080P_CLASSIC_1; } VpssGrp = 0; stVpssGrpAttr.u32MaxW = stSize.u32Width; stVpssGrpAttr.u32MaxH = stSize.u32Height; stVpssGrpAttr.bIeEn = HI_FALSE; stVpssGrpAttr.bNrEn = HI_TRUE; stVpssGrpAttr.bHistEn = HI_FALSE; stVpssGrpAttr.bDciEn = HI_FALSE; stVpssGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE; stVpssGrpAttr.enPixFmt = PIXEL_FORMAT_YUV_SEMIPLANAR_420; s32Ret = SAMPLE_COMM_VPSS_StartGroup(VpssGrp, &stVpssGrpAttr); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Vpss failed!\n"); goto END_VENC_1080P_CLASSIC_2; } s32Ret = SAMPLE_COMM_VI_BindVpss(stViConfig.enViMode); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Vi bind Vpss failed!\n"); goto END_VENC_1080P_CLASSIC_3; } VpssChn = 0; stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; stVpssChnMode.bDouble = HI_FALSE; stVpssChnMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; stVpssChnMode.u32Width = stSize.u32Width; stVpssChnMode.u32Height = stSize.u32Height; stVpssChnMode.enCompressMode = COMPRESS_MODE_NONE; memset(&stVpssChnAttr, 0, sizeof(stVpssChnAttr)); stVpssChnAttr.s32SrcFrameRate = -1; stVpssChnAttr.s32DstFrameRate = -1; s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Enable vpss chn failed!\n"); goto END_VENC_1080P_CLASSIC_4; } /****************************************** step 5: start stream venc ******************************************/ /*** HD1080P **/ printf("\t c) cbr.\n"); printf("\t v) vbr.\n"); printf("\t f) fixQp\n"); printf("please input choose rc mode!\n"); c = (char)getchar(); switch(c) { case 'c': enRcMode = SAMPLE_RC_CBR; break; case 'v': enRcMode = SAMPLE_RC_VBR; break; case 'f': enRcMode = SAMPLE_RC_FIXQP; break; default: printf("rc mode! is invaild!\n"); goto END_VENC_1080P_CLASSIC_4; } VpssGrp = 0; VpssChn = 0; VencChn = 0; s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad,\ gs_enNorm, enSize[0], enRcMode,u32Profile); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Venc failed!\n"); goto END_VENC_1080P_CLASSIC_5; } s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Venc failed!\n"); goto END_VENC_1080P_CLASSIC_5; } stVencRoiCfg.bAbsQp = HI_TRUE; stVencRoiCfg.bEnable = HI_TRUE; stVencRoiCfg.s32Qp = 30; stVencRoiCfg.u32Index = 0; stVencRoiCfg.stRect.s32X = 64; stVencRoiCfg.stRect.s32Y = 64; stVencRoiCfg.stRect.u32Height =256; stVencRoiCfg.stRect.u32Width =256; s32Ret = HI_MPI_VENC_SetRoiCfg(VencChn,&stVencRoiCfg); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Venc failed!\n"); goto END_VENC_1080P_CLASSIC_5; } s32Ret = HI_MPI_VENC_GetRoiBgFrameRate(VencChn,&stRoiBgFrameRate); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("HI_MPI_VENC_GetRoiBgFrameRate failed!\n"); goto END_VENC_1080P_CLASSIC_5; } stRoiBgFrameRate.s32SrcFrmRate = (VIDEO_ENCODING_MODE_PAL== gs_enNorm)?25:30; stRoiBgFrameRate.s32DstFrmRate = (VIDEO_ENCODING_MODE_PAL== gs_enNorm)?5:15; s32Ret = HI_MPI_VENC_SetRoiBgFrameRate(VencChn,&stRoiBgFrameRate); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("HI_MPI_VENC_SetRoiBgFrameRate!\n"); goto END_VENC_1080P_CLASSIC_5; } /****************************************** step 6: stream venc process -- get stream, then save it to file. ******************************************/ s32Ret = SAMPLE_COMM_VENC_StartGetStream(s32ChnNum); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Venc failed!\n"); goto END_VENC_1080P_CLASSIC_5; } printf("please press ENTER to exit this sample\n"); getchar(); getchar(); /****************************************** step 7: exit process ******************************************/ SAMPLE_COMM_VENC_StopGetStream(); END_VENC_1080P_CLASSIC_5: VpssGrp = 0; VpssChn = 0; VencChn = 0; SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn); SAMPLE_COMM_VENC_Stop(VencChn); SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode); END_VENC_1080P_CLASSIC_4: //vpss stop VpssGrp = 0; VpssChn = 0; SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); END_VENC_1080P_CLASSIC_3: //vpss stop SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode); END_VENC_1080P_CLASSIC_2: //vpss stop SAMPLE_COMM_VPSS_StopGroup(VpssGrp); END_VENC_1080P_CLASSIC_1: //vi stop SAMPLE_COMM_VI_StopVi(&stViConfig); END_VENC_1080P_CLASSIC_0: //system exit SAMPLE_COMM_SYS_Exit(); return s32Ret; } HI_S32 SAMPLE_VENC_SVC_H264(HI_VOID) { PAYLOAD_TYPE_E enPayLoad= PT_H264; PIC_SIZE_E enSize[3] = {PIC_HD1080,PIC_HD720,PIC_D1}; HI_U32 u32Profile = 3;/* Svc-t */ VB_CONF_S stVbConf; SAMPLE_VI_CONFIG_S stViConfig = {0}; VPSS_GRP VpssGrp; VPSS_CHN VpssChn; VPSS_GRP_ATTR_S stVpssGrpAttr; VPSS_CHN_ATTR_S stVpssChnAttr; VPSS_CHN_MODE_S stVpssChnMode; VENC_CHN VencChn; SAMPLE_RC_E enRcMode= SAMPLE_RC_CBR; HI_S32 s32ChnNum = 1; HI_S32 s32Ret = HI_SUCCESS; HI_U32 u32BlkSize; SIZE_S stSize; char c; /****************************************** step 1: init sys variable ******************************************/ memset(&stVbConf,0,sizeof(VB_CONF_S)); SAMPLE_COMM_VI_GetSizeBySensor(&enSize[0]); if (PIC_HD1080 == enSize[0]) { s32ChnNum = 1; } else if (PIC_HD720 == enSize[0]) { s32ChnNum = 1; } else { printf("not support this sensor\n"); return HI_FAILURE; } stVbConf.u32MaxPoolCnt = 128; /*video buffer*/ if(s32ChnNum >= 1) { u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ enSize[0], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; stVbConf.astCommPool[0].u32BlkCnt = g_u32BlkCnt; } if(s32ChnNum >= 2) { u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ enSize[1], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); stVbConf.astCommPool[1].u32BlkSize = u32BlkSize; stVbConf.astCommPool[1].u32BlkCnt = g_u32BlkCnt; } if(s32ChnNum >= 1) { u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ enSize[2], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); stVbConf.astCommPool[2].u32BlkSize = u32BlkSize; stVbConf.astCommPool[2].u32BlkCnt = g_u32BlkCnt; } /****************************************** 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_1080P_CLASSIC_0; } /****************************************** step 3: start vi dev & chn to capture ******************************************/ stViConfig.enViMode = SENSOR_TYPE; stViConfig.enRotate = ROTATE_NONE; stViConfig.enNorm = VIDEO_ENCODING_MODE_AUTO; stViConfig.enViChnSet = VI_CHN_SET_NORMAL; s32Ret = SAMPLE_COMM_VI_StartVi(&stViConfig); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("start vi failed!\n"); goto END_VENC_1080P_CLASSIC_1; } /****************************************** step 4: start vpss and vi bind vpss ******************************************/ s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize[0], &stSize); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); goto END_VENC_1080P_CLASSIC_1; } VpssGrp = 0; stVpssGrpAttr.u32MaxW = stSize.u32Width; stVpssGrpAttr.u32MaxH = stSize.u32Height; stVpssGrpAttr.bIeEn = HI_FALSE; stVpssGrpAttr.bNrEn = HI_TRUE; stVpssGrpAttr.bHistEn = HI_FALSE; stVpssGrpAttr.bDciEn = HI_FALSE; stVpssGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE; stVpssGrpAttr.enPixFmt = PIXEL_FORMAT_YUV_SEMIPLANAR_420; s32Ret = SAMPLE_COMM_VPSS_StartGroup(VpssGrp, &stVpssGrpAttr); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Vpss failed!\n"); goto END_VENC_1080P_CLASSIC_2; } s32Ret = SAMPLE_COMM_VI_BindVpss(stViConfig.enViMode); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Vi bind Vpss failed!\n"); goto END_VENC_1080P_CLASSIC_3; } VpssChn = 0; stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; stVpssChnMode.bDouble = HI_FALSE; stVpssChnMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; stVpssChnMode.u32Width = stSize.u32Width; stVpssChnMode.u32Height = stSize.u32Height; stVpssChnMode.enCompressMode = COMPRESS_MODE_NONE; memset(&stVpssChnAttr, 0, sizeof(stVpssChnAttr)); stVpssChnAttr.s32SrcFrameRate = -1; stVpssChnAttr.s32DstFrameRate = -1; s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Enable vpss chn failed!\n"); goto END_VENC_1080P_CLASSIC_4; } /****************************************** step 5: start stream venc ******************************************/ /*** HD1080P **/ printf("\t c) cbr.\n"); printf("\t v) vbr.\n"); printf("\t f) fixQp\n"); printf("please input choose rc mode!\n"); c = (char)getchar(); switch(c) { case 'c': enRcMode = SAMPLE_RC_CBR; break; case 'v': enRcMode = SAMPLE_RC_VBR; break; case 'f': enRcMode = SAMPLE_RC_FIXQP; break; default: printf("rc mode! is invaild!\n"); goto END_VENC_1080P_CLASSIC_4; } VpssGrp = 0; VpssChn = 0; VencChn = 0; s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad,\ gs_enNorm, enSize[0], enRcMode,u32Profile); printf("SAMPLE_COMM_VENC_Start is ok\n"); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Venc failed!\n"); goto END_VENC_1080P_CLASSIC_5; } s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn); printf("SAMPLE_COMM_VENC_BindVpss is ok\n"); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Venc failed!\n"); goto END_VENC_1080P_CLASSIC_5; } /****************************************** step 6: stream venc process -- get stream, then save it to file. ******************************************/ s32Ret = SAMPLE_COMM_VENC_StartGetStream_Svc_t(s32ChnNum); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Venc failed!\n"); goto END_VENC_1080P_CLASSIC_5; } printf("please press ENTER to exit this sample\n"); getchar(); getchar(); /****************************************** step 7: exit process ******************************************/ SAMPLE_COMM_VENC_StopGetStream(); printf("SAMPLE_COMM_VENC_StopGetStream is ok\n"); END_VENC_1080P_CLASSIC_5: VpssGrp = 0; VpssChn = 0; VencChn = 0; SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn); SAMPLE_COMM_VENC_Stop(VencChn); SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode); END_VENC_1080P_CLASSIC_4: //vpss stop VpssGrp = 0; VpssChn = 0; SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); END_VENC_1080P_CLASSIC_3: //vpss stop SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode); END_VENC_1080P_CLASSIC_2: //vpss stop SAMPLE_COMM_VPSS_StopGroup(VpssGrp); END_VENC_1080P_CLASSIC_1: //vi stop SAMPLE_COMM_VI_StopVi(&stViConfig); END_VENC_1080P_CLASSIC_0: //system exit SAMPLE_COMM_SYS_Exit(); return s32Ret; } /****************************************************************************** * function : Thumbnail of 1*1080p jpeg ******************************************************************************/ HI_S32 SAMPLE_VENC_1080P_JPEG_Thumb(HI_VOID) { PIC_SIZE_E enSize = PIC_HD1080; ISP_DCF_INFO_S stIspDCF; VB_CONF_S stVbConf; SAMPLE_VI_CONFIG_S stViConfig = {0}; VPSS_GRP VpssGrp; VPSS_CHN VpssChn; VPSS_GRP_ATTR_S stVpssGrpAttr; VPSS_CHN_ATTR_S stVpssChnAttr; VPSS_CHN_MODE_S stVpssChnMode; VENC_CHN VencChn; HI_S32 s32Ret = HI_SUCCESS; HI_U32 u32BlkSize; SIZE_S stSize; HI_S32 i = 0; char ch; /****************************************** step 1: init sys variable ******************************************/ memset(&stVbConf,0,sizeof(VB_CONF_S)); stVbConf.u32MaxPoolCnt = 128; SAMPLE_COMM_VI_GetSizeBySensor(&enSize); /*video buffer*/ u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ enSize, SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; stVbConf.astCommPool[0].u32BlkCnt = g_u32BlkCnt; /****************************************** step 2: mpp system init. ******************************************/ s32Ret = SAMPLE_COMM_SYS_Init_With_DCF(&stVbConf); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("system init failed with %d!\n", s32Ret); goto END_VENC_MJPEG_JPEG_0; } /****************************************** step 3: start vi dev & chn to capture ******************************************/ stViConfig.enViMode = SENSOR_TYPE; stViConfig.enRotate = ROTATE_NONE; stViConfig.enNorm = VIDEO_ENCODING_MODE_AUTO; stViConfig.enViChnSet = VI_CHN_SET_NORMAL; s32Ret = SAMPLE_COMM_VI_StartVi(&stViConfig); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("start vi failed!\n"); goto END_VENC_MJPEG_JPEG_1; } /****************************************** 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_MJPEG_JPEG_1; } VpssGrp = 0; stVpssGrpAttr.u32MaxW = stSize.u32Width; stVpssGrpAttr.u32MaxH = stSize.u32Height; stVpssGrpAttr.bIeEn = HI_FALSE; stVpssGrpAttr.bNrEn = HI_TRUE; stVpssGrpAttr.bHistEn = HI_FALSE; stVpssGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE; stVpssGrpAttr.enPixFmt = PIXEL_FORMAT_YUV_SEMIPLANAR_420; stVpssGrpAttr.bDciEn = HI_FALSE; s32Ret = SAMPLE_COMM_VPSS_StartGroup(VpssGrp, &stVpssGrpAttr); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Vpss failed!\n"); goto END_VENC_MJPEG_JPEG_2; } s32Ret = SAMPLE_COMM_VI_BindVpss(stViConfig.enViMode); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Vi bind Vpss failed!\n"); goto END_VENC_MJPEG_JPEG_3; } VpssChn = 0; stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; stVpssChnMode.bDouble = HI_FALSE; stVpssChnMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; stVpssChnMode.u32Width = stSize.u32Width; stVpssChnMode.u32Height = stSize.u32Height; stVpssChnMode.enCompressMode = COMPRESS_MODE_NONE; memset(&stVpssChnAttr, 0, sizeof(stVpssChnAttr)); stVpssChnAttr.s32SrcFrameRate = -1; stVpssChnAttr.s32DstFrameRate = -1; s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Enable vpss chn failed!\n"); goto END_VENC_MJPEG_JPEG_4; } /****************************************** step 5: set CDF info ******************************************/ HI_MPI_ISP_GetDCFInfo(&stIspDCF); //description: Thumbnail test memcpy(stIspDCF.au8ImageDescription,"Thumbnail test",strlen("Thumbnail test")); //manufacturer: Hisilicon memcpy(stIspDCF.au8Make,"Hisilicon",strlen("Hisilicon")); //model number: Hisilicon IP Camera memcpy(stIspDCF.au8Model,"Hisilicon IP Camera",strlen("Hisilicon IP Camera")); //firmware version: v.1.1.0 memcpy(stIspDCF.au8Software,"v.1.1.0",strlen("v.1.1.0")); stIspDCF.u16ISOSpeedRatings = 500; stIspDCF.u32ExposureBiasValue = 5; stIspDCF.u32ExposureTime = 0x00010004; stIspDCF.u32FNumber = 0x0001000f; stIspDCF.u32FocalLength = 0x00640001; stIspDCF.u32MaxApertureValue = 0x00010001; stIspDCF.u8Contrast = 5; stIspDCF.u8CustomRendered = 0; stIspDCF.u8ExposureMode = 0; stIspDCF.u8ExposureProgram = 1; stIspDCF.u8FocalLengthIn35mmFilm = 1; stIspDCF.u8GainControl = 1; stIspDCF.u8LightSource = 1; stIspDCF.u8MeteringMode = 1; stIspDCF.u8Saturation = 1; stIspDCF.u8SceneCaptureType = 1; stIspDCF.u8SceneType = 0; stIspDCF.u8Sharpness = 5; stIspDCF.u8WhiteBalance = 1; HI_MPI_ISP_SetDCFInfo(&stIspDCF); /****************************************** step 6: start stream venc ******************************************/ VpssGrp = 0; VpssChn = 0; VencChn = 0; s32Ret = SAMPLE_COMM_VENC_SnapStart(VencChn, &stSize, HI_TRUE); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start snap failed!\n"); goto END_VENC_MJPEG_JPEG_5; } s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("Start Venc failed!\n"); goto END_VENC_MJPEG_JPEG_5; } /****************************************** step 7: stream venc process -- get stream, then save it to file. ******************************************/ printf("press 'q' to exit sample!\nperess ENTER to capture one picture to file\n"); i = 0; while ((ch = (char)getchar()) != 'q') { s32Ret = SAMPLE_COMM_VENC_SnapProcess(VencChn, HI_TRUE, HI_TRUE); if (HI_SUCCESS != s32Ret) { printf("%s: sanp process failed!\n", __FUNCTION__); break; } printf("snap %d success!\n", i); i++; } printf("please press ENTER to exit this sample\n"); getchar(); getchar(); /****************************************** step 8: exit process ******************************************/ SAMPLE_COMM_VENC_StopGetStream(); END_VENC_MJPEG_JPEG_5: VpssGrp = 0; VpssChn = 0; VencChn = 0; SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn); SAMPLE_COMM_VENC_Stop(VencChn); END_VENC_MJPEG_JPEG_4: //vpss stop VpssGrp = 0; VpssChn = 0; SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); END_VENC_MJPEG_JPEG_3: //vpss stop SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode); END_VENC_MJPEG_JPEG_2: //vpss stop SAMPLE_COMM_VPSS_StopGroup(VpssGrp); END_VENC_MJPEG_JPEG_1: //vi stop SAMPLE_COMM_VI_StopVi(&stViConfig); END_VENC_MJPEG_JPEG_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]))) //argc传参校验,参数个不能大于2个。参数2字符串长度不等于1 { SAMPLE_VENC_Usage(argv[0]); //提示程序使用方法 return HI_FAILURE; //return -1 } signal(SIGINT, SAMPLE_VENC_HandleSig); //SIGINT=2 , 属于中断信号,定义在/usr/include/i386-linux-gnu/bits/signal.h signal(SIGTERM, SAMPLE_VENC_HandleSig); //SIGTERM=15,属于结束信号,类似kill命令发送的OS默认终止信号 //SAMPLE_VENC_HandleSig这个函数主要是停止ISP和退出SYS switch (*argv[1]) { case '0':/* H.264@1080p@30fps+H.265@1080p@30fps+H.264@D1@30fps */ s32Ret = SAMPLE_VENC_1080P_CLASSIC(); //实现如上三路码流实时编码,帧率默认设置为30,实时编码都正常。 break; case '1':/* 1*1080p mjpeg encode + 1*1080p jpeg */ s32Ret = SAMPLE_VENC_1080P_MJPEG_JPEG(); //1×1080p MJPEG编码+ 1×1080p JPEG break; case '2':/* low delay */ s32Ret = SAMPLE_VENC_LOW_DELAY(); //低延时 break; case '3':/* roibg framerate */ s32Ret = SAMPLE_VENC_ROIBG_CLASSIC(); break; case '4':/* Thumbnail of 1*1080p jpeg */ s32Ret = SAMPLE_VENC_1080P_JPEG_Thumb(); //1×1080p JPEG缩略图 break; #ifndef hi3518ev201 case '5':/* H.264 Svc-t */ s32Ret = SAMPLE_VENC_SVC_H264(); break; #endif 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 */
总结:1.设置视频编码模式(N制或P制)
2.mian 套
SAMPLE_VENC_1080P_CLASSICSAMPLE_COMM_VI_GetSizeBySensor(step1)
SAMPLE_COMM_SYS_CalcPicVbBlkSize
SAMPLE_COMM_SYS_GetPicSize
SAMPLE_COMM_SYS_Init(step2)
HI_MPI_SYS_Exit();
HI_MPI_VB_Exit();
HI_MPI_VB_SetConf
HI_MPI_VB_Init
HI_MPI_SYS_SetConf
HI_MPI_SYS_Init
SAMPLE_COMM_VI_StartVi(step3)
IsSensorInput
SAMPLE_COMM_VI_StartIspAndVi
SAMPLE_COMM_VI_StartMIPI(1)
SAMPLE_COMM_VI_SetMipiAttr
fd = open("/dev/hi_mipi", O_RDWR);
ioctl(fd, HI_MIPI_SET_DEV_ATTR, pstcomboDevAttr)
SAMPLE_COMM_ISP_Init(2)
sensor_register_callback
HI_MPI_AE_Register
HI_MPI_AWB_Register
HI_MPI_AF_Register
HI_MPI_ISP_MemInit
HI_MPI_ISP_SetWDRMode
HI_MPI_ISP_SetPubAttr
HI_MPI_ISP_Init
SAMPLE_COMM_ISP_Run(3)
pthread_create(&gs_IspPid, &attr, (void* (*)(void*))Test_ISP_Run, NULL)
Test_ISP_Run
HI_MPI_ISP_Run
SAMPLE_COMM_VI_StartDev(4)
HI_MPI_VI_SetDevAttr
HI_MPI_ISP_GetWDRMode
HI_MPI_VI_SetWDRAttr
HI_MPI_VI_EnableDev
SAMPLE_COMM_VI_StartChn(5)
HI_MPI_VI_SetChnAttr
HI_MPI_VI_SetRotate
HI_MPI_VI_EnableChn
SAMPLE_COMM_SYS_GetPicSize(step4)----VPSS
SAMPLE_COMM_VPSS_StartGroup
SAMPLE_COMM_VI_BindVpss
SAMPLE_COMM_VPSS_EnableChn
SAMPLE_COMM_VENC_Start(step5)
-----
-----
-----
SAMPLE_COMM_VENC_BindVpss
SAMPLE_COMM_VENC_StartGetStream(step6)
SAMPLE_COMM_VENC_StopGetStream(step7)