Skip to content

Commit

Permalink
Merge pull request #1432 from seydx/rtsp-backchannel
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexxIT committed Feb 18, 2025
2 parents 19cf781 + 0a773c8 commit 4897994
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 11 deletions.
16 changes: 16 additions & 0 deletions internal/rtsp/rtsp.go
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,22 @@ func tcpHandler(conn *rtsp.Conn) {
}
}

if query.Get("backchannel") == "1" {
conn.Medias = append(conn.Medias, &core.Media{
Kind: core.KindAudio,
Direction: core.DirectionRecvonly,
Codecs: []*core.Codec{
{Name: core.CodecOpus, ClockRate: 48000, Channels: 2},
{Name: core.CodecPCM, ClockRate: 16000},
{Name: core.CodecPCMA, ClockRate: 16000},
{Name: core.CodecPCMU, ClockRate: 16000},
{Name: core.CodecPCM, ClockRate: 8000},
{Name: core.CodecPCMA, ClockRate: 8000},
{Name: core.CodecPCMU, ClockRate: 8000},
},
})
}

if s := query.Get("pkt_size"); s != "" {
conn.PacketSize = uint16(core.Atoi(s))
}
Expand Down
4 changes: 4 additions & 0 deletions pkg/core/media.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand Down
27 changes: 19 additions & 8 deletions pkg/rtsp/producer.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,30 @@ func (c *Conn) GetTrack(media *core.Media, codec *core.Codec) (*core.Receiver, e
c.stateMu.Lock()
defer c.stateMu.Unlock()

if c.state == StatePlay {
if err := c.Reconnect(); err != nil {
var channel byte

switch c.mode {
case core.ModeActiveProducer:
if c.state == StatePlay {
if err := c.Reconnect(); err != nil {
return nil, err
}
}

var err error
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
case core.ModePassiveConsumer:
// Backchannel
channel = byte(len(c.Senders)) * 2
default:
return nil, errors.New("rtsp: wrong mode for GetTrack")
}

c.state = StateSetup

track := core.NewReceiver(media, codec)
track.ID = channel
c.Receivers = append(c.Receivers, track)
Expand Down
19 changes: 16 additions & 3 deletions pkg/rtsp/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,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
Expand All @@ -160,9 +170,12 @@ 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
if i := reqTrackID(req); i >= 0 && i < len(c.Senders)+len(c.Receivers) {
if i < len(c.Senders) {
c.Senders[i].Media.ID = MethodSetup
} else {
c.Receivers[i-len(c.Senders)].Media.ID = MethodSetup
}
tr = fmt.Sprintf("RTP/AVP/TCP;unicast;interleaved=%d-%d", i*2, i*2+1)
res.Header.Set("Transport", tr)
} else {
Expand Down

0 comments on commit 4897994

Please sign in to comment.