xilinx vcu 介绍
注:以下内容是总结自赛灵思的vcu文档
一、编码相关知识
1.1 I帧、P帧、B帧
● I帧即Intra-coded picture(帧内编码图像帧),不参考其他图像帧,只利用本帧的信息进行编码
● P帧即Predictive-codedPicture(预测编码图像帧),利用之前的I帧或P帧,采用运动预测的方式进行帧间预测编码
● B帧即Bidirectionallypredicted picture(双向预测编码图像帧),提供最高的压缩比,它既需要之前的图
像帧(I帧或P帧),也需要后来的图像帧(P帧),采用运动预测的方式进行帧间双向预测编码
1.2 GOP
这是图像组(Group of Pictures)的意思,表示编码的视频序列分成了一组一组的有序的帧的集合进行编码。每个GOP一定是以一个I帧开始的,但是却不一定指代的是两个I帧之间的距离。因为一个GOP内可能包含几个I帧,只有第一个I帧(也就是第一帧)才是关键帧。在程序cfg中,GOP的长度和两个I帧的距离也是两个不同参数指定的(如IntraPeriod和GOP Size或者类似的参数)。所以,两个I帧的间距不可能大于GOP的长度,一般情况是更小的。
1.3 IDR
IDR词儿的全称是Instantaneous Decoding Refresh,是在H.264中定义的结构。在H.264中,IDR帧一定是I帧,而且一定是GOP的开始,也是H.264 GOP的关键帧。但是反过来却不成立,I帧不一定是IDR帧。
1.4 GDR
GDR(Gradual Decoding Refresh),这是一种特别的P帧,每个GDR包含一个I-Slice,几个连续的GDR帧可以起到一个I帧相同的作用,但由于GDR帧的大小与P帧接近,因此可以起到平滑码率的作用,减少超大I帧对网络的冲击,减少传输延迟,同时也能起到阻隔错误的作用。
二、VCU 编码器基本结构结构
2.1 Encoder Buffer
Encoder Buffer可以存储编码用的参考帧,这些参考帧可以提前从DDR中预读取到Encoder Buffer中,这样可以降低总线带宽压力,但会降低视频质量。使能Encoder Buffer 的命令如下所示:
gst-launch-1.0 videotestsrc ! omxh265enc prefetch-buffer=true ! fakesink
2.2 编码器的输入输出数据格式
Video Codec Unit(VCU) 输入和输出都是是NV12/NV16格式的视频,Y分量存放在一块连续内存区,UV分量交替存放在Y分量后面的连续内存。具体信息,可以参考的“Source Frame Format”小节。
三、sync ip
linux sync ip驱动文件:kernel-source/drivers/staging/xlnxsync/xlnxsync.c,驱动加载成功后,会在/dev下生成xlnxsync0节点
四、vcu 编码四种延时模式
vcu的延时模式:
(1)普通延时模式:有I、P、B帧、
(2)没有重新排序的延时模式:这种模式没有B帧,因为B帧需要双向预测,会增加一帧延时。可以支持仅I帧,I帧和P帧、低延时P帧。(IPPP...IPPP...)
(3)低延时模式:这种模式下编码器的输出和解码器的输入是切片模式的,也就是说不需要等到一帧编完在送解码,编码和解码可以同步。如果是将编码的码流取走发送的话这种模式下编码和发送码流可以同步进行。但是编码器的输入和解码器的输出还是工作在帧模式,也就是说需要等到完整一帧才能编码,解码完一帧才输出。
(4)赛灵思低延时模式:这种模式下编解码器的输入输出是切片的,获取码流,编码,发送码流这三个步骤可以同步进行。这个需要sync ip支持。(IPPP...)
详细介绍参考PG252的VCU Latency Modes章节
五、vcu参数
5.1 使用Xilinx's ultra low-latency模式
下面这段是编码器的参数配置
omxh265enc num-slices=8 control-rate=low-latency gop-mode=low-delay-p target-bitrate=25000 cpb-size=500 gdr-mode=horizontal initial-delay=250 periodicity-idr=240 filler-data=0 prefetch-buffer=true
编码参数解释见文档的“GStreamer Encoding Parameters”章节
num-slices=8:切8片编码
control-rate=low-latency:编码码率使用低延时码率
gop-mode=low-delay-p:第一帧为I帧,后面都是P帧(IPPPPP.....)
target-bitrate=25000:vcu目标编码速率25000kb/s
cpb-size=500:编码图片缓存区大小
gdr-mode=horizontal:GDR帧为水平模式
initial-delay=250:
periodicity-idr=240:两个IDR帧之间有240帧
filler-data=0:
prefetch-buffer=true:使用Encoder Buffer