send receiver reports only after receiving a sender report

This commit is contained in:
aler9
2021-12-06 17:09:59 +01:00
parent 8068b9b40e
commit 7634076eb5
6 changed files with 30 additions and 3 deletions

View File

@@ -465,8 +465,10 @@ func (c *Client) run() {
now := time.Now() now := time.Now()
for trackID, cct := range c.tracks { for trackID, cct := range c.tracks {
rr := cct.rtcpReceiver.Report(now) rr := cct.rtcpReceiver.Report(now)
if rr != nil {
c.WritePacketRTCP(trackID, rr) c.WritePacketRTCP(trackID, rr)
} }
}
c.udpReportTimer = time.NewTimer(c.udpReceiverReportPeriod) c.udpReportTimer = time.NewTimer(c.udpReceiverReportPeriod)
} else { // Record } else { // Record

View File

@@ -52,10 +52,16 @@ func New(receiverSSRC *uint32, clockRate int) *RTCPReceiver {
} }
// Report generates a RTCP receiver report. // Report generates a RTCP receiver report.
// It returns nil if no RTCP sender reports have been passed to ProcessPacketRTCP yet.
func (rr *RTCPReceiver) Report(ts time.Time) []byte { func (rr *RTCPReceiver) Report(ts time.Time) []byte {
rr.mutex.Lock() rr.mutex.Lock()
defer rr.mutex.Unlock() defer rr.mutex.Unlock()
var zero time.Time
if rr.lastSenderReportTime == zero {
return nil
}
report := &rtcp.ReceiverReport{ report := &rtcp.ReceiverReport{
SSRC: rr.receiverSSRC, SSRC: rr.receiverSSRC,
Reports: []rtcp.ReceptionReport{ Reports: []rtcp.ReceptionReport{

View File

@@ -13,6 +13,8 @@ func TestRTCPReceiverBase(t *testing.T) {
v := uint32(0x65f83afb) v := uint32(0x65f83afb)
rr := New(&v, 90000) rr := New(&v, 90000)
require.Equal(t, []byte(nil), rr.Report(time.Now()))
srPkt := rtcp.SenderReport{ srPkt := rtcp.SenderReport{
SSRC: 0xba9da416, SSRC: 0xba9da416,
NTPTime: 0xe363887a17ced916, NTPTime: 0xe363887a17ced916,

View File

@@ -12,6 +12,8 @@ import (
func TestRTCPSender(t *testing.T) { func TestRTCPSender(t *testing.T) {
rs := New(90000) rs := New(90000)
require.Equal(t, []byte(nil), rs.Report(time.Now()))
rtpPkt := rtp.Packet{ rtpPkt := rtp.Packet{
Header: rtp.Header{ Header: rtp.Header{
Version: 2, Version: 2,

View File

@@ -1167,6 +1167,19 @@ func TestServerPublishRTCPReport(t *testing.T) {
}) })
require.NoError(t, err) require.NoError(t, err)
byts, _ = (&rtcp.SenderReport{
SSRC: 753621,
NTPTime: 0xcbddcc34999997ff,
RTPTime: 54352,
PacketCount: 1,
OctetCount: 4,
}).Marshal()
_, err = l2.WriteTo(byts, &net.UDPAddr{
IP: net.ParseIP("127.0.0.1"),
Port: th.ServerPorts[1],
})
require.NoError(t, err)
// skip firewall opening // skip firewall opening
buf := make([]byte, 2048) buf := make([]byte, 2048)
_, _, err = l2.ReadFrom(buf) _, _, err = l2.ReadFrom(buf)

View File

@@ -324,8 +324,10 @@ func (ss *ServerSession) run() {
now := time.Now() now := time.Now()
for trackID, track := range ss.announcedTracks { for trackID, track := range ss.announcedTracks {
r := track.rtcpReceiver.Report(now) rr := track.rtcpReceiver.Report(now)
ss.WritePacketRTCP(trackID, r) if rr != nil {
ss.WritePacketRTCP(trackID, rr)
}
} }
ss.udpReceiverReportTimer = time.NewTimer(ss.s.udpReceiverReportPeriod) ss.udpReceiverReportTimer = time.NewTimer(ss.s.udpReceiverReportPeriod)