海思 hisi SDK中視頻層號和通道號的理解

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);
			}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章