diff --git a/client.go b/client.go index 3209020e..87f97690 100644 --- a/client.go +++ b/client.go @@ -465,7 +465,9 @@ func (c *Client) run() { now := time.Now() for trackID, cct := range c.tracks { rr := cct.rtcpReceiver.Report(now) - c.WritePacketRTCP(trackID, rr) + if rr != nil { + c.WritePacketRTCP(trackID, rr) + } } c.udpReportTimer = time.NewTimer(c.udpReceiverReportPeriod) diff --git a/pkg/rtcpreceiver/rtcpreceiver.go b/pkg/rtcpreceiver/rtcpreceiver.go index d41ee75f..3ee5a7d3 100644 --- a/pkg/rtcpreceiver/rtcpreceiver.go +++ b/pkg/rtcpreceiver/rtcpreceiver.go @@ -52,10 +52,16 @@ func New(receiverSSRC *uint32, clockRate int) *RTCPReceiver { } // 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 { rr.mutex.Lock() defer rr.mutex.Unlock() + var zero time.Time + if rr.lastSenderReportTime == zero { + return nil + } + report := &rtcp.ReceiverReport{ SSRC: rr.receiverSSRC, Reports: []rtcp.ReceptionReport{ diff --git a/pkg/rtcpreceiver/rtcpreceiver_test.go b/pkg/rtcpreceiver/rtcpreceiver_test.go index 10996ae5..36d23b9b 100644 --- a/pkg/rtcpreceiver/rtcpreceiver_test.go +++ b/pkg/rtcpreceiver/rtcpreceiver_test.go @@ -13,6 +13,8 @@ func TestRTCPReceiverBase(t *testing.T) { v := uint32(0x65f83afb) rr := New(&v, 90000) + require.Equal(t, []byte(nil), rr.Report(time.Now())) + srPkt := rtcp.SenderReport{ SSRC: 0xba9da416, NTPTime: 0xe363887a17ced916, diff --git a/pkg/rtcpsender/rtcpsender_test.go b/pkg/rtcpsender/rtcpsender_test.go index d2284d1c..9ac225c2 100644 --- a/pkg/rtcpsender/rtcpsender_test.go +++ b/pkg/rtcpsender/rtcpsender_test.go @@ -12,6 +12,8 @@ import ( func TestRTCPSender(t *testing.T) { rs := New(90000) + require.Equal(t, []byte(nil), rs.Report(time.Now())) + rtpPkt := rtp.Packet{ Header: rtp.Header{ Version: 2, diff --git a/server_publish_test.go b/server_publish_test.go index 4906d02c..18e95f46 100644 --- a/server_publish_test.go +++ b/server_publish_test.go @@ -1167,6 +1167,19 @@ func TestServerPublishRTCPReport(t *testing.T) { }) 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 buf := make([]byte, 2048) _, _, err = l2.ReadFrom(buf) diff --git a/serversession.go b/serversession.go index 6b62516f..0106d4fa 100644 --- a/serversession.go +++ b/serversession.go @@ -324,8 +324,10 @@ func (ss *ServerSession) run() { now := time.Now() for trackID, track := range ss.announcedTracks { - r := track.rtcpReceiver.Report(now) - ss.WritePacketRTCP(trackID, r) + rr := track.rtcpReceiver.Report(now) + if rr != nil { + ss.WritePacketRTCP(trackID, rr) + } } ss.udpReceiverReportTimer = time.NewTimer(ss.s.udpReceiverReportPeriod)