面向 OEM 的 RoI 实现指南

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 由原始速率控制决定。
    • 如果不为 0:QP 为原始速率控制值加上偏移量。
    • 如果为负值:目标 LCU 中的视频画质会得到提升。
    • 如果为正值:目标 LCU 中的视频画质会降低。
  • 用途:用户必须将此键配置为 16x16 块。编码器通过计算 LCU 中 16x16 块的值的平均值,将配置调整为实际的 LCU 大小。

C2_PARAMKEY_QP_OFFSET_RECTS

C2_PARAMKEY_QP_OFFSET_RECTS 键(设置为 coding.qp-offset-rects)会将 Rol 设置为 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 的坐标,采用矩形形式。关注区域会延伸以与 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