mirror of
				https://github.com/aler9/gortsplib
				synced 2025-10-31 10:36:26 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			407 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			407 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package rtcpreceiver
 | |
| 
 | |
| import (
 | |
| 	"testing"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/pion/rtcp"
 | |
| 	"github.com/pion/rtp"
 | |
| 	"github.com/stretchr/testify/require"
 | |
| )
 | |
| 
 | |
| func TestRTCPReceiverBase(t *testing.T) {
 | |
| 	now = func() time.Time {
 | |
| 		return time.Date(2008, 0o5, 20, 22, 15, 22, 0, time.UTC)
 | |
| 	}
 | |
| 	done := make(chan struct{})
 | |
| 	v := uint32(0x65f83afb)
 | |
| 
 | |
| 	rr := New(500*time.Millisecond, &v, 90000,
 | |
| 		func(pkt rtcp.Packet) {
 | |
| 			require.Equal(t, &rtcp.ReceiverReport{
 | |
| 				SSRC: 0x65f83afb,
 | |
| 				Reports: []rtcp.ReceptionReport{
 | |
| 					{
 | |
| 						SSRC:               0xba9da416,
 | |
| 						LastSequenceNumber: 947,
 | |
| 						LastSenderReport:   0x887a17ce,
 | |
| 						Delay:              2 * 65536,
 | |
| 					},
 | |
| 				},
 | |
| 			}, pkt)
 | |
| 			close(done)
 | |
| 		})
 | |
| 	defer rr.Close()
 | |
| 
 | |
| 	srPkt := rtcp.SenderReport{
 | |
| 		SSRC:        0xba9da416,
 | |
| 		NTPTime:     0xe363887a17ced916,
 | |
| 		RTPTime:     0xafb45733,
 | |
| 		PacketCount: 714,
 | |
| 		OctetCount:  859127,
 | |
| 	}
 | |
| 	ts := time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
 | |
| 	rr.ProcessPacketRTCP(ts, &srPkt)
 | |
| 
 | |
| 	rtpPkt := rtp.Packet{
 | |
| 		Header: rtp.Header{
 | |
| 			Version:        2,
 | |
| 			Marker:         true,
 | |
| 			PayloadType:    96,
 | |
| 			SequenceNumber: 946,
 | |
| 			Timestamp:      0xafb45733,
 | |
| 			SSRC:           0xba9da416,
 | |
| 		},
 | |
| 		Payload: []byte("\x00\x00"),
 | |
| 	}
 | |
| 	ts = time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
 | |
| 	rr.ProcessPacketRTP(ts, &rtpPkt)
 | |
| 
 | |
| 	rtpPkt = rtp.Packet{
 | |
| 		Header: rtp.Header{
 | |
| 			Version:        2,
 | |
| 			Marker:         true,
 | |
| 			PayloadType:    96,
 | |
| 			SequenceNumber: 947,
 | |
| 			Timestamp:      0xafb45733 + 90000,
 | |
| 			SSRC:           0xba9da416,
 | |
| 		},
 | |
| 		Payload: []byte("\x00\x00"),
 | |
| 	}
 | |
| 	ts = time.Date(2008, 0o5, 20, 22, 15, 21, 0, time.UTC)
 | |
| 	rr.ProcessPacketRTP(ts, &rtpPkt)
 | |
| 
 | |
| 	<-done
 | |
| }
 | |
| 
 | |
