FEC分类

image.png
webrtc默认是使用RedFec,但是实际生产环境建议是RedFEC + ULPFEC 。
FlexFEC 还在草案中,没有形成正式规范。
image.png
image.png
image.png

FEC原理

image.png
Data1 和Data2 异或 得到 R,然后三个数据包一起发送。
当收到数据包时,发现Data1有数据丢包,则可以将Data2和R异或,得到完整的Data1 。
image.png
这里是三个包一起异或, 1、2、3 异或得到R1, 4、5、6异或得到R2,一次类推。
注意,这种方式如果数据包4、5同时丢包,无法恢复。。
image.png
这里,横向,和纵向都生成冗余包。这时候,如果4、5都丢包,可以找回。
缺点是,需要生成的冗余包更多,算法更复杂。

两个重要的表

image.png
image.png

表1-kFecRateTable

H:\webrtc-20210315\webrtc-20210315\webrtc\webrtc-checkout\src\modules\video_coding\fec_rate_table.h
image.png

表2-PacketMaskRandomTbl

H:\webrtc-20210315\webrtc-20210315\webrtc\webrtc-checkout\src\modules\rtp_rtcp\source\fec_private_tables_random.cc
image.png
第一项12,是固定值。如果不是,则不是有效的表。
从第2项开始,每一项,前面第一个序号递增,从1开始。
12为长度,一共有12项。

  1. namespace webrtc {
  2. namespace fec_private_tables {
  3. const uint8_t kPacketMaskRandomTbl[] = {
  4. 12,
  5. kPacketMaskRandom1, // 2 byte entries.
  6. kPacketMaskRandom2,
  7. kPacketMaskRandom3,
  8. kPacketMaskRandom4,
  9. kPacketMaskRandom5,
  10. kPacketMaskRandom6,
  11. kPacketMaskRandom7,
  12. kPacketMaskRandom8,
  13. kPacketMaskRandom9,
  14. kPacketMaskRandom10,
  15. kPacketMaskRandom11,
  16. kPacketMaskRandom12,
  17. };
  18. } // namespace fec_private_tables
  19. } // namespace webrtc