Le SDK attribue des canaux à la gestion des couches vidéo. Une couche vidéo peut afficher plusieurs vidéos. Chaque zone d'affichage vidéo est appelée une chaîne. La vidéo est limitée au canal et le canal est limité à la couche vidéo. Pour une couche vidéo, les canaux au-dessus sont indépendants. Dans le même temps, les canaux sur différentes couches vidéo sont également indépendants.
Spécifie la pause vidéo du numéro de canal de la couche vidéo:
HI_MPI_VO_PauseChn(SAMPLE_VO_LAYER_VSD0,1);
Mettre en pause la vidéo dont le numéro de couche est SAMPLE_VO_LAYER_VSD0 (définition standard) et le numéro de canal (chn) est 1
Lire les données vidéo de la mémoire partagée et les envoyer au canal de décodage hisi.
Taille de la mémoire tampon du canal de décodage Hisilicon: u32BufSize
Nombre d'octets à décoder: u32LeftStreamBytes
Comparez les données écrites à décoder avec la mémoire de décodage restante de HiSilicon. Sinon, la mémoire de décodage n'est pas suffisante pour stocker les données à écrire, et les données à écrire seront perdues, entraînant de sérieuses pertes d'images vidéo. Où BitStream.BitStreamBufLen est la taille de la vidéo décodée à écrire
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);
}