This reverts commit 500d18b6c6.
This commit is contained in:
Alessandro Ros
2025-06-03 20:27:53 +02:00
committed by GitHub
parent c055c13442
commit c21c969a8c
10 changed files with 79 additions and 287 deletions

View File

@@ -39,8 +39,6 @@ import (
//go:embed VERSION
var version []byte
var timeNow = time.Now
var defaultConfPaths = []string{
"rtsp-simple-server.yml",
"mediamtx.yml",
@@ -464,7 +462,6 @@ func (p *Core) createResources(initial bool) error {
RunOnConnectRestart: p.conf.RunOnConnectRestart,
RunOnDisconnect: p.conf.RunOnDisconnect,
ExternalCmdPool: p.externalCmdPool,
TimeNow: timeNow,
Metrics: p.metrics,
PathManager: p.pathManager,
Parent: p,
@@ -492,7 +489,6 @@ func (p *Core) createResources(initial bool) error {
RunOnConnectRestart: p.conf.RunOnConnectRestart,
RunOnDisconnect: p.conf.RunOnDisconnect,
ExternalCmdPool: p.externalCmdPool,
TimeNow: timeNow,
Metrics: p.metrics,
PathManager: p.pathManager,
Parent: p,

View File

@@ -42,45 +42,35 @@ func httpPullFile(t *testing.T, hc *http.Client, u string) []byte {
}
func TestMetrics(t *testing.T) {
serverCertFpath, err := test.CreateTempFile(test.TLSCertPub)
require.NoError(t, err)
defer os.Remove(serverCertFpath)
serverKeyFpath, err := test.CreateTempFile(test.TLSCertKey)
require.NoError(t, err)
defer os.Remove(serverKeyFpath)
p, ok := newInstance("api: yes\n" +
"hlsAlwaysRemux: yes\n" +
"metrics: yes\n" +
"webrtcServerCert: " + serverCertFpath + "\n" +
"webrtcServerKey: " + serverKeyFpath + "\n" +
"rtspEncryption: optional\n" +
"rtspServerCert: " + serverCertFpath + "\n" +
"rtspServerKey: " + serverKeyFpath + "\n" +
"rtmpEncryption: optional\n" +
"rtmpServerCert: " + serverCertFpath + "\n" +
"rtmpServerKey: " + serverKeyFpath + "\n" +
"paths:\n" +
" all_others:\n")
require.Equal(t, true, ok)
defer p.Close()
tr := &http.Transport{}
defer tr.CloseIdleConnections()
hc := &http.Client{Transport: tr}
t.Run("initial", func(t *testing.T) {
serverCertFpath, err := test.CreateTempFile(test.TLSCertPub)
require.NoError(t, err)
defer os.Remove(serverCertFpath)
serverKeyFpath, err := test.CreateTempFile(test.TLSCertKey)
require.NoError(t, err)
defer os.Remove(serverKeyFpath)
n := 0
timeNow = func() time.Time {
d := time.Date(2009, 5, 20, 22, 15, 25, 427000, time.Local).Add(time.Duration(n) * 2 * time.Second)
n++
return d
}
defer func() {
timeNow = time.Now
}()
p, ok := newInstance("api: yes\n" +
"hlsAlwaysRemux: yes\n" +
"metrics: yes\n" +
"webrtcServerCert: " + serverCertFpath + "\n" +
"webrtcServerKey: " + serverKeyFpath + "\n" +
"rtspEncryption: optional\n" +
"rtspServerCert: " + serverCertFpath + "\n" +
"rtspServerKey: " + serverKeyFpath + "\n" +
"rtmpEncryption: optional\n" +
"rtmpServerCert: " + serverCertFpath + "\n" +
"rtmpServerKey: " + serverKeyFpath + "\n" +
"paths:\n" +
" all_others:\n")
require.Equal(t, true, ok)
defer p.Close()
tr := &http.Transport{}
defer tr.CloseIdleConnections()
hc := &http.Client{Transport: tr}
bo := httpPullFile(t, hc, "http://localhost:9998/metrics")
require.Equal(t, `paths 0
@@ -179,44 +169,6 @@ webrtc_sessions_bytes_sent 0
})
t.Run("with data", func(t *testing.T) {
serverCertFpath, err := test.CreateTempFile(test.TLSCertPub)
require.NoError(t, err)
defer os.Remove(serverCertFpath)
serverKeyFpath, err := test.CreateTempFile(test.TLSCertKey)
require.NoError(t, err)
defer os.Remove(serverKeyFpath)
n := 0
timeNow = func() time.Time {
d := time.Date(2009, 5, 20, 22, 15, 25, 427000, time.Local).Add(time.Duration(n) * 2 * time.Second)
n++
return d
}
defer func() {
timeNow = time.Now
}()
p, ok := newInstance("api: yes\n" +
"hlsAlwaysRemux: yes\n" +
"metrics: yes\n" +
"webrtcServerCert: " + serverCertFpath + "\n" +
"webrtcServerKey: " + serverKeyFpath + "\n" +
"rtspEncryption: optional\n" +
"rtspServerCert: " + serverCertFpath + "\n" +
"rtspServerKey: " + serverKeyFpath + "\n" +
"rtmpEncryption: optional\n" +
"rtmpServerCert: " + serverCertFpath + "\n" +
"rtmpServerKey: " + serverKeyFpath + "\n" +
"paths:\n" +
" all_others:\n")
require.Equal(t, true, ok)
defer p.Close()
tr := &http.Transport{}
defer tr.CloseIdleConnections()
hc := &http.Client{Transport: tr}
terminate := make(chan struct{})
var wg sync.WaitGroup
wg.Add(6)
@@ -241,8 +193,6 @@ webrtc_sessions_bytes_sent 0
<-terminate
}()
rtmpDone := make(chan struct{})
go func() {
defer wg.Done()
@@ -267,16 +217,12 @@ webrtc_sessions_bytes_sent 0
err = w.WriteH264(2*time.Second, 2*time.Second, [][]byte{{5, 2, 3, 4}})
require.NoError(t, err)
close(rtmpDone)
<-terminate
}()
go func() {
defer wg.Done()
<-rtmpDone
u, err := url.Parse("rtmps://localhost:1936/rtmps_path")
require.NoError(t, err)
@@ -302,8 +248,6 @@ webrtc_sessions_bytes_sent 0
<-terminate
}()
webrtcReady := make(chan struct{})
go func() {
defer wg.Done()
@@ -314,7 +258,7 @@ webrtc_sessions_bytes_sent 0
defer tr.CloseIdleConnections()
hc2 := &http.Client{Transport: tr}
track1 := &webrtc.OutgoingTrack{
track := &webrtc.OutgoingTrack{
Caps: pwebrtc.RTPCodecCapability{
MimeType: pwebrtc.MimeTypeH264,
ClockRate: 90000,
@@ -322,44 +266,30 @@ webrtc_sessions_bytes_sent 0
},
}
track2 := &webrtc.OutgoingTrack{
Caps: pwebrtc.RTPCodecCapability{
MimeType: pwebrtc.MimeTypeOpus,
ClockRate: 48000,
Channels: 2,
SDPFmtpLine: "minptime=10;useinbandfec=1;stereo=1;sprop-stereo=1",
},
}
s := &whip.Client{
HTTPClient: hc2,
URL: su,
Log: test.NilLogger,
Publish: true,
OutgoingTracks: []*webrtc.OutgoingTrack{track1, track2},
OutgoingTracks: []*webrtc.OutgoingTrack{track},
}
err = s.Initialize(context.Background())
require.NoError(t, err)
defer checkClose(t, s.Close)
for _, track := range s.OutgoingTracks {
err = track.WriteRTP(&rtp.Packet{
Header: rtp.Header{
Version: 2,
Marker: true,
PayloadType: 96,
SequenceNumber: 123,
Timestamp: 45343,
SSRC: 563423,
},
Payload: []byte{1},
})
require.NoError(t, err)
}
close(webrtcReady)
err = track.WriteRTP(&rtp.Packet{
Header: rtp.Header{
Version: 2,
Marker: true,
PayloadType: 96,
SequenceNumber: 123,
Timestamp: 45343,
SSRC: 563423,
},
Payload: []byte{1},
})
require.NoError(t, err)
<-terminate
}()
@@ -398,8 +328,7 @@ webrtc_sessions_bytes_sent 0
<-terminate
}()
<-webrtcReady
time.Sleep(1 * time.Second)
time.Sleep(500*time.Millisecond + 2*time.Second)
bo := httpPullFile(t, hc, "http://localhost:9998/metrics")
@@ -497,12 +426,12 @@ webrtc_sessions_bytes_sent 0
`srt_conns_bytes_send_drop\{id=".*?",state="publish"\} [0-9]+`+"\n"+
`srt_conns_bytes_received_drop\{id=".*?",state="publish"\} [0-9]+`+"\n"+
`srt_conns_bytes_received_undecrypt\{id=".*?",state="publish"\} [0-9]+`+"\n"+
`srt_conns_us_packets_send_period\{id=".*?",state="publish"\} \d+(\.\d+)?`+"\n"+
`srt_conns_us_packets_send_period\{id=".*?",state="publish"\} \d+\.\d+`+"\n"+
`srt_conns_packets_flow_window\{id=".*?",state="publish"\} [0-9]+`+"\n"+
`srt_conns_packets_flight_size\{id=".*?",state="publish"\} [0-9]+`+"\n"+
`srt_conns_ms_rtt\{id=".*?",state="publish"\} \d+(\.\d+)?`+"\n"+
`srt_conns_ms_rtt\{id=".*?",state="publish"\} \d+\.\d+`+"\n"+
`srt_conns_mbps_send_rate\{id=".*?",state="publish"\} [0-9]+`+"\n"+
`srt_conns_mbps_receive_rate\{id=".*?",state="publish"\} \d+(\.\d+)?`+"\n"+
`srt_conns_mbps_receive_rate\{id=".*?",state="publish"\} [0-9]+`+"\n"+
`srt_conns_mbps_link_capacity\{id=".*?",state="publish"\} [0-9]+`+"\n"+
`srt_conns_bytes_avail_send_buf\{id=".*?",state="publish"\} [0-9]+`+"\n"+
`srt_conns_bytes_avail_receive_buf\{id=".*?",state="publish"\} [0-9]+`+"\n"+
@@ -531,44 +460,6 @@ webrtc_sessions_bytes_sent 0
})
t.Run("servers disabled", func(t *testing.T) {
serverCertFpath, err := test.CreateTempFile(test.TLSCertPub)
require.NoError(t, err)
defer os.Remove(serverCertFpath)
serverKeyFpath, err := test.CreateTempFile(test.TLSCertKey)
require.NoError(t, err)
defer os.Remove(serverKeyFpath)
n := 0
timeNow = func() time.Time {
d := time.Date(2009, 5, 20, 22, 15, 25, 427000, time.Local).Add(time.Duration(n) * 2 * time.Second)
n++
return d
}
defer func() {
timeNow = time.Now
}()
p, ok := newInstance("api: yes\n" +
"hlsAlwaysRemux: yes\n" +
"metrics: yes\n" +
"webrtcServerCert: " + serverCertFpath + "\n" +
"webrtcServerKey: " + serverKeyFpath + "\n" +
"rtspEncryption: optional\n" +
"rtspServerCert: " + serverCertFpath + "\n" +
"rtspServerKey: " + serverKeyFpath + "\n" +
"rtmpEncryption: optional\n" +
"rtmpServerCert: " + serverCertFpath + "\n" +
"rtmpServerKey: " + serverKeyFpath + "\n" +
"paths:\n" +
" all_others:\n")
require.Equal(t, true, ok)
defer p.Close()
tr := &http.Transport{}
defer tr.CloseIdleConnections()
hc := &http.Client{Transport: tr}
httpRequest(t, hc, http.MethodPatch, "http://localhost:9997/v3/config/global/patch", map[string]interface{}{
"rtsp": false,
"rtmp": false,

View File

@@ -447,16 +447,8 @@ func TestPathRunOnRead(t *testing.T) {
require.NoError(t, err)
defer conn.Close()
n := 0
timeNow := func() time.Time {
d := time.Date(2009, 5, 20, 22, 15, 25, 427000, time.Local).Add(time.Duration(n) * 2 * time.Second)
n++
return d
}
r := &rtmp.Reader{
Conn: conn,
TimeNow: timeNow,
Conn: conn,
}
err = r.Initialize()
require.NoError(t, err)
@@ -491,16 +483,8 @@ func TestPathRunOnRead(t *testing.T) {
}
}()
n := 0
timeNow := func() time.Time {
d := time.Date(2009, 5, 20, 22, 15, 25, 427000, time.Local).Add(time.Duration(n) * 2 * time.Second)
n++
return d
}
r := &rtmp.Reader{
Conn: conn,
TimeNow: timeNow,
Conn: conn,
}
err = r.Initialize()
require.NoError(t, err)

View File

@@ -272,8 +272,7 @@ func sortedKeys(m map[uint8]format.Format) []int {
// Reader provides functions to read incoming data.
type Reader struct {
Conn Conn
TimeNow func() time.Time
Conn Conn
videoTracks map[uint8]format.Format
audioTracks map[uint8]format.Format
@@ -283,10 +282,6 @@ type Reader struct {
// Initialize initializes Reader.
func (r *Reader) Initialize() error {
if r.TimeNow == nil {
r.TimeNow = time.Now
}
var err error
r.videoTracks, r.audioTracks, err = r.readTracks()
if err != nil {
@@ -301,8 +296,8 @@ func (r *Reader) Initialize() error {
func (r *Reader) readTracks() (map[uint8]format.Format, map[uint8]format.Format, error) {
firstReceived := false
var startTime time.Time
var curTime time.Time
var startTime time.Duration
var curTime time.Duration
videoTracks := make(map[uint8]format.Format)
audioTracks := make(map[uint8]format.Format)
@@ -321,23 +316,21 @@ func (r *Reader) readTracks() (map[uint8]format.Format, map[uint8]format.Format,
return nil
}
handleVideoExCodedFrames := func(_ uint8, _ *message.VideoExCodedFrames) error {
now := r.TimeNow()
handleVideoExCodedFrames := func(_ uint8, msg *message.VideoExCodedFrames) error {
if !firstReceived {
firstReceived = true
startTime = now
startTime = msg.DTS
}
curTime = now
curTime = msg.DTS
return nil
}
handleVideoExFramesX := func(_ uint8, _ *message.VideoExFramesX) error {
now := r.TimeNow()
handleVideoExFramesX := func(_ uint8, msg *message.VideoExFramesX) error {
if !firstReceived {
firstReceived = true
startTime = now
startTime = msg.DTS
}
curTime = now
curTime = msg.DTS
return nil
}
@@ -353,12 +346,11 @@ func (r *Reader) readTracks() (map[uint8]format.Format, map[uint8]format.Format,
}
handleAudioCodedFrames := func(trackID uint8, msg *message.AudioExCodedFrames) error {
now := r.TimeNow()
if !firstReceived {
firstReceived = true
startTime = now
startTime = msg.DTS
}
curTime = now
curTime = msg.DTS
if audioTracks[trackID] != nil {
return nil
@@ -381,12 +373,11 @@ func (r *Reader) readTracks() (map[uint8]format.Format, map[uint8]format.Format,
switch msg := msg.(type) {
case *message.Video:
now := r.TimeNow()
if !firstReceived {
firstReceived = true
startTime = now
startTime = msg.DTS
}
curTime = now
curTime = msg.DTS
if msg.Type == message.VideoTypeConfig && videoTracks[0] == nil {
videoTracks[0], err = h264TrackFromConfig(msg.Payload)
@@ -439,12 +430,11 @@ func (r *Reader) readTracks() (map[uint8]format.Format, map[uint8]format.Format,
}
case *message.Audio:
now := r.TimeNow()
if !firstReceived {
firstReceived = true
startTime = now
startTime = msg.DTS
}
curTime = now
curTime = msg.DTS
if audioTracks[0] == nil && len(msg.Payload) != 0 {
if msg.Codec == message.CodecMPEG4Audio {
@@ -494,7 +484,7 @@ func (r *Reader) readTracks() (map[uint8]format.Format, map[uint8]format.Format,
}
}
if curTime.Sub(startTime) >= analyzePeriod {
if (curTime - startTime) >= analyzePeriod {
break
}
}

View File

@@ -1635,52 +1635,8 @@ func TestReadTracks(t *testing.T) {
}
c.initialize()
n := time.Duration(0)
TimeNow := func() time.Time {
var d time.Time
outer:
for {
msg := ca.messages[n]
n++
switch msg := msg.(type) {
case *message.Video:
d = time.Date(2008, 10, 28, 13, 11, 12, 0, time.UTC).Add(msg.DTS)
break outer
case *message.VideoExCodedFrames:
d = time.Date(2008, 10, 28, 13, 11, 12, 0, time.UTC).Add(msg.DTS)
break outer
case *message.VideoExMultitrack:
msg2 := msg.Wrapped
switch msg2 := msg2.(type) {
case *message.VideoExCodedFrames:
d = time.Date(2008, 10, 28, 13, 11, 12, 0, time.UTC).Add(msg2.DTS)
break outer
}
case *message.Audio:
d = time.Date(2008, 10, 28, 13, 11, 12, 0, time.UTC).Add(msg.DTS)
break outer
case *message.AudioExCodedFrames:
d = time.Date(2008, 10, 28, 13, 11, 12, 0, time.UTC).Add(msg.DTS)
break outer
case *message.AudioExMultitrack:
msg2 := msg.Wrapped
switch msg2 := msg2.(type) {
case *message.AudioExCodedFrames:
d = time.Date(2008, 10, 28, 13, 11, 12, 0, time.UTC).Add(msg2.DTS)
break outer
}
}
}
return d
}
r := &Reader{
Conn: c,
TimeNow: TimeNow,
Conn: c,
}
err = r.Initialize()
require.NoError(t, err)

View File

@@ -41,7 +41,6 @@ type conn struct {
wg *sync.WaitGroup
nconn net.Conn
externalCmdPool *externalcmd.Pool
timeNow func() time.Time
pathManager serverPathManager
parent *Server
@@ -260,8 +259,7 @@ func (c *conn) runPublish() error {
c.mutex.Unlock()
r := &rtmp.Reader{
Conn: c.rconn,
TimeNow: c.timeNow,
Conn: c.rconn,
}
err = r.Initialize()
if err != nil {

View File

@@ -10,7 +10,6 @@ import (
"reflect"
"sort"
"sync"
"time"
"github.com/google/uuid"
@@ -85,7 +84,6 @@ type Server struct {
RunOnConnectRestart bool
RunOnDisconnect string
ExternalCmdPool *externalcmd.Pool
TimeNow func() time.Time
Metrics serverMetrics
PathManager serverPathManager
Parent serverParent
@@ -218,7 +216,6 @@ outer:
wg: &s.wg,
nconn: nconn,
externalCmdPool: s.ExternalCmdPool,
timeNow: s.TimeNow,
pathManager: s.PathManager,
parent: s,
}

View File

@@ -97,13 +97,6 @@ func TestServerPublish(t *testing.T) {
},
}
n := 0
timeNow := func() time.Time {
d := time.Date(2009, 5, 20, 22, 15, 25, 427000, time.Local).Add(time.Duration(n) * 2 * time.Second)
n++
return d
}
s := &Server{
Address: "127.0.0.1:1935",
ReadTimeout: conf.Duration(10 * time.Second),
@@ -116,7 +109,6 @@ func TestServerPublish(t *testing.T) {
RunOnConnectRestart: false,
RunOnDisconnect: "",
ExternalCmdPool: nil,
TimeNow: timeNow,
PathManager: pathManager,
Parent: test.NilLogger,
}
@@ -154,6 +146,12 @@ func TestServerPublish(t *testing.T) {
err = w.Initialize()
require.NoError(t, err)
err = w.WriteH264(
2*time.Second, 2*time.Second, [][]byte{
{5, 2, 3, 4},
})
require.NoError(t, err)
<-path.streamCreated
recv := make(chan struct{})
@@ -168,7 +166,7 @@ func TestServerPublish(t *testing.T) {
require.Equal(t, [][]byte{
test.FormatH264.SPS,
test.FormatH264.PPS,
{5, 6, 7, 8},
{5, 2, 3, 4},
}, u.(*unit.H264).AU)
close(recv)
return nil
@@ -179,7 +177,7 @@ func TestServerPublish(t *testing.T) {
err = w.WriteH264(
3*time.Second, 3*time.Second, [][]byte{
{5, 6, 7, 8},
{5, 2, 3, 4},
})
require.NoError(t, err)
@@ -305,16 +303,8 @@ func TestServerRead(t *testing.T) {
})
}()
n := 0
timeNow := func() time.Time {
d := time.Date(2009, 5, 20, 22, 15, 25, 427000, time.Local).Add(time.Duration(n) * 2 * time.Second)
n++
return d
}
r := &rtmp.Reader{
Conn: conn,
TimeNow: timeNow,
Conn: conn,
}
err = r.Initialize()
require.NoError(t, err)

View File

@@ -18,8 +18,6 @@ import (
"github.com/bluenviron/mediamtx/internal/stream"
)
var timeNow = time.Now
// Source is a RTMP static source.
type Source struct {
ReadTimeout conf.Duration
@@ -88,8 +86,7 @@ func (s *Source) runReader(ctx context.Context, u *url.URL, fingerprint string)
}
r := &rtmp.Reader{
Conn: conn,
TimeNow: timeNow,
Conn: conn,
}
err = r.Initialize()
if err != nil {

View File

@@ -83,6 +83,9 @@ func TestSource(t *testing.T) {
err = w.WriteH264(2*time.Second, 2*time.Second, [][]byte{{5, 2, 3, 4}})
require.NoError(t, err)
err = w.WriteH264(3*time.Second, 3*time.Second, [][]byte{{5, 2, 3, 4}})
require.NoError(t, err)
break
}
}()
@@ -101,16 +104,6 @@ func TestSource(t *testing.T) {
source += "localhost/teststream"
n := 0
timeNow = func() time.Time {
d := time.Date(2009, 5, 20, 22, 15, 25, 427000, time.Local).Add(time.Duration(n) * 2 * time.Second)
n++
return d
}
defer func() {
timeNow = time.Now
}()
te := test.NewSourceTester(
func(p defs.StaticSourceParent) defs.StaticSource {
return &Source{