| Index: remoting/protocol/webrtc_video_stream.cc
 | 
| diff --git a/remoting/protocol/webrtc_video_stream.cc b/remoting/protocol/webrtc_video_stream.cc
 | 
| index 04a8aba6b30cb541a83deab26aab870a923826af..8c2478bf7b1fd0ce525d646143071d111bd8f423 100644
 | 
| --- a/remoting/protocol/webrtc_video_stream.cc
 | 
| +++ b/remoting/protocol/webrtc_video_stream.cc
 | 
| @@ -26,7 +26,7 @@
 | 
|  const char kStreamLabel[] = "screen_stream";
 | 
|  const char kVideoLabel[] = "screen_video";
 | 
|  
 | 
| -struct WebrtcVideoStream::FrameStats {
 | 
| +struct WebrtcVideoStream::FrameTimestamps {
 | 
|    // The following fields is not null only for one frame after each incoming
 | 
|    // input event.
 | 
|    InputEventTimestamps input_event_timestamps;
 | 
| @@ -36,13 +36,11 @@
 | 
|    base::TimeDelta capture_delay;
 | 
|    base::TimeTicks encode_started_time;
 | 
|    base::TimeTicks encode_ended_time;
 | 
| -
 | 
| -  uint32_t capturer_id = 0;
 | 
|  };
 | 
|  
 | 
| -struct WebrtcVideoStream::EncodedFrameWithStats {
 | 
| +struct WebrtcVideoStream::EncodedFrameWithTimestamps {
 | 
|    std::unique_ptr<WebrtcVideoEncoder::EncodedFrame> frame;
 | 
| -  std::unique_ptr<FrameStats> stats;
 | 
| +  std::unique_ptr<FrameTimestamps> timestamps;
 | 
|  };
 | 
|  
 | 
|  WebrtcVideoStream::WebrtcVideoStream()
 | 
| @@ -141,8 +139,8 @@
 | 
|      std::unique_ptr<webrtc::DesktopFrame> frame) {
 | 
|    DCHECK(thread_checker_.CalledOnValidThread());
 | 
|  
 | 
| -  captured_frame_stats_->capture_ended_time = base::TimeTicks::Now();
 | 
| -  captured_frame_stats_->capture_delay =
 | 
| +  captured_frame_timestamps_->capture_ended_time = base::TimeTicks::Now();
 | 
| +  captured_frame_timestamps_->capture_delay =
 | 
|        base::TimeDelta::FromMilliseconds(frame ? frame->capture_time_ms() : 0);
 | 
|  
 | 
|    WebrtcVideoEncoder::FrameParams frame_params;
 | 
| @@ -168,7 +166,7 @@
 | 
|        encode_task_runner_.get(), FROM_HERE,
 | 
|        base::Bind(&WebrtcVideoStream::EncodeFrame, encoder_.get(),
 | 
|                   base::Passed(std::move(frame)), frame_params,
 | 
| -                 base::Passed(std::move(captured_frame_stats_))),
 | 
| +                 base::Passed(std::move(captured_frame_timestamps_))),
 | 
|        base::Bind(&WebrtcVideoStream::OnFrameEncoded,
 | 
|                   weak_factory_.GetWeakPtr()));
 | 
|  }
 | 
| @@ -186,30 +184,29 @@
 | 
|  void WebrtcVideoStream::CaptureNextFrame() {
 | 
|    DCHECK(thread_checker_.CalledOnValidThread());
 | 
|  
 | 
| -  captured_frame_stats_.reset(new FrameStats());
 | 
| -  captured_frame_stats_->capture_started_time = base::TimeTicks::Now();
 | 
| -  captured_frame_stats_->input_event_timestamps =
 | 
| +  captured_frame_timestamps_.reset(new FrameTimestamps());
 | 
| +  captured_frame_timestamps_->capture_started_time = base::TimeTicks::Now();
 | 
| +  captured_frame_timestamps_->input_event_timestamps =
 | 
|        event_timestamps_source_->TakeLastEventTimestamps();
 | 
|  
 | 
|    capturer_->CaptureFrame();
 | 
|  }
 | 
|  
 | 
|  // static
 | 
| -WebrtcVideoStream::EncodedFrameWithStats WebrtcVideoStream::EncodeFrame(
 | 
| +WebrtcVideoStream::EncodedFrameWithTimestamps WebrtcVideoStream::EncodeFrame(
 | 
|      WebrtcVideoEncoder* encoder,
 | 
|      std::unique_ptr<webrtc::DesktopFrame> frame,
 | 
|      WebrtcVideoEncoder::FrameParams params,
 | 
| -    std::unique_ptr<WebrtcVideoStream::FrameStats> stats) {
 | 
| -  EncodedFrameWithStats result;
 | 
| -  result.stats = std::move(stats);
 | 
| -  result.stats->encode_started_time = base::TimeTicks::Now();
 | 
| +    std::unique_ptr<WebrtcVideoStream::FrameTimestamps> timestamps) {
 | 
| +  EncodedFrameWithTimestamps result;
 | 
| +  result.timestamps = std::move(timestamps);
 | 
| +  result.timestamps->encode_started_time = base::TimeTicks::Now();
 | 
|    result.frame = encoder->Encode(frame.get(), params);
 | 
| -  result.stats->encode_ended_time = base::TimeTicks::Now();
 | 
| -  result.stats->capturer_id = frame->capturer_id();
 | 
| +  result.timestamps->encode_ended_time = base::TimeTicks::Now();
 | 
|    return result;
 | 
|  }
 | 
|  
 | 
| -void WebrtcVideoStream::OnFrameEncoded(EncodedFrameWithStats frame) {
 | 
| +void WebrtcVideoStream::OnFrameEncoded(EncodedFrameWithTimestamps frame) {
 | 
|    DCHECK(thread_checker_.CalledOnValidThread());
 | 
|  
 | 
|    HostFrameStats stats;
 | 
| @@ -221,7 +218,7 @@
 | 
|  
 | 
|    webrtc::EncodedImageCallback::Result result =
 | 
|        webrtc_transport_->video_encoder_factory()->SendEncodedFrame(
 | 
| -          *frame.frame, frame.stats->capture_started_time);
 | 
| +          *frame.frame, frame.timestamps->capture_started_time);
 | 
|    if (result.error != webrtc::EncodedImageCallback::Result::OK) {
 | 
|      // TODO(sergeyu): Stop the stream.
 | 
|      LOG(ERROR) << "Failed to send video frame.";
 | 
| @@ -232,28 +229,26 @@
 | 
|    if (video_stats_dispatcher_.is_connected()) {
 | 
|      stats.frame_size = frame.frame ? frame.frame->data.size() : 0;
 | 
|  
 | 
| -    if (!frame.stats->input_event_timestamps.is_null()) {
 | 
| +    if (!frame.timestamps->input_event_timestamps.is_null()) {
 | 
|        stats.capture_pending_delay =
 | 
| -          frame.stats->capture_started_time -
 | 
| -          frame.stats->input_event_timestamps.host_timestamp;
 | 
| +          frame.timestamps->capture_started_time -
 | 
| +          frame.timestamps->input_event_timestamps.host_timestamp;
 | 
|        stats.latest_event_timestamp =
 | 
| -          frame.stats->input_event_timestamps.client_timestamp;
 | 
| +          frame.timestamps->input_event_timestamps.client_timestamp;
 | 
|      }
 | 
|  
 | 
| -    stats.capture_delay = frame.stats->capture_delay;
 | 
| +    stats.capture_delay = frame.timestamps->capture_delay;
 | 
|  
 | 
|      // Total overhead time for IPC and threading when capturing frames.
 | 
| -    stats.capture_overhead_delay = (frame.stats->capture_ended_time -
 | 
| -                                    frame.stats->capture_started_time) -
 | 
| +    stats.capture_overhead_delay = (frame.timestamps->capture_ended_time -
 | 
| +                                    frame.timestamps->capture_started_time) -
 | 
|                                     stats.capture_delay;
 | 
|  
 | 
| -    stats.encode_pending_delay = frame.stats->encode_started_time -
 | 
| -                                 frame.stats->capture_ended_time;
 | 
| -
 | 
| -    stats.encode_delay = frame.stats->encode_ended_time -
 | 
| -                         frame.stats->encode_started_time;
 | 
| -
 | 
| -    stats.capturer_id = frame.stats->capturer_id;
 | 
| +    stats.encode_pending_delay = frame.timestamps->encode_started_time -
 | 
| +                                 frame.timestamps->capture_ended_time;
 | 
| +
 | 
| +    stats.encode_delay = frame.timestamps->encode_ended_time -
 | 
| +                         frame.timestamps->encode_started_time;
 | 
|  
 | 
|      video_stats_dispatcher_.OnVideoFrameStats(result.frame_id, stats);
 | 
|    }
 | 
| 
 |