| Index: content/browser/media/capture/web_contents_video_capture_device_unittest.cc
|
| diff --git a/content/browser/media/capture/web_contents_video_capture_device_unittest.cc b/content/browser/media/capture/web_contents_video_capture_device_unittest.cc
|
| index 417d98c669048723139feedfe47de791ffc1cf14..80a95f929b63ff4fac8a68e66af09dd5fef29add 100644
|
| --- a/content/browser/media/capture/web_contents_video_capture_device_unittest.cc
|
| +++ b/content/browser/media/capture/web_contents_video_capture_device_unittest.cc
|
| @@ -37,6 +37,7 @@
|
| #include "ui/base/layout.h"
|
| #include "ui/gfx/display.h"
|
| #include "ui/gfx/geometry/dip_util.h"
|
| +#include "ui/gfx/geometry/size_conversions.h"
|
| #include "ui/gfx/screen.h"
|
| #include "ui/gfx/test/test_screen.h"
|
|
|
| @@ -1026,5 +1027,100 @@ TEST_F(WebContentsVideoCaptureDeviceTest, VariableResolution_AnyWithinLimits) {
|
| device()->StopAndDeAllocate();
|
| }
|
|
|
| +TEST_F(WebContentsVideoCaptureDeviceTest,
|
| + ComputesStandardResolutionsForPreferredSize) {
|
| + // Helper function to run the same testing procedure for multiple combinations
|
| + // of |policy|, |standard_size| and |oddball_size|.
|
| + const auto RunTestForPreferredSize =
|
| + [=](media::ResolutionChangePolicy policy,
|
| + const gfx::Size& oddball_size,
|
| + const gfx::Size& standard_size) {
|
| + SCOPED_TRACE(::testing::Message()
|
| + << "policy=" << policy
|
| + << ", oddball_size=" << oddball_size.ToString()
|
| + << ", standard_size=" << standard_size.ToString());
|
| +
|
| + // Compute the expected preferred size. For the fixed-resolution use case,
|
| + // the |oddball_size| is always the expected size; whereas for the
|
| + // variable-resolution cases, the |standard_size| is the expected size.
|
| + // Also, adjust to account for the device scale factor.
|
| + gfx::Size capture_preferred_size = gfx::ToFlooredSize(gfx::ScaleSize(
|
| + policy == media::RESOLUTION_POLICY_FIXED_RESOLUTION ?
|
| + oddball_size : standard_size,
|
| + 1.0f / GetDeviceScaleFactor()));
|
| + ASSERT_NE(capture_preferred_size, web_contents()->GetPreferredSize());
|
| +
|
| + // Start the WebContentsVideoCaptureDevice.
|
| + media::VideoCaptureParams capture_params;
|
| + capture_params.requested_format.frame_size = oddball_size;
|
| + capture_params.requested_format.frame_rate = kTestFramesPerSecond;
|
| + capture_params.requested_format.pixel_format =
|
| + media::VIDEO_CAPTURE_PIXEL_FORMAT_I420;
|
| + capture_params.resolution_change_policy = policy;
|
| + StubClientObserver unused_observer;
|
| + device()->AllocateAndStart(capture_params, unused_observer.PassClient());
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + // Check that the preferred size of the WebContents matches the one provided
|
| + // by WebContentsVideoCaptureDevice.
|
| + EXPECT_EQ(capture_preferred_size, web_contents()->GetPreferredSize());
|
| +
|
| + // Stop the WebContentsVideoCaptureDevice.
|
| + device()->StopAndDeAllocate();
|
| + base::RunLoop().RunUntilIdle();
|
| + };
|
| +
|
| + const media::ResolutionChangePolicy policies[3] = {
|
| + media::RESOLUTION_POLICY_FIXED_RESOLUTION,
|
| + media::RESOLUTION_POLICY_FIXED_ASPECT_RATIO,
|
| + media::RESOLUTION_POLICY_ANY_WITHIN_LIMIT,
|
| + };
|
| +
|
| + for (size_t i = 0; i < arraysize(policies); ++i) {
|
| + // A 16:9 standard resolution should be set as the preferred size when the
|
| + // source size is almost or exactly 16:9.
|
| + for (int delta_w = 0; delta_w <= +5; ++delta_w) {
|
| + for (int delta_h = 0; delta_h <= +5; ++delta_h) {
|
| + RunTestForPreferredSize(policies[i],
|
| + gfx::Size(1280 + delta_w, 720 + delta_h),
|
| + gfx::Size(1280, 720));
|
| + }
|
| + }
|
| + for (int delta_w = -5; delta_w <= +5; ++delta_w) {
|
| + for (int delta_h = -5; delta_h <= +5; ++delta_h) {
|
| + RunTestForPreferredSize(policies[i],
|
| + gfx::Size(1365 + delta_w, 768 + delta_h),
|
| + gfx::Size(1280, 720));
|
| + }
|
| + }
|
| +
|
| + // A 4:3 standard resolution should be set as the preferred size when the
|
| + // source size is almost or exactly 4:3.
|
| + for (int delta_w = 0; delta_w <= +5; ++delta_w) {
|
| + for (int delta_h = 0; delta_h <= +5; ++delta_h) {
|
| + RunTestForPreferredSize(policies[i],
|
| + gfx::Size(640 + delta_w, 480 + delta_h),
|
| + gfx::Size(640, 480));
|
| + }
|
| + }
|
| + for (int delta_w = -5; delta_w <= +5; ++delta_w) {
|
| + for (int delta_h = -5; delta_h <= +5; ++delta_h) {
|
| + RunTestForPreferredSize(policies[i],
|
| + gfx::Size(800 + delta_w, 600 + delta_h),
|
| + gfx::Size(768, 576));
|
| + }
|
| + }
|
| +
|
| + // When the source size is not a common video aspect ratio, there is no
|
| + // adjustment made.
|
| + RunTestForPreferredSize(
|
| + policies[i], gfx::Size(1000, 1000), gfx::Size(1000, 1000));
|
| + RunTestForPreferredSize(
|
| + policies[i], gfx::Size(1600, 1000), gfx::Size(1600, 1000));
|
| + RunTestForPreferredSize(
|
| + policies[i], gfx::Size(837, 999), gfx::Size(837, 999));
|
| + }
|
| +}
|
| +
|
| } // namespace
|
| } // namespace content
|
|
|