以下处理流程为自己根据Hi3516av200的VENC 模块的整理,梳理了整个处理流程。
main
SAMPLE_VENC_NORMALP_CLASSIC
//
/******************************************
step 1: init sys variable
******************************************/
SAMPLE_COMM_VI_GetSizeBySensor
SAMPLE_COMM_SYS_CalcPicVbBlkSize
SAMPLE_COMM_SYS_GetPicSize
/******************************************
step 2: mpp system init.
******************************************/
SAMPLE_COMM_SYS_Init
HI_MPI_SYS_Exit(); //去初始化MPP 系统
HI_MPI_VB_Exit(); //去初始化MPP 视频缓存池
HI_MPI_VB_SetConf
//设置MPP 视频缓存池属性
HI_MPI_VB_Init //初始化MPP 视频缓存池
HI_MPI_SYS_SetConf //配置系统控制参数
HI_MPI_SYS_Init //初始化MPP 系统
//
/******************************************
step 3: start vi dev & chn to capture
******************************************/
SAMPLE_COMM_VI_StartVi
IsSensorInput //判断是传统的还是现在的sensor
SAMPLE_COMM_VI_StartIspAndVi
/******************************************
step 1: mipi configure
******************************************/
SAMPLE_COMM_VI_StartMIPI
SAMPLE_COMM_VI_SetMipiAttr //操作sensor,对sensor做必要的初始化
fd = open("/dev/hi_mipi", O_RDWR);
/* 1.reset mipi */
ioctl(fd, HI_MIPI_RESET_MIPI, &stcomboDevAttr.devno);
/* 2.reset sensor */
ioctl(fd, HI_MIPI_RESET_SENSOR, &stcomboDevAttr.devno);
/* 3.set mipi attr */
if (ioctl(fd, HI_MIPI_SET_DEV_ATTR, &stcomboDevAttr))
/* 4.unreset mipi */
ioctl(fd, HI_MIPI_UNRESET_MIPI, &stcomboDevAttr.devno);
/* 5.unreset sensor */
ioctl(fd, HI_MIPI_UNRESET_SENSOR, &stcomboDevAttr.devno);
/******************************************
step 2: configure sensor and ISP (include WDR mode).
note: you can jump over this step, if you do not use Hi3516A interal isp.
******************************************/
SAMPLE_COMM_ISP_Sensor_Regiter_callback //注册sensor回调
SAMPLE_COMM_ISP_Init // 对ISP初始化
HI_MPI_ISP_MemInit //对ISP分配必要的内存
HI_MPI_ISP_SetWDRMode //设置宽动态模式
GetIspPubAttrBySns
HI_MPI_ISP_SetPubAttr //写入ISP单元内部,将来ISP会根据设置的参数进行图像处理
HI_MPI_ISP_Init //ISP 系统初始化
/******************************************
step 3: run isp thread
note: you can jump over this step, if you do not use Hi3516A interal isp.
******************************************/
SAMPLE_COMM_ISP_Run
SAMPLE_COMM_ISP_Run
SAMPLE_COMM_ISP_Run
HI_MPI_ISP_Run
/******************************************************
step 4 : config & start vicap dev
******************************************************/
SAMPLE_COMM_VI_StartDev
SAMPLE_COMM_VI_GetDevAttrBySns
HI_MPI_ISP_GetWDRMode
HI_MPI_VI_SetDevAttr
HI_MPI_VI_SetWDRAttr
HI_MPI_VI_EnableDev
/******************************************************
* Step 5: config & start vicap chn (max 1)
******************************************************/
GetViCaprectBySns
SAMPLE_COMM_VI_StartChn
HI_MPI_VI_EnableChn
/
/******************************************
step 4: start vpss and vi bind vpss
******************************************/
SAMPLE_COMM_SYS_GetPicSize
SAMPLE_COMM_VPSS_StartGroup
HI_MPI_VPSS_CreateGrp
HI_MPI_VPSS_StartGrp
SAMPLE_COMM_VI_BindVpss
SAMPLE_COMM_VI_Mode2Param
HI_MPI_SYS_Bind
SAMPLE_COMM_VPSS_EnableChn
HI_MPI_VPSS_SetChnAttr
HI_MPI_VPSS_SetChnMode
HI_MPI_VPSS_EnableChn
/******************************************
step 5: start stream venc
******************************************/
SAMPLE_COMM_VENC_GetGopAttr
SAMPLE_COMM_VENC_Start
SAMPLE_COMM_SYS_GetPicSize
/******************************************
step 1: Create Venc Channel
******************************************/
HI_MPI_VENC_CreateChn
/******************************************
step 2: Start Recv Venc Pictures
******************************************/
HI_MPI_VENC_StartRecvPic //开启编码通道接收输入图像
SAMPLE_COMM_VENC_BindVpss
HI_MPI_SYS_Bind //数据源到数据接收者绑定接口
//
/******************************************
step 6: stream venc process -- get stream, then save it to file.
******************************************/
SAMPLE_COMM_VENC_StartGetStream
SAMPLE_COMM_VENC_GetVencStreamProc
/******************************************
step 1: check & prepare save-file & venc-fd
******************************************/
HI_MPI_VENC_GetChnAttr
SAMPLE_COMM_VENC_GetFilePostfix
fopen(aszFileName[i], "wb");
HI_MPI_VENC_GetFd
HI_MPI_VENC_GetStreamBufInfo
/******************************************
step 2: Start to get streams of each channel.
******************************************/
select(maxfd + 1, &read_fds, NULL, NULL, &TimeoutVal);
/*******************************************************
step 2.1 : query how many packs in one-frame stream.
*******************************************************/
HI_MPI_VENC_Query
/*******************************************************
step 2.2 :suggest to check both u32CurPacks and u32LeftStreamFrames at the same time,for example:
*******************************************************/
/*******************************************************
step 2.3 : malloc corresponding number of pack nodes.
*******************************************************/
/*******************************************************
step 2.4 : call mpi to get one-frame stream
*******************************************************/
HI_MPI_VENC_GetStream
/*******************************************************
step 2.5 : save frame to file
*******************************************************/
SAMPLE_COMM_VENC_SaveFile
fwrite ((void *)u32SrcPhyAddr, pstStream->pstPack[i].u32Len - pstStream->pstPack[i].u32Offset, 1, pFd);
fflush(pFd);
/*******************************************************
step 2.6 : release stream
*******************************************************/
HI_MPI_VENC_ReleaseStream
/*******************************************************
step 2.7 : free pack nodes
*******************************************************/
free(stStream.pstPack);
/*******************************************************
* step 3 : close save-file
*******************************************************/
fclose(pFile[i]);
/******************************************
step 7: exit process
******************************************/
SAMPLE_COMM_VENC_StopGetStream
pthread_join