AV1 hardware decode
1. webrtc中AV1的真实数据流(接收端)
RTP packet → depacketize → OBU (fragment / aggregate) → Temporal Unit (TU) → Encoded Frame → Decoder
2.
🔹 ① RTP → OBU(AV1Depacketizer)
-
处理:
-
OBU aggregation
-
OBU fragmentation(Z / Y bits)
-
-
保证:
-
OBU 按 bitstream 顺序恢复
-
-
不关心 decoder
👉 这一层只负责:
“把 RTP payload 还原成合法的 OBU 序列”
🔹 ② OBU → Temporal Unit(FrameAssembler)
-
以 marker bit / TU boundary 作为结束条件
-
收集:
-
OBU_FRAME_HEADER -
OBU_TILE_GROUP -
OBU_METADATA
-
-
直到:
-
当前 TU 完整
-
👉 这里已经形成了 “一个可 decode 的单位”
🔹 ③ Temporal Unit → EncodedImage(Frame)
在 WebRTC 里:
-
EncodedImage:-
是 decoder 的输入单位
-
≈ 1 TU
-
-
字段包括:
-
timestamp
-
frame type (key / delta)
-
data buffer(OBU bitstream)
-
👉 这一步你口中的 “组成 frame”
在代码里其实是:组成一个 EncodedImage
🔹 ④ EncodedImage → Decoder(VideoToolbox / libaom)
-
WebRTC 把完整 TU 的 OBU:
-
按 AV1 Annex B / length-prefixed
-
喂给 decoder
-
-
Decoder:
-
可能 decode 新 frame
-
也可能 SEF(show existing frame)
-
👉 decoder 不认识 RTP / OBU
👉 它只吃:完整 frame bitstream
主要逻辑:
📊 时序图说明
关键流程阶段:
- 🔵 初始化阶段(蓝色)
- Create创建解码器实例
- Configure配置参数
- RegisterDecodeCompleteCallback注册回调
- 🟠 首帧解码阶段(橙色)
- 解析AV1 Sequence Header
- 创建CMVideoFormatDescription(av1C box)
- 创建VTDecompressionSession(硬件解码器)
- 提交首帧到VideoToolbox
- Lazy Initialization:只在首次解码时创建session
- 🟢 异步回调阶段(绿色)
- VideoToolbox在decode_queue线程异步回调
- 转换NV12 → I420格式
- 保留timestamp信息
- 回调应用层DecodedImageCallback
- 首帧特殊处理:只打印一次日志
- 🟡 P帧解码阶段(黄色)
- 复用已有的session和format_description
- 直接提交到VideoToolbox
- 流程更快(无需解析、创建)
- 🟣 分辨率改变(紫色)
- 销毁旧session
- 重置first_frame_decoded标志
- 重新创建session和format
- 重新打印首帧日志
- ⚫ 释放资源(灰色)
- 清理所有VideoToolbox资源
- 重置所有状态标志
关键设计点:
- ✅ Lazy Initialization:首次Decode时才创建session
- ✅ 异步解码:VTDecompressionSessionDecodeFrame异步提交
- ✅ Fallback机制:多处检查返回FALLBACK_SOFTWARE
- ✅ 线程安全:first_frame_decoded使用atomic保证
- ✅ 资源管理:使用CFRelease正确释放CF对象








浙公网安备 33010602011771号