ELECARD 视频压缩手册第四章:HEVC中的运动补偿

本文是对 ELECARD Video Compression Book 第四章的翻译。本章节介绍了HEVC 中的运动矢量预测算法:参考图像信息和运动矢量预测。

题目:Motion compensation in HEVC
作者:Oleg Ponomarev
文章地址:https://www.elecard.com/page/motion_compensation_in_hevc
内容整理:杨晓璇; 原标题:[强基固本-视频压缩] 第四章: HEVC中的运动补偿

引言

HEVC 标准实现了参考图像信息和运动矢量预测理念,提供了最佳的帧间预测质量。这包括以 1/4 像素的精度指定预测矢量、使用单向和双向预测、自适应地改变被预测图像区域的形状和大小、创建长参考帧列表(多达 15 个元素),以及使用运动矢量预测算法,从而只将有关差分矢量 (mvd) 的信息添加到编码流中。这一切是如何实现的呢?让我们一探究竟。

参考图像信息

显然,要实现帧间预测,编码和解码系统必须有一个内存缓冲区来存储解码图像。这个缓冲区被称为 DPB (Decoded Picture Buffer)。DPB 中的一些图像“等待”轮到它们在屏幕上显示(在解码系统中),而其他图像则留在缓冲区中,以便在编码其他视频帧时进行帧间预测。在编码过程中,必须以某种方式对用于帧间预测的帧进行标记,并将这些标记的信息添加到已编码的视频流中。HEVC 中有两种类型的此类标签。第一种称为短期参考。它用于标记 DPB 中的图像,这些图像可用作当前帧或两个最近的后续视频帧(按解码顺序)中图像块的预测参考帧。第二类标签称为长期参考,涉及 DPB 中可用于预测与当前帧相距两帧以上的帧中的图像块(同样按照解码顺序)的帧。DPB 中所有未标记为短期参考或长期参考的图像都被视为未使用的参考,以后不能用于执行帧间预测。有关这些标记的信息被添加到编码视频流中每个帧的标头中。这些信息被称为参考图像集(RPS)。

编码视频流中的每一帧都有一个标识符或 POC (Picture Order Counter)。最简单的解释是,POC 值可视为视频序列中图像的序号。编码系统将用于确定 POC 的信息放入每幅图像的编码流中。因此,DPB 中的所有解码图像都有唯一的 POC 值。正是这些值被用来标记 DBP 中的短期参考和长期参考视频帧。

注意:实际上,每个帧的 POC 值在整个视频序列中并不是唯一的。通常,已编码的 HEVC 数据流包含使用帧内预测(或称 I 帧)编码的帧。当然,解码此类帧不需要参考图像。当视频序列中这种 I 帧之后的所有帧仅使用位于 I 帧之后的参考帧进行预测(单向或双向)时,该 I 帧的 POC 值将被设为零。因此,POC 值只有在通过 P 或 B 预测相互关联的一组视频帧中才是唯一的。还需注意的是,在对 I 帧进行解码或编码时,所有 DPB 内容都会被标记为未使用的参考内容,换句话说,参考图像集(RPS)会被清除。

首先,编码流中的 RPS 描述中会添加有关被标记为短期参考帧的 POC 值的信息。由于并非所有进入 RPS 的参考图像都会被用于预测当前视频帧,因此 RPS 描述中的每个 POC 值都会附加一个标志(一个比特),如果该标志为 0,则表示该参考图像未被用于预测当前帧。反之,如果该标志的值为 1,则表示该参考图像用于预测当前视频帧。

被标记为长期参考帧的位置信息在 RPS 中形成一个单独的列表。该列表包含 POC 值(这里的状态有很多种,但不必纠结于此),每个 POC 值都附有一个比特的标志值。该标志的作用与短期参考标志相同。如果其值为 1,则表示该参考图像用于预测当前视频帧。

在帧间预测的准备阶段,DPB 中标记为短期参考或长期参考的帧的 POC 值将用于创建参考图片列表。在进行单向预测(P-预测)时,会创建一个这样的列表,称为 RefPicList0。对于 B-预测,会创建两个列表:RefPicList0 和 RefPicList1。当然,这些列表仅由 DPB 中 RPS 中标志设置为 1 的标记帧的 POC 值组成。POC 值会一直增加,直到列表满为止。开始时,RefPicList0 列表中填入的是视频序列中当前帧之前的短期参考帧的 POC 值,即 POC 值低于当前帧 POC 值的参考帧。这些帧按 POC 值降序排序,即 RefPicList0 列表中的最低索引属于 POC 值与当前帧 POC 值最接近但不超过当前帧 POC 值的短期参考帧。如果添加后列表未满,则会连续填充 POC 值高于当前帧 POC 的所有短期参照帧。这些帧按 POC 值升序排序。最后,如果列表仍未填满,则将在 RPS 中标记为长期参考的帧填入列表。

RefPicList1 列表的形成方式与此类似,唯一不同的是,它首先填充的是 POC 值高于当前帧 POC 的短期参考帧。与之前一样,这些帧按 POC 值升序排序。接下来,在列表中加入 POC 值低于当前帧 POC 的短期参照帧,按 POC 值降序排序。最后,在 RefPicList1 列表中加入标记为长期参考帧的 POC 值。

