HEVC码流中的NALU

翻译自 High Efficiency Video Coding (HEVC) Algorithms and Architectures

HEVC的“high-level syntax”部分包括适用于位流的一个或多个完整Slice或图像的高级信息的信令。例如,高级语法表示视频的空间分辨率,使用了哪些编码工具,并描述了比特流的随机访问功能。除了语法元素的信号外,与语法元素相关的高级工具解码过程也被认为包含在标准的高级语法部分中。示例高级语法解码过程包括参考图片管理和解码图片的输出。

图2.1显示了一个HEVC编码器和解码器。输入图片被送入编码器,编码器将图片编码成比特流。HEVC位流由称为网络抽象层(NAL)单元的数据单元序列组成,每个单元包含一个整数字节。NALU的前两个字节构成NALU头,而NALU的其余部分包含有效载荷数据。一些NALU携带参数集,其中包含应用于一张或多张完整图片的控制信息,而其他NALU携带单个图片中的编码样本。

NALU由解码器解码以产生解码器输出的解码图像。编码器和解码器都将图片存储在已解码的图片缓冲区(DPB)中。这个缓冲区主要用于存储图片,以便以前编码过的图片可以用来生成预测信号,在编码其他图片时使用。这些存储的图片称为参考图片(reference pictures)。

The NAL Unit Header and the HEVC Bitstream

在HEVC中有两类NALU——视频编码层(VCL) NALU和非VCL NALU。每个VCL NALU携带编码图像数据的一个Slice段,而非VCL NALU包含通常与多个编码图像相关的控制信息。一个编码图像,连同与编码图像相关联的非VCL NALU,称为HEVC访问单元(access unit, AU)。没有要求AU必须包含任何非VCL NALU,并且在一些应用程序(如视频会议)中,大多数AU不包含非VCL NALU。但是,由于每个AU都包含一个编码图像,因此它必须由一个或多个VCL NALU组成——编码图像被分割成的每个Slice对应一个单元。

The NAL Unit Header

图2.2显示了NALU Header的结构,它有两个字节长。所有HEVC NALU Header,对于VCL和非VCL NALU,都从这个两字节的NALU头开始,旨在使解析NALU的主要属性变得容易;它是什么类型,以及它属于什么层和时态子层。

NALU报头的第一个位总是设置为’0’,以防止在遗留的MPEG-2系统环境中产生可能被解释为MPEG-2启动代码的位模式。接下来的六位包含NALU的类型,标识NALU中携带的数据类型。6位表示有64种可能的NAL单位类型值。这些值在VCL和非VCL NALU之间平均分配,因此它们各有32种类型。

下面的6位包含一个层标识符,表示NALU属于哪个层,用于将来的可扩展和分层扩展。虽然第一版HEVC于2013年6月发布,支持时间可扩展性,但它不包括任何其他可扩展或分层编码,因此第一版中所有NALU的层标识符(层ID)始终设置为“00000o”。在以后的HEVC版本中,层ID有望用于识别NAL属于哪个空间可扩展层、质量可扩展层或可扩展多视图层。

NALU Header的最后三位包含NALU的时间标识符,表示七个可能的值,其中一个值是禁止的。HEVC中的每个AU都属于一个时间子层,由时间ID表示。由于每个AU属于一个时间子层,所有属于同一AU的VCL NALU在其NALU头中必须具有相同的时间ID。

图2.3显示了编码视频序列中图片的两个不同示例参考结构,两个时态子层都对应于0和1的时态ID值。Slice类型在图中使用I、P和B表示,箭头显示了图片如何参考其他图片。例如,图2.3a中的图B2是使用bi-prediction的图片,参考图片Io和Pl。

VCL NAL Unit Types

表2.1显示了所有32个VCL NALU类型及其NALU类型(图2.2中的NALType)在NAL单元头中的值。所有VCL相同AU的NALU必须具有相同的NALU类型值,该值定义了AU的类型及其编码图。例如,当一个AU的所有VCL NALU的NALU类型都等于21时,则该AU称为CRA AU,编码图像称为CRA图像。在HEVC中有三种基本类型的图像: intra random access point (IRAP) pictures, leading pictures, and trailing pictures.

IRAP Picture

IRAP图像类型由NAL单元类型16-23组成。这包括IDR, CRA和BLA图片类型以及类型22和23,这些类型目前保留供将来使用。所有IRAP图片必须属于时间子层0,并且不使用任何其他图片的内容作为参考数据进行编码(即仅使用intra编码)。注意,但未标记为IRAP的帧内编码图片允许在比特流中出现。IRAP图片类型用于在比特流中提供可能开始解码的点。因此,IRAP图片本身不允许依赖于比特流中的任何其他图片。

