mirror of
https://github.com/aler9/gortsplib
synced 2025-10-06 15:46:51 +08:00
client: fix reading sources without server ports (bluenviron/mediamtx#4253) (#796)
RTCP packets were sent out to nil addresses, due to the lack of server ports, causing an error.
This commit is contained in:
@@ -67,7 +67,7 @@ func (cf *clientFormat) start() {
|
|||||||
Period: cf.cm.c.receiverReportPeriod,
|
Period: cf.cm.c.receiverReportPeriod,
|
||||||
TimeNow: cf.cm.c.timeNow,
|
TimeNow: cf.cm.c.timeNow,
|
||||||
WritePacketRTCP: func(pkt rtcp.Packet) {
|
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
|
cf.cm.c.WritePacketRTCP(cf.cm.media, pkt) //nolint:errcheck
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@@ -843,6 +843,10 @@ func TestClientPlayAnyPort(t *testing.T) {
|
|||||||
|
|
||||||
serverDone := make(chan struct{})
|
serverDone := make(chan struct{})
|
||||||
defer func() { <-serverDone }()
|
defer func() { <-serverDone }()
|
||||||
|
|
||||||
|
serverTerminate := make(chan struct{})
|
||||||
|
defer close(serverTerminate)
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
defer close(serverDone)
|
defer close(serverDone)
|
||||||
|
|
||||||
@@ -960,14 +964,20 @@ func TestClientPlayAnyPort(t *testing.T) {
|
|||||||
require.Equal(t, &testRTCPPacket, packets[0])
|
require.Equal(t, &testRTCPPacket, packets[0])
|
||||||
close(serverRecv)
|
close(serverRecv)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
<-serverTerminate
|
||||||
}()
|
}()
|
||||||
|
|
||||||
packetRecv := make(chan struct{})
|
packetRecv := make(chan struct{})
|
||||||
|
|
||||||
c := Client{
|
c := Client{
|
||||||
AnyPortEnable: true,
|
AnyPortEnable: true,
|
||||||
|
receiverReportPeriod: 100 * time.Millisecond,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clientErr := make(chan struct{})
|
||||||
|
defer func() { <-clientErr }()
|
||||||
|
|
||||||
var med *description.Media
|
var med *description.Media
|
||||||
err = readAll(&c, "rtsp://localhost:8554/teststream",
|
err = readAll(&c, "rtsp://localhost:8554/teststream",
|
||||||
func(medi *description.Media, _ format.Format, pkt *rtp.Packet) {
|
func(medi *description.Media, _ format.Format, pkt *rtp.Packet) {
|
||||||
@@ -978,6 +988,12 @@ func TestClientPlayAnyPort(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
defer c.Close()
|
defer c.Close()
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
err := c.Wait()
|
||||||
|
require.EqualError(t, err, "terminated")
|
||||||
|
close(clientErr)
|
||||||
|
}()
|
||||||
|
|
||||||
<-packetRecv
|
<-packetRecv
|
||||||
|
|
||||||
if ca == "random" {
|
if ca == "random" {
|
||||||
@@ -985,6 +1001,13 @@ func TestClientPlayAnyPort(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
<-serverRecv
|
<-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")
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user