GOP

原文地址: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

【参考文献主要来自HM代码自带的software-manual.pdf和Overview of HEVC High-Level Syntax and Reference Picture Management
GOP in HEVC
software-manual.pdf in HM-10.0, p2
定义了视频序列中重复出现的GOP帧结构。在配置文件的的Coding Structure部分,定义了I帧结构,DecodingRefreshType和GOPSize;此外还有GOP种每一帧的参数设置,列表中按照解码顺序排列。各个帧的参数设置中指定了当前以及以后用到的参考帧等数据。其中各个参数的具体含义如下:
    Type:条带类型,为I,B,P之一;
    POC:GOP内图像的显示顺序,取值范围为1-GOPSize;
    QPOffset:量化参数偏移量,用于计算本帧的实际量化参数;
    QPFactor:用于率失真优化的权值;
    tcOffsetDiv2:环路滤波器参数的偏移量;
    betaOffsetDiv2: 环路滤波器参数的偏移量;
     temporal_id:当前帧所在的时域子层的序号;
    num_ref_pics_active:参考图像列表(reference picture lists )L0和L1的大小;表明在编码过程中使用了多少个参考帧;
    num_ref_pics:当前帧所保有的参考帧数,包括当前帧以及未来帧所用到的参考帧;
    reference pictures:保存相对于当前帧POC的参考帧的POC,数量又num_ref_pics指定。
    predict:定义inter_ref_pic_set_prediction_flag的值。0表示编码RPS不需要RPS预测,并忽略后面的deltaRIdx-1,  deltaRPS 等参数;1表示需要RPS预测,使用 deltaRIdx-1, deltaRPS, num ref idcs和Reference idcs;2表示需要RPS预测,但仅使用 deltaRIdx-1;
     deltaRIdx-1:当前RPS索引同预测RPS索引的差值-1;
     deltaRPS:预测RPS同当前RPS的POC之差;
    num_ref_idcs:编码当前RPS的ref_idcs的数量;
    reference_idcs:指定RPS间预测的ref_idcs。
该文档举例如下图所示:
GOP_第1张图片
该序列的GOPSize=4,Frame 1对应POC=4,参考POC=0,因此-4为参考帧;Frame 2对应POC=2,参考POC=0、4,因此参考帧为2,-2;Frame 3对应POC=1,参考POC=0、2,也要参考POC=0、4,因此参考帧为-1,1,3;Frame 4对应POC=3,参考帧为-1,1;
Frame 2-4 支持RPS间预测,因此predict参数设置为1;Frame 2 使用Frame1作为predictor,因此 deltaRIdx-1设置为0,同理可得Frame 3、4的 deltaRIdx-1 值; deltaRPS为参数 predict减去当前POC的值;
这两个值的含义区别:根据标准文档的说明, deltaRIdx-1表示选定的短线RPS元素同 stRpsIdx(该值可认为等于当前活动SPS中num_short_term_ref_pic_sets的值,即短线RPS的个数 ),即在predictor中选定一个参考帧【此处尚存疑问......】;deltaRPS的作用是根据当前POC和 deltaRPS寻找predictor。
最后, reference_idcs有一串0/1/2数字组成,共有 num_ref_idcs个。其中最后一个代表该帧的predictor,其余表示predictor的RPS。取0/1/2分别对应该帧为当前帧的参考、后续帧的参考以及不用做参考。

RPS

A. 引言
描述了DPB中解码图像如何管理以用作参考。HEVC的RPS同前期标准的参考帧管理方法完全不同,每一个slice均需标明DPB状态("短期参考/长期参考/非参考")。其目的在于增强容错鲁棒性。

B. 背景

C.RPS概念
HEVC提出来一种全新的参考帧管理方法,对当前和后续图像的每一个slice,均使用一个完整的参考图像集合,所以需要保存DPB中完整图像的集合供当前和后续图像参考。与此不同的是H.264/AVC中只标识了DPB中相关的变化。借助RPS,不再需要之前解码图像的信息来维护DPB中参考帧的状态。

D. RPS举例
根据上图,每一帧的RPS列在下表。
B4的RPS中不包含I0,因此对B4,I0被标记为“不用作参考”,因此I0不能被用作B4以及按解码顺序在B4之后的帧的参考帧。

E. 图像解码和DPB操作的顺序
在H.264/AVC中,当前帧解码完成后,进行参考帧标记和DPB操作(从缓存中输出和移出图像);在HEVC中,首先从当前帧的slice头中解码出RPS,并在解码当前帧之前进行参考帧标记和DPB操作。

