Browse Source

merge serverudpl into serverrtsp

pull/235/head
aler9 5 years ago
parent
commit
6a61202459
  1. 63
      internal/serverrtsp/server.go
  2. 37
      internal/serverudpl/server.go
  3. 134
      main.go

63
internal/serverrtsp/server.go

@ -1,7 +1,9 @@
package serverrtsp package serverrtsp
import ( import (
"crypto/tls"
"strconv" "strconv"
"time"
"github.com/aler9/gortsplib" "github.com/aler9/gortsplib"
@ -18,6 +20,8 @@ type Server struct {
parent Parent parent Parent
srv *gortsplib.Server srv *gortsplib.Server
udpRTPListener *gortsplib.ServerUDPListener
udpRTCPListener *gortsplib.ServerUDPListener
// out // out
accept chan *gortsplib.ServerConn accept chan *gortsplib.ServerConn
@ -28,9 +32,49 @@ type Server struct {
func New( func New(
listenIP string, listenIP string,
port int, port int,
conf gortsplib.ServerConf, readTimeout time.Duration,
writeTimeout time.Duration,
readBufferCount int,
useUDP bool,
rtpPort int,
rtcpPort int,
useTLS bool,
serverCert string,
serverKey string,
parent Parent) (*Server, error) { parent Parent) (*Server, error) {
conf := gortsplib.ServerConf{
ReadTimeout: readTimeout,
WriteTimeout: writeTimeout,
ReadBufferCount: readBufferCount,
}
if useUDP {
address := listenIP + ":" + strconv.FormatInt(int64(rtpPort), 10)
var err error
conf.UDPRTPListener, err = gortsplib.NewServerUDPListener(address)
if err != nil {
return nil, err
}
parent.Log(logger.Info, "[RTSP/UDP/RTP listener] opened on %s", address)
address = listenIP + ":" + strconv.FormatInt(int64(rtcpPort), 10)
conf.UDPRTCPListener, err = gortsplib.NewServerUDPListener(address)
if err != nil {
return nil, err
}
parent.Log(logger.Info, "[RTSP/UDP/RTCP listener] opened on %s", address)
}
if useTLS {
cert, err := tls.LoadX509KeyPair(serverCert, serverKey)
if err != nil {
return nil, err
}
conf.TLSConfig = &tls.Config{Certificates: []tls.Certificate{cert}}
}
address := listenIP + ":" + strconv.FormatInt(int64(port), 10) address := listenIP + ":" + strconv.FormatInt(int64(port), 10)
srv, err := conf.Serve(address) srv, err := conf.Serve(address)
if err != nil { if err != nil {
@ -40,17 +84,18 @@ func New(
s := &Server{ s := &Server{
parent: parent, parent: parent,
srv: srv, srv: srv,
udpRTPListener: conf.UDPRTPListener,
udpRTCPListener: conf.UDPRTCPListener,
accept: make(chan *gortsplib.ServerConn), accept: make(chan *gortsplib.ServerConn),
done: make(chan struct{}), done: make(chan struct{}),
} }
label := func() string { label := func() string {
if conf.TLSConfig != nil { if conf.TLSConfig != nil {
return "TCP/TLS/RTSPS" return "RTSP/TLS"
} }
return "TCP/RTSP" return "RTSP/TCP"
}() }()
parent.Log(logger.Info, "[%s listener] opened on %s", label, address) parent.Log(logger.Info, "[%s listener] opened on %s", label, address)
go s.run() go s.run()
@ -65,7 +110,17 @@ func (s *Server) Close() {
co.Close() co.Close()
} }
}() }()
s.srv.Close() s.srv.Close()
if s.udpRTPListener != nil {
s.udpRTPListener.Close()
}
if s.udpRTCPListener != nil {
s.udpRTCPListener.Close()
}
<-s.done <-s.done
} }

37
internal/serverudpl/server.go

@ -1,37 +0,0 @@
package serverudpl
import (
"strconv"
"github.com/aler9/gortsplib"
"github.com/aler9/rtsp-simple-server/internal/logger"
)
// Parent is implemented by program.
type Parent interface {
Log(logger.Level, string, ...interface{})
}
// New allocates a gortsplib.ServerUDPListener.
func New(
listenIP string,
port int,
streamType gortsplib.StreamType,
parent Parent) (*gortsplib.ServerUDPListener, error) {
address := listenIP + ":" + strconv.FormatInt(int64(port), 10)
listener, err := gortsplib.NewServerUDPListener(address)
if err != nil {
return nil, err
}
label := func() string {
if streamType == gortsplib.StreamTypeRTP {
return "RTP"
}
return "RTCP"
}()
parent.Log(logger.Info, "[UDP/"+label+" listener] opened on %s", address)
return listener, nil
}

134
main.go

@ -1,7 +1,6 @@
package main package main
import ( import (
"crypto/tls"
"fmt" "fmt"
"os" "os"
"reflect" "reflect"
@ -19,7 +18,6 @@ import (
"github.com/aler9/rtsp-simple-server/internal/pprof" "github.com/aler9/rtsp-simple-server/internal/pprof"
"github.com/aler9/rtsp-simple-server/internal/serverrtmp" "github.com/aler9/rtsp-simple-server/internal/serverrtmp"
"github.com/aler9/rtsp-simple-server/internal/serverrtsp" "github.com/aler9/rtsp-simple-server/internal/serverrtsp"
"github.com/aler9/rtsp-simple-server/internal/serverudpl"
"github.com/aler9/rtsp-simple-server/internal/stats" "github.com/aler9/rtsp-simple-server/internal/stats"
) )
@ -33,10 +31,8 @@ type program struct {
logger *logger.Logger logger *logger.Logger
metrics *metrics.Metrics metrics *metrics.Metrics
pprof *pprof.Pprof pprof *pprof.Pprof
serverUDPRTP *gortsplib.ServerUDPListener serverRTSPPlain *serverrtsp.Server
serverUDPRTCP *gortsplib.ServerUDPListener serverRTSPTLS *serverrtsp.Server
serverPlain *serverrtsp.Server
serverTLS *serverrtsp.Server
serverRTMP *serverrtmp.Server serverRTMP *serverrtmp.Server
pathMan *pathman.PathManager pathMan *pathman.PathManager
clientMan *clientman.ClientManager clientMan *clientman.ClientManager
@ -187,45 +183,22 @@ func (p *program) createResources(initial bool) error {
} }
} }
if _, ok := p.conf.ProtocolsParsed[gortsplib.StreamProtocolUDP]; ok {
if p.serverUDPRTP == nil {
p.serverUDPRTP, err = serverudpl.New(
p.conf.ListenIP,
p.conf.RTPPort,
gortsplib.StreamTypeRTP,
p)
if err != nil {
return err
}
}
if p.serverUDPRTCP == nil {
p.serverUDPRTCP, err = serverudpl.New(
p.conf.ListenIP,
p.conf.RTCPPort,
gortsplib.StreamTypeRTCP,
p)
if err != nil {
return err
}
}
}
if p.conf.EncryptionParsed == conf.EncryptionNo || if p.conf.EncryptionParsed == conf.EncryptionNo ||
p.conf.EncryptionParsed == conf.EncryptionOptional { p.conf.EncryptionParsed == conf.EncryptionOptional {
if p.serverPlain == nil { if p.serverRTSPPlain == nil {
conf := gortsplib.ServerConf{ _, useUDP := p.conf.ProtocolsParsed[gortsplib.StreamProtocolUDP]
ReadTimeout: p.conf.ReadTimeout, p.serverRTSPPlain, err = serverrtsp.New(
WriteTimeout: p.conf.WriteTimeout,
ReadBufferCount: p.conf.ReadBufferCount,
UDPRTPListener: p.serverUDPRTP,
UDPRTCPListener: p.serverUDPRTCP,
}
p.serverPlain, err = serverrtsp.New(
p.conf.ListenIP, p.conf.ListenIP,
p.conf.RTSPPort, p.conf.RTSPPort,
conf, p.conf.ReadTimeout,
p.conf.WriteTimeout,
p.conf.ReadBufferCount,
useUDP,
p.conf.RTPPort,
p.conf.RTCPPort,
false,
"",
"",
p) p)
if err != nil { if err != nil {
return err return err
@ -235,23 +208,19 @@ func (p *program) createResources(initial bool) error {
if p.conf.EncryptionParsed == conf.EncryptionStrict || if p.conf.EncryptionParsed == conf.EncryptionStrict ||
p.conf.EncryptionParsed == conf.EncryptionOptional { p.conf.EncryptionParsed == conf.EncryptionOptional {
if p.serverTLS == nil { if p.serverRTSPTLS == nil {
cert, err := tls.LoadX509KeyPair(p.conf.ServerCert, p.conf.ServerKey) p.serverRTSPTLS, err = serverrtsp.New(
if err != nil {
return err
}
conf := gortsplib.ServerConf{
TLSConfig: &tls.Config{Certificates: []tls.Certificate{cert}},
ReadTimeout: p.conf.ReadTimeout,
WriteTimeout: p.conf.WriteTimeout,
ReadBufferCount: p.conf.ReadBufferCount,
}
p.serverTLS, err = serverrtsp.New(
p.conf.ListenIP, p.conf.ListenIP,
p.conf.RTSPSPort, p.conf.RTSPSPort,
conf, p.conf.ReadTimeout,
p.conf.WriteTimeout,
p.conf.ReadBufferCount,
false,
0,
0,
true,
p.conf.ServerCert,
p.conf.ServerKey,
p) p)
if err != nil { if err != nil {
return err return err
@ -293,8 +262,8 @@ func (p *program) createResources(initial bool) error {
p.conf.ProtocolsParsed, p.conf.ProtocolsParsed,
p.stats, p.stats,
p.pathMan, p.pathMan,
p.serverPlain, p.serverRTSPPlain,
p.serverTLS, p.serverRTSPTLS,
p.serverRTMP, p.serverRTMP,
p) p)
} }
@ -324,24 +293,6 @@ func (p *program) closeResources(newConf *conf.Conf) {
closePprof = true closePprof = true
} }
closeServerUDPRTP := false
if newConf == nil ||
!reflect.DeepEqual(newConf.ProtocolsParsed, p.conf.ProtocolsParsed) ||
newConf.ListenIP != p.conf.ListenIP ||
newConf.RTPPort != p.conf.RTPPort ||
newConf.WriteTimeout != p.conf.WriteTimeout {
closeServerUDPRTP = true
}
closeServerUDPRTCP := false
if newConf == nil ||
!reflect.DeepEqual(newConf.ProtocolsParsed, p.conf.ProtocolsParsed) ||
newConf.ListenIP != p.conf.ListenIP ||
newConf.RTCPPort != p.conf.RTCPPort ||
newConf.WriteTimeout != p.conf.WriteTimeout {
closeServerUDPRTCP = true
}
closeServerPlain := false closeServerPlain := false
if newConf == nil || if newConf == nil ||
newConf.EncryptionParsed != p.conf.EncryptionParsed || newConf.EncryptionParsed != p.conf.EncryptionParsed ||
@ -350,8 +301,9 @@ func (p *program) closeResources(newConf *conf.Conf) {
newConf.ReadTimeout != p.conf.ReadTimeout || newConf.ReadTimeout != p.conf.ReadTimeout ||
newConf.WriteTimeout != p.conf.WriteTimeout || newConf.WriteTimeout != p.conf.WriteTimeout ||
newConf.ReadBufferCount != p.conf.ReadBufferCount || newConf.ReadBufferCount != p.conf.ReadBufferCount ||
closeServerUDPRTP || !reflect.DeepEqual(newConf.ProtocolsParsed, p.conf.ProtocolsParsed) ||
closeServerUDPRTCP { newConf.RTPPort != p.conf.RTPPort ||
newConf.RTCPPort != p.conf.RTCPPort {
closeServerPlain = true closeServerPlain = true
} }
@ -362,7 +314,9 @@ func (p *program) closeResources(newConf *conf.Conf) {
newConf.RTSPSPort != p.conf.RTSPSPort || newConf.RTSPSPort != p.conf.RTSPSPort ||
newConf.ReadTimeout != p.conf.ReadTimeout || newConf.ReadTimeout != p.conf.ReadTimeout ||
newConf.WriteTimeout != p.conf.WriteTimeout || newConf.WriteTimeout != p.conf.WriteTimeout ||
newConf.ReadBufferCount != p.conf.ReadBufferCount { newConf.ReadBufferCount != p.conf.ReadBufferCount ||
newConf.ServerCert != p.conf.ServerCert ||
newConf.ServerKey != p.conf.ServerKey {
closeServerTLS = true closeServerTLS = true
} }
@ -422,24 +376,14 @@ func (p *program) closeResources(newConf *conf.Conf) {
p.serverRTMP = nil p.serverRTMP = nil
} }
if closeServerTLS && p.serverTLS != nil { if closeServerTLS && p.serverRTSPTLS != nil {
p.serverTLS.Close() p.serverRTSPTLS.Close()
p.serverTLS = nil p.serverRTSPTLS = nil
}
if closeServerPlain && p.serverPlain != nil {
p.serverPlain.Close()
p.serverPlain = nil
}
if closeServerUDPRTCP && p.serverUDPRTCP != nil {
p.serverUDPRTCP.Close()
p.serverUDPRTCP = nil
} }
if closeServerUDPRTP && p.serverUDPRTP != nil { if closeServerPlain && p.serverRTSPPlain != nil {
p.serverUDPRTP.Close() p.serverRTSPPlain.Close()
p.serverUDPRTP = nil p.serverRTSPPlain = nil
} }
if closePprof && p.pprof != nil { if closePprof && p.pprof != nil {

Loading…
Cancel
Save