video nack 模块
作者:LanPZzzz
文章目录
-
-
-
-
- 1. video nack 模块 在 modules\video_coding\nack_module.cc 中
- 2. NackModule::OnReceivedPacket 获取 video rtp 包
- 3. NackModule::AddPacketsToNack
- 4. NackModule::GetNackBatch,分2种,根据 seq 和 timestamp 进行选择重发,在OnReceivedPacket 是 seq, 任务线程中是 ts
- 5. NackModule::Process, 间隔时间 NackModule::TimeUntilNextProcess
- 6. nack 中的rtt 是由线程驱动传递的
- 7. nack 中的rtt 是怎么计算的,请看第三十章节
-
-
-
1. video nack 模块 在 modules\video_coding\nack_module.cc 中
2. NackModule::OnReceivedPacket 获取 video rtp 包
int NackModule::OnReceivedPacket(uint16_t seq_num, bool is_keyframe) {
rtc::CritScope lock(&crit_);
// 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)
UpdateReorderingStati