Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(202)

Unified Diff: content/browser/media/capture/desktop_capture_device_unittest.cc

Issue 1135823004: Implement all resolution change policies for desktop and tab capture. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@resolution_change_policy_constraints_ITEM1_CR1
Patch Set: REBASE Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..56e06ff66b42a115ad618e721d757428c9bc0ca8 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;
@@ -208,6 +211,32 @@ class FakeScreenCapturer : public webrtc::ScreenCapturer {
bool generate_cropped_frames_;
};
+// Helper used to check that only two specific frame sizes are delivered to the
+// OnIncomingCapturedData() callback.
+class FormatChecker {
+ public:
+ FormatChecker(const gfx::Size& size_for_even_frames,
+ const gfx::Size& size_for_odd_frames)
+ : size_for_even_frames_(size_for_even_frames),
+ size_for_odd_frames_(size_for_odd_frames),
+ frame_count_(0) {}
+
+ void ExpectAcceptableSize(const media::VideoCaptureFormat& format) {
+ if (frame_count_ % 2 == 0)
+ EXPECT_EQ(size_for_even_frames_, format.frame_size);
+ else
+ EXPECT_EQ(size_for_odd_frames_, format.frame_size);
+ ++frame_count_;
+ EXPECT_EQ(kFrameRate, format.frame_rate);
+ EXPECT_EQ(media::PIXEL_FORMAT_ARGB, format.pixel_format);
+ }
+
+ private:
+ const gfx::Size size_for_even_frames_;
+ const gfx::Size size_for_odd_frames_;
+ int frame_count_;
+};
+
} // namespace
class DesktopCaptureDeviceTest : public testing::Test {
@@ -277,15 +306,15 @@ TEST_F(DesktopCaptureDeviceTest, ScreenResolutionChangeConstantResolution) {
CreateScreenCaptureDevice(scoped_ptr<webrtc::DesktopCapturer>(mock_capturer));
- media::VideoCaptureFormat format;
+ FormatChecker format_checker(gfx::Size(kTestFrameWidth1, kTestFrameHeight1),
+ gfx::Size(kTestFrameWidth1, kTestFrameHeight1));
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(&format_checker,
+ &FormatChecker::ExpectAcceptableSize)),
InvokeWithoutArgs(&done_event, &base::WaitableEvent::Signal)));
media::VideoCaptureParams capture_params;
@@ -293,23 +322,66 @@ 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) {
+ FakeScreenCapturer* mock_capturer = new FakeScreenCapturer();
- EXPECT_EQ(format.frame_size.GetArea() * 4, frame_size);
+ CreateScreenCaptureDevice(scoped_ptr<webrtc::DesktopCapturer>(mock_capturer));
+
+ FormatChecker format_checker(gfx::Size(888, 500), gfx::Size(532, 300));
+ 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
@@ -319,38 +391,42 @@ TEST_F(DesktopCaptureDeviceTest, ScreenResolutionChangeVariableResolution) {
CreateScreenCaptureDevice(scoped_ptr<webrtc::DesktopCapturer>(mock_capturer));
- media::VideoCaptureFormat format;
+ FormatChecker format_checker(gfx::Size(kTestFrameWidth1, kTestFrameHeight1),
+ gfx::Size(kTestFrameWidth2, kTestFrameHeight2));
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.

Powered by Google App Engine
This is Rietveld 408576698