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);
}