一、PortMode 各种类型总结
PortMode | 意义 | Buffer 来源 | 使用场景 |
---|---|---|---|
kPortModePresetByteBuffer | Codec 自己分配 ByteBuffer | Codec 内部分配 | 一般用于软件编解码(SW Codec)或硬件编解码但使用非图形 buffer |
kPortModePresetANWBuffer | Codec 自己分配 GraphicBuffer | Codec 通过 ANativeWindow 分配 | 常见于硬件视频解码,输出到 Surface 的场景 |
kPortModePresetSecureBuffer | Codec 自己分配 Secure Buffer | Secure Codec 内部分配(无法访问) | DRM 视频播放、Widevine L1 安全路径 |
kPortModeDynamicANWBuffer | 上层传入 GraphicBuffer | App/Surface 提供 | 常见于 MediaCodec::setInputSurface() 后的编码场景(录屏、相机) |
kPortModeDynamicNativeHandle | 上层传入 NativeHandle(opaque) | App 提供 | 比如 CVP 或 camera 给出的 native handle buffer |
kPortModePresetBufferHandle | Codec 自己预设 NativeHandle(rare) | Codec 提供 opaque handle | 很少用,适用于特定平台(如特殊 Secure 编码/解码流程) |
二、Buffer 分配责任总结
模式 | Buffer谁来分配 | 谁来填充 | 谁来释放 |
---|---|---|---|
Preset 系列 | Codec 内部 | Codec(或硬件) | Codec 负责回收 |
Dynamic 系列 | Framework(或 App) | Codec 使用 | Framework 负责释放 |
三、如何判断应该用哪种模式?
在 ACodec
或 CCodecBufferChannel
初始化时,系统会根据下面这些因素综合判断:
触发条件示例:
条件 | 倾向使用的 PortMode |
---|---|
使用 ByteBuffer 传数据 | kPortModePresetByteBuffer |
使用 Surface 输出视频(decode) | kPortModePresetANWBuffer |
使用 InputSurface 作为编码输入 | kPortModeDynamicANWBuffer |
启用 DRM secure 播放 | kPortModePresetSecureBuffer |
Camera/CVP 提供 native handle | kPortModeDynamicNativeHandle |
配置路径(参考):
// 伪代码逻辑
if (usingSurface && isEncoder) {
use kPortModeDynamicANWBuffer;
} else if (isSecure && isDecoder) {
use kPortModePresetSecureBuffer;
} else if (useByteBufferMode) {
use kPortModePresetByteBuffer;
}
四、你提到的重点我来划一下
“Preset” 表示 Codec 自己分配;
“Dynamic” 表示 上层分配并传入;
“是否需要 SWRender / Secure / GraphicBuffer”等,都会影响 PortMode 的选择;
Buffer 类型不一定是 GraphicBuffer,有些是 native_handle(opaque)、或者 byte buffer。