server: fill SSRC in SETUP responses and RTP-Info in PLAY responses automatically

This commit is contained in:
aler9
2021-06-17 15:39:18 +02:00
committed by Alessandro Ros
parent 3f3226b53d
commit db28e87ecb
9 changed files with 383 additions and 89 deletions

View File

@@ -613,7 +613,7 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
}, liberrors.ErrServerTracksDifferentProtocols{}
}
res, stream, ssrc, err := ss.s.Handler.(ServerHandlerOnSetup).OnSetup(&ServerHandlerOnSetupCtx{
res, stream, err := ss.s.Handler.(ServerHandlerOnSetup).OnSetup(&ServerHandlerOnSetupCtx{
Server: ss.s,
Session: ss,
Conn: sc,
@@ -625,6 +625,8 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
})
if res.StatusCode == base.StatusOK {
th := headers.Transport{}
if ss.state == ServerSessionStateInitial {
ss.state = ServerSessionStatePrePlay
ss.setuppedPath = &path
@@ -633,6 +635,13 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
stream.readerAdd(ss, delivery == base.StreamDeliveryMulticast)
}
if ss.state == ServerSessionStatePrePlay {
ssrc := stream.ssrc(trackID)
if ssrc != 0 {
th.SSRC = &ssrc
}
}
ss.setuppedProtocol = &inTH.Protocol
ss.setuppedDelivery = &delivery
@@ -644,8 +653,6 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
res.Header = make(base.Header)
}
th := headers.Transport{}
switch {
case delivery == base.StreamDeliveryMulticast:
ss.setuppedTracks[trackID] = ServerSessionSetuppedTrack{}
@@ -683,10 +690,6 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
th.InterleavedIDs = inTH.InterleavedIDs
}
if ssrc != nil {
th.SSRC = ssrc
}
res.Header["Transport"] = th.Write()
}
@@ -696,7 +699,10 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
// this was causing problems during unit tests.
if ua, ok := req.Header["User-Agent"]; ok && len(ua) == 1 &&
strings.HasPrefix(ua[0], "GStreamer") {
<-time.After(1 * time.Second)
select {
case <-time.After(1 * time.Second):
case <-ss.ctx.Done():
}
}
return res, err
@@ -750,6 +756,36 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
ss.tcpConn = sc
}
// add RTP-Info
var ri headers.RTPInfo
for trackID := range ss.setuppedTracks {
ts := ss.setuppedStream.timestamp(trackID)
if ts == 0 {
continue
}
u := &base.URL{
Scheme: req.URL.Scheme,
User: req.URL.User,
Host: req.URL.Host,
Path: "/" + *ss.setuppedPath + "/trackID=" + strconv.FormatInt(int64(trackID), 10),
}
lsn := ss.setuppedStream.lastSequenceNumber(trackID)
ri = append(ri, &headers.RTPInfoEntry{
URL: u.String(),
SequenceNumber: &lsn,
Timestamp: &ts,
})
}
if len(ri) > 0 {
if res.Header == nil {
res.Header = make(base.Header)
}
res.Header["RTP-Info"] = ri.Write()
}
ss.setuppedStream.readerSetActive(ss)
if *ss.setuppedProtocol == base.StreamProtocolUDP &&