(rfc3984)H.264视频的RTP负载格式--学习笔记

H.264视频的RTP负载格式
1介绍-----------------------------------------------------------
一个nal单元由一字节的头和负载字节组成
h.264的一个主要特性是传输时间,解码时间,图像有片断采样时间完全解耦合
参数集概念-------------------------------------------------------
h.264规范包含两类参数集:
  顺序参数集
  图像参数集
参数集结构包含 :图像大小,采用的可选的编码模式,宏块到片断组映射等信息


网络抽象层单元类型-------------------------------------------------
nal的设计信息?????????????
所有nal单元有一个单个nal单元类型字节,也作为rtp负载格式的负载头,后加nal单元的负载
nal单元字节的结构语义


      +---------------+
      |0|1|2|3|4|5|6|7|
      +-+-+-+-+-+-+-+-+
      |F|NRI|  Type   |
      +---------------+
f: 1bit forbidden_zero_bit H.264规范声明设置为1,指示语法违例
nri: 2bit  值为00时指示nal单元的内容不用于重建引用图像的帧
           大于00时要求维护引用图像的完整性
type: 5bit nal_unit_type 本部件指定nal单元负载类型定义


定义和缩写


don(decoding order number):解码顺序号
donb:
dond:解码顺序号差
fec:向前纠错
fu:分片单元
idr:舜间解码刷新
mane:美提感知网络元素
mtap:多时刻聚合包
mtap16:16位时戳位移
mtap24:24位时戳位移
nal网络抽象层
nalu:nal单元
sei:被充增强信息
stap:单时刻聚合包
stap-a:stab类型a
stap-b:stab类型b
ts:时间戳
vcl:视频解码层




RTP 负载格式
RTP头的使用(再看一看rtp头吧)
 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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |V=2|P|X|  CC   |M|     PT      |       sequence number         |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                           timestamp                           |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |           synchronization source (SSRC) identifier            |
      +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
      |            contributing source (CSRC) identifiers             |
      |                             ....                              |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


                       图 1.  RTP 头。
对RTP头作如下设置:
maker_bit(M): 1bit 
对RTP时间戳指示的访问单元的最后一个包位进行设置
允许有效缓冲处理布局
对于聚合包(stap,mtap) m位必须设置成最后一个NAL单元
如果传送在单个RTP包中


注:运送多个nal单元的聚合包只有一个M位相关联, 如果一个网关重新打包一个聚合包为几个包,M位的设置就会显得不可靠


playload type(pt): 7bit
sequece number(sn):16bit
对于单个nalu与非交错打包方式,序号用于nalu解码顺序


timestamp:32bit
设置为内容的采样时戳,必须使用90khz的时钟频率
如果nal单元没有自已的时间戳设置成访问单元主编码图象的时间戳
接收者应该忽略包含在访问单元的任何图像时间SEI消息,通过rtp时戳同步显示过程




注:因为h.264允许解码顺序可以和显示顺序不同,RTP时戳的值对于RTP的序号可以不是单调非减的


RTP负载格式的公共结构-------------------------------------------
可以通过rtp负载的第一个字节来识别负载结构
单个nal单元包   (h264需要的rbsp)
聚合包:
stap-a聚合包a (nal单元的大小为65535)
stap-b聚合包b
mtap16
mtap24
分片单元:
FU-A分片单元fu-a
FU-B分片单元fu-b




   Table 1.  单元类型以及负载结构总结
   单元类型号
      Type   Packet    Type name                        Section
      ---------------------------------------------------------
      0      undefined                                    -
      1-23   NAL unit  Single NAL unit packet per H.264   5.6
      24     STAP-A    Single-time aggregation packet     5.7.1
      25     STAP-B    Single-time aggregation packet     5.7.1
      26     MTAP16    Multi-time aggregation packet      5.7.2
      27     MTAP24    Multi-time aggregation packet      5.7.2
      28     FU-A      Fragmentation unit                 5.8
      29     FU-B      Fragmentation unit                 5.8
      30-31  undefined                                    -
注:没有限制单封装在单个nal单元包和分片单元的大小
   封装在聚合包nal单无的大小为(65535)


