| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "remoting/host/cast_video_capturer_adapter.h" | 5 #include "remoting/host/cast_video_capturer_adapter.h" |
| 6 | 6 |
| 7 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" | 7 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" |
| 8 | 8 |
| 9 namespace remoting { | 9 namespace remoting { |
| 10 | 10 |
| 11 // Number of frames to be captured per second. | 11 // Number of frames to be captured per second. |
| 12 const int kFramesPerSec = 10; | 12 const int kFramesPerSec = 10; |
| 13 | 13 |
| 14 CastVideoCapturerAdapter::CastVideoCapturerAdapter( | 14 CastVideoCapturerAdapter::CastVideoCapturerAdapter( |
| 15 scoped_ptr<webrtc::ScreenCapturer> capturer) | 15 scoped_ptr<webrtc::DesktopCapturer> capturer) |
| 16 : screen_capturer_(capturer.Pass()) { | 16 : desktop_capturer_(capturer.Pass()) { |
| 17 DCHECK(screen_capturer_); | 17 DCHECK(desktop_capturer_); |
| 18 | 18 |
| 19 thread_checker_.DetachFromThread(); | 19 thread_checker_.DetachFromThread(); |
| 20 | 20 |
| 21 // Disable video adaptation since we don't intend to use it. | 21 // Disable video adaptation since we don't intend to use it. |
| 22 set_enable_video_adapter(false); | 22 set_enable_video_adapter(false); |
| 23 } | 23 } |
| 24 | 24 |
| 25 CastVideoCapturerAdapter::~CastVideoCapturerAdapter() { | 25 CastVideoCapturerAdapter::~CastVideoCapturerAdapter() { |
| 26 DCHECK(!capture_timer_); | 26 DCHECK(!capture_timer_); |
| 27 } | 27 } |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 best_format->interval = FPS_TO_INTERVAL(kFramesPerSec); | 73 best_format->interval = FPS_TO_INTERVAL(kFramesPerSec); |
| 74 return true; | 74 return true; |
| 75 } | 75 } |
| 76 | 76 |
| 77 cricket::CaptureState CastVideoCapturerAdapter::Start( | 77 cricket::CaptureState CastVideoCapturerAdapter::Start( |
| 78 const cricket::VideoFormat& capture_format) { | 78 const cricket::VideoFormat& capture_format) { |
| 79 DCHECK(thread_checker_.CalledOnValidThread()); | 79 DCHECK(thread_checker_.CalledOnValidThread()); |
| 80 DCHECK(!capture_timer_); | 80 DCHECK(!capture_timer_); |
| 81 DCHECK_EQ(capture_format.fourcc, (static_cast<uint32>(cricket::FOURCC_ARGB))); | 81 DCHECK_EQ(capture_format.fourcc, (static_cast<uint32>(cricket::FOURCC_ARGB))); |
| 82 | 82 |
| 83 if (!screen_capturer_) { | 83 if (!desktop_capturer_) { |
| 84 VLOG(1) << "CastVideoCapturerAdapter failed to start."; | 84 VLOG(1) << "CastVideoCapturerAdapter failed to start."; |
| 85 return cricket::CS_FAILED; | 85 return cricket::CS_FAILED; |
| 86 } | 86 } |
| 87 | 87 |
| 88 // This is required to tell the cricket::VideoCapturer base class what the | 88 // This is required to tell the cricket::VideoCapturer base class what the |
| 89 // capture format will be. | 89 // capture format will be. |
| 90 SetCaptureFormat(&capture_format); | 90 SetCaptureFormat(&capture_format); |
| 91 | 91 |
| 92 screen_capturer_->Start(this); | 92 desktop_capturer_->Start(this); |
| 93 | 93 |
| 94 // Save the Start() time of |screen_capturer_|. This will be used | 94 // Save the Start() time of |desktop_capturer_|. This will be used |
| 95 // to estimate the creation time of the frame source, to set the elapsed_time | 95 // to estimate the creation time of the frame source, to set the elapsed_time |
| 96 // of future CapturedFrames in OnCaptureCompleted(). | 96 // of future CapturedFrames in OnCaptureCompleted(). |
| 97 start_time_ = base::TimeTicks::Now(); | 97 start_time_ = base::TimeTicks::Now(); |
| 98 capture_timer_.reset(new base::RepeatingTimer<CastVideoCapturerAdapter>()); | 98 capture_timer_.reset(new base::RepeatingTimer<CastVideoCapturerAdapter>()); |
| 99 capture_timer_->Start(FROM_HERE, | 99 capture_timer_->Start(FROM_HERE, |
| 100 base::TimeDelta::FromMicroseconds( | 100 base::TimeDelta::FromMicroseconds( |
| 101 GetCaptureFormat()->interval / | 101 GetCaptureFormat()->interval / |
| 102 (base::Time::kNanosecondsPerMicrosecond)), | 102 (base::Time::kNanosecondsPerMicrosecond)), |
| 103 this, | 103 this, |
| 104 &CastVideoCapturerAdapter::CaptureNextFrame); | 104 &CastVideoCapturerAdapter::CaptureNextFrame); |
| 105 | 105 |
| 106 return cricket::CS_RUNNING; | 106 return cricket::CS_RUNNING; |
| 107 } | 107 } |
| 108 | 108 |
| 109 // Similar to the base class implementation with some important differences: | 109 // Similar to the base class implementation with some important differences: |
| 110 // 1. Does not call either Stop() or Start(), as those would affect the state of | 110 // 1. Does not call either Stop() or Start(), as those would affect the state of |
| 111 // |screen_capturer_|. | 111 // |desktop_capturer_|. |
| 112 // 2. Does not support unpausing after stopping the capturer. It is unclear | 112 // 2. Does not support unpausing after stopping the capturer. It is unclear |
| 113 // if that flow needs to be supported. | 113 // if that flow needs to be supported. |
| 114 bool CastVideoCapturerAdapter::Pause(bool pause) { | 114 bool CastVideoCapturerAdapter::Pause(bool pause) { |
| 115 DCHECK(thread_checker_.CalledOnValidThread()); | 115 DCHECK(thread_checker_.CalledOnValidThread()); |
| 116 | 116 |
| 117 if (pause) { | 117 if (pause) { |
| 118 if (capture_state() == cricket::CS_PAUSED) | 118 if (capture_state() == cricket::CS_PAUSED) |
| 119 return true; | 119 return true; |
| 120 | 120 |
| 121 bool running = capture_state() == cricket::CS_STARTING || | 121 bool running = capture_state() == cricket::CS_STARTING || |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 187 return false; | 187 return false; |
| 188 fourccs->push_back(cricket::FOURCC_ARGB); | 188 fourccs->push_back(cricket::FOURCC_ARGB); |
| 189 return true; | 189 return true; |
| 190 } | 190 } |
| 191 | 191 |
| 192 void CastVideoCapturerAdapter::CaptureNextFrame() { | 192 void CastVideoCapturerAdapter::CaptureNextFrame() { |
| 193 // If we are paused, then don't capture. | 193 // If we are paused, then don't capture. |
| 194 if (!IsRunning()) | 194 if (!IsRunning()) |
| 195 return; | 195 return; |
| 196 | 196 |
| 197 screen_capturer_->Capture(webrtc::DesktopRegion()); | 197 desktop_capturer_->Capture(webrtc::DesktopRegion()); |
| 198 } | 198 } |
| 199 | 199 |
| 200 } // namespace remoting | 200 } // namespace remoting |
| 201 | 201 |
| OLD | NEW |