mirror of
				https://github.com/ossrs/srs.git
				synced 2025-03-09 15:49:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			57 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
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
 | 
						|
}
 |