mirror of
				https://github.com/aler9/gortsplib
				synced 2025-10-31 18:42:40 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			150 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package rtptime
 | |
| 
 | |
| import (
 | |
| 	"testing"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/pion/rtp"
 | |
| 	"github.com/stretchr/testify/require"
 | |
| )
 | |
| 
 | |
| func TestDecoderNegativeDiff(t *testing.T) {
 | |
| 	i := uint32(0)
 | |
| 	d := newGlobalDecoderTrackData(0, 90000, i)
 | |
| 
 | |
| 	i += 90000 * 2
 | |
| 	pts := d.decode(i)
 | |
| 	require.Equal(t, 2*time.Second, pts)
 | |
| 
 | |
| 	i -= 90000 * 1
 | |
| 	pts = d.decode(i)
 | |
| 	require.Equal(t, 1*time.Second, pts)
 | |
| 
 | |
| 	i += 90000 * 2
 | |
| 	pts = d.decode(i)
 | |
| 	require.Equal(t, 3*time.Second, pts)
 | |
| }
 | |
| 
 | |
| func TestDecoderOverflow(t *testing.T) {
 | |
| 	secs := time.Duration(0)
 | |
| 	i := uint32(0xFFFFFFFF - 90000 + 1)
 | |
| 	d := newGlobalDecoderTrackData(0, 90000, i)
 | |
| 
 | |
| 	const stride = 1500
 | |
| 	lim := uint32(uint64(0xFFFFFFFF + 1 - (stride * 90000)))
 | |
| 
 | |
| 	for n := 0; n < 100; n++ {
 | |
| 		// overflow
 | |
| 		i += 90000 * stride
 | |
| 		secs += stride
 | |
| 		pts := d.decode(i)
 | |
| 		require.Equal(t, secs*time.Second, pts)
 | |
| 
 | |
| 		// reach 2^32 slowly
 | |
| 		secs += stride
 | |
| 		i += 90000 * stride
 | |
| 		for ; i < lim; i += 90000 * stride {
 | |
| 			pts = d.decode(i)
 | |
| 			require.Equal(t, secs*time.Second, pts)
 | |
| 			secs += stride
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestDecoderOverflowAndBack(t *testing.T) {
 | |
| 	d := newGlobalDecoderTrackData(0, 90000, 0xFFFFFFFF-90000+1)
 | |
| 
 | |
| 	pts := d.decode(90000)
 | |
| 	require.Equal(t, 2*time.Second, pts)
 | |
| 
 | |
| 	pts = d.decode(0xFFFFFFFF - 90000 + 1)
 | |
| 	require.Equal(t, time.Duration(0), pts)
 | |
| 
 | |
| 	pts = d.decode(0xFFFFFFFF - 90000 + 1 - 90000)
 | |
| 	require.Equal(t, -1*time.Second, pts)
 | |
| 
 | |
| 	pts = d.decode(0xFFFFFFFF - 90000 + 1)
 | |
| 	require.Equal(t, time.Duration(0), pts)
 | |
| 
 | |
| 	pts = d.decode(90000)
 | |
| 	require.Equal(t, 2*time.Second, pts)
 | |
| }
 | |
| 
 | |
| func BenchmarkDecoder(b *testing.B) {
 | |
| 	for i := 0; i < b.N; i++ {
 | |
| 		func() {
 | |
| 			n := uint32(0)
 | |
| 			d := newGlobalDecoderTrackData(0, 90000, n)
 | |
| 			for j := 0; j < 200; j++ {
 | |
| 				if (j % 2) == 0 {
 | |
| 					n += 90000
 | |
| 				} else {
 | |
| 					n -= 45000
 | |
| 				}
 | |
| 				d.decode(n)
 | |
| 			}
 | |
| 		}()
 | |
| 	}
 | |
| }
 | |
| 
 | |
| type dummyTrack struct {
 | |
| 	clockRate    int
 | |
| 	ptsEqualsDTS bool
 | |
| }
 | |
| 
 | |
| func (t *dummyTrack) ClockRate() int {
 | |
| 	return t.clockRate
 | |
| }
 | |
| 
 | |
| func (t *dummyTrack) PTSEqualsDTS(*rtp.Packet) bool {
 | |
| 	return t.ptsEqualsDTS
 | |
| }
 | |
| 
 | |
| func TestGlobalDecoder(t *testing.T) {
 | |
| 	g := NewGlobalDecoder()
 | |
| 
 | |
| 	t1 := &dummyTrack{clockRate: 90000}
 | |
| 	t2 := &dummyTrack{clockRate: 48000, ptsEqualsDTS: true}
 | |
| 
 | |
| 	timeNow = func() time.Time {
 | |
| 		return time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
 | |
| 	}
 | |
| 
 | |
| 	_, ok := g.Decode(t1, &rtp.Packet{})
 | |
| 	require.Equal(t, false, ok)
 | |
| 
 | |
| 	t1.ptsEqualsDTS = true
 | |
| 	pts, ok := g.Decode(t1, &rtp.Packet{Header: rtp.Header{Timestamp: 22500}})
 | |
| 	require.Equal(t, true, ok)
 | |
| 	require.Equal(t, time.Duration(0), pts)
 | |
| 
 | |
| 	timeNow = func() time.Time {
 | |
| 		return time.Date(2008, 0o5, 20, 22, 15, 21, 0, time.UTC)
 | |
| 	}
 | |
| 
 | |
| 	pts, ok = g.Decode(t1, &rtp.Packet{Header: rtp.Header{Timestamp: 22500 + 90000}})
 | |
| 	require.Equal(t, true, ok)
 | |
| 	require.Equal(t, 1*time.Second, pts)
 | |
| 
 | |
| 	timeNow = func() time.Time {
 | |
| 		return time.Date(2008, 0o5, 20, 22, 15, 25, 0, time.UTC)
 | |
| 	}
 | |
| 
 | |
| 	pts, ok = g.Decode(t2, &rtp.Packet{Header: rtp.Header{Timestamp: 33100}})
 | |
| 	require.Equal(t, true, ok)
 | |
| 	require.Equal(t, 5*time.Second, pts)
 | |
| 
 | |
| 	pts, ok = g.Decode(t2, &rtp.Packet{Header: rtp.Header{Timestamp: 33100 + 48000}})
 | |
| 	require.Equal(t, true, ok)
 | |
| 	require.Equal(t, 6*time.Second, pts)
 | |
| }
 | |
| 
 | |
| func TestGlobalDecoderInvalidClockRate(t *testing.T) {
 | |
| 	g := NewGlobalDecoder()
 | |
| 
 | |
| 	tr := &dummyTrack{clockRate: 0, ptsEqualsDTS: true}
 | |
| 
 | |
| 	_, ok := g.Decode(tr, &rtp.Packet{Header: rtp.Header{Timestamp: 90000}})
 | |
| 	require.Equal(t, false, ok)
 | |
| }
 | 
