Skip to content

Commit 49ee03f

Browse files
authored
reuse UDP buffers when possible (#639)
1 parent 21e06b0 commit 49ee03f

File tree

5 files changed

+91
-46
lines changed

5 files changed

+91
-46
lines changed

client_media.go

Lines changed: 35 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -187,39 +187,41 @@ func (cm *clientMedia) writePacketRTCP(byts []byte) error {
187187
return nil
188188
}
189189

190-
func (cm *clientMedia) readRTPTCPPlay(payload []byte) {
190+
func (cm *clientMedia) readRTPTCPPlay(payload []byte) bool {
191191
now := cm.c.timeNow()
192192
atomic.StoreInt64(cm.c.tcpLastFrameTime, now.Unix())
193193

194194
pkt := &rtp.Packet{}
195195
err := pkt.Unmarshal(payload)
196196
if err != nil {
197197
cm.c.OnDecodeError(err)
198-
return
198+
return false
199199
}
200200

201201
forma, ok := cm.formats[pkt.PayloadType]
202202
if !ok {
203203
cm.c.OnDecodeError(liberrors.ErrClientRTPPacketUnknownPayloadType{PayloadType: pkt.PayloadType})
204-
return
204+
return false
205205
}
206206

207207
forma.readRTPTCP(pkt)
208+
209+
return true
208210
}
209211

210-
func (cm *clientMedia) readRTCPTCPPlay(payload []byte) {
212+
func (cm *clientMedia) readRTCPTCPPlay(payload []byte) bool {
211213
now := cm.c.timeNow()
212214
atomic.StoreInt64(cm.c.tcpLastFrameTime, now.Unix())
213215

214216
if len(payload) > udpMaxPayloadSize {
215217
cm.c.OnDecodeError(liberrors.ErrClientRTCPPacketTooBig{L: len(payload), Max: udpMaxPayloadSize})
216-
return
218+
return false
217219
}
218220

219221
packets, err := rtcp.Unmarshal(payload)
220222
if err != nil {
221223
cm.c.OnDecodeError(err)
222-
return
224+
return false
223225
}
224226

225227
for _, pkt := range packets {
@@ -232,69 +234,76 @@ func (cm *clientMedia) readRTCPTCPPlay(payload []byte) {
232234

233235
cm.onPacketRTCP(pkt)
234236
}
237+
238+
return true
235239
}
236240

237-
func (cm *clientMedia) readRTPTCPRecord(_ []byte) {
241+
func (cm *clientMedia) readRTPTCPRecord(_ []byte) bool {
242+
return false
238243
}
239244

240-
func (cm *clientMedia) readRTCPTCPRecord(payload []byte) {
245+
func (cm *clientMedia) readRTCPTCPRecord(payload []byte) bool {
241246
if len(payload) > udpMaxPayloadSize {
242247
cm.c.OnDecodeError(liberrors.ErrClientRTCPPacketTooBig{L: len(payload), Max: udpMaxPayloadSize})
243-
return
248+
return false
244249
}
245250

246251
packets, err := rtcp.Unmarshal(payload)
247252
if err != nil {
248253
cm.c.OnDecodeError(err)
249-
return
254+
return false
250255
}
251256

252257
for _, pkt := range packets {
253258
cm.onPacketRTCP(pkt)
254259
}
260+
261+
return true
255262
}
256263

257-
func (cm *clientMedia) readRTPUDPPlay(payload []byte) {
264+
func (cm *clientMedia) readRTPUDPPlay(payload []byte) bool {
258265
plen := len(payload)
259266

260267
atomic.AddUint64(cm.c.BytesReceived, uint64(plen))
261268

262269
if plen == (udpMaxPayloadSize + 1) {
263270
cm.c.OnDecodeError(liberrors.ErrClientRTPPacketTooBigUDP{})
264-
return
271+
return false
265272
}
266273

267274
pkt := &rtp.Packet{}
268275
err := pkt.Unmarshal(payload)
269276
if err != nil {
270277
cm.c.OnDecodeError(err)
271-
return
278+
return false
272279
}
273280

274281
forma, ok := cm.formats[pkt.PayloadType]
275282
if !ok {
276283
cm.c.OnDecodeError(liberrors.ErrClientRTPPacketUnknownPayloadType{PayloadType: pkt.PayloadType})
277-
return
284+
return false
278285
}
279286

280287
forma.readRTPUDP(pkt)
288+
289+
return true
281290
}
282291

283-
func (cm *clientMedia) readRTCPUDPPlay(payload []byte) {
292+
func (cm *clientMedia) readRTCPUDPPlay(payload []byte) bool {
284293
now := cm.c.timeNow()
285294
plen := len(payload)
286295

287296
atomic.AddUint64(cm.c.BytesReceived, uint64(plen))
288297

289298
if plen == (udpMaxPayloadSize + 1) {
290299
cm.c.OnDecodeError(liberrors.ErrClientRTCPPacketTooBigUDP{})
291-
return
300+
return false
292301
}
293302

294303
packets, err := rtcp.Unmarshal(payload)
295304
if err != nil {
296305
cm.c.OnDecodeError(err)
297-
return
306+
return false
298307
}
299308

300309
for _, pkt := range packets {
@@ -307,28 +316,33 @@ func (cm *clientMedia) readRTCPUDPPlay(payload []byte) {
307316

308317
cm.onPacketRTCP(pkt)
309318
}
319+
320+
return true
310321
}
311322

312-
func (cm *clientMedia) readRTPUDPRecord(_ []byte) {
323+
func (cm *clientMedia) readRTPUDPRecord(_ []byte) bool {
324+
return false
313325
}
314326

315-
func (cm *clientMedia) readRTCPUDPRecord(payload []byte) {
327+
func (cm *clientMedia) readRTCPUDPRecord(payload []byte) bool {
316328
plen := len(payload)
317329

318330
atomic.AddUint64(cm.c.BytesReceived, uint64(plen))
319331

320332
if plen == (udpMaxPayloadSize + 1) {
321333
cm.c.OnDecodeError(liberrors.ErrClientRTCPPacketTooBigUDP{})
322-
return
334+
return false
323335
}
324336

325337
packets, err := rtcp.Unmarshal(payload)
326338
if err != nil {
327339
cm.c.OnDecodeError(err)
328-
return
340+
return false
329341
}
330342

331343
for _, pkt := range packets {
332344
cm.onPacketRTCP(pkt)
333345
}
346+
347+
return true
334348
}

client_udp_listener.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,15 @@ func (u *clientUDPListener) stop() {
142142
func (u *clientUDPListener) run() {
143143
defer close(u.done)
144144

145+
var buf []byte
146+
147+
createNewBuffer := func() {
148+
buf = make([]byte, udpMaxPayloadSize+1)
149+
}
150+
151+
createNewBuffer()
152+
145153
for {
146-
buf := make([]byte, udpMaxPayloadSize+1)
147154
n, addr, err := u.pc.ReadFrom(buf)
148155
if err != nil {
149156
return
@@ -166,7 +173,9 @@ func (u *clientUDPListener) run() {
166173
now := u.c.timeNow()
167174
atomic.StoreInt64(u.lastPacketTime, now.Unix())
168175

169-
u.readFunc(buf[:n])
176+
if u.readFunc(buf[:n]) {
177+
createNewBuffer()
178+
}
170179
}
171180
}
172181

server_session.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import (
2323
"github.com/bluenviron/gortsplib/v4/pkg/sdp"
2424
)
2525

26-
type readFunc func([]byte)
26+
type readFunc func([]byte) bool
2727

2828
func stringsReverseIndex(s, substr string) int {
2929
for i := len(s) - 1 - len(substr); i >= 0; i-- {

server_session_media.go

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -161,20 +161,20 @@ func (sm *serverSessionMedia) writePacketRTCP(payload []byte) error {
161161
return nil
162162
}
163163

164-
func (sm *serverSessionMedia) readRTCPUDPPlay(payload []byte) {
164+
func (sm *serverSessionMedia) readRTCPUDPPlay(payload []byte) bool {
165165
plen := len(payload)
166166

167167
atomic.AddUint64(sm.ss.bytesReceived, uint64(plen))
168168

169169
if plen == (udpMaxPayloadSize + 1) {
170170
sm.ss.onDecodeError(liberrors.ErrServerRTCPPacketTooBigUDP{})
171-
return
171+
return false
172172
}
173173

174174
packets, err := rtcp.Unmarshal(payload)
175175
if err != nil {
176176
sm.ss.onDecodeError(err)
177-
return
177+
return false
178178
}
179179

180180
now := sm.ss.s.timeNow()
@@ -183,51 +183,55 @@ func (sm *serverSessionMedia) readRTCPUDPPlay(payload []byte) {
183183
for _, pkt := range packets {
184184
sm.onPacketRTCP(pkt)
185185
}
186+
187+
return true
186188
}
187189

188-
func (sm *serverSessionMedia) readRTPUDPRecord(payload []byte) {
190+
func (sm *serverSessionMedia) readRTPUDPRecord(payload []byte) bool {
189191
plen := len(payload)
190192

191193
atomic.AddUint64(sm.ss.bytesReceived, uint64(plen))
192194

193195
if plen == (udpMaxPayloadSize + 1) {
194196
sm.ss.onDecodeError(liberrors.ErrServerRTPPacketTooBigUDP{})
195-
return
197+
return false
196198
}
197199

198200
pkt := &rtp.Packet{}
199201
err := pkt.Unmarshal(payload)
200202
if err != nil {
201203
sm.ss.onDecodeError(err)
202-
return
204+
return false
203205
}
204206

205207
forma, ok := sm.formats[pkt.PayloadType]
206208
if !ok {
207209
sm.ss.onDecodeError(liberrors.ErrServerRTPPacketUnknownPayloadType{PayloadType: pkt.PayloadType})
208-
return
210+
return false
209211
}
210212

211213
now := sm.ss.s.timeNow()
212214
atomic.StoreInt64(sm.ss.udpLastPacketTime, now.Unix())
213215

214216
forma.readRTPUDP(pkt, now)
217+
218+
return true
215219
}
216220

217-
func (sm *serverSessionMedia) readRTCPUDPRecord(payload []byte) {
221+
func (sm *serverSessionMedia) readRTCPUDPRecord(payload []byte) bool {
218222
plen := len(payload)
219223

220224
atomic.AddUint64(sm.ss.bytesReceived, uint64(plen))
221225

222226
if plen == (udpMaxPayloadSize + 1) {
223227
sm.ss.onDecodeError(liberrors.ErrServerRTCPPacketTooBigUDP{})
224-
return
228+
return false
225229
}
226230

227231
packets, err := rtcp.Unmarshal(payload)
228232
if err != nil {
229233
sm.ss.onDecodeError(err)
230-
return
234+
return false
231235
}
232236

233237
now := sm.ss.s.timeNow()
@@ -243,55 +247,62 @@ func (sm *serverSessionMedia) readRTCPUDPRecord(payload []byte) {
243247

244248
sm.onPacketRTCP(pkt)
245249
}
250+
251+
return true
246252
}
247253

248-
func (sm *serverSessionMedia) readRTPTCPPlay(_ []byte) {
254+
func (sm *serverSessionMedia) readRTPTCPPlay(_ []byte) bool {
255+
return false
249256
}
250257

251-
func (sm *serverSessionMedia) readRTCPTCPPlay(payload []byte) {
258+
func (sm *serverSessionMedia) readRTCPTCPPlay(payload []byte) bool {
252259
if len(payload) > udpMaxPayloadSize {
253260
sm.ss.onDecodeError(liberrors.ErrServerRTCPPacketTooBig{L: len(payload), Max: udpMaxPayloadSize})
254-
return
261+
return false
255262
}
256263

257264
packets, err := rtcp.Unmarshal(payload)
258265
if err != nil {
259266
sm.ss.onDecodeError(err)
260-
return
267+
return false
261268
}
262269

263270
for _, pkt := range packets {
264271
sm.onPacketRTCP(pkt)
265272
}
273+
274+
return true
266275
}
267276

268-
func (sm *serverSessionMedia) readRTPTCPRecord(payload []byte) {
277+
func (sm *serverSessionMedia) readRTPTCPRecord(payload []byte) bool {
269278
pkt := &rtp.Packet{}
270279
err := pkt.Unmarshal(payload)
271280
if err != nil {
272281
sm.ss.onDecodeError(err)
273-
return
282+
return false
274283
}
275284

276285
forma, ok := sm.formats[pkt.PayloadType]
277286
if !ok {
278287
sm.ss.onDecodeError(liberrors.ErrServerRTPPacketUnknownPayloadType{PayloadType: pkt.PayloadType})
279-
return
288+
return false
280289
}
281290

282291
forma.readRTPTCP(pkt)
292+
293+
return true
283294
}
284295

285-
func (sm *serverSessionMedia) readRTCPTCPRecord(payload []byte) {
296+
func (sm *serverSessionMedia) readRTCPTCPRecord(payload []byte) bool {
286297
if len(payload) > udpMaxPayloadSize {
287298
sm.ss.onDecodeError(liberrors.ErrServerRTCPPacketTooBig{L: len(payload), Max: udpMaxPayloadSize})
288-
return
299+
return false
289300
}
290301

291302
packets, err := rtcp.Unmarshal(payload)
292303
if err != nil {
293304
sm.ss.onDecodeError(err)
294-
return
305+
return false
295306
}
296307

297308
now := sm.ss.s.timeNow()
@@ -306,4 +317,6 @@ func (sm *serverSessionMedia) readRTCPTCPRecord(payload []byte) {
306317

307318
sm.onPacketRTCP(pkt)
308319
}
320+
321+
return true
309322
}

0 commit comments

Comments
 (0)