diff --git a/client_format.go b/client_format.go index 2f903fd5..965d6dee 100644 --- a/client_format.go +++ b/client_format.go @@ -67,7 +67,7 @@ func (cf *clientFormat) start() { Period: cf.cm.c.receiverReportPeriod, TimeNow: cf.cm.c.timeNow, WritePacketRTCP: func(pkt rtcp.Packet) { - if cf.cm.udpRTPListener != nil { + if cf.cm.udpRTPListener != nil && cf.cm.udpRTCPListener.writeAddr != nil { cf.cm.c.WritePacketRTCP(cf.cm.media, pkt) //nolint:errcheck } }, diff --git a/client_play_test.go b/client_play_test.go index 1cd4ee86..d549fc41 100644 --- a/client_play_test.go +++ b/client_play_test.go @@ -843,6 +843,10 @@ func TestClientPlayAnyPort(t *testing.T) { serverDone := make(chan struct{}) defer func() { <-serverDone }() + + serverTerminate := make(chan struct{}) + defer close(serverTerminate) + go func() { defer close(serverDone) @@ -960,14 +964,20 @@ func TestClientPlayAnyPort(t *testing.T) { require.Equal(t, &testRTCPPacket, packets[0]) close(serverRecv) } + + <-serverTerminate }() packetRecv := make(chan struct{}) c := Client{ - AnyPortEnable: true, + AnyPortEnable: true, + receiverReportPeriod: 100 * time.Millisecond, } + clientErr := make(chan struct{}) + defer func() { <-clientErr }() + var med *description.Media err = readAll(&c, "rtsp://localhost:8554/teststream", func(medi *description.Media, _ format.Format, pkt *rtp.Packet) { @@ -978,6 +988,12 @@ func TestClientPlayAnyPort(t *testing.T) { require.NoError(t, err) defer c.Close() + go func() { + err := c.Wait() + require.EqualError(t, err, "terminated") + close(clientErr) + }() + <-packetRecv if ca == "random" { @@ -985,6 +1001,13 @@ func TestClientPlayAnyPort(t *testing.T) { require.NoError(t, err) <-serverRecv } + + // make sure that RTCP receiver reports do not cause any error + select { + case <-time.After(200 * time.Millisecond): + case <-clientErr: + t.Error("should not happen") + } }) } }