比特流的第一张图片必须是IRAP图片,但在整个比特流中可能有许多其他IRAP图片。IRAP图像还提供了切换比特流的可能性,例如当开始观看TV或从一个TV频道切换到另一个频道时。IRAP图片还可以用于在视频内容中实现时间定位——例如,通过使用视频播放器的控制条来移动视频程序中的当前播放位置。最后,IRAP图片还可以、用于在压缩域中从一个视频流无缝切换到另一个视频流。这被称为比特流切换或拼接,它可以发生在两个直播视频流之间,一个直播流和一个存储的视频文件之间,或者两个存储的视频文件之间。从IRAP图像解码并按输出顺序输出任何后续图像始终是可能的,即使按解码顺序在IRAP图像之前的所有图像都从比特流中丢弃。

当为存储和稍后的播放或广播应用程序编码内容时,IRAP图片通常均匀分布,以在整个比特流中提供相似频率的随机接入点。在实时通信应用中,随机访问功能不是那么重要,或者发送IRAP图片所需的相对大量的比特是一个显著的负担,会增加通信延迟,IRAP图片可能很少发送,或者只有当一些反馈信号表明视频数据已经损坏,需要刷新场景时才发送。

Leading and Trailing Pictures

leading picture 是在解码顺序上跟随特定IRAP图并在输出顺序上先于它的图。trailing picture 是在解码顺序和输出顺序上都遵循特定IRAP图片的图片。图2.4展示了leading picture和trailing picture 的例子。在解码顺序上,leading picture和trailing picture 被认为与最接近的IRAP图像相关联,如图2.4中的I1图像。trailing picture必须使用trailing picture NAL单元类型0-5中的一种。特定IRAP图片的trailing picture不允许依赖于任何leading picture或之前IRAP图片的 trailing picture;相反,它们只能依赖于相关的IRAP图片和同一IRAP图片的其他 trailing picture 图片。此外,IRAP图像的所有leading picture必须在解码顺序中位于与同一IRAP图像相关联的所有trailing picture之前。这意味着关联图片的解码顺序总是:(1)IRAP图片,(2)关联的leading picture(如果有),然后(3)关联的trailing picture(如果有)。

HEVC的trailing picture有三种类型:时间子层访问(TSA)图像、逐级时间子层访问(STSA)图像和普通trailing picture (TRAIL)。

Temporal Sub-layer Access (TSA) Pictures

TSA图像是显示时间子层切换点的trailing picture。TSA图片类型只能用于没有在解码顺序中TSA图片之前的,其时间ID大于或等于TSA图片本身的时间ID,用于预测TSA的图片或用于预测与TSA图片在相同或更高的时间子层中的任何后续(解码顺序)图片。例如,图2.5中的图片P6可以使用TSA图片类型,因为只使用时间子层0中的前一张图片来按照解码顺序预测TSA图片本身和后续图片。

当解码器解码位流中时间子层的子集并且遇到时间子层的TSA图像类型正好在它正在解码的最大时间子层之上时,解码器可以切换到并解码任意数量的附加时间子层。对于图2.5中的示例,仅对TSA 图像的时间子层0进行解码的解码器(1)只解码时域子层0,(2)决定开始解码时域子层1和子层0,或(3)开始解码所有三个子层。对于只转发最低的时间子层的网络节点(例如由于先前的网络拥塞情况),可能会有类似的动作。网络节点可以检查具有时间ID等于1的传入图片的NAL单元类型。这并不需要大量的计算资源,因为NAL单元类型和时间ID可以在NAL单元头中找到,并且很容易解析。当遇到时序子层1的TSA图像时,网络节点可以切换到按照解码顺序转发继TSA图像之后的任何时序子层图像,而不会存在解码器由于没有所有必要的参考图像而无法正确解码的风险。

Step-wise Temporal Sub-layer Access (STSA) Pictures

STSA图片类型与TSA图片类型类似,但它只保证STSA图片本身以及在解码顺序上与它后面的STSA图片具有相同时间ID的图片不参考在解码顺序上与它前面的STSA图片具有相同时间ID的图片。因此,STSA图像可以用来标记比特流中可以切换到具有与STSA图像相同时间ID的子层的位置,而TSA图像可以标记比特流中可以切换到任何更高子层的位置。图2.5中STSA图的一个例子是图P2。这张图片不可能是TSA图片,因为P3参考了P1。但图片P2可以是STSA图片,因为P6没有参考任何子层1的图片,解码顺序在P2之后的任何子层1的图片也没有参考解码顺序在P2之前的任何子层1的图片。TSA和STSA图片的时间ID都必须大于0。

还要注意的是,由于在HEVC中禁止从较高的时间子层预测到较低的时间子层,因此在任何图片上总是有可能向下切换到较低的时间子层,无论图片类型或时间子层。

Ordinary Trailing (TRAIL) Pictures

普通trailing图片用枚举类型TRAIL表示。trailing图片可以属于任何时间子层。它们可以参考关联的IRAP图片和与同一IRAP图片关联的其他trailing图片,但它们不能参考leading图片(或与同一IRAP图片关联的任何其他非trailing图片的图片)。在按解码顺序输出下一张IRAP图片后,它们也不能输出。请注意,所有TSA和STSA图片都可以标记为TRAIL图片,所有TSA图片都可以标记为STSA图片。然而,为了表明比特流中存在的所有可能的时间子层切换点,建议跟踪图片应使用最具限制性的类型。

