Go-based FM stereo transmitter with RDS, Windows-first and cross-platform
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

59 linhas
1.2KB

  1. package aoiprxkit
  2. type jitterBuffer struct {
  3. started bool
  4. expected uint16
  5. maxDepth int
  6. packets map[uint16]RTPPacket
  7. }
  8. func newJitterBuffer(maxDepth int) *jitterBuffer {
  9. return &jitterBuffer{maxDepth: maxDepth, packets: make(map[uint16]RTPPacket)}
  10. }
  11. func (j *jitterBuffer) push(pkt RTPPacket) (ready []RTPPacket, lateDrop bool, gapLoss uint64, reorder bool) {
  12. if !j.started {
  13. j.started = true
  14. j.expected = pkt.SequenceNumber
  15. }
  16. if seqDistance(pkt.SequenceNumber, j.expected) < 0 {
  17. return nil, true, 0, false
  18. }
  19. if _, exists := j.packets[pkt.SequenceNumber]; !exists {
  20. j.packets[pkt.SequenceNumber] = pkt
  21. if pkt.SequenceNumber != j.expected {
  22. reorder = true
  23. }
  24. }
  25. for {
  26. pkt, ok := j.packets[j.expected]
  27. if !ok {
  28. break
  29. }
  30. ready = append(ready, pkt)
  31. delete(j.packets, j.expected)
  32. j.expected++
  33. }
  34. for len(j.packets) > j.maxDepth {
  35. if _, ok := j.packets[j.expected]; ok {
  36. break
  37. }
  38. j.expected++
  39. gapLoss++
  40. for {
  41. pkt, ok := j.packets[j.expected]
  42. if !ok {
  43. break
  44. }
  45. ready = append(ready, pkt)
  46. delete(j.packets, j.expected)
  47. j.expected++
  48. }
  49. }
  50. return ready, false, gapLoss, reorder
  51. }
  52. func seqDistance(a, b uint16) int {
  53. return int(int16(a - b))
  54. }