回顾:让人崩溃的GOP(下)——HEVC及其RPS

原载:http://blog.sina.com.cn/s/blog_520811730101n5zw.html

定义了视频序列中重复出现的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:当前帧所保有的参考帧数,包括当前帧以及未来帧所用到的参考帧;

    referencepictures:保存相对于当前帧POC的参考帧的POC,数量又num_ref_pics指定。

    predict:定义inter_ref_pic_set_prediction_flag的值。0表示编码RPS不需要RPS预测,并忽略后面的deltaRIdx-1, deltaRPS等参数;1表示需要RPS预测,使用deltaRIdx-1, deltaRPS, num refidcs和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。

该文档举例如下图所示:

 

该序列的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中不存在,解码器便可以检测到参考帧意外丢失发生。这时解码器可以创建一个隐藏帧,或者通过反馈渠道向编码端发送消息。

 

你可能感兴趣的:(回顾:让人崩溃的GOP(下)——HEVC及其RPS)