diff options
author | hclam@chromium.org <hclam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-09 23:07:15 +0000 |
---|---|---|
committer | hclam@chromium.org <hclam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-09 23:07:15 +0000 |
commit | 0544b7fab8cd96a0b2d66bbf7f5375aaebe31289 (patch) | |
tree | 5c5e6ac0def2b59c7263bed68d95f3461bfaee3b /remoting/host | |
parent | c267f4581de64ec639fee62c63172c52de87a5ba (diff) | |
download | chromium_src-0544b7fab8cd96a0b2d66bbf7f5375aaebe31289.zip chromium_src-0544b7fab8cd96a0b2d66bbf7f5375aaebe31289.tar.gz chromium_src-0544b7fab8cd96a0b2d66bbf7f5375aaebe31289.tar.bz2 |
Invalidate fullscreen when a new client connects to chromoting host
BUG=72252
TEST=Reconnect and screen looks right
Review URL: http://codereview.chromium.org/6469004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@74365 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'remoting/host')
-rw-r--r-- | remoting/host/capturer.cc | 8 | ||||
-rw-r--r-- | remoting/host/capturer.h | 4 | ||||
-rw-r--r-- | remoting/host/capturer_gdi.cc | 4 | ||||
-rw-r--r-- | remoting/host/capturer_linux.cc | 3 | ||||
-rw-r--r-- | remoting/host/screen_recorder.cc | 13 | ||||
-rw-r--r-- | remoting/host/screen_recorder.h | 1 | ||||
-rw-r--r-- | remoting/host/screen_recorder_unittest.cc | 2 |
7 files changed, 31 insertions, 4 deletions
diff --git a/remoting/host/capturer.cc b/remoting/host/capturer.cc index cf1bac7..59854f1 100644 --- a/remoting/host/capturer.cc +++ b/remoting/host/capturer.cc @@ -85,4 +85,12 @@ void Capturer::FinishCapture(scoped_refptr<CaptureData> data, delete callback; } +bool Capturer::IsCaptureFullScreen() { + base::AutoLock auto_inval_rects_lock(inval_rects_lock_); + return inval_rects_.size() == 1u && + inval_rects_.begin()->x() == 0 && inval_rects_.begin()->y() == 0 && + inval_rects_.begin()->width() == width_ && + inval_rects_.begin()->height() == height_; +} + } // namespace remoting diff --git a/remoting/host/capturer.h b/remoting/host/capturer.h index 1282ebe..a769abc 100644 --- a/remoting/host/capturer.h +++ b/remoting/host/capturer.h @@ -114,6 +114,10 @@ class Capturer { void FinishCapture(scoped_refptr<CaptureData> data, CaptureCompletedCallback* callback); + // Called by subclasses' CalculateInvalidRects() method to check if + // InvalidateFullScreen() was called by user. + bool IsCaptureFullScreen(); + // Number of screen buffers. static const int kNumBuffers = 2; diff --git a/remoting/host/capturer_gdi.cc b/remoting/host/capturer_gdi.cc index c405f3f..ab325321 100644 --- a/remoting/host/capturer_gdi.cc +++ b/remoting/host/capturer_gdi.cc @@ -88,9 +88,11 @@ void CapturerGdi::ScreenConfigurationChanged() { } void CapturerGdi::CalculateInvalidRects() { - ClearInvalidRects(); CaptureImage(); + if (IsCaptureFullScreen()) + capture_fullscreen_ = true; + if (capture_fullscreen_) { InvalidateFullScreen(); } else { diff --git a/remoting/host/capturer_linux.cc b/remoting/host/capturer_linux.cc index 8c1e74c..b43158a 100644 --- a/remoting/host/capturer_linux.cc +++ b/remoting/host/capturer_linux.cc @@ -202,6 +202,9 @@ bool CapturerLinuxPimpl::Init() { } void CapturerLinuxPimpl::CalculateInvalidRects() { + if (capturer_->IsCaptureFullScreen()) + capture_fullscreen_ = true; + // TODO(ajwong): The capture_fullscreen_ logic here is very ugly. Refactor. // Find the number of events that are outstanding "now." We don't just loop diff --git a/remoting/host/screen_recorder.cc b/remoting/host/screen_recorder.cc index d4ba2cf..b7d4d8f 100644 --- a/remoting/host/screen_recorder.cc +++ b/remoting/host/screen_recorder.cc @@ -79,6 +79,10 @@ void ScreenRecorder::AddConnection( scoped_refptr<ConnectionToClient> connection) { ScopedTracer tracer("AddConnection"); + capture_loop_->PostTask( + FROM_HERE, + NewRunnableMethod(this, &ScreenRecorder::DoInvalidateFullScreen)); + // Add the client to the list so it can receive update stream. network_loop_->PostTask( FROM_HERE, @@ -242,6 +246,12 @@ void ScreenRecorder::DoFinishOneRecording() { DoCapture(); } +void ScreenRecorder::DoInvalidateFullScreen() { + DCHECK_EQ(capture_loop_, MessageLoop::current()); + + capturer_->InvalidateFullScreen(); +} + // Network thread -------------------------------------------------------------- void ScreenRecorder::DoSendVideoPacket(VideoPacket* packet) { @@ -291,7 +301,6 @@ void ScreenRecorder::DoAddConnection( scoped_refptr<ConnectionToClient> connection) { DCHECK_EQ(network_loop_, MessageLoop::current()); - // TODO(hclam): Force a full frame for next encode. connections_.push_back(connection); } @@ -299,7 +308,6 @@ void ScreenRecorder::DoRemoveClient( scoped_refptr<ConnectionToClient> connection) { DCHECK_EQ(network_loop_, MessageLoop::current()); - // TODO(hclam): Is it correct to do to a scoped_refptr? ConnectionToClientList::iterator it = std::find(connections_.begin(), connections_.end(), connection); if (it != connections_.end()) { @@ -345,7 +353,6 @@ void ScreenRecorder::DoEncode( return; } - // TODO(hclam): Invalidate the full screen if there is a new connection added. TraceContext::tracer()->PrintString("Encode start"); encoder()->Encode( capture_data, false, diff --git a/remoting/host/screen_recorder.h b/remoting/host/screen_recorder.h index cddeb56..2fa0fdc 100644 --- a/remoting/host/screen_recorder.h +++ b/remoting/host/screen_recorder.h @@ -121,6 +121,7 @@ class ScreenRecorder : public base::RefCountedThreadSafe<ScreenRecorder> { void DoCapture(); void CaptureDoneCallback(scoped_refptr<CaptureData> capture_data); void DoFinishOneRecording(); + void DoInvalidateFullScreen(); // Network thread ----------------------------------------------------------- diff --git a/remoting/host/screen_recorder_unittest.cc b/remoting/host/screen_recorder_unittest.cc index cbe3d87..412ce6d 100644 --- a/remoting/host/screen_recorder_unittest.cc +++ b/remoting/host/screen_recorder_unittest.cc @@ -109,6 +109,7 @@ TEST_F(ScreenRecorderTest, OneRecordCycle) { kHeight, kFormat)); EXPECT_CALL(capturer_, width()).WillRepeatedly(Return(kWidth)); EXPECT_CALL(capturer_, height()).WillRepeatedly(Return(kHeight)); + EXPECT_CALL(capturer_, InvalidateFullScreen()); // First the capturer is called. EXPECT_CALL(capturer_, CaptureInvalidRects(NotNull())) @@ -159,6 +160,7 @@ TEST_F(ScreenRecorderTest, StartAndStop) { kHeight, kFormat)); EXPECT_CALL(capturer_, width()).WillRepeatedly(Return(kWidth)); EXPECT_CALL(capturer_, height()).WillRepeatedly(Return(kHeight)); + EXPECT_CALL(capturer_, InvalidateFullScreen()); // First the capturer is called. EXPECT_CALL(capturer_, CaptureInvalidRects(NotNull())) |