mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-22 10:40:05 +08:00
parent
ab22cac85b
commit
e322db0a04
@ -68,7 +68,15 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (seq < next_seq && !mayLooped(next_seq, seq)) {
|
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;
|
return;
|
||||||
}
|
}
|
||||||
_pkt_sort_cache_map.emplace(seq, std::move(packet));
|
_pkt_sort_cache_map.emplace(seq, std::move(packet));
|
||||||
@ -107,12 +115,13 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool needForceFlush(SEQ seq) {
|
bool needForceFlush(SEQ seq) {
|
||||||
return !_pkt_sort_cache_map.empty() && (_pkt_sort_cache_map.size() > _max_buffer_size ||
|
return _pkt_sort_cache_map.size() > _max_buffer_size || distance(seq) > _max_distance || _ticker.elapsedTime() > _max_buffer_ms;
|
||||||
distance(seq) > _max_distance || _ticker.elapsedTime() > _max_buffer_ms);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//外部调用代码确保_pkt_sort_cache_map不为空
|
|
||||||
void forceFlush(SEQ next_seq) {
|
void forceFlush(SEQ next_seq) {
|
||||||
|
if (_pkt_sort_cache_map.empty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
// 寻找距离比next_seq大的最近的seq
|
// 寻找距离比next_seq大的最近的seq
|
||||||
auto it = _pkt_sort_cache_map.lower_bound(next_seq);
|
auto it = _pkt_sort_cache_map.lower_bound(next_seq);
|
||||||
if (it == _pkt_sort_cache_map.end()) {
|
if (it == _pkt_sort_cache_map.end()) {
|
||||||
@ -154,6 +163,9 @@ private:
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (!_pkt_drop_cache_map.empty()) {
|
||||||
|
_pkt_drop_cache_map.clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
iterator popIterator(iterator it) {
|
iterator popIterator(iterator it) {
|
||||||
@ -190,6 +202,8 @@ private:
|
|||||||
SEQ _last_seq_out = 0;
|
SEQ _last_seq_out = 0;
|
||||||
// pkt排序缓存,根据seq排序
|
// pkt排序缓存,根据seq排序
|
||||||
std::map<SEQ, T> _pkt_sort_cache_map;
|
std::map<SEQ, T> _pkt_sort_cache_map;
|
||||||
|
// 预丢弃包列表
|
||||||
|
std::map<SEQ, T> _pkt_drop_cache_map;
|
||||||
// 回调
|
// 回调
|
||||||
std::function<void(SEQ seq, T packet)> _cb;
|
std::function<void(SEQ seq, T packet)> _cb;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user