RtpVideoStreamReceiver类收到RTP包后,交给PacketBuffer类缓存、排序,PacketBuffer收集满1个完整的帧后,交还给RtpVideoStreamReceiver类。
image.png

image.png
音频也有,packet_buffer.cc,不过那是属于NetEq的内容。
H:\webrtc\webrtc-checkout\src\modules\audio_coding\neteq\packet_buffer.cc

PacketBuffer类

image.png

InsertPacket函数

1、判断是否第一个包,和包的排序,更新第一个包的序列号。
image.png
2、判断是否是重复包,不是则队列满了,需要扩容直到有空间或者扩容失败
image.png
3、插入 包,根据对比是否是同一个I帧里面的包。因为rtp的话,同一个帧,则里面的timestamp会是相等的。然后插入包。UpdateMissingPackets更新丢失的包,FindFrames查找是否可以组成一个帧,result.packets不为空则是找到了该帧的所有包,否则为空。
image.png

ExpandBufferSize扩容函数

image.png

  1. PacketBuffer::PacketBuffer(Clock* clock,
  2. size_t start_buffer_size,
  3. size_t max_buffer_size)
  4. : clock_(clock),
  5. max_size_(max_buffer_size),
  6. first_seq_num_(0),
  7. first_packet_received_(false),
  8. is_cleared_to_first_seq_num_(false),
  9. buffer_(start_buffer_size),
  10. sps_pps_idr_is_h264_keyframe_(false) {
  11. RTC_DCHECK_LE(start_buffer_size, max_buffer_size);
  12. // Buffer size must always be a power of 2.
  13. RTC_DCHECK((start_buffer_size & (start_buffer_size - 1)) == 0);
  14. RTC_DCHECK((max_buffer_size & (max_buffer_size - 1)) == 0);
  15. }

经过打断点,得到:
视频,最大值默认是constexpr int kPacketBufferMaxSize = 2048;,从PacketBufferMaxSize()获得
NetEq,默认配置最大值 size_t max_packets_in_buffer = 200;