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

猜你喜欢

转载自blog.csdn.net/WANGYONGZIXUE/article/details/106623611
今日推荐