Skip to content

Commit b3f1f2f

Browse files
authored
fix(buffer): fix nack request (#336)
1 parent 2c0b6c7 commit b3f1f2f

4 files changed

Lines changed: 34 additions & 5 deletions

File tree

pkg/buffer/buffer.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,3 +255,7 @@ func (b *Buffer) onTransportWideCC(fn func(sn uint16, timeNS int64, marker bool)
255255
func (b *Buffer) onFeedback(fn func(fb []rtcp.Packet)) {
256256
b.feedbackCB = fn
257257
}
258+
259+
func (b *Buffer) onNack(fn func(fb *rtcp.TransportLayerNack)) {
260+
b.pktQueue.onLost = fn
261+
}

pkg/buffer/interceptor.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"sync"
55
"sync/atomic"
66

7+
log "github.com/pion/ion-log"
8+
79
"github.com/pion/interceptor"
810
"github.com/pion/rtcp"
911
"github.com/pion/rtp"
@@ -84,7 +86,9 @@ func (i *Interceptor) BindRTCPReader(reader interceptor.RTCPReader) interceptor.
8486

8587
func (i *Interceptor) BindRTCPWriter(writer interceptor.RTCPWriter) interceptor.RTCPWriter {
8688
i.twcc.onFeedback = func(pkts []rtcp.Packet) {
87-
writer.Write(pkts, nil)
89+
if _, err := writer.Write(pkts, nil); err != nil {
90+
log.Errorf("Writing buffer twcc rtcp err: %v", err)
91+
}
8892
}
8993
i.rtcpWriter.Store(writer)
9094
return writer
@@ -127,12 +131,21 @@ func (i *Interceptor) newBuffer(info *interceptor.StreamInfo) *Buffer {
127131
buffer := NewBuffer(info, Options{})
128132
buffer.onFeedback(func(pkts []rtcp.Packet) {
129133
if p, ok := i.rtcpWriter.Load().(interceptor.RTCPWriter); ok {
130-
p.Write(pkts, nil)
134+
if _, err := p.Write(pkts, nil); err != nil {
135+
log.Errorf("Writing buffer rtcp err: %v", err)
136+
}
131137
}
132138
})
133139
buffer.onTransportWideCC(func(sn uint16, timeNS int64, marker bool) {
134140
i.twcc.push(sn, timeNS, marker)
135141
})
142+
buffer.onNack(func(fb *rtcp.TransportLayerNack) {
143+
if p, ok := i.rtcpWriter.Load().(interceptor.RTCPWriter); ok {
144+
if _, err := p.Write([]rtcp.Packet{fb}, nil); err != nil {
145+
log.Errorf("Writing buffer rtcp err: %v", err)
146+
}
147+
}
148+
})
136149
i.Lock()
137150
i.buffers = append(i.buffers, buffer)
138151
i.twcc.mSSRC = info.SSRC

pkg/sfu/nack.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ func newNACKList() *nackList {
2727
}
2828
}
2929

30-
func (n *nackList) getNACKSeqNo(seqno []uint16) []uint16 {
30+
func (n *nackList) getNACKSeqNo(seqNo []uint16) []uint16 {
3131
packets := make([]uint16, 0, 17)
32-
for _, sn := range seqno {
32+
for _, sn := range seqNo {
3333
if nack, ok := n.nacks[sn]; !ok {
3434
n.nacks[sn] = n.ll.PushBack(NACK{sn, time.Now().UnixNano()})
3535
packets = append(packets, sn)

pkg/sfu/subscriber.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package sfu
22

33
import (
44
"io"
5+
"math"
56
"sync"
67
"sync/atomic"
78
"time"
@@ -173,6 +174,7 @@ func (s *Subscriber) Close() error {
173174
func (s *Subscriber) downTracksReports() {
174175
for {
175176
time.Sleep(5 * time.Second)
177+
176178
var r []rtcp.Packet
177179
var sd []rtcp.SourceDescriptionChunk
178180
s.RLock()
@@ -210,14 +212,24 @@ func (s *Subscriber) downTracksReports() {
210212
}
211213
}
212214
s.RUnlock()
213-
if len(r) > 0 {
215+
i := math.Ceil(float64(len(sd)) / float64(20))
216+
j := 0
217+
for i > 0 {
218+
if i > 1 {
219+
sd = sd[j*20 : (j+1)*20-1]
220+
} else {
221+
sd = sd[j*20 : cap(sd)]
222+
}
214223
r = append(r, &rtcp.SourceDescription{Chunks: sd})
215224
if err := s.pc.WriteRTCP(r); err != nil {
216225
if err == io.EOF || err == io.ErrClosedPipe {
217226
return
218227
}
219228
log.Errorf("Sending downtrack reports err: %v", err)
220229
}
230+
r = r[:0]
231+
i--
232+
j++
221233
}
222234
}
223235
}

0 commit comments

Comments
 (0)