mirror of
https://github.com/ossrs/srs.git
synced 2025-02-15 04:42:04 +00:00
RTC: Remove and refine NACK removing
This commit is contained in:
parent
f1df0704e8
commit
d61536311b
5 changed files with 8 additions and 33 deletions
|
@ -2109,12 +2109,12 @@ srs_error_t SrsRtcConnection::send_rtcp(char *data, int nb_data)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SrsRtcConnection::check_send_nacks(SrsRtpNackForReceiver* nack, uint32_t ssrc, uint32_t& sent_nacks)
|
void SrsRtcConnection::check_send_nacks(SrsRtpNackForReceiver* nack, uint32_t ssrc, uint32_t& sent_nacks, uint32_t& timeout_nacks)
|
||||||
{
|
{
|
||||||
SrsRtcpNack rtcpNack(ssrc);
|
SrsRtcpNack rtcpNack(ssrc);
|
||||||
|
|
||||||
rtcpNack.set_media_ssrc(ssrc);
|
rtcpNack.set_media_ssrc(ssrc);
|
||||||
nack->get_nack_seqs(rtcpNack);
|
nack->get_nack_seqs(rtcpNack, timeout_nacks);
|
||||||
|
|
||||||
sent_nacks = rtcpNack.get_lost_sns().size();
|
sent_nacks = rtcpNack.get_lost_sns().size();
|
||||||
if(!sent_nacks){
|
if(!sent_nacks){
|
||||||
|
|
|
@ -475,7 +475,7 @@ public:
|
||||||
public:
|
public:
|
||||||
// send rtcp
|
// send rtcp
|
||||||
srs_error_t send_rtcp(char *data, int nb_data);
|
srs_error_t send_rtcp(char *data, int nb_data);
|
||||||
void check_send_nacks(SrsRtpNackForReceiver* nack, uint32_t ssrc, uint32_t& sent_nacks);
|
void check_send_nacks(SrsRtpNackForReceiver* nack, uint32_t ssrc, uint32_t& sent_nacks, uint32_t& timeout_nacks);
|
||||||
srs_error_t send_rtcp_rr(uint32_t ssrc, SrsRtpRingBuffer* rtp_queue, const uint64_t& last_send_systime, const SrsNtp& last_send_ntp);
|
srs_error_t send_rtcp_rr(uint32_t ssrc, SrsRtpRingBuffer* rtp_queue, const uint64_t& last_send_systime, const SrsNtp& last_send_ntp);
|
||||||
srs_error_t send_rtcp_xr_rrtr(uint32_t ssrc);
|
srs_error_t send_rtcp_xr_rrtr(uint32_t ssrc);
|
||||||
srs_error_t send_rtcp_fb_pli(uint32_t ssrc, const SrsContextId& cid_of_subscriber);
|
srs_error_t send_rtcp_fb_pli(uint32_t ssrc, const SrsContextId& cid_of_subscriber);
|
||||||
|
|
|
@ -188,7 +188,6 @@ SrsRtpNackForReceiver::SrsRtpNackForReceiver(SrsRtpRingBuffer* rtp, size_t queue
|
||||||
max_queue_size_ = queue_size;
|
max_queue_size_ = queue_size;
|
||||||
rtp_ = rtp;
|
rtp_ = rtp;
|
||||||
pre_check_time_ = 0;
|
pre_check_time_ = 0;
|
||||||
last_remove_packet_time_ = -1;
|
|
||||||
rtt_ = 0;
|
rtt_ = 0;
|
||||||
|
|
||||||
srs_info("max_queue_size=%u, nack opt: max_count=%d, max_alive_time=%us, first_nack_interval=%" PRId64 ", nack_interval=%" PRId64,
|
srs_info("max_queue_size=%u, nack opt: max_count=%d, max_alive_time=%us, first_nack_interval=%" PRId64 ", nack_interval=%" PRId64,
|
||||||
|
@ -230,7 +229,7 @@ void SrsRtpNackForReceiver::check_queue_size()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SrsRtpNackForReceiver::get_nack_seqs(SrsRtcpNack& seqs)
|
void SrsRtpNackForReceiver::get_nack_seqs(SrsRtcpNack& seqs, uint32_t& timeout_nacks)
|
||||||
{
|
{
|
||||||
// TODO: FIXME: Use packet as tick count, not clock.
|
// TODO: FIXME: Use packet as tick count, not clock.
|
||||||
srs_utime_t now = srs_update_system_time();
|
srs_utime_t now = srs_update_system_time();
|
||||||
|
@ -248,6 +247,7 @@ void SrsRtpNackForReceiver::get_nack_seqs(SrsRtcpNack& seqs)
|
||||||
|
|
||||||
int alive_time = now - nack_info.generate_time_;
|
int alive_time = now - nack_info.generate_time_;
|
||||||
if (alive_time > opts_.max_alive_time || nack_info.req_nack_count_ > opts_.max_count) {
|
if (alive_time > opts_.max_alive_time || nack_info.req_nack_count_ > opts_.max_count) {
|
||||||
|
++timeout_nacks;
|
||||||
rtp_->notify_drop_seq(seq);
|
rtp_->notify_drop_seq(seq);
|
||||||
queue_.erase(iter++);
|
queue_.erase(iter++);
|
||||||
continue;
|
continue;
|
||||||
|
@ -275,22 +275,3 @@ void SrsRtpNackForReceiver::update_rtt(int rtt)
|
||||||
opts_.nack_interval = rtt_;
|
opts_.nack_interval = rtt_;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define PACKET_CLEAR_TIMEOUT (3000 * SRS_UTIME_MILLISECONDS)
|
|
||||||
|
|
||||||
void SrsRtpNackForReceiver::remove_timeout_packets(void)
|
|
||||||
{
|
|
||||||
srs_utime_t now = srs_get_system_time();
|
|
||||||
if (last_remove_packet_time_ == -1) {
|
|
||||||
last_remove_packet_time_ = now;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
srs_utime_t elapsed_time = now - last_remove_packet_time_;
|
|
||||||
last_remove_packet_time_ = now;
|
|
||||||
|
|
||||||
if (elapsed_time > PACKET_CLEAR_TIMEOUT) {
|
|
||||||
rtp_->notify_nack_list_full();
|
|
||||||
queue_.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -133,13 +133,9 @@ public:
|
||||||
SrsRtpNackInfo* find(uint16_t seq);
|
SrsRtpNackInfo* find(uint16_t seq);
|
||||||
void check_queue_size();
|
void check_queue_size();
|
||||||
public:
|
public:
|
||||||
void get_nack_seqs(SrsRtcpNack& seqs);
|
void get_nack_seqs(SrsRtcpNack& seqs, uint32_t& timeout_nacks);
|
||||||
public:
|
public:
|
||||||
void update_rtt(int rtt);
|
void update_rtt(int rtt);
|
||||||
private:
|
|
||||||
srs_utime_t last_remove_packet_time_;
|
|
||||||
public:
|
|
||||||
void remove_timeout_packets(void);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1686,9 +1686,6 @@ srs_error_t SrsRtcRecvTrack::on_nack(SrsRtpPacket2* pkt)
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
uint16_t seq = pkt->header.get_sequence();
|
uint16_t seq = pkt->header.get_sequence();
|
||||||
|
|
||||||
// TODO: check whether is necessary?
|
|
||||||
nack_receiver_->remove_timeout_packets();
|
|
||||||
SrsRtpNackInfo* nack_info = nack_receiver_->find(seq);
|
SrsRtpNackInfo* nack_info = nack_receiver_->find(seq);
|
||||||
if (nack_info) {
|
if (nack_info) {
|
||||||
// seq had been received.
|
// seq had been received.
|
||||||
|
@ -1718,7 +1715,8 @@ srs_error_t SrsRtcRecvTrack::check_send_nacks()
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
uint32_t sent_nacks = 0;
|
uint32_t sent_nacks = 0;
|
||||||
session_->check_send_nacks(nack_receiver_, track_desc_->ssrc_, sent_nacks);
|
uint32_t timeout_nacks = 0;
|
||||||
|
session_->check_send_nacks(nack_receiver_, track_desc_->ssrc_, sent_nacks, timeout_nacks);
|
||||||
statistic_->nacks += sent_nacks;
|
statistic_->nacks += sent_nacks;
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
|
|
Loading…
Reference in a new issue