参考图像顺序
264中,已编码图像存储在编码器和解码器的参考缓冲区(DPB,解码图像缓冲区),并由相应的参考图像列表list0,以供帧间宏块的运动补偿预测使用。对B片预测而言,list0和list1分别包含当前图像的前面和后面两个方向的图像。DPB可以同时包含短期和长期参考图像,短期参考图像由帧号标定,长期参考图像由LongTermPicNum标定,保存在DPB中,直到被代替或删除。
删除DPB中的短期参考图片由两种方式:1)在码流中传输一个显式的命令进行删除;2)当DPB满了,并且DPB的自动模式是启用的,会删除掉最老的短期参考图片。删除长期参考图片只有一种方式:在码流中传输一个显示的命令进行删除。
当一幅图像在编码器被编码重建或在解码器被解码时,它存放在DPB并标定为以下中的一种:1)“非参考”,不用于进一步的预测;2)短期参考图像;3)长期参考图像;4)直接输出显示。
默认的短期参考图片顺序取决于当前切片为P切片时的解码顺序和当前切片为B切片时的显示顺序。列表的顺序很重要,因为索引在列表的前面引用图片需要更少的位来发送信号。因此,默认的顺序被组织起来,使参考图片在时间上“更接近”当前的图片在列表中出现的更早,因为这些图片可能包含对当前图片的最佳预测匹配。具体如下:
下面是两个例子,分别是P帧的参考和B帧的参考,对B帧,假设当前帧poc=68。P帧没什么好说的,B帧的参考注意list0默认先把poc小于当前帧的参考图像放前面,list1默认先把poc大于当前帧的参考图像放前面。
P帧的例子:
B帧的例子:
在插入新的参考图像时,当短期和长期图像号达到参考帧最大数,最高索引号(最老的)的图像被移出缓冲区,即实行滑动窗内存控制。该操作使得编码器和解码器保持N 幅短期参考图像,包括一幅当前图像和(N-1)幅已编码图像。
由编码器发送的自适应内存控制命令用来管理短期和长期参考图像索引。这样,短期图像才可能被指定长期帧索引,短期或长期图像才可能标定为“非参考”。编码器从list0 中选择参考图像,进行帧间宏块编码。而该参考图像的选择由索引号标志,索引0 对应于短期部分的第一帧,长期帧索引开始于最后一个短期帧。
参考图像缓冲区通常由编码器发送的IDR(瞬时解码器刷新)编码图像刷新,IDR图像一般为I 片或SI片。当接受到IDR图像时,解码器立即将缓冲区中的图像标为“非参考”。后继的片进行无图像参考编码。通常,编码视频序列的第一幅图像都是IDR图。
参考图像重排序
在B片的情况下,list0和list1的默认顺序可以通过片头中的显式命令修改。这些命令是由语法元素ref_pic_list_reordering_flag启动的,并且只改变当前片的列表顺序。例如,这可以用来使编码器将一个特别有用的参考帧放在列表中比它通常的位置更早的位置,因为早期的参考索引需要更少的位来发送信号。重排序的步骤为:
-
初始化一个指针(refIdxL0)指向list0中的第一个参考图片索引
-
当reordering_of_pic_nums_idx≠3
-
选择一个参考图片,如果是短期的,用abs_diff_pic_num_minus1表示;如果是长期的,用long_term_pic_num表示。
-
将列表中所有其他图片从refIdxL0位置移动到另一个位置。
-
将这张图片放在列表中refIdxL0表示的位置。
-
增加refIdxL0。
-
下面给一个重排序的实际例子,简单明了: