RoI 实现的 OEM 指南

Android 15 引入了一个标准化流程,用于将感兴趣区域 (RoI) 用户配置集成到 Android 视频编码框架中。此功能通过提供公开 API 来集成和分析用户配置到视频编码器中,从而提高 RoI 的压缩质量。

实现

SoC 供应商和 OEM 可以使用 FEATURE_Roi 标志来控制视频编码的 RoI 支持。如果未启用 FEATURE_Roi,则视频编码器行为不会发生变化。

视频框架中的变更

本节详细介绍了实现此功能所需的视频框架变更。

Codec2 中的键

在 Android 15 中,量化参数图 (QP_map) 和矩形配置 (rect) 被定义为 RoI 配置类型。此外,Codec2 (C2) 中引入了两个键来支持这些新类型。这两个键的用法与公共 API 相同。在编码器的帧循环中,配置在运行阶段(在输入缓冲区排队之前)进行动态调整,如下所述:

  • 粘性场景中,如果当前帧未提供 RoI 配置,则编码器使用与上一帧相同的配置。

  • 动态场景中,RoI 配置类型可以动态更改。

以下部分介绍了 C2 中的新键。

kParamIndexQpOffsetMapBuffer

kParamIndexQpOffsetMapBuffer 键表示帧的 qp-offset 图。其值使用来自 setParameters 的输入参数 PARAMETER_KEY_QP_OFFSET_MAP 设置。

kParamIndexQpOffsetMapBufferC2InfoBuffer 中的字节数组,具有以下属性:

  • 长度:一帧中 16x16 块的数量。

  • 值:数组的每个值都是 16x16 块的 QP 偏移,范围为 -51~51。目标最大编码单元 (LCU) 的 QP 通过编码器码率控制加上偏移量来计算。如果计算结果超出 0~51 范围,则该值将被截断为 0~51。

    • 如果为 0:无 QP 偏移,QP 由原始码率控制决定。
    • 如果非零:QP 是原始码率控制加上偏移量。
    • 如果为负数:视频质量在目标 LCU 中得到提升。
    • 如果为正数:视频质量在目标 LCU 中下降。
  • 用法:用户必须将此键配置为 16x16 块。编码器通过平均 LCU 中 16x16 块的值,将配置调整为实际 LCU 大小。

C2_PARAMKEY_QP_OFFSET_RECTS

C2_PARAMKEY_QP_OFFSET_RECTS 键(设置为 coding.qp-offset-rects)将 RoI 设置为 QpOffset-Rects。其值使用来自 setParameters 的输入参数 PARAMETER_KEY_QP_OFFSET_RECTS 设置。

为了支持此键,引入了以下结构 C2QpOffsetRectStruct

struct C2QpOffsetRectStruct : C2Rect {
  int32_t qpOffset;

  DEFINE_AND_DESCRIBE_C2STRUCT(QpOffsetRect)
  C2FIELD(width, "width")
  C2FIELD(height, "height")
  C2FIELD(left, "left")
  C2FIELD(top, "top")
  C2FIELD(qpOffset, "qp-offset")
}

其中:

  • topleft:RoI 的坐标,呈矩形形状。RoI 被拉伸以与 LCU 边界对齐。该值表示每个像素的左上角,例如 ((0,0), (16, 16)) 定义一个完整的 16x16 块。

  • qpOffset:数组的每个值都表示目标 rect 区域的 QP 偏移。其定义和用法与 kParamIndexQpOffsetMapBuffer 值相同。

映射算法

下表显示了从公共密钥到视频框架的映射

公共密钥或 API 视频框架中的映射
PARAMETER_KEY_QP_OFFSET_MAP 值作为 C2InfoBuffer 实例传递给 kParamIndexQpOffsetMapBuffer
PARAMETER_KEY_QP_OFFSET_RECTS 值从 String 转换为 Struct C2QpOffsetRectStruct 并传递给 C2_PARAMKEY_QP_OFFSET_RECTS

错误处理

OEM 实现必须处理以下错误情况:

错误情况 示例 处理方式
供应商密钥和标准化密钥均用于开启 RoI。 用户同时调用 setFeatureEnabled(FEATURE_ROI) 和供应商密钥来开启 RoI。 必须开启 RoI。
QP 偏移在范围内,但 SoC 供应商不支持。 用户将 QP 偏移设置为 12,但 SoC 仅支持高达 10 的 QP 偏移。 支持的 QP 偏移范围尽可能做到最好。该值会钳制到 SoC 支持的范围。
为单个帧设置了多个 RoI 配置(无论是标准化密钥还是供应商专用密钥)。 用户对帧 1 同时使用了标准化密钥和供应商密钥。 如果可用,框架会保留第一个标准化的 rect 配置、第一个标准化的 QP_map 配置或两者都保留。在每个类别中,框架仅向 SoC 发送一个标准化配置;如果标准化配置可用,则 SoC 实现必须忽略供应商配置。如果向 SoC 发送了多个配置,则 SoC 供应商必须仅保留一个 RoI 配置,并忽略其余配置。

配置按以下优先级顺序保留:

  1. 标准化 rect
  2. 标准化 QP_map
  3. 供应商 rect
  4. 供应商 QP_map