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

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: Addressed Dale's comments. 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..67d37e16335953be97da889386f0b81050bc08df 100644
--- a/content/browser/media/capture/desktop_capture_device_unittest.cc
+++ b/content/browser/media/capture/desktop_capture_device_unittest.cc
@@ -4,7 +4,9 @@
#include "content/browser/media/capture/desktop_capture_device.h"
+#include <algorithm>
#include <string>
+#include <vector>
#include "base/basictypes.h"
#include "base/synchronization/waitable_event.h"
@@ -22,8 +24,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 +37,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;
@@ -293,6 +297,8 @@ 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());
@@ -312,6 +318,67 @@ TEST_F(DesktopCaptureDeviceTest, ScreenResolutionChangeConstantResolution) {
EXPECT_EQ(format.frame_size.GetArea() * 4, frame_size);
}
+// 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();
+
+ CreateScreenCaptureDevice(scoped_ptr<webrtc::DesktopCapturer>(mock_capturer));
+
+ media::VideoCaptureFormats formats;
+ base::WaitableEvent done_event(false, false);
+
+ scoped_ptr<MockDeviceClient> client(new MockDeviceClient());
+ EXPECT_CALL(*client, OnError(_)).Times(0);
+ void (media::VideoCaptureFormats::*push_back_method)(
+ const media::VideoCaptureFormat&) =
+ &media::VideoCaptureFormats::push_back;
+ EXPECT_CALL(*client, OnIncomingCapturedData(_, _, _, _, _)).WillRepeatedly(
+ DoAll(WithArg<2>(Invoke(&formats, push_back_method)),
+ 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 at least twice while capturing.
Wez 2015/05/14 01:44:55 nit: Why is this not a loop? Why do we care that
miu 2015/05/14 21:12:26 I originally wrote this test by forking the existi
+ 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()));
+
+ capture_device_->StopAndDeAllocate();
+
+ std::vector<gfx::Size> distinct_sizes_seen;
+ for (const media::VideoCaptureFormat& f : formats) {
Wez 2015/05/14 01:44:55 nit: Could this be: for (auto format : formats)
miu 2015/05/14 21:12:26 Reply 1: It could, but the style guide suggests on
+ ASSERT_FALSE(f.frame_size.IsEmpty());
+ if (std::find(distinct_sizes_seen.begin(),
+ distinct_sizes_seen.end(),
+ f.frame_size) == distinct_sizes_seen.end()) {
+ distinct_sizes_seen.push_back(f.frame_size);
+ }
+ EXPECT_EQ(kFrameRate, f.frame_rate);
+ EXPECT_EQ(media::PIXEL_FORMAT_ARGB, f.pixel_format);
+ }
+ EXPECT_EQ(2u, distinct_sizes_seen.size());
Wez 2015/05/14 01:44:55 Is there something about the mock capturer that ca
miu 2015/05/14 21:12:26 Done. Elaborated on this in code comments.
+ for (const gfx::Size& s : distinct_sizes_seen)
Wez 2015/05/14 01:44:55 nit: auto here?
miu 2015/05/14 21:12:26 No longer applicable since I've replaced this code
+ EXPECT_NEAR(16.0 / 9.0, static_cast<double>(s.width()) / s.height(), 0.01);
+}
+
// 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) {
@@ -319,20 +386,29 @@ TEST_F(DesktopCaptureDeviceTest, ScreenResolutionChangeVariableResolution) {
CreateScreenCaptureDevice(scoped_ptr<webrtc::DesktopCapturer>(mock_capturer));
- media::VideoCaptureFormat format;
+ media::VideoCaptureFormats formats;
base::WaitableEvent done_event(false, false);
scoped_ptr<MockDeviceClient> client(new MockDeviceClient());
EXPECT_CALL(*client, OnError(_)).Times(0);
+ void (media::VideoCaptureFormats::*push_back_method)(
+ const media::VideoCaptureFormat&) =
+ &media::VideoCaptureFormats::push_back;
EXPECT_CALL(*client, OnIncomingCapturedData(_, _, _, _, _)).WillRepeatedly(
- DoAll(SaveArg<2>(&format),
+ DoAll(WithArg<2>(Invoke(&formats, push_back_method)),
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());
@@ -347,10 +423,22 @@ TEST_F(DesktopCaptureDeviceTest, ScreenResolutionChangeVariableResolution) {
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);
+ bool have_seen_frame_size_1 = false;
+ bool have_seen_frame_size_2 = false;
+ bool have_seen_other_frame_size = false;
+ for (const media::VideoCaptureFormat& f : formats) {
+ if (f.frame_size == gfx::Size(kTestFrameWidth1, kTestFrameHeight1))
+ have_seen_frame_size_1 = true;
+ else if (f.frame_size == gfx::Size(kTestFrameWidth2, kTestFrameHeight2))
+ have_seen_frame_size_2 = true;
+ else
+ have_seen_other_frame_size = true;
+ EXPECT_EQ(kFrameRate, f.frame_rate);
+ EXPECT_EQ(media::PIXEL_FORMAT_ARGB, f.pixel_format);
+ }
+ EXPECT_TRUE(have_seen_frame_size_1);
+ EXPECT_TRUE(have_seen_frame_size_2);
+ EXPECT_FALSE(have_seen_other_frame_size);
Wez 2015/05/14 01:44:55 nit: The fixed aspect-ratio test collates a list o
miu 2015/05/14 21:12:26 Done.
}
// This test verifies that an unpacked frame is converted to a packed frame.

Powered by Google App Engine
This is Rietveld 408576698