|
- package aoiprxkit
-
- type jitterBuffer struct {
- started bool
- expected uint16
- maxDepth int
- packets map[uint16]RTPPacket
- }
-
- func newJitterBuffer(maxDepth int) *jitterBuffer {
- return &jitterBuffer{maxDepth: maxDepth, packets: make(map[uint16]RTPPacket)}
- }
-
- func (j *jitterBuffer) push(pkt RTPPacket) (ready []RTPPacket, lateDrop bool, gapLoss uint64, reorder bool) {
- if !j.started {
- j.started = true
- j.expected = pkt.SequenceNumber
- }
- if seqDistance(pkt.SequenceNumber, j.expected) < 0 {
- return nil, true, 0, false
- }
- if _, exists := j.packets[pkt.SequenceNumber]; !exists {
- j.packets[pkt.SequenceNumber] = pkt
- if pkt.SequenceNumber != j.expected {
- reorder = true
- }
- }
- for {
- pkt, ok := j.packets[j.expected]
- if !ok {
- break
- }
- ready = append(ready, pkt)
- delete(j.packets, j.expected)
- j.expected++
- }
- for len(j.packets) > j.maxDepth {
- if _, ok := j.packets[j.expected]; ok {
- break
- }
- j.expected++
- gapLoss++
- for {
- pkt, ok := j.packets[j.expected]
- if !ok {
- break
- }
- ready = append(ready, pkt)
- delete(j.packets, j.expected)
- j.expected++
- }
- }
- return ready, false, gapLoss, reorder
- }
-
- func seqDistance(a, b uint16) int {
- return int(int16(a - b))
- }
|