webrtc 代码走读三(h264 rtp打包)

基本概念 :

H264 编解码器:

        编解码器规范在概念上区分视频编码层(VCL) 和网络抽象层(NAL)。

        VCL编码器输出切片:一点包含整数个宏块数据的字符串宏块和切片头信息。NAL编码器将VCL编码器的切片封装成网络抽象层单元(NAL),适用于通过分组网络或者面向分组的多路复用环境。  webrtc 代码走读三(h264 rtp打包)_第1张图片

        F: 1 bit forbidden_zero_bit. The H.264 specification declares a value of 1 as a syntax violation.

        NRI: 2 bits nal_ref_idc. A value of 00 indicates that the content of the NAL unit is not used to reconstruct reference pictures for inter picture prediction. Such NAL units can be discarded without risking the integrity of the reference pictures. Values greater than 00 indicate that the decoding of the NAL unit is required to maintain the integrity of the reference pictures.

        Type: 5 bits nal_unit_type. This component specifies the NAL unit payload type as defined in Table 7-1 of [1] and later within this memo. For a reference of all currently defined NAL unit types and their semantics, please refer to Section 7.4.1 in [1] 

IDR picture: A coded picture containing only slices with I or SI slice types that causes a "reset" in the decoding proces

一、Payload Structures

h264 rtp打包载荷结构有三种:单一NAL单元模式、组合封包模式、分片封包模式。

 参考:RFC 6184 - RTP Payload Format for H.264 Video

1、单一NAL单元模式

        即一个RTP包仅由一个完整的NALU组成。这种情况下RTP NAL头类型字段和原始的H.264的NALU头类型字段是一样的。对于NALU的长度小于MTU大小的包,一般采用单一NAL单元模式。对于一个原始的H.264NALU单元常由[StartCode][NALUHeader][NALUPayload]三部分组成,其中StartCode用于标示这是一个NALU单元的开始,必须是"00 00 00 01"或"00 00 01",NALU头仅一个字节,其后都是NALU单元内容。打包时去除"00 00 01"或"00 00 00 01"的开始码,把其他数据封包的RTP包即可。

        

webrtc 代码走读三(h264 rtp打包)_第2张图片

https://datatracker.ietf.org/doc/html/rfc6184

2、组合封包模式

        由多个NAL单元组成一个RTP包。组合打包又分STAP(Single-time aggregation packet)、MTAP(Multi-time aggregation packet)两种。

        webrtc 代码走读三(h264 rtp打包)_第3张图片

3、组合封包模式

  • STAP

         单时间聚合包,聚合具有相同NALU时间的NAL单元。定义两种STAPs类型,一个没DON(STAP-A),另一个包含DON(STAP-B)。 

    不包含DON:  

webrtc 代码走读三(h264 rtp打包)_第4张图片

   包含DON:

webrtc 代码走读三(h264 rtp打包)_第5张图片

  • MTAP

        多时间聚合包,聚合具有潜在不同NALU时间的NAL单元。定义了两个不同的MTAPs,其NAL单元的时间戳偏移的长度不同。

4.分片封包模式。

         用于把一个NALU单元封装成多个RTP包。存在两种类型FU-A和FU-B。类型值分别是28和29。而当NALU的长度超过MTU时,就必须对NALU单元进行分片封包。也称为Fragmentation Units(FUs)。将NALU拆分成小于MTU的数据包进行发送。

      webrtc 代码走读三(h264 rtp打包)_第6张图片

webrtc 代码走读三(h264 rtp打包)_第7张图片

webrtc 代码走读三(h264 rtp打包)_第8张图片 

        F:1个比特.
forbidden_zero_bit. 在 H.264 规范中规定了这一位必须为 0.

        NRI:2个比特.
nal_ref_idc. 取00~11,似乎指示这个NALU的重要性,如00的NALU解码器可以丢弃它而不影响图像的回放,0~3,取值越大,表示当前NAL越重要,需要优先受到保护。如果当前NAL是属于参考帧的片,或是序列参数集,或是图像参数集这些重要的单位时,本句法元素必需大于0。

         Type:5个比特
