@@ -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,43 @@ 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 )
27+ // NewGeneratorInterceptor returns a new GeneratorInterceptor interceptor
28+ func NewGeneratorInterceptor (opts ... GeneratorOption ) (* GeneratorInterceptor , error ) {
29+ r := & GeneratorInterceptor {
30+ NoOp : interceptor.NoOp {},
31+ size : 8192 ,
32+ skipLastN : 0 ,
33+ interval : time .Millisecond * 100 ,
34+ receiveLogs : & sync.Map {},
35+ close : make (chan struct {}),
36+ log : logging .NewDefaultLoggerFactory ().NewLogger ("nack_generator" ),
37+ }
38+
39+ for _ , opt := range opts {
40+ opt (r )
41+ }
42+
43+ _ , err := newReceiveLog (r .size )
3044 if err != nil {
3145 return nil , err
3246 }
3347
34- return & ReceiverInterceptor {
35- NoOp : interceptor.NoOp {},
36- size : size ,
37- skipLastN : skipLastN ,
38- interval : interval ,
39- receiveLogs : & sync.Map {},
40- close : make (chan struct {}),
41- log : log ,
42- }, nil
48+ return r , nil
4349}
4450
4551// BindRTCPWriter lets you modify any outgoing RTCP packets. It is called once per PeerConnection. The returned method
4652// will be called once per packet batch.
47- func (n * ReceiverInterceptor ) BindRTCPWriter (writer interceptor.RTCPWriter ) interceptor.RTCPWriter {
53+ func (n * GeneratorInterceptor ) BindRTCPWriter (writer interceptor.RTCPWriter ) interceptor.RTCPWriter {
4854 n .m .Lock ()
55+ defer n .m .Unlock ()
4956 select {
5057 case <- n .close :
5158 // already closed
52- n .m .Unlock ()
5359 return writer
5460 default :
5561 }
5662
5763 n .wg .Add (1 )
58- n .m .Unlock ()
5964
6065 go n .loop (writer )
6166
@@ -64,7 +69,7 @@ func (n *ReceiverInterceptor) BindRTCPWriter(writer interceptor.RTCPWriter) inte
6469
6570// BindRemoteStream lets you modify any incoming RTP packets. It is called once for per RemoteStream. The returned method
6671// will be called once per rtp packet.
67- func (n * ReceiverInterceptor ) BindRemoteStream (info * interceptor.StreamInfo , reader interceptor.RTPReader ) interceptor.RTPReader {
72+ func (n * GeneratorInterceptor ) BindRemoteStream (info * interceptor.StreamInfo , reader interceptor.RTPReader ) interceptor.RTPReader {
6873 hasNack := false
6974 for _ , fb := range info .RTCPFeedback {
7075 if fb .Type == "nack" && fb .Parameter == "" {
@@ -76,8 +81,8 @@ func (n *ReceiverInterceptor) BindRemoteStream(info *interceptor.StreamInfo, rea
7681 return reader
7782 }
7883
79- // error is already checked in NewReceiverInterceptor
80- receiveLog , _ := NewReceiveLog (n .size )
84+ // error is already checked in NewGeneratorInterceptor
85+ receiveLog , _ := newReceiveLog (n .size )
8186 n .receiveLogs .Store (info .SSRC , receiveLog )
8287
8388 return interceptor .RTPReaderFunc (func () (* rtp.Packet , interceptor.Attributes , error ) {
@@ -86,18 +91,19 @@ func (n *ReceiverInterceptor) BindRemoteStream(info *interceptor.StreamInfo, rea
8691 return nil , nil , err
8792 }
8893
89- receiveLog .Add (p .SequenceNumber )
94+ receiveLog .add (p .SequenceNumber )
9095
9196 return p , attr , nil
9297 })
9398}
9499
95100// 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 ) {
101+ func (n * GeneratorInterceptor ) UnbindLocalStream (info * interceptor.StreamInfo ) {
97102 n .receiveLogs .Delete (info .SSRC )
98103}
99104
100- func (n * ReceiverInterceptor ) Close () error {
105+ // Close closes the interceptor
106+ func (n * GeneratorInterceptor ) Close () error {
101107 defer n .wg .Wait ()
102108 n .m .Lock ()
103109 defer n .m .Unlock ()
@@ -114,20 +120,20 @@ func (n *ReceiverInterceptor) Close() error {
114120 return nil
115121}
116122
117- func (n * ReceiverInterceptor ) loop (rtcpWriter interceptor.RTCPWriter ) {
123+ func (n * GeneratorInterceptor ) loop (rtcpWriter interceptor.RTCPWriter ) {
118124 defer n .wg .Done ()
119125
120- senderSSRC := rand .Uint32 ()
126+ senderSSRC := rand .Uint32 () // #nosec
121127
122128 ticker := time .NewTicker (n .interval )
123129 for {
124130 select {
125131 case <- ticker .C :
126132 n .receiveLogs .Range (func (key , value interface {}) bool {
127133 ssrc := key .(uint32 )
128- receiveLog := value .(* ReceiveLog )
134+ receiveLog := value .(* receiveLog )
129135
130- missing := receiveLog .MissingSeqNumbers (n .skipLastN )
136+ missing := receiveLog .missingSeqNumbers (n .skipLastN )
131137 if len (missing ) == 0 {
132138 return true
133139 }
0 commit comments