server: automatically insert SDP in DESCRIBE responses

This commit is contained in:
aler9
2021-03-16 14:11:27 +01:00
parent 3a8c76e527
commit 50babb18c0
5 changed files with 34 additions and 41 deletions

View File

@@ -28,7 +28,7 @@ func handleConn(conn *gortsplib.ServerConn) {
log.Printf("client connected")
// called after receiving a DESCRIBE request.
onDescribe := func(req *base.Request) (*base.Response, error) {
onDescribe := func(req *base.Request) (*base.Response, []byte, error) {
mutex.Lock()
defer mutex.Unlock()
@@ -36,17 +36,12 @@ func handleConn(conn *gortsplib.ServerConn) {
if publisher == nil {
return &base.Response{
StatusCode: base.StatusNotFound,
}, nil
}, nil, nil
}
return &base.Response{
StatusCode: base.StatusOK,
Header: base.Header{
"Content-Base": base.HeaderValue{req.URL.String() + "/"},
"Content-Type": base.HeaderValue{"application/sdp"},
},
Body: sdp,
}, nil
}, sdp, nil
}
// called after receiving an ANNOUNCE request.

View File

@@ -27,7 +27,7 @@ func handleConn(conn *gortsplib.ServerConn) {
log.Printf("client connected")
// called after receiving a DESCRIBE request.
onDescribe := func(req *base.Request) (*base.Response, error) {
onDescribe := func(req *base.Request) (*base.Response, []byte, error) {
mutex.Lock()
defer mutex.Unlock()
@@ -35,17 +35,12 @@ func handleConn(conn *gortsplib.ServerConn) {
if publisher == nil {
return &base.Response{
StatusCode: base.StatusNotFound,
}, nil
}, nil, nil
}
return &base.Response{
StatusCode: base.StatusOK,
Header: base.Header{
"Content-Base": base.HeaderValue{req.URL.String() + "/"},
"Content-Type": base.HeaderValue{"application/sdp"},
},
Body: sdp,
}, nil
}, sdp, nil
}
// called after receiving an ANNOUNCE request.

View File

@@ -27,7 +27,7 @@ func handleConn(conn *gortsplib.ServerConn) {
log.Printf("client connected")
// called after receiving a DESCRIBE request.
onDescribe := func(req *base.Request) (*base.Response, error) {
onDescribe := func(req *base.Request) (*base.Response, []byte, error) {
mutex.Lock()
defer mutex.Unlock()
@@ -35,17 +35,12 @@ func handleConn(conn *gortsplib.ServerConn) {
if publisher == nil {
return &base.Response{
StatusCode: base.StatusNotFound,
}, nil
}, nil, nil
}
return &base.Response{
StatusCode: base.StatusOK,
Header: base.Header{
"Content-Base": base.HeaderValue{req.URL.String() + "/"},
"Content-Type": base.HeaderValue{"application/sdp"},
},
Body: sdp,
}, nil
}, sdp, nil
}
// called after receiving an ANNOUNCE request.

View File

@@ -146,7 +146,8 @@ type ServerConnReadHandlers struct {
OnOptions func(req *base.Request) (*base.Response, error)
// called after receiving a DESCRIBE request.
OnDescribe func(req *base.Request) (*base.Response, error)
// the 2nd return value is a SDP, that is inserted into the response.
OnDescribe func(req *base.Request) (*base.Response, []byte, error)
// called after receiving an ANNOUNCE request.
OnAnnounce func(req *base.Request, tracks Tracks) (*base.Response, error)
@@ -444,7 +445,19 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) {
}, err
}
return sc.readHandlers.OnDescribe(req)
res, sdp, err := sc.readHandlers.OnDescribe(req)
if res.StatusCode == base.StatusOK && sdp != nil {
if res.Header == nil {
res.Header = make(base.Header)
}
res.Header["Content-Base"] = base.HeaderValue{req.URL.String() + "/"}
res.Header["Content-Type"] = base.HeaderValue{"application/sdp"}
res.Body = sdp
}
return res, err
}
case base.Announce:
@@ -516,7 +529,7 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) {
res, err := sc.readHandlers.OnAnnounce(req, tracks)
if res.StatusCode == 200 {
if res.StatusCode == base.StatusOK {
sc.state = ServerConnStatePreRecord
sc.setupPath = &reqPath
@@ -629,7 +642,7 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) {
res, err := sc.readHandlers.OnSetup(req, th, path, trackID)
if res.StatusCode == 200 {
if res.StatusCode == base.StatusOK {
sc.setupProtocol = &th.Protocol
if sc.setuppedTracks == nil {
@@ -710,7 +723,7 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) {
res, err := sc.readHandlers.OnPlay(req)
if res.StatusCode == 200 && sc.state != ServerConnStatePlay {
if res.StatusCode == base.StatusOK && sc.state != ServerConnStatePlay {
sc.state = ServerConnStatePlay
sc.frameModeEnable()
}
@@ -743,7 +756,7 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) {
res, err := sc.readHandlers.OnRecord(req)
if res.StatusCode == 200 {
if res.StatusCode == base.StatusOK {
sc.state = ServerConnStateRecord
sc.frameModeEnable()
}
@@ -767,7 +780,7 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) {
res, err := sc.readHandlers.OnPause(req)
if res.StatusCode == 200 {
if res.StatusCode == base.StatusOK {
switch sc.state {
case ServerConnStatePlay:
sc.frameModeDisable()

View File

@@ -78,18 +78,18 @@ func (ts *testServ) handleConn(conn *ServerConn) {
defer ts.wg.Done()
defer conn.Close()
onDescribe := func(req *base.Request) (*base.Response, error) {
onDescribe := func(req *base.Request) (*base.Response, []byte, error) {
reqPath, ok := req.URL.RTSPPath()
if !ok {
return &base.Response{
StatusCode: base.StatusBadRequest,
}, fmt.Errorf("invalid path (%s)", req.URL)
}, nil, fmt.Errorf("invalid path (%s)", req.URL)
}
if reqPath != "teststream" {
return &base.Response{
StatusCode: base.StatusBadRequest,
}, fmt.Errorf("invalid path (%s)", req.URL)
}, nil, fmt.Errorf("invalid path (%s)", req.URL)
}
ts.mutex.Lock()
@@ -98,17 +98,12 @@ func (ts *testServ) handleConn(conn *ServerConn) {
if ts.publisher == nil {
return &base.Response{
StatusCode: base.StatusNotFound,
}, nil
}, nil, nil
}
return &base.Response{
StatusCode: base.StatusOK,
Header: base.Header{
"Content-Base": base.HeaderValue{req.URL.String() + "/"},
"Content-Type": base.HeaderValue{"application/sdp"},
},
Body: ts.sdp,
}, nil
}, ts.sdp, nil
}
onAnnounce := func(req *base.Request, tracks Tracks) (*base.Response, error) {