Code refactoring for RTSP backchannel

This commit is contained in:
Alex X
2025-02-18 16:59:00 +03:00
parent b34d970076
commit 0a773c82af
3 changed files with 32 additions and 45 deletions
-2
View File
@@ -8,7 +8,6 @@ import (
"github.com/AlexxIT/go2rtc/internal/app" "github.com/AlexxIT/go2rtc/internal/app"
"github.com/AlexxIT/go2rtc/internal/streams" "github.com/AlexxIT/go2rtc/internal/streams"
"github.com/AlexxIT/go2rtc/pkg/aac"
"github.com/AlexxIT/go2rtc/pkg/core" "github.com/AlexxIT/go2rtc/pkg/core"
"github.com/AlexxIT/go2rtc/pkg/rtsp" "github.com/AlexxIT/go2rtc/pkg/rtsp"
"github.com/AlexxIT/go2rtc/pkg/tcp" "github.com/AlexxIT/go2rtc/pkg/tcp"
@@ -198,7 +197,6 @@ func tcpHandler(conn *rtsp.Conn) {
{Name: core.CodecPCM, ClockRate: 8000}, {Name: core.CodecPCM, ClockRate: 8000},
{Name: core.CodecPCMA, ClockRate: 8000}, {Name: core.CodecPCMA, ClockRate: 8000},
{Name: core.CodecPCMU, ClockRate: 8000}, {Name: core.CodecPCMU, ClockRate: 8000},
{Name: core.CodecAAC, ClockRate: 16000, FmtpLine: aac.FMTP + "1408"},
}, },
}) })
} }
+13 -18
View File
@@ -16,43 +16,38 @@ func (c *Conn) GetTrack(media *core.Media, codec *core.Codec) (*core.Receiver, e
} }
} }
switch c.mode {
case core.ModeActiveProducer:
c.stateMu.Lock() c.stateMu.Lock()
defer c.stateMu.Unlock() defer c.stateMu.Unlock()
var channel byte
switch c.mode {
case core.ModeActiveProducer:
if c.state == StatePlay { if c.state == StatePlay {
if err := c.Reconnect(); err != nil { if err := c.Reconnect(); err != nil {
return nil, err return nil, err
} }
} }
channel, err := c.SetupMedia(media) var err error
channel, err = c.SetupMedia(media)
if err != nil { if err != nil {
return nil, err return nil, err
} }
c.state = StateSetup c.state = StateSetup
track := core.NewReceiver(media, codec)
track.ID = channel
c.Receivers = append(c.Receivers, track)
return track, nil
case core.ModePassiveConsumer: case core.ModePassiveConsumer:
// Backchannel // Backchannel
c.stateMu.Lock() channel = byte(len(c.Senders)) * 2
defer c.stateMu.Unlock()
channel := byte(len(c.Senders)) * 2
track := core.NewReceiver(media, codec)
track.ID = channel
c.Receivers = append(c.Receivers, track)
return track, nil
default: default:
return nil, errors.New("rtsp: wrong mode for GetTrack") return nil, errors.New("rtsp: wrong mode for GetTrack")
} }
track := core.NewReceiver(media, codec)
track.ID = channel
c.Receivers = append(c.Receivers, track)
return track, nil
} }
func (c *Conn) Start() (err error) { func (c *Conn) Start() (err error) {
+6 -12
View File
@@ -164,20 +164,14 @@ func (c *Conn) Accept() error {
c.state = StateSetup c.state = StateSetup
if c.mode == core.ModePassiveConsumer { if c.mode == core.ModePassiveConsumer {
trackID := reqTrackID(req) if i := reqTrackID(req); i >= 0 && i < len(c.Senders)+len(c.Receivers) {
if i < len(c.Senders) {
if trackID >= 0 { c.Senders[i].Media.ID = MethodSetup
if trackID < len(c.Senders) {
c.Senders[trackID].Media.ID = MethodSetup
tr = fmt.Sprintf("%d-%d", trackID*2, trackID*2+1)
res.Header.Set("Transport", 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("%d-%d", trackID*2, trackID*2+1)
res.Header.Set("Transport", transport+tr)
} else { } else {
res.Status = "400 Bad Request" c.Receivers[i-len(c.Senders)].Media.ID = MethodSetup
} }
tr = fmt.Sprintf("%d-%d", i*2, i*2+1)
res.Header.Set("Transport", transport+tr)
} else { } else {
res.Status = "400 Bad Request" res.Status = "400 Bad Request"
} }