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

解码流程

  1. IntraBC模式检查

    if frame_header.allow_intrabc:
        tile_group.use_intrabc = read_S(av1, 'use_intrabc')
    
    • 如果 allow_intrabc == 1,解码 use_intrabc
    • 如果使用IntraBC,则按帧间模式处理(但使用当前帧作为参考)
  2. 亮度模式解码

    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
  3. 角度信息解码

    self.__intra_angle_info_y(av1)
    
    • 解码 angle_delta_y(亮度角度增量)
    • 用于微调方向预测的角度
  4. 色度模式解码(如果有色度)

    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)
    
  5. 调色板模式信息

    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)
    
  6. 滤波器内模式信息

    self.__filter_intra_mode_info(av1)
    

帧间帧中的帧内块模式信息解码

位置: src/tile/tile_group.py - __intra_block_mode_info()

规范文档: 5.11.22 Intra block mode info syntax

解码流程

  1. 设置参考帧

    tile_group.RefFrame[0] = REF_FRAME.INTRA_FRAME
    tile_group.RefFrame[1] = REF_FRAME.NONE
    
  2. 亮度模式解码

    y_mode = Y_MODE(read_S(av1, 'y_mode'))
    tile_group.YMode = y_mode
    
  3. 角度信息解码

    self.__intra_angle_info_y(av1)
    
  4. 色度模式解码(如果有色度)

    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)
    
  5. 调色板和滤波器内模式(与关键帧类似)


角度信息解码

角度信息用于微调方向预测的角度,提高预测精度。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_DELTAMAX_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 是角度步长

模式信息解码流程图

关键帧模式信息解码流程

graph TD A[关键帧模式信息解码开始] --> B{允许IntraBC?} B -->|是| C[解码use_intrabc] C --> D{使用IntraBC} D -->|是| D1[默认模式] D -->|否| E[解码亮度模式<br/>intra_frame_y_mode] E --> F{是方向模式?} F -->|是| G[解码角度信息<br/>angle_delta_y] F -->|否| H[跳过角度信息] G --> I{有色度?} H --> I I -->|是| J[解码色度模式<br/>uv_mode] I -->|否| K[跳过色度模式] J --> L{色度模式是CFL?} L -->|是| M[解码CFL Alpha值] L -->|否| N[跳过CFL Alpha] M --> O{色度模式是方向模式?} N --> O O -->|是| P[解码色度角度信息<br/>angle_delta_uv] O -->|否| Q[跳过色度角度信息] P --> R{满足调色板条件?} Q --> R R -->|是| S[解码调色板模式信息] R -->|否| T[跳过调色板模式] S --> U[解码滤波器内模式信息] T --> U U --> V[模式信息解码完成] style A fill:#e1f5ff style F fill:#fff9c4 style L fill:#fff9c4 style V fill:#c8e6c9

帧间帧中帧内块模式信息解码流程

graph TD A[帧内块模式信息解码开始] --> B[设置参考帧<br/>RefFrame 0 = INTRA_FRAME] B --> C[解码亮度模式<br/>y_mode] C --> D{是方向模式?} D -->|是| E[解码角度信息<br/>angle_delta_y] D -->|否| F[跳过角度信息] E --> G{有色度?} F --> G G -->|是| H[解码色度模式<br/>uv_mode] G -->|否| I[跳过色度模式] H --> J{色度模式是CFL?} J -->|是| K[解码CFL Alpha值] J -->|否| L[跳过CFL Alpha] K --> M{色度模式是方向模式?} L --> M M -->|是| N[解码色度角度信息<br/>angle_delta_uv] M -->|否| O[跳过色度角度信息] N --> P{满足调色板条件?} O --> P P -->|是| Q[解码调色板模式信息] P -->|否| R[跳过调色板模式] Q --> S[解码滤波器内模式信息] R --> S S --> T[模式信息解码完成] style A fill:#e1f5ff style D fill:#fff9c4 style J fill:#fff9c4 style T fill:#c8e6c9

关键数据结构

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

总结

模式信息解码是帧内预测的基础,它从比特流中解析出预测模式、角度信息等关键参数。本文详细介绍了:

  1. 关键帧中的模式信息解码:包括IntraBC检查、亮度模式、角度信息、色度模式、调色板和滤波器内模式
  2. 帧间帧中的帧内块模式信息解码:与关键帧类似,但语法略有不同
  3. 角度信息解码:亮度和色度的角度增量解码,用于微调方向预测

这些解码出的模式信息将用于后续的预测生成过程。


参考资源:

上一篇: 帧内预测概述
下一篇: 方向帧内预测

posted @ 2026-01-10 07:47  chai51  阅读(1)  评论(0)    收藏  举报