nal单元字节的使用-------------------------------------------------


      +---------------+
      |0|1|2|3|4|5|6|7|
      +-+-+-+-+-+-+-+-+
      |F|NRI|  Type   |
      +---------------+


f:1bit forbidden_zero_bit
nri: 2bit  nal_ref_idc
 0值和非0值与h264规范一样
          大于00的nri值指示相对传输优先级
 最高优先级是11,依次为10-01 ,00最低
注:任何非零的nri在h.264解码器的处理是相同的,接收者在传送nal单元给解码器时不必操作nri的值


nal单元类型的值:
h.264编码器必须要据h264的规范设置nri值
当nal_unit_type范围是1到12
在h.264规范要求对于nal_unit_type为6,9,10,11,12的nal单元的nri值为0
nal_unit_type为7,8的nal单元的nri值为11,nal单元里封装有是(序列参数集和图像参数集)
nal_unit_type为5的nal单元的nri值为11


注:在某些profile中数据分区不可用,在main或baseline profiles
   如果nal 单元类型2,3,4出现在视频流符合数据分区被允许的profile情况下
   不会出现在符合main/baseline profile


   Table 2.  编码片和主编码参考图像数据分区的编码片的NRI值的例子


      NAL Unit Type     Content of NAL unit              NRI (binary)
      ----------------------------------------------------------------
       1              non-IDR coded slice                         10
       2              Coded slice data partition A                10
       3              Coded slice data partition B                01
       4              Coded slice data partition C                01


         注释: 像以前提起的, 非参考图像NRI值是00.


h.264编码器应该设置冗余编码参考图像的编码片和编码片分区nal单元的nri值为01


nal单元类型(nal_unit_type)24-29的nri的定义??????????????
nal单元类型(nal_unit_type)13-23的nri的值,这些值保留给itu-t,iso/iec
nal单元类型(nal_unit_type)0,30,31的nri的值,没有指定


打包方式------------------------------------------------------------------
 1 单个NAL单元方式 常规系统,兼容itu-t h.261
 2 非交错方式 可以不符合ITU-T H.241建议.在非交错方式, NAL单元按照NAL单元解码顺序传送
 3 交错方式  不要求非常低端到端延迟的系统,允许传送NAL单元不按照NAL单元解码顺序


设置打包方式:通过optional packetization-mode mime的值指定
每个打包方式允许的NAL单元类型总结(yes = 允许, no = 不允许, ig = 忽略)


                       单个nal方式    非交错方式        交错方式
      Type   Packet    Single NAL    Non-Interleaved    Interleaved
                       Unit Mode           Mode             Mode
      -------------------------------------------------------------


      0      undefined     ig               ig               ig
      1-23   NAL unit     yes              yes               no
      24     STAP-A        no              yes               no
      25     STAP-B        no               no              yes
      26     MTAP16        no               no              yes
      27     MTAP24        no               no              yes
      28     FU-A          no              yes              yes
      29     FU-B          no               no              yes
      30-31  undefined     ig               ig               ig




解码顺序号don-------------------------------------------------------------
在交错打包方式,nal单元的传输顺序允许和nal单元的解码顺序不同
解码顺序号是负载结构中的一个域或一个获得变量指示nal单元的解码顺序
(按解码顺序传输)
传输和解码顺序的耦合由optional sprop-interleaving-depth mime参数控制
如果optional sprop-interleaving-depth mime该值等于0,或者外部手段不允许nal单元顺序和解码顺序不同,此时传输顺序和解码顺序必需一致 


如果允许不一致:
mtap16/mtap24中的nal单元顺序不要求是
两个连续包中的stap-b,mtap,fu解嵌套产生的nal单元序号不要求是nal单元解码序号


stap-a和fu-a的负载结构中不含don
stap-b和fu-b的负载结构包含 don


注:当fu-a出现在交错方式,后面总跟一个fu-b,设置自已的don
    想封装单个nal单元,且每个包都不按照他们的解码顺序 可以使用stap-b包




单个nal单元打包:传输顺序由rtp序号确定,必须要nal单元解码顺序一致
非交错打包方式:在单nal单元包 stap-a  fu-a中nal单元的传输顺序必须和解码一致
                解码顺序首先由stap隐含顺序提供,再次由rtp序号提供
