| Index: webrtc/modules/video_coding/frame_buffer2.cc
 | 
| diff --git a/webrtc/modules/video_coding/frame_buffer2.cc b/webrtc/modules/video_coding/frame_buffer2.cc
 | 
| index db4928c9f5ebbbd09d5bec524725585130c9f99d..279c613424a7dde7154aa1ea0bad786c809d5e84 100644
 | 
| --- a/webrtc/modules/video_coding/frame_buffer2.cc
 | 
| +++ b/webrtc/modules/video_coding/frame_buffer2.cc
 | 
| @@ -16,7 +16,6 @@
 | 
|  
 | 
|  #include "webrtc/base/checks.h"
 | 
|  #include "webrtc/base/logging.h"
 | 
| -#include "webrtc/modules/video_coding/include/video_coding_defines.h"
 | 
|  #include "webrtc/modules/video_coding/jitter_estimator.h"
 | 
|  #include "webrtc/modules/video_coding/timing.h"
 | 
|  #include "webrtc/system_wrappers/include/clock.h"
 | 
| @@ -35,8 +34,7 @@
 | 
|  
 | 
|  FrameBuffer::FrameBuffer(Clock* clock,
 | 
|                           VCMJitterEstimator* jitter_estimator,
 | 
| -                         VCMTiming* timing,
 | 
| -                         VCMReceiveStatisticsCallback* stats_callback)
 | 
| +                         VCMTiming* timing)
 | 
|      : clock_(clock),
 | 
|        new_countinuous_frame_event_(false, false),
 | 
|        jitter_estimator_(jitter_estimator),
 | 
| @@ -47,10 +45,11 @@
 | 
|        num_frames_history_(0),
 | 
|        num_frames_buffered_(0),
 | 
|        stopped_(false),
 | 
| -      protection_mode_(kProtectionNack),
 | 
| -      stats_callback_(stats_callback) {}
 | 
| -
 | 
| -FrameBuffer::~FrameBuffer() {}
 | 
| +      protection_mode_(kProtectionNack) {}
 | 
| +
 | 
| +FrameBuffer::~FrameBuffer() {
 | 
| +  UpdateHistograms();
 | 
| +}
 | 
|  
 | 
|  FrameBuffer::ReturnReason FrameBuffer::NextFrame(
 | 
|      int64_t max_wait_time_ms,
 | 
| @@ -163,8 +162,9 @@
 | 
|    rtc::CritScope lock(&crit_);
 | 
|    RTC_DCHECK(frame);
 | 
|  
 | 
| -  if (stats_callback_)
 | 
| -    stats_callback_->OnCompleteFrame(frame->num_references == 0, frame->size());
 | 
| +  ++num_total_frames_;
 | 
| +  if (frame->num_references == 0)
 | 
| +    ++num_key_frames_;
 | 
|  
 | 
|    FrameKey key(frame->picture_id, frame->spatial_layer);
 | 
|    int last_continuous_picture_id =
 | 
| @@ -365,22 +365,28 @@
 | 
|  }
 | 
|  
 | 
|  void FrameBuffer::UpdateJitterDelay() {
 | 
| -  if (!stats_callback_)
 | 
| -    return;
 | 
| -
 | 
| -  int decode_ms;
 | 
| -  int max_decode_ms;
 | 
| -  int current_delay_ms;
 | 
| -  int target_delay_ms;
 | 
| -  int jitter_buffer_ms;
 | 
| -  int min_playout_delay_ms;
 | 
| -  int render_delay_ms;
 | 
| -  if (timing_->GetTimings(&decode_ms, &max_decode_ms, ¤t_delay_ms,
 | 
| -                          &target_delay_ms, &jitter_buffer_ms,
 | 
| -                          &min_playout_delay_ms, &render_delay_ms)) {
 | 
| -    stats_callback_->OnFrameBufferTimingsUpdated(
 | 
| -        decode_ms, max_decode_ms, current_delay_ms, target_delay_ms,
 | 
| -        jitter_buffer_ms, min_playout_delay_ms, render_delay_ms);
 | 
| +  int unused;
 | 
| +  int delay;
 | 
| +  timing_->GetTimings(&unused, &unused, &unused, &unused, &delay, &unused,
 | 
| +                      &unused);
 | 
| +
 | 
| +  accumulated_delay_ += delay;
 | 
| +  ++accumulated_delay_samples_;
 | 
| +}
 | 
| +
 | 
| +void FrameBuffer::UpdateHistograms() const {
 | 
| +  rtc::CritScope lock(&crit_);
 | 
| +  if (num_total_frames_ > 0) {
 | 
| +    int key_frames_permille = (static_cast<float>(num_key_frames_) * 1000.0f /
 | 
| +                                   static_cast<float>(num_total_frames_) +
 | 
| +                               0.5f);
 | 
| +    RTC_HISTOGRAM_COUNTS_1000("WebRTC.Video.KeyFramesReceivedInPermille",
 | 
| +                              key_frames_permille);
 | 
| +  }
 | 
| +
 | 
| +  if (accumulated_delay_samples_ > 0) {
 | 
| +    RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.JitterBufferDelayInMs",
 | 
| +                               accumulated_delay_ / accumulated_delay_samples_);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| 
 |