From 50982fddc66c1419df30d5b53221acb0f3fa7521 Mon Sep 17 00:00:00 2001 From: Juliusz Chroboczek Date: Fri, 29 May 2020 18:38:44 +0200 Subject: [PATCH] Forward received FIR to sender. It would be better to terminate FIR, note that a keyframe was requested, and send FIR on our own. --- client.go | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/client.go b/client.go index 5674e2a..2b2b69f 100644 --- a/client.go +++ b/client.go @@ -807,6 +807,9 @@ func (track *rtpDownTrack) updateRate(loss uint8, now uint64) { } func rtcpDownListener(conn *rtpDownConnection, track *rtpDownTrack, s *webrtc.RTPSender) { + var gotFir bool + lastFirSeqno := uint8(0) + for { ps, err := s.ReadRTCP() if err != nil { @@ -823,6 +826,39 @@ func rtcpDownListener(conn *rtpDownConnection, track *rtpDownTrack, s *webrtc.RT if err != nil { log.Printf("sendPLI: %v", err) } + case *rtcp.FullIntraRequest: + found := false + var seqno uint8 + for _, entry := range p.FIR { + if entry.SSRC == track.track.SSRC() { + found = true + seqno = entry.SequenceNumber + break + } + } + if !found { + log.Printf("Misdirected FIR") + continue + } + + increment := true + if gotFir { + increment = seqno != lastFirSeqno + } + gotFir = true + lastFirSeqno = seqno + + err := conn.remote.sendFIR( + track.remote, increment, + ) + if err == ErrUnsupportedFeedback { + err := conn.remote.sendPLI(track.remote) + if err != nil { + log.Printf("sendPLI: %v", err) + } + } else if err != nil { + log.Printf("sendFIR: %v", err) + } case *rtcp.ReceiverEstimatedMaximumBitrate: track.maxREMBBitrate.Set( p.Bitrate, mono.Microseconds(),