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) { ...@@ -471,11 +471,14 @@ func writeLoop(conn *upConnection, track *upTrack, ch <-chan packetIndex) {
local := make([]downTrack, 0) local := make([]downTrack, 0)
firSent := false
for { for {
select { select {
case action := <-track.localCh: case action := <-track.localCh:
if action.add { if action.add {
local = append(local, action.track) local = append(local, action.track)
firSent = false
} else { } else {
found := false found := false
for i, t := range local { for i, t := range local {
...@@ -505,16 +508,34 @@ func writeLoop(conn *upConnection, track *upTrack, ch <-chan packetIndex) { ...@@ -505,16 +508,34 @@ func writeLoop(conn *upConnection, track *upTrack, ch <-chan packetIndex) {
continue continue
} }
kfNeeded := false
for _, l := range local { for _, l := range local {
err := l.WriteRTP(&packet) err := l.WriteRTP(&packet)
if err != nil { if err != nil {
if err != io.ErrClosedPipe { if err == ErrKeyframeNeeded {
kfNeeded = true
} else if err != io.ErrClosedPipe {
log.Printf("WriteRTP: %v", err) log.Printf("WriteRTP: %v", err)
} }
continue continue
} }
l.Accumulate(uint32(bytes)) 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) { ...@@ -241,6 +241,8 @@ func (s *receiverStats) Get(now uint64) (uint8, uint32) {
return uint8(atomic.LoadUint32(&s.loss)), atomic.LoadUint32(&s.jitter) return uint8(atomic.LoadUint32(&s.loss)), atomic.LoadUint32(&s.jitter)
} }
var ErrKeyframeNeeded = errors.New("keyframe needed")
type downTrack interface { type downTrack interface {
WriteRTP(packat *rtp.Packet) error WriteRTP(packat *rtp.Packet) error
Accumulate(bytes uint32) 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