SDK 将通道归属于视频层管理,一个视频层上可显示多个视频,每一个视频显示区域称为一个通道,视频被限制通道内,通道被限制在视频层内。对于一个视频层,其上面的通道都是独立的。同时,不同的视频层上的通道也是独立的。
指定视频层的通道号的视频暂停:
HI_MPI_VO_PauseChn(SAMPLE_VO_LAYER_VSD0,1);
暂停视频层号为SAMPLE_VO_LAYER_VSD0(标清),通道号(chn)为1的视频
从共享内存读出视频数据,送给hisi解码通道
海思解码通道缓冲区大小:u32BufSize
待解码的byte数量 :u32LeftStreamBytes
写入待解码的数据和海思剩余的解码内存比较,否则解码内存不够存放待写入的数据,待写入的数据将丢失,造成视频帧严重丢失。其中BitStream.BitStreamBufLen为待写入解码视频的大小
if (BitStreamCheckReady(&BitStream, i) == 0)//检测共享内存缓冲区是否准备好
{
ret = BitStreamReadLen(&BitStream, i);//先去读待写入视频的长度
HI_MPI_VDEC_Query(0, &stStat);
HI_MPI_VDEC_GetChnAttr(0,&vdec_attr);
vdec_left = vdec_attr.u32BufSize - stStat.u32LeftStreamBytes ;//hisi 解码缓冲区剩余的空间
if(vdec_left > BitStream.BitStreamBufLen)
{
ret = BitStreamRead(&BitStream, i);//
stStream.pu8Addr = BitStream.pBitStreamBuf;
stStream.u32Len = BitStream.BitStreamBufLen;
s32Ret=HI_MPI_VDEC_SendStream(0, &stStream, 0);//解码函数,0表示阻塞
if(s32Ret!=0)
{
printf("HD1 sndstream s32Ret=%x\n",s32Ret);//输出异常信息
}
}
else
{
printf("total=%d,stStat.u32LeftStreamBytes=%d,stStream.u32Len=%d\n",vdec_attr.u32BufSize,stStat.u32LeftStreamBytes,BitStream.BitStreamBufLen);
}
}
else
{
printf("channel is busy\n");
usleep(5);
}