Skip to content

Commit f62bc84

Browse files
committed
review fixes, rename receiver -> generator, sender -> responder, linter fixes
1 parent fd6bc60 commit f62bc84

13 files changed

+240
-134
lines changed

test/stream.go renamed to internal/test/stream.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/pion/rtp"
99
)
1010

11+
// Stream is a helper struct for testing interceptors.
1112
type Stream struct {
1213
interceptor interceptor.Interceptor
1314

@@ -26,16 +27,19 @@ type Stream struct {
2627
rtpInModified chan RTPWithError
2728
}
2829

30+
// RTPWithError is used to send an rtp packet or an error on a channel
2931
type RTPWithError struct {
3032
Packet *rtp.Packet
3133
Err error
3234
}
3335

36+
// RTCPWithError is used to send a batch of rtcp packets or an error on a channel
3437
type RTCPWithError struct {
3538
Packets []rtcp.Packet
3639
Err error
3740
}
3841

42+
// NewStream creates a new Stream
3943
func NewStream(info *interceptor.StreamInfo, i interceptor.Interceptor) *Stream {
4044
s := &Stream{
4145
interceptor: i,
@@ -107,40 +111,49 @@ func NewStream(info *interceptor.StreamInfo, i interceptor.Interceptor) *Stream
107111
return s
108112
}
109113

114+
// WriteRTCP writes a batch of rtcp packet to the stream, using the interceptor
110115
func (s *Stream) WriteRTCP(pkts []rtcp.Packet) error {
111116
_, err := s.rtcpWriter.Write(pkts, interceptor.Attributes{})
112117
return err
113118
}
114119

120+
// WriteRTP writes an rtp packet to the stream, using the interceptor
115121
func (s *Stream) WriteRTP(p *rtp.Packet) error {
116122
_, err := s.rtpWriter.Write(p, interceptor.Attributes{})
117123
return err
118124
}
119125

126+
// ReceiveRTCP schedules a new rtcp batch, so it can be read be the stream
120127
func (s *Stream) ReceiveRTCP(pkts []rtcp.Packet) {
121128
s.rtcpIn <- pkts
122129
}
123130

131+
// ReceiveRTP schedules a rtp packet, so it can be read be the stream
124132
func (s *Stream) ReceiveRTP(packet *rtp.Packet) {
125133
s.rtpIn <- packet
126134
}
127135

136+
// WrittenRTCP returns a channel containing the rtcp batches written, modified by the interceptor
128137
func (s *Stream) WrittenRTCP() chan []rtcp.Packet {
129138
return s.rtcpOutModified
130139
}
131140

141+
// WrittenRTP returns a channel containing rtp packets written, modified by the interceptor
132142
func (s *Stream) WrittenRTP() chan *rtp.Packet {
133143
return s.rtpOutModified
134144
}
135145

146+
// ReadRTCP returns a channel containing the rtcp batched read, modified by the interceptor
136147
func (s *Stream) ReadRTCP() chan RTCPWithError {
137148
return s.rtcpInModified
138149
}
139150

151+
// ReadRTP returns a channel containing the rtp packets read, modified by the interceptor
140152
func (s *Stream) ReadRTP() chan RTPWithError {
141153
return s.rtpInModified
142154
}
143155

156+
// Close closes the stream and the underlying interceptor
144157
func (s *Stream) Close() error {
145158
close(s.rtcpIn)
146159
close(s.rtpIn)
File renamed without changes.

nack/errors.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package nack
2+
3+
import "errors"
4+
5+
var (
6+
// ErrInvalidSize is returned by newReceiveLog/newSendBuffer, when an incorrect buffer size is supplied.
7+
ErrInvalidSize = errors.New("invalid buffer size")
8+
)

nack/receiver_interceptor.go renamed to nack/generator_interceptor.go

Lines changed: 33 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

nack/receiver_interceptor_test.go renamed to nack/generator_interceptor_test.go

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,26 @@
11
package nack
22

33
import (
4+
"errors"
45
"testing"
56
"time"
67

78
"github.com/pion/interceptor"
8-
"github.com/pion/interceptor/test"
9+
"github.com/pion/interceptor/internal/test"
910
"github.com/pion/logging"
1011
"github.com/pion/rtcp"
1112
"github.com/pion/rtp"
1213
"github.com/stretchr/testify/assert"
1314
)
1415

15-
func TestReceiverInterceptor(t *testing.T) {
16+
func TestGeneratorInterceptor(t *testing.T) {
1617
const interval = time.Millisecond * 10
17-
i, err := NewReceiverInterceptor(64, 2, interval, logging.NewDefaultLoggerFactory().NewLogger("test"))
18+
i, err := NewGeneratorInterceptor(
19+
GeneratorSize(64),
20+
GeneratorSkipLastN(2),
21+
GeneratorInterval(interval),
22+
GeneratorLog(logging.NewDefaultLoggerFactory().NewLogger("test")),
23+
)
1824
if err != nil {
1925
t.Fatal(err)
2026
}
@@ -63,8 +69,15 @@ func TestReceiverInterceptor(t *testing.T) {
6369
}
6470

6571
assert.Equal(t, uint16(13), p.Nacks[0].PacketID)
66-
assert.Equal(t, rtcp.PacketBitmap(0b10), p.Nacks[0].LostPackets) // we want packets: 13, 15 (not packet 17, because skipLastN is set to 2)
72+
assert.Equal(t, rtcp.PacketBitmap(0b10), p.Nacks[0].LostPackets) // we want packets: 13, 15 (not packet 17, because skipLastN is setReceived to 2)
6773
case <-time.After(10 * time.Millisecond):
6874
t.Fatal("written rtcp packet not found")
6975
}
7076
}
77+
78+
func TestGeneratorInterceptor_InvalidSize(t *testing.T) {
79+
_, err := NewGeneratorInterceptor(GeneratorSize(5))
80+
if err == nil || !errors.Is(err, ErrInvalidSize) {
81+
t.Fatalf("expected invalid size error, got: %v", err)
82+
}
83+
}

nack/generator_option.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package nack
2+
3+
import (
4+
"time"
5+
6+
"github.com/pion/logging"
7+
)
8+
9+
// GeneratorOption can be used to configure GeneratorInterceptor
10+
type GeneratorOption func(r *GeneratorInterceptor)
11+
12+
// GeneratorSize sets the size of the interceptor.
13+
// Size must be one of: 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768
14+
func GeneratorSize(size uint16) GeneratorOption {
15+
return func(r *GeneratorInterceptor) {
16+
r.size = size
17+
}
18+
}
19+
20+
// GeneratorSkipLastN sets the number of packets (n-1 packets before the last received packets) to ignore when generating
21+
// nack requests.
22+
func GeneratorSkipLastN(skipLastN uint16) GeneratorOption {
23+
return func(r *GeneratorInterceptor) {
24+
r.skipLastN = skipLastN
25+
}
26+
}
27+
28+
// GeneratorLog sets a logger for the interceptor
29+
func GeneratorLog(log logging.LeveledLogger) GeneratorOption {
30+
return func(r *GeneratorInterceptor) {
31+
r.log = log
32+
}
33+
}
34+
35+
// GeneratorInterval sets the nack send interval for the interceptor
36+
func GeneratorInterval(interval time.Duration) GeneratorOption {
37+
return func(r *GeneratorInterceptor) {
38+
r.interval = interval
39+
}
40+
}

0 commit comments

Comments
 (0)