mirror of
https://github.com/bluenviron/mediamtx
synced 2025-01-09 16:29:29 +00:00
91 lines
1.7 KiB
Go
91 lines
1.7 KiB
Go
package core
|
|
|
|
import (
|
|
"bufio"
|
|
"net"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/bluenviron/gortsplib/v4"
|
|
"github.com/bluenviron/gortsplib/v4/pkg/format"
|
|
"github.com/bluenviron/gortsplib/v4/pkg/url"
|
|
"github.com/bluenviron/mediacommon/pkg/formats/mpegts"
|
|
"github.com/pion/rtp"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestUDPSource(t *testing.T) {
|
|
p, ok := newInstance("paths:\n" +
|
|
" proxied:\n" +
|
|
" source: udp://localhost:9999\n" +
|
|
" sourceOnDemand: yes\n")
|
|
require.Equal(t, true, ok)
|
|
defer p.Close()
|
|
|
|
c := gortsplib.Client{}
|
|
|
|
u, err := url.Parse("rtsp://127.0.0.1:8554/proxied")
|
|
require.NoError(t, err)
|
|
|
|
err = c.Start(u.Scheme, u.Host)
|
|
require.NoError(t, err)
|
|
defer c.Close()
|
|
|
|
connected := make(chan struct{})
|
|
received := make(chan struct{})
|
|
|
|
go func() {
|
|
time.Sleep(200 * time.Millisecond)
|
|
|
|
conn, err := net.Dial("udp", "localhost:9999")
|
|
require.NoError(t, err)
|
|
defer conn.Close()
|
|
|
|
track := &mpegts.Track{
|
|
Codec: &mpegts.CodecH264{},
|
|
}
|
|
|
|
bw := bufio.NewWriter(conn)
|
|
w := mpegts.NewWriter(bw, []*mpegts.Track{track})
|
|
require.NoError(t, err)
|
|
|
|
err = w.WriteH26x(track, 0, 0, true, [][]byte{
|
|
{ // IDR
|
|
0x05, 1,
|
|
},
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
err = bw.Flush()
|
|
require.NoError(t, err)
|
|
|
|
<-connected
|
|
|
|
err = w.WriteH26x(track, 0, 0, true, [][]byte{{5, 2}})
|
|
require.NoError(t, err)
|
|
|
|
err = bw.Flush()
|
|
require.NoError(t, err)
|
|
}()
|
|
|
|
desc, _, err := c.Describe(u)
|
|
require.NoError(t, err)
|
|
|
|
var forma *format.H264
|
|
medi := desc.FindFormat(&forma)
|
|
|
|
_, err = c.Setup(desc.BaseURL, medi, 0, 0)
|
|
require.NoError(t, err)
|
|
|
|
c.OnPacketRTP(medi, forma, func(pkt *rtp.Packet) {
|
|
require.Equal(t, []byte{5, 1}, pkt.Payload)
|
|
close(received)
|
|
})
|
|
|
|
_, err = c.Play(nil)
|
|
require.NoError(t, err)
|
|
|
|
close(connected)
|
|
<-received
|
|
}
|