Ulpfec
- tags
- webrtc
ulpfec
- 就像我们日常生活中的事情有轻重缓急,实时音视频传输里面的数据重要性也有轻重之分
- 音视频编码输出的数据往往是头部数据更重要(几乎所有的媒体格式帧头都是放在前面)
- ulpfec(非均匀程度fec)算法针对不同重要程度的数据报文给予不同程度的保护
- 但webrtc的ulpfec并没有实现完整的ULP功能,定义了相关参数,但实际生成的FEC包是对将每个包都视作同等重要的
rfc中的ulpfec
-
可以将包内部划分成L0、L1这2个重要程度,对包内的数据进行保护
- A、B的L0部分由FEC1的L0保护
- C、D的L0部分由FEC2的L0保护
- A、B、C、D的L1部分,由FEC2的L1保护
Packet A ##################### : : Packet B ############### : : : ULP FEC Packet #1 @@@@@@@@ : : : Packet C ########### : : : Packet D ################################### : : ULP FEC Packet #2 @@@@@@@@@@@@@@@@@ : : : :<-L0->:<--L1-->: -
具体的描述在
生成
- UlpfecGenerator是负责生成ulpfec,主要流程是2个函数
- 缓存输入并生成FEC: AddPacketAndGenerateFec UlpFec_AddPacketAndGenerateFec
- 以RTP RED格式返回FEC包: GetFecPackets ulpfec_generator_GetFecPackets
关键数据结构
UlpfecGenerator
const std::unique_ptr<ForwardErrorCorrection> fec_;
ForwardErrorCorrection::PacketList media_packets_;
std::optional<RtpPacketToSend> last_media_packet_;
std::list<ForwardErrorCorrection::Packet*> generated_fec_packets_;
解码
- 将RED包以ForwardEorrorCorrection::Packet格式缓存 UlpfecReceiverAddReceivedRedPacket
- 将缓存的数据转换为RtpPacketReceived触发回调,并尝试解码恢复数据,触发回调 UlpfecReceiverProcessReceivedFec