这样形成的 RefPicList0 和 RefPicList1 列表可以将这些列表中存储的参考图像索引作为指向 DPB 中特定帧的指针,用于预测当前视频帧中正在编码的块。

运动矢量预测

在 HEVC 中,对每个正在编码或解码的块进行运动矢量预测的结果是一个包含两个运动矢量的列表。对于正在编码的每个图像块,编码的视频流会带有一个值为 0 或 1 的索引,表示哪个列表元素将被用作运动矢量预测(mvp)。

形成这一列表的主要思路是,当前块的运动矢量很有可能与之前编码的相邻块的运动矢量差别不大,因此可以将其用作预测。这个简单的想法还有另一个补充。参考帧列表极有可能包含与当前帧略有不同的帧。因此,参考帧列表中某一帧中与正在编码的块处于相同或几乎相同位置的块的运动矢量很可能是一个很好的预测。总的来说,这个列表是由位于当前帧中相邻块 CandA 和 CandB (见图 1)的两个运动矢量以及位于其中一个参考帧中的所谓同位块的运动矢量组成的。参考帧的索引包含当前图像所有块的同位块,该索引在图像编码的标头部分进行传输。

两个候选列表的形成过程如下。首先,如果 CandA 和 CandB 两个块的运动矢量都可用(即它们存在并已被编码),且在帧间预测模式下被编码,并且彼此不同,则将它们添加到列表中。如果这些块的运动矢量完全相同,则只会有一个矢量被添加到列表中。如果在添加相邻块 CandA 和 CandB 的运动矢量后,列表中仍不包含两个元素,则会添加同位置块的运动矢量。如果列表中仍然没有完整的运动矢量,则将用零运动矢量填充空白位置。

ELECARD 视频压缩手册第四章:HEVC中的运动补偿
图 1. 相对于当前编码块的候选块位置示例(以灰色显示)

CandA 候选块从位于当前块左侧的两个块 CandA0 和 CandA1 中选出。如前所述,HEVC 允许自适应地将视频图像划分为多个块进行编码。因此,位于当前块左侧的块有多种可能的配置。图 1 显示了其中几种配置。在图 1 中,CandA0 和 CandA1 两块图像之间的选择是由两个像素点的位置决定的,这两个像素点分别表示为 PA0 和 PA1。CandA0 是包含 PA0 的图像块,CandA1 是包含 PA1 的图像块。

CandB 候选块从 CandB0、CandB1 和 CandB2 三个块中选出。选择由图 1 中 PB0、PB1 和 PB2 三个像素的位置决定。CandB0 是包含 PB0 的块,CandB1 是包含 PB1 的块,CandB2 是包含 PB2 的块。

简而言之,形成两个块{CandA, CandB}列表的第一步是从块 CandA0 和 CandA1 中选择一个候选块,从块 CandB0、CandB1 和 CandB2 中选择另一个候选块。选择是按照候选块的数字顺序进行的。换句话说,当选择 CandA 块时,首先检查 CandA0,然后是 CandA1。检查验证是否满足以下条件:

  1. 候选块已被编码,特别是在帧间预测模式下。
  2. 候选块与待编码块的参考帧相同。

如果两个条件都满足,候选块就会被放入{CandA, CandB}列表的相应位置。例如,如果块 CandA0 已在区间预测模式下编码,且与待编码块的参考帧相同,则将其作为 CandA 放入列表。如果没有候选块满足条件 2,则将第一个满足条件 1 的候选块放入列表。在这种情况下,要使用该图块的运动矢量作为 mvp,需要根据下式进行缩放:

ELECARD 视频压缩手册第四章:HEVC中的运动补偿

其中,tb 是待编码帧的 POC 值与待编码块的参考帧之间的差值;tb 是包含列表中块的帧的 POC 值与其参考帧之间的差值;mv 是列表中块的运动矢量。图 2 展示了这里引入的符号。

ELECARD 视频压缩手册第四章:HEVC中的运动补偿
图 2. 用于缩放的符号。图中的示例为tb = 25 – 23 = 2tb = 23 – 19 = 4

如果候选块 CandA0 和 CandA1 都不满足条件 1,则将候选块 CandB0、CandB1 和 CandB2 中的第一个可用块作为 CandA 元素放入列表。

如前所述,如果在检查完空间候选块后,列表 {CandA, CandB} 仍未全部填满,则会在列表中添加所谓的同位块。该块位于参考帧中,参考帧的编号包含在编码帧的标头部分。同位块可以是参考帧中的两个候选块之一,其相对于被编码块的坐标如图 3 所示。如果包含像素  的候选块满足作为同位块使用的条件(即已在间预测模式下编码,且属于与被编码块编号相同的 LCU),则将其置于列表 {CandA,CandB} 中的第一个空缺位置。否则,包含像素 С1 的候选块将被放在该位置上,前提同样是它满足作为同位块的条件。

将共定位块添加到列表 {CandA、CandB} 后,列表中剩余的空位置将填充零运动矢量。

ELECARD 视频压缩手册第四章:HEVC中的运动补偿
图 3. 共建块的位置

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论