mirror of
https://github.com/ossrs/srs.git
synced 2025-02-15 04:42:04 +00:00
RTC: Send NACK by timer, no by RTP packet
This commit is contained in:
parent
5919865e5d
commit
d2e728812b
2 changed files with 22 additions and 9 deletions
|
@ -72,7 +72,8 @@ extern SrsPps* _srs_pps_rnack;
|
||||||
extern SrsPps* _srs_pps_rnack2;
|
extern SrsPps* _srs_pps_rnack2;
|
||||||
|
|
||||||
#define SRS_TICKID_RTCP 0
|
#define SRS_TICKID_RTCP 0
|
||||||
#define SRS_TICKID_TWCC 2
|
#define SRS_TICKID_TWCC 1
|
||||||
|
#define SRS_TICKID_SEND_NACKS 2
|
||||||
|
|
||||||
ISrsRtcTransport::ISrsRtcTransport()
|
ISrsRtcTransport::ISrsRtcTransport()
|
||||||
{
|
{
|
||||||
|
@ -1221,13 +1222,6 @@ srs_error_t SrsRtcPublishStream::do_on_rtp(char* plaintext, int nb_plaintext)
|
||||||
return srs_error_new(ERROR_RTC_RTP, "unknown ssrc=%u", ssrc);
|
return srs_error_new(ERROR_RTC_RTP, "unknown ssrc=%u", ssrc);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check then send NACK every each RTP packet, to make it more efficient.
|
|
||||||
// For example, NACK of video track maybe triggered by audio RTP packets.
|
|
||||||
if (nack_enabled_ && (err = check_send_nacks()) != srs_success) {
|
|
||||||
srs_warn("ignore nack err %s", srs_error_desc(err).c_str());
|
|
||||||
srs_freep(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_srs_rtc_hijacker) {
|
if (_srs_rtc_hijacker) {
|
||||||
if ((err = _srs_rtc_hijacker->on_rtp_packet(session_, this, req, pkt)) != srs_success) {
|
if ((err = _srs_rtc_hijacker->on_rtp_packet(session_, this, req, pkt)) != srs_success) {
|
||||||
return srs_error_wrap(err, "on rtp packet");
|
return srs_error_wrap(err, "on rtp packet");
|
||||||
|
@ -1589,7 +1583,7 @@ SrsRtcConnection::SrsRtcConnection(SrsRtcServer* s, const SrsContextId& cid)
|
||||||
req = NULL;
|
req = NULL;
|
||||||
cid_ = cid;
|
cid_ = cid;
|
||||||
stat_ = new SrsRtcConnectionStatistic();
|
stat_ = new SrsRtcConnectionStatistic();
|
||||||
timer_ = new SrsHourGlass("conn", this, 1000 * SRS_UTIME_MILLISECONDS);
|
timer_ = new SrsHourGlass("conn", this, 20 * SRS_UTIME_MILLISECONDS);
|
||||||
hijacker_ = NULL;
|
hijacker_ = NULL;
|
||||||
|
|
||||||
sendonly_skt = NULL;
|
sendonly_skt = NULL;
|
||||||
|
@ -1893,6 +1887,10 @@ srs_error_t SrsRtcConnection::initialize(SrsRequest* r, bool dtls, bool srtp, st
|
||||||
return srs_error_wrap(err, "init");
|
return srs_error_wrap(err, "init");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((err = timer_->tick(SRS_TICKID_SEND_NACKS, 20 * SRS_UTIME_MILLISECONDS)) != srs_success) {
|
||||||
|
return srs_error_wrap(err, "tick nack");
|
||||||
|
}
|
||||||
|
|
||||||
if ((err = timer_->start()) != srs_success) {
|
if ((err = timer_->start()) != srs_success) {
|
||||||
return srs_error_wrap(err, "start timer");
|
return srs_error_wrap(err, "start timer");
|
||||||
}
|
}
|
||||||
|
@ -2267,6 +2265,20 @@ void SrsRtcConnection::update_sendonly_socket(SrsUdpMuxSocket* skt)
|
||||||
srs_error_t SrsRtcConnection::notify(int type, srs_utime_t interval, srs_utime_t tick)
|
srs_error_t SrsRtcConnection::notify(int type, srs_utime_t interval, srs_utime_t tick)
|
||||||
{
|
{
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
|
// For publisher to send NACK.
|
||||||
|
if (type == SRS_TICKID_SEND_NACKS) {
|
||||||
|
std::map<std::string, SrsRtcPublishStream*>::iterator it;
|
||||||
|
for (it = publishers_.begin(); it != publishers_.end(); it++) {
|
||||||
|
SrsRtcPublishStream* publisher = it->second;
|
||||||
|
|
||||||
|
if ((err = publisher->check_send_nacks()) != srs_success) {
|
||||||
|
srs_warn("ignore nack err %s", srs_error_desc(err).c_str());
|
||||||
|
srs_freep(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -355,6 +355,7 @@ public:
|
||||||
srs_error_t on_rtp(char* buf, int nb_buf);
|
srs_error_t on_rtp(char* buf, int nb_buf);
|
||||||
private:
|
private:
|
||||||
srs_error_t do_on_rtp(char* plaintext, int nb_plaintext);
|
srs_error_t do_on_rtp(char* plaintext, int nb_plaintext);
|
||||||
|
public:
|
||||||
srs_error_t check_send_nacks();
|
srs_error_t check_send_nacks();
|
||||||
public:
|
public:
|
||||||
virtual void on_before_decode_payload(SrsRtpPacket2* pkt, SrsBuffer* buf, ISrsRtpPayloader** ppayload);
|
virtual void on_before_decode_payload(SrsRtpPacket2* pkt, SrsBuffer* buf, ISrsRtpPayloader** ppayload);
|
||||||
|
|
Loading…
Reference in a new issue