diff options
author | hclam@chromium.org <hclam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-06 21:19:29 +0000 |
---|---|---|
committer | hclam@chromium.org <hclam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-06 21:19:29 +0000 |
commit | c0f7082fdc8b239027b196a777180899bf7f5ce3 (patch) | |
tree | 1b4ff8c2ca9049ef75b80f5f7c1bb7f0762de1c7 /remoting/host/screen_recorder.cc | |
parent | 9d85fa39bdf901eea6dc70f804e3d2a1001d07ab (diff) | |
download | chromium_src-c0f7082fdc8b239027b196a777180899bf7f5ce3.zip chromium_src-c0f7082fdc8b239027b196a777180899bf7f5ce3.tar.gz chromium_src-c0f7082fdc8b239027b196a777180899bf7f5ce3.tar.bz2 |
Chromoting to report roundtrip latency
Doing so by sending a sequence number, essentially the timestamp in every
envet message. Capturer at the host will pick up the latest sequence number
and pass it through the pipeline. Client will then receive it and determine
the latency.
This roundtrip latency number however doesn't include time in decoding and
rendering.
BUG=None
TEST=None
Review URL: http://codereview.chromium.org/6792038
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@84504 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'remoting/host/screen_recorder.cc')
-rw-r--r-- | remoting/host/screen_recorder.cc | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/remoting/host/screen_recorder.cc b/remoting/host/screen_recorder.cc index 37b9c06..4e7355c 100644 --- a/remoting/host/screen_recorder.cc +++ b/remoting/host/screen_recorder.cc @@ -50,7 +50,8 @@ ScreenRecorder::ScreenRecorder( network_stopped_(false), recordings_(0), frame_skipped_(false), - max_rate_(kDefaultCaptureRate) { + max_rate_(kDefaultCaptureRate), + sequence_number_(0) { DCHECK(capture_loop_); DCHECK(encode_loop_); DCHECK(network_loop_); @@ -103,6 +104,19 @@ void ScreenRecorder::RemoveAllConnections() { NewTracedMethod(this, &ScreenRecorder::DoRemoveAllClients)); } +void ScreenRecorder::UpdateSequenceNumber(int64 sequence_number) { + // Sequence number is used and written only on the capture thread. + if (MessageLoop::current() != capture_loop_) { + capture_loop_->PostTask( + FROM_HERE, + NewRunnableMethod(this, &ScreenRecorder::UpdateSequenceNumber, + sequence_number)); + return; + } + + sequence_number_ = sequence_number; +} + // Private accessors ----------------------------------------------------------- Capturer* ScreenRecorder::capturer() { @@ -225,6 +239,14 @@ void ScreenRecorder::CaptureDoneCallback( int capture_time = static_cast<int>( (base::Time::Now() - capture_start_time_).InMilliseconds()); capture_data->set_capture_time_ms(capture_time); + + // The best way to get this value is by binding the sequence number to + // the callback when calling CaptureInvalidRects(). However the callback + // system doesn't allow this. Reading from the member variable is + // accurate as long as capture is synchronous as the following statement + // will obtain the most recent sequence number received. + capture_data->set_client_sequence_number(sequence_number_); + encode_loop_->PostTask( FROM_HERE, NewTracedMethod(this, &ScreenRecorder::DoEncode, capture_data)); |