Commit d56628be authored by Juliusz Chroboczek's avatar Juliusz Chroboczek

Send FIR when WriteRTP returns ErrKeyframeNeeded.

parent 88fbce26
......@@ -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)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment