mirror of
https://github.com/ossrs/srs.git
synced 2025-02-13 20:01:56 +00:00
RTC: Improve NACK efficiency
This commit is contained in:
parent
3026f2fda8
commit
cff976bb71
4 changed files with 42 additions and 0 deletions
|
@ -1125,6 +1125,13 @@ srs_error_t SrsRtcPublishStream::do_on_rtp(char* plaintext, int nb_plaintext)
|
|||
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 ((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) {
|
||||
// TODO: FIXME: copy pkt by hijacker itself
|
||||
if ((err = _srs_rtc_hijacker->on_rtp_packet(session_, this, req, pkt->copy())) != srs_success) {
|
||||
|
@ -1135,6 +1142,27 @@ srs_error_t SrsRtcPublishStream::do_on_rtp(char* plaintext, int nb_plaintext)
|
|||
return err;
|
||||
}
|
||||
|
||||
srs_error_t SrsRtcPublishStream::check_send_nacks()
|
||||
{
|
||||
srs_error_t err = srs_success;
|
||||
|
||||
for (int i = 0; i < (int)video_tracks_.size(); ++i) {
|
||||
SrsRtcVideoRecvTrack* track = video_tracks_.at(i);
|
||||
if ((err = track->check_send_nacks()) != srs_success) {
|
||||
return srs_error_wrap(err, "video track=%s", track->get_track_id().c_str());
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < (int)audio_tracks_.size(); ++i) {
|
||||
SrsRtcAudioRecvTrack* track = audio_tracks_.at(i);
|
||||
if ((err = track->check_send_nacks()) != srs_success) {
|
||||
return srs_error_wrap(err, "audio track=%s", track->get_track_id().c_str());
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
void SrsRtcPublishStream::on_before_decode_payload(SrsRtpPacket2* pkt, SrsBuffer* buf, ISrsRtpPayloader** ppayload)
|
||||
{
|
||||
// No payload, ignore.
|
||||
|
|
|
@ -314,6 +314,7 @@ public:
|
|||
srs_error_t on_rtp(char* buf, int nb_buf);
|
||||
private:
|
||||
srs_error_t do_on_rtp(char* plaintext, int nb_plaintext);
|
||||
srs_error_t check_send_nacks();
|
||||
public:
|
||||
virtual void on_before_decode_payload(SrsRtpPacket2* pkt, SrsBuffer* buf, ISrsRtpPayloader** ppayload);
|
||||
private:
|
||||
|
|
|
@ -1719,6 +1719,18 @@ srs_error_t SrsRtcRecvTrack::on_nack(SrsRtpPacket2* pkt)
|
|||
return err;
|
||||
}
|
||||
|
||||
srs_error_t SrsRtcRecvTrack::check_send_nacks()
|
||||
{
|
||||
srs_error_t err = srs_success;
|
||||
|
||||
uint32_t sent_nacks = 0;
|
||||
uint32_t timeout_nacks = 0;
|
||||
session_->check_send_nacks(nack_receiver_, track_desc_->ssrc_, sent_nacks);
|
||||
statistic_->nacks += sent_nacks;
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
SrsRtcAudioRecvTrack::SrsRtcAudioRecvTrack(SrsRtcConnection* session, SrsRtcTrackDescription* track_desc)
|
||||
: SrsRtcRecvTrack(session, track_desc, true)
|
||||
{
|
||||
|
|
|
@ -501,6 +501,7 @@ protected:
|
|||
srs_error_t on_nack(SrsRtpPacket2* pkt);
|
||||
public:
|
||||
virtual srs_error_t on_rtp(SrsRtcStream* source, SrsRtpPacket2* pkt) = 0;
|
||||
virtual srs_error_t check_send_nacks();
|
||||
};
|
||||
|
||||
class SrsRtcAudioRecvTrack : public SrsRtcRecvTrack
|
||||
|
|
Loading…
Reference in a new issue