@@ -11,8 +11,8 @@ import (
1111 "github.com/pion/rtp"
1212)
1313
14- // ReceiverInterceptor interceptor generates nack messages.
15- type ReceiverInterceptor struct {
14+ // GeneratorInterceptor interceptor generates nack feedback messages.
15+ type GeneratorInterceptor struct {
1616 interceptor.NoOp
1717 size uint16
1818 skipLastN uint16
@@ -24,38 +24,42 @@ type ReceiverInterceptor struct {
2424 log logging.LeveledLogger
2525}
2626
27- // NewReceiverInterceptor returns a new ReceiverInterceptor interceptor
28- func NewReceiverInterceptor (size uint16 , skipLastN uint16 , interval time.Duration , log logging.LeveledLogger ) (* ReceiverInterceptor , error ) {
29- _ , err := NewReceiveLog (size )
30- if err != nil {
31- return nil , err
32- }
33-
34- return & ReceiverInterceptor {
27+ // NewGeneratorInterceptor returns a new GeneratorInterceptor interceptor
28+ func NewGeneratorInterceptor (opts ... GeneratorOption ) (* GeneratorInterceptor , error ) {
29+ r := & GeneratorInterceptor {
3530 NoOp : interceptor.NoOp {},
36- size : size ,
37- skipLastN : skipLastN ,
38- interval : interval ,
31+ size : 8192 ,
32+ skipLastN : 0 ,
33+ interval : time . Millisecond * 100 ,
3934 receiveLogs : & sync.Map {},
4035 close : make (chan struct {}),
41- log : log ,
42- }, nil
36+ log : logging .NewDefaultLoggerFactory ().NewLogger ("nack_generator" ),
37+ }
38+
39+ for _ , opt := range opts {
40+ opt (r )
41+ }
42+
43+ if _ , err := newReceiveLog (r .size ); err != nil {
44+ return nil , err
45+ }
46+
47+ return r , nil
4348}
4449
4550// BindRTCPWriter lets you modify any outgoing RTCP packets. It is called once per PeerConnection. The returned method
4651// will be called once per packet batch.
47- func (n * ReceiverInterceptor ) BindRTCPWriter (writer interceptor.RTCPWriter ) interceptor.RTCPWriter {
52+ func (n * GeneratorInterceptor ) BindRTCPWriter (writer interceptor.RTCPWriter ) interceptor.RTCPWriter {
4853 n .m .Lock ()
54+ defer n .m .Unlock ()
4955 select {
5056 case <- n .close :
5157 // already closed
52- n .m .Unlock ()
5358 return writer
5459 default :
5560 }
5661
5762 n .wg .Add (1 )
58- n .m .Unlock ()
5963
6064 go n .loop (writer )
6165
@@ -64,7 +68,7 @@ func (n *ReceiverInterceptor) BindRTCPWriter(writer interceptor.RTCPWriter) inte
6468
6569// BindRemoteStream lets you modify any incoming RTP packets. It is called once for per RemoteStream. The returned method
6670// will be called once per rtp packet.
67- func (n * ReceiverInterceptor ) BindRemoteStream (info * interceptor.StreamInfo , reader interceptor.RTPReader ) interceptor.RTPReader {
71+ func (n * GeneratorInterceptor ) BindRemoteStream (info * interceptor.StreamInfo , reader interceptor.RTPReader ) interceptor.RTPReader {
6872 hasNack := false
6973 for _ , fb := range info .RTCPFeedback {
7074 if fb .Type == "nack" && fb .Parameter == "" {
@@ -76,8 +80,8 @@ func (n *ReceiverInterceptor) BindRemoteStream(info *interceptor.StreamInfo, rea
7680 return reader
7781 }
7882
79- // error is already checked in NewReceiverInterceptor
80- receiveLog , _ := NewReceiveLog (n .size )
83+ // error is already checked in NewGeneratorInterceptor
84+ receiveLog , _ := newReceiveLog (n .size )
8185 n .receiveLogs .Store (info .SSRC , receiveLog )
8286
8387 return interceptor .RTPReaderFunc (func () (* rtp.Packet , interceptor.Attributes , error ) {
@@ -86,18 +90,19 @@ func (n *ReceiverInterceptor) BindRemoteStream(info *interceptor.StreamInfo, rea
8690 return nil , nil , err
8791 }
8892
89- receiveLog .Add (p .SequenceNumber )
93+ receiveLog .add (p .SequenceNumber )
9094
9195 return p , attr , nil
9296 })
9397}
9498
9599// UnbindLocalStream is called when the Stream is removed. It can be used to clean up any data related to that track.
96- func (n * ReceiverInterceptor ) UnbindLocalStream (info * interceptor.StreamInfo ) {
100+ func (n * GeneratorInterceptor ) UnbindLocalStream (info * interceptor.StreamInfo ) {
97101 n .receiveLogs .Delete (info .SSRC )
98102}
99103
100- func (n * ReceiverInterceptor ) Close () error {
104+ // Close closes the interceptor
105+ func (n * GeneratorInterceptor ) Close () error {
101106 defer n .wg .Wait ()
102107 n .m .Lock ()
103108 defer n .m .Unlock ()
@@ -114,32 +119,31 @@ func (n *ReceiverInterceptor) Close() error {
114119 return nil
115120}
116121
117- func (n * ReceiverInterceptor ) loop (rtcpWriter interceptor.RTCPWriter ) {
122+ func (n * GeneratorInterceptor ) loop (rtcpWriter interceptor.RTCPWriter ) {
118123 defer n .wg .Done ()
119124
120- senderSSRC := rand .Uint32 ()
125+ senderSSRC := rand .Uint32 () // #nosec
121126
122127 ticker := time .NewTicker (n .interval )
123128 for {
124129 select {
125130 case <- ticker .C :
126131 n .receiveLogs .Range (func (key , value interface {}) bool {
127132 ssrc := key .(uint32 )
128- receiveLog := value .(* ReceiveLog )
133+ receiveLog := value .(* receiveLog )
129134
130- missing := receiveLog .MissingSeqNumbers (n .skipLastN )
135+ missing := receiveLog .missingSeqNumbers (n .skipLastN )
131136 if len (missing ) == 0 {
132137 return true
133138 }
134139
135140 nack := & rtcp.TransportLayerNack {
136141 SenderSSRC : senderSSRC ,
137142 MediaSSRC : ssrc ,
138- Nacks : nackPairs (missing ),
143+ Nacks : rtcp . NackPairsFromSequenceNumbers (missing ),
139144 }
140145
141- _ , err := rtcpWriter .Write ([]rtcp.Packet {nack }, interceptor.Attributes {})
142- if err != nil {
146+ if _ , err := rtcpWriter .Write ([]rtcp.Packet {nack }, interceptor.Attributes {}); err != nil {
143147 n .log .Warnf ("failed sending nack: %+v" , err )
144148 }
145149
@@ -151,25 +155,3 @@ func (n *ReceiverInterceptor) loop(rtcpWriter interceptor.RTCPWriter) {
151155 }
152156 }
153157}
154-
155- func nackPairs (seqNums []uint16 ) []rtcp.NackPair {
156- // TODO: I think this shoud be moved to rtcp package
157- pairs := make ([]rtcp.NackPair , 0 )
158- startSeq := seqNums [0 ]
159- nackPair := & rtcp.NackPair {PacketID : startSeq }
160- for i := 1 ; i < len (seqNums ); i ++ {
161- m := seqNums [i ]
162-
163- if m - nackPair .PacketID > 16 {
164- pairs = append (pairs , * nackPair )
165- nackPair = & rtcp.NackPair {PacketID : m }
166- continue
167- }
168-
169- nackPair .LostPackets |= 1 << (m - nackPair .PacketID - 1 )
170- }
171-
172- pairs = append (pairs , * nackPair )
173-
174- return pairs
175- }
0 commit comments