optimize code (#878)

* remove unused code

* initialize UDP listeners and SRTP before initializing medias

* make rtpSender and rtpReceiver available before PLAY / RECORD

* use writerMutex to protect writer only
This commit is contained in:
Alessandro Ros
2025-09-05 23:11:51 +02:00
committed by GitHub
parent 1bc89661eb
commit 65da49ffc0
9 changed files with 413 additions and 469 deletions

View File

@@ -1,6 +1,7 @@
package gortsplib
import (
"crypto/rand"
"fmt"
"sync"
"sync/atomic"
@@ -14,6 +15,16 @@ import (
"github.com/bluenviron/gortsplib/v4/pkg/liberrors"
)
func serverStreamExtractExistingSSRCs(medias map[*description.Media]*serverStreamMedia) []uint32 {
var ret []uint32
for _, media := range medias {
for _, forma := range media.formats {
ret = append(ret, forma.localSSRC)
}
}
return ret
}
// NewServerStream allocates a ServerStream.
//
// Deprecated: replaced by ServerStream.Initialize().
@@ -56,20 +67,53 @@ func (st *ServerStream) Initialize() error {
st.activeUnicastReaders = make(map[*ServerSession]struct{})
st.medias = make(map[*description.Media]*serverStreamMedia, len(st.Desc.Medias))
for i, medi := range st.Desc.Medias {
sm := &serverStreamMedia{
st: st,
media: medi,
trackID: i,
}
err := sm.initialize()
localSSRCs, err := generateLocalSSRCs(
serverStreamExtractExistingSSRCs(st.medias),
medi.Formats,
)
if err != nil {
for _, medi := range st.Desc.Medias[:i] {
st.medias[medi].close()
for _, sm := range st.medias {
sm.close()
}
return err
}
var srtpOutCtx *wrappedSRTPContext
if st.Server.TLSConfig != nil {
srtpOutKey := make([]byte, srtpKeyLength)
_, err = rand.Read(srtpOutKey)
if err != nil {
for _, sm := range st.medias {
sm.close()
}
return err
}
srtpOutCtx = &wrappedSRTPContext{
key: srtpOutKey,
ssrcs: ssrcsMapToList(localSSRCs),
}
err = srtpOutCtx.initialize()
if err != nil {
for _, sm := range st.medias {
sm.close()
}
return err
}
}
sm := &serverStreamMedia{
st: st,
media: medi,
trackID: i,
localSSRCs: localSSRCs,
srtpOutCtx: srtpOutCtx,
}
sm.initialize()
st.medias[medi] = sm
}