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 由原始码率控制决定。
- 如果非零: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")
}
其中:
top
和left
: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 配置,并忽略其余配置。配置按以下优先级顺序保留:
|