mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-22 19:00:01 +08:00
优化rtp重发列队性能
This commit is contained in:
parent
6707b13418
commit
a0b464958c
@ -15,12 +15,17 @@ using namespace toolkit;
|
|||||||
using namespace mediakit;
|
using namespace mediakit;
|
||||||
|
|
||||||
static constexpr uint32_t kMaxNackMS = 5 * 1000;
|
static constexpr uint32_t kMaxNackMS = 5 * 1000;
|
||||||
|
static constexpr uint32_t kRtpCacheCheckInterval = 100;
|
||||||
|
|
||||||
void NackList::pushBack(RtpPacket::Ptr rtp) {
|
void NackList::pushBack(RtpPacket::Ptr rtp) {
|
||||||
auto seq = rtp->getSeq();
|
auto seq = rtp->getSeq();
|
||||||
_nack_cache_seq.emplace_back(seq);
|
_nack_cache_seq.emplace_back(seq);
|
||||||
_nack_cache_pkt.emplace(seq, std::move(rtp));
|
_nack_cache_pkt.emplace(seq, std::move(rtp));
|
||||||
while (getCacheMS() > kMaxNackMS) {
|
if (++_cache_ms_check < kRtpCacheCheckInterval) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_cache_ms_check = 0;
|
||||||
|
while (getCacheMS() >= kMaxNackMS) {
|
||||||
//需要清除部分nack缓存
|
//需要清除部分nack缓存
|
||||||
popFront();
|
popFront();
|
||||||
}
|
}
|
||||||
@ -57,16 +62,17 @@ RtpPacket::Ptr *NackList::getRtp(uint16_t seq) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint32_t NackList::getCacheMS() {
|
uint32_t NackList::getCacheMS() {
|
||||||
|
while (_nack_cache_seq.size() > 2) {
|
||||||
auto back_stamp = getRtpStamp(_nack_cache_seq.back());
|
auto back_stamp = getRtpStamp(_nack_cache_seq.back());
|
||||||
if (back_stamp == -1) {
|
if (back_stamp == -1) {
|
||||||
_nack_cache_seq.pop_back();
|
_nack_cache_seq.pop_back();
|
||||||
return 0;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto front_stamp = getRtpStamp(_nack_cache_seq.front());
|
auto front_stamp = getRtpStamp(_nack_cache_seq.front());
|
||||||
if (front_stamp == -1) {
|
if (front_stamp == -1) {
|
||||||
_nack_cache_seq.pop_front();
|
_nack_cache_seq.pop_front();
|
||||||
return 0;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (back_stamp >= front_stamp) {
|
if (back_stamp >= front_stamp) {
|
||||||
@ -75,6 +81,8 @@ uint32_t NackList::getCacheMS() {
|
|||||||
//很有可能回环了
|
//很有可能回环了
|
||||||
return back_stamp + (UINT32_MAX - front_stamp);
|
return back_stamp + (UINT32_MAX - front_stamp);
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int64_t NackList::getRtpStamp(uint16_t seq) {
|
int64_t NackList::getRtpStamp(uint16_t seq) {
|
||||||
auto it = _nack_cache_pkt.find(seq);
|
auto it = _nack_cache_pkt.find(seq);
|
||||||
|
@ -30,6 +30,7 @@ private:
|
|||||||
mediakit::RtpPacket::Ptr *getRtp(uint16_t seq);
|
mediakit::RtpPacket::Ptr *getRtp(uint16_t seq);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
int _cache_ms_check = 0;
|
||||||
std::deque<uint16_t> _nack_cache_seq;
|
std::deque<uint16_t> _nack_cache_seq;
|
||||||
std::unordered_map<uint16_t, mediakit::RtpPacket::Ptr> _nack_cache_pkt;
|
std::unordered_map<uint16_t, mediakit::RtpPacket::Ptr> _nack_cache_pkt;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user