123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- package rtp
- import (
- "math"
- "sync"
- )
- // Sequencer generates sequential sequence numbers for building RTP packets
- type Sequencer interface {
- NextSequenceNumber() uint16
- RollOverCount() uint64
- }
- // NewRandomSequencer returns a new sequencer starting from a random sequence
- // number
- func NewRandomSequencer() Sequencer {
- return &sequencer{
- sequenceNumber: uint16(globalMathRandomGenerator.Intn(math.MaxUint16)),
- }
- }
- // NewFixedSequencer returns a new sequencer starting from a specific
- // sequence number
- func NewFixedSequencer(s uint16) Sequencer {
- return &sequencer{
- sequenceNumber: s - 1, // -1 because the first sequence number prepends 1
- }
- }
- type sequencer struct {
- sequenceNumber uint16
- rollOverCount uint64
- mutex sync.Mutex
- }
- // NextSequenceNumber increment and returns a new sequence number for
- // building RTP packets
- func (s *sequencer) NextSequenceNumber() uint16 {
- s.mutex.Lock()
- defer s.mutex.Unlock()
- s.sequenceNumber++
- if s.sequenceNumber == 0 {
- s.rollOverCount++
- }
- return s.sequenceNumber
- }
- // RollOverCount returns the amount of times the 16bit sequence number
- // has wrapped
- func (s *sequencer) RollOverCount() uint64 {
- s.mutex.Lock()
- defer s.mutex.Unlock()
- return s.rollOverCount
- }
|