@@ -8,27 +8,40 @@ package bwe_test
88import (
99 "fmt"
1010 "log/slog"
11- "time"
1211
1312 "github.com/pion/interceptor"
1413 "github.com/pion/rtcp"
1514 "github.com/pion/rtp"
1615)
1716
17+ const (
18+ maxSequenceNumberPlusOne = int64 (65536 )
19+ breakpoint = 32768 // half of max uint16
20+ )
21+
1822type packetLogger struct {
1923 logger * slog.Logger
2024 direction string
25+ seq * unwrapper
26+ }
27+
28+ func newPacketLogger (logger * slog.Logger , direction string ) * packetLogger {
29+ return & packetLogger {
30+ logger : logger ,
31+ direction : direction ,
32+ seq : & unwrapper {},
33+ }
2134}
2235
2336func (l * packetLogger ) LogRTPPacket (header * rtp.Header , payload []byte , attributes interceptor.Attributes ) {
24- ts := time . Now ( )
37+ u := l . seq . Unwrap ( header . SequenceNumber )
2538 l .logger .Info (
2639 "rtp" ,
2740 "direction" , l .direction ,
28- "ts" , ts ,
2941 "pt" , header .PayloadType ,
3042 "ssrc" , header .SSRC ,
3143 "sequence-number" , header .SequenceNumber ,
44+ "unwrapped-sequence-number" , u ,
3245 "rtp-timestamp" , header .Timestamp ,
3346 "marker" , header .Marker ,
3447 "payload-size" , len (payload ),
@@ -44,3 +57,41 @@ func (l *packetLogger) LogRTCPPackets(pkts []rtcp.Packet, attributes interceptor
4457 )
4558 }
4659}
60+
61+ // Unwrapper stores an unwrapped sequence number.
62+ type unwrapper struct {
63+ init bool
64+ lastUnwrapped int64
65+ }
66+
67+ func isNewer (value , previous uint16 ) bool {
68+ if value - previous == breakpoint {
69+ return value > previous
70+ }
71+
72+ return value != previous && (value - previous ) < breakpoint
73+ }
74+
75+ // Unwrap unwraps the next sequencenumber.
76+ func (u * unwrapper ) Unwrap (i uint16 ) int64 {
77+ if ! u .init {
78+ u .init = true
79+ u .lastUnwrapped = int64 (i )
80+
81+ return u .lastUnwrapped
82+ }
83+
84+ lastWrapped := uint16 (u .lastUnwrapped ) //nolint:gosec // G115
85+ delta := int64 (i - lastWrapped )
86+ if isNewer (i , lastWrapped ) {
87+ if delta < 0 {
88+ delta += maxSequenceNumberPlusOne
89+ }
90+ } else if delta > 0 && u .lastUnwrapped + delta - maxSequenceNumberPlusOne >= 0 {
91+ delta -= maxSequenceNumberPlusOne
92+ }
93+
94+ u .lastUnwrapped += delta
95+
96+ return u .lastUnwrapped
97+ }
0 commit comments