VVC里自定义GOP结构

Posted on 2020-07-30 11:52  学习睡觉^v^  阅读(83)  评论(0编辑  收藏  举报

不确定点1:对于类似IBBBPBBBP这样的结构,我这里面提到的GOP都是把BBBP看作一个GOP的,在有些地方我看到是似乎是吧IBBB或者IBBBP当作一个GOP,有人知道正确的划分的话麻烦评论区评论一下,不胜感激。(这个应该只会影响close 或 openGOP的一些设置,对于如何设置特定的GOP结构,还是可以参考一下以下内容的)

mark__个人对于其参数的理解还是不够,这里只讲下在我的理解里如何实现

有时候我们要用到自定义的GOP结构来测试某些东西,但是网上很少介绍怎么自己设置GOP结构的东西,现将我解决的过程和方法写下来,供大家参考一下。

我的配置是通过修改VVC里RA配置里的参数修改的。

要自定义自己的GOP结构,实际上是需要在.cfg里的如下区域修改一些参数即可。
在这里插入图片描述
这里介绍一下这些参数,官方的说明大家可以去看VVC的手册

IntraPeriod: 也就是每隔X帧插入一个I帧,注意这里的I帧是具有“DecodeRefreshType”的属性的,这个参数的值一定要是GOPSize的整数倍且比GOPSize大
DecodeRefreshType:解码时接入点的属性,CRA表示其Leading图像(显示在CRA前解码在CRA后)无法通过直接从CRA处开始正确解码;IDR则表示其Leading图像可以通过直接从IDR处开始正确解码。
GOPSize:从名字可以看出它的意思,此参数值需为2的整数倍
IntraQPOffset:
LambdaFromQpEnable:这俩参数和GOP结构没多大关系,不讲了
Frame1:Frame2:Frame3:Frame4:这四个参数很关键,默认的里面应该是16个,这个Framed的数量要与GOPSize一致,自定义GOP结构时能否主要就看这里了。之后通过一些例子来讲解一下如何设置参数。

在这里插入图片描述
对于上图所示这种openGOP的结构,DecodeRefreshType应设为CRA(closeGOP设为IDR);然后确定其GOPSize为4,POC=1,2,3,4作为一个GOP;然后IntraPeriod根据自己需求改成GOPSize的倍数,我这里设置个8。

随后就是比较难一点的Frame参数设置了。对于Frame里的参数,VVC使用手册里有介绍,我这里只讲我用到的一些参数。
Frame1~FrameX的顺序是根据解码顺序排列的,比如说上述的图中,Frame1就是POC=4的P帧,Frame2就是POC=2,Frame3是POC=1,Frame4是POC= 3.
Type: 对应帧的类型,I、P、B
POC: 对应帧的POC序号
temporal_id: 对应帧的temporal_id,上图中POC=0,4,8的temporal_id = 0,POC=2,6的temporal_id = 1,POC=1,3,5,7的temporal_id = 2,
#ref_pics_active_L0,#ref_pics_L0,reference_pictures_L0 : 这三个参数是关于当前帧前向参考的信息的。以下斜体是我自己的理解***#ref_pics_active_L0表示实际前向参考的帧数量,#ref_pics_L0表示前向参考用到的及未来用到的参考帧的数量,reference_pictures_L0 表示后向参考用到的帧以及未来可能用到帧 的POC
#ref_pics_active_L1 表示实际后向参考的帧数量,#ref_pics_L1表示后向参考的帧以及未来会用到的参考帧的数量,reference_pictures_L1 表示后向参考用到的帧以及未来可能用到帧 的POC*

	   Type	POC ...... temporal_id  #ref_pics_active_L0  #ref_pics_L0  reference_pictures_L0  #ref_pics_active_L1  #ref_pics_L1  reference_pictures_L1 
Frame1:P	 4				0				1					1				4						1					1					4

从结构图可以看到,P帧是只前向参考了之前上一个GOP的I帧(POC=0)的,因此#ref_pics_active_L0=1,#ref_pics_L0=1,reference_pictures_L0 = 4(当前POC减参考帧的POC,4-0 = 4)。那么为什么之后L1的参数也是1 1 4呢。这里我从师姐实习公司里听到的是,如果实际上某一帧只参考了一个方向的话,那么它的L0和L1的设置应该是一样的。由于这里的P帧只前向参考,所有把它的L1里的参数设置成与L0相同。

Frame2:B	 2				1				1					1				2						1					1					-2

同时可以看得到POC=2的B帧,前向参考了POC=0,后向参考了POC=4,所以#ref_pics_active_L0= 1,#ref_pics_L0=1,reference_pictures_L0 = 2(2-0);#ref_pics_active_L1=1, #ref_pics_L1=1, reference_pictures_L1 = -2(2-4)。

Frame3:B	 1 				2				1					1				1						1			 		2					-1	-3

POC=1的帧比较特殊。它前向参考了POC=0, 后向参考了POC=2,但是注意POC=2又是参考了POC=4的。所以在后向参考列表中需要把POC=4的帧也添加进来,否则跑程序时会出现‘Invalid GOP Structure’这种问题。所以#ref_pics_active_L0= 1,#ref_pics_L0=1,reference_pictures_L0 = 1(1-0);#ref_pics_active_L1=1, #ref_pics_L1=2, reference_pictures_L1 = -1(1-2) -3(1-4)。

Frame4:B	 3				2				1					1				1						1					1					-1

POC=3前向参考了POC=2,后向参考了POC=4.虽然说POC=2也参考了POC=0,但是却没有把POC=0算入#ref_pics_L0里去,我自己的理解是 POC=0不是未来(POC顺序里的未来)需要参考的帧。所以#ref_pics_active_L0= 1,#ref_pics_L0=1,reference_pictures_L0 = 1(3-2);#ref_pics_active_L1=1, #ref_pics_L1=1, reference_pictures_L1 = -1(3-4)。

若有问题,欢迎指出
上面这个例子是openGOP,后面GOP的B帧可以参考前面GOP的内容的,再讲一个closeGOP的例子。(好累呀嘻嘻,其实是写的时候出现了问题)