1
Fork 0
mirror of https://github.com/jech/galene.git synced 2024-11-22 16:45:58 +01:00

Send FIR when WriteRTP returns ErrKeyframeNeeded.

This commit is contained in:
Juliusz Chroboczek 2020-05-21 01:14:54 +02:00
parent 88fbce262f
commit d56628be15
2 changed files with 24 additions and 1 deletions

View file

@ -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
}
}
}
}

View file

@ -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)