音视频解码模块阅读笔记一
音视频解码模块阅读笔记(一)
在我们的系统中, 一直觉得音视频解码是较为神秘的模块之一,不理解该模块的工作原理,基本上对整个系统的把握就谈不下掌握了。
今天是第一次写该阅读笔记,个人重点想要了解和学习的地方是音频和视频是如何输出的。
最近社会风气不好,去年的曾哥,今天的著姐。越来越看不懂这个社会,哎,著姐,你就干脆点,自宫得了吧。想练自功,必先自宫。
回到整个系统中来,所谓音视频解码,大多数所做的工作便是对海思音视频解码库api的调用。想要完整的解出音视频数据吗,行,老老实
实的调用海思提供的api函数。
说了半天的白话,/:-)。
一, 在进行音视频解码前,首行我们得进行平台初始化工作。
InitPlatform()
{
…….
}
该函数主要完成如下工作。
先清空系统控制信息,视频缓冲区的信息
HI_MPI_SYS_Exit()
HI_MPI_VB_Exit()
接下来设置视频缓冲区
先配置几个视频缓冲区的大小
stVbConf.astCommPool[0].u32BlkSize = 720 * 576 * 2;/D1/
stVbConf.astCommPool[0].u32BlkCnt = 10;
stVbConf.astCommPool[1].u32BlkSize = 704 * 576 * 2;/D1/
stVbConf.astCommPool[1].u32BlkCnt = 52;
stVbConf.astCommPool[2].u32BlkSize = 384 * 576 * 2;/2CIF/
stVbConf.astCommPool[2].u32BlkCnt = 64;
stVbConf.astCommPool[3].u32BlkSize = 384 * 288 * 2;/CIF/
stVbConf.astCommPool[3].u32BlkCnt = 20;
设置系统中使用图像的字节对齐数,开发文档推荐配置成16 or 64就可以了,此时不是很明白,得去问问罗罗了。
stSysConf.u32AlignWidth = 64;
HI_MPI_VB_SetConf(&stVbConf)
视频缓冲区初始化。
HI_MPI_VB_Init
二, 完成了系统平台的初始化,接下来该进行音视频的输入处理。
在视频输入处理中有一个概念必要要明确,vi设备端口,hi3520有4个vi设备端口,最大同进支持16ch视频输入,也就是说1个vi设备端口对应4个视频输入设备。
视频输入的初始化得完成以下几个工作。
设置vi设备端口的属性 HI_MPI_VI_SetPubAttr
|
|
|
V
vi设备使能 HI_MPI_VI_Enable(ViDev)
|
|
设置vi设备端口接入各个vi通道的属性
在hi3520系统中,3520芯片外的数据是通过ITU-R BT656/601/1120 接口或digital camera 接口,存入芯片外的内存区域的,
当数据接口为ITU-R BT656 时, 一个vi设备能支持多个通道,最多支持4个,我们称之为ViChn0、ViChn1、ViChn2、ViChn3。
1 设置vi设备端口的属性
设置属性接口函数,VI_DEV ViDevId vi输入设备端口。pstPubAttr 设置属性值。
HI_S32 HI_MPI_VI_SetPubAttr(VI_DEV ViDevId,const VI_PUB_ATTR_S *pstPubAttr);
typedef struct hiVI_PUB_ATTR_S
{
VI_INPUT_MODE_E enInputMode; /* video input mode */
VI_WORK_MODE_E enWorkMode; /* work mode(only for ITU-R.BT656) */
VIDEO_NORM_E enViNorm; /* video input normal(only for BT.601) */
HI_BOOL bIsChromaChn; /* whethe this device capture chroma data (only for BT.1120) */
HI_BOOL bChromaSwap; /* whethe exchange U/V of chroma channle (only for BT.1120) */
} VI_PUB_ATTR_S;
HI_MPI_VI_Enable(ViDev);
2 设置完视频输入设备,接下来该设置视频输入通道。
一个视频输入设备对应4个通道。
和视频输入设备设置一个样,先设置通道属性
s32Ret = HI_MPI_VI_SetChnAttr(ViDev, ViChn, pstViChnAttr);
再接下来使能通道
s32Ret = HI_MPI_VI_EnableChn(ViDev, ViChn);
设置通道的每秒的帧数,N制下为30,pal制为25帧。
s32Ret = HI_MPI_VI_SetSrcFrameRate(ViDev, ViChn, u32SrcFrmRate);
今天就写到这里了吧, 下次继续。