知方号

知方号

H264的长期参考帧LTR

视频编码中为了实现压缩,通过缓存部分图片,通过帧和运动矢量结合生成新帧. 这些帧被叫做参考帧

参考帧以frame_num为索引查找,但是frame num是由最大值的,达到最大值后会被取模,如果frame num达到最大值后取模为0,就索引不到了,这个时候就需要另外一种标记方式,所以参考帧又分为长期参考帧和短期参考帧.

短期参考帧称作STR short term refence,长期参考帧称作LTR long term refence

作用

提高图像质量:

高质量的帧可以提高后续帧的图像质量,在解码内容相似的帧时,可以使参考帧保持更长的时间,这样可以避免稳定情况下传输.

抗网损:

在网损和解码错误的情况下会导致解码器使用到一些低质量的宏块,这些宏块会影响后续帧的画面质量,甚至产生一些呼吸效应.

当缓存了一个LTR帧的时候,解码器就可以从LTR帧获取图像信息,从而保持画面的高质量

参考帧重排序(reordering)

可能看到这里有点懵,突然出现的参考帧重排序是什么?为什么要重排序?一点一点说

我们知道编码一个帧, 这个帧必定是要参考某一个帧或者某几个帧,计算运动矢量,残差数据等等.

那么解码器和编码器就需要同时缓存这些相同得特定帧。 这里就引出一个概念DPB Decoded picture buffer, 也就是我们说得参考帧队列。

编码器 和 解码器同时会缓存一样的参考帧队列,而短期参考帧和长期参考帧在参考帧队列里面是经过排序的,排序的主要原则是:

短期参考帧比长期参考帧索引值小;短期参考帧根据 PicNum 值降序排列长期参考帧LongTermPicNum 值升序排列例如,当三个标记为”用于短期参考”的参考帧对应 PicNum分别为300,302,303 ,两个标记为”用于长期参考”的参考帧对应LongTermPicNum=0,3 。那么初始化列表顺序为:RefPicList0[0] 设置为 PicNum = 303,RefPicList0[1] 设置为 PicNum = 302,RefPicList0[2] 设置为 PicNum = 300,RefPicList0[3] 设置为 LongTermPicNum = 0,RefPicList0[4] 设置为 LongTermPicNum = 3.

那么当解码器接收到一个帧的时候,这个帧的位置并不一定是在队列靠前的位置,重排序就是把参考到的帧放在队列头,让解码器能够迅速拿到这些参考帧信息。

所以这里得出一个结论, 需要重排序的帧就是当前这个帧所要参考的帧。

那么解码器怎么知道接收到的这个帧参考的是哪一个帧呢.

H264的slice head 句法中就做了记录.

句法中,num_ref_idx_l0_active_minus1 - 1表示这个P帧的参考帧数目

ref_pic_list_modification 下记录了这个帧的参考帧信息

ref_pic_list_reordering_flag_l0 指明了是否有重排序的操作,如果有的话就会有一系列句法来执行

reordering_of_pic_nums_idc 指明执行哪种重排序操作,对应操作如下

直到reordering_of_pic_nums_idc 为3的时候跳出。

从上表可以看出:

当reordering_of_pic_nums_idc为0或者1时, 表明当前帧参考了一个短期参考帧, abs_diff_pic_num_minus1+1表示这个参考帧和当前帧的序号差。

当reordering_of_pic_nums_idc为2的时候,表明当前帧参考了一个长期参考帧,long_term_pic_num 表示了这个长期参考帧的序号。

注意:

一个帧可以参考多个短期参考帧和长期参考帧,也就是说这个句法的while循环内可以存在多个reordering_of_pic_nums_idc = 0 的情况或者多个reordering_of_pic_nums_idc = 2的情况。同样,一个帧也可以同时参考短期参考帧和长期参考帧。

LTR的标记(marking)

那么参考帧列表是怎么管理的呢?有些参考帧可能不使用了需要被移除队列,有些参考帧需要被加入队列。这些操作是怎么做的呢?

H264的句法管参考帧的管理叫做参考帧的标记。通过Slice Header里面的dec_def_pic_marking 句法来控制。

no_output_of_prior_pics_flag 仅在当前图像是IDR 图像时出现这个句法元素,指明是否要将前面已解码的图像全部输出。

long_term_reference_flag 与上个图像一样,仅在当前图像是IDR 图像时出现这一句法元素。这个句法元素指明是否使用长期参考这个机制。如果取值为1,表明使用长期参考,并且每个IDR 图像被解码后自动成为长期参考帧,否则(取值为0),IDR 图像被解码后自动成为短期参考帧。

adaptive_ref_pic_marking_mode_flag 指明标记(marking)操作的模式

可以看出在短期参考帧的时候我们一般使用先入先出FIFO模式,而长期参考帧不支持这种模式,仅支持 自适应标记模式,其使用memory_management_control_operation (MMCO)指明操作的具体内容

difference_of_pic_nums_minus1 当memory_management_control_operation 等于 3 或1 时,由 这个句法元素可以计算得到需要操作的图像在短期参考队列中的序号。参考帧队列中必须存在这个图像。

long_term_pic_num 当memory_management_control_operation 等于2 时, 从此句法元素得到所要操作的长期参考图像的序号。

long_term_frame_idx 当 memory_management_control_operation 等于3 或6 ,分配一个长期参考帧的序号给一个图像。

max_long_term_frame_idx_plus1 此句法元素减1 , 指明长期参考队列的最大数目。

max_long_term_frame_idx_plus1 值的范围 0 to num_ref_frames。

当某一帧图像需要被保存成一个长期参考帧的时候,我们需要令MMCO = 4,首先指明长期参考帧的最大数量,如果长期参考帧数量已经满了,需要令MMCO=2,将long_term_idx = ? 的参考帧移除参考帧队列,?为某个长期参考帧的标记,需要自己设置移除哪一个。 再令MMCO=6,将当前帧存为一个长期参考帧,并且给当前帧标记一个long_term_idx,方便后续索引的操作。最后令MMCO=0结束循环

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。