原文地址:http://bbs.chinavideo.org/viewthread.php?tid=14356&extra=page%3D1
GOP 一般指两个IDR帧之间的距离,x264中和GOP中相关的参数有两个,其一是-keyint,控制的是GOP中最大可能距离,另一个是-min-keyint,控制的是允许最小的GOP距离
IDR 和IDR有关的参数除了上面的GOP设定的两个基本参数之外,还有一个scenecut控制了如何自适应的通过判断场景的变化加入IDR帧,用来override之前的判断。具体做法是通过计算本帧和前一帧之间visual difference 在根据scenecut和minkeyint的设定值形成判断,判定此处是否存在scenechange,判断成立的话将本帧判断为IDR帧,反之则有可能为I帧(判断依据的前半成立)或者BP.
Ref frames 首先这是一个针对sub-mb level而言的参数,而不是一个从frame角度说的参数。假定在b-pyramid关掉的前提下,ref frames控制的是p帧内每个P sub-macroblock(8x8),它可以选择的前向一遍吗P/I帧的最大值,已编码帧一般放在decoded picture buffer(DPB)中,而DPB的允许大小又level控制,这也是不同分辨率下DXVA Compatible Profile中ref设置的参照标准。在编码过程中,P Frame中每个P的8x8 sub-MB,都会在ref规定的DPB中寻找最合适(比如difference最小)的某一帧的某一位置作为它的参考块。在没有weightp引入 的前提下,对每一个P Sub-MB而言,最终作为参考总对象的只可能有一个。
Weightp,我们来看weightp下的情况()
编码顺序:
我们回到最基本的无weightp下,站在frame level的角度说下编码的顺序是怎样的,同时假设我们处理的第一真是IDR帧,此处所有的“向后”指的是回访顺序时间增长的方向:
1. 编码IDR帧
2. 根据scenecut 和 min-keyint的设置,向后移动 min-keyint的距离,开始判定是否为scenechange,直到判定满足,或者到达keyint设置值的距离时候停止。同时记录判定条件不完全满足时候的位置。
3. 编码找到的为指针,亦为IDR帧,GOP形成。
4. 根据2步中得到的判定条件不完全满足的位置,将对应帧按时间顺序用I编码。
5. 找到最头上IDR和离其最近的I帧形成的Sub-GOP(严格意义上说此处并非GOP因为GOP之间不能交换信息,)结合bframes的设定大小,推断P帧出现的位置。具体而言,按时间顺序走每一帧比较该帧用P编码和B编码时的视觉误差和复杂度何者更大,根据某些公式推导出此处应该用何种帧类型,再向后移一帧;如果直到bframes规定的值都未出现P,则强制插入一帧P。这样就决定了每个sub-GOP内P帧的位置。
6. 最后一步,根据I/IDR/P形成的子区间,按时间顺序编码各帧为B帧。
例子
100-120帧这样的一段视频
第一步结束后编码完成 100帧
第二步结束后可能编码完成 120帧和110帧 (IDR帧)同时找出了104,108, 115帧应该编码为I
第四步结束后编码完成104 108 115 帧为I
第五步对 100-104 104- 108 108-110 110 – 115 115-120五个子区间,判断P帧出现的位置并编码有可能判断出102 113 118 为p帧
最后一步在编码之间的部分为B帧
于是解码过程的输出帧顺序其实是
100 110 104 108 102 101 103 105 106 109.。。。。。。。即(GOP边界,I I PBBBBBB)
(二)关于码流中的三种随机接入点的解释:
BLA、CRA、IDR是文献中提到过的三种随机接入点(RAP),在文献中的解释的确不是很容易理解。更关键的是,与这三个名词相应的还有GOP,open/closed GOP, RASL,RADL等等概念,环环相扣,一个不理解,剩下的也很难弄懂,下面我们一个一个解释,很多也是我自己刚刚想到的,不一定正确全面,欢迎批评。
(1)关于GOP。这是图像组(Group of Pictures)的意思,表示编码的视频序列分成了一组一组的有序的帧的集合进行编码。每个GOP一定是以一个I帧开始的,但是却不一定指代的是两个I帧之间的距离。因为一个GOP内可能包含几个I帧,只有第一个I帧(也就是第一帧)才是关键帧。在程序cfg中,GOP的长度和两个I帧的距离也是两个不同参数指定的(如IntraPeriod和GOP Size或者类似的参数)。所以,两个I帧的间距不可能大于GOP的长度,一般情况是更小的。
(2)关于IDR。这个词儿的全称是Instantaneous Decoding Refresh,是在H.264中定义的结构。在H.264中,IDR帧一定是I帧,而且一定是GOP的开始,也是H.264 GOP的关键帧。但是反过来却不成立,I帧不一定是IDR帧。GOP的长度不是定死不变的,在H.264的编码器中,如果判定场景发生变化,那么即使不到原定GOP的末尾,也会在这个位置加入一个IDR,作为新一个GOP的开始。此时这个GOP的长度就被缩小了。
(3)闭合GOP和开放GOP(closed GOP/open GOP),CRA。闭合GOP是H.264中GOP的格式。在H.264的GOP中,所有的GOP都是独立解码的,与其他GOP无关,即它们都是“封闭”的。但是在HEVC中,GOP的结构发生了变化,采用了“开放”的结构,在解码过程过可能会参考其他GOP的数据。这时,一个GOP的起始帧命名为CRA,clean random access,同样采用帧内编码,但是这个GOP内的帧间编码帧可以越过CRA参考前一个GOP的数据,这便是GOP的open。
(4)关于BLA。个人感觉BLA只是CRA在视频流切换情况下的一种特例。视频流在某个RAP上要求切换到另一个视频流继续解码,则直接将该CRA同另一个视频流中的接入CRA连接,后者便是BLA。由于BLA之前解码到缓存的视频流与当前视频流无关,因此其特性类似于直接从该点进行随机存取后的CRA。
(5)RASL和RADL。这是两种GOP间的图像类型。如果解码器从某个CRA随机接入,则按照显示顺序的后面几帧数据由于缺少参考帧而不能解码,这些图像将被解码器抛弃,即skip leading。而对于没有从当前CRA接入的数据,这些图像可以被正常解码显示,因此称为decodable leading。由于这些数据是有可能舍弃的,因此其他图像(trailing pictures)不能参考这些数据,否则万一这些图像被舍弃,将会有更多的图像受其影响而不能正常解码。
下面举个例子:
假设视频序列的显示顺序为①,这是一个完整的GOP,解码顺序为②
①I B B P B B P B B P
②I P B B P B B P B B
在H.264中,第一个I帧为IDR,GOP为闭合结构,因此两个GOP组成视频的结构为
I B B P B B P B B P I B B P B B P B B P(显示顺序)
I P B B P B B P B B I P B B P B B P B B(解码顺序)
而在HEVC中,两个I帧为CRA,GOP为开放结构,因此GOP的结构为:
I B B P B B P B B P B B I B B P B B P B (显示顺序)
I P B B P B B P B B I B B P B B P B B...(解码顺序)
两个红色的B帧表示的是按照解码顺序在CRA之后,该GOP内参考的前一个GOP进行编码的图像。这样便很容易得知,如果选择在第二个CRA进行随机接入,这两个红色的B帧将会由于没有参考帧无法解码而被舍弃。这两个红色的B帧即RASP。如果没有选择这个CRA进行随机接入,这两个红色B帧将可以顺利解码,即成为RADP。
对于BLA,情况也是类似的。由于出现码流拼接,第二段码流的CRA之后的B也会因为没有参考帧无法解码而丢弃。很容易理解,此时缓存中的参考帧数据还来自上一段码流,跟当前码流没关系,当然不能用作B的参考了。
之余HEVC这么设计的目的,我觉得应该是为了编码效率考虑的。因为B帧的压缩比相对是最高的,引入这种设计可以在不影响随机存取性能的前提下,尽可能增大B帧的比重,提高整体压缩编码的性能。
以下是一些国外研究者在论坛中对这个问题的一些讨论,可以拿来做一下参考:
www.linkedin.com/groups/IDR-vs-CRA-3724292.S.125836481
forum.doom9.org/archive/index.php/t-105129.html
(三)
1、由图像帧到树形编码单元的分割
一帧图像分割成树形编码单元(coding tree units,CTUs),CTU包含亮度和色度分量CTB,是基本的处理单元。亮度分量CTB为边长为16、32或者64的矩形块,色度CTB的边长为亮度的一半,CTB的实际大小由码流中的序列参数集合指定。更大尺寸的分块可以更好地处理高清视频信号。
2、由CTB分割为CB:
亮度和色度CTB可以按照四叉树结构进一步分解为CB。四叉树结构可以根据视频信号的区域特征将CTB分割成合适大小的CB块。分割过程可反复迭代,知道亮度CB的大小为可支持的最小值8×8。在图像的边界处,CB为最小支持尺寸。解码器对可能“越界”的CTB会做专门处理。
3、PB和PU
每个CU的预测模式可能为帧内或者帧间。若预测模式为帧内,除了最小尺寸模式外,PB的尺寸等于CB。若是最小尺寸模式,则用标志位表示是否将CB分割成四个PB块。这样最小可以支持到4×4大小的帧内预测块(此时色度分量PB也为4×4)。
若预测模式为帧间预测,亮度和色度CB可能分割为1/2/4个PB。只有CB为最小尺寸模式时才能分割为4个PB块。CB分割为四个PB时,每个PB占据CB的1/4;CB分为两个PB时,可选择6种分割模式的一种,其中包含不平均分割模式(只针对16×16及以上的亮度块)。每个帧间预测PB包含一个或者两个运动矢量和参考帧索引。为控制编码效率,4×4亮度块不允许使用帧间预测,8×4和4×8最多只允许单向预测编码。
(四)
GOP in MPEG-1
ISO 11172-2, p24
Group of Pictures:
图像组是一个或多个解码后的图像,用于可以随机存取。一个GOP的第一帧为I帧,编码码流中的图像顺序就是解码器输出的顺序;特别的,临近的B帧按照显示顺序编码;按照显示顺序排列的最后一帧需为I或P帧。一个GOP的长度不定,至少要包含一个I帧,支持随机接入、调速播放的应用,应该使用相对较小的GOP。在场景切换以及其他运动估计不好的地方也可以作为GOP的起始位置。B帧的数目也是可变的。
GOP in MPEG-2
ISO 13818-2, p6
Group of Pictures headers:
在MPEG-2中,GOP的概念由Group of Pictures headers来实现(p6)。GOP头是视频序列中的可选结构,在序列头(sequence header)之后。在一个序列之中,有多帧之前可能存在重复序列头(repeat sequence header)或者(group of picture header),或者二者兼备(p16)。在编码码流的某些I帧前面,可能会加入一个GOP头,以向解码器说明在将该位置作为随机接入点及后续B帧能不能正常解码(p18)。
MPEG-2中的Group of Pictures headers是一个结构体,包含group_start_code,time_code, closed_gop和broken_link等元素(p34)。
Syntax Element Structs in H.264/AVC
到了H.264/AVC中,语法元素的结构发生了重大变化。在H.264中图像组GOP的概念被大大弱化了。比如,在标准文档ISO/IEC 14496-10中,用GOP或者group of picture这类关键词搜索,几乎得不到什么结果。同时,在JM86的代码的配置文件中,也没有指定如GOP长度之类的设置。
配置文件中,I帧周期IntraPeriod设置的值不包括B帧,仅仅表示I帧在I/P序列中的周期;B帧的位置和数目由跳过帧数FrameSkip和B帧数目NumberBFrames决定。
在H.264中,编码层的语法元素分为了五层结构:序列参数集、图像参数集、条带(slice)、宏块和子块。序列层和图像层被取消了,并将二者的头结构中的数据分离出来形成了参数集。在解码过程中,图像参数集会参考序列参数集,而条带会参考图像参数集,真正在编解码中发挥具体作用的是条带这一结构。参考同一个图像参数集的各个条带,并不一定属于同一帧图像。
H.264定义了IDR图像,通常是一串图像序列的第一帧。引入该概念是为了解码同步的因素,当解码器解码到一个IDR图像时,立刻清空参考帧队列,输出或抛弃解码的数据并重新查找参数集,开始一个新的序列。
(五)HEVC及其RPS