5.2.1 参考帧解码
作者:chai51
出处:https://www.cnblogs.com/chai51
版权:本文版权归作者和博客园共有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
引言
参考帧解码是帧间预测模式信息解码的第一步,它从比特流中解析出当前块使用的参考帧索引。参考帧的选择直接影响预测质量和编码效率。
源码说明: 本文档基于作者自己编写的AV1解码器Python实现,所有代码示例和实现细节均来自实际可运行的源码。源码仓库:GitHub - av1_learning
参考帧解码概述
位置: src/tile/tile_group.py - __read_ref_frames()
规范文档: 5.11.25 Ref frames syntax
功能说明
参考帧解码确定当前块使用的参考帧索引,支持单参考模式和复合参考模式。
解码流程
-
Skip模式检查
if skip_mode == 1: RefFrame[0] = SkipModeFrame[0] RefFrame[1] = SkipModeFrame[1] -
分段特征检查
if segment_feature_enabled(SEG_LVL_REF_FRAME): RefFrame[0] = FeatureData[segment_id][SEG_LVL_REF_FRAME] elif segment_feature_enabled(SEG_LVL_SKIP) or segment_feature_enabled(SEG_LVL_GLOBALMV): RefFrame[0] = LAST_FRAME -
参考模式选择
- 单参考模式(SINGLE_REFERENCE):
single_ref_p1 = read_S(av1, 'single_ref_p1') # 根据single_ref_p1到single_ref_p6确定参考帧 - 复合参考模式(COMPOUND_REFERENCE):
comp_ref_type = read_S(av1, 'comp_ref_type') comp_ref = read_S(av1, 'comp_ref') comp_bwdref = read_S(av1, 'comp_bwdref')
- 单参考模式(SINGLE_REFERENCE):
参考帧类型
LAST_FRAME: 最近解码的帧LAST2_FRAME: 倒数第二帧LAST3_FRAME: 倒数第三帧GOLDEN_FRAME: 黄金帧BWDREF_FRAME: 后向参考帧ALTREF_FRAME: 替代参考帧ALTREF2_FRAME: 第二个替代参考帧
参考帧解码流程图
参考帧解码主流程
graph TD
A[参考帧解码开始<br/>__read_ref_frames] --> B{skip_mode == 1?}
B -->|是| C[RefFrame 0 = SkipModeFrame 0<br/>RefFrame 1 = SkipModeFrame 1]
B -->|否| D{分段特征<br/>SEG_LVL_REF_FRAME?}
C --> END[参考帧解码完成]
D -->|是| E[RefFrame 0 = FeatureData]
D -->|否| F{分段特征<br/>SEG_LVL_SKIP<br/>或SEG_LVL_GLOBALMV?}
E --> END
F -->|是| G[RefFrame 0 = LAST_FRAME]
F -->|否| H{允许选择参考模式<br/>且块大小足够?}
G --> END
H -->|是| I[解码comp_mode]
H -->|否| J[comp_mode = SINGLE_REFERENCE]
I --> K{comp_mode}
J --> K
K -->|COMPOUND_REFERENCE| L[复合参考模式解码]
K -->|SINGLE_REFERENCE| M[单参考模式解码]
L --> END
M --> END
style A fill:#e1f5ff
style B fill:#fff9c4
style D fill:#fff9c4
style F fill:#fff9c4
style K fill:#fff9c4
style END fill:#c8e6c9
详细技术文档参考
说明: 以下内容来自详细技术文档,包含完整的实现细节和代码说明。这些内容主要用于技术参考。
点击展开查看详细技术文档
单参考模式解码流程
graph TD
A[单参考模式解码] --> B[解码single_ref_p1]
B --> C{single_ref_p1 == 0?}
C -->|是| D[解码single_ref_p3]
C -->|否| E[解码single_ref_p2]
D --> F{single_ref_p3 == 0?}
E --> G{single_ref_p2 == 0?}
F -->|是| H[解码single_ref_p4]
F -->|否| I[解码single_ref_p5]
G -->|是| J[解码single_ref_p6]
G -->|否| K[ALTREF_FRAME]
H --> L{single_ref_p4 == 0?}
I --> M{single_ref_p5 == 0?}
J --> N{single_ref_p6 == 0?}
L -->|是| O[LAST_FRAME]
L -->|否| P[LAST2_FRAME]
M -->|是| Q[LAST3_FRAME]
M -->|否| R[GOLDEN_FRAME]
N -->|是| S[BWDREF_FRAME]
N -->|否| T[ALTREF2_FRAME]
O --> V[单参考模式解码完成]
P --> V
Q --> V
R --> V
K --> V
S --> V
T --> V
style A fill:#e1f5ff
style C fill:#fff9c4
style F fill:#fff9c4
style G fill:#fff9c4
style V fill:#c8e6c9
复合参考模式解码流程
graph TD
A[复合参考模式解码] --> B[解码comp_ref_type]
B --> C{comp_ref_type}
C -->|UNIDIR_COMP_REFERENCE| D[单向复合参考]
C -->|BIDIR_COMP_REFERENCE| E[双向复合参考]
D --> D1[解码uni_comp_ref]
D1 --> D2{uni_comp_ref == 0?}
D2 -->|是| D3[解码uni_comp_ref_p1]
D2 -->|否| D4[RefFrame 0 = BWDREF_FRAME<br/>RefFrame 1 = ALTREF_FRAME]
D3 --> D5{uni_comp_ref_p1 == 0?}
D5 -->|是| D6[RefFrame 0 = LAST_FRAME<br/>RefFrame 1 = LAST2_FRAME]
D5 -->|否| D7[解码uni_comp_ref_p2]
D7 --> D8{uni_comp_ref_p2 == 0?}
D8 -->|是| D9[RefFrame 0 = LAST_FRAME<br/>RefFrame 1 = LAST3_FRAME]
D8 -->|否| D10[RefFrame 0 = LAST_FRAME<br/>RefFrame 1 = GOLDEN_FRAME]
D4 --> END
D6 --> END
D9 --> END
D10 --> END
E --> E1[解码comp_ref]
E1 --> E2{comp_ref == 0?}
E2 -->|是| E3[解码comp_ref_p1]
E2 -->|否| E4[解码comp_ref_p2]
E3 --> E5{comp_ref_p1 == 0?}
E4 --> E6{comp_ref_p2 == 0?}
E5 -->|是| E7[RefFrame 0 = LAST_FRAME]
E5 -->|否| E8[RefFrame 0 = LAST2_FRAME]
E6 -->|是| E9[RefFrame 0 = LAST3_FRAME]
E6 -->|否| E10[RefFrame 0 = GOLDEN_FRAME]
E7 --> E11[解码comp_bwdref]
E8 --> E11
E9 --> E11
E10 --> E11
E11 --> E12{comp_bwdref == 0?}
E12 -->|是| E13[解码comp_bwdref_p1]
E12 -->|否| E14[RefFrame 1 = ALTREF_FRAME]
E13 --> E15{comp_bwdref_p1 == 0?}
E15 -->|是| E16[RefFrame 1 = BWDREF_FRAME]
E15 -->|否| E17[RefFrame 1 = ALTREF2_FRAME]
E14 --> END
E16 --> END
E17 --> END
END[复合参考模式解码完成]
style A fill:#e1f5ff
style C fill:#fff9c4
style D2 fill:#fff9c4
style E2 fill:#fff9c4
style E12 fill:#fff9c4
style END fill:#c8e6c9
总结
参考帧解码是帧间预测的基础,它确定当前块使用的参考帧索引。参考帧的选择直接影响预测质量,是AV1帧间预测的重要环节。
参考资源:
- AV1规范文档
- 源码实现: GitHub - av1_learning
- Tile解码:
src/tile/tile_group.py
- Tile解码:

浙公网安备 33010602011771号