在传送STAP-B MTAP和FU-B开始的一些列分片单元中的nal单元的don值?????????????




传输顺序中的nal单元,可以设置成任何值,0-65535 循环
在传送STAP-B MTAP和FU-B开始的一些列分片单元中的nal单元的don值按如下:
DON(i)是索引为i传输顺序的解码顺序号. 函数don_diff(m,n)定义如下:
   
      If DON(m) == DON(n), don_diff(m,n) = 0


      If (DON(m) < DON(n) and DON(n) - DON(m) < 32768),
      don_diff(m,n) = DON(n) - DON(m)


      If (DON(m) > DON(n) and DON(m) - DON(n) >= 32768),
      don_diff(m,n) = 65536 - DON(m) + DON(n)


      If (DON(m) < DON(n) and DON(n) - DON(m) >= 32768),
      don_diff(m,n) = - (DON(m) + 65536 - DON(n))


      If (DON(m) > DON(n) and DON(m) - DON(n) < 32768),
      don_diff(m,n) = - (DON(m) - DON(n))
              
don相关的值:
don
donb
dond


如果两个nal解码单元顺序的nal单元交换,新序号不符合nal单元解码顺序,nal单元不能有相同的don值,反之可以相同
例如: 当使用的视频编码profile允许任意分片顺序,一个编码图像的所有编码片的nal单元可以有相同的don值,可以按照任何顺序解码,如果有不同的don值的nal单元应该按照指定的顺序传递给解码器


连接的nal单元如果有不同的don值,don的值应该是递增的,但不决对是加1


 
解包过程恢复NAL单元解码的例子??????????????????????????????










单个NAL单元包----------------------------------------------------------
单个nal单元包必须只包含一个类型定义在nal单元
一个封装单个nal单元包到rtp的nal单元流的rtp序号必须符合nal单元的解码顺序








注: NAL单元的第一字节和RTP负载头第一个字节重合。


       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |F|NRI|  type   |                                               |
      +-+-+-+-+-+-+-+-+                                               |
      |                                                               |
      |               Bytes 2..n of a Single NAL unit                 |
      |                                                               |
      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                               :...OPTIONAL RTP padding        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


      Figure 2.  单个NAL单元包的RTP负载格式。


聚合包--------------------------------------------------------------
nal单元聚合安排
本规范定义的两类聚合包:
单时间聚合包STAP: 聚合相同nalu时间的nal单元,
 stap-a 包含don
 stap-b 不包含don
多时间聚合包MTAP:聚合具有差异nalu时间的nal单元
 MTAP16 nal单元时戳位移长度为:16位
 MTAP24 同上,24位
       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |F|NRI|  type   |                                               |
      +-+-+-+-+-+-+-+-+                                               |
      |                                                               |
      |             one or more aggregation units                     |
      |                                                               |
      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                               :...OPTIONAL RTP padding        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


      图 3.  聚合包的RTP负载格式。


mtaps和staps公用以下打包规则:
rtp时戳必须设置为被聚合nal单元中最早nalu时间,具体类型域的设置如下表


 表 4.  STAPs和MTAPs的类型域


  Type  Packet 时戳位移域长度(位)DON相关的域(DON, DONB, DOND)是否存在
      --------------------------------------------------------
    24  STAP-A       0                 no
    25  STAP-B       0                 yes
    26  MTAP16      16                 yes
    27  MTAP24      24                 yes
如果聚合单元的F位为0,f位必须清除,否则必须设置,nri的值必须是运送在聚合包中nal单元的最大值 
RTP头的maker位置为聚合包中最后nal单元 


聚合包的负载由一个或多个聚合单元组成(单时间(stap-a/stap-b),多时间(mtap-a/mtap-b)),一个聚合包可以传送多个聚合单元
一个聚合包不可以包含指定的分片单元,聚合包不可以嵌套
  




单时间聚合包------------------------------------------------------
应用场景:
当聚合在一起的nal单元使用相同的nalu时刻


stap-a负载不包括don,至少要包含一个单时刻聚合单元




       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                      :                                               |
      +-+-+-+-+-+-+-+-+                                               |
      |                                                               |
      |                single-time aggregation units                  |
      |                                                               |
      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                               :
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


                     图 4.  STAP-A负载格式


