package rtpbuffer
import (
"fmt"
)
const (
Uint16SizeHalf = 1 << 15
maxPayloadLen = 1460
)
type RTPBuffer struct {
packets []*RetainablePacket
size uint16
highestAdded uint16
started bool
}
func NewRTPBuffer (size uint16 ) (*RTPBuffer , error ) {
allowedSizes := make ([]uint16 , 0 )
correctSize := false
for i := 0 ; i < 16 ; i ++ {
if size == 1 <<i {
correctSize = true
break
}
allowedSizes = append (allowedSizes , 1 <<i )
}
if !correctSize {
return nil , fmt .Errorf ("%w: %d is not a valid size, allowed sizes: %v" , ErrInvalidSize , size , allowedSizes )
}
return &RTPBuffer {
packets : make ([]*RetainablePacket , size ),
size : size ,
}, nil
}
func (r *RTPBuffer ) Add (packet *RetainablePacket ) {
seq := packet .sequenceNumber
if !r .started {
r .packets [seq %r .size ] = packet
r .highestAdded = seq
r .started = true
return
}
diff := seq - r .highestAdded
if diff == 0 {
return
} else if diff < Uint16SizeHalf {
for i := r .highestAdded + 1 ; i != seq ; i ++ {
idx := i % r .size
prevPacket := r .packets [idx ]
if prevPacket != nil {
prevPacket .Release ()
}
r .packets [idx ] = nil
}
r .highestAdded = seq
}
idx := seq % r .size
prevPacket := r .packets [idx ]
if prevPacket != nil {
prevPacket .Release ()
}
r .packets [idx ] = packet
}
func (r *RTPBuffer ) Get (seq uint16 ) *RetainablePacket {
diff := r .highestAdded - seq
if diff >= Uint16SizeHalf {
return nil
}
if diff >= r .size {
return nil
}
pkt := r .packets [seq %r .size ]
if pkt != nil {
if pkt .sequenceNumber != seq {
return nil
}
if err := pkt .Retain (); err != nil {
return nil
}
}
return pkt
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .