HEVC的参考队列解码


        参考队列是指在进行帧间解码时,P或者B slice所参考的已解码的,位于解码图像缓存中(DPB, decoded picture buffer)中的图像队列,类似h264中的reflist0和reflist1。涉及到整个DPB的管理和参考帧的选择。

        本文中讨论的都是slice为P,B的情况,slice为I类型时,没有参考帧。

1. 短期参考图像参数集

        首先介绍一下短期参考图像参数集(Short-term reference picture set ), 简称short-term RPS,储存着有关short term参考帧选择的信息。short-term RPS可能会出现在SPS或者slice header中。


否则(short_term_ref_pic_set(stRpsIdx )出现在SPS中),short_term_ref_pic_set( stRpsIdx) 结构代表short-termRPS的一个候选值。在SPS中最多有64个short term RPS。


当解码到一个slice的时候,该使用哪个short term RPS呢?有两种情况:

情况1:参数short_term_ref_pic_set_sps_flag(位于slice header中)为0时,这种情况下,码流中会有一个参数short_term_ref_pic_set_idx,这个参数给出当前slice该选择的short term RPS的序号。在SPS中有0~64个short term RPS以供检索。

情况2:short_term_ref_pic_set_sps_flag为1时,slice header中会有一个short term RPS的结构,供整个picture使用。


short term RPS的解析也有两种情况:

情况1.参数inter_ref_pic_set_prediction_flag为1,RPS的内容从另一个RPS预测得来。

情况2.inter_ref_pic_set_prediction_flag为0,直接解析得到。


short term RPS的解析过程不在这里详细说明,具体可见HEVC标准。

经过解析后,我们能够得到一系列的entry和两个值NumNegativePics和NumPositivePics,分别给出poc小于和大于当前slice的poc的参考帧的数量,每一个entry包含两个值:

1.UsedByCurrPic:表示是否被当前帧使用

2.DeltaPoc:与当前帧的POC的差值

如图所示:

HEVC的参考队列解码_第1张图片

图中,NumNegativePics=5,NumPositivePics = 4。

分析到这里先放一放,我们来看另一组参数。

 2.长期参考图像参数集

如果码流采用了long term 参考时。

在SPS中存储着num_long_term_ref_pics_sps(设为n0)个entry,每个entry也包含两项UsedByCurrPicDeltaPoc

slice header中的参数num_long_term_sps(设为n1)给出从sps中采用的long term entry的个数,参数num_long_term_pics(设为n2)给出包含在slice header中的long term entry的个数。slice header中还包含n1个的lt_idx_sps,根据这些lt_idx_sps给出的序号,从SPS的n0个long term entry中选择n1个和slice header中的n2个组成long term entry的序列。

如图:n1 = 3, n2 = 2;

HEVC的参考队列解码_第2张图片


3.参考图像列表修正

参考图像列表修正结构(Reference picture list modification)位于sliceheader中。

参数ref_pic_list_modification_flag_l0:若其值为1表示参考图像列表0通过list_entry_l0[i]被显式指定,默认值为0。

参数list_entry_l0[i]:给出RefPicListTemp0中用以替代当前值的索引。

参数ref_pic_list_modification_flag_l1:若其值为1表示参考图像列表0通过list_entry_l1[i]被显式指定,默认值为0。

参数list_entry_l1[i]:给出RefPicListTemp1中用以替代当前值的索引。


4.RPS解码过程和RefList的构建

遍历short term RPS的所有entry,利用deltapoc计算得到参考帧的poc,并将used = 1且poc小于当前slice的放入PocStCurrBefore组。将used = 1且poc大于当前slice的放入PocStCurrAfter组。将used = 0的放入PocStFoll组。


遍历long term RPS的所有entry,利用deltapoc计算得到参考帧的poc,并将used = 1的放入PocLtCurr组,将used = 0的放入PocLtFoll组。


整个过程如图所示:

HEVC的参考队列解码_第3张图片


图中给每一个entry都添加了标号。根据deltaPoc计算得出的poc记做Pn(P1,P2,.... P14)。这样就得到了PocStCurrBefore,PocStCurrAfter,PocStFoll,PocLtCurr和PocLtFoll共5组poc。


DPB中的图像会被标记为used for short-term reference(短期参考),used for long-term reference(长期参考)或者unused for reference(不被参考),且只能为其中的一种状态。


然后进行如下步骤:


1. 

遍历PocLtCurr组中的POC,如果DPB中某帧图像的poc和组中的某个poc相同,则这帧图像属于RefPicSetLtCurr组。

遍历PocLtFoll组中的POC,如果DPB中某帧图像的poc和组中的某个poc相同,则这帧图像属于RefPicSetLtFoll组。

2. 

RefPicSetLtCurrRefPicSetLtFoll组中的图像都被标记为used for long-term reference。

3. 

遍历PocStCurrBefore组中的POC,如果DPB中某帧图像的poc和组中的某个poc相同,则这帧图像属于RefPicSetStCurrBefore组。

遍历PocStCurrAfter组中的POC,如果DPB中某帧图像的poc和组中的某个poc相同,则这帧图像属于RefPicSeStCurrAfter组。

遍历PocStFoll组中的POC,如果DPB中某帧图像的poc和组中的某个poc相同,则这帧图像属于RefPicSetStFoll组。

4.

凡是不在RefPicSetStCurrBefore, RefPicSetStCurrAfter, RefPicSetStFoll, RefPicSetLtCurr和RefPicSetLtFoll这5个组中的图像即被标记为unused for reference。(也就是说,RefPicSetStCurrBefore,RefPicSetStCurrAfterRefPicSetStFoll组中的图像标记为了used for short-term reference)

如图,假设DPB中共有6帧图像,其POC分别是P1, P2, P6, P10, P11和P15。则根据以上步骤,得到图中结果,P15被标记为unused for reference。


HEVC的参考队列解码_第4张图片


对于P slice来说,只有前向参考列表RefPicList0,对于B slice来说,有RefPicList0和后向参考列表RefPicList1.

RefPicListTemp0按照顺序RefPicSetStCurrBefore,RefPicSetStCurrAfter和RefPicSetLtCurr组成。

RefPicListTemp1按照顺序RefPicSetStCurrAfter,RefPicSetStCurrBefore和RefPicSetLtCurr组成。

按照Reference picture list modification中的内容,可以得到最终的参考list,RefPicList0RefPicList1

如图所示:

根据以上步骤,可以得到RefPicListTemp0中图像的POC为P1,P6和P10,RefPicListTemp1中的图像为P6,P1和P10。

ref_pic_list_modification_flag_l0为0,则RefPicList0完全和RefPicListTemp0相同。

ref_pic_list_modification_flag_l1为1,则RefPicList1需要根据list_entry_l1修改顺序得到。

HEVC的参考队列解码_第5张图片

有了RefPicList0RefPicList1就可以进行运动向量的解码,预测和计算了,运动补偿也要用到。





你可能感兴趣的:(视频,解码,多媒体,HEVC)