mirror of
https://github.com/aler9/gortsplib
synced 2025-10-19 21:44:51 +08:00
ConnClient: add automatic port selection
This commit is contained in:
@@ -10,6 +10,7 @@ package gortsplib
|
|||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand"
|
||||||
"net"
|
"net"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strconv"
|
"strconv"
|
||||||
@@ -381,6 +382,7 @@ type UDPReadFunc func([]byte) (int, error)
|
|||||||
|
|
||||||
// SetupUDP writes a SETUP request, that means that we want to read
|
// SetupUDP writes a SETUP request, that means that we want to read
|
||||||
// a given track with the UDP transport. It then reads a Response.
|
// a given track with the UDP transport. It then reads a Response.
|
||||||
|
// If rtpPort and rtcpPort are zero, they will be chosen automatically.
|
||||||
func (c *ConnClient) SetupUDP(u *url.URL, track *Track, rtpPort int,
|
func (c *ConnClient) SetupUDP(u *url.URL, track *Track, rtpPort int,
|
||||||
rtcpPort int) (UDPReadFunc, UDPReadFunc, *Response, error) {
|
rtcpPort int) (UDPReadFunc, UDPReadFunc, *Response, error) {
|
||||||
if c.streamUrl != nil && *u != *c.streamUrl {
|
if c.streamUrl != nil && *u != *c.streamUrl {
|
||||||
@@ -395,14 +397,53 @@ func (c *ConnClient) SetupUDP(u *url.URL, track *Track, rtpPort int,
|
|||||||
return nil, nil, nil, fmt.Errorf("track has already been setup")
|
return nil, nil, nil, fmt.Errorf("track has already been setup")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rtpPort == 0 && rtcpPort != 0) ||
|
||||||
|
(rtpPort != 0 && rtcpPort == 0) {
|
||||||
|
return nil, nil, nil, fmt.Errorf("rtpPort and rtcpPort must be both zero or non-zero")
|
||||||
|
}
|
||||||
|
|
||||||
|
if rtpPort != 0 && rtcpPort != (rtpPort+1) {
|
||||||
|
return nil, nil, nil, fmt.Errorf("rtcpPort must be rtpPort + 1")
|
||||||
|
}
|
||||||
|
|
||||||
|
rtpListener, rtcpListener, err := func() (*connClientUDPListener, *connClientUDPListener, error) {
|
||||||
|
if rtpPort != 0 {
|
||||||
rtpListener, err := newConnClientUDPListener(c, rtpPort, track.Id, StreamTypeRtp)
|
rtpListener, err := newConnClientUDPListener(c, rtpPort, track.Id, StreamTypeRtp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
rtcpListener, err := newConnClientUDPListener(c, rtcpPort, track.Id, StreamTypeRtcp)
|
rtcpListener, err := newConnClientUDPListener(c, rtcpPort, track.Id, StreamTypeRtcp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
rtpListener.close()
|
rtpListener.close()
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return rtpListener, rtcpListener, nil
|
||||||
|
|
||||||
|
} else {
|
||||||
|
for {
|
||||||
|
// choose two consecutive ports in range 65535-10000
|
||||||
|
// rtp must be even and rtcp odd
|
||||||
|
rtpPort = (rand.Intn((65535-10000)/2) * 2) + 10000
|
||||||
|
rtcpPort = rtpPort + 1
|
||||||
|
|
||||||
|
rtpListener, err := newConnClientUDPListener(c, rtpPort, track.Id, StreamTypeRtp)
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
rtcpListener, err := newConnClientUDPListener(c, rtcpPort, track.Id, StreamTypeRtcp)
|
||||||
|
if err != nil {
|
||||||
|
rtpListener.close()
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
return rtpListener, rtcpListener, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
if err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -143,7 +143,7 @@ func TestConnClientUDP(t *testing.T) {
|
|||||||
var rtcpReads []UDPReadFunc
|
var rtcpReads []UDPReadFunc
|
||||||
|
|
||||||
for _, track := range tracks {
|
for _, track := range tracks {
|
||||||
rtpRead, rtcpRead, _, err := conn.SetupUDP(u, track, 9000+track.Id*2, 9001+track.Id*2)
|
rtpRead, rtcpRead, _, err := conn.SetupUDP(u, track, 0, 0)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
rtpReads = append(rtpReads, rtpRead)
|
rtpReads = append(rtpReads, rtpRead)
|
||||||
|
@@ -36,7 +36,7 @@ func main() {
|
|||||||
var rtcpReads []gortsplib.UDPReadFunc
|
var rtcpReads []gortsplib.UDPReadFunc
|
||||||
|
|
||||||
for _, track := range tracks {
|
for _, track := range tracks {
|
||||||
rtpRead, rtcpRead, _, err := conn.SetupUDP(u, track, 9000+track.Id*2, 9001+track.Id*2)
|
rtpRead, rtcpRead, _, err := conn.SetupUDP(u, track, 0, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user