mirror of
https://github.com/aler9/gortsplib
synced 2025-10-05 15:16:51 +08:00
server: fill SSRC in SETUP responses and RTP-Info in PLAY responses automatically
This commit is contained in:
@@ -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 &&
|
||||
|
Reference in New Issue
Block a user