// Only enable metadata mode on encoder output if encoder can prepend
// sps/pps to idr frames, since in metadata mode the bitstream is in an
// opaque handle, to which we don't have access.
这段注释来自 ACodec.cpp,用于说明一个 开启 metadata 模式的前提条件:
背景知识:SPS/PPS 是什么?
-
SPS(Sequence Parameter Set)
-
PPS(Picture Parameter Set)
这两个是 H.264/H.265 编码标准中的重要配置数据,描述了视频的基本编码参数。
-
播放器在收到 IDR(关键帧)前必须解析 SPS/PPS 才能正确解码。
-
一般这两段信息需要出现在比特流前面,或者“每个关键帧前都带上一次”。
注释的核心意思:
只有当编码器能自动在 IDR 帧前插入 SPS/PPS 时,才可以开启 metadata 模式。
为什么要这样?
因为:
-
metadata 模式下,编码出来的 bitstream 是 opaque(不透明)的句柄,MediaCodec 拿不到实际数据;
-
如果编码器不能自己插入 SPS/PPS,就需要 MediaCodec 自己在外部插入;
-
但!此时 MediaCodec 无法访问数据内容 → 无法插入 SPS/PPS → 播放器就可能解析失败 → 崩溃或花屏。
所以安全做法:
if (encoder_supports_prepend_sps_pps) {
enable_metadata_mode = true;
} else {
enable_metadata_mode = false;
}
大多数 metadata buffer 的最终使用者是 GPU 或硬件 composer(HWC)。
应用场景举例:
-
视频播放器播放一帧视频:解码后的内容通过
GraphicBuffer
→SurfaceFlinger
→Display
-
如果使用 GPU 渲染(如 OpenGL、Vulkan):这些
GraphicBuffer
会直接绑定为纹理,用于 shader 渲染 -
如果系统启用硬件合成(HWC),也可以把这些 buffer 传给 DRM/KMS(比如通过 libdrm 提交)
所以 GPU 是 metadata 模式的常见“最终消费者”。
metadata 模式下完整的 buffer 传输链:
App
↓
MediaCodec (configure output to Surface)
↓
Surface (ANativeWindow → BufferQueue)
↓
GraphicBuffer (metadata handle)
↓
Codec 解码填充内容到 GraphicBuffer
↓
SurfaceFlinger
→ 如果是 GLES 合成:GPU 采样绘制
→ 如果是 HWC 合成:DRM/KMS 提交 buffer handle 显示
总结一下:
项目 | 说明 |
---|---|
注释中提到 SPS/PPS | 是为了确保播放方能正确解码关键帧 |
metadata 模式限制 | MediaCodec 无法访问实际 bitstream 内容 |
GPU 为什么常出现 | 因为 GraphicBuffer 最终用于渲染,大多交给 GPU 或 HWC 处理 |
如果不开 metadata | buffer 需要在 App 和 Codec 间 copy,性能大幅下降 |