Add backchannel support for rtsp server

This commit is contained in:
seydx
2024-11-03 16:33:08 +01:00
parent 2c34a17d88
commit f13aa21d0f
4 changed files with 76 additions and 19 deletions
+4
View File
@@ -141,6 +141,10 @@ func MarshalSDP(name string, medias []*Media) ([]byte, error) {
}
md.WithCodec(codec.PayloadType, name, codec.ClockRate, codec.Channels, codec.FmtpLine)
if media.Direction != "" {
md.WithPropertyAttribute(media.Direction)
}
if media.ID != "" {
md.WithValueAttribute("control", media.ID)
}
+30 -14
View File
@@ -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
View File
@@ -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"
}