mirror of
https://github.com/AlexxIT/go2rtc.git
synced 2025-10-04 07:56:33 +08:00
135 lines
2.5 KiB
Go
135 lines
2.5 KiB
Go
package core
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
type producer struct {
|
|
Medias []*Media
|
|
Receivers []*Receiver
|
|
|
|
id byte
|
|
}
|
|
|
|
func (p *producer) GetMedias() []*Media {
|
|
return p.Medias
|
|
}
|
|
|
|
func (p *producer) GetTrack(_ *Media, codec *Codec) (*Receiver, error) {
|
|
for _, receiver := range p.Receivers {
|
|
if receiver.Codec == codec {
|
|
return receiver, nil
|
|
}
|
|
}
|
|
receiver := NewReceiver(nil, codec)
|
|
p.Receivers = append(p.Receivers, receiver)
|
|
return receiver, nil
|
|
}
|
|
|
|
func (p *producer) Start() error {
|
|
pkt := &Packet{Payload: []byte{p.id}}
|
|
p.Receivers[0].Input(pkt)
|
|
return nil
|
|
}
|
|
|
|
func (p *producer) Stop() error {
|
|
for _, receiver := range p.Receivers {
|
|
receiver.Close()
|
|
}
|
|
return nil
|
|
}
|
|
|
|
type consumer struct {
|
|
Medias []*Media
|
|
Senders []*Sender
|
|
|
|
cache chan byte
|
|
}
|
|
|
|
func (c *consumer) GetMedias() []*Media {
|
|
return c.Medias
|
|
}
|
|
|
|
func (c *consumer) AddTrack(_ *Media, _ *Codec, track *Receiver) error {
|
|
c.cache = make(chan byte, 1)
|
|
sender := NewSender(nil, track.Codec)
|
|
sender.Output = func(packet *Packet) {
|
|
c.cache <- packet.Payload[0]
|
|
}
|
|
sender.HandleRTP(track)
|
|
c.Senders = append(c.Senders, sender)
|
|
return nil
|
|
}
|
|
|
|
func (c *consumer) Stop() error {
|
|
for _, sender := range c.Senders {
|
|
sender.Close()
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (c *consumer) read() byte {
|
|
return <-c.cache
|
|
}
|
|
|
|
func TestName(t *testing.T) {
|
|
GetProducer := func(b byte) Producer {
|
|
return &producer{
|
|
Medias: []*Media{
|
|
{
|
|
Kind: KindVideo,
|
|
Direction: DirectionRecvonly,
|
|
Codecs: []*Codec{
|
|
{Name: CodecH264},
|
|
},
|
|
},
|
|
},
|
|
id: b,
|
|
}
|
|
}
|
|
|
|
// stage1
|
|
prod1 := GetProducer(1)
|
|
cons2 := &consumer{}
|
|
|
|
media1 := prod1.GetMedias()[0]
|
|
track1, _ := prod1.GetTrack(media1, media1.Codecs[0])
|
|
|
|
_ = cons2.AddTrack(nil, nil, track1)
|
|
|
|
_ = prod1.Start()
|
|
require.Equal(t, byte(1), cons2.read())
|
|
|
|
// stage2
|
|
prod2 := GetProducer(2)
|
|
media2 := prod2.GetMedias()[0]
|
|
require.NotEqual(t, fmt.Sprintf("%p", media1), fmt.Sprintf("%p", media2))
|
|
track2, _ := prod2.GetTrack(media2, media2.Codecs[0])
|
|
track1.Replace(track2)
|
|
|
|
_ = prod1.Stop()
|
|
|
|
_ = prod2.Start()
|
|
require.Equal(t, byte(2), cons2.read())
|
|
|
|
// stage3
|
|
_ = prod2.Stop()
|
|
}
|
|
|
|
func TestStripUserinfo(t *testing.T) {
|
|
s := `streams:
|
|
test:
|
|
- ffmpeg:rtsp://username:password@10.1.2.3:554/stream1
|
|
- ffmpeg:rtsp://10.1.2.3:554/stream1@#video=copy
|
|
`
|
|
s = StripUserinfo(s)
|
|
require.Equal(t, `streams:
|
|
test:
|
|
- ffmpeg:rtsp://***@10.1.2.3:554/stream1
|
|
- ffmpeg:rtsp://10.1.2.3:554/stream1@#video=copy
|
|
`, s)
|
|
}
|