Chromium Code Reviews| Index: content/browser/media/capture/desktop_capture_device_unittest.cc |
| diff --git a/content/browser/media/capture/desktop_capture_device_unittest.cc b/content/browser/media/capture/desktop_capture_device_unittest.cc |
| index c86ddd3857ec569b9c6a11a54a3d2845b621ecdd..021764ae123f8104324e484cf5df75ffd47260bb 100644 |
| --- a/content/browser/media/capture/desktop_capture_device_unittest.cc |
| +++ b/content/browser/media/capture/desktop_capture_device_unittest.cc |
| @@ -4,6 +4,7 @@ |
| #include "content/browser/media/capture/desktop_capture_device.h" |
| +#include <algorithm> |
| #include <string> |
| #include "base/basictypes.h" |
| @@ -22,8 +23,10 @@ using ::testing::_; |
| using ::testing::AnyNumber; |
| using ::testing::DoAll; |
| using ::testing::Expectation; |
| +using ::testing::Invoke; |
| using ::testing::InvokeWithoutArgs; |
| using ::testing::SaveArg; |
| +using ::testing::WithArg; |
| namespace content { |
| @@ -33,10 +36,10 @@ MATCHER_P2(EqualsCaptureCapability, width, height, "") { |
| return arg.width == width && arg.height == height; |
| } |
| -const int kTestFrameWidth1 = 100; |
| -const int kTestFrameHeight1 = 100; |
| -const int kTestFrameWidth2 = 200; |
| -const int kTestFrameHeight2 = 150; |
| +const int kTestFrameWidth1 = 500; |
| +const int kTestFrameHeight1 = 500; |
| +const int kTestFrameWidth2 = 400; |
| +const int kTestFrameHeight2 = 300; |
| const int kFrameRate = 30; |
| @@ -273,19 +276,27 @@ TEST_F(DesktopCaptureDeviceTest, MAYBE_Capture) { |
| // Test that screen capturer behaves correctly if the source frame size changes |
| // but the caller cannot cope with variable resolution output. |
| TEST_F(DesktopCaptureDeviceTest, ScreenResolutionChangeConstantResolution) { |
| + // Helper used to check that only one distinct frame size is delivered and |
| + // that it exactly matches the configured frame size. |
| + struct FormatChecker { |
| + static void ExpectAcceptableSize(const media::VideoCaptureFormat& format) { |
|
Wez
2015/05/15 00:55:42
Why is this in a struct rather than being a static
miu
2015/05/15 21:14:01
No particular reason, other than it's only used wi
|
| + const gfx::Size& size = format.frame_size; |
| + EXPECT_EQ(gfx::Size(kTestFrameWidth1, kTestFrameHeight1), size); |
| + EXPECT_EQ(kFrameRate, format.frame_rate); |
| + EXPECT_EQ(media::PIXEL_FORMAT_ARGB, format.pixel_format); |
| + } |
| + }; |
| + |
| FakeScreenCapturer* mock_capturer = new FakeScreenCapturer(); |
| CreateScreenCaptureDevice(scoped_ptr<webrtc::DesktopCapturer>(mock_capturer)); |
| - media::VideoCaptureFormat format; |
| base::WaitableEvent done_event(false, false); |
| - int frame_size; |
| scoped_ptr<MockDeviceClient> client(new MockDeviceClient()); |
| EXPECT_CALL(*client, OnError(_)).Times(0); |
| EXPECT_CALL(*client, OnIncomingCapturedData(_, _, _, _, _)).WillRepeatedly( |
| - DoAll(SaveArg<1>(&frame_size), |
| - SaveArg<2>(&format), |
| + DoAll(WithArg<2>(Invoke(&FormatChecker::ExpectAcceptableSize)), |
| InvokeWithoutArgs(&done_event, &base::WaitableEvent::Signal))); |
| media::VideoCaptureParams capture_params; |
| @@ -293,64 +304,157 @@ TEST_F(DesktopCaptureDeviceTest, ScreenResolutionChangeConstantResolution) { |
| kTestFrameHeight1); |
| capture_params.requested_format.frame_rate = kFrameRate; |
| capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; |
| + capture_params.resolution_change_policy = |
| + media::RESOLUTION_POLICY_FIXED_RESOLUTION; |
| capture_device_->AllocateAndStart(capture_params, client.Pass()); |
| // Capture at least two frames, to ensure that the source frame size has |
| - // changed while capturing. |
| - EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); |
| - done_event.Reset(); |
| - EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); |
| + // changed to two different sizes while capturing. The mock for |
| + // OnIncomingCapturedData() will use FormatChecker to examine the format of |
| + // each frame being delivered. |
| + for (int i = 0; i < 2; ++i) { |
| + EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); |
| + done_event.Reset(); |
| + } |
| capture_device_->StopAndDeAllocate(); |
| +} |
| - EXPECT_EQ(kTestFrameWidth1, format.frame_size.width()); |
| - EXPECT_EQ(kTestFrameHeight1, format.frame_size.height()); |
| - EXPECT_EQ(kFrameRate, format.frame_rate); |
| - EXPECT_EQ(media::PIXEL_FORMAT_ARGB, format.pixel_format); |
| +// Test that screen capturer behaves correctly if the source frame size changes, |
| +// where the video frames sent the the client vary in resolution but maintain |
| +// the same aspect ratio. |
| +TEST_F(DesktopCaptureDeviceTest, ScreenResolutionChangeFixedAspectRatio) { |
| + // Helper used to check that only the two test frame sizes, adjusted to the |
| + // 16:9 aspect ratio requirement, are delivered to the |
| + // OnIncomingCapturedData() callback. |
| + class FormatChecker { |
| + public: |
| + FormatChecker() : frame_count_(0) {} |
| + |
| + void ExpectAcceptableSize(const media::VideoCaptureFormat& format) { |
| + if (frame_count_ % 2 == 0) { |
| + const gfx::Size expected_size(888, 500); |
| + EXPECT_EQ(expected_size, format.frame_size); |
| + } else { |
| + const gfx::Size expected_size(532, 300); |
| + EXPECT_EQ(expected_size, format.frame_size); |
| + } |
| + ++frame_count_; |
| + EXPECT_EQ(kFrameRate, format.frame_rate); |
| + EXPECT_EQ(media::PIXEL_FORMAT_ARGB, format.pixel_format); |
| + } |
| - EXPECT_EQ(format.frame_size.GetArea() * 4, frame_size); |
| + private: |
| + int frame_count_; |
| + }; |
| + |
| + FakeScreenCapturer* mock_capturer = new FakeScreenCapturer(); |
| + |
| + CreateScreenCaptureDevice(scoped_ptr<webrtc::DesktopCapturer>(mock_capturer)); |
| + |
| + FormatChecker format_checker; |
| + base::WaitableEvent done_event(false, false); |
| + |
| + scoped_ptr<MockDeviceClient> client(new MockDeviceClient()); |
| + EXPECT_CALL(*client, OnError(_)).Times(0); |
| + EXPECT_CALL(*client, OnIncomingCapturedData(_, _, _, _, _)).WillRepeatedly( |
| + DoAll(WithArg<2>(Invoke(&format_checker, |
| + &FormatChecker::ExpectAcceptableSize)), |
| + InvokeWithoutArgs(&done_event, &base::WaitableEvent::Signal))); |
| + |
| + media::VideoCaptureParams capture_params; |
| + const gfx::Size high_def_16_by_9(1920, 1080); |
| + ASSERT_GE(high_def_16_by_9.width(), |
| + std::max(kTestFrameWidth1, kTestFrameWidth2)); |
| + ASSERT_GE(high_def_16_by_9.height(), |
| + std::max(kTestFrameHeight1, kTestFrameHeight2)); |
| + capture_params.requested_format.frame_size = high_def_16_by_9; |
| + capture_params.requested_format.frame_rate = kFrameRate; |
| + capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; |
| + capture_params.resolution_change_policy = |
| + media::RESOLUTION_POLICY_FIXED_ASPECT_RATIO; |
| + |
| + capture_device_->AllocateAndStart( |
| + capture_params, client.Pass()); |
| + |
| + // Capture at least three frames, to ensure that the source frame size has |
| + // changed to two different sizes while capturing. The mock for |
| + // OnIncomingCapturedData() will use FormatChecker to examine the format of |
| + // each frame being delivered. |
| + for (int i = 0; i < 3; ++i) { |
| + EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); |
| + done_event.Reset(); |
| + } |
| + |
| + capture_device_->StopAndDeAllocate(); |
| } |
| // Test that screen capturer behaves correctly if the source frame size changes |
| // and the caller can cope with variable resolution output. |
| TEST_F(DesktopCaptureDeviceTest, ScreenResolutionChangeVariableResolution) { |
| + // Helper used to check that only the two test frame sizes are delivered to |
| + // the OnIncomingCapturedData() callback. |
| + class FormatChecker { |
|
Wez
2015/05/15 00:55:42
Seems that this could be turned into a parameteriz
miu
2015/05/15 21:14:01
Done. Good point.
|
| + public: |
| + FormatChecker() : frame_count_(0) {} |
| + |
| + void ExpectAcceptableSize(const media::VideoCaptureFormat& format) { |
| + if (frame_count_ % 2 == 0) { |
| + EXPECT_EQ(gfx::Size(kTestFrameWidth1, kTestFrameHeight1), |
| + format.frame_size); |
| + } else { |
| + EXPECT_EQ(gfx::Size(kTestFrameWidth2, kTestFrameHeight2), |
| + format.frame_size); |
| + } |
| + ++frame_count_; |
| + EXPECT_EQ(kFrameRate, format.frame_rate); |
| + EXPECT_EQ(media::PIXEL_FORMAT_ARGB, format.pixel_format); |
| + } |
| + |
| + private: |
| + int frame_count_; |
| + }; |
| + |
| FakeScreenCapturer* mock_capturer = new FakeScreenCapturer(); |
| CreateScreenCaptureDevice(scoped_ptr<webrtc::DesktopCapturer>(mock_capturer)); |
| - media::VideoCaptureFormat format; |
| + FormatChecker format_checker; |
| base::WaitableEvent done_event(false, false); |
| scoped_ptr<MockDeviceClient> client(new MockDeviceClient()); |
| EXPECT_CALL(*client, OnError(_)).Times(0); |
| EXPECT_CALL(*client, OnIncomingCapturedData(_, _, _, _, _)).WillRepeatedly( |
| - DoAll(SaveArg<2>(&format), |
| + DoAll(WithArg<2>(Invoke(&format_checker, |
| + &FormatChecker::ExpectAcceptableSize)), |
| InvokeWithoutArgs(&done_event, &base::WaitableEvent::Signal))); |
| media::VideoCaptureParams capture_params; |
| - capture_params.requested_format.frame_size.SetSize(kTestFrameWidth2, |
| - kTestFrameHeight2); |
| + const gfx::Size high_def_16_by_9(1920, 1080); |
| + ASSERT_GE(high_def_16_by_9.width(), |
| + std::max(kTestFrameWidth1, kTestFrameWidth2)); |
| + ASSERT_GE(high_def_16_by_9.height(), |
| + std::max(kTestFrameHeight1, kTestFrameHeight2)); |
| + capture_params.requested_format.frame_size = high_def_16_by_9; |
| capture_params.requested_format.frame_rate = kFrameRate; |
| capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420; |
| + capture_params.resolution_change_policy = |
| + media::RESOLUTION_POLICY_ANY_WITHIN_LIMIT; |
| capture_device_->AllocateAndStart( |
| capture_params, client.Pass()); |
| // Capture at least three frames, to ensure that the source frame size has |
| - // changed at least twice while capturing. |
| - EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); |
| - done_event.Reset(); |
| - EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); |
| - done_event.Reset(); |
| - EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); |
| + // changed to two different sizes while capturing. The mock for |
| + // OnIncomingCapturedData() will use FormatChecker to examine the format of |
| + // each frame being delivered. |
| + for (int i = 0; i < 3; ++i) { |
| + EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); |
| + done_event.Reset(); |
| + } |
| capture_device_->StopAndDeAllocate(); |
| - |
| - EXPECT_EQ(kTestFrameWidth1, format.frame_size.width()); |
| - EXPECT_EQ(kTestFrameHeight1, format.frame_size.height()); |
| - EXPECT_EQ(kFrameRate, format.frame_rate); |
| - EXPECT_EQ(media::PIXEL_FORMAT_ARGB, format.pixel_format); |
| } |
| // This test verifies that an unpacked frame is converted to a packed frame. |