@@ -25,6 +25,11 @@ import (
2525 "github.com/livekit/protocol/logger"
2626)
2727
28+ type ExtPacket struct {
29+ ReceivedAt time.Time
30+ * rtp.Packet
31+ }
32+
2833type Buffer struct {
2934 depacketizer rtp.Depacketizer
3035 latency time.Duration
@@ -58,7 +63,7 @@ type BufferStats struct {
5863 SamplesPopped uint64 // samples sent to handler
5964}
6065
61- type PacketFunc func (packets []* rtp. Packet )
66+ type PacketFunc func (packets []ExtPacket )
6267
6368func NewBuffer (
6469 depacketizer rtp.Depacketizer ,
@@ -117,7 +122,7 @@ func (b *Buffer) UpdateLatency(latency time.Duration) {
117122
118123 b .latency = latency
119124 if b .head != nil {
120- b .timer .Reset (time .Until (b .head .received .Add (latency )))
125+ b .timer .Reset (time .Until (b .head .extPacket . ReceivedAt .Add (latency )))
121126 }
122127}
123128
@@ -199,10 +204,10 @@ func (b *Buffer) push(pkt *rtp.Packet) {
199204 return
200205 }
201206
202- beforeHead := before (pkt .SequenceNumber , b .head .packet .SequenceNumber )
203- afterTail := ! before (pkt .SequenceNumber , b .tail .packet .SequenceNumber )
204- withinHeadRange := withinRange (pkt .SequenceNumber , b .head .packet .SequenceNumber )
205- withinTailRange := withinRange (pkt .SequenceNumber , b .tail .packet .SequenceNumber )
207+ beforeHead := before (pkt .SequenceNumber , b .head .extPacket .SequenceNumber )
208+ afterTail := ! before (pkt .SequenceNumber , b .tail .extPacket .SequenceNumber )
209+ withinHeadRange := withinRange (pkt .SequenceNumber , b .head .extPacket .SequenceNumber )
210+ withinTailRange := withinRange (pkt .SequenceNumber , b .tail .extPacket .SequenceNumber )
206211
207212 switch {
208213 case beforeHead && withinHeadRange :
@@ -221,8 +226,8 @@ func (b *Buffer) push(pkt *rtp.Packet) {
221226 case withinTailRange :
222227 // insert, search from tail
223228 for c := b .tail .prev ; c != nil ; c = c .prev {
224- discont = ! withinRange (pkt .SequenceNumber , c .packet .SequenceNumber )
225- if ! before (pkt .SequenceNumber , c .packet .SequenceNumber ) || discont {
229+ discont = ! withinRange (pkt .SequenceNumber , c .extPacket .SequenceNumber )
230+ if ! before (pkt .SequenceNumber , c .extPacket .SequenceNumber ) || discont {
226231 // insert after c
227232 p .discont = discont && p .start
228233 p .prev = c
@@ -236,8 +241,8 @@ func (b *Buffer) push(pkt *rtp.Packet) {
236241 case withinHeadRange :
237242 // insert, search from head
238243 for c := b .head .next ; c != nil ; c = c .next {
239- discont = ! withinRange (pkt .SequenceNumber , c .packet .SequenceNumber )
240- if before (pkt .SequenceNumber , c .packet .SequenceNumber ) || discont {
244+ discont = ! withinRange (pkt .SequenceNumber , c .extPacket .SequenceNumber )
245+ if before (pkt .SequenceNumber , c .extPacket .SequenceNumber ) || discont {
241246 // insert before c
242247 p .prev = c .prev
243248 p .next = c
@@ -266,12 +271,12 @@ func (b *Buffer) popReady() {
266271 for b .head != nil &&
267272 b .head .isComplete () {
268273
269- if b .head .packet .SequenceNumber == b .prevSN + 1 || b .head .discont || ! b .initialized {
274+ if b .head .extPacket .SequenceNumber == b .prevSN + 1 || b .head .discont || ! b .initialized {
270275 // normal
271- } else if b .head .received .Before (expiry ) {
276+ } else if b .head .extPacket . ReceivedAt .Before (expiry ) {
272277 // max latency reached
273278 loss = true
274- b .stats .PacketsLost += uint64 (b .head .packet .SequenceNumber - b .prevSN - 1 )
279+ b .stats .PacketsLost += uint64 (b .head .extPacket .SequenceNumber - b .prevSN - 1 )
275280 } else {
276281 break
277282 }
@@ -286,17 +291,17 @@ func (b *Buffer) popReady() {
286291 }
287292
288293 if b .head != nil {
289- b .timer .Reset (time .Until (b .head .received .Add (b .latency )))
294+ b .timer .Reset (time .Until (b .head .extPacket . ReceivedAt .Add (b .latency )))
290295 }
291296}
292297
293298// dropIncompleteExpired drops incomplete expired packets
294299func (b * Buffer ) dropIncompleteExpired (expiry time.Time ) {
295300 dropped := false
296301
297- for b .head != nil && ! b .head .isComplete () && b .head .received .Before (expiry ) {
302+ for b .head != nil && ! b .head .isComplete () && b .head .extPacket . ReceivedAt .Before (expiry ) {
298303 if b .initialized && ! b .head .discont {
299- b .stats .PacketsLost += uint64 (b .head .packet .SequenceNumber - b .prevSN - 1 )
304+ b .stats .PacketsLost += uint64 (b .head .extPacket .SequenceNumber - b .prevSN - 1 )
300305 }
301306
302307 b .free (b .popHead ())
@@ -310,15 +315,15 @@ func (b *Buffer) dropIncompleteExpired(expiry time.Time) {
310315 }
311316}
312317
313- func (b * Buffer ) popSample () []* rtp. Packet {
314- sample := make ([]* rtp. Packet , 0 , b .size )
318+ func (b * Buffer ) popSample () []ExtPacket {
319+ sample := make ([]ExtPacket , 0 , b .size )
315320 end := false
316321 for ! end {
317322 c := b .popHead ()
318323 end = c .end
319324
320- if ! c .packet .Padding {
321- sample = append (sample , c .packet )
325+ if ! c .extPacket .Padding {
326+ sample = append (sample , c .extPacket )
322327 }
323328
324329 b .stats .PacketsPopped ++
@@ -333,7 +338,7 @@ func (b *Buffer) popSample() []*rtp.Packet {
333338
334339func (b * Buffer ) popHead () * packet {
335340 c := b .head
336- b .prevSN = c .packet .SequenceNumber
341+ b .prevSN = c .extPacket .SequenceNumber
337342 b .head = c .next
338343 if b .head == nil {
339344 b .tail = nil
0 commit comments