调用关系关系
RtpMultiReceiver::handleOneRtp
=> RtpTrack::inputRtp
=> PacketSortor::sortPacket
// RtpTrack::inputRtp
...
onBeforeRtpSorted(rtp);
sortPacket(rtp->getSeq(), rtp);
...
主要函数
PacketSortor::sortPacket
void sortPacket(SEQ seq, T packet) {
_latest_seq = seq;
if (!_started) {
// 记录第一个seq
_started = true;
_last_seq_out = seq - 1;
}
// next_seq为记录的seq+1
auto next_seq = static_cast<SEQ>(_last_seq_out + 1);
// 判断收到的seq是否等于记录的seq+1
if (seq == next_seq) {
// 收到下一个seq
output(seq, std::move(packet));
// 清空连续包列表
flushPacket();
return;
}
// 此处开始的逻辑为异常情况
// seq小于next_seq 且不为回环包,直接跳过此包,认为seq错误
if (seq < next_seq && !mayLooped(next_seq, seq)) {
// 无回环风险, 过滤seq回退包
return;
}
// seq>next_seq || seq<next_seq 且为回环的情况
// 放入缓冲区
_pkt_sort_cache_map.emplace(seq, std::move(packet));
// 判断需要强行清空缓冲区
if (needForceFlush(seq)) {
forceFlush(next_seq);
}
}
_lastest_seq
记录当前输入的 seq 值
_last_seq_out
记录上一次合规输入的 seq 值
PacketSortor::mayLooped
bool mayLooped(SEQ last_seq, SEQ now_seq) {
return last_seq > SEQ_MAX - _max_distance
|| now_seq < _max_distance;
}
此函数为判断是否可能未回环包的逻辑,通常情况是 seq 超过了类型的最大值,导致重新置为较小的值。
_max_distance
设定为一个阈值
有两种情况,在此函数中判断可能是回环包
- 上一个记录的 seq 值较大,接近
SEQ_MAX
- 当前的 seq 值较小
PacketSortor::output
void output(SEQ seq, T packet) {
auto next_seq = static_cast<SEQ>(_last_seq_out + 1);
if (seq != next_seq) {
WarnL << "packet dropped: " << next_seq << " -> " << static_cast<SEQ>(seq - 1)
<< ", latest seq: " << _latest_seq
<< ", jitter buffer size: " << _pkt_sort_cache_map.size()
<< ", jitter buffer ms: " << _ticker.elapsedTime();
}
// 记录seq值
_last_seq_out = seq;
_cb(seq, std::move(packe);
// 重置定时器
_ticker.resetTime();
}
此函数用于正常 seq 的包后的处理
- 记录包的 seq 值
- 重置定时器