webrtc-ulpfec等协议对比

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)             |
	//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  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 ...                    :
     //
    
  2. 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 (`)   |
     //    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    
  3. 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传递过去

猜你喜欢

转载自blog.csdn.net/qq_16135205/article/details/89924537