



在视频编码过程中,编码器会按照特定的顺序对视频帧进行编码,这个顺序通常与图像在比特流中出现的顺序以及解码的顺序相同。而输出顺序则是指从解码图片缓冲区(Decoded Picture Buffer,DPB)输出图像的顺序,通常也是视频帧在播放时应该呈现的顺序。
为了提高视频编码效率,视频帧的编码顺序和输出顺序往往是不同的。在实际编码场景中,编码器经常使用金字塔分层预测编码结构 [9] 来提高视频的编码效率。在金字塔分层预测编码结构中,图片组(Group Of Picture,GOP)中的每个图片被分为不同的时域层(Temporal Layer),高时域层的视频帧通常以低时域层的视频帧作为参考帧。在编码过程中,编码器通常使用相对较低的量化步长来编码低时域层的视频帧,以优化整个GOP的率失真性能。这种编码结构可以提高视频编码效率,并在不同的网络带宽下提供适当的视频质量。图2-1所示为GOP长度等于4帧的金字塔预测编码结构中的编码顺序和输出顺序,其中每个矩形框表示一个视频帧,矩形框中的数字表示该帧的编码顺序;下方的横轴表示时间轴,对应的数字是每个视频帧的输出顺序。带有箭头的直线表示参考关系,该直线从参考帧指向编码帧,比如帧3的参考帧包括帧0和帧2。
图2-1 长度为4帧的金字塔预测编码结构中的编码顺序和输出顺序
当视频帧的编码顺序和输出顺序不同时,在解码过程中,解码器需要缓存已经完成解码的帧,然后再按照输出顺序逐一输出每个帧。为了表示每个帧的输出顺序,对于总帧数等于 n 的视频,每个帧的输出顺序可以用0~ n -1之间的整数来表示。所以,表示每个帧的输出顺序将需要花费log 2 n 比特。 n 越大,用于表示输出顺序的比特数越多。例如,一个时长为2小时,帧率是30帧/秒的视频,共有2×3600秒×30帧/秒=216000帧。由于log 2 (216000) = 18,因此这个视频中每个帧的输出顺序将需要18比特来表示。所以,表示整个视频中所有帧的输出顺序将需要近4兆比特。另外, n 越大,输出顺序的表示位宽越大,操作位宽如此高的输出顺序也会增加解码器的硬件设计复杂度。为了高效地表示帧的输出顺序,同时降低解码器的硬件设计复杂度,AV1只表示输出顺序的 n 个最低有效位(Least Significant Bit,LSB)。为此,AV1使用变量OrderHintBits来表示 n 。也就是说,AV1只表示输出顺序的OrderHintBits个最低有效位,并且定义了语法元素order_hint_bits_minus_1来表示OrderHintBits-1。所以,AV1中的每个视频帧都有一个顺序计数值OrderHint,其取值范围是0~2 OrderHintBits -1。一般来讲,OrderHint有以下用途:
❍在某段编码视频中,OrderHint可以唯一地标识一个视频帧。
❍在解码过程中,OrderHint可用于执行运动向量缩放(参见AV1标准文档7.9.2节)。
这里需要注意的是,AV1标准文档并不要求OrderHint必须反映真实的输出顺序。因为对于永远不会被显示的帧,AV1允许编码器自由选择任何OrderHint的值,以获得最佳的压缩效果。比如,AV1广泛使用了替代参考帧(Alternate Reference Frame,ARF),而ARF可能是一个永远不会被显示的帧。当ARF不被显示时,编码器可以自由地为ARF选择任何OrderHint值。