DEPRECATED_NackModule::OnReceivedPacket
说明
OnReceivedPacket有两个函数
int OnReceivedPacket(uint16t seq_num, bool is_keyframe);
int OnReceivedPacket(uint16_t seq_num, bool is_keyframe, bool is_recovered);
前者调用了后者,第三个参数为false。
第一次进来需要初始化,然后第二个包进来就不需要初始化了。然后开始判断当前是否是上次处理前面的包,是则需要判断是否还在nack列表中,还在则需要删除。
如果是个新包,走下面的逻辑。
每个keyframe只有该keyframe第一个包,才会插入到keyframe_list中,其他位置的不插入。然后更新keyframe_list,只保存一万个值,将多出来的清理掉。接着往下走处理recoverd_list找回的包列表处理。
不是第一个包,不是一个重复的包,不是在newest_seq_num之前的包,也不是一个恢复的包,这时会跑到下面的逻辑。
AddPacketsToNack,将(newest_seq_num+1,seqnum)范围的包插入到NackList nack_list。
GetNackBatch拿到真正的丢包。
AddPacketsToNack
OnReceivedPacket源码
int DEPRECATED_NackModule::OnReceivedPacket(uint16_t seq_num,bool is_keyframe,bool is_recovered) {MutexLock lock(&mutex_);// TODO(philipel): When the packet includes information whether it is// retransmitted or not, use that value instead. For// now set it to true, which will cause the reordering// statistics to never be updated.bool is_retransmitted = true;if (!initialized_) {newest_seq_num_ = seq_num;if (is_keyframe)keyframe_list_.insert(seq_num);initialized_ = true;return 0;}// Since the |newest_seq_num_| is a packet we have actually received we know// that packet has never been Nacked.if (seq_num == newest_seq_num_)return 0;if (AheadOf(newest_seq_num_, seq_num)) {// An out of order packet has been received.auto nack_list_it = nack_list_.find(seq_num);int nacks_sent_for_packet = 0;if (nack_list_it != nack_list_.end()) {nacks_sent_for_packet = nack_list_it->second.retries;nack_list_.erase(nack_list_it);}if (!is_retransmitted)UpdateReorderingStatistics(seq_num);return nacks_sent_for_packet;}// Keep track of new keyframes.if (is_keyframe)keyframe_list_.insert(seq_num);// And remove old ones so we don't accumulate keyframes.auto it = keyframe_list_.lower_bound(seq_num - kMaxPacketAge);if (it != keyframe_list_.begin())keyframe_list_.erase(keyframe_list_.begin(), it);if (is_recovered) {recovered_list_.insert(seq_num);// Remove old ones so we don't accumulate recovered packets.auto it = recovered_list_.lower_bound(seq_num - kMaxPacketAge);if (it != recovered_list_.begin())recovered_list_.erase(recovered_list_.begin(), it);// Do not send nack for packets recovered by FEC or RTX.return 0;}AddPacketsToNack(newest_seq_num_ + 1, seq_num);newest_seq_num_ = seq_num;// Are there any nacks that are waiting for this seq_num.std::vector<uint16_t> nack_batch = GetNackBatch(kSeqNumOnly);if (!nack_batch.empty()) {// This batch of NACKs is triggered externally; the initiator can// batch them with other feedback messages.nack_sender_->SendNack(nack_batch, /*buffering_allowed=*/true);}return 0;}

