• 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的差值

    如图所看到的:


    图中,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;



    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组。


    整个过程如图所看到的:



    图中给每个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。




    对于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改动顺序得到。



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





  • 相关阅读:
    编译资源收集
    volatile和synchronized到底啥区别?多图文讲解告诉你
    沙雕与大婶 | Mock掉你的外部依赖吧
    全网最详细的一篇Flutter 尺寸限制类容器总结
    一篇带你看懂Flutter叠加组件Stack
    【MySQL】:事务四大特性与隔离级别
    Dubbo 入门-细说分布式与集群
    Java 线程基础知识
    SpringBoot图文教程9—SpringBoot 导入导出 Excel 「Apache Poi」
    搭建博客、自己的小窝?快来看看这些开源静态网站生成器
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7219506.html
Copyright © 2020-2023  润新知