各种Mode总结

一、PortMode 各种类型总结

PortMode意义Buffer 来源使用场景
kPortModePresetByteBufferCodec 自己分配 ByteBufferCodec 内部分配一般用于软件编解码(SW Codec)或硬件编解码但使用非图形 buffer
kPortModePresetANWBufferCodec 自己分配 GraphicBufferCodec 通过 ANativeWindow 分配常见于硬件视频解码,输出到 Surface 的场景
kPortModePresetSecureBufferCodec 自己分配 Secure BufferSecure Codec 内部分配(无法访问)DRM 视频播放、Widevine L1 安全路径
kPortModeDynamicANWBuffer上层传入 GraphicBufferApp/Surface 提供常见于 MediaCodec::setInputSurface() 后的编码场景(录屏、相机)
kPortModeDynamicNativeHandle上层传入 NativeHandle(opaque)App 提供比如 CVP 或 camera 给出的 native handle buffer
kPortModePresetBufferHandleCodec 自己预设 NativeHandle(rare)Codec 提供 opaque handle很少用,适用于特定平台(如特殊 Secure 编码/解码流程)

二、Buffer 分配责任总结

模式Buffer谁来分配谁来填充谁来释放
Preset 系列Codec 内部Codec(或硬件)Codec 负责回收
Dynamic 系列Framework(或 App)Codec 使用Framework 负责释放

三、如何判断应该用哪种模式?

ACodecCCodecBufferChannel 初始化时,系统会根据下面这些因素综合判断:

触发条件示例:

条件倾向使用的 PortMode
使用 ByteBuffer 传数据kPortModePresetByteBuffer
使用 Surface 输出视频(decode)kPortModePresetANWBuffer
使用 InputSurface 作为编码输入kPortModeDynamicANWBuffer
启用 DRM secure 播放kPortModePresetSecureBuffer
Camera/CVP 提供 native handlekPortModeDynamicNativeHandle

配置路径(参考):

// 伪代码逻辑
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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值