4.1 帧内预测概述

作者:chai51
出处:https://www.cnblogs.com/chai51
版权:本文版权归作者和博客园共有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任

引言

帧内预测(Intra Prediction)是AV1视频解码中的核心预测技术之一。与帧间预测不同,帧内预测仅利用当前帧内已解码的相邻像素来预测当前块的像素值,无需参考其他帧。这使得帧内预测成为关键帧(KEY_FRAME)的主要预测方法,同时在帧间帧中也有广泛应用。

源码说明: 本文档基于作者自己编写的AV1解码器Python实现,所有代码示例和实现细节均来自实际可运行的源码。源码仓库:GitHub - av1_learning


帧内预测概述

功能说明

帧内预测通过分析已解码的相邻像素(上方行和左侧列),利用空间相关性来预测当前块的像素值。AV1支持多种帧内预测模式,每种模式针对不同的图像特征进行优化。

应用场景

  1. 关键帧(KEY_FRAME)

    • 所有块都使用帧内预测
    • is_inter = 0
  2. 帧间帧中的帧内块(INTER_FRAME中的帧内块)

    • 部分块可能选择帧内预测
    • is_inter = 0RefFrame[0] == INTRA_FRAME
  3. Inter-Intra混合模式

    • 帧间预测和帧内预测的组合
    • __compute_prediction 中处理

预测模式类型

AV1支持以下帧内预测模式:

  • 方向预测(Directional):8个方向的角度预测
  • DC预测:使用平均值预测
  • 平滑预测(Smooth):平滑插值预测
  • 递归预测(Filter Intra):使用滤波器的递归预测
  • 基本预测(Paeth):Paeth预测器
  • 调色板预测(Palette):颜色索引预测
  • CFL预测(Chroma from Luma):基于亮度的色度预测

预测过程概述

预测主函数

位置: src/reconstruction/prediction.py - predict_intra()

规范文档: 7.11.2 Intra prediction process

主要步骤

  1. 准备参考像素

    • 提取上方行(AboveRow)
    • 提取左侧列(LeftCol)
    • 处理边界情况(块在图像边界时)
  2. 根据预测模式选择预测方法

    if plane == 0 and use_filter_intra:
        # 递归帧内预测(滤波器内)
        pred = _recursive_intra_prediction_process()
    elif is_directional_mode(mode):
        # 方向帧内预测
        pred = _directional_intra_prediction_process    ()
    elif mode == SMOOTH_PRED or SMOOTH_V_PRED or    SMOOTH_H_PRED:
        # 平滑帧内预测
        pred = _smooth_intra_prediction_process()
    elif mode == DC_PRED:
        # DC帧内预测
        pred = _dc_intra_prediction_process()
    else:
        # 基本帧内预测(PAETH_PRED)
        pred = _basic_intra_prediction_process()
    
  3. CFL预测(如果是色度平面且使用CFL)

    if isCfl:
        predict_chroma_from_luma()
    
  4. 存储预测结果

    • 将预测块存储到 CurrFrame[plane]

预测流程图

graph TD A[帧内预测开始<br/>predict_intra] --> B[准备参考像素] B --> C[提取上方行<br/>AboveRow] B --> D[提取左侧列<br/>LeftCol] C --> E[处理边界情况] D --> E E --> F{预测模式} F -->|Filter Intra| G[递归帧内预测] F -->|方向模式| H[方向帧内预测] F -->|平滑模式| I[平滑帧内预测] F -->|DC模式| J[DC帧内预测] F -->|其他| K[基本帧内预测] G --> L{是色度平面<br/>且使用CFL?} H --> L I --> L J --> L K --> L L -->|是| M[CFL预测] L -->|否| N[存储预测结果] M --> N N --> O[帧内预测完成] style A fill:#e1f5ff style F fill:#fff9c4 style L fill:#fff9c4 style O 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      # 色度调色板颜色

Prediction类中的临时数据

class Prediction:
    _AboveRow: List[int]       # 上方参考像素行
    _LeftCol: List[int]        # 左侧参考像素列
    _LocalValid: int           # 局部有效性标志

与解码流程的集成

在关键帧中的调用

Tile解码
  → 解码块划分
  → 解码预测模式(仅帧内)
  → 解码调色板语法
  → 解码变换信息
  → 残差解码
    → 变换块解码
      → 帧内预测(predict_intra)
      → 解码系数
      → 重建

在帧间帧中的调用

Tile解码
  → 解码块划分
  → 解码is_inter标志
  → 如果is_inter=0:
      → 解码帧内块模式信息
      → 解码调色板语法
      → 解码变换信息
      → 残差解码
        → 变换块解码
          → 帧内预测(predict_intra)
          → 解码系数
          → 重建

在Inter-Intra模式中的调用

计算预测(__compute_prediction)
  → 如果是Inter-Intra模式
      → 帧内预测(Inter-Intra的帧内部分)
  → 帧间预测
  → 混合预测结果

总结

本文介绍了AV1帧内预测的基本概念、应用场景和预测过程。帧内预测通过利用空间相关性来预测当前块的像素值,是AV1压缩效率的重要来源。


参考资源:

下一篇: 模式信息解码

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