| func TestRTCPReceiverOverflow(t *testing.T) {
 | |
| 	done := make(chan struct{})
 | |
| 	now = func() time.Time {
 | |
| 		return time.Date(2008, 0o5, 20, 22, 15, 21, 0, time.UTC)
 | |
| 	}
 | |
| 	v := uint32(0x65f83afb)
 | |
| 
 | |
| 	rr := New(500*time.Millisecond, &v, 90000, func(pkt rtcp.Packet) {
 | |
| 		require.Equal(t, &rtcp.ReceiverReport{
 | |
| 			SSRC: 0x65f83afb,
 | |
| 			Reports: []rtcp.ReceptionReport{
 | |
| 				{
 | |
| 					SSRC:               0xba9da416,
 | |
| 					LastSequenceNumber: 1<<16 | 0x0000,
 | |
| 					LastSenderReport:   0x887a17ce,
 | |
| 					Delay:              1 * 65536,
 | |
| 				},
 | |
| 			},
 | |
| 		}, pkt)
 | |
| 		close(done)
 | |
| 	})
 | |
| 	defer rr.Close()
 | |
| 
 | |
| 	srPkt := rtcp.SenderReport{
 | |
| 		SSRC:        0xba9da416,
 | |
| 		NTPTime:     0xe363887a17ced916,
 | |
| 		RTPTime:     1287981738,
 | |
| 		PacketCount: 714,
 | |
| 		OctetCount:  859127,
 | |
| 	}
 | |
| 	ts := time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
 | |
| 	rr.ProcessPacketRTCP(ts, &srPkt)
 | |
| 
 | |
| 	rtpPkt := rtp.Packet{
 | |
| 		Header: rtp.Header{
 | |
| 			Version:        2,
 | |
| 			Marker:         true,
 | |
| 			PayloadType:    96,
 | |
| 			SequenceNumber: 0xffff,
 | |
| 			Timestamp:      0xafb45733,
 | |
| 			SSRC:           0xba9da416,
 | |
| 		},
 | |
| 		Payload: []byte("\x00\x00"),
 | |
| 	}
 | |
| 	ts = time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
 | |
| 	rr.ProcessPacketRTP(ts, &rtpPkt)
 | |
| 
 | |
| 	rtpPkt = rtp.Packet{
 | |
| 		Header: rtp.Header{
 | |
| 			Version:        2,
 | |
| 			Marker:         true,
 | |
| 			PayloadType:    96,
 | |
| 			SequenceNumber: 0x0000,
 | |
| 			Timestamp:      0xafb45733,
 | |
| 			SSRC:           0xba9da416,
 | |
| 		},
 | |
| 		Payload: []byte("\x00\x00"),
 | |
| 	}
 | |
| 	ts = time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
 | |
| 	rr.ProcessPacketRTP(ts, &rtpPkt)
 | |
| 
 | |
| 	<-done
 | |
| }
 | |
| 
 | |
| func TestRTCPReceiverPacketLost(t *testing.T) {
 | |
| 	done := make(chan struct{})
 | |
| 	now = func() time.Time {
 | |
| 		return time.Date(2008, 0o5, 20, 22, 15, 21, 0, time.UTC)
 | |
| 	}
 | |
| 	v := uint32(0x65f83afb)
 | |
| 
 | |
| 	rr := New(500*time.Millisecond, &v, 90000, func(pkt rtcp.Packet) {
 | |
| 		require.Equal(t, &rtcp.ReceiverReport{
 | |
| 			SSRC: 0x65f83afb,
 | |
| 			Reports: []rtcp.ReceptionReport{
 | |
| 				{
 | |
| 					SSRC:               0xba9da416,
 | |
| 					LastSequenceNumber: 0x0122,
 | |
| 					LastSenderReport:   0x887a17ce,
 | |
| 					FractionLost: func() uint8 {
 | |
| 						v := float64(1) / 3
 | |
| 						return uint8(v * 256)
 | |
| 					}(),
 | |
| 					TotalLost: 1,
 | |
| 					Delay:     1 * 65536,
 | |
| 				},
 | |
| 			},
 | |
| 		}, pkt)
 | |
| 		close(done)
 | |
| 	})
 | |
| 	defer rr.Close()
 | |
| 
 | |
| 	srPkt := rtcp.SenderReport{
 | |
| 		SSRC:        0xba9da416,
 | |
| 		NTPTime:     0xe363887a17ced916,
 | |
| 		RTPTime:     1287981738,
 | |
| 		PacketCount: 714,
 | |
| 		OctetCount:  859127,
 | |
| 	}
 | |
| 	ts := time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
 | |
| 	rr.ProcessPacketRTCP(ts, &srPkt)
 | |
| 
 | |
| 	rtpPkt := rtp.Packet{
 | |
| 		Header: rtp.Header{
 | |
| 			Version:        2,
 | |
| 			Marker:         true,
 | |
| 			PayloadType:    96,
 | |
| 			SequenceNumber: 0x0120,
 | |
| 			Timestamp:      0xafb45733,
 | |
| 			SSRC:           0xba9da416,
 | |
| 		},
 | |
| 		Payload: []byte("\x00\x00"),
 | |
| 	}
 | |
| 	ts = time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
 | |
| 	rr.ProcessPacketRTP(ts, &rtpPkt)
 | |
| 
 | |
| 	rtpPkt = rtp.Packet{
 | |
| 		Header: rtp.Header{
 | |
| 			Version:        2,
 | |
| 			Marker:         true,
 | |
| 			PayloadType:    96,
 | |
| 			SequenceNumber: 0x0122,
 | |
| 			Timestamp:      0xafb45733,
 | |
| 			SSRC:           0xba9da416,
 | |
| 		},
 | |
| 		Payload: []byte("\x00\x00"),
 | |
| 	}
 | |
| 	ts = time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
 | |
| 	rr.ProcessPacketRTP(ts, &rtpPkt)
 | |
| 
 | |
| 	<-done
 | |
| }
 | |
