| 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 26 matching lines...) Expand all Loading... |
| 37 const int kTestFrameHeight2 = 150; | 37 const int kTestFrameHeight2 = 150; |
| 38 | 38 |
| 39 const int kFrameRate = 30; | 39 const int kFrameRate = 30; |
| 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_METHOD1(OnError, void(const std::string& reason)); | 46 MOCK_METHOD1(OnError, void(const std::string& reason)); |
| 47 MOCK_METHOD5(OnIncomingCapturedFrame, | 47 MOCK_METHOD5(OnIncomingCapturedData, |
| 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 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 webrtc::ScreenCapturer::Create()); | 157 webrtc::ScreenCapturer::Create()); |
| 159 DesktopCaptureDevice capture_device( | 158 DesktopCaptureDevice capture_device( |
| 160 worker_pool_->GetSequencedTaskRunner(worker_pool_->GetSequenceToken()), | 159 worker_pool_->GetSequencedTaskRunner(worker_pool_->GetSequenceToken()), |
| 161 capturer.Pass()); | 160 capturer.Pass()); |
| 162 media::VideoCaptureFormat format; | 161 media::VideoCaptureFormat format; |
| 163 base::WaitableEvent done_event(false, false); | 162 base::WaitableEvent done_event(false, false); |
| 164 int frame_size; | 163 int frame_size; |
| 165 | 164 |
| 166 scoped_ptr<MockDeviceClient> client(new MockDeviceClient()); | 165 scoped_ptr<MockDeviceClient> client(new MockDeviceClient()); |
| 167 EXPECT_CALL(*client, OnError(_)).Times(0); | 166 EXPECT_CALL(*client, OnError(_)).Times(0); |
| 168 EXPECT_CALL(*client, OnIncomingCapturedFrame(_, _, _, _, _)) | 167 EXPECT_CALL(*client, OnIncomingCapturedData(_, _, _, _, _)).WillRepeatedly( |
| 169 .WillRepeatedly( | 168 DoAll(SaveArg<1>(&frame_size), |
| 170 DoAll(SaveArg<1>(&frame_size), | 169 SaveArg<2>(&format), |
| 171 SaveArg<4>(&format), | 170 InvokeWithoutArgs(&done_event, &base::WaitableEvent::Signal))); |
| 172 InvokeWithoutArgs(&done_event, &base::WaitableEvent::Signal))); | |
| 173 | 171 |
| 174 media::VideoCaptureParams capture_params; | 172 media::VideoCaptureParams capture_params; |
| 175 capture_params.requested_format.frame_size.SetSize(640, 480); | 173 capture_params.requested_format.frame_size.SetSize(640, 480); |
| 176 capture_params.requested_format.frame_rate = kFrameRate; | 174 capture_params.requested_format.frame_rate = kFrameRate; |
| 177 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; | 175 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; |
| 178 capture_params.allow_resolution_change = false; | 176 capture_params.allow_resolution_change = false; |
| 179 capture_device.AllocateAndStart( | 177 capture_device.AllocateAndStart( |
| 180 capture_params, client.PassAs<media::VideoCaptureDevice::Client>()); | 178 capture_params, client.PassAs<media::VideoCaptureDevice::Client>()); |
| 181 EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); | 179 EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); |
| 182 capture_device.StopAndDeAllocate(); | 180 capture_device.StopAndDeAllocate(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 198 DesktopCaptureDevice capture_device( | 196 DesktopCaptureDevice capture_device( |
| 199 worker_pool_->GetSequencedTaskRunner(worker_pool_->GetSequenceToken()), | 197 worker_pool_->GetSequencedTaskRunner(worker_pool_->GetSequenceToken()), |
| 200 scoped_ptr<webrtc::DesktopCapturer>(mock_capturer)); | 198 scoped_ptr<webrtc::DesktopCapturer>(mock_capturer)); |
| 201 | 199 |
| 202 media::VideoCaptureFormat format; | 200 media::VideoCaptureFormat format; |
| 203 base::WaitableEvent done_event(false, false); | 201 base::WaitableEvent done_event(false, false); |
| 204 int frame_size; | 202 int frame_size; |
| 205 | 203 |
| 206 scoped_ptr<MockDeviceClient> client(new MockDeviceClient()); | 204 scoped_ptr<MockDeviceClient> client(new MockDeviceClient()); |
| 207 EXPECT_CALL(*client, OnError(_)).Times(0); | 205 EXPECT_CALL(*client, OnError(_)).Times(0); |
| 208 EXPECT_CALL(*client, OnIncomingCapturedFrame(_, _, _, _, _)) | 206 EXPECT_CALL(*client, OnIncomingCapturedData(_, _, _, _, _)).WillRepeatedly( |
| 209 .WillRepeatedly( | 207 DoAll(SaveArg<1>(&frame_size), |
| 210 DoAll(SaveArg<1>(&frame_size), | 208 SaveArg<2>(&format), |
| 211 SaveArg<4>(&format), | 209 InvokeWithoutArgs(&done_event, &base::WaitableEvent::Signal))); |
| 212 InvokeWithoutArgs(&done_event, &base::WaitableEvent::Signal))); | |
| 213 | 210 |
| 214 media::VideoCaptureParams capture_params; | 211 media::VideoCaptureParams capture_params; |
| 215 capture_params.requested_format.frame_size.SetSize(kTestFrameWidth1, | 212 capture_params.requested_format.frame_size.SetSize(kTestFrameWidth1, |
| 216 kTestFrameHeight1); | 213 kTestFrameHeight1); |
| 217 capture_params.requested_format.frame_rate = kFrameRate; | 214 capture_params.requested_format.frame_rate = kFrameRate; |
| 218 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; | 215 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; |
| 219 capture_params.allow_resolution_change = false; | 216 capture_params.allow_resolution_change = false; |
| 220 | 217 |
| 221 capture_device.AllocateAndStart( | 218 capture_device.AllocateAndStart( |
| 222 capture_params, client.PassAs<media::VideoCaptureDevice::Client>()); | 219 capture_params, client.PassAs<media::VideoCaptureDevice::Client>()); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 245 | 242 |
| 246 DesktopCaptureDevice capture_device( | 243 DesktopCaptureDevice capture_device( |
| 247 worker_pool_->GetSequencedTaskRunner(worker_pool_->GetSequenceToken()), | 244 worker_pool_->GetSequencedTaskRunner(worker_pool_->GetSequenceToken()), |
| 248 scoped_ptr<webrtc::DesktopCapturer>(mock_capturer)); | 245 scoped_ptr<webrtc::DesktopCapturer>(mock_capturer)); |
| 249 | 246 |
| 250 media::VideoCaptureFormat format; | 247 media::VideoCaptureFormat format; |
| 251 base::WaitableEvent done_event(false, false); | 248 base::WaitableEvent done_event(false, false); |
| 252 | 249 |
| 253 scoped_ptr<MockDeviceClient> client(new MockDeviceClient()); | 250 scoped_ptr<MockDeviceClient> client(new MockDeviceClient()); |
| 254 EXPECT_CALL(*client, OnError(_)).Times(0); | 251 EXPECT_CALL(*client, OnError(_)).Times(0); |
| 255 EXPECT_CALL(*client, OnIncomingCapturedFrame(_, _, _, _, _)) | 252 EXPECT_CALL(*client, OnIncomingCapturedData(_, _, _, _, _)).WillRepeatedly( |
| 256 .WillRepeatedly( | 253 DoAll(SaveArg<2>(&format), |
| 257 DoAll(SaveArg<4>(&format), | 254 InvokeWithoutArgs(&done_event, &base::WaitableEvent::Signal))); |
| 258 InvokeWithoutArgs(&done_event, &base::WaitableEvent::Signal))); | |
| 259 | 255 |
| 260 media::VideoCaptureParams capture_params; | 256 media::VideoCaptureParams capture_params; |
| 261 capture_params.requested_format.frame_size.SetSize(kTestFrameWidth2, | 257 capture_params.requested_format.frame_size.SetSize(kTestFrameWidth2, |
| 262 kTestFrameHeight2); | 258 kTestFrameHeight2); |
| 263 capture_params.requested_format.frame_rate = kFrameRate; | 259 capture_params.requested_format.frame_rate = kFrameRate; |
| 264 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; | 260 capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; |
| 265 capture_params.allow_resolution_change = false; | 261 capture_params.allow_resolution_change = false; |
| 266 | 262 |
| 267 capture_device.AllocateAndStart( | 263 capture_device.AllocateAndStart( |
| 268 capture_params, client.PassAs<media::VideoCaptureDevice::Client>()); | 264 capture_params, client.PassAs<media::VideoCaptureDevice::Client>()); |
| 269 | 265 |
| 270 // Capture at least three frames, to ensure that the source frame size has | 266 // Capture at least three frames, to ensure that the source frame size has |
| 271 // changed at least twice while capturing. | 267 // changed at least twice while capturing. |
| 272 EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); | 268 EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); |
| 273 done_event.Reset(); | 269 done_event.Reset(); |
| 274 EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); | 270 EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); |
| 275 done_event.Reset(); | 271 done_event.Reset(); |
| 276 EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); | 272 EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); |
| 277 | 273 |
| 278 capture_device.StopAndDeAllocate(); | 274 capture_device.StopAndDeAllocate(); |
| 279 | 275 |
| 280 EXPECT_EQ(kTestFrameWidth1, format.frame_size.width()); | 276 EXPECT_EQ(kTestFrameWidth1, format.frame_size.width()); |
| 281 EXPECT_EQ(kTestFrameHeight1, format.frame_size.height()); | 277 EXPECT_EQ(kTestFrameHeight1, format.frame_size.height()); |
| 282 EXPECT_EQ(kFrameRate, format.frame_rate); | 278 EXPECT_EQ(kFrameRate, format.frame_rate); |
| 283 EXPECT_EQ(media::PIXEL_FORMAT_ARGB, format.pixel_format); | 279 EXPECT_EQ(media::PIXEL_FORMAT_ARGB, format.pixel_format); |
| 284 worker_pool_->FlushForTesting(); | 280 worker_pool_->FlushForTesting(); |
| 285 } | 281 } |
| 286 | 282 |
| 287 } // namespace content | 283 } // namespace content |
| OLD | NEW |