Send FIR when WriteRTP returns ErrKeyframeNeeded.
This commit is contained in:
1 parent
88fbce262f
commit
d56628be15
2 files changed
+24
-1
No files matched your search
@@ -471,11 +471,14 @@ func writeLoop(conn *upConnection, track *upTrack, ch <-chan packetIndex) {
|
||||
|
||||
local := make([]downTrack, 0)
|
||||
|
||||
firSent := false
|
||||
|
||||
for {
|
||||
select {
|
||||
case action := <-track.localCh:
|
||||
if action.add {
|
||||
local = append(local, action.track)
|
||||
firSent = false
|
||||
} else {
|
||||
found := false
|
||||
for i, t := range local {
|
||||
@@ -505,16 +508,34 @@ func writeLoop(conn *upConnection, track *upTrack, ch <-chan packetIndex) {
|
||||
continue
|
||||
}
|
||||
|
||||
kfNeeded := false
|
||||
|
||||
for _, l := range local {
|
||||
err := l.WriteRTP(&packet)
|
||||
if err != nil {
|
||||
if err != io.ErrClosedPipe {
|
||||
if err == ErrKeyframeNeeded {
|
||||
kfNeeded = true
|
||||
} else if err != io.ErrClosedPipe {
|
||||
log.Printf("WriteRTP: %v", err)
|
||||
}
|
||||
continue
|
||||
}
|
||||
l.Accumulate(uint32(bytes))
|
||||
}
|
||||
|
||||
if kfNeeded {
|
||||
err := conn.sendFIR(track, !firSent)
|
||||
if err == ErrUnsupportedFeedback {
|
||||
err := conn.sendPLI(track)
|
||||
if err != nil &&
|
||||
err != ErrUnsupportedFeedback {
|
||||
log.Printf("sendPLI: %v", err)
|
||||
}
|
||||
} else if err != nil {
|
||||
log.Printf("sendFIR: %v", err)
|
||||
}
|
||||
firSent = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -241,6 +241,8 @@ func (s *receiverStats) Get(now uint64) (uint8, uint32) {
|
||||
return uint8(atomic.LoadUint32(&s.loss)), atomic.LoadUint32(&s.jitter)
|
||||
}
|
||||
|
||||
var ErrKeyframeNeeded = errors.New("keyframe needed")
|
||||
|
||||
type downTrack interface {
|
||||
WriteRTP(packat *rtp.Packet) error
|
||||
Accumulate(bytes uint32)
|
||||
|
||||
Reference in new issue
Block a user