server: allow a TCP session to be used by another connection after PAUSE

This commit is contained in:
aler9
2021-10-27 19:25:08 +02:00
parent eb7bf2614b
commit 57dbac2f3a
2 changed files with 217 additions and 210 deletions

View File

@@ -413,6 +413,7 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) {
_, res, err := sc.handleRequestInSession(sxID, req, false)
if _, ok := err.(liberrors.ErrServerTCPFramesDisable); ok {
sc.tcpSession = nil
sc.tcpFrameSetEnabled = false
return res, nil
}

View File

@@ -505,7 +505,10 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
Tracks: tracks,
})
if res.StatusCode == base.StatusOK {
if res.StatusCode != base.StatusOK {
return res, err
}
ss.state = ServerSessionStatePrePublish
ss.setuppedPath = &path
ss.setuppedQuery = &query
@@ -522,8 +525,6 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
v := time.Now().Unix()
ss.udpLastFrameTime = &v
}
return res, err
case base.Setup:
@@ -648,7 +649,22 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
Transport: transport,
})
if res.StatusCode == base.StatusOK {
// workaround to prevent a bug in rtspclientsink
// that makes impossible for the client to receive the response
// and send frames.
// this was causing problems during unit tests.
if ua, ok := req.Header["User-Agent"]; ok && len(ua) == 1 &&
strings.HasPrefix(ua[0], "GStreamer") {
select {
case <-time.After(1 * time.Second):
case <-ss.ctx.Done():
}
}
if res.StatusCode != base.StatusOK {
return res, err
}
if ss.state == ServerSessionStateInitial {
err := stream.readerAdd(ss,
transport,
@@ -729,19 +745,6 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
ss.setuppedTracks[trackID] = sst
res.Header["Transport"] = th.Write()
}
// workaround to prevent a bug in rtspclientsink
// that makes impossible for the client to receive the response
// and send frames.
// this was causing problems during unit tests.
if ua, ok := req.Header["User-Agent"]; ok && len(ua) == 1 &&
strings.HasPrefix(ua[0], "GStreamer") {
select {
case <-time.After(1 * time.Second):
case <-ss.ctx.Done():
}
}
return res, err
@@ -790,8 +793,14 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
Query: query,
})
if ss.state != ServerSessionStateRead {
if res.StatusCode == base.StatusOK {
if res.StatusCode != base.StatusOK {
return res, err
}
if ss.state == ServerSessionStateRead {
return res, err
}
ss.state = ServerSessionStateRead
if *ss.setuppedTransport == TransportTCP {
@@ -856,10 +865,6 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
err = liberrors.ErrServerTCPFramesEnable{}
}
return res, err
}
}
return res, err
case base.Record:
@@ -909,7 +914,11 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
Query: query,
})
if res.StatusCode == base.StatusOK {
if res.StatusCode != base.StatusOK {
ss.tcpConn = nil
return res, err
}
ss.state = ServerSessionStatePublish
switch *ss.setuppedTransport {
@@ -931,11 +940,6 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
err = liberrors.ErrServerTCPFramesEnable{}
}
return res, err
}
ss.tcpConn = nil
return res, err
case base.Pause:
@@ -971,7 +975,10 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
Query: query,
})
if res.StatusCode == base.StatusOK {
if res.StatusCode != base.StatusOK {
return res, err
}
switch ss.state {
case ServerSessionStateRead:
ss.setuppedStream.readerSetInactive(ss)
@@ -1004,7 +1011,6 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
err = liberrors.ErrServerTCPFramesDisable{}
}
}
}
return res, err