一、编码到发包函数调用图
二、编码函数代码走读
encoded_image_缓存的是编码后的数据。frag_header是NALS组信息。
encoded_image_缓存数据格式为:4个字节起始码+NALHead+date+4个字节起始码+NALHead+date.......
RTPFragmentationHeader* frag_header参数fragmentationOffset和fragmentationLength含义如下:
三、发包函数代码走读
RTPSenderVideo::SendVideo函数四个变量比较绕,整理含义如下(该图没有包含FEC_head):
rtp_sender_->MaxRtpPacketSize()=kVideoMtu:报文最大长度。
packet_capacity:报文去掉RtxHeader后的长度。
max_data_payload_length:名称虽然是总净荷长度,但是实际上这个长度中包含了extension字段。
last_packet_reduction_len:新增extension字段组总长度。如下三个extension长度。
关于extension字段介绍连接如下:https://blog.csdn.net/CrystalShaw/article/details/90606523
备注说明:
last_packet_reduction_len通过last_packet->headers_size() - rtp_header->headers_size()计算得出。
rtp_header->headers_size()的计算流程是:
->rtp_sender_->AllocatePacket()
->packet->SetCsrcs
->payload_offset_ = kFixedHeaderSize + 4 * csrcs.size();
和
->rtp_sender_->AllocatePacket()
->packet->ReserveExtension()
->packet->AllocateExtension()
->packet->AllocateRawExtension()
->payload_offset_ = extensions_offset + 4 * extensions_words;
last_packet->headers_size()的计算流程是:
->packet->SetExtension()
->packet->AllocateExtension()
->packet->AllocateRawExtension()
->payload_offset_ = extensions_offset + 4 * extensions_words;