Skip to content

Commit 54967a6

Browse files
committed
rtp: reorder packets before ingestion
1 parent a3e3646 commit 54967a6

File tree

4 files changed

+75
-19
lines changed

4 files changed

+75
-19
lines changed

go.sum

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@ github.com/bluenviron/gohlslib/v2 v2.2.3 h1:1R/Jnh1kNR9UB09KAX6xjS2GcdKFRLuPd9wM
3737
github.com/bluenviron/gohlslib/v2 v2.2.3/go.mod h1:z4Viks+Mdgcl7OcOVJ1fgSmuUwCCJBxYJPLN49n7Vnw=
3838
github.com/bluenviron/gortmplib v0.1.1 h1:pmR6qfPcJJmE17lWQ/bpuBFZtgGnMrN8KdFj1Gl/ZoQ=
3939
github.com/bluenviron/gortmplib v0.1.1/go.mod h1:XWy2YzbTP1XEEZ8232OG7I1MSwubsbDRKDNhXGgS2kg=
40-
github.com/bluenviron/gortsplib/v5 v5.1.2-0.20251026101219-59474a8fa3ab h1:9QH6j4y2FMo299Rz/hX5jrhI+THhWgZ/oSiEmwSPavk=
41-
github.com/bluenviron/gortsplib/v5 v5.1.2-0.20251026101219-59474a8fa3ab/go.mod h1:+4E4JNF7dpDu8LgssZu9fB3Ndh6FNbvGYMKOKR/wvvI=
4240
github.com/bluenviron/gortsplib/v5 v5.1.2-0.20251112170709-0e56f305d197 h1:NvBCxleaHdQwxZLpck4JwsOFYupbtg9+QnWnvRD2CYc=
4341
github.com/bluenviron/gortsplib/v5 v5.1.2-0.20251112170709-0e56f305d197/go.mod h1:IPHhCqTQvmKZ9t101dfnsf8xvVHM2oGGmxxEH8KMof4=
4442
github.com/bluenviron/mediacommon/v2 v2.5.1 h1:qB2fb5c0xyl5OB2gfSfulpEJn7Cdm3vI2n8wjiLMxKI=
@@ -241,8 +239,6 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
241239
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
242240
golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
243241
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
244-
golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04=
245-
golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0=
246242
golang.org/x/crypto v0.44.0 h1:A97SsFvM3AIwEEmTBiaxPPTYpDC47w720rdiiUvgoAU=
247243
golang.org/x/crypto v0.44.0/go.mod h1:013i+Nw79BMiQiMsOPcVCB5ZIJbYkerPrGnOa00tvmc=
248244
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
@@ -251,8 +247,6 @@ golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA=
251247
golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w=
252248
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
253249
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
254-
golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4=
255-
golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210=
256250
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
257251
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
258252
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
@@ -276,8 +270,6 @@ golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU=
276270
golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254=
277271
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
278272
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
279-
golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k=
280-
golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM=
281273
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
282274
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
283275
golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY=
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package rtp
2+
3+
import (
4+
"time"
5+
6+
"github.com/bluenviron/gortsplib/v5/pkg/format"
7+
"github.com/bluenviron/gortsplib/v5/pkg/rtpreceiver"
8+
"github.com/pion/rtcp"
9+
)
10+
11+
type rtpFormat struct {
12+
desc format.Format
13+
14+
rtpReceiver *rtpreceiver.Receiver
15+
}
16+
17+
func (f *rtpFormat) initialize() {
18+
f.rtpReceiver = &rtpreceiver.Receiver{
19+
ClockRate: f.desc.ClockRate(),
20+
UnrealiableTransport: true,
21+
Period: 10 * time.Second,
22+
WritePacketRTCP: func(_ rtcp.Packet) {
23+
},
24+
}
25+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package rtp
2+
3+
import "github.com/bluenviron/gortsplib/v5/pkg/description"
4+
5+
type rtpMedia struct {
6+
desc *description.Media
7+
}

internal/staticsources/rtp/source.go

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"time"
99

1010
"github.com/bluenviron/gortsplib/v5/pkg/description"
11-
"github.com/bluenviron/gortsplib/v5/pkg/format"
1211
"github.com/bluenviron/gortsplib/v5/pkg/rtptime"
1312
"github.com/bluenviron/gortsplib/v5/pkg/sdp"
1413
"github.com/bluenviron/mediamtx/internal/conf"
@@ -103,6 +102,22 @@ func (s *Source) Run(params defs.StaticSourceRunParams) error {
103102
}
104103

105104
func (s *Source) runReader(desc *description.Session, nc net.Conn) error {
105+
packetsLost := &counterdumper.CounterDumper{
106+
OnReport: func(val uint64) {
107+
s.Log(logger.Warn, "%d RTP %s lost",
108+
val,
109+
func() string {
110+
if val == 1 {
111+
return "packet"
112+
}
113+
return "packets"
114+
}())
115+
},
116+
}
117+
118+
packetsLost.Start()
119+
defer packetsLost.Stop()
120+
106121
decodeErrors := &counterdumper.CounterDumper{
107122
OnReport: func(val uint64) {
108123
s.Log(logger.Warn, "%d decode %s",
@@ -123,13 +138,22 @@ func (s *Source) runReader(desc *description.Session, nc net.Conn) error {
123138
timeDecoder := &rtptime.GlobalDecoder{}
124139
timeDecoder.Initialize()
125140

126-
mediasByPayloadType := make(map[uint8]*description.Media)
127-
formatsByPayloadType := make(map[uint8]format.Format)
141+
mediasByPayloadType := make(map[uint8]*rtpMedia)
142+
formatsByPayloadType := make(map[uint8]*rtpFormat)
128143

129-
for _, media := range desc.Medias {
130-
for _, forma := range media.Formats {
131-
mediasByPayloadType[forma.PayloadType()] = media
132-
formatsByPayloadType[forma.PayloadType()] = forma
144+
for _, descMedia := range desc.Medias {
145+
rtpMedia := &rtpMedia{
146+
desc: descMedia,
147+
}
148+
149+
for _, descFormat := range descMedia.Formats {
150+
rtpFormat := &rtpFormat{
151+
desc: descFormat,
152+
}
153+
rtpFormat.initialize()
154+
155+
mediasByPayloadType[descFormat.PayloadType()] = rtpMedia
156+
formatsByPayloadType[descFormat.PayloadType()] = rtpFormat
133157
}
134158
}
135159

@@ -173,12 +197,20 @@ func (s *Source) runReader(desc *description.Session, nc net.Conn) error {
173197

174198
forma := formatsByPayloadType[pkt.PayloadType]
175199

176-
pts, ok := timeDecoder.Decode(forma, &pkt)
177-
if !ok {
178-
continue
200+
pkts, lost := forma.rtpReceiver.ProcessPacket2(&pkt, time.Now(), forma.desc.PTSEqualsDTS(&pkt))
201+
202+
if lost != 0 {
203+
packetsLost.Add(lost)
179204
}
180205

181-
stream.WriteRTPPacket(media, forma, &pkt, time.Time{}, pts)
206+
for _, pkt := range pkts {
207+
pts, ok2 := timeDecoder.Decode(forma.desc, pkt)
208+
if !ok2 {
209+
continue
210+
}
211+
212+
stream.WriteRTPPacket(media.desc, forma.desc, pkt, time.Time{}, pts)
213+
}
182214
}
183215
}
184216

0 commit comments

Comments
 (0)