diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 692bbf708..e83243ef6 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -1751,22 +1751,32 @@ srs_error_t SrsRtcPublisher::on_video(SrsRtpPacket2* pkt) srs_error_t SrsRtcPublisher::on_nack(SrsRtpPacket2* pkt) { srs_error_t err = srs_success; - + + SrsRtpNackForReceiver* nack_receiver = audio_nack_; + SrsRtpRingBuffer* ring_queue = audio_queue_; + + uint32_t ssrc = pkt->header.get_ssrc(); uint16_t seq = pkt->header.get_sequence(); - SrsRtpNackInfo* nack_info = audio_nack_->find(seq); + bool video = (ssrc == video_ssrc) ? true : false; + if (video) { + nack_receiver = video_nack_; + ring_queue = video_queue_; + } + + SrsRtpNackInfo* nack_info = nack_receiver->find(seq); if (nack_info) { return err; } + // insert check nack list uint16_t nack_first = 0, nack_last = 0; - if (!audio_queue_->update(seq, nack_first, nack_last)) { - srs_warn("too old seq %u, range [%u, %u]", seq, audio_queue_->begin, audio_queue_->end); + if (!ring_queue->update(seq, nack_first, nack_last)) { + srs_warn("too old seq %u, range [%u, %u]", seq, ring_queue->begin, ring_queue->end); } - if (srs_rtp_seq_distance(nack_first, nack_last) > 0) { srs_trace("update seq=%u, nack range [%u, %u]", seq, nack_first, nack_last); - audio_nack_->insert(nack_first, nack_last); - audio_nack_->check_queue_size(); + nack_receiver->insert(nack_first, nack_last); + nack_receiver->check_queue_size(); } return err; @@ -2132,6 +2142,8 @@ srs_error_t SrsRtcPublisher::notify(int type, srs_utime_t interval, srs_utime_t send_rtcp_rr(audio_ssrc, audio_queue_); send_rtcp_xr_rrtr(video_ssrc); send_rtcp_xr_rrtr(audio_ssrc); + check_send_nacks(video_nack_, video_ssrc); + check_send_nacks(audio_nack_, audio_ssrc); return err; }