stap-b负载包含一个16位的无符号解码顺序号(don),(网络字节序),至少要一个单时刻聚合单元




       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                      :  decoding order number (DON)  |               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
      |                                                               |
      |                single-time aggregation units                  |
      |                                                               |
      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                               :
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


                 图 5.  STAP-B 负载格式


don域:指定STAP-B传输顺序中第一个nal单元的don值,对于后续出现的stap-b中的nal单元,don的值等于(stap-b的前一个nal的don值—+1)%65535






单时刻聚合单元有一个16位无符号大小信息(网络字节序),用于指示紧跟其后的nal单元的大小,(不包含这两个字节,但包含单元类型字节)
      
       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                      :        NAL unit size          |               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
      |                                                               |
      |                           NAL unit                            |
      |                                                               |
      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                               :
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


              图 6.  单时刻聚合单元的结构


一个RTP包包含一个STAP-A,STAP包含两个单时刻聚合单元
       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                          RTP Header                           |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |STAP-A NAL HDR |         NALU 1 Size           | NALU 1 HDR    |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                         NALU 1 Data                           |
      :                                                               :
      +               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |               | NALU 2 Size                   | NALU 2 HDR    |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                         NALU 2 Data                           |
      :                                                               :
      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                               :...OPTIONAL RTP padding        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


      图 7.  RTP包包含一个STAP-A. STAP包含两个单时刻聚合单元


一个rtp包包含一个stap-b,stap包含两个单时刻聚合单元




       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                          RTP Header                           |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |STAP-B NAL HDR | DON                           | NALU 1 Size   |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      | NALU 1 Size   | NALU 1 HDR    | NALU 1 Data                   |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
      :                                                               :
      +               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |               | NALU 2 Size                   | NALU 2 HDR    |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                       NALU 2 Data                             |
      :                                                               :
      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                               :...OPTIONAL RTP padding        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


      图 8.  一个RTP包包含一个STAP-B. STAP包含两个单时刻聚合单元例子




多时刻聚合包----------------------------------------------------
多时刻聚合包的nal单元负载有:
1 16位的无符号解码顺序号基址(donb),donb必须包含mtap时的nal单元的          第一个nal的don值
2 (网络字节序)
3 一个或多个时刻聚合单元
注:nal解码顺序中的第一个nal单元不必是封装在mtap中的第一个nal单元
    




       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                      :  decoding order number base   |               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
      |                                                               |
      |                 multi-time aggregation units                  |
      |                                                               |
      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                               :
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


           图 9. MTAP的NAL单元负载格式




本规范定义了两个多时刻聚合单元, 
mtap16
mtap24
两类单元都包含以下内容:
16位的无符号大小信息
一个8位无符号解码序号差值(dond)
n位时戳位移(可以是16/24),时戳位移越大,mtap灵活性越大
一个包中的聚人合单元开始到结束不要求位于32位的边界
don的值等于(donb+dond)%65535
大多数情况下使用nal单元解码顺序
时戳位移域
    如果nalu-time大于包的rtp时戳,则时戳位移=(nalu-time-包的rtp时戳)
    如果malu-time小于包的rtp时戳,时戳位移=nalu-time+(2~32-包的rtp时戳)




       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      :        NAL unit size          |      DOND     |  TS offset    |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  TS offset    |                                               |
      +-+-+-+-+-+-+-+-+              NAL unit                         |
      |                                                               |
      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                               :
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


                  图 10.  MTAP16多时刻聚合单元


       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      :        NALU unit size         |      DOND     |  TS offset    |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |         TS offset             |                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
      |                              NAL unit                         |
      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                               :
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


                 图 11.  MTAP24多时刻聚合单元
一个mtap中最早的聚合单元时戳位移必须为0,mtap的rtp时戳和最早的nalu-time相同






一个rtp包包含一个多时刻mtap16类型的聚合包, 聚合包包括两个多时刻聚合单元


       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                          RTP Header                           |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |MTAP16 NAL HDR |  decoding order number base   | NALU 1 Size   |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  NALU 1 Size  |  NALU 1 DOND  |       NALU 1 TS offset        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  NALU 1 HDR   |  NALU 1 DATA                                  |
      +-+-+-+-+-+-+-+-+                                               +
      :                                                               :
      +               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |               | NALU 2 SIZE                   |  NALU 2 DOND  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |       NALU 2 TS offset        |  NALU 2 HDR   |  NALU 2 DATA  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
      :                                                               :
      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                               :...OPTIONAL RTP padding        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


      图 12. 一个RTP包包含一个多时刻MTAP16类型的聚合包,包括两个多时刻聚合单元










