一,在进行音视频解码前,进行平台初始化工作:
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 BT.601) */
VIDEO_NORM_E enViNorm; /* video input normal(only for BT.601) */
HI_BOOL bIsChromaChn; /* whether this device capture chroma data(only for BT.1120) */
HI_BOOL bChromaSwap; /* whether exchange U/V of chroma channel(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);
整体上把握一下视频解码的流程,至少也得知道数据是如何采集的
STEP1:模拟信号的采集
模拟信号通过2866芯片采集,转换为数字信号。2866芯片是标准的AD,DA数据转换芯片。在我们的系统中主要实现模拟信号转数字信号输入,数字信号转模拟信号的输出。
2866最大可以同时采集4CH视频信号。
STEP2:模数转换
2866采集的4CH视频信号(模拟)转换为1CH数字信号送3520芯片。对于像本人这样的新手来说,此处可能会有点理解困难,为什么4CH模拟信号
输入2866转换输出的仅仅只是1CH数字信号。这就涉及到点点数电的知识了,数字信号简单讲就是高低电平,高电平代表1,低电平代表0,如何在1CH数字信号
里包括4路VI视频呢?假设下图是2866送出的视频数字信号一个时钟周期内的波形图,
-_--_-_--__---_--_-_--__---_--_-_--__----_--_-_--__----_--_-_--__-----_-
周期的前四个信号 -_-- 第一个信号值为VI1的视频信号,第二信号值为VI2的视频信号,第三个信号值得为VI3的视频信号,第四个信号值得为VI4的视频信号。
STEP3:2866输出视频数据到3520
此时引入一个概念,VI设备,什么是VI设备,对于3520来说,上一步2866采集的4CH模拟信号转换后的一路视频信号就是1个VI设备,该VI设备同时处理包括4路视频数据。
海思的VI模块所做的主要工作就是处理VI设备的4CH视频数据,将视频数据放入内存区域。至于以后这些内存数据是用于视频输出,还是视频编码,就另当别论了。
参考:
1,音视频解码模块阅读笔记(一)-->转载
http://blog.csdn.net/u012236632/article/details/43015233