终于到了编码模块。
VENC接受的输入源有四类:VI、VO、VDEC以及用户态,这里我们要用户态输入。VENC模块的内容很多,包括各种码控、ROI处理等,这边就不写了,太多了,直接分享一下怎么实现用户态编码。
这份代码是基于venc.c进行二次开发的,由于venc例程中包含了各种编码标准的实现,把后面的几个都删掉(代码少一半),留下一个来改就行。
之前我改了很久都没有调通,因为我之前的逻辑是,板子数据是从sensor到vi到vpss再到venc,如果我想从vpss截胡,直接给venc传数据的话,就得把前面和sensor等外部输入的代码给注释掉,不然会影响这里,结果是牵一发动全身。后来我琢磨着人家传他的,不管不就行了,我只管把我的数据给编码器,前面爱咋咋地。
从例程的函数开始,由于我是跑通了4k的例程,所以先以4k的文件编码为目标。
第一个函数是SAMPLE_VENC_SetDCFInfo,用于捕获拍摄时的一些数据,如焦距、相机型号、制造商等,不用管。
第二个函数是SAMPLE_VENC_CheckSensor,应该是检查镜头的分辨率支不支持要编的尺寸,这里我们先试的4k,所以也可以不管这个。
第三个函数是SAMPLE_VENC_VI_Init,这里面需要注意的是SAMPLE_VENC_SYS_Init,SYS_Init里面有一个COMMON_GetPicBufferSize的函数,用来根据size分配buffer,同样我们先试的4k,所以也可以不管这个。
第四个函数是SAMPLE_VENC_VPSS_Init,这个也是一些初始化的东西,看了下不会影响就也没有管。
第五个函数是SAMPLE_COMM_VI_Bind_VPSS,这里我们对其解绑,不让vpss的数据给到venc,解绑代码手册是写好了的,在sample_common_sys.c中:
HI_S32 SAMPLE_COMM_VI_UnBind_VPSS(VI_PIPE ViPipe, VI_CHN ViChn, VPSS_GRP VpssGrp)
{
MPP_CHN_S stSrcChn;
MPP_CHN_S stDestChn;
stSrcChn.enModId = HI_ID_VI;
stSrcChn.s32DevId = ViPipe;
stSrcChn.s32ChnId = ViChn;
stDestChn.enModId = HI_ID_VPSS;
stDestChn.s32DevId = VpssGrp;
stDestChn.s32ChnId = 0;
CHECK_RET(HI_MPI_SYS_UnBind(&stSrcChn, &stDestChn), "HI_MPI_SYS_UnBind(VI-VPSS)");
return HI_SUCCESS;
}
直接把bind注释掉好像也可以,我没有尝试,此时再运行时会报错get venc stream time out。
接下来就是编码部分,首先SAMPLE_COMM_VENC_Start来创建编码通道等,接着原代码在这下面通过SAMPLE_COMM_VPSS_Bind_VENC绑定通道喂数据,把这部分注释掉,新加一个函数,通过这个函数把自己的代码输进去。读取YUV部分的代码参考的下面这篇文章:【Hi3559A 使用HI_MPI_VENC_SendFrame送yuv的例子】_venc_chnvencchns[2] = {0,1}-CSDN博客文章浏览阅读1k次,点赞2次,收藏6次。Hi3559A 使用HI_MPI_VENC_SendFrame送yuv的例子说明:参考mpp中sample_venc.c添加如下代码,自行调用即可。代码是向venc灌入同一帧yuv数据,仅供参考。HI_VOID* SAMPLE_SendVencOneFrameProc(HI_VOID* p){ VENC_CHN VencChn = 0; HI_S32 s32Ret = HI_SUCCESS;HI_U64 u32Cnt = 0; HI_U32 u32Profile = _venc_chnvencchns[2] = {0,1}https://blog.csdn.net/m0_37823030/article/details/124344999?spm=1001.2014.3001.5502 若要改为8k,SAMPLE_VENC_CheckSensor这个函数直接注释了,文件编码不需要check,然后COMMON_GetPicBufferSize要注意尺寸,我这边直接手写了8k的宽高。因为我是改完了才记录的,所以其他哪里有没有改记不清楚了,我把所有代码附上:
/******************************************************************************
Copyright (C), 2017, Hisilicon Tech. Co., Ltd.
******************************************************************************
File Name : sample_venc.c
Version : Initial Draft
Author : Hisilicon multimedia software group
Created : 2017
Description :
******************************************************************************/
#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"
//#define SUPPORT_PRORES
/******************************************************************************
* function : show usage
******************************************************************************/
void SAMPLE_VENC_Usage(char* sPrgNm)
{
printf("Usage : %s [index] \n", sPrgNm);
printf("index:\n");
printf("\t 0) file-encoding 4k@1frame.\n");
printf("\t 1) file-encoding 8k@1frame.\n");
return;
}
/******************************************************************************
* function : to process abnormal case
******************************************************************************/
void SAMPLE_VENC_HandleSig(HI_S32 signo)
{
if (SIGINT == signo || SIGTERM == signo)
{
SAMPLE_COMM_VENC_StopGetStream();
SAMPLE_COMM_VENC_StopSendQpmapFrame();
SAMPLE_COMM_All_ISP_Stop();
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 || SIGTERM == signo)
{
SAMPLE_COMM_SYS_Exit();
printf("\033[0;31mprogram exit abnormally!\033[0;39m\n");
}
exit(0);
}
VENC_GOP_MODE_E SAMPLE_VENC_GetGopMode(void)
{
char c;
VENC_GOP_MODE_E enGopMode = 0;
Begin_Get:
printf("please input choose gop mode!\n");
printf("\t 0) NORMALP.\n");
printf("\t 1) DUALP.\n");
printf("\t 2) SMARTP.\n");
printf("\t 3) ADVSMARTP\n");
printf("\t 4) BIPREDB\n");
while((c = getchar()) != '\n' && c != EOF)
switch(c)
{
case '0':
enGopMode = VENC_GOPMODE_NORMALP;
break;
case '1':
enGopMode = VENC_GOPMODE_DUALP;
break;
case '2':
enGopMode = VENC_GOPMODE_SMARTP;
break;
case '3':
enGopMode = VENC_GOPMODE_ADVSMARTP;
break;
case '4':
enGopMode = VENC_GOPMODE_BIPREDB;
break;
default:
SAMPLE_PRT("input rcmode: %c, is invaild!\n",c);
goto Begin_Get;
}
return enGopMode;
}
SAMPLE_RC_E SAMPLE_VENC_GetRcMode(void)
{
char c;
SAMPLE_RC_E enRcMode = 0;
Begin_Get:
printf("please input choose rc mode!\n");
printf("\t c) cbr.\n");
printf("\t v) vbr.\n");
printf("\t a) avbr.\n");
printf("\t f) fixQp\n");
while((c = getchar()) != '\n' && c != EOF)
switch(c)
{
case 'c':
enRcMode = SAMPLE_RC_CBR;
break;
case 'v':
enRcMode = SAMPLE_RC_VBR;
break;
case 'a':
enRcMode = SAMPLE_RC_AVBR;
break;
case 'f':
enRcMode = SAMPLE_RC_FIXQP;
break;
default:
SAMPLE_PRT("input rcmode: %c, is invaild!\n",c);
goto Begin_Get;
}
return enRcMode;
}
HI_S32 SAMPLE_VENC_SYS_Init(HI_U32 u32SupplementConfig,SAMPLE_SNS_TYPE_E enSnsType, HI_S32 reso_w)
{
HI_S32 s32Ret;
HI_U64 u64BlkSize;
VB_CONFIG_S stVbConf;
PIC_SIZE_E enSnsSize;
SIZE_S stSnsSize;
memset(&stVbConf, 0, sizeof(VB_CONFIG_S));
s32Ret = SAMPLE_COMM_VI_GetSizeBySensor(enSnsType, &enSnsSize);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_VI_GetSizeBySensor failed!\n");
return s32Ret;
}
s32Ret = SAMPLE_COMM_SYS_GetPicSize(enSnsSize, &stSnsSize);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n");
return s32Ret;
}
if(3840 == reso_w)
{
u64BlkSize = COMMON_GetPicBufferSize(3840, 2160, PIXEL_FORMAT_YVU_SEMIPLANAR_420, DATA_BITWIDTH_8, COMPRESS_MODE_NONE,DEFAULT_ALIGN);
stVbConf.astCommPool[0].u64BlkSize = u64BlkSize;
stVbConf.astCommPool[0].u32BlkCnt = 15;
}
else if(7680 == reso_w)
{
u64BlkSize = COMMON_GetPicBufferSize(7680, 4320, PIXEL_FORMAT_YVU_SEMIPLANAR_420, DATA_BITWIDTH_8, COMPRESS_MODE_NONE,DEFAULT_ALIGN);
stVbConf.astCommPool[0].u64BlkSize = u64BlkSize;
stVbConf.astCommPool[0].u32BlkCnt = 15;
}
else{
SAMPLE_PRT("Sorry, only support 4k and 8k now \n");
}
u64BlkSize = COMMON_GetPicBufferSize(1920, 1080, PIXEL_FORMAT_YVU_SEMIPLANAR_422, DATA_BITWIDTH_10, COMPRESS_MODE_NONE,DEFAULT_ALIGN);
stVbConf.astCommPool[1].u64BlkSize = u64BlkSize;
stVbConf.astCommPool[1].u32BlkCnt = 15;
SAMPLE_PRT("Pool1 PicBufferSize: stSnsSize.u32Width:%d stSnsSize.u32Height:%d\n",stSnsSize.u32Width, stSnsSize.u32Height);
stVbConf.u32MaxPoolCnt = 2;
if(0 == u32SupplementConfig)
{
s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf);
}
else
{
s32Ret = SAMPLE_COMM_SYS_InitWithVbSupplement(&stVbConf,u32SupplementConfig);
}
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n");
return s32Ret;
}
return HI_SUCCESS;
}
HI_VOID SAMPLE_VENC_SetDCFInfo(VI_PIPE ViPipe)
{
ISP_DCF_INFO_S stIspDCF;
HI_MPI_ISP_GetDCFInfo(ViPipe, &stIspDCF);
//description: Thumbnail test
strncpy((char *)stIspDCF.stIspDCFConstInfo.au8ImageDescription,"Thumbnail test",DCF_DRSCRIPTION_LENGTH);
//manufacturer: Hisilicon
strncpy((char *)stIspDCF.stIspDCFConstInfo.au8Make,"Hisilicon",DCF_DRSCRIPTION_LENGTH);
//model number: Hisilicon IP Camera
strncpy((char *)stIspDCF.stIspDCFConstInfo.au8Model,"Hisilicon IP Camera",DCF_DRSCRIPTION_LENGTH);
//firmware version: v.1.1.0
strncpy((char *)stIspDCF.stIspDCFConstInfo.au8Software,"v.1.1.0",DCF_DRSCRIPTION_LENGTH);
stIspDCF.stIspDCFConstInfo.u32FocalLength = 0x00640001;
stIspDCF.stIspDCFConstInfo.u8Contrast = 5;
stIspDCF.stIspDCFConstInfo.u8CustomRendered = 0;
stIspDCF.stIspDCFConstInfo.u8FocalLengthIn35mmFilm = 1;
stIspDCF.stIspDCFConstInfo.u8GainControl = 1;
stIspDCF.stIspDCFConstInfo.u8LightSource = 1;
stIspDCF.stIspDCFConstInfo.u8MeteringMode = 1;
stIspDCF.stIspDCFConstInfo.u8Saturation = 1;
stIspDCF.stIspDCFConstInfo.u8SceneCaptureType = 1;
stIspDCF.stIspDCFConstInfo.u8SceneType = 0;
stIspDCF.stIspDCFConstInfo.u8Sharpness = 5;
stIspDCF.stIspDCFUpdateInfo.u32ISOSpeedRatings = 500;
stIspDCF.stIspDCFUpdateInfo.u32ExposureBiasValue = 5;
stIspDCF.stIspDCFUpdateInfo.u32ExposureTime = 0x00010004;
stIspDCF.stIspDCFUpdateInfo.u32FNumber = 0x0001000f;
stIspDCF.stIspDCFUpdateInfo.u8WhiteBalance = 1;
stIspDCF.stIspDCFUpdateInfo.u8ExposureMode = 0;
stIspDCF.stIspDCFUpdateInfo.u8ExposureProgram = 1;
stIspDCF.stIspDCFUpdateInfo.u32MaxApertureValue = 0x00010001;
HI_MPI_ISP_SetDCFInfo(ViPipe, &stIspDCF);
return;
}
HI_S32 SAMPLE_VENC_VI_Init( SAMPLE_VI_CONFIG_S *pstViConfig, HI_BOOL bLowDelay, HI_U32 u32SupplementConfig, HI_S32 reso_w)
{
HI_S32 s32Ret;
SAMPLE_SNS_TYPE_E enSnsType;
ISP_CTRL_PARAM_S stIspCtrlParam;
HI_U32 u32FrameRate;
enSnsType = pstViConfig->astViInfo[0].stSnsInfo.enSnsType;
pstViConfig->as32WorkingViId[0] = 0;
//pstViConfig->s32WorkingViNum = 1;
pstViConfig->astViInfo[0].stSnsInfo.MipiDev = SAMPLE_COMM_VI_GetComboDevBySensor(pstViConfig->astViInfo[0].stSnsInfo.enSnsType, 0);
pstViConfig->astViInfo[0].stSnsInfo.s32BusId = 0;
//pstViConfig->astViInfo[0].stDevInfo.ViDev = ViDev0;
pstViConfig->astViInfo[0].stDevInfo.enWDRMode = WDR_MODE_NONE;
if(HI_TRUE == bLowDelay)
{
pstViConfig->astViInfo[0].stPipeInfo.enMastPipeMode = VI_ONLINE_VPSS_ONLINE;
if(SONY_IMX277_SLVS_8M_120FPS_10BIT == enSnsType)
{
pstViConfig->astViInfo[0].stPipeInfo.enMastPipeMode = VI_PARALLEL_VPSS_PARALLEL;
}
}
else
{
pstViConfig->astViInfo[0].stPipeInfo.enMastPipeMode = VI_OFFLINE_VPSS_OFFLINE;
if(SONY_IMX277_SLVS_8M_120FPS_10BIT == enSnsType)
{
pstViConfig->astViInfo[0].stPipeInfo.enMastPipeMode = VI_PARALLEL_VPSS_OFFLINE;
}
}
//if(8k == enSnsType)
//{
// pstViConfig->astViInfo[0].stPipeInfo.enMastPipeMode = VI_PARALLEL_VPSS_OFFLINE;
//}
//pstViConfig->astViInfo[0].stPipeInfo.aPipe[0] = ViPipe0;
pstViConfig->astViInfo[0].stPipeInfo.aPipe[1] = -1;
pstViConfig->astViInfo[0].stPipeInfo.aPipe[2] = -1;
pstViConfig->astViInfo[0].stPipeInfo.aPipe[3] = -1;
//pstViConfig->astViInfo[0].stChnInfo.ViChn = ViChn;
//pstViConfig->astViInfo[0].stChnInfo.enPixFormat = PIXEL_FORMAT_YVU_SEMIPLANAR_420;
//pstViConfig->astViInfo[0].stChnInfo.enDynamicRange = enDynamicRange;
pstViConfig->astViInfo[0].stChnInfo.enVideoFormat = VIDEO_FORMAT_LINEAR;
pstViConfig->astViInfo[0].stChnInfo.enCompressMode = COMPRESS_MODE_SEG;//COMPRESS_MODE_SEG;
s32Ret = SAMPLE_VENC_SYS_Init(u32SupplementConfig,enSnsType,reso_w);
if(s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("Init SYS err for %#x!\n", s32Ret);
return s32Ret;
}
SAMPLE_COMM_VI_GetFrameRateBySensor(enSnsType, &u32FrameRate);
s32Ret = HI_MPI_ISP_GetCtrlParam(pstViConfig->astViInfo[0].stPipeInfo.aPipe[0], &stIspCtrlParam);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("HI_MPI_ISP_GetCtrlParam failed with %d!\n", s32Ret);
return s32Ret;
}
stIspCtrlParam.u32StatIntvl = u32FrameRate/30;
s32Ret = HI_MPI_ISP_SetCtrlParam(pstViConfig->astViInfo[0].stPipeInfo.aPipe[0], &stIspCtrlParam);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("HI_MPI_ISP_SetCtrlParam failed with %d!\n", s32Ret);
return s32Ret;
}
s32Ret = SAMPLE_COMM_VI_StartVi(pstViConfig);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_COMM_SYS_Exit();
SAMPLE_PRT("SAMPLE_COMM_VI_StartVi failed with %d!\n", s32Ret);
return s32Ret;
}
return HI_SUCCESS;
}
HI_S32 SAMPLE_VENC_VPSS_Init(VPSS_GRP VpssGrp, HI_BOOL* pabChnEnable, DYNAMIC_RANGE_E enDynamicRange,PIXEL_FORMAT_E enPixelFormat,SIZE_S stSize[],SAMPLE_SNS_TYPE_E enSnsType)
{
HI_S32 i;
HI_S32 s32Ret;
PIC_SIZE_E enSnsSize;
SIZE_S stSnsSize;
VPSS_GRP_ATTR_S stVpssGrpAttr;
VPSS_CHN_ATTR_S stVpssChnAttr[VPSS_MAX_PHY_CHN_NUM];
s32Ret = SAMPLE_COMM_VI_GetSizeBySensor(enSnsType, &enSnsSize);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_VI_GetSizeBySensor failed!\n");
return s32Ret;
}
s32Ret = SAMPLE_COMM_SYS_GetPicSize(enSnsSize, &stSnsSize);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n");
return s32Ret;
}
stVpssGrpAttr.enDynamicRange = enDynamicRange;
stVpssGrpAttr.enPixelFormat = enPixelFormat;
stVpssGrpAttr.u32MaxW = stSnsSize.u32Width;
stVpssGrpAttr.u32MaxH = stSnsSize.u32Height;
stVpssGrpAttr.stFrameRate.s32SrcFrameRate = -1;
stVpssGrpAttr.stFrameRate.s32DstFrameRate = -1;
for(i=0; i<VPSS_MAX_PHY_CHN_NUM; i++)
{
if(HI_TRUE == pabChnEnable[i])
{
stVpssChnAttr[i].u32Width = stSize[i].u32Width;
stVpssChnAttr[i].u32Height = stSize[i].u32Height;
stVpssChnAttr[i].enChnMode = VPSS_CHN_MODE_USER;
stVpssChnAttr[i].enCompressMode = COMPRESS_MODE_NONE;//COMPRESS_MODE_SEG;
stVpssChnAttr[i].enDynamicRange = enDynamicRange;
stVpssChnAttr[i].enPixelFormat = enPixelFormat;
stVpssChnAttr[i].stFrameRate.s32SrcFrameRate = -1;
stVpssChnAttr[i].stFrameRate.s32DstFrameRate = -1;
stVpssChnAttr[i].u32Depth = 0;
stVpssChnAttr[i].bMirror = HI_FALSE;
stVpssChnAttr[i].bFlip = HI_FALSE;
stVpssChnAttr[i].enVideoFormat = VIDEO_FORMAT_LINEAR;
stVpssChnAttr[i].stAspectRatio.enMode = ASPECT_RATIO_NONE;
}
}
s32Ret = SAMPLE_COMM_VPSS_Start(VpssGrp, pabChnEnable,&stVpssGrpAttr,stVpssChnAttr);
if(s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("start VPSS fail for %#x!\n", s32Ret);
}
return s32Ret;
}
HI_S32 SAMPLE_VENC_CheckSensor(SAMPLE_SNS_TYPE_E enSnsType,SIZE_S stSize)
{
HI_S32 s32Ret;
SIZE_S stSnsSize;
PIC_SIZE_E enSnsSize;
s32Ret = SAMPLE_COMM_VI_GetSizeBySensor(enSnsType, &enSnsSize);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_VI_GetSizeBySensor failed!\n");
return s32Ret;
}
s32Ret = SAMPLE_COMM_SYS_GetPicSize(enSnsSize, &stSnsSize);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n");
return s32Ret;
}
if((stSnsSize.u32Width < stSize.u32Width) || (stSnsSize.u32Height < stSize.u32Height))
{
SAMPLE_PRT("Sensor size is (%d,%d), but encode chnl is (%d,%d) !\n",
stSnsSize.u32Width,stSnsSize.u32Height,stSize.u32Width,stSize.u32Height);
return HI_FAILURE;
}
return HI_SUCCESS;
}
HI_VOID* SAMPLE_SendVencOneFrameProc_4k()
{
VENC_CHN VencChn = 0;
HI_S32 s32Ret = HI_SUCCESS;
HI_U64 u32Cnt = 0;
HI_U32 u32Profile = 0;
HI_U32 u32PhyAddr;
HI_U8 *pVirAddr=NULL;
HI_S32 milli_sec = 20000;
HI_U32 u32YSize = 3840*2160;
HI_U32 u32UVSize = 3840*2160/2;
HI_U32 u32YUVSize = 3840*2160*3/2;
VB_POOL poolID;
HI_U64 u64PhyAddrYuv;
HI_VOID *ppVirAddrYuv;
HI_U64 phyYaddr;
HI_U64* virYaddr;
FILE *fb = HI_NULL;
HI_BOOL isOneFrame = HI_FALSE;
VIDEO_FRAME_INFO_S stFrmInfo;
HI_U64 pu64CurPTS;
if (fb != HI_NULL)
{
fclose(fb);
fb = HI_NULL;
}
fb = fopen("./4k.yuv", "rb" );
if (fb == HI_NULL)
{
SAMPLE_PRT("Open yuv file failed!Check if the file %s exit\n","./4k.yuv");
return;
}
s32Ret = HI_MPI_SYS_MmzAlloc(&u64PhyAddrYuv, (HI_VOID**)&ppVirAddrYuv,"YUV420SP_3840_2160_FRAME_MEM", NULL, u32YUVSize);
if(HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("HI_MPI_SYS_MmzAlloc err:0x%x",s32Ret);
HI_MPI_SYS_MmzFree(u64PhyAddrYuv, ppVirAddrYuv);
return;
}
fread(ppVirAddrYuv, u32YUVSize, 1, fb);
SAMPLE_PRT("---->>>u64BlkSize=%d\n",u32YUVSize);
// SAMPLE_PRT("check value of ppVirAddrYuv: ");
// for (int i = 10; i < 15; ++i) {
// SAMPLE_PRT("%02X ", ((HI_U8*)ppVirAddrYuv)[i]);
// }
// SAMPLE_PRT("\n");
// while(HI_TRUE)
// {
// create venc buffer
VB_BLK handleY = HI_MPI_VB_GetBlock(VB_INVALID_POOLID, u32YUVSize, NULL);
if( handleY == VB_INVALID_HANDLE)
{
usleep(10);
printf("HI_MPI_VB_GetBlock for Block failed\n");
// continue;
}
poolID = HI_MPI_VB_Handle2PoolId(handleY);
//printf("pool id %d\n", poolID);
phyYaddr = HI_MPI_VB_Handle2PhysAddr(handleY);
if( phyYaddr == 0)
{
printf("HI_MPI_VB_Handle2PhysAddr for handleY failed\n");
// continue;
}
virYaddr = (HI_U64*) HI_MPI_SYS_Mmap(phyYaddr, u32YUVSize);
if(!isOneFrame)
{
memset(&stFrmInfo.stVFrame, 0, sizeof(VIDEO_FRAME_S));
stFrmInfo.enModId = HI_ID_VENC;
stFrmInfo.u32PoolId = poolID;
stFrmInfo.stVFrame.u64PhyAddr[0] = phyYaddr;
stFrmInfo.stVFrame.u64PhyAddr[1] = stFrmInfo.stVFrame.u64PhyAddr[0] + u32YSize;
stFrmInfo.stVFrame.u64PhyAddr[2] = stFrmInfo.stVFrame.u64PhyAddr[1] + u32YSize;
stFrmInfo.stVFrame.u64VirAddr[0] = (HI_U64 *)virYaddr;
stFrmInfo.stVFrame.u64VirAddr[1] = (HI_U64 *)stFrmInfo.stVFrame.u64VirAddr[0] + u32YSize;
stFrmInfo.stVFrame.u64VirAddr[2] = (HI_U8 *) stFrmInfo.stVFrame.u64VirAddr[1] + u32YSize;
stFrmInfo.stVFrame.u32Width = 3840;
stFrmInfo.stVFrame.u32Height = 2160;
stFrmInfo.stVFrame.u32Stride[0] = 3840;
stFrmInfo.stVFrame.u32Stride[1] = 3840;
stFrmInfo.stVFrame.u32Stride[2] = 3840;
HI_MPI_SYS_GetCurPTS(&pu64CurPTS);
stFrmInfo.stVFrame.u64PTS = pu64CurPTS;
stFrmInfo.stVFrame.u32TimeRef = (u32Cnt * 2);//timeref need n*2 but you can't get the second frame
stFrmInfo.stVFrame.enPixelFormat = PIXEL_FORMAT_YVU_SEMIPLANAR_420;
stFrmInfo.stVFrame.enField = VIDEO_FIELD_FRAME;
stFrmInfo.stVFrame.enCompressMode = COMPRESS_MODE_NONE;
stFrmInfo.stVFrame.enVideoFormat = VIDEO_FORMAT_LINEAR;
stFrmInfo.stVFrame.enDynamicRange = DYNAMIC_RANGE_SDR8;
//memcpy 4k about cost 95ms
memcpy(stFrmInfo.stVFrame.u64VirAddr[0], ppVirAddrYuv, u32YUVSize);
isOneFrame = HI_TRUE;
}
else
{
HI_MPI_SYS_GetCurPTS(&pu64CurPTS);
stFrmInfo.u32PoolId = poolID;
stFrmInfo.stVFrame.u64PTS = pu64CurPTS;
stFrmInfo.stVFrame.u32TimeRef = (u32Cnt * 2);//timeref need n*2 but you can't get the second frame
}
s32Ret = HI_MPI_VENC_SendFrame(VencChn, &stFrmInfo, milli_sec);
HI_MPI_SYS_Munmap(virYaddr, u32YUVSize);
HI_MPI_VB_ReleaseBlock(handleY);
u32Cnt ++;
// }
//before destroy private pool,must stop venc
HI_MPI_VB_DestroyPool(poolID);
HI_MPI_SYS_MmzFree(u64PhyAddrYuv, ppVirAddrYuv);
//close YUV File
fclose(fb);
fb=HI_NULL;
}
HI_VOID* SAMPLE_SendVencOneFrameProc_8k()
{
VENC_CHN VencChn = 0;
HI_S32 s32Ret = HI_SUCCESS;
HI_U64 u32Cnt = 0;
HI_U32 u32Profile = 0;
HI_U32 u32PhyAddr;
HI_U8 *pVirAddr=NULL;
HI_S32 milli_sec = 20000;
HI_U32 u32YSize = 7680*4320;
HI_U32 u32UVSize = 7680*4320/2;
HI_U32 u32YUVSize = 7680*4320*3/2;
VB_POOL poolID;
HI_U64 u64PhyAddrYuv;
HI_VOID *ppVirAddrYuv;
HI_U64 phyYaddr;
HI_U64* virYaddr;
FILE *fb = HI_NULL;
HI_BOOL isOneFrame = HI_FALSE;
VIDEO_FRAME_INFO_S stFrmInfo;
HI_U64 pu64CurPTS;
if (fb != HI_NULL)
{
fclose(fb);
fb = HI_NULL;
}
fb = fopen("./8k.yuv", "rb" );
if (fb == HI_NULL)
{
SAMPLE_PRT("Open yuv file failed!Check if the file %s exit\n","./4k.yuv");
return;
}
s32Ret = HI_MPI_SYS_MmzAlloc(&u64PhyAddrYuv, (HI_VOID**)&ppVirAddrYuv,"YUV420SP_7680_4320_FRAME_MEM", NULL, u32YUVSize);
if(HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("HI_MPI_SYS_MmzAlloc err:0x%x",s32Ret);
HI_MPI_SYS_MmzFree(u64PhyAddrYuv, ppVirAddrYuv);
return;
}
fread(ppVirAddrYuv, u32YUVSize, 1, fb);
SAMPLE_PRT("---->>>u64BlkSize=%d\n",u32YUVSize);
// SAMPLE_PRT("check value of ppVirAddrYuv: ");
// for (int i = 10; i < 15; ++i) {
// SAMPLE_PRT("%02X ", ((HI_U8*)ppVirAddrYuv)[i]);
// }
// SAMPLE_PRT("\n");
// while(HI_TRUE)
// {
// create venc buffer
VB_BLK handleY = HI_MPI_VB_GetBlock(VB_INVALID_POOLID, u32YUVSize, NULL);
if( handleY == VB_INVALID_HANDLE)
{
usleep(10);
printf("HI_MPI_VB_GetBlock for Block failed\n");
// continue;
}
poolID = HI_MPI_VB_Handle2PoolId(handleY);
//printf("pool id %d\n", poolID);
phyYaddr = HI_MPI_VB_Handle2PhysAddr(handleY);
if( phyYaddr == 0)
{
printf("HI_MPI_VB_Handle2PhysAddr for handleY failed\n");
// continue;
}
virYaddr = (HI_U64*) HI_MPI_SYS_Mmap(phyYaddr, u32YUVSize);
if(!isOneFrame)
{
memset(&stFrmInfo.stVFrame, 0, sizeof(VIDEO_FRAME_S));
stFrmInfo.enModId = HI_ID_VENC;
stFrmInfo.u32PoolId = poolID;
stFrmInfo.stVFrame.u64PhyAddr[0] = phyYaddr;
stFrmInfo.stVFrame.u64PhyAddr[1] = stFrmInfo.stVFrame.u64PhyAddr[0] + u32YSize;
stFrmInfo.stVFrame.u64PhyAddr[2] = stFrmInfo.stVFrame.u64PhyAddr[1] + u32YSize;
stFrmInfo.stVFrame.u64VirAddr[0] = (HI_U64 *)virYaddr;
stFrmInfo.stVFrame.u64VirAddr[1] = (HI_U64 *)stFrmInfo.stVFrame.u64VirAddr[0] + u32YSize;
stFrmInfo.stVFrame.u64VirAddr[2] = (HI_U8 *) stFrmInfo.stVFrame.u64VirAddr[1] + u32YSize;
stFrmInfo.stVFrame.u32Width = 7680;
stFrmInfo.stVFrame.u32Height = 4320;
stFrmInfo.stVFrame.u32Stride[0] = 7680;
stFrmInfo.stVFrame.u32Stride[1] = 7680;
stFrmInfo.stVFrame.u32Stride[2] = 7680;
HI_MPI_SYS_GetCurPTS(&pu64CurPTS);
stFrmInfo.stVFrame.u64PTS = pu64CurPTS;
stFrmInfo.stVFrame.u32TimeRef = (u32Cnt * 2);//timeref need n*2 but you can't get the second frame
stFrmInfo.stVFrame.enPixelFormat = PIXEL_FORMAT_YVU_SEMIPLANAR_420;
stFrmInfo.stVFrame.enField = VIDEO_FIELD_FRAME;
stFrmInfo.stVFrame.enCompressMode = COMPRESS_MODE_NONE;
stFrmInfo.stVFrame.enVideoFormat = VIDEO_FORMAT_LINEAR;
stFrmInfo.stVFrame.enDynamicRange = DYNAMIC_RANGE_SDR8;
//memcpy 4k about cost 95ms
memcpy(stFrmInfo.stVFrame.u64VirAddr[0], ppVirAddrYuv, u32YUVSize);
isOneFrame = HI_TRUE;
}
else
{
HI_MPI_SYS_GetCurPTS(&pu64CurPTS);
stFrmInfo.u32PoolId = poolID;
stFrmInfo.stVFrame.u64PTS = pu64CurPTS;
stFrmInfo.stVFrame.u32TimeRef = (u32Cnt * 2);//timeref need n*2 but you can't get the second frame
}
s32Ret = HI_MPI_VENC_SendFrame(VencChn, &stFrmInfo, milli_sec);
HI_MPI_SYS_Munmap(virYaddr, u32YUVSize);
HI_MPI_VB_ReleaseBlock(handleY);
u32Cnt ++;
// }
//before destroy private pool,must stop venc
HI_MPI_VB_DestroyPool(poolID);
HI_MPI_SYS_MmzFree(u64PhyAddrYuv, ppVirAddrYuv);
//close YUV File
fclose(fb);
fb=HI_NULL;
}
/******************************************************************************
* function : H.265e@4K@120fps + H264e@1080p@30fps
******************************************************************************/
HI_S32 SAMPLE_VENC_4K(void)
{
HI_S32 i;
HI_S32 reso_w = 3840;
HI_S32 s32Ret;
SIZE_S stSize[2];
PIC_SIZE_E enSize[2] = {PIC_3840x2160, PIC_1080P};
HI_S32 s32ChnNum = 1;
VENC_CHN VencChn[2] = {0,1};
HI_U32 u32Profile[2] = {0,1};
PAYLOAD_TYPE_E enPayLoad[2] = {PT_H265, PT_H264};
VENC_GOP_MODE_E enGopMode;
VENC_GOP_ATTR_S stGopAttr;
SAMPLE_RC_E enRcMode;
VI_DEV ViDev = 0;
VI_PIPE ViPipe = 0;
VI_CHN ViChn = 0;
SAMPLE_VI_CONFIG_S stViConfig;
VPSS_GRP VpssGrp = 0;
VPSS_CHN VpssChn[2] = {0,1};
HI_BOOL abChnEnable[4] = {1,0,0,0};
HI_U32 u32SupplementConfig = HI_FALSE;
for(i=0; i<s32ChnNum; i++)
{
s32Ret = SAMPLE_COMM_SYS_GetPicSize(enSize[i], &stSize[i]);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n");
return s32Ret;
}
}
SAMPLE_COMM_VI_GetSensorInfo(&stViConfig);
if(SAMPLE_SNS_TYPE_BUTT == stViConfig.astViInfo[0].stSnsInfo.enSnsType)
{
SAMPLE_PRT("Not set SENSOR%d_TYPE !\n",0);
return HI_FAILURE;
}
s32Ret = SAMPLE_VENC_CheckSensor(stViConfig.astViInfo[0].stSnsInfo.enSnsType,stSize[0]);
if(s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("Check Sensor err!\n");
return HI_FAILURE;
}
stViConfig.s32WorkingViNum = 1;
stViConfig.astViInfo[0].stDevInfo.ViDev = ViDev;
stViConfig.astViInfo[0].stPipeInfo.aPipe[0] = ViPipe;
stViConfig.astViInfo[0].stChnInfo.ViChn = ViChn;
stViConfig.astViInfo[0].stChnInfo.enDynamicRange = DYNAMIC_RANGE_SDR8;
stViConfig.astViInfo[0].stChnInfo.enPixFormat = PIXEL_FORMAT_YVU_SEMIPLANAR_420;
s32Ret = SAMPLE_VENC_VI_Init(&stViConfig, HI_FALSE,u32SupplementConfig, reso_w);
if(s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("Init VI err for %#x!\n", s32Ret);
return HI_FAILURE;
}
s32Ret = SAMPLE_VENC_VPSS_Init(VpssGrp,abChnEnable,DYNAMIC_RANGE_SDR8,PIXEL_FORMAT_YVU_SEMIPLANAR_420,stSize,stViConfig.astViInfo[0].stSnsInfo.enSnsType);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Init VPSS err for %#x!\n", s32Ret);
goto EXIT_VI_STOP;
}
s32Ret = SAMPLE_COMM_VI_Bind_VPSS(ViPipe, ViChn, VpssGrp);
if(s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("VI Bind VPSS err for %#x!\n", s32Ret);
goto EXIT_VPSS_STOP;
}
s32Ret = SAMPLE_COMM_VI_UnBind_VPSS(ViPipe, ViChn, VpssGrp);
if(s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("VI UnBind VPSS err for %#x!\n", s32Ret);
goto EXIT_VPSS_STOP;
}
/******************************************
start stream venc
******************************************/
enRcMode = SAMPLE_VENC_GetRcMode();
enGopMode = SAMPLE_VENC_GetGopMode();
s32Ret = SAMPLE_COMM_VENC_GetGopAttr(enGopMode,&stGopAttr);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Venc Get GopAttr for %#x!\n", s32Ret);
goto EXIT_VI_VPSS_UNBIND;
}
/***encode h.265 **/
s32Ret = SAMPLE_COMM_VENC_Start(VencChn[0], enPayLoad[0],enSize[0], enRcMode,u32Profile[0],&stGopAttr);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Venc Start failed for %#x!\n", s32Ret);
goto EXIT_VI_VPSS_UNBIND;
}
s32Ret = SAMPLE_SendVencOneFrameProc_4k();
// s32Ret = SAMPLE_COMM_VPSS_Bind_VENC(VpssGrp, VpssChn[0],VencChn[0]);
// if (HI_SUCCESS != s32Ret)
// {
// SAMPLE_PRT("Venc Get GopAttr failed for %#x!\n", s32Ret);
// goto EXIT_VENC_H265_STOP;
// }
// /***encode h.264 **/
// s32Ret = SAMPLE_COMM_VENC_Start(VencChn[1], enPayLoad[1], enSize[1], enRcMode,u32Profile[1],&stGopAttr);
// if (HI_SUCCESS != s32Ret)
// {
// SAMPLE_PRT("Venc Start failed for %#x!\n", s32Ret);
// goto EXIT_VENC_H265_UnBind;
// }
// s32Ret = SAMPLE_COMM_VPSS_Bind_VENC(VpssGrp, VpssChn[1],VencChn[1]);
// if (HI_SUCCESS != s32Ret)
// {
// SAMPLE_PRT("Venc bind Vpss failed for %#x!\n", s32Ret);
// goto EXIT_VENC_H264_STOP;
// }
/******************************************
stream save process
******************************************/
s32Ret = SAMPLE_COMM_VENC_StartGetStream(VencChn,s32ChnNum);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Venc failed!\n");
goto EXIT_VENC_H264_UnBind;
}
printf("please press twice ENTER to exit this sample\n");
getchar();
getchar();
/******************************************
exit process
******************************************/
SAMPLE_COMM_VENC_StopGetStream();
EXIT_VENC_H264_UnBind:
SAMPLE_COMM_VPSS_UnBind_VENC(VpssGrp,VpssChn[1],VencChn[1]);
EXIT_VENC_H264_STOP:
SAMPLE_COMM_VENC_Stop(VencChn[1]);
EXIT_VENC_H265_UnBind:
SAMPLE_COMM_VPSS_UnBind_VENC(VpssGrp,VpssChn[0],VencChn[0]);
EXIT_VENC_H265_STOP:
SAMPLE_COMM_VENC_Stop(VencChn[0]);
EXIT_VI_VPSS_UNBIND:
SAMPLE_COMM_VI_UnBind_VPSS(ViPipe,ViChn,VpssGrp);
EXIT_VPSS_STOP:
SAMPLE_COMM_VPSS_Stop(VpssGrp,abChnEnable);
EXIT_VI_STOP:
SAMPLE_COMM_VI_StopVi(&stViConfig);
SAMPLE_COMM_SYS_Exit();
return s32Ret;
}
HI_S32 SAMPLE_VENC_8K(void)
{
HI_S32 i;
HI_S32 reso_w = 7680;
HI_S32 s32Ret;
SIZE_S stSize[2];
PIC_SIZE_E enSize[2] = {PIC_7680x4320, PIC_1080P};
HI_S32 s32ChnNum = 1;
VENC_CHN VencChn[2] = {0,1};
HI_U32 u32Profile[2] = {0,1};
PAYLOAD_TYPE_E enPayLoad[2] = {PT_H265, PT_H264};
VENC_GOP_MODE_E enGopMode;
VENC_GOP_ATTR_S stGopAttr;
SAMPLE_RC_E enRcMode;
VI_DEV ViDev = 0;
VI_PIPE ViPipe = 0;
VI_CHN ViChn = 0;
SAMPLE_VI_CONFIG_S stViConfig;
VPSS_GRP VpssGrp = 0;
VPSS_CHN VpssChn[2] = {0,1};
HI_BOOL abChnEnable[4] = {1,0,0,0};
HI_U32 u32SupplementConfig = HI_FALSE;
for(i=0; i<s32ChnNum; i++)
{
s32Ret = SAMPLE_COMM_SYS_GetPicSize(enSize[i], &stSize[i]);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n");
return s32Ret;
}
}
SAMPLE_COMM_VI_GetSensorInfo(&stViConfig);
if(SAMPLE_SNS_TYPE_BUTT == stViConfig.astViInfo[0].stSnsInfo.enSnsType)
{
SAMPLE_PRT("Not set SENSOR%d_TYPE !\n",0);
return HI_FAILURE;
}
// s32Ret = SAMPLE_VENC_CheckSensor(stViConfig.astViInfo[0].stSnsInfo.enSnsType,stSize[0]);
// if(s32Ret != HI_SUCCESS)
// {
// SAMPLE_PRT("Check Sensor err!\n");
// return HI_FAILURE;
// }
stViConfig.s32WorkingViNum = 1;
stViConfig.astViInfo[0].stDevInfo.ViDev = ViDev;
stViConfig.astViInfo[0].stPipeInfo.aPipe[0] = ViPipe;
stViConfig.astViInfo[0].stChnInfo.ViChn = ViChn;
stViConfig.astViInfo[0].stChnInfo.enDynamicRange = DYNAMIC_RANGE_SDR8;
stViConfig.astViInfo[0].stChnInfo.enPixFormat = PIXEL_FORMAT_YVU_SEMIPLANAR_420;
s32Ret = SAMPLE_VENC_VI_Init(&stViConfig, HI_FALSE,u32SupplementConfig, reso_w);
if(s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("Init VI err for %#x!\n", s32Ret);
return HI_FAILURE;
}
s32Ret = SAMPLE_VENC_VPSS_Init(VpssGrp,abChnEnable,DYNAMIC_RANGE_SDR8,PIXEL_FORMAT_YVU_SEMIPLANAR_420,stSize,stViConfig.astViInfo[0].stSnsInfo.enSnsType);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Init VPSS err for %#x!\n", s32Ret);
goto EXIT_VI_STOP;
}
s32Ret = SAMPLE_COMM_VI_Bind_VPSS(ViPipe, ViChn, VpssGrp);
if(s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("VI Bind VPSS err for %#x!\n", s32Ret);
goto EXIT_VPSS_STOP;
}
s32Ret = SAMPLE_COMM_VI_UnBind_VPSS(ViPipe, ViChn, VpssGrp);
if(s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("VI UnBind VPSS err for %#x!\n", s32Ret);
goto EXIT_VPSS_STOP;
}
/******************************************
start stream venc
******************************************/
enRcMode = SAMPLE_VENC_GetRcMode();
enGopMode = SAMPLE_VENC_GetGopMode();
s32Ret = SAMPLE_COMM_VENC_GetGopAttr(enGopMode,&stGopAttr);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Venc Get GopAttr for %#x!\n", s32Ret);
goto EXIT_VI_VPSS_UNBIND;
}
/***encode h.265 **/
s32Ret = SAMPLE_COMM_VENC_Start(VencChn[0], enPayLoad[0],enSize[0], enRcMode,u32Profile[0],&stGopAttr);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Venc Start failed for %#x!\n", s32Ret);
goto EXIT_VI_VPSS_UNBIND;
}
s32Ret = SAMPLE_SendVencOneFrameProc_8k();
// s32Ret = SAMPLE_COMM_VPSS_Bind_VENC(VpssGrp, VpssChn[0],VencChn[0]);
// if (HI_SUCCESS != s32Ret)
// {
// SAMPLE_PRT("Venc Get GopAttr failed for %#x!\n", s32Ret);
// goto EXIT_VENC_H265_STOP;
// }
// /***encode h.264 **/
// s32Ret = SAMPLE_COMM_VENC_Start(VencChn[1], enPayLoad[1], enSize[1], enRcMode,u32Profile[1],&stGopAttr);
// if (HI_SUCCESS != s32Ret)
// {
// SAMPLE_PRT("Venc Start failed for %#x!\n", s32Ret);
// goto EXIT_VENC_H265_UnBind;
// }
// s32Ret = SAMPLE_COMM_VPSS_Bind_VENC(VpssGrp, VpssChn[1],VencChn[1]);
// if (HI_SUCCESS != s32Ret)
// {
// SAMPLE_PRT("Venc bind Vpss failed for %#x!\n", s32Ret);
// goto EXIT_VENC_H264_STOP;
// }
/******************************************
stream save process
******************************************/
s32Ret = SAMPLE_COMM_VENC_StartGetStream(VencChn,s32ChnNum);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Venc failed!\n");
goto EXIT_VENC_H264_UnBind;
}
printf("please press twice ENTER to exit this sample\n");
getchar();
getchar();
/******************************************
exit process
******************************************/
SAMPLE_COMM_VENC_StopGetStream();
EXIT_VENC_H264_UnBind:
SAMPLE_COMM_VPSS_UnBind_VENC(VpssGrp,VpssChn[1],VencChn[1]);
EXIT_VENC_H264_STOP:
SAMPLE_COMM_VENC_Stop(VencChn[1]);
EXIT_VENC_H265_UnBind:
SAMPLE_COMM_VPSS_UnBind_VENC(VpssGrp,VpssChn[0],VencChn[0]);
EXIT_VENC_H265_STOP:
SAMPLE_COMM_VENC_Stop(VencChn[0]);
EXIT_VI_VPSS_UNBIND:
SAMPLE_COMM_VI_UnBind_VPSS(ViPipe,ViChn,VpssGrp);
EXIT_VPSS_STOP:
SAMPLE_COMM_VPSS_Stop(VpssGrp,abChnEnable);
EXIT_VI_STOP:
SAMPLE_COMM_VI_StopVi(&stViConfig);
SAMPLE_COMM_SYS_Exit();
return s32Ret;
}
/******************************************************************************
* function : main()
* Description : video venc sample
******************************************************************************/
#ifdef __HuaweiLite__
int app_main(int argc, char *argv[])
#else
int main(int argc, char *argv[])
#endif
{
HI_S32 s32Ret;
HI_U32 u32Index;
if (argc < 2)
{
SAMPLE_VENC_Usage(argv[0]);
return HI_FAILURE;
}
u32Index = atoi(argv[1]);
#ifndef __HuaweiLite__
signal(SIGINT, SAMPLE_VENC_HandleSig);
signal(SIGTERM, SAMPLE_VENC_HandleSig);
#endif
switch (u32Index)
{
case 0:
s32Ret = SAMPLE_VENC_4K();
break;
case 1:
s32Ret = SAMPLE_VENC_8K();
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"); }
#ifdef __HuaweiLite__
return s32Ret;
#else
exit(s32Ret);
#endif
}
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* End of #ifdef __cplusplus */
有些小改动需要在common中改,都很简单就不写了,看一下就知道,另外我这边只测试了8k的一帧编码,如需连续编码视频需要再扩展一下,我这边由于公司项目安排就没再继续做了,测试出来8k文件编码的结果如下,颜色偏差是因为我的YUV和板子支持的YUV的存储顺序不一致,这里时间关系也就不调了,也算是顺利实现了芯片的8k文件编码。
祝大家平安健康。