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

View File

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

View File

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

View File

@@ -146,7 +146,8 @@ type ServerConnReadHandlers struct {
OnOptions func(req *base.Request) (*base.Response, error) OnOptions func(req *base.Request) (*base.Response, error)
// called after receiving a DESCRIBE request. // 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. // called after receiving an ANNOUNCE request.
OnAnnounce func(req *base.Request, tracks Tracks) (*base.Response, error) 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 }, 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: case base.Announce:
@@ -516,7 +529,7 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) {
res, err := sc.readHandlers.OnAnnounce(req, tracks) res, err := sc.readHandlers.OnAnnounce(req, tracks)
if res.StatusCode == 200 { if res.StatusCode == base.StatusOK {
sc.state = ServerConnStatePreRecord sc.state = ServerConnStatePreRecord
sc.setupPath = &reqPath 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) res, err := sc.readHandlers.OnSetup(req, th, path, trackID)
if res.StatusCode == 200 { if res.StatusCode == base.StatusOK {
sc.setupProtocol = &th.Protocol sc.setupProtocol = &th.Protocol
if sc.setuppedTracks == nil { if sc.setuppedTracks == nil {
@@ -710,7 +723,7 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) {
res, err := sc.readHandlers.OnPlay(req) 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.state = ServerConnStatePlay
sc.frameModeEnable() sc.frameModeEnable()
} }
@@ -743,7 +756,7 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) {
res, err := sc.readHandlers.OnRecord(req) res, err := sc.readHandlers.OnRecord(req)
if res.StatusCode == 200 { if res.StatusCode == base.StatusOK {
sc.state = ServerConnStateRecord sc.state = ServerConnStateRecord
sc.frameModeEnable() sc.frameModeEnable()
} }
@@ -767,7 +780,7 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) {
res, err := sc.readHandlers.OnPause(req) res, err := sc.readHandlers.OnPause(req)
if res.StatusCode == 200 { if res.StatusCode == base.StatusOK {
switch sc.state { switch sc.state {
case ServerConnStatePlay: case ServerConnStatePlay:
sc.frameModeDisable() sc.frameModeDisable()

View File

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