mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
RTC: Fix NACK bug
This commit is contained in:
parent
5c6946f484
commit
a0dedba2ab
3 changed files with 24 additions and 40 deletions
|
@ -2078,48 +2078,31 @@ srs_error_t SrsRtcConnection::send_rtcp(char *data, int nb_data)
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
// @see: https://tools.ietf.org/html/rfc4585#section-6.1
|
SrsRtcpNack rtcpNack(ssrc);
|
||||||
vector<uint16_t> nack_seqs;
|
|
||||||
nack->get_nack_seqs(nack_seqs);
|
|
||||||
|
|
||||||
vector<uint16_t>::iterator iter = nack_seqs.begin();
|
rtcpNack.set_media_ssrc(ssrc);
|
||||||
while (iter != nack_seqs.end()) {
|
nack->get_nack_seqs(rtcpNack);
|
||||||
char buf[kRtpPacketSize];
|
|
||||||
|
sent_nacks = rtcpNack.get_lost_sns().size();
|
||||||
|
if(!sent_nacks){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
char buf[kRtcpPacketSize];
|
||||||
SrsBuffer stream(buf, sizeof(buf));
|
SrsBuffer stream(buf, sizeof(buf));
|
||||||
// FIXME: Replace magic number.
|
|
||||||
stream.write_1bytes(0x81);
|
|
||||||
stream.write_1bytes(kRtpFb);
|
|
||||||
stream.write_2bytes(3);
|
|
||||||
stream.write_4bytes(ssrc); // TODO: FIXME: Should be 1?
|
|
||||||
stream.write_4bytes(ssrc); // TODO: FIXME: Should be 0?
|
|
||||||
uint16_t pid = *iter;
|
|
||||||
uint16_t blp = 0;
|
|
||||||
while (iter + 1 != nack_seqs.end() && (*(iter + 1) - pid <= 15)) {
|
|
||||||
blp |= (1 << (*(iter + 1) - pid - 1));
|
|
||||||
++iter;
|
|
||||||
}
|
|
||||||
|
|
||||||
stream.write_2bytes(pid);
|
// TODO: FIXME: Check error.
|
||||||
stream.write_2bytes(blp);
|
rtcpNack.encode(&stream);
|
||||||
|
|
||||||
if (_srs_blackhole->blackhole) {
|
|
||||||
_srs_blackhole->sendto(stream.data(), stream.pos());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// TODO: FIXME: Check error.
|
||||||
char protected_buf[kRtpPacketSize];
|
char protected_buf[kRtpPacketSize];
|
||||||
int nb_protected_buf = stream.pos();
|
int nb_protected_buf = stream.pos();
|
||||||
|
transport_->protect_rtcp(stream.data(), protected_buf, nb_protected_buf);
|
||||||
|
|
||||||
// FIXME: Merge nack rtcp into one packets.
|
|
||||||
if (transport_->protect_rtcp(stream.data(), protected_buf, nb_protected_buf) == srs_success) {
|
|
||||||
// TODO: FIXME: Check error.
|
// TODO: FIXME: Check error.
|
||||||
sendonly_skt->sendto(protected_buf, nb_protected_buf, 0);
|
sendonly_skt->sendto(protected_buf, nb_protected_buf, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
++iter;
|
|
||||||
++sent_nacks;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
srs_error_t SrsRtcConnection::send_rtcp_rr(uint32_t ssrc, SrsRtpRingBuffer* rtp_queue, const uint64_t& last_send_systime, const SrsNtp& last_send_ntp)
|
srs_error_t SrsRtcConnection::send_rtcp_rr(uint32_t ssrc, SrsRtpRingBuffer* rtp_queue, const uint64_t& last_send_systime, const SrsNtp& last_send_ntp)
|
||||||
{
|
{
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
|
@ -230,7 +230,7 @@ void SrsRtpNackForReceiver::check_queue_size()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SrsRtpNackForReceiver::get_nack_seqs(vector<uint16_t>& seqs)
|
void SrsRtpNackForReceiver::get_nack_seqs(SrsRtcpNack& seqs)
|
||||||
{
|
{
|
||||||
// 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();
|
||||||
|
@ -261,7 +261,7 @@ void SrsRtpNackForReceiver::get_nack_seqs(vector<uint16_t>& seqs)
|
||||||
if (now - nack_info.pre_req_nack_time_ >= opts_.nack_interval && nack_info.req_nack_count_ <= opts_.max_count) {
|
if (now - nack_info.pre_req_nack_time_ >= opts_.nack_interval && nack_info.req_nack_count_ <= opts_.max_count) {
|
||||||
++nack_info.req_nack_count_;
|
++nack_info.req_nack_count_;
|
||||||
nack_info.pre_req_nack_time_ = now;
|
nack_info.pre_req_nack_time_ = now;
|
||||||
seqs.push_back(seq);
|
seqs.add_lost_sn(seq);
|
||||||
}
|
}
|
||||||
|
|
||||||
++iter;
|
++iter;
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
#include <srs_kernel_rtc_rtp.hpp>
|
#include <srs_kernel_rtc_rtp.hpp>
|
||||||
|
#include <srs_kernel_rtc_rtcp.hpp>
|
||||||
|
|
||||||
class SrsRtpPacket2;
|
class SrsRtpPacket2;
|
||||||
class SrsRtpQueue;
|
class SrsRtpQueue;
|
||||||
|
@ -132,7 +133,7 @@ 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(std::vector<uint16_t>& seqs);
|
void get_nack_seqs(SrsRtcpNack& seqs);
|
||||||
public:
|
public:
|
||||||
void update_rtt(int rtt);
|
void update_rtt(int rtt);
|
||||||
private:
|
private:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue