Index: webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc |
diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc b/webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc |
index 59049be01f1b3c2de4473fa073742a0876940142..b0aa7b14b791a7e3bb4c3ef64a4966c3f862e003 100644 |
--- a/webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc |
+++ b/webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc |
@@ -54,6 +54,7 @@ using rtcp::ReportBlock; |
const int kRrTimeoutIntervals = 3; |
const int64_t kMaxWarningLogIntervalMs = 10000; |
+const int64_t kRtcpMinFrameLengthMs = 17; |
} // namespace |
@@ -79,9 +80,6 @@ struct RTCPReceiver::ReceiveInformation { |
int64_t last_time_received_ms = 0; |
- int64_t last_fir_request_ms = 0; |
- int32_t last_fir_sequence_number = -1; |
- |
bool ready_for_delete = false; |
std::vector<rtcp::TmmbItem> tmmbn; |
@@ -98,6 +96,13 @@ struct RTCPReceiver::ReportBlockWithRtt { |
size_t num_rtts = 0; |
}; |
+struct RTCPReceiver::LastFirStatus { |
+ LastFirStatus(int64_t now_ms, uint8_t sequence_number) |
+ : request_ms(now_ms), sequence_number(sequence_number) {} |
+ int64_t request_ms; |
+ uint8_t sequence_number; |
+}; |
+ |
RTCPReceiver::RTCPReceiver( |
Clock* clock, |
bool receiver_only, |
@@ -682,6 +687,7 @@ void RTCPReceiver::HandleBye(const CommonHeader& rtcp_block) { |
if (receive_info) |
receive_info->ready_for_delete = true; |
+ last_fir_.erase(bye.sender_ssrc()); |
received_cnames_.erase(bye.sender_ssrc()); |
xr_rr_rtt_ms_ = 0; |
} |
@@ -879,8 +885,6 @@ void RTCPReceiver::HandleFir(const CommonHeader& rtcp_block, |
return; |
} |
- ReceiveInformation* receive_info = GetReceiveInformation(fir.sender_ssrc()); |
- |
for (const rtcp::Fir::Request& fir_request : fir.requests()) { |
// Is it our sender that is requested to generate a new keyframe. |
if (main_ssrc_ != fir_request.ssrc) |
@@ -888,18 +892,22 @@ void RTCPReceiver::HandleFir(const CommonHeader& rtcp_block, |
++packet_type_counter_.fir_packets; |
- if (receive_info) { |
+ int64_t now_ms = clock_->TimeInMilliseconds(); |
+ auto inserted = last_fir_.insert(std::make_pair( |
+ fir.sender_ssrc(), LastFirStatus(now_ms, fir_request.seq_nr))); |
+ if (!inserted.second) { // There was entry already. |
philipel
2017/02/15 09:58:23
'There was already an entry.' or 'Last fir already
danilchap
2017/02/15 10:20:49
Done.
|
+ LastFirStatus* last_fir = &inserted.first->second; |
+ |
// Check if we have reported this FIRSequenceNumber before. |
- if (fir_request.seq_nr == receive_info->last_fir_sequence_number) |
+ if (fir_request.seq_nr == last_fir->sequence_number) |
continue; |
- int64_t now_ms = clock_->TimeInMilliseconds(); |
// Sanity: don't go crazy with the callbacks. |
- if (now_ms - receive_info->last_fir_request_ms < RTCP_MIN_FRAME_LENGTH_MS) |
+ if (now_ms - last_fir->request_ms < kRtcpMinFrameLengthMs) |
continue; |
- receive_info->last_fir_request_ms = now_ms; |
- receive_info->last_fir_sequence_number = fir_request.seq_nr; |
+ last_fir->request_ms = now_ms; |
+ last_fir->sequence_number = fir_request.seq_nr; |
} |
// Received signal that we need to send a new key frame. |
packet_information->packet_type_flags |= kRtcpFir; |