一个rtp包包含一个多时刻mtap24类型的聚合包,聚合包括两个多时刻聚合单元


       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                          RTP Header                           |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |MTAP24 NAL HDR |  decoding order number base   | NALU 1 Size   |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  NALU 1 Size  |  NALU 1 DOND  |       NALU 1 TS offs          |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |NALU 1 TS offs |  NALU 1 HDR   |  NALU 1 DATA                  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
      :                                                               :
      +               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |               | NALU 2 SIZE                   |  NALU 2 DOND  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |       NALU 2 TS offset                        |  NALU 2 HDR   |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  NALU 2 DATA                                                  |
      :                                                               :
      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                               :...OPTIONAL RTP padding        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


      图 13.  RTP包包含一个多时刻MTAP24类型的聚合包,包括两个多时刻聚合单元








分片单元fus----------------------------------------------------------
本负载类型允许分片一个nal单元到几个rtp包中,在应用层分片的好处在于:
1 负载中nal单元大于64k字节,可以在ipv4网络中进行传输
2 分派机制允许分片单个图像,采用一般向前的纠错


分片只定义于单个nal不用于任何聚合包
nal单元的一个分片由整数个连续nal单元字节组成
相同的nal单元的分片必须递增的RTP序号连序发送
nal单元必须按照RTP序号顺序装配
fus不可以嵌套
运送fu的RTP时戳被设置成人片nal单元的nalu时刻




fu-a的RTP负载格式------------------------------------------------
由1个字节的分片单元指示
一字节的分片单元头
分片单元负载


       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      | FU indicator  |   FU header   |                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
      |                                                               |
      |                         FU payload                            |
      |                                                               |
      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                               :...OPTIONAL RTP padding        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


      图 14.  FU-A的RTP负载格式




fu-b的RTP负载格式------------------------------------------------
一字节的分片单元指示
一字节的分片单元头
解码顺序号
分片单元负载


       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      | FU indicator  |   FU header   |               DON             |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|
      |                                                               |
      |                         FU payload                            |
      |                                                               |
      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                               :...OPTIONAL RTP padding        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


          图 15.  FU-B的RTP负载格式


对于分片nal单元的第一个分片:
如果是交错打包方式,必须使用fu-b(即它作为第一个分片)后面跟的是一个或多个fu-a 分片




 FU指示字节有以下格式(FU indicator):
      +---------------+
      |0|1|2|3|4|5|6|7|
      +:-+-+-+-+-+-+-+-+
      |F|NRI|  Type   |
      +---------------+
fu指示字节的类型域:
  fu-a 28
  fu-b 29
NRI的值必须跟据分片nal单元NRI的值设置
 


fu头格式( FU header):
  FU头的格式如下:
      +---------------+
      |0|1|2|3|4|5|6|7|
      +-+-+-+-+-+-+-+-+
      |S|E|R|  Type   |
      +---------------+
s: 1bit  当设置成1,开始位指示分片nal单元的开始
         如果跟随的fu负载不是分片单元的开始,则设置为0


e: 1bit  当设置成1,结束位指示分片单元的结束,
         即负载的最后字节也是分片nal单元的最后字节
         反之,则设为0
r: 1bit 保留位必须设置为0,接收者必须忽略该位
type: 5bit nal单元的负载类型




注: fu-b中的don域允许网关分片nal单元到fu-b而不用组织进来的nal单元到nal单元解码顺序


一个分片单元不可以传输在一个fu中,即开始位和结束位不可以被同时设置在同一个fu中
一个fu负载可以有任意字节也可为空


如果一个分片单元丢失,接收者应该丢弃后续的所有分片单元,即相同分片nal单元的传输顺序的分片
接收者可以聚合前一个nal单元的n-1分片到一个不完全的nal单元,这时forbidden_zero_bit必须设置为0






