rtsp: fix crash when setupping tracks between stream changes (#5253) (#5257)
Some checks are pending
code_lint / go (push) Waiting to run
code_lint / go_mod (push) Waiting to run
code_lint / docs (push) Waiting to run
code_lint / api_docs (push) Waiting to run
code_test / test_64 (push) Waiting to run
code_test / test_32 (push) Waiting to run
code_test / test_e2e (push) Waiting to run

This commit is contained in:
Alessandro Ros 2025-12-07 11:38:52 +01:00 committed by GitHub
parent fc8012d3c7
commit 834b079b78
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -194,6 +194,13 @@ func (s *session) onAnnounce(c *conn, ctx *gortsplib.ServerHandlerOnAnnounceCtx)
}, nil }, nil
} }
func (s *session) rtspStream() *gortsplib.ServerStream {
if !s.isTLS {
return s.stream.RTSPStream(s.rserver)
}
return s.stream.RTSPSStream(s.rserver)
}
// onSetup is called by rtspServer. // onSetup is called by rtspServer.
func (s *session) onSetup(c *conn, ctx *gortsplib.ServerHandlerOnSetupCtx, func (s *session) onSetup(c *conn, ctx *gortsplib.ServerHandlerOnSetupCtx,
) (*base.Response, *gortsplib.ServerStream, error) { ) (*base.Response, *gortsplib.ServerStream, error) {
@ -226,7 +233,7 @@ func (s *session) onSetup(c *conn, ctx *gortsplib.ServerHandlerOnSetupCtx,
} }
switch s.rsession.State() { switch s.rsession.State() {
case gortsplib.ServerSessionStateInitial, gortsplib.ServerSessionStatePrePlay: // play case gortsplib.ServerSessionStateInitial: // play
path, stream, err := s.pathManager.AddReader(defs.PathAddReaderReq{ path, stream, err := s.pathManager.AddReader(defs.PathAddReaderReq{
Author: s, Author: s,
AccessRequest: defs.PathAccessRequest{ AccessRequest: defs.PathAccessRequest{
@ -261,16 +268,14 @@ func (s *session) onSetup(c *conn, ctx *gortsplib.ServerHandlerOnSetupCtx,
s.path = path s.path = path
s.stream = stream s.stream = stream
var rstream *gortsplib.ServerStream
if !s.isTLS {
rstream = stream.RTSPStream(s.rserver)
} else {
rstream = stream.RTSPSStream(s.rserver)
}
return &base.Response{ return &base.Response{
StatusCode: base.StatusOK, StatusCode: base.StatusOK,
}, rstream, nil }, s.rtspStream(), nil
case gortsplib.ServerSessionStatePrePlay: // play, subsequent calls
return &base.Response{
StatusCode: base.StatusOK,
}, s.rtspStream(), nil
default: // record default: // record
return &base.Response{ return &base.Response{