From 290e011061057ce198de61a3b65d070ea8d42c1f Mon Sep 17 00:00:00 2001 From: Alex X Date: Mon, 6 May 2024 07:32:45 +0300 Subject: [PATCH] Add support allowed_media_types for RTSP server #1054 --- pkg/rtsp/server.go | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/pkg/rtsp/server.go b/pkg/rtsp/server.go index 15b3f84b..8e0d3134 100644 --- a/pkg/rtsp/server.go +++ b/pkg/rtsp/server.go @@ -146,7 +146,19 @@ func (c *Conn) Accept() error { if strings.HasPrefix(tr, transport) { c.session = core.RandString(8, 10) c.state = StateSetup - res.Header.Set("Transport", tr[:len(transport)+3]) + + if c.mode == core.ModePassiveConsumer { + if i := reqTrackID(req); i >= 0 && i < len(c.senders) { + // mark sender as SETUP + c.senders[i].Media.ID = MethodSetup + tr = fmt.Sprintf("RTP/AVP/TCP;unicast;interleaved=%d-%d", i*2, i*2+1) + res.Header.Set("Transport", tr) + } else { + res.Status = "400 Bad Request" + } + } else { + res.Header.Set("Transport", tr[:len(transport)+3]) + } } else { res.Status = "461 Unsupported transport" } @@ -156,6 +168,15 @@ func (c *Conn) Accept() error { } case MethodRecord, MethodPlay: + if c.mode == core.ModePassiveConsumer { + // stop unconfigured senders + for _, track := range c.senders { + if track.Media.ID != MethodSetup { + track.Close() + } + } + } + res := &tcp.Response{Request: req} err = c.WriteResponse(res) c.playOK = true @@ -172,3 +193,18 @@ func (c *Conn) Accept() error { } } } + +func reqTrackID(req *tcp.Request) int { + var s string + if req.URL.RawQuery != "" { + s = req.URL.RawQuery + } else { + s = req.URL.Path + } + if i := strings.LastIndexByte(s, '='); i > 0 { + if i, err := strconv.Atoi(s[i+1:]); err == nil { + return i + } + } + return -1 +}