mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-22 02:34:26 +08:00
parent
ab22cac85b
commit
e322db0a04
@ -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;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user