sequencer.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly>
  2. // SPDX-License-Identifier: MIT
  3. package rtp
  4. import (
  5. "math"
  6. "sync"
  7. )
  8. // Sequencer generates sequential sequence numbers for building RTP packets
  9. type Sequencer interface {
  10. NextSequenceNumber() uint16
  11. RollOverCount() uint64
  12. }
  13. // NewRandomSequencer returns a new sequencer starting from a random sequence
  14. // number
  15. func NewRandomSequencer() Sequencer {
  16. return &sequencer{
  17. sequenceNumber: uint16(globalMathRandomGenerator.Intn(math.MaxUint16)),
  18. }
  19. }
  20. // NewFixedSequencer returns a new sequencer starting from a specific
  21. // sequence number
  22. func NewFixedSequencer(s uint16) Sequencer {
  23. return &sequencer{
  24. sequenceNumber: s - 1, // -1 because the first sequence number prepends 1
  25. }
  26. }
  27. type sequencer struct {
  28. sequenceNumber uint16
  29. rollOverCount uint64
  30. mutex sync.Mutex
  31. }
  32. // NextSequenceNumber increment and returns a new sequence number for
  33. // building RTP packets
  34. func (s *sequencer) NextSequenceNumber() uint16 {
  35. s.mutex.Lock()
  36. defer s.mutex.Unlock()
  37. s.sequenceNumber++
  38. if s.sequenceNumber == 0 {
  39. s.rollOverCount++
  40. }
  41. return s.sequenceNumber
  42. }
  43. // RollOverCount returns the amount of times the 16bit sequence number
  44. // has wrapped
  45. func (s *sequencer) RollOverCount() uint64 {
  46. s.mutex.Lock()
  47. defer s.mutex.Unlock()
  48. return s.rollOverCount
  49. }