RtpVideoStreamReceiver类收到RTP包后,交给PacketBuffer类缓存、排序,PacketBuffer收集满1个完整的帧后,交还给RtpVideoStreamReceiver类。
音频也有,packet_buffer.cc,不过那是属于NetEq的内容。
H:\webrtc\webrtc-checkout\src\modules\audio_coding\neteq\packet_buffer.cc
PacketBuffer类
InsertPacket函数
1、判断是否第一个包,和包的排序,更新第一个包的序列号。
2、判断是否是重复包,不是则队列满了,需要扩容直到有空间或者扩容失败
3、插入 包,根据对比是否是同一个I帧里面的包。因为rtp的话,同一个帧,则里面的timestamp会是相等的。然后插入包。UpdateMissingPackets更新丢失的包,FindFrames查找是否可以组成一个帧,result.packets不为空则是找到了该帧的所有包,否则为空。
ExpandBufferSize扩容函数
PacketBuffer::PacketBuffer(Clock* clock,
size_t start_buffer_size,
size_t max_buffer_size)
: clock_(clock),
max_size_(max_buffer_size),
first_seq_num_(0),
first_packet_received_(false),
is_cleared_to_first_seq_num_(false),
buffer_(start_buffer_size),
sps_pps_idr_is_h264_keyframe_(false) {
RTC_DCHECK_LE(start_buffer_size, max_buffer_size);
// Buffer size must always be a power of 2.
RTC_DCHECK((start_buffer_size & (start_buffer_size - 1)) == 0);
RTC_DCHECK((max_buffer_size & (max_buffer_size - 1)) == 0);
}
经过打断点,得到:
视频,最大值默认是constexpr int kPacketBufferMaxSize = 2048;,从PacketBufferMaxSize()获得
NetEq,默认配置最大值 size_t max_packets_in_buffer = 200;