一段注释的解释

    // 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)。

应用场景举例:

  • 视频播放器播放一帧视频:解码后的内容通过 GraphicBufferSurfaceFlingerDisplay

  • 如果使用 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 处理
如果不开 metadatabuffer 需要在 App 和 Codec 间 copy,性能大幅下降
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值