H.264 标准中规定的一套“初始化 + 重排序”流程决定的,
🧐 核心机制:初始化与重排序
简单来说,这个“对应关系”的明确遵循以下两个步骤:
1. 📋 列表初始化
解码器会从 DPB(解码图像缓冲区)中选出合适的参考帧,并按照标准规定的默认顺序进行排列。这个默认顺序因帧类型(P帧或B帧)而异:
| 帧类型 | 参考帧列表 | 初始排序规则(默认顺序) |
|---|---|---|
| P帧 | RefPicList0 (前向) | 1. 短期参考帧在前:按 PicNum 从大到小 (由近及远) 降序排列2. 长期参考帧在后:按 LongTermPicNum 从小到大升序排列 |
| B帧 | RefPicList0 (前向) | 1. POC小于当前帧:按 POC 从大到小 (降序) 排列在前 2. POC大于当前帧:按 POC 从小到大 (升序) 排列在后 3. 长期参考帧:最后按 LongTermPicNum 升序排列 |
| B帧 | RefPicList1 (后向) | 1. POC大于当前帧:按 POC 从小到大 (升序) 排列在前 2. POC小于当前帧:按 POC 从大到小 (降序) 排列在后 3. 长期参考帧:最后按 LongTermPicNum 升序排列 |
POC (Picture Order Count) 是图像的显示顺序,而
frame_num是解码顺序。正因为显示顺序和解码顺序通常不一致,B帧的列表初始化规则才会按 POC 来划分前后向参考帧。
2. 🔄 关键一步:list1的前两个元素交换
当list1与list0完全相同时,标准中有一个重要的附加规定:
如果
RefPicList1(即list1)中的参考帧数量大于1,并且它与RefPicList0(即list0)完全相同,那么必须交换list1中的前两个元素(即RefPicList1[0]和RefPicList1[1])。
这步操作的目的非常明确:为了编码效率。如果两个列表完全相同,编码器在宏块预测时,用一位标志位选择list0还是list1就没有意义了,因为结果是一样的。通过强制交换list1的前两个元素,打破了这种同一性,使得两个列表的参考帧顺序产生差异,让编码器有更灵活的选择

1758

被折叠的 条评论
为什么被折叠?



