Skip to content

Commit 4897994

Browse files
committed
Merge pull request #1432 from seydx/rtsp-backchannel
2 parents 19cf781 + 0a773c8 commit 4897994

File tree

4 files changed

+55
-11
lines changed

4 files changed

+55
-11
lines changed

internal/rtsp/rtsp.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,22 @@ func tcpHandler(conn *rtsp.Conn) {
186186
}
187187
}
188188

189+
if query.Get("backchannel") == "1" {
190+
conn.Medias = append(conn.Medias, &core.Media{
191+
Kind: core.KindAudio,
192+
Direction: core.DirectionRecvonly,
193+
Codecs: []*core.Codec{
194+
{Name: core.CodecOpus, ClockRate: 48000, Channels: 2},
195+
{Name: core.CodecPCM, ClockRate: 16000},
196+
{Name: core.CodecPCMA, ClockRate: 16000},
197+
{Name: core.CodecPCMU, ClockRate: 16000},
198+
{Name: core.CodecPCM, ClockRate: 8000},
199+
{Name: core.CodecPCMA, ClockRate: 8000},
200+
{Name: core.CodecPCMU, ClockRate: 8000},
201+
},
202+
})
203+
}
204+
189205
if s := query.Get("pkt_size"); s != "" {
190206
conn.PacketSize = uint16(core.Atoi(s))
191207
}

pkg/core/media.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,10 @@ func MarshalSDP(name string, medias []*Media) ([]byte, error) {
141141
}
142142
md.WithCodec(codec.PayloadType, name, codec.ClockRate, codec.Channels, codec.FmtpLine)
143143

144+
if media.Direction != "" {
145+
md.WithPropertyAttribute(media.Direction)
146+
}
147+
144148
if media.ID != "" {
145149
md.WithValueAttribute("control", media.ID)
146150
}

pkg/rtsp/producer.go

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,30 @@ func (c *Conn) GetTrack(media *core.Media, codec *core.Codec) (*core.Receiver, e
1919
c.stateMu.Lock()
2020
defer c.stateMu.Unlock()
2121

22-
if c.state == StatePlay {
23-
if err := c.Reconnect(); err != nil {
22+
var channel byte
23+
24+
switch c.mode {
25+
case core.ModeActiveProducer:
26+
if c.state == StatePlay {
27+
if err := c.Reconnect(); err != nil {
28+
return nil, err
29+
}
30+
}
31+
32+
var err error
33+
channel, err = c.SetupMedia(media)
34+
if err != nil {
2435
return nil, err
2536
}
26-
}
2737

28-
channel, err := c.SetupMedia(media)
29-
if err != nil {
30-
return nil, err
38+
c.state = StateSetup
39+
case core.ModePassiveConsumer:
40+
// Backchannel
41+
channel = byte(len(c.Senders)) * 2
42+
default:
43+
return nil, errors.New("rtsp: wrong mode for GetTrack")
3144
}
3245

33-
c.state = StateSetup
34-
3546
track := core.NewReceiver(media, codec)
3647
track.ID = channel
3748
c.Receivers = append(c.Receivers, track)

pkg/rtsp/server.go

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,16 @@ func (c *Conn) Accept() error {
136136
medias = append(medias, media)
137137
}
138138

139+
for i, track := range c.Receivers {
140+
media := &core.Media{
141+
Kind: core.GetKind(track.Codec.Name),
142+
Direction: core.DirectionSendonly,
143+
Codecs: []*core.Codec{track.Codec},
144+
ID: "trackID=" + strconv.Itoa(i+len(c.Senders)),
145+
}
146+
medias = append(medias, media)
147+
}
148+
139149
res.Body, err = core.MarshalSDP(c.SessionName, medias)
140150
if err != nil {
141151
return err
@@ -160,9 +170,12 @@ func (c *Conn) Accept() error {
160170
c.state = StateSetup
161171

162172
if c.mode == core.ModePassiveConsumer {
163-
if i := reqTrackID(req); i >= 0 && i < len(c.Senders) {
164-
// mark sender as SETUP
165-
c.Senders[i].Media.ID = MethodSetup
173+
if i := reqTrackID(req); i >= 0 && i < len(c.Senders)+len(c.Receivers) {
174+
if i < len(c.Senders) {
175+
c.Senders[i].Media.ID = MethodSetup
176+
} else {
177+
c.Receivers[i-len(c.Senders)].Media.ID = MethodSetup
178+
}
166179
tr = fmt.Sprintf("RTP/AVP/TCP;unicast;interleaved=%d-%d", i*2, i*2+1)
167180
res.Header.Set("Transport", tr)
168181
} else {

0 commit comments

Comments
 (0)