Instantaneous Decoding Refresh (IDR) Pictures

IDR图像是一个完全刷新解码过程并开始一个新的CVS的帧内图像。这意味着,无论是IDR图像还是按解码顺序在IDR图像之后的任何图像,都不能依赖于按解码顺序在IDR图像之前的任何图像。IDR图像有两种子类型,IDR_W_RADL类型可能有关联的随机访问可解码leading(RADL)图像,IDR_N_LP类型没有任何leading图像。请注意,即使IDR图片没有任何leading图片,编码器也允许(但不推荐)使用IDR_W_RADL类型。但是,禁止将IDR_N_LP类型用于具有先导图像的IDR。使用两种不同的IDR图片类型的原因是为了使系统层能够在随机访问时知道IDR图片是否是要输出的第一个图片。IDR图像的POC值总是等于零。因此,与IDR图像相关联的leading图像(如果有的话)都具有负的POC值。

Clean Random Access (CRA) Pictures

CRA图片是一个帧内图片,与IDR图片不同,它不会刷新解码器,也不会开始一个新的CVS。这使得CRA图像的leading图像以解码顺序依赖于在CRA图像之前的图像。允许这样的leading图像通常使包含CRA图像的序列比包含IDR图像的序列更具压缩效率(约6%)。

CRA图像的随机访问是通过对CRA图像进行解码,其leading图像在解码顺序上不依赖于CRA图像之前的任何图像,以及在解码和输出顺序上都遵循CRA的所有图像。注意,CRA图片不一定有关联的leading图片。

Random Access Decodable Leading (RADL) and Random Access Skipped Leading (RASL) Pictures

leading图像必须使用RADL或RASL NAL单元类型发出信号。RADL和RASL图片可以属于任何时间子层,但不允许被任何trailing图片引用。RADL图片是保证在对关联的IRAP图片进行随机访问时可解码的leading图片。因此,RADL图片只允许引用关联的IRAP图片和同一IRAP图片的其他RADL图片。

当从关联的IRAP图像执行随机访问时,RASL图像是可能无法解码的先导图像。图2.6显示了两张RASL图片,由于图片P2在解码顺序上位于CRA图片之前,因此这两张图片都是不可解码的。由于其在解码顺序上的位置,在CRA图片的位置随机访问不会解码P2图片,因此无法解码这些RASL图片并将其丢弃。尽管对于可解码的leading图,如图2.6中的RADL图,不禁止使用RASL类型,但为了更加网络友好,建议在可能的情况下使用RADL类型。只有其他RASL图片被允许依赖于一个RASL图片。这意味着依赖于RASL图像的每个图像也必须是RASL图像。RADL和RASL图像可以按解码顺序混合,但不能按输出顺序混合。RASL图片在输出顺序上必须在RADL图片之前。

IDR_W_RADL图片的所有前导图片必须是可解码的,并且使用RADL类型。RASL图片不允许与任何IDR图片相关联。CRA图可能同时具有关联的RADL和RASL图,如图2.6所示。允许RASL图片引用在相关IRAP图片的IRAP图片,也可以参考在解码顺序中遵循该IRAP图片的其他图片,但不能引用解码顺序中更早的图片。图2.6中的RASL图片无法引用图片P0。

在HEVC中有三个约束,目的是在执行随机访问时消除图像输出不均匀。其中两个约束依赖于为每张图片设置的变量PicOutputFlag,它指示图片是否输出。当一个被称为pic_output的标志出现在slice header中并且等于0时,或者当当前图片是RASL图片并且关联的IRAP图片是CVS中的第一张图片时,这个变量被设置为0。否则,PicOutputFlag被设置为1。

第一个约束是,任何具有PicOutputFlag等于1的图片,在解码顺序上位于IRAP图片之前,必须在输出顺序上位于IRAP图片之前。图2.7a中的结构不受此约束,因为图像P1在解码顺序上位于CRA之前,但在输出顺序上位于它之后。如果允许这样做,并且对CRA图片进行随机访问,则会丢失图片P1,导致输出不均匀。

第二个约束是,任何具有PicOutputFlag等于1的图像,在解码顺序上位于IRAP图像之前,必须在输出顺序上位于与IRAP图像相关联的任何RADL图像之前。一个引用结构,即如图2.7b所示,因为P1在I2之前,但在输出顺序上在P3之后。如果允许这种引用结构,并且对CRA图片进行随机访问,则缺少P1图片将导致输出不均匀。

第三个约束是所有RASL图片必须在输出顺序上先于任何RADL图片。由于RASL图片在随机访问时被丢弃,而RADL图片没有被丢弃,因此在RADL图片之后显示的任何RASL图片在随机访问时可能会导致输出不均匀。

其他类型用的比较少,这里就不写了。

《HEVC码流中的NALU》有一个想法

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注