| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 "content/browser/renderer_host/media/desktop_capture_device.h" | 5 #include "content/browser/renderer_host/media/desktop_capture_device.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/sequenced_task_runner.h" | 8 #include "base/sequenced_task_runner.h" |
| 9 #include "base/synchronization/waitable_event.h" | 9 #include "base/synchronization/waitable_event.h" |
| 10 #include "base/test/test_timeouts.h" | 10 #include "base/test/test_timeouts.h" |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 | 40 |
| 41 class MockDeviceClient : public media::VideoCaptureDevice::Client { | 41 class MockDeviceClient : public media::VideoCaptureDevice::Client { |
| 42 public: | 42 public: |
| 43 MOCK_METHOD2(ReserveOutputBuffer, | 43 MOCK_METHOD2(ReserveOutputBuffer, |
| 44 scoped_refptr<Buffer>(media::VideoFrame::Format format, | 44 scoped_refptr<Buffer>(media::VideoFrame::Format format, |
| 45 const gfx::Size& dimensions)); | 45 const gfx::Size& dimensions)); |
| 46 MOCK_METHOD0(OnError, void()); | 46 MOCK_METHOD0(OnError, void()); |
| 47 MOCK_METHOD5(OnIncomingCapturedFrame, | 47 MOCK_METHOD5(OnIncomingCapturedFrame, |
| 48 void(const uint8* data, | 48 void(const uint8* data, |
| 49 int length, | 49 int length, |
| 50 base::TimeTicks timestamp, | 50 const media::VideoCaptureFormat& frame_format, |
| 51 int rotation, | 51 int rotation, |
| 52 const media::VideoCaptureFormat& frame_format)); | 52 base::TimeTicks timestamp)); |
| 53 MOCK_METHOD5(OnIncomingCapturedBuffer, | 53 MOCK_METHOD4(OnIncomingCapturedVideoFrame, |
| 54 void(const scoped_refptr<Buffer>& buffer, | 54 void(const scoped_refptr<Buffer>& buffer, |
| 55 media::VideoFrame::Format format, | 55 const media::VideoCaptureFormat& buffer_format, |
| 56 const gfx::Size& dimensions, | 56 const scoped_refptr<media::VideoFrame>& frame, |
| 57 base::TimeTicks timestamp, | 57 base::TimeTicks timestamp)); |
| 58 int frame_rate)); | |
| 59 }; | 58 }; |
| 60 | 59 |
| 61 // DesktopFrame wrapper that flips wrapped frame upside down by inverting | 60 // DesktopFrame wrapper that flips wrapped frame upside down by inverting |
| 62 // stride. | 61 // stride. |
| 63 class InvertedDesktopFrame : public webrtc::DesktopFrame { | 62 class InvertedDesktopFrame : public webrtc::DesktopFrame { |
| 64 public: | 63 public: |
| 65 // Takes ownership of |frame|. | 64 // Takes ownership of |frame|. |
| 66 InvertedDesktopFrame(webrtc::DesktopFrame* frame) | 65 InvertedDesktopFrame(webrtc::DesktopFrame* frame) |
| 67 : webrtc::DesktopFrame( | 66 : webrtc::DesktopFrame( |
| 68 frame->size(), -frame->stride(), | 67 frame->size(), -frame->stride(), |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 webrtc::ScreenCapturer::Create()); | 149 webrtc::ScreenCapturer::Create()); |
| 151 DesktopCaptureDevice capture_device( | 150 DesktopCaptureDevice capture_device( |
| 152 worker_pool_->GetSequencedTaskRunner(worker_pool_->GetSequenceToken()), | 151 worker_pool_->GetSequencedTaskRunner(worker_pool_->GetSequenceToken()), |
| 153 capturer.Pass()); | 152 capturer.Pass()); |
| 154 media::VideoCaptureFormat format; | 153 media::VideoCaptureFormat format; |
| 155 base::WaitableEvent done_event(false, false); | 154 base::WaitableEvent done_event(false, false); |
| 156 int frame_size; | 155 int frame_size; |
| 157 | 156 |
| 158 scoped_ptr<MockDeviceClient> client(new MockDeviceClient()); | 157 scoped_ptr<MockDeviceClient> client(new MockDeviceClient()); |
| 159 EXPECT_CALL(*client, OnError()).Times(0); | 158 EXPECT_CALL(*client, OnError()).Times(0); |
| 160 EXPECT_CALL(*client, OnIncomingCapturedFrame(_, _, _, _, _)) | 159 EXPECT_CALL(*client, OnIncomingCapturedFrame(_, _, _, _, _)).WillRepeatedly( |
| 161 .WillRepeatedly( | 160 DoAll(SaveArg<1>(&frame_size), |
| 162 DoAll(SaveArg<1>(&frame_size), | 161 SaveArg<2>(&format), |
| 163 SaveArg<4>(&format), | 162 InvokeWithoutArgs(&done_event, &base::WaitableEvent::Signal))); |
| 164 InvokeWithoutArgs(&done_event, &base::WaitableEvent::Signal))); | |
| 165 | 163 |
| 166 media::VideoCaptureParams capture_params; | 164 media::VideoCaptureParams capture_params; |
| 167 capture_params.requested_format.frame_size.SetSize(640, 480); | 165 capture_params.requested_format.frame_size.SetSize(640, 480); |
| 168 capture_params.requested_format.frame_rate = kFrameRate; | 166 capture_params.requested_format.frame_rate = kFrameRate; |
| 169 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; | 167 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; |
| 170 capture_params.allow_resolution_change = false; | 168 capture_params.allow_resolution_change = false; |
| 171 capture_device.AllocateAndStart( | 169 capture_device.AllocateAndStart( |
| 172 capture_params, client.PassAs<media::VideoCaptureDevice::Client>()); | 170 capture_params, client.PassAs<media::VideoCaptureDevice::Client>()); |
| 173 EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); | 171 EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); |
| 174 capture_device.StopAndDeAllocate(); | 172 capture_device.StopAndDeAllocate(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 190 DesktopCaptureDevice capture_device( | 188 DesktopCaptureDevice capture_device( |
| 191 worker_pool_->GetSequencedTaskRunner(worker_pool_->GetSequenceToken()), | 189 worker_pool_->GetSequencedTaskRunner(worker_pool_->GetSequenceToken()), |
| 192 scoped_ptr<webrtc::DesktopCapturer>(mock_capturer)); | 190 scoped_ptr<webrtc::DesktopCapturer>(mock_capturer)); |
| 193 | 191 |
| 194 media::VideoCaptureFormat format; | 192 media::VideoCaptureFormat format; |
| 195 base::WaitableEvent done_event(false, false); | 193 base::WaitableEvent done_event(false, false); |
| 196 int frame_size; | 194 int frame_size; |
| 197 | 195 |
| 198 scoped_ptr<MockDeviceClient> client(new MockDeviceClient()); | 196 scoped_ptr<MockDeviceClient> client(new MockDeviceClient()); |
| 199 EXPECT_CALL(*client, OnError()).Times(0); | 197 EXPECT_CALL(*client, OnError()).Times(0); |
| 200 EXPECT_CALL(*client, OnIncomingCapturedFrame(_, _, _, _, _)) | 198 EXPECT_CALL(*client, OnIncomingCapturedFrame(_, _, _, _, _)).WillRepeatedly( |
| 201 .WillRepeatedly( | 199 DoAll(SaveArg<1>(&frame_size), |
| 202 DoAll(SaveArg<1>(&frame_size), | 200 SaveArg<2>(&format), |
| 203 SaveArg<4>(&format), | 201 InvokeWithoutArgs(&done_event, &base::WaitableEvent::Signal))); |
| 204 InvokeWithoutArgs(&done_event, &base::WaitableEvent::Signal))); | |
| 205 | 202 |
| 206 media::VideoCaptureParams capture_params; | 203 media::VideoCaptureParams capture_params; |
| 207 capture_params.requested_format.frame_size.SetSize(kTestFrameWidth1, | 204 capture_params.requested_format.frame_size.SetSize(kTestFrameWidth1, |
| 208 kTestFrameHeight1); | 205 kTestFrameHeight1); |
| 209 capture_params.requested_format.frame_rate = kFrameRate; | 206 capture_params.requested_format.frame_rate = kFrameRate; |
| 210 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; | 207 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; |
| 211 capture_params.allow_resolution_change = false; | 208 capture_params.allow_resolution_change = false; |
| 212 | 209 |
| 213 capture_device.AllocateAndStart( | 210 capture_device.AllocateAndStart( |
| 214 capture_params, client.PassAs<media::VideoCaptureDevice::Client>()); | 211 capture_params, client.PassAs<media::VideoCaptureDevice::Client>()); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 237 | 234 |
| 238 DesktopCaptureDevice capture_device( | 235 DesktopCaptureDevice capture_device( |
| 239 worker_pool_->GetSequencedTaskRunner(worker_pool_->GetSequenceToken()), | 236 worker_pool_->GetSequencedTaskRunner(worker_pool_->GetSequenceToken()), |
| 240 scoped_ptr<webrtc::DesktopCapturer>(mock_capturer)); | 237 scoped_ptr<webrtc::DesktopCapturer>(mock_capturer)); |
| 241 | 238 |
| 242 media::VideoCaptureFormat format; | 239 media::VideoCaptureFormat format; |
| 243 base::WaitableEvent done_event(false, false); | 240 base::WaitableEvent done_event(false, false); |
| 244 | 241 |
| 245 scoped_ptr<MockDeviceClient> client(new MockDeviceClient()); | 242 scoped_ptr<MockDeviceClient> client(new MockDeviceClient()); |
| 246 EXPECT_CALL(*client, OnError()).Times(0); | 243 EXPECT_CALL(*client, OnError()).Times(0); |
| 247 EXPECT_CALL(*client, OnIncomingCapturedFrame(_, _, _, _, _)) | 244 EXPECT_CALL(*client, OnIncomingCapturedFrame(_, _, _, _, _)).WillRepeatedly( |
| 248 .WillRepeatedly( | 245 DoAll(SaveArg<2>(&format), |
| 249 DoAll(SaveArg<4>(&format), | 246 InvokeWithoutArgs(&done_event, &base::WaitableEvent::Signal))); |
| 250 InvokeWithoutArgs(&done_event, &base::WaitableEvent::Signal))); | |
| 251 | 247 |
| 252 media::VideoCaptureParams capture_params; | 248 media::VideoCaptureParams capture_params; |
| 253 capture_params.requested_format.frame_size.SetSize(kTestFrameWidth2, | 249 capture_params.requested_format.frame_size.SetSize(kTestFrameWidth2, |
| 254 kTestFrameHeight2); | 250 kTestFrameHeight2); |
| 255 capture_params.requested_format.frame_rate = kFrameRate; | 251 capture_params.requested_format.frame_rate = kFrameRate; |
| 256 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; | 252 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; |
| 257 capture_params.allow_resolution_change = false; | 253 capture_params.allow_resolution_change = false; |
| 258 | 254 |
| 259 capture_device.AllocateAndStart( | 255 capture_device.AllocateAndStart( |
| 260 capture_params, client.PassAs<media::VideoCaptureDevice::Client>()); | 256 capture_params, client.PassAs<media::VideoCaptureDevice::Client>()); |
| 261 | 257 |
| 262 // Capture at least three frames, to ensure that the source frame size has | 258 // Capture at least three frames, to ensure that the source frame size has |
| 263 // changed at least twice while capturing. | 259 // changed at least twice while capturing. |
| 264 EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); | 260 EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); |
| 265 done_event.Reset(); | 261 done_event.Reset(); |
| 266 EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); | 262 EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); |
| 267 done_event.Reset(); | 263 done_event.Reset(); |
| 268 EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); | 264 EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); |
| 269 | 265 |
| 270 capture_device.StopAndDeAllocate(); | 266 capture_device.StopAndDeAllocate(); |
| 271 | 267 |
| 272 EXPECT_EQ(kTestFrameWidth1, format.frame_size.width()); | 268 EXPECT_EQ(kTestFrameWidth1, format.frame_size.width()); |
| 273 EXPECT_EQ(kTestFrameHeight1, format.frame_size.height()); | 269 EXPECT_EQ(kTestFrameHeight1, format.frame_size.height()); |
| 274 EXPECT_EQ(kFrameRate, format.frame_rate); | 270 EXPECT_EQ(kFrameRate, format.frame_rate); |
| 275 EXPECT_EQ(media::PIXEL_FORMAT_ARGB, format.pixel_format); | 271 EXPECT_EQ(media::PIXEL_FORMAT_ARGB, format.pixel_format); |
| 276 worker_pool_->FlushForTesting(); | 272 worker_pool_->FlushForTesting(); |
| 277 } | 273 } |
| 278 | 274 |
| 279 } // namespace content | 275 } // namespace content |
| OLD | NEW |