mirror of
https://github.com/aler9/rtsp-simple-server
synced 2025-10-05 15:46:58 +08:00

When a path has a MPEG-TS, RTP or WebRTC source and the path configuration is reloaded, a routine was left open because the reload channel was not handled. This fixes the issue.
83 lines
1.8 KiB
Go
83 lines
1.8 KiB
Go
package srt
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/bluenviron/mediacommon/v2/pkg/formats/mpegts"
|
|
srt "github.com/datarhei/gosrt"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/bluenviron/mediamtx/internal/conf"
|
|
"github.com/bluenviron/mediamtx/internal/defs"
|
|
"github.com/bluenviron/mediamtx/internal/test"
|
|
)
|
|
|
|
func TestSource(t *testing.T) {
|
|
ln, err := srt.Listen("srt", "127.0.0.1:9002", srt.DefaultConfig())
|
|
require.NoError(t, err)
|
|
defer ln.Close()
|
|
|
|
p := &test.StaticSourceParent{}
|
|
p.Initialize()
|
|
|
|
so := &Source{
|
|
ReadTimeout: conf.Duration(10 * time.Second),
|
|
Parent: p,
|
|
}
|
|
|
|
done := make(chan struct{})
|
|
defer func() { <-done }()
|
|
|
|
ctx, ctxCancel := context.WithCancel(context.Background())
|
|
defer ctxCancel()
|
|
|
|
reloadConf := make(chan *conf.Path)
|
|
|
|
go func() {
|
|
so.Run(defs.StaticSourceRunParams{ //nolint:errcheck
|
|
Context: ctx,
|
|
ResolvedSource: "srt://127.0.0.1:9002?streamid=sidname&passphrase=ttest1234567",
|
|
Conf: &conf.Path{},
|
|
ReloadConf: reloadConf,
|
|
})
|
|
close(done)
|
|
}()
|
|
|
|
req, err2 := ln.Accept2()
|
|
require.NoError(t, err2)
|
|
|
|
require.Equal(t, "sidname", req.StreamId())
|
|
err2 = req.SetPassphrase("ttest1234567")
|
|
require.NoError(t, err2)
|
|
|
|
conn, err2 := req.Accept()
|
|
require.NoError(t, err2)
|
|
defer conn.Close()
|
|
|
|
track := &mpegts.Track{Codec: &mpegts.CodecH264{}}
|
|
|
|
w := &mpegts.Writer{W: conn, Tracks: []*mpegts.Track{track}}
|
|
err2 = w.Initialize()
|
|
require.NoError(t, err2)
|
|
|
|
err2 = w.WriteH264(track, 0, 0, [][]byte{{ // IDR
|
|
5, 1,
|
|
}})
|
|
require.NoError(t, err2)
|
|
|
|
err = w.WriteH264(track, 0, 0, [][]byte{{ // non-IDR
|
|
5, 2,
|
|
}})
|
|
require.NoError(t, err)
|
|
|
|
<-p.Unit
|
|
|
|
// the source must be listening on ReloadConf
|
|
reloadConf <- nil
|
|
|
|
// stop test reader before 2nd H264 packet is received to avoid a crash
|
|
p.Close()
|
|
}
|