| 
 | |
| func TestRTCPReceiverOverflowPacketLost(t *testing.T) {
 | |
| 	done := make(chan struct{})
 | |
| 	now = func() time.Time {
 | |
| 		return time.Date(2008, 0o5, 20, 22, 15, 21, 0, time.UTC)
 | |
| 	}
 | |
| 	v := uint32(0x65f83afb)
 | |
| 
 | |
| 	rr := New(500*time.Millisecond, &v, 90000, func(pkt rtcp.Packet) {
 | |
| 		require.Equal(t, &rtcp.ReceiverReport{
 | |
| 			SSRC: 0x65f83afb,
 | |
| 			Reports: []rtcp.ReceptionReport{
 | |
| 				{
 | |
| 					SSRC:               0xba9da416,
 | |
| 					LastSequenceNumber: 1<<16 | 0x0002,
 | |
| 					LastSenderReport:   0x887a17ce,
 | |
| 					FractionLost: func() uint8 {
 | |
| 						v := float64(2) / 4
 | |
| 						return uint8(v * 256)
 | |
| 					}(),
 | |
| 					TotalLost: 2,
 | |
| 					Delay:     1 * 65536,
 | |
| 				},
 | |
| 			},
 | |
| 		}, pkt)
 | |
| 		close(done)
 | |
| 	})
 | |
| 	defer rr.Close()
 | |
| 
 | |
| 	srPkt := rtcp.SenderReport{
 | |
| 		SSRC:        0xba9da416,
 | |
| 		NTPTime:     0xe363887a17ced916,
 | |
| 		RTPTime:     1287981738,
 | |
| 		PacketCount: 714,
 | |
| 		OctetCount:  859127,
 | |
| 	}
 | |
| 	ts := time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
 | |
| 	rr.ProcessPacketRTCP(ts, &srPkt)
 | |
| 
 | |
| 	rtpPkt := rtp.Packet{
 | |
| 		Header: rtp.Header{
 | |
| 			Version:        2,
 | |
| 			Marker:         true,
 | |
| 			PayloadType:    96,
 | |
| 			SequenceNumber: 0xffff,
 | |
| 			Timestamp:      0xafb45733,
 | |
| 			SSRC:           0xba9da416,
 | |
| 		},
 | |
| 		Payload: []byte("\x00\x00"),
 | |
| 	}
 | |
| 	ts = time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
 | |
| 	rr.ProcessPacketRTP(ts, &rtpPkt)
 | |
| 
 | |
| 	rtpPkt = rtp.Packet{
 | |
| 		Header: rtp.Header{
 | |
| 			Version:        2,
 | |
| 			Marker:         true,
 | |
| 			PayloadType:    96,
 | |
| 			SequenceNumber: 0x0002,
 | |
| 			Timestamp:      0xafb45733,
 | |
| 			SSRC:           0xba9da416,
 | |
| 		},
 | |
| 		Payload: []byte("\x00\x00"),
 | |
| 	}
 | |
| 	ts = time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
 | |
| 	rr.ProcessPacketRTP(ts, &rtpPkt)
 | |
| 
 | |
| 	<-done
 | |
| }
 | |
| 
 | |
