webrtc和FFmpeg中几种fec保护机制,几个通用的字段
snbase: 保护的rtp包的开始seq.
P|X|CC|M| :保护的rtp包第一字节n多个标志 xor
pt recovery: 保护的rtp包的payloadtype xor值
TS recovery: 保护的rtp包的timestamp xor值
length recovery :保护的rtp包长度 xor
1. ULPFec协议头,支持多个等级,但是我们不分析多个等级。
// UlpFEC头, 固定10 bytes.
// 0 1 2 3
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// |E|L|P|X| CC |M| PT recovery | SN base |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | TS recovery |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | length recovery |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//
// ulp可变部分 保存对那几个rtp包进行xor的mask, 4 bytes (L = 0) or 8 bytes (L = 1).
// make分为16bit(L=0)和48bit(L=1)的 . L对应UlpFec头的1bit位
// 0 1 2 3
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Protection Length | mask |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | mask cont. (present only when L = 1) |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
FlexFec 可变头支持mask,mask长度有。Mask[0] ,Mask[2] ,Mask[6]最高位控制
Mask[0]& 0x80 ==1 15bit mask
Mask[2]& 0x80 ==1 15bit + 31bit mask
Mask[6]& 0x80 ==1 15bit + 31bit + 63bit mask.// FlexFEC header,SSRC相关字段保存在这个协议头中 // 0 1 2 3 // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // 0 |R|0|P|X| CC |M| PT recovery | length recovery | // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // 4 | TS recovery | // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // 8 | SSRCCount | reserved | // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ // 12 | SSRC_i | // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // 16 | SN base_i |k| Mask [0-14] | // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // 20 |k| Mask [15-45] (optional) | // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // 24 |k| | // +-+ Mask [46-108] (optional) | // 28 | | // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ // : ... next in SSRC_i ... : //
-
FlexFec 固定头,行列矩阵xor
M > 0 and N = 0 行 Fec snbase,snbase+1,snbase+2,…,snbase+M
M > 0 and N > 0 列 FEC。 snbase,snbase+M*1,snbase+M*2,…,snbase+M*N
这样可以进行行列交错保护, 这个没有用过,仅仅看了一下文档// FlexFEC header in 'inflexible' mode (F = 1), 20 bytes. // 0 1 2 3 // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // 0 |0|1|P|X| CC |M| PT recovery | length recovery | // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // 4 | TS recovery | // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // 8 | SSRCCount | reserved | // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // 12 | SSRC_i | // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // 16 | SN base_i | M (columns) | N (`) | // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
FFmepg 固定的2d xor.
[Pro-MPEG COP3] FEC Header
这是FFMpeg中fec协议,
D标志=1 行保护。 offset=1(保护的包seqNo跨度),NA=列大小(保护的包数量)
D标志=0 列保护。 offset=列大小(保护的包seqNo跨度),NA=行大小(保护的包数量)
for(int i=0;i<NA;i++){
xorpacket(snbase + offset*i)
}这个头也有mask字段,我感觉也支持mask指定xor方式,我没有看协议文档,仅仅推测。 其实这个跟FlexFec差不多
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | SNBase | length recovery | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |E| PT recovery | mask | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | TS recovery | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |X|D|type |index| offset | NA |SNBase ext bits| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
** 吐槽一下FFMPEeg中fec,FFMPEeg中fec支持的比较弱,**
1.仅仅支持rtp-mpeg协议,rtp协议不支持。 因为用的固定大小的rtp包(ts流)进行xor.
2.fec支持固定大小矩阵,使用前需要设置,没法动态设置。
3.fec针对的所有的发送数据包,没法针对一桢视频。
总结上面的4种协议:
1.都使用xor进行数据保护,媒体包的rtp头,rtp.payload.
2.FlexFec可以当作rtp包进行发送,不需要再进行封装了。
3.ulpFec需要再打一层RED包,才能进行发送。 因为没有SSRC等东西。
4.pro-mpeg 需要增加rtp头,才能进行发送 。
5.都支持mask方式进行对应rtp媒体包的保护,可以针对随机,突发方式使用不同的策略,可以交叉多重保护。
无论是通过mask方式保护,还是通过矩阵(m*n)方式保护,都需要协议有字段把mask,m,n传递过去