Index: remoting/host/video_frame_pump.h |
diff --git a/remoting/host/video_frame_pump.h b/remoting/host/video_frame_pump.h |
index 5bafa3e17fefe6e5af27dac1c39743538d948648..f4542cafc0939da6f347c4738509092c15db432e 100644 |
--- a/remoting/host/video_frame_pump.h |
+++ b/remoting/host/video_frame_pump.h |
@@ -8,6 +8,7 @@ |
#include "base/basictypes.h" |
#include "base/memory/ref_counted.h" |
#include "base/memory/scoped_ptr.h" |
+#include "base/memory/scoped_vector.h" |
#include "base/threading/thread_checker.h" |
#include "base/time/time.h" |
#include "base/timer/timer.h" |
@@ -82,9 +83,8 @@ class VideoFramePump : public webrtc::DesktopCapturer::Callback { |
// only affects capture scheduling and does not stop/start the capturer. |
void Pause(bool pause); |
- // Updates event timestamp from the last event received from the client. This |
- // value is sent back to the client for roundtrip latency estimates. |
- void SetLatestEventTimestamp(int64 latest_event_timestamp); |
+ // Called whenever input event is received. |
+ void OnInputEventReceived(int64_t event_timestamp); |
// Sets whether the video encoder should be requested to encode losslessly, |
// or to use a lossless color space (typically requiring higher bandwidth). |
@@ -96,6 +96,33 @@ class VideoFramePump : public webrtc::DesktopCapturer::Callback { |
} |
private: |
+ struct FrameTimestamps { |
+ FrameTimestamps(); |
+ ~FrameTimestamps(); |
+ |
+ // The following two fields are set only for one frame after each incoming |
+ // input event. |input_event_client_timestamp| is event timestamp |
+ // received from the client. |input_event_received_time| is local time when |
+ // the event was received. |
+ int64_t input_event_client_timestamp = -1; |
+ base::TimeTicks input_event_received_time; |
+ |
+ base::TimeTicks capture_started_time; |
+ base::TimeTicks capture_ended_time; |
+ base::TimeTicks encode_started_time; |
+ base::TimeTicks encode_ended_time; |
+ base::TimeTicks can_send_time; |
+ }; |
+ |
+ struct PacketWithTimestamps { |
+ PacketWithTimestamps(scoped_ptr<VideoPacket> packet, |
+ scoped_ptr<FrameTimestamps> timestamps); |
+ ~PacketWithTimestamps(); |
+ |
+ scoped_ptr<VideoPacket> packet; |
+ scoped_ptr<FrameTimestamps> timestamps; |
+ }; |
+ |
// webrtc::DesktopCapturer::Callback interface. |
webrtc::SharedMemory* CreateSharedMemory(size_t size) override; |
void OnCaptureCompleted(webrtc::DesktopFrame* frame) override; |
@@ -103,10 +130,21 @@ class VideoFramePump : public webrtc::DesktopCapturer::Callback { |
// Callback for CaptureScheduler. |
void CaptureNextFrame(); |
- // Sends encoded frame |
- void SendEncodedFrame(int64 latest_event_timestamp, |
- base::TimeTicks timestamp, |
- scoped_ptr<VideoPacket> packet); |
+ // Task running on the encoder thread to encode the |frame|. |
+ static scoped_ptr<PacketWithTimestamps> EncodeFrame( |
+ VideoEncoder* encoder, |
+ scoped_ptr<webrtc::DesktopFrame> frame, |
+ scoped_ptr<FrameTimestamps> timestamps); |
+ |
+ // Task called when a frame has finished encoding. |
+ void OnFrameEncoded(scoped_ptr<PacketWithTimestamps> packet); |
+ |
+ // Sends |packet| to the client. |
+ void SendPacket(scoped_ptr<PacketWithTimestamps> packet); |
+ |
+ // Helper called from SendPacket() to calculate timing fields in the |packet| |
+ // before sending it. |
+ void UpdateFrameTimers(VideoPacket* packet, FrameTimestamps* timestamps); |
// Callback passed to |video_stub_|. |
void OnVideoPacketSent(); |
@@ -137,8 +175,15 @@ class VideoFramePump : public webrtc::DesktopCapturer::Callback { |
// captured. |
CaptureScheduler capture_scheduler_; |
- // Number updated by the caller to trace performance. |
- int64 latest_event_timestamp_; |
+ // Timestamps for the frame to be captured next. |
+ scoped_ptr<FrameTimestamps> next_frame_timestamps_; |
+ |
+ // Timestamps for the frame that's being captured. |
+ scoped_ptr<FrameTimestamps> captured_frame_timestamps_; |
+ |
+ bool send_pending_ = false; |
+ |
+ ScopedVector<PacketWithTimestamps> pending_packets_; |
base::ThreadChecker thread_checker_; |