| Index: webrtc/video_engine/vie_channel.cc
 | 
| diff --git a/webrtc/video_engine/vie_channel.cc b/webrtc/video_engine/vie_channel.cc
 | 
| index 2eb7a5c6d0ad5c61c8aacb6da8114ec912809137..f4d28eb6458dab36070f03deec793e3f509e3580 100644
 | 
| --- a/webrtc/video_engine/vie_channel.cc
 | 
| +++ b/webrtc/video_engine/vie_channel.cc
 | 
| @@ -229,20 +229,61 @@ void ViEChannel::UpdateHistograms() {
 | 
|      int64_t elapsed_sec = rtcp_counter.TimeSinceFirstPacketInMs(now) / 1000;
 | 
|      if (elapsed_sec > metrics::kMinRunTimeInSeconds) {
 | 
|        RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.NackPacketsReceivedPerMinute",
 | 
| -          rtcp_counter.nack_packets * 60 / elapsed_sec);
 | 
| +                                 rtcp_counter.nack_packets * 60 / elapsed_sec);
 | 
|        RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.FirPacketsReceivedPerMinute",
 | 
| -          rtcp_counter.fir_packets * 60 / elapsed_sec);
 | 
| +                                 rtcp_counter.fir_packets * 60 / elapsed_sec);
 | 
|        RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.PliPacketsReceivedPerMinute",
 | 
| -          rtcp_counter.pli_packets * 60 / elapsed_sec);
 | 
| +                                 rtcp_counter.pli_packets * 60 / elapsed_sec);
 | 
|        if (rtcp_counter.nack_requests > 0) {
 | 
|          RTC_HISTOGRAM_PERCENTAGE(
 | 
|              "WebRTC.Video.UniqueNackRequestsReceivedInPercent",
 | 
| -                rtcp_counter.UniqueNackRequestsInPercent());
 | 
| +            rtcp_counter.UniqueNackRequestsInPercent());
 | 
|        }
 | 
|        int fraction_lost = report_block_stats_sender_->FractionLostInPercent();
 | 
|        if (fraction_lost != -1) {
 | 
|          RTC_HISTOGRAM_PERCENTAGE("WebRTC.Video.SentPacketsLostInPercent",
 | 
| -            fraction_lost);
 | 
| +                                 fraction_lost);
 | 
| +      }
 | 
| +    }
 | 
| +
 | 
| +    StreamDataCounters rtp;
 | 
| +    StreamDataCounters rtx;
 | 
| +    GetSendStreamDataCounters(&rtp, &rtx);
 | 
| +    StreamDataCounters rtp_rtx = rtp;
 | 
| +    rtp_rtx.Add(rtx);
 | 
| +    elapsed_sec = rtp_rtx.TimeSinceFirstPacketInMs(
 | 
| +                      Clock::GetRealTimeClock()->TimeInMilliseconds()) /
 | 
| +                  1000;
 | 
| +    if (elapsed_sec > metrics::kMinRunTimeInSeconds) {
 | 
| +      RTC_HISTOGRAM_COUNTS_100000(
 | 
| +          "WebRTC.Video.BitrateSentInKbps",
 | 
| +          static_cast<int>(rtp_rtx.transmitted.TotalBytes() * 8 / elapsed_sec /
 | 
| +                           1000));
 | 
| +      RTC_HISTOGRAM_COUNTS_10000(
 | 
| +          "WebRTC.Video.MediaBitrateSentInKbps",
 | 
| +          static_cast<int>(rtp.MediaPayloadBytes() * 8 / elapsed_sec / 1000));
 | 
| +      RTC_HISTOGRAM_COUNTS_10000(
 | 
| +          "WebRTC.Video.PaddingBitrateSentInKbps",
 | 
| +          static_cast<int>(rtp_rtx.transmitted.padding_bytes * 8 / elapsed_sec /
 | 
| +                           1000));
 | 
| +      RTC_HISTOGRAM_COUNTS_10000(
 | 
| +          "WebRTC.Video.RetransmittedBitrateSentInKbps",
 | 
| +          static_cast<int>(rtp_rtx.retransmitted.TotalBytes() * 8 /
 | 
| +                           elapsed_sec / 1000));
 | 
| +      if (rtp_rtcp_->RtxSendStatus() != kRtxOff) {
 | 
| +        RTC_HISTOGRAM_COUNTS_10000(
 | 
| +            "WebRTC.Video.RtxBitrateSentInKbps",
 | 
| +            static_cast<int>(rtx.transmitted.TotalBytes() * 8 / elapsed_sec /
 | 
| +                             1000));
 | 
| +      }
 | 
| +      bool fec_enabled = false;
 | 
| +      uint8_t pltype_red;
 | 
| +      uint8_t pltype_fec;
 | 
| +      rtp_rtcp_->GenericFECStatus(fec_enabled, pltype_red, pltype_fec);
 | 
| +      if (fec_enabled) {
 | 
| +        RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.FecBitrateSentInKbps",
 | 
| +                                   static_cast<int>(rtp_rtx.fec.TotalBytes() *
 | 
| +                                                    8 / elapsed_sec / 1000));
 | 
|        }
 | 
|      }
 | 
|    } else if (vie_receiver_.GetRemoteSsrc() > 0) {
 | 
| @@ -302,49 +343,6 @@ void ViEChannel::UpdateHistograms() {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -void ViEChannel::UpdateHistogramsAtStopSend() {
 | 
| -  StreamDataCounters rtp;
 | 
| -  StreamDataCounters rtx;
 | 
| -  GetSendStreamDataCounters(&rtp, &rtx);
 | 
| -  StreamDataCounters rtp_rtx = rtp;
 | 
| -  rtp_rtx.Add(rtx);
 | 
| -
 | 
| -  int64_t elapsed_sec = rtp_rtx.TimeSinceFirstPacketInMs(
 | 
| -      Clock::GetRealTimeClock()->TimeInMilliseconds()) / 1000;
 | 
| -  if (elapsed_sec < metrics::kMinRunTimeInSeconds) {
 | 
| -    return;
 | 
| -  }
 | 
| -  RTC_HISTOGRAM_COUNTS_100000(
 | 
| -      "WebRTC.Video.BitrateSentInKbps",
 | 
| -      static_cast<int>(rtp_rtx.transmitted.TotalBytes() * 8 / elapsed_sec /
 | 
| -                       1000));
 | 
| -  RTC_HISTOGRAM_COUNTS_10000(
 | 
| -      "WebRTC.Video.MediaBitrateSentInKbps",
 | 
| -      static_cast<int>(rtp.MediaPayloadBytes() * 8 / elapsed_sec / 1000));
 | 
| -  RTC_HISTOGRAM_COUNTS_10000(
 | 
| -      "WebRTC.Video.PaddingBitrateSentInKbps",
 | 
| -      static_cast<int>(rtp_rtx.transmitted.padding_bytes * 8 / elapsed_sec /
 | 
| -                       1000));
 | 
| -  RTC_HISTOGRAM_COUNTS_10000(
 | 
| -      "WebRTC.Video.RetransmittedBitrateSentInKbps",
 | 
| -      static_cast<int>(rtp_rtx.retransmitted.TotalBytes() * 8 / elapsed_sec /
 | 
| -                       1000));
 | 
| -  if (rtp_rtcp_->RtxSendStatus() != kRtxOff) {
 | 
| -    RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.RtxBitrateSentInKbps",
 | 
| -                               static_cast<int>(rtx.transmitted.TotalBytes() *
 | 
| -                                                8 / elapsed_sec / 1000));
 | 
| -  }
 | 
| -  bool fec_enabled = false;
 | 
| -  uint8_t pltype_red;
 | 
| -  uint8_t pltype_fec;
 | 
| -  rtp_rtcp_->GenericFECStatus(fec_enabled, pltype_red, pltype_fec);
 | 
| -  if (fec_enabled) {
 | 
| -    RTC_HISTOGRAM_COUNTS_10000(
 | 
| -        "WebRTC.Video.FecBitrateSentInKbps",
 | 
| -        static_cast<int>(rtp_rtx.fec.TotalBytes() * 8 / elapsed_sec / 1000));
 | 
| -  }
 | 
| -}
 | 
| -
 | 
|  int32_t ViEChannel::SetSendCodec(const VideoCodec& video_codec,
 | 
|                                   bool new_stream) {
 | 
|    DCHECK(sender_);
 | 
| @@ -1336,7 +1334,6 @@ int32_t ViEChannel::StartSend() {
 | 
|  }
 | 
|  
 | 
|  int32_t ViEChannel::StopSend() {
 | 
| -  UpdateHistogramsAtStopSend();
 | 
|    send_payload_router_->set_active(false);
 | 
|    CriticalSectionScoped cs(rtp_rtcp_cs_.get());
 | 
|    rtp_rtcp_->SetSendingMediaStatus(false);
 | 
| @@ -1350,8 +1347,6 @@ int32_t ViEChannel::StopSend() {
 | 
|      return -1;
 | 
|    }
 | 
|  
 | 
| -  // Reset.
 | 
| -  rtp_rtcp_->ResetSendDataCountersRTP();
 | 
|    if (rtp_rtcp_->SetSendingStatus(false) != 0) {
 | 
|      return -1;
 | 
|    }
 | 
| @@ -1359,7 +1354,6 @@ int32_t ViEChannel::StopSend() {
 | 
|         it != simulcast_rtp_rtcp_.end();
 | 
|         it++) {
 | 
|      RtpRtcp* rtp_rtcp = *it;
 | 
| -    rtp_rtcp->ResetSendDataCountersRTP();
 | 
|      rtp_rtcp->SetSendingStatus(false);
 | 
|    }
 | 
|    return 0;
 | 
| @@ -1698,13 +1692,6 @@ void ViEChannel::OnIncomingCSRCChanged(const int32_t id,
 | 
|    CriticalSectionScoped cs(callback_cs_.get());
 | 
|  }
 | 
|  
 | 
| -void ViEChannel::ResetStatistics(uint32_t ssrc) {
 | 
| -  StreamStatistician* statistician =
 | 
| -      vie_receiver_.GetReceiveStatistics()->GetStatistician(ssrc);
 | 
| -  if (statistician)
 | 
| -    statistician->ResetStatistics();
 | 
| -}
 | 
| -
 | 
|  void ViEChannel::RegisterSendFrameCountObserver(
 | 
|      FrameCountObserver* observer) {
 | 
|    send_frame_count_observer_.Set(observer);
 | 
| 
 |