| func TestRTCPReceiverReorderedPackets(t *testing.T) {
 | |
| 	done := make(chan struct{})
 | |
| 	now = func() time.Time {
 | |
| 		return time.Date(2008, 0o5, 20, 22, 15, 21, 0, time.UTC)
 | |
| 	}
 | |
| 	v := uint32(0x65f83afb)
 | |
| 
 | |
| 	rr := New(500*time.Millisecond, &v, 90000, func(pkt rtcp.Packet) {
 | |
| 		require.Equal(t, &rtcp.ReceiverReport{
 | |
| 			SSRC: 0x65f83afb,
 | |
| 			Reports: []rtcp.ReceptionReport{
 | |
| 				{
 | |
| 					SSRC:               0xba9da416,
 | |
| 					LastSequenceNumber: 0x43a7,
 | |
| 					LastSenderReport:   0x887a17ce,
 | |
| 					Delay:              1 * 65536,
 | |
| 				},
 | |
| 			},
 | |
| 		}, pkt)
 | |
| 		close(done)
 | |
| 	})
 | |
| 	defer rr.Close()
 | |
| 
 | |
| 	srPkt := rtcp.SenderReport{
 | |
| 		SSRC:        0xba9da416,
 | |
| 		NTPTime:     0xe363887a17ced916,
 | |
| 		RTPTime:     1287981738,
 | |
| 		PacketCount: 714,
 | |
| 		OctetCount:  859127,
 | |
| 	}
 | |
| 	ts := time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
 | |
| 	rr.ProcessPacketRTCP(ts, &srPkt)
 | |
| 
 | |
| 	rtpPkt := rtp.Packet{
 | |
| 		Header: rtp.Header{
 | |
| 			Version:        2,
 | |
| 			Marker:         true,
 | |
| 			PayloadType:    96,
 | |
| 			SequenceNumber: 0x43a7,
 | |
| 			Timestamp:      0xafb45733,
 | |
| 			SSRC:           0xba9da416,
 | |
| 		},
 | |
| 		Payload: []byte("\x00\x00"),
 | |
| 	}
 | |
| 	ts = time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
 | |
| 	rr.ProcessPacketRTP(ts, &rtpPkt)
 | |
| 
 | |
| 	rtpPkt = rtp.Packet{
 | |
| 		Header: rtp.Header{
 | |
| 			Version:        2,
 | |
| 			Marker:         true,
 | |
| 			PayloadType:    96,
 | |
| 			SequenceNumber: 0x43a6,
 | |
| 			Timestamp:      0xafb45733,
 | |
| 			SSRC:           0xba9da416,
 | |
| 		},
 | |
| 		Payload: []byte("\x00\x00"),
 | |
| 	}
 | |
| 	ts = time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
 | |
| 	rr.ProcessPacketRTP(ts, &rtpPkt)
 | |
| 
 | |
| 	<-done
 | |
| }
 | |
| 
 | |
| func TestRTCPReceiverJitter(t *testing.T) {
 | |
| 	done := make(chan struct{})
 | |
| 	now = func() time.Time {
 | |
| 		return time.Date(2008, 0o5, 20, 22, 15, 22, 0, time.UTC)
 | |
| 	}
 | |
| 	v := uint32(0x65f83afb)
 | |
| 
 | |
| 	rr := New(500*time.Millisecond, &v, 90000, func(pkt rtcp.Packet) {
 | |
| 		require.Equal(t, &rtcp.ReceiverReport{
 | |
| 			SSRC: 0x65f83afb,
 | |
| 			Reports: []rtcp.ReceptionReport{
 | |
| 				{
 | |
| 					SSRC:               0xba9da416,
 | |
| 					LastSequenceNumber: 947,
 | |
| 					LastSenderReport:   0x887a17ce,
 | |
| 					Delay:              2 * 65536,
 | |
| 					Jitter:             45000 / 16,
 | |
| 				},
 | |
| 			},
 | |
| 		}, pkt)
 | |
| 		close(done)
 | |
| 	})
 | |
| 	defer rr.Close()
 | |
| 
 | |
| 	srPkt := rtcp.SenderReport{
 | |
| 		SSRC:        0xba9da416,
 | |
| 		NTPTime:     0xe363887a17ced916,
 | |
| 		RTPTime:     0xafb45733,
 | |
| 		PacketCount: 714,
 | |
| 		OctetCount:  859127,
 | |
| 	}
 | |
| 	ts := time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
 | |
| 	rr.ProcessPacketRTCP(ts, &srPkt)
 | |
| 
 | |
| 	rtpPkt := rtp.Packet{
 | |
| 		Header: rtp.Header{
 | |
| 			Version:        2,
 | |
| 			Marker:         true,
 | |
| 			PayloadType:    96,
 | |
| 			SequenceNumber: 946,
 | |
| 			Timestamp:      0xafb45733,
 | |
| 			SSRC:           0xba9da416,
 | |
| 		},
 | |
| 		Payload: []byte("\x00\x00"),
 | |
| 	}
 | |
| 	ts = time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
 | |
| 	rr.ProcessPacketRTP(ts, &rtpPkt)
 | |
| 
 | |
| 	rtpPkt = rtp.Packet{
 | |
| 		Header: rtp.Header{
 | |
| 			Version:        2,
 | |
| 			Marker:         true,
 | |
| 			PayloadType:    96,
 | |
| 			SequenceNumber: 947,
 | |
| 			Timestamp:      0xafb45733 + 45000,
 | |
| 			SSRC:           0xba9da416,
 | |
| 		},
 | |
| 		Payload: []byte("\x00\x00"),
 | |
| 	}
 | |
| 	ts = time.Date(2008, 0o5, 20, 22, 15, 21, 0, time.UTC)
 | |
| 	rr.ProcessPacketRTP(ts, &rtpPkt)
 | |
| 
 | |
| 	<-done
 | |
| }
 | 
