| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 #include "webrtc/base/win32.h" | 35 #include "webrtc/base/win32.h" |
| 36 #include "webrtc/modules/desktop_capture/win/screen_capturer_win_directx.h" | 36 #include "webrtc/modules/desktop_capture/win/screen_capturer_win_directx.h" |
| 37 #endif // defined(WEBRTC_WIN) | 37 #endif // defined(WEBRTC_WIN) |
| 38 | 38 |
| 39 using ::testing::_; | 39 using ::testing::_; |
| 40 | 40 |
| 41 namespace webrtc { | 41 namespace webrtc { |
| 42 | 42 |
| 43 namespace { | 43 namespace { |
| 44 | 44 |
| 45 ACTION_P(SaveUniquePtrArg, dest) { | 45 ACTION_P2(SaveCaptureResult, result, dest) { |
| 46 *result = arg0; |
| 46 *dest = std::move(*arg1); | 47 *dest = std::move(*arg1); |
| 47 } | 48 } |
| 48 | 49 |
| 49 // Returns true if color in |rect| of |frame| is |color|. | 50 // Returns true if color in |rect| of |frame| is |color|. |
| 50 bool ArePixelsColoredBy(const DesktopFrame& frame, | 51 bool ArePixelsColoredBy(const DesktopFrame& frame, |
| 51 DesktopRect rect, | 52 DesktopRect rect, |
| 52 RgbaColor color, | 53 RgbaColor color, |
| 53 bool may_partially_draw) { | 54 bool may_partially_draw) { |
| 54 if (!may_partially_draw) { | 55 if (!may_partially_draw) { |
| 55 // updated_region() should cover the painted area. | 56 // updated_region() should cover the painted area. |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 236 << std::endl; | 237 << std::endl; |
| 237 } | 238 } |
| 238 std::cout << "Failed to capture rectangle " << rect.left() << " x " | 239 std::cout << "Failed to capture rectangle " << rect.left() << " x " |
| 239 << rect.top() << " - " << rect.right() << " x " | 240 << rect.top() << " - " << rect.right() << " x " |
| 240 << rect.bottom() << " with color (" | 241 << rect.bottom() << " with color (" |
| 241 << static_cast<int>(color.red) << ", " | 242 << static_cast<int>(color.red) << ", " |
| 242 << static_cast<int>(color.green) << ", " | 243 << static_cast<int>(color.green) << ", " |
| 243 << static_cast<int>(color.blue) << ", " | 244 << static_cast<int>(color.blue) << ", " |
| 244 << static_cast<int>(color.alpha) << ")" << std::endl; | 245 << static_cast<int>(color.alpha) << ")" << std::endl; |
| 245 ASSERT_TRUE(false) << "ScreenCapturerIntegrationTest may be flaky. " | 246 ASSERT_TRUE(false) << "ScreenCapturerIntegrationTest may be flaky. " |
| 246 "If the error message above is " | 247 "Please kindly FYI the broken link to " |
| 247 "\"////AP///wD///8A\", it's a known issue, " | 248 "zijiehe@chromium.org for investigation. If " |
| 248 "which should be able to recover by rerunning " | 249 "the failure continually happens, but I have " |
| 249 "the test. Otherwise please kindly FYI the " | 250 "not responded as quick as expected, disable " |
| 250 "broken link to zijiehe@chromium.org for " | 251 "*all* tests in " |
| 251 "investigation. If the failure continually " | |
| 252 "happens, but I have not responded as quick as " | |
| 253 "expected, disable *all* tests in " | |
| 254 "screen_capturer_integration_test.cc to " | 252 "screen_capturer_integration_test.cc to " |
| 255 "unblock other developers."; | 253 "unblock other developers."; |
| 256 } | 254 } |
| 257 } | 255 } |
| 258 | 256 |
| 259 if (succeeded_capturers == capturers.size()) { | 257 if (succeeded_capturers == capturers.size()) { |
| 260 break; | 258 break; |
| 261 } | 259 } |
| 262 } | 260 } |
| 263 | 261 |
| 264 ASSERT_EQ(succeeded_capturers, capturers.size()); | 262 ASSERT_EQ(succeeded_capturers, capturers.size()); |
| 265 } | 263 } |
| 266 | 264 |
| 267 // Expects |capturer| to successfully capture a frame, and returns it. | 265 // Expects |capturer| to successfully capture a frame, and returns it. |
| 268 std::unique_ptr<DesktopFrame> CaptureFrame(DesktopCapturer* capturer) { | 266 std::unique_ptr<DesktopFrame> CaptureFrame(DesktopCapturer* capturer) { |
| 269 std::unique_ptr<DesktopFrame> frame; | 267 for (int i = 0; i < 10; i++) { |
| 270 EXPECT_CALL(callback_, | 268 std::unique_ptr<DesktopFrame> frame; |
| 271 OnCaptureResultPtr(DesktopCapturer::Result::SUCCESS, _)) | 269 DesktopCapturer::Result result; |
| 272 .WillOnce(SaveUniquePtrArg(&frame)); | 270 EXPECT_CALL(callback_, OnCaptureResultPtr(_, _)) |
| 273 capturer->CaptureFrame(); | 271 .WillOnce(SaveCaptureResult(&result, &frame)); |
| 274 EXPECT_TRUE(frame); | 272 capturer->CaptureFrame(); |
| 275 return frame; | 273 testing::Mock::VerifyAndClearExpectations(&callback_); |
| 274 if (result == DesktopCapturer::Result::SUCCESS) { |
| 275 EXPECT_TRUE(frame); |
| 276 return frame; |
| 277 } else { |
| 278 EXPECT_FALSE(frame); |
| 279 } |
| 280 } |
| 281 |
| 282 EXPECT_TRUE(false); |
| 283 return nullptr; |
| 276 } | 284 } |
| 277 }; | 285 }; |
| 278 | 286 |
| 279 #if defined(WEBRTC_WIN) | 287 TEST_F(ScreenCapturerIntegrationTest, CaptureUpdatedRegion) { |
| 280 #define MAYBE_CaptureUpdatedRegion DISABLED_CaptureUpdatedRegion | 288 #if !defined(WEBRTC_WIN) |
| 281 #else | 289 // ScreenCapturerWinGdi randomly returns blank screen, the root cause is still |
| 282 #define MAYBE_CaptureUpdatedRegion CaptureUpdatedRegion | 290 // unknown. Bug, https://bugs.chromium.org/p/webrtc/issues/detail?id=6843. |
| 291 TestCaptureUpdatedRegion(); |
| 283 #endif | 292 #endif |
| 284 TEST_F(ScreenCapturerIntegrationTest, MAYBE_CaptureUpdatedRegion) { | |
| 285 TestCaptureUpdatedRegion(); | |
| 286 } | 293 } |
| 287 | 294 |
| 288 #if defined(WEBRTC_WIN) | 295 TEST_F(ScreenCapturerIntegrationTest, TwoCapturers) { |
| 289 #define MAYBE_TwoCapturers DISABLED_TwoCapturers | 296 #if !defined(WEBRTC_WIN) |
| 290 #else | 297 // ScreenCapturerWinGdi randomly returns blank screen, the root cause is still |
| 291 #define MAYBE_TwoCapturers TwoCapturers | 298 // unknown. Bug, https://bugs.chromium.org/p/webrtc/issues/detail?id=6843. |
| 292 #endif | |
| 293 TEST_F(ScreenCapturerIntegrationTest, MAYBE_TwoCapturers) { | |
| 294 std::unique_ptr<DesktopCapturer> capturer2 = std::move(capturer_); | 299 std::unique_ptr<DesktopCapturer> capturer2 = std::move(capturer_); |
| 295 SetUp(); | 300 SetUp(); |
| 296 TestCaptureUpdatedRegion({capturer_.get(), capturer2.get()}); | 301 TestCaptureUpdatedRegion({capturer_.get(), capturer2.get()}); |
| 302 #endif |
| 297 } | 303 } |
| 298 | 304 |
| 299 #if defined(WEBRTC_WIN) | 305 #if defined(WEBRTC_WIN) |
| 300 | 306 |
| 301 TEST_F(ScreenCapturerIntegrationTest, | 307 TEST_F(ScreenCapturerIntegrationTest, CaptureUpdatedRegionWithDirectxCapturer) { |
| 302 DISABLED_CaptureUpdatedRegionWithDirectxCapturer) { | |
| 303 if (!CreateDirectxCapturer()) { | 308 if (!CreateDirectxCapturer()) { |
| 304 return; | 309 return; |
| 305 } | 310 } |
| 306 | 311 |
| 307 TestCaptureUpdatedRegion(); | 312 TestCaptureUpdatedRegion(); |
| 308 } | 313 } |
| 309 | 314 |
| 310 TEST_F(ScreenCapturerIntegrationTest, DISABLED_TwoDirectxCapturers) { | 315 TEST_F(ScreenCapturerIntegrationTest, TwoDirectxCapturers) { |
| 311 if (!CreateDirectxCapturer()) { | 316 if (!CreateDirectxCapturer()) { |
| 312 return; | 317 return; |
| 313 } | 318 } |
| 314 | 319 |
| 315 std::unique_ptr<DesktopCapturer> capturer2 = std::move(capturer_); | 320 std::unique_ptr<DesktopCapturer> capturer2 = std::move(capturer_); |
| 316 RTC_CHECK(CreateDirectxCapturer()); | 321 RTC_CHECK(CreateDirectxCapturer()); |
| 317 TestCaptureUpdatedRegion({capturer_.get(), capturer2.get()}); | 322 TestCaptureUpdatedRegion({capturer_.get(), capturer2.get()}); |
| 318 } | 323 } |
| 319 | 324 |
| 320 TEST_F(ScreenCapturerIntegrationTest, | 325 TEST_F(ScreenCapturerIntegrationTest, |
| 321 DISABLED_CaptureUpdatedRegionWithMagnifierCapturer) { | 326 CaptureUpdatedRegionWithMagnifierCapturer) { |
| 322 // On Windows 8 or later, magnifier APIs return a frame with a border on test | 327 // On Windows 8 or later, magnifier APIs return a frame with a border on test |
| 323 // environment, so disable these tests. | 328 // environment, so disable these tests. |
| 324 // Bug https://bugs.chromium.org/p/webrtc/issues/detail?id=6666 | 329 // Bug https://bugs.chromium.org/p/webrtc/issues/detail?id=6844 |
| 325 // TODO(zijiehe): Find the root cause of the border and failure, which cannot | 330 // TODO(zijiehe): Find the root cause of the border and failure, which cannot |
| 326 // reproduce on my dev machine. | 331 // reproduce on my dev machine. |
| 327 if (rtc::IsWindows8OrLater()) { | 332 if (rtc::IsWindows8OrLater()) { |
| 328 return; | 333 return; |
| 329 } | 334 } |
| 330 CreateMagnifierCapturer(); | 335 CreateMagnifierCapturer(); |
| 331 TestCaptureUpdatedRegion(); | 336 TestCaptureUpdatedRegion(); |
| 332 } | 337 } |
| 333 | 338 |
| 334 TEST_F(ScreenCapturerIntegrationTest, DISABLED_TwoMagnifierCapturers) { | 339 TEST_F(ScreenCapturerIntegrationTest, TwoMagnifierCapturers) { |
| 335 // On Windows 8 or later, magnifier APIs return a frame with a border on test | 340 // On Windows 8 or later, magnifier APIs return a frame with a border on test |
| 336 // environment, so disable these tests. | 341 // environment, so disable these tests. |
| 337 // Bug https://bugs.chromium.org/p/webrtc/issues/detail?id=6666 | 342 // Bug https://bugs.chromium.org/p/webrtc/issues/detail?id=6844 |
| 338 // TODO(zijiehe): Find the root cause of the border and failure, which cannot | 343 // TODO(zijiehe): Find the root cause of the border and failure, which cannot |
| 339 // reproduce on my dev machine. | 344 // reproduce on my dev machine. |
| 340 if (rtc::IsWindows8OrLater()) { | 345 if (rtc::IsWindows8OrLater()) { |
| 341 return; | 346 return; |
| 342 } | 347 } |
| 343 CreateMagnifierCapturer(); | 348 CreateMagnifierCapturer(); |
| 344 std::unique_ptr<DesktopCapturer> capturer2 = std::move(capturer_); | 349 std::unique_ptr<DesktopCapturer> capturer2 = std::move(capturer_); |
| 345 CreateMagnifierCapturer(); | 350 CreateMagnifierCapturer(); |
| 346 TestCaptureUpdatedRegion({capturer_.get(), capturer2.get()}); | 351 TestCaptureUpdatedRegion({capturer_.get(), capturer2.get()}); |
| 347 } | 352 } |
| 348 | 353 |
| 349 TEST_F(ScreenCapturerIntegrationTest, | 354 TEST_F(ScreenCapturerIntegrationTest, |
| 350 DISABLED_MaybeCaptureUpdatedRegionWithDirectxCapturer) { | 355 MaybeCaptureUpdatedRegionWithDirectxCapturer) { |
| 356 if (!rtc::IsWindows8OrLater()) { |
| 357 // ScreenCapturerWinGdi randomly returns blank screen, the root cause is |
| 358 // still unknown. Bug, |
| 359 // https://bugs.chromium.org/p/webrtc/issues/detail?id=6843. |
| 360 // On Windows 7 or early version, MaybeCreateDirectxCapturer() always |
| 361 // creates GDI capturer. |
| 362 return; |
| 363 } |
| 351 // Even DirectX capturer is not supported in current system, we should be able | 364 // Even DirectX capturer is not supported in current system, we should be able |
| 352 // to select a usable capturer. | 365 // to select a usable capturer. |
| 353 MaybeCreateDirectxCapturer(); | 366 MaybeCreateDirectxCapturer(); |
| 354 TestCaptureUpdatedRegion(); | 367 TestCaptureUpdatedRegion(); |
| 355 } | 368 } |
| 356 | 369 |
| 357 #endif // defined(WEBRTC_WIN) | 370 #endif // defined(WEBRTC_WIN) |
| 358 | 371 |
| 359 } // namespace webrtc | 372 } // namespace webrtc |
| OLD | NEW |