本文根据Hi3518ESDK中的mpp的sample中的venc进行的总结
首先贴出代码,然后一步步分析这一部分
/******************************************
step 1: init sys variable
******************************************/
memset(&stVbConf,0,sizeof(VB_CONF_S));
// 获取摄像头传进的图像的分辨率大小,也可能是VGA等的视频输入,功能就是获取出传入的图像的分辨率,用来对VB缓存池进行初始化每个块的大小,比如720P
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;
enSize[2] = PIC_QVGA;
//几路视频流,这里就是VPSS输出了几路,摄像头输入只有一路,传入VPSS后可以缩放,比如可以从VPSS传出原有的视频流,还可以传出缩小后的VGA和QVGA
//还有一种可能就是VPSS的这几路流用于不同地方,比如可能放到编码器编码,可能推到VO进行输出显示
s32ChnNum = 3;
}
else
{
printf("not support this sensor\n");
return HI_FAILURE;
}
#ifdef hi3518ev201
s32ChnNum = 1;
#endif
printf("s32ChnNum = %d\n",s32ChnNum);
//MPP系统配置其实主要就是配置VB缓存,其他海思都做了
stVbConf.u32MaxPoolCnt = 128; //设置缓存池最大的个数为128
/*video buffer*/
// 根据不同个数的视频流进行配置缓存池,每一路流至少要有一个缓冲池
if(s32ChnNum >= 1) // 第一路视频流的VB缓存池配置
{
//根据分辨率算出缓存池中的缓存块应该开辟多大的空间,参数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;
}