打包规则-----------------------------------------------------------
所有的打包方式,发送者必须遵守的打包规则:
1 属于同一编码图象(相同的rtp时戳)的编码nal单元,可以任何顺序发送
2 参数集
3 manes不可以重复任何nal单元,除了顺序和图像参数集nal单元




使用非交错方式和交错方式:
manes可以转换单个nal单元包到一个聚合包,转换一个聚合包到几个单个nal单元包




单个nal单元模式:
应用在optional打包方式mime参数等于0,不包含打包方式,
主要应用低延迟应用,只有单个nal单元可以用, staps mtaps fus不可以使用
传输顺序必须和nal解码顺序一致




非交错方式
在optional打包方式mime参数值等于1,主要应用于低延迟应用
本方式只允许单个nal单元包,stap-as fu-as,
stap-bs,mtaps,fu-bs不可以使用
传输顺序必须和nal解码顺序一致




交错方式:
本方式应用在optional打包方式mine参数值等于2
stap-bs mtaps fu-as fu-bs可以使用
stap-as和单个nal单元包不可以使用




打包过程--------------------------------------


单个nal和非交错方式
接收者存储起来的包按照接收顺序存储在接收缓冲区中
包被解封装,按照rtp序号的顺序,如果是单个nal单元包,nal单元直接传递给解码器
如果是一个stap-a,包含在包中的nal单无按照在包中的顺序传递给解码器
如果是一个fu-a,所有的分片nal单元的单元分片连接在一起传递给解码器




交错方式:
重新排序nal单元从传输顺序到nal单元解码顺序
接收者有一个接收缓冲区来补尝传输延迟抖动
还有个解交错缓冲








如何计算交错缓冲区的大小 (解交错缓冲区的大小)
在sdp offer/answer模型中,
接收者可以分配一个解交错缓冲区,使用deintbuf-cap mime参数
发送者指示解交错缓冲区大小的要求,使sprop-deint-buf-req mime参数
因此设置解交错缓冲区大小>=sprop-deint-buf-req mime参数指定的值


























(解交错过程)
指定接收过程如何组织接收到nal单元到nal解码顺序
在接收者中有两种缓存状态:
   初始缓冲  发生成rtp会话初始化时,
   正在播放缓冲


常用函数:
absDON
don_diff
常数n 是optional sprop-interleaving-depth mime类型参数的值




初始缓冲持续直到以下条件完成:
1 在解交错缓冲区中有 n   vcl(视频编 码层)   nal单元
2 如果sprop-max-don-diff存在,don_diff(m,n)大于sprop-max-don-diff的值
    n对应所有接收到的nal单元中最大absDON值的nal单元
    m对应最小
3 初始缓冲区持续时间>= optional sprop-init-buf-time mime参数指定的值




要从解交错缓中区删除的nal单元的确定:
1 如果解交错缓冲区包含至少n个vcl  nal单元,nal单元从解交错缓冲区移到解码器
  按下面的次序,直到中包含n-1 vcl nal单元
2 如果sprop-max-don-diff存在,他们的don-diff(m,n)大于sprop-max-don-diff大 于sprop-max-don-diff的从解交错缓冲区移出传送给解码器




nal单元传递给解码器的顺序:
1 rtp会话开始时 初始化pdon为0
2 计算每个关联don的nal单元的don距离
  如果nal单元的don大于pdon的值,don=don-pdon
  否则,don=65535-pdon+don+1
3 nal单元分发给解码器按照don距离递增的顺序,如果don相同,可按任意顺序传送
4 当一定数目的nal单元传递给解码器,pdon的值设置为传给解码器最后一个nal单元的don值


附加打包规则
实现一个可操作的h.264打包器:
1 智能rtp接收者 可以识别丢失的编码片断数据分区a(dpas),如果发现丢失dpa
  网关可以决定不发送对应的编码片断数据分区b和c,
2 智能rtp接收者 可以识别丢失的fu,如果发现丢失一个fu.网关可以决定不发送同     同一个分片nal的后续fu 
3 不得不丢弃包或nalu的智能接收者应该首先丢弃所有nal单元中所有nal单元类型    中nri的值等于0的包





































































你可能感兴趣的:((rfc3984)H.264视频的RTP负载格式--学习笔记)