8
8
"math"
9
9
"time"
10
10
11
- "github.com/pion/interceptor/pkg/jitterbuffer"
12
11
"github.com/pion/rtp"
13
12
"github.com/pion/webrtc/v4/pkg/media"
14
13
)
@@ -17,7 +16,7 @@ import (
17
16
type SampleBuilder struct {
18
17
maxLate uint16 // how many packets to wait until we get a valid Sample
19
18
maxLateTimestamp uint32 // max timestamp between old and new timestamps before dropping packets
20
- buffer * jitterbuffer. JitterBuffer
19
+ buffer [ math . MaxUint16 + 1 ] * rtp. Packet
21
20
preparedSamples [math .MaxUint16 + 1 ]* media.Sample
22
21
23
22
// Interface that allows us to take RTP packets to samples
@@ -61,7 +60,7 @@ type SampleBuilder struct {
61
60
// The depacketizer extracts media samples from RTP packets.
62
61
// Several depacketizers are available in package github.com/pion/rtp/codecs.
63
62
func New (maxLate uint16 , depacketizer rtp.Depacketizer , sampleRate uint32 , opts ... Option ) * SampleBuilder {
64
- s := & SampleBuilder {maxLate : maxLate , depacketizer : depacketizer , sampleRate : sampleRate , buffer : jitterbuffer . New ( jitterbuffer . WithMinimumPacketCount ( 1 )) }
63
+ s := & SampleBuilder {maxLate : maxLate , depacketizer : depacketizer , sampleRate : sampleRate }
65
64
for _ , o := range opts {
66
65
o (s )
67
66
}
@@ -77,7 +76,7 @@ func (s *SampleBuilder) tooOld(location sampleSequenceLocation) bool {
77
76
var foundTail * rtp.Packet
78
77
79
78
for i := location .head ; i != location .tail ; i ++ {
80
- if packet , _ := s .buffer . PeekAtSequence ( i ) ; packet != nil {
79
+ if packet := s .buffer [ i ] ; packet != nil {
81
80
foundHead = packet
82
81
break
83
82
}
@@ -88,7 +87,7 @@ func (s *SampleBuilder) tooOld(location sampleSequenceLocation) bool {
88
87
}
89
88
90
89
for i := location .tail - 1 ; i != location .head ; i -- {
91
- if packet , _ := s .buffer . PeekAtSequence ( i ) ; packet != nil {
90
+ if packet := s .buffer [ i ] ; packet != nil {
92
91
foundTail = packet
93
92
break
94
93
}
@@ -106,16 +105,16 @@ func (s *SampleBuilder) fetchTimestamp(location sampleSequenceLocation) (timesta
106
105
if location .empty () {
107
106
return 0 , false
108
107
}
109
- packet , err := s .buffer . PeekAtSequence ( location .head )
110
- if packet == nil || err != nil {
108
+ packet := s .buffer [ location .head ]
109
+ if packet == nil {
111
110
return 0 , false
112
111
}
113
112
return packet .Timestamp , true
114
113
}
115
114
116
115
func (s * SampleBuilder ) releasePacket (i uint16 ) {
117
116
var p * rtp.Packet
118
- p , _ = s .buffer . PopAtSequence ( i )
117
+ p , s . buffer [ i ] = s .buffer [ i ], nil
119
118
if p != nil && s .packetReleaseHandler != nil {
120
119
s .packetReleaseHandler (p )
121
120
}
@@ -179,7 +178,7 @@ func (s *SampleBuilder) purgeBuffers(flush bool) {
179
178
// Push does not copy the input. If you wish to reuse
180
179
// this memory make sure to copy before calling Push
181
180
func (s * SampleBuilder ) Push (p * rtp.Packet ) {
182
- s .buffer . Push ( p )
181
+ s .buffer [ p . SequenceNumber ] = p
183
182
184
183
switch s .filled .compare (p .SequenceNumber ) {
185
184
case slCompareVoid :
@@ -221,19 +220,14 @@ func (s *SampleBuilder) buildSample(purgingBuffers bool) *media.Sample {
221
220
222
221
var consume sampleSequenceLocation
223
222
224
- for i := s .active .head ; s .active .compare (i ) != slCompareAfter ; i ++ {
225
- pkt , err := s .buffer .PeekAtSequence (i )
226
- if pkt == nil || err != nil {
227
- break
228
- }
229
-
230
- if s .depacketizer .IsPartitionTail (pkt .Marker , pkt .Payload ) {
223
+ for i := s .active .head ; s .buffer [i ] != nil && s .active .compare (i ) != slCompareAfter ; i ++ {
224
+ if s .depacketizer .IsPartitionTail (s .buffer [i ].Marker , s .buffer [i ].Payload ) {
231
225
consume .head = s .active .head
232
226
consume .tail = i + 1
233
227
break
234
228
}
235
229
headTimestamp , hasData := s .fetchTimestamp (s .active )
236
- if hasData && pkt .Timestamp != headTimestamp {
230
+ if hasData && s . buffer [ i ] .Timestamp != headTimestamp {
237
231
consume .head = s .active .head
238
232
consume .tail = i
239
233
break
@@ -243,8 +237,8 @@ func (s *SampleBuilder) buildSample(purgingBuffers bool) *media.Sample {
243
237
if consume .empty () {
244
238
return nil
245
239
}
246
- pkt , _ := s . buffer . PeekAtSequence ( consume . tail )
247
- if ! purgingBuffers && pkt == nil {
240
+
241
+ if ! purgingBuffers && s . buffer [ consume . tail ] == nil {
248
242
// wait for the next packet after this set of packets to arrive
249
243
// to ensure at least one post sample timestamp is known
250
244
// (unless we have to release right now)
@@ -256,10 +250,8 @@ func (s *SampleBuilder) buildSample(purgingBuffers bool) *media.Sample {
256
250
257
251
// scan for any packet after the current and use that time stamp as the diff point
258
252
for i := consume .tail ; i < s .active .tail ; i ++ {
259
- pkt , _ = s .buffer .PeekAtSequence (i )
260
-
261
- if pkt != nil {
262
- afterTimestamp = pkt .Timestamp
253
+ if s .buffer [i ] != nil {
254
+ afterTimestamp = s .buffer [i ].Timestamp
263
255
break
264
256
}
265
257
}
@@ -269,11 +261,10 @@ func (s *SampleBuilder) buildSample(purgingBuffers bool) *media.Sample {
269
261
270
262
// prior to decoding all the packets, check if this packet
271
263
// would end being disposed anyway
272
- pkt , err := s .buffer .PeekAtSequence (consume .head )
273
- if err == nil && ! s .depacketizer .IsPartitionHead (pkt .Payload ) {
264
+ if ! s .depacketizer .IsPartitionHead (s .buffer [consume .head ].Payload ) {
274
265
isPadding := false
275
266
for i := consume .head ; i != consume .tail ; i ++ {
276
- if s .lastSampleTimestamp != nil && * s .lastSampleTimestamp == pkt . Timestamp && len (pkt .Payload ) == 0 {
267
+ if s .lastSampleTimestamp != nil && * s .lastSampleTimestamp == s . buffer [ i ]. Timestamp && len (s . buffer [ i ] .Payload ) == 0 {
277
268
isPadding = true
278
269
}
279
270
}
@@ -291,22 +282,16 @@ func (s *SampleBuilder) buildSample(purgingBuffers bool) *media.Sample {
291
282
var metadata interface {}
292
283
var rtpHeaders []* rtp.Header
293
284
for i := consume .head ; i != consume .tail ; i ++ {
294
- pkt , err := s .buffer .PeekAtSequence (i )
295
- if err != nil {
296
- return nil
297
- }
298
- p , err := s .depacketizer .Unmarshal (pkt .Payload )
285
+ p , err := s .depacketizer .Unmarshal (s .buffer [i ].Payload )
299
286
if err != nil {
300
287
return nil
301
288
}
302
289
if i == consume .head && s .packetHeadHandler != nil {
303
290
metadata = s .packetHeadHandler (s .depacketizer )
304
291
}
305
292
if s .returnRTPHeaders {
306
- if packet , _ := s .buffer .PeekAtSequence (i ); packet != nil {
307
- h := pkt .Header .Clone ()
308
- rtpHeaders = append (rtpHeaders , & h )
309
- }
293
+ h := s .buffer [i ].Header .Clone ()
294
+ rtpHeaders = append (rtpHeaders , & h )
310
295
}
311
296
312
297
data = append (data , p ... )
@@ -404,11 +389,3 @@ func WithRTPHeaders(enable bool) Option {
404
389
o .returnRTPHeaders = enable
405
390
}
406
391
}
407
-
408
- // WithJitterBufferMinimumLength sets the minimum number of packets which must first
409
- // be received before starting any playback
410
- func WithJitterBufferMinimumLength (length uint16 ) Option {
411
- return func (o * SampleBuilder ) {
412
- o .buffer = jitterbuffer .New (jitterbuffer .WithMinimumPacketCount (length ))
413
- }
414
- }
0 commit comments