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
设置的。
kParamIndexQpOffsetMapBuffer
是 C2InfoBuffer
中的字节数组,具有以下属性:
长度:一帧中的 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")
}
其中:
top
和left
: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 配置,并忽略其余配置。配置将按以下优先级顺序保留:
|