mirror of
https://github.com/aler9/gortsplib
synced 2025-10-05 23:26:54 +08:00
server: automatically insert SDP in DESCRIBE responses
This commit is contained in:
@@ -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.
|
||||
|
@@ -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.
|
||||
|
@@ -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.
|
||||
|
@@ -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()
|
||||
|
@@ -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) {
|
||||
|
Reference in New Issue
Block a user