| Index: webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc | 
| diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc b/webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc | 
| index 3affb318aa70428e2a20489abf14d1cffdd3f397..378ef130d1a27811137462ace01ece5ca2fe4e19 100644 | 
| --- a/webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc | 
| +++ b/webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc | 
| @@ -31,6 +31,7 @@ enum { REDForFECHeaderLength = 1 }; | 
|  | 
| RTPSenderVideo::RTPSenderVideo(Clock* clock, RTPSenderInterface* rtpSender) | 
| : _rtpSender(*rtpSender), | 
| +      clock_(clock), | 
| _videoType(kRtpVideoGeneric), | 
| _retransmissionSettings(kRetransmitBaseLayer), | 
| // Generic FEC | 
| @@ -41,8 +42,8 @@ RTPSenderVideo::RTPSenderVideo(Clock* clock, RTPSenderInterface* rtpSender) | 
| delta_fec_params_(), | 
| key_fec_params_(), | 
| producer_fec_(&fec_), | 
| -      _fecOverheadRate(clock, NULL), | 
| -      _videoBitrate(clock, NULL) { | 
| +      fec_bitrate_(1000, RateStatistics::kBpsScale), | 
| +      video_bitrate_(1000, RateStatistics::kBpsScale) { | 
| memset(&delta_fec_params_, 0, sizeof(delta_fec_params_)); | 
| memset(&key_fec_params_, 0, sizeof(key_fec_params_)); | 
| delta_fec_params_.max_fec_frames = key_fec_params_.max_fec_frames = 1; | 
| @@ -95,7 +96,9 @@ void RTPSenderVideo::SendVideoPacket(uint8_t* data_buffer, | 
| if (_rtpSender.SendToNetwork(data_buffer, payload_length, rtp_header_length, | 
| capture_time_ms, storage, | 
| RtpPacketSender::kLowPriority) == 0) { | 
| -    _videoBitrate.Update(payload_length + rtp_header_length); | 
| +    rtc::CritScope cs(&stats_crit_); | 
| +    video_bitrate_.Update(payload_length + rtp_header_length, | 
| +                          clock_->TimeInMilliseconds()); | 
| TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), | 
| "Video::PacketNormal", "timestamp", capture_timestamp, | 
| "seqnum", seq_num); | 
| @@ -141,7 +144,8 @@ void RTPSenderVideo::SendVideoPacketAsRed(uint8_t* data_buffer, | 
| red_packet->data(), red_packet->length() - rtp_header_length, | 
| rtp_header_length, capture_time_ms, media_packet_storage, | 
| RtpPacketSender::kLowPriority) == 0) { | 
| -    _videoBitrate.Update(red_packet->length()); | 
| +    rtc::CritScope cs(&stats_crit_); | 
| +    video_bitrate_.Update(red_packet->length(), clock_->TimeInMilliseconds()); | 
| TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), | 
| "Video::PacketRed", "timestamp", capture_timestamp, | 
| "seqnum", media_seq_num); | 
| @@ -153,7 +157,8 @@ void RTPSenderVideo::SendVideoPacketAsRed(uint8_t* data_buffer, | 
| fec_packet->data(), fec_packet->length() - rtp_header_length, | 
| rtp_header_length, capture_time_ms, fec_storage, | 
| RtpPacketSender::kLowPriority) == 0) { | 
| -      _fecOverheadRate.Update(fec_packet->length()); | 
| +      rtc::CritScope cs(&stats_crit_); | 
| +      fec_bitrate_.Update(fec_packet->length(), clock_->TimeInMilliseconds()); | 
| TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), | 
| "Video::PacketFec", "timestamp", capture_timestamp, | 
| "seqnum", next_fec_sequence_number); | 
| @@ -337,17 +342,14 @@ int32_t RTPSenderVideo::SendVideo(const RtpVideoCodecTypes videoType, | 
| return 0; | 
| } | 
|  | 
| -void RTPSenderVideo::ProcessBitrate() { | 
| -  _videoBitrate.Process(); | 
| -  _fecOverheadRate.Process(); | 
| -} | 
| - | 
| uint32_t RTPSenderVideo::VideoBitrateSent() const { | 
| -  return _videoBitrate.BitrateLast(); | 
| +  rtc::CritScope cs(&stats_crit_); | 
| +  return video_bitrate_.Rate(clock_->TimeInMilliseconds()).value_or(0); | 
| } | 
|  | 
| uint32_t RTPSenderVideo::FecOverheadRate() const { | 
| -  return _fecOverheadRate.BitrateLast(); | 
| +  rtc::CritScope cs(&stats_crit_); | 
| +  return fec_bitrate_.Rate(clock_->TimeInMilliseconds()).value_or(0); | 
| } | 
|  | 
| int RTPSenderVideo::SelectiveRetransmissions() const { | 
|  |