兼容seq计数器重置不规范的rtp流 (#3860)

rtp seq在重置回退时,之前的逻辑会一直丢数据,修改后将兼容这种不规范的rtp流。
This commit is contained in:
老衲不出家 2024-09-05 15:29:02 +08:00 committed by ziyuexiachu
parent ab22cac85b
commit e322db0a04

View File

@ -68,7 +68,15 @@ public:
}
if (seq < next_seq && !mayLooped(next_seq, seq)) {
// 无回环风险, 过滤seq回退包
// 无回环风险, 缓存seq回退包
_pkt_drop_cache_map.emplace(seq, std::move(packet));
if (_pkt_drop_cache_map.size() > _max_distance || _ticker.elapsedTime() > _max_buffer_ms) {
// seq回退包太多可能源端重置seq计数器这部分数据需要输出
forceFlush(next_seq);
// 旧的seq计数器的数据清空后把新seq计数器的数据赋值给排序列队
_pkt_sort_cache_map = std::move(_pkt_drop_cache_map);
popIterator(_pkt_sort_cache_map.begin());
}
return;
}
_pkt_sort_cache_map.emplace(seq, std::move(packet));
@ -107,12 +115,13 @@ private:
}
bool needForceFlush(SEQ seq) {
return !_pkt_sort_cache_map.empty() && (_pkt_sort_cache_map.size() > _max_buffer_size ||
distance(seq) > _max_distance || _ticker.elapsedTime() > _max_buffer_ms);
return _pkt_sort_cache_map.size() > _max_buffer_size || distance(seq) > _max_distance || _ticker.elapsedTime() > _max_buffer_ms;
}
//外部调用代码确保_pkt_sort_cache_map不为空
void forceFlush(SEQ next_seq) {
if (_pkt_sort_cache_map.empty()) {
return;
}
// 寻找距离比next_seq大的最近的seq
auto it = _pkt_sort_cache_map.lower_bound(next_seq);
if (it == _pkt_sort_cache_map.end()) {
@ -154,6 +163,9 @@ private:
}
break;
}
if (!_pkt_drop_cache_map.empty()) {
_pkt_drop_cache_map.clear();
}
}
iterator popIterator(iterator it) {
@ -190,6 +202,8 @@ private:
SEQ _last_seq_out = 0;
// pkt排序缓存根据seq排序
std::map<SEQ, T> _pkt_sort_cache_map;
// 预丢弃包列表
std::map<SEQ, T> _pkt_drop_cache_map;
// 回调
std::function<void(SEQ seq, T packet)> _cb;
};