4.2 模式信息解码
作者:chai51
出处:https://www.cnblogs.com/chai51
版权:本文版权归作者和博客园共有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
引言
模式信息解码是帧内预测的关键步骤,它从比特流中解析出预测模式、角度信息等参数,为后续的预测生成提供必要的配置信息。本文详细介绍AV1帧内预测的模式信息解码过程。
源码说明: 本文档基于作者自己编写的AV1解码器Python实现,所有代码示例和实现细节均来自实际可运行的源码。源码仓库:GitHub - av1_learning
模式信息解码
关键帧中的模式信息解码
位置: src/tile/tile_group.py - __intra_frame_mode_info()
规范文档: 5.11.21 Intra frame mode info syntax
解码流程
-
IntraBC模式检查
if frame_header.allow_intrabc: tile_group.use_intrabc = read_S(av1, 'use_intrabc')- 如果
allow_intrabc == 1,解码use_intrabc - 如果使用IntraBC,则按帧间模式处理(但使用当前帧作为参考)
- 如果
-
亮度模式解码
intra_frame_y_mode = Y_MODE(read_S(av1, 'intra_frame_y_mode')) tile_group.YMode = intra_frame_y_mode- 支持的亮度模式包括:
- 方向模式:V_PRED, H_PRED, D45_PRED, D135_PRED, D117_PRED, D153_PRED, D63_PRED, D207_PRED
- DC_PRED
- SMOOTH_PRED, SMOOTH_V_PRED, SMOOTH_H_PRED
- PAETH_PRED
- 支持的亮度模式包括:
-
角度信息解码
self.__intra_angle_info_y(av1)- 解码
angle_delta_y(亮度角度增量) - 用于微调方向预测的角度
- 解码
-
色度模式解码(如果有色度)
if HasChroma: uv_mode = Y_MODE(read_S(av1, 'uv_mode')) tile_group.UVMode = uv_mode if tile_group.UVMode == Y_MODE.UV_CFL_PRED: self.__read_cfl_alphas(av1) self.__intra_angle_info_uv(av1) -
调色板模式信息
if (tile_group.MiSize >= SUB_SIZE.BLOCK_8X8 and Block_Width[tile_group.MiSize] <= 64 and Block_Height[tile_group.MiSize] <= 64 and frame_header.allow_screen_content_tools): self.__palette_mode_info(av1) -
滤波器内模式信息
self.__filter_intra_mode_info(av1)
帧间帧中的帧内块模式信息解码
位置: src/tile/tile_group.py - __intra_block_mode_info()
规范文档: 5.11.22 Intra block mode info syntax
解码流程
-
设置参考帧
tile_group.RefFrame[0] = REF_FRAME.INTRA_FRAME tile_group.RefFrame[1] = REF_FRAME.NONE -
亮度模式解码
y_mode = Y_MODE(read_S(av1, 'y_mode')) tile_group.YMode = y_mode -
角度信息解码
self.__intra_angle_info_y(av1) -
色度模式解码(如果有色度)
if HasChroma: uv_mode = Y_MODE(read_S(av1, 'uv_mode')) tile_group.UVMode = uv_mode if tile_group.UVMode == Y_MODE.UV_CFL_PRED: self.__read_cfl_alphas(av1) self.__intra_angle_info_uv(av1) -
调色板和滤波器内模式(与关键帧类似)
角度信息解码
角度信息用于微调方向预测的角度,提高预测精度。AV1支持对亮度和色度分别解码角度增量。
亮度角度信息解码
位置: src/tile/tile_group.py - __intra_angle_info_y()
规范文档: 5.11.42 Intra angle info luma syntax
解码条件
- 块尺寸 >= 8x8
- 模式是方向模式(
is_directional_mode(YMode))
解码过程
if (tile_group.MiSize >= SUB_SIZE.BLOCK_8X8 and
is_directional_mode(tile_group.YMode)):
angle_delta_y = read_S(av1, 'angle_delta_y')
tile_group.AngleDeltaY = angle_delta_y - MAX_ANGLE_DELTA
角度增量范围:-MAX_ANGLE_DELTA 到 MAX_ANGLE_DELTA,用于微调基础角度。
色度角度信息解码
位置: src/tile/tile_group.py - __intra_angle_info_uv()
规范文档: 5.11.43 Intra angle info chroma syntax
解码条件
- 块尺寸 >= 8x8
- 色度模式是方向模式(
is_directional_mode(UVMode))
解码过程
if (tile_group.MiSize >= SUB_SIZE.BLOCK_8X8 and
is_directional_mode(tile_group.UVMode)):
angle_delta_uv = read_S(av1, 'angle_delta_uv')
tile_group.AngleDeltaUV = angle_delta_uv - MAX_ANGLE_DELTA
角度计算
在预测过程中,最终角度计算为:
pAngle = Mode_To_Angle[mode] + angleDelta * ANGLE_STEP
其中:
Mode_To_Angle[mode]是模式对应的基础角度angleDelta是解码得到的角度增量ANGLE_STEP是角度步长
模式信息解码流程图
关键帧模式信息解码流程
帧间帧中帧内块模式信息解码流程
关键数据结构
TileGroup中的模式信息字段
class TileGroup:
# 预测模式
YMode: Y_MODE # 亮度预测模式
UVMode: Y_MODE # 色度预测模式
# 角度信息
AngleDeltaY: int # 亮度角度增量
AngleDeltaUV: int # 色度角度增量
# 滤波器内
filter_intra_mode: int # 滤波器内模式
use_filter_intra: int # 是否使用滤波器内
# CFL
CflAlphaU: int # CFL U分量alpha
CflAlphaV: int # CFL V分量alpha
# 调色板
PaletteSizeY: int # 亮度调色板大小
PaletteSizeUV: int # 色度调色板大小
PaletteColorsY: List # 亮度调色板颜色
PaletteColorsUV: List # 色度调色板颜色
# IntraBC
use_intrabc: int # 是否使用IntraBC
总结
模式信息解码是帧内预测的基础,它从比特流中解析出预测模式、角度信息等关键参数。本文详细介绍了:
- 关键帧中的模式信息解码:包括IntraBC检查、亮度模式、角度信息、色度模式、调色板和滤波器内模式
- 帧间帧中的帧内块模式信息解码:与关键帧类似,但语法略有不同
- 角度信息解码:亮度和色度的角度增量解码,用于微调方向预测
这些解码出的模式信息将用于后续的预测生成过程。
参考资源:
- AV1规范文档
- 源码实现: GitHub - av1_learning
- Tile解码:
src/tile/tile_group.py
- Tile解码:

浙公网安备 33010602011771号