mirror of
https://github.com/aler9/gortsplib
synced 2025-10-05 15:16:51 +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")
|
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.
|
||||||
|
@@ -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.
|
||||||
|
@@ -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.
|
||||||
|
@@ -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()
|
||||||
|
@@ -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) {
|
||||||
|
Reference in New Issue
Block a user