Add backchannel support for rtsp server
This commit is contained in:
+30
-14
@@ -16,27 +16,43 @@ func (c *Conn) GetTrack(media *core.Media, codec *core.Codec) (*core.Receiver, e
|
||||
}
|
||||
}
|
||||
|
||||
c.stateMu.Lock()
|
||||
defer c.stateMu.Unlock()
|
||||
switch c.mode {
|
||||
case core.ModeActiveProducer:
|
||||
c.stateMu.Lock()
|
||||
defer c.stateMu.Unlock()
|
||||
|
||||
if c.state == StatePlay {
|
||||
if err := c.Reconnect(); err != nil {
|
||||
if c.state == StatePlay {
|
||||
if err := c.Reconnect(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
channel, err := c.SetupMedia(media)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
channel, err := c.SetupMedia(media)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
c.state = StateSetup
|
||||
|
||||
c.state = StateSetup
|
||||
track := core.NewReceiver(media, codec)
|
||||
track.ID = channel
|
||||
c.Receivers = append(c.Receivers, track)
|
||||
|
||||
track := core.NewReceiver(media, codec)
|
||||
track.ID = channel
|
||||
c.Receivers = append(c.Receivers, track)
|
||||
return track, nil
|
||||
case core.ModePassiveConsumer:
|
||||
// Backchannel
|
||||
c.stateMu.Lock()
|
||||
defer c.stateMu.Unlock()
|
||||
|
||||
return track, nil
|
||||
channel := byte(len(c.Senders)) * 2
|
||||
track := core.NewReceiver(media, codec)
|
||||
track.ID = channel
|
||||
c.Receivers = append(c.Receivers, track)
|
||||
|
||||
return track, nil
|
||||
default:
|
||||
return nil, errors.New("rtsp: wrong mode for GetTrack")
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Conn) Start() (err error) {
|
||||
|
||||
+24
-5
@@ -129,6 +129,16 @@ func (c *Conn) Accept() error {
|
||||
medias = append(medias, media)
|
||||
}
|
||||
|
||||
for i, track := range c.Receivers {
|
||||
media := &core.Media{
|
||||
Kind: core.GetKind(track.Codec.Name),
|
||||
Direction: core.DirectionSendonly,
|
||||
Codecs: []*core.Codec{track.Codec},
|
||||
ID: "trackID=" + strconv.Itoa(i+len(c.Senders)),
|
||||
}
|
||||
medias = append(medias, media)
|
||||
}
|
||||
|
||||
res.Body, err = core.MarshalSDP(c.SessionName, medias)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -154,11 +164,20 @@ func (c *Conn) Accept() error {
|
||||
c.state = StateSetup
|
||||
|
||||
if c.mode == core.ModePassiveConsumer {
|
||||
if i := reqTrackID(req); i >= 0 && i < len(c.Senders) {
|
||||
// mark sender as SETUP
|
||||
c.Senders[i].Media.ID = MethodSetup
|
||||
tr = fmt.Sprintf("RTP/AVP/TCP;unicast;interleaved=%d-%d", i*2, i*2+1)
|
||||
res.Header.Set("Transport", tr)
|
||||
trackID := reqTrackID(req)
|
||||
|
||||
if trackID >= 0 {
|
||||
if trackID < len(c.Senders) {
|
||||
c.Senders[trackID].Media.ID = MethodSetup
|
||||
tr = fmt.Sprintf("RTP/AVP/TCP;unicast;interleaved=%d-%d", trackID*2, trackID*2+1)
|
||||
res.Header.Set("Transport", tr)
|
||||
} else if trackID >= len(c.Senders) && trackID < len(c.Senders)+len(c.Receivers) {
|
||||
c.Receivers[trackID-len(c.Senders)].Media.ID = MethodSetup
|
||||
tr = fmt.Sprintf("RTP/AVP/TCP;unicast;interleaved=%d-%d", trackID*2, trackID*2+1)
|
||||
res.Header.Set("Transport", tr)
|
||||
} else {
|
||||
res.Status = "400 Bad Request"
|
||||
}
|
||||
} else {
|
||||
res.Status = "400 Bad Request"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user