FEC分类
webrtc默认是使用RedFec,但是实际生产环境建议是RedFEC + ULPFEC 。
FlexFEC 还在草案中,没有形成正式规范。
FEC原理
Data1 和Data2 异或 得到 R,然后三个数据包一起发送。
当收到数据包时,发现Data1有数据丢包,则可以将Data2和R异或,得到完整的Data1 。
这里是三个包一起异或, 1、2、3 异或得到R1, 4、5、6异或得到R2,一次类推。
注意,这种方式如果数据包4、5同时丢包,无法恢复。。
这里,横向,和纵向都生成冗余包。这时候,如果4、5都丢包,可以找回。
缺点是,需要生成的冗余包更多,算法更复杂。
两个重要的表
表1-kFecRateTable
H:\webrtc-20210315\webrtc-20210315\webrtc\webrtc-checkout\src\modules\video_coding\fec_rate_table.h
表2-PacketMaskRandomTbl
H:\webrtc-20210315\webrtc-20210315\webrtc\webrtc-checkout\src\modules\rtp_rtcp\source\fec_private_tables_random.cc
第一项12,是固定值。如果不是,则不是有效的表。
从第2项开始,每一项,前面第一个序号递增,从1开始。
12为长度,一共有12项。
namespace webrtc {
namespace fec_private_tables {
const uint8_t kPacketMaskRandomTbl[] = {
12,
kPacketMaskRandom1, // 2 byte entries.
kPacketMaskRandom2,
kPacketMaskRandom3,
kPacketMaskRandom4,
kPacketMaskRandom5,
kPacketMaskRandom6,
kPacketMaskRandom7,
kPacketMaskRandom8,
kPacketMaskRandom9,
kPacketMaskRandom10,
kPacketMaskRandom11,
kPacketMaskRandom12,
};
} // namespace fec_private_tables
} // namespace webrtc