F. RPS数据传递
HEVC中每一个slice header都要包含当前帧的RPS数据(IDR条带除外,其RPS隐含为空);除此之外,即使是I帧的slice可能也包含RPS数据,因为按照解码顺序在它后面的帧可能会参考它之前的数据;RPS中图像的数量不能超过DPB的大小。
RPS使用POC标识参考帧,除了所在当前帧的POC之外,每一个slice header都直接包含(或者继承自SPS)RPS中每一帧图像的POC。
每个图像的RPS包含5个不同的参考图像表:
    RefPicSetStCurrBefore:解码和输出顺序均在当前帧之前的短线参考帧,可用于当前帧的帧间预测;
    RefPicSetStCurrAfter:解码顺序在当前帧之前,输出顺序在当前帧之后的短线参考帧,可用于当前帧的帧间预测;
    RefPicSetStFoll:按解码顺序在当前帧之后的图像可用的短线参考帧,不能用于当前帧的帧间预测;
    RefPicSetLtCurr:可用于当前帧的帧间预测的长线参考帧;
    RefPicSetLtFoll: 按解码顺序在当前帧之后的图像可用的长线参考帧,不能用于当前帧的帧间预测;
RPS根据参考图像类型的不同,分别使用三个循环迭代来传递数据:POC比当前帧更低的短线参考帧、POC比当前帧更高的短线参考帧、长线参考帧;除此之外,还将为每一帧传递一个标识used−by−curr−pic−X−flag来说明是否用作了当前帧的参考帧;
下图为一组图像的例子:
在上图中,B14这一帧包含了上述5个不同的RPS子集的元素:
    P8:属于 RefPicSetStCurrBefore——该帧在B14之前,且用作B14的参考帧;
    P12:属于 RefPicSetStCurrAfter——该帧在B14解码顺序之后,且用作B14的参考帧;
    P13:属于 RefPicSetStFoll——短线参考帧,不用于当前帧的参考,可用于后续图像(B15)的参考;
    P4:属于 RefPicSetLtCurr——长线参考帧,用于B14的参考;
    I0:属于 RefPicSetLtFoll——长线参考帧,不能用于B14的参考,可用于 后续图像(B15)的参考;
    【疑问:长线和短线具体是怎么区分的?】
1). 传输RPS中的短线参考帧:
RPS的短线参考帧可以直接包含在slice头中。另外slice头可以只包含一个表示索引值的语法元素指向活动SPS中传输的RPS预定义的表。RPS的短线参考帧可使用Intra RPS或者Inter RPS(下一节详述)方式传递。使用Intra RPS时,传递num−negative−pics和num−positive−pics两个参数表示两个参考帧列表的长度,分别包含POC相对当前帧为正和为负的参考帧。表中的每个元素采用定长编码,表示与列表中前一个元素的POC差值-1;
2). 采用Inter RPS传输PRS中的短线参考帧:
所谓Inter RPS,表示编码SPS中的循环RPSs时,可以通过参考SPS中已经编码的其他RPS的方式实现。采用这样的设计源于当前图像的RPS可以从先前解码的图像RPS中预测,因为当前帧的参考帧必须是前帧的参考帧或者前帧自身,只需标记那些帧是参考帧,可用于当前帧的预测。Inter RPS语法由以下组成:指向用作predictor的RPS的索引, predictor PRS和当前PRS的差值,指示那些图像是参考帧及是否用于当前和后续图像预测的标识。
3). 传输PRS中的长线参考帧:
采用长线参考帧必须将SPS中的 long−term−ref−pics−present−flag标志位设为1。slice头中的定长编码字段poc−lsb−lt表示每一个长线参考帧POC的least significant  bits,该值是为某特定长线参考帧传输的码字 pic−order−cnt−lsb的拷贝。除此之外也可以在SPS将一系列长线参考帧表示为POC LSB的列表,并在slice头中设定POC LSB作为该表的索引。语法元素delta−poc−msb−cycle−lt−minus1可用于计算长线参考帧同当前帧的完整POC距离,需要为RPS中与其他参考帧的POC LSB相同的帧指定delta−poc−msb−cycle−lt−minus1值。

G. 图像标记
在解析slice头时,图像标记过程在解码slice数据之前进行,DPB中被标记为“used for reference”但未被包含在RPS中的图像被标记为“unused for reference"。如果图像的used−by−curr−pic−X−flag为0,且被包含在RPS中但是DPB中不存在,则该帧被忽略,但是若used−by−curr−pic−X−flag为1,则意味着该帧本应该用于参考但是发生了丢失,这种情况由解码器处理。
当前帧解码完成后,该帧被标记为“用于短线参考”。

H. POC, FrameNum和不存在的帧
HEVC不传输FrameNum或者产生和处理不存在的帧。由于RPS中包含了DPB中各个参考帧的状态因此不再需要产生和处理不存在的帧。在RPS中参考帧以POC识别,这样即使图像从码流中移除或者出现丢帧的情况下也能确定输出顺序。

I. RPS的差错恢复
只要used−by−curr−pic−X−flag设置为1但DPB中不存在,解码器便可以检测到参考帧意外丢失发生。这时解码器可以创建一个隐藏帧,或者通过反馈渠道向编码端发送消息。


你可能感兴趣的:(HM)