nal_unit_type. 这个NALU单元的类型,1~12由H.264使用,24~31由H.264以外的应用使用,简述如下:
          0     没有定义
          1-23  NAL单元  单个 NAL 单元包
          1     不分区,非IDR图像的片
          2     片分区A
          3     片分区B
          4     片分区C
          5     IDR图像中的片
          6     补充增强信息单元(SEI)
          7     SPS
          8     PPS
          9     序列结束
          10    序列结束
          11    码流借宿
          12    填充
          13-23 保留

          24    STAP-A   单一时间的组合包
          25    STAP-B   单一时间的组合包
          26    MTAP16   多个时间的组合包
          27    MTAP24   多个时间的组合包
          28    FU-A     分片的单元
          29    FU-B     分片的单元
          30-31 没有定义

  • FU header定义

         webrtc 代码走读三(h264 rtp打包)_第9张图片

 S:     1 bit
          When set to one, the Start bit indicates the start of a
          fragmented NAL unit.  When the following FU payload is not the
          start of a fragmented NAL unit payload, the Start bit is set
          to zero.
 E:     1 bit
          When set to one, the End bit indicates the end of a fragmented
          NAL unit, i.e., the last byte of the payload is also the last
          byte of the fragmented NAL unit.  When the following FU
          payload is not the last fragment of a fragmented NAL unit, the
          End bit is set to zero.   
R:     1 bit
          The Reserved bit MUST be equal to 0 and MUST be ignored by the
          receiver.
Type:  5 bits
          The NAL unit payload type as defined in Table 7-1 of 。

  h264的rtp打包模式:

webrtc 代码走读三(h264 rtp打包)_第10张图片

webrtc 代码走读三(h264 rtp打包)_第11张图片     

   h264的rtp打包模式有如下三种:1、Single NAL unit mode;2、Non-interleaved mode;3、Interleaved mode.

根据协议,模式1/2,适合低延时的实时会议系统。模式3适合对系统延时要求不高的传输系统。模式1遵守ITU-T Recommendation H.241协议。模式2不按照这个协议来。三种模式下支持的NAL Unit Type类型如下:

webrtc 代码走读三(h264 rtp打包)_第12张图片

五:webrtc 实现情况

         webrtc只支持Single NAL unit mode和Non-interleaved mode两种打包模式。

        webrtc通过VideoCodec::SetDefaultParameters函数配置kH264FmtpPacketizationMode参数,配置RTP发包模式。

         封包实现函数RtpPacketizerH264::GeneratePackets。

        解包实现函数RtpDepacketizerH264::Parse。

 1)解包函数调用栈

 

RtpDepacketizerH264::ParseH264PictureID
RtpDepacketizerH264::ParseH264Extension
RtpDepacketizerH264::ProcessStapAOrSingleNalu
RtpDepacketizerH264::Parse
RTPReceiverVideo::ParseRtpPacket
RtpReceiverImpl::IncomingRtpPacket
RtpVideoStreamReceiver::ReceivePacket
RtpVideoStreamReceiver::OnRecoveredPacket
UlpfecReceiverImpl::ProcessReceivedFec
RtpVideoStreamReceiver::ParseAndHandleEncapsulatingHeader
RtpVideoStreamReceiver::ReceivePacket
RtpVideoStreamReceiver::OnRtpPacket
RtpDemuxer::OnRtpPacket
RtpStreamReceiverController::OnRtpPacket
internal::Call::DeliverRtp
internal::Call::DeliverPacket
WebRtcVideoChannel::OnPacketReceived
BaseChannel::ProcessPacket

video_coding::RtpFrameReferenceFinder::ManageFrame
RtpVideoStreamReceiver::OnReceivedFrame
video_coding::PacketBuffer::InsertPacket
RtpVideoStreamReceiver::OnReceivedPayloadData
RTPReceiverVideo::ParseRtpPacket
RtpReceiverImpl::IncomingRtpPacket
 

 

 

 

 

  

 

你可能感兴趣的:(webrtc,webrtc,p2p,网络协议)