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

Side by Side Diff: content/renderer/media/media_stream_video_source_unittest.cc

Issue 2790823002: Spec compliant video constraints for getUserMedia behind flag. (Closed)
Patch Set: fix tests Created 3 years, 8 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <string> 5 #include <string>
6 #include <vector> 6 #include <vector>
7 7
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "base/run_loop.h" 10 #include "base/run_loop.h"
11 #include "base/strings/string_number_conversions.h" 11 #include "base/strings/string_number_conversions.h"
12 #include "base/strings/utf_string_conversions.h" 12 #include "base/strings/utf_string_conversions.h"
13 #include "base/test/scoped_feature_list.h"
13 #include "content/child/child_process.h" 14 #include "content/child/child_process.h"
15 #include "content/public/common/content_features.h"
14 #include "content/renderer/media/media_stream_video_source.h" 16 #include "content/renderer/media/media_stream_video_source.h"
15 #include "content/renderer/media/media_stream_video_track.h" 17 #include "content/renderer/media/media_stream_video_track.h"
16 #include "content/renderer/media/mock_constraint_factory.h" 18 #include "content/renderer/media/mock_constraint_factory.h"
17 #include "content/renderer/media/mock_media_stream_video_sink.h" 19 #include "content/renderer/media/mock_media_stream_video_sink.h"
18 #include "content/renderer/media/mock_media_stream_video_source.h" 20 #include "content/renderer/media/mock_media_stream_video_source.h"
21 #include "content/renderer/media/video_track_adapter.h"
19 #include "media/base/limits.h" 22 #include "media/base/limits.h"
20 #include "media/base/video_frame.h" 23 #include "media/base/video_frame.h"
21 #include "testing/gtest/include/gtest/gtest.h" 24 #include "testing/gtest/include/gtest/gtest.h"
22 #include "third_party/WebKit/public/web/WebHeap.h" 25 #include "third_party/WebKit/public/web/WebHeap.h"
23 26
24 using ::testing::_; 27 using ::testing::_;
25 using ::testing::DoAll; 28 using ::testing::DoAll;
26 using ::testing::SaveArg; 29 using ::testing::SaveArg;
27 30
28 namespace content { 31 namespace content {
29 32
30 ACTION_P(RunClosure, closure) { 33 ACTION_P(RunClosure, closure) {
31 closure.Run(); 34 closure.Run();
32 } 35 }
33 36
34 class MediaStreamVideoSourceTest : public ::testing::Test { 37 class MediaStreamVideoSourceTest : public ::testing::Test {
35 public: 38 public:
36 MediaStreamVideoSourceTest() 39 MediaStreamVideoSourceTest()
37 : child_process_(new ChildProcess()), 40 : child_process_(new ChildProcess()),
38 number_of_successful_constraints_applied_(0), 41 number_of_successful_constraints_applied_(0),
39 number_of_failed_constraints_applied_(0), 42 number_of_failed_constraints_applied_(0),
40 result_(MEDIA_DEVICE_OK), 43 result_(MEDIA_DEVICE_OK),
41 result_name_(""), 44 result_name_(""),
42 mock_source_(new MockMediaStreamVideoSource(true)) { 45 mock_source_(new MockMediaStreamVideoSource(true)),
46 mock_source2_(new MockMediaStreamVideoSource(
47 media::VideoCaptureFormat(gfx::Size(1280, 720),
48 1000.0,
49 media::PIXEL_FORMAT_I420),
50 false)) {
43 media::VideoCaptureFormats formats; 51 media::VideoCaptureFormats formats;
44 formats.push_back(media::VideoCaptureFormat( 52 formats.push_back(media::VideoCaptureFormat(
45 gfx::Size(1280, 720), 30, media::PIXEL_FORMAT_I420)); 53 gfx::Size(1280, 720), 30, media::PIXEL_FORMAT_I420));
46 formats.push_back(media::VideoCaptureFormat( 54 formats.push_back(media::VideoCaptureFormat(
47 gfx::Size(640, 480), 30, media::PIXEL_FORMAT_I420)); 55 gfx::Size(640, 480), 30, media::PIXEL_FORMAT_I420));
48 formats.push_back(media::VideoCaptureFormat( 56 formats.push_back(media::VideoCaptureFormat(
49 gfx::Size(352, 288), 30, media::PIXEL_FORMAT_I420)); 57 gfx::Size(352, 288), 30, media::PIXEL_FORMAT_I420));
50 formats.push_back(media::VideoCaptureFormat( 58 formats.push_back(media::VideoCaptureFormat(
51 gfx::Size(320, 240), 30, media::PIXEL_FORMAT_I420)); 59 gfx::Size(320, 240), 30, media::PIXEL_FORMAT_I420));
52 mock_source_->SetSupportedFormats(formats); 60 mock_source_->SetSupportedFormats(formats);
53 webkit_source_.initialize(blink::WebString::fromASCII("dummy_source_id"), 61 webkit_source_.initialize(blink::WebString::fromASCII("dummy_source_id"),
54 blink::WebMediaStreamSource::TypeVideo, 62 blink::WebMediaStreamSource::TypeVideo,
55 blink::WebString::fromASCII("dummy_source_name"), 63 blink::WebString::fromASCII("dummy_source_name"),
56 false /* remote */); 64 false /* remote */);
57 webkit_source_.setExtraData(mock_source_); 65 webkit_source_.setExtraData(mock_source_);
66 webkit_source2_.initialize(blink::WebString::fromASCII("dummy_source_id"),
67 blink::WebMediaStreamSource::TypeVideo,
68 blink::WebString::fromASCII("dummy_source_name"),
69 false /* remote */);
70 webkit_source2_.setExtraData(mock_source2_);
58 } 71 }
59 72
60 void TearDown() override { 73 void TearDown() override {
61 webkit_source_.reset(); 74 webkit_source_.reset();
75 webkit_source2_.reset();
62 blink::WebHeap::collectAllGarbageForTesting(); 76 blink::WebHeap::collectAllGarbageForTesting();
63 } 77 }
64 78
65 protected: 79 protected:
66 // Create a track that's associated with |webkit_source_|. 80 // Create a track that's associated with |webkit_source_|.
67 blink::WebMediaStreamTrack CreateTrack( 81 blink::WebMediaStreamTrack CreateTrack(
68 const std::string& id, 82 const std::string& id,
69 const blink::WebMediaConstraints& constraints) { 83 const blink::WebMediaConstraints& constraints) {
70 bool enabled = true; 84 bool enabled = true;
71 return MediaStreamVideoTrack::CreateVideoTrack( 85 return MediaStreamVideoTrack::CreateVideoTrack(
72 mock_source_, constraints, 86 mock_source_, constraints,
73 base::Bind(&MediaStreamVideoSourceTest::OnConstraintsApplied, 87 base::Bind(&MediaStreamVideoSourceTest::OnConstraintsApplied,
74 base::Unretained(this)), 88 base::Unretained(this)),
75 enabled); 89 enabled);
76 } 90 }
77 91
92 blink::WebMediaStreamTrack CreateTrack(const std::string& id) {
93 bool enabled = true;
94 return MediaStreamVideoTrack::CreateVideoTrack(
95 mock_source2_,
96 base::Bind(&MediaStreamVideoSourceTest::OnConstraintsApplied,
97 base::Unretained(this)),
98 enabled);
99 }
100
101 blink::WebMediaStreamTrack CreateTrack(
102 const std::string& id,
103 const VideoTrackAdapterSettings& adapter_settings,
104 const base::Optional<bool>& noise_reduction,
105 bool is_screencast,
106 double min_frame_rate) {
107 bool enabled = true;
108 return MediaStreamVideoTrack::CreateVideoTrack(
109 mock_source2_, adapter_settings, noise_reduction, is_screencast,
110 min_frame_rate,
111 base::Bind(&MediaStreamVideoSourceTest::OnConstraintsApplied,
112 base::Unretained(this)),
113 enabled);
114 }
115
78 blink::WebMediaStreamTrack CreateTrackAndStartSource( 116 blink::WebMediaStreamTrack CreateTrackAndStartSource(
79 const blink::WebMediaConstraints& constraints, 117 const blink::WebMediaConstraints& constraints,
80 int expected_width, 118 int expected_width,
81 int expected_height, 119 int expected_height,
82 int expected_frame_rate) { 120 int expected_frame_rate) {
121 DCHECK(IsOldVideoConstraints());
83 blink::WebMediaStreamTrack track = CreateTrack("123", constraints); 122 blink::WebMediaStreamTrack track = CreateTrack("123", constraints);
84 123
85 mock_source_->CompleteGetSupportedFormats(); 124 mock_source_->CompleteGetSupportedFormats();
86 const media::VideoCaptureFormat& format = mock_source()->start_format(); 125 const media::VideoCaptureFormat& format = mock_source()->start_format();
87 EXPECT_EQ(expected_width, format.frame_size.width()); 126 EXPECT_EQ(expected_width, format.frame_size.width());
88 EXPECT_EQ(expected_height, format.frame_size.height()); 127 EXPECT_EQ(expected_height, format.frame_size.height());
89 EXPECT_EQ(expected_frame_rate, format.frame_rate); 128 EXPECT_EQ(expected_frame_rate, format.frame_rate);
90 129
91 EXPECT_EQ(0, NumberOfSuccessConstraintsCallbacks()); 130 EXPECT_EQ(0, NumberOfSuccessConstraintsCallbacks());
92 mock_source_->StartMockedSource(); 131 mock_source_->StartMockedSource();
93 // Once the source has started successfully we expect that the 132 // Once the source has started successfully we expect that the
94 // ConstraintsCallback in MediaStreamSource::AddTrack completes. 133 // ConstraintsCallback in MediaStreamSource::AddTrack completes.
95 EXPECT_EQ(1, NumberOfSuccessConstraintsCallbacks()); 134 EXPECT_EQ(1, NumberOfSuccessConstraintsCallbacks());
96 return track; 135 return track;
97 } 136 }
98 137
138 blink::WebMediaStreamTrack CreateTrackAndStartSource(int width,
139 int height,
140 double frame_rate) {
141 DCHECK(!IsOldVideoConstraints());
142 blink::WebMediaStreamTrack track = CreateTrack(
143 "123",
144 VideoTrackAdapterSettings(width, height, 0.0, HUGE_VAL, frame_rate),
145 base::Optional<bool>(), false, 0.0);
146
147 EXPECT_EQ(0, NumberOfSuccessConstraintsCallbacks());
148 mock_source2_->StartMockedSource();
149 // Once the source has started successfully we expect that the
150 // ConstraintsCallback in MediaStreamSource::AddTrack completes.
151 EXPECT_EQ(1, NumberOfSuccessConstraintsCallbacks());
152 return track;
153 }
154
99 int NumberOfSuccessConstraintsCallbacks() const { 155 int NumberOfSuccessConstraintsCallbacks() const {
100 return number_of_successful_constraints_applied_; 156 return number_of_successful_constraints_applied_;
101 } 157 }
102 158
103 int NumberOfFailedConstraintsCallbacks() const { 159 int NumberOfFailedConstraintsCallbacks() const {
104 return number_of_failed_constraints_applied_; 160 return number_of_failed_constraints_applied_;
105 } 161 }
106 162
107 content::MediaStreamRequestResult error_type() const { return result_; } 163 content::MediaStreamRequestResult error_type() const { return result_; }
108 blink::WebString error_name() const { return result_name_; } 164 blink::WebString error_name() const { return result_name_; }
109 165
110 MockMediaStreamVideoSource* mock_source() { return mock_source_; } 166 MockMediaStreamVideoSource* mock_source() {
167 return IsOldVideoConstraints() ? mock_source_ : mock_source2_;
168 }
169
170 const blink::WebMediaStreamSource& webkit_source() {
171 return IsOldVideoConstraints() ? webkit_source_ : webkit_source2_;
172 }
111 173
112 // Test that the source crops/scales to the requested width and 174 // Test that the source crops/scales to the requested width and
113 // height even though the camera delivers a larger frame. 175 // height even though the camera delivers a larger frame.
114 void TestSourceCropFrame(int capture_width, 176 void TestSourceCropFrame(int capture_width,
115 int capture_height, 177 int capture_height,
116 const blink::WebMediaConstraints& constraints, 178 const blink::WebMediaConstraints& constraints,
117 int expected_width, 179 int expected_width,
118 int expected_height) { 180 int expected_height) {
181 DCHECK(IsOldVideoConstraints());
119 // Expect the source to start capture with the supported resolution. 182 // Expect the source to start capture with the supported resolution.
120 blink::WebMediaStreamTrack track = 183 blink::WebMediaStreamTrack track = CreateTrackAndStartSource(
121 CreateTrackAndStartSource(constraints, capture_width, capture_height, 184 constraints, capture_width, capture_height, 30);
122 30);
123 185
124 MockMediaStreamVideoSink sink; 186 MockMediaStreamVideoSink sink;
125 sink.ConnectToTrack(track); 187 sink.ConnectToTrack(track);
126 DeliverVideoFrameAndWaitForRenderer(capture_width, capture_height, &sink); 188 DeliverVideoFrameAndWaitForRenderer(capture_width, capture_height, &sink);
189 EXPECT_EQ(1, sink.number_of_frames());
190
191 // Expect the delivered frame to be cropped.
192 EXPECT_EQ(expected_height, sink.frame_size().height());
193 EXPECT_EQ(expected_width, sink.frame_size().width());
194 sink.DisconnectFromTrack();
195 }
196
197 void TestSourceCropFrame(int capture_width,
198 int capture_height,
199 int expected_width,
200 int expected_height) {
201 DCHECK(!IsOldVideoConstraints());
202 // Configure the track to crop to the expected resolution.
203 blink::WebMediaStreamTrack track =
204 CreateTrackAndStartSource(expected_width, expected_height, 30.0);
205
206 // Produce frames at the capture resolution.
207 MockMediaStreamVideoSink sink;
208 sink.ConnectToTrack(track);
209 DeliverVideoFrameAndWaitForRenderer(capture_width, capture_height, &sink);
127 EXPECT_EQ(1, sink.number_of_frames()); 210 EXPECT_EQ(1, sink.number_of_frames());
128 211
129 // Expect the delivered frame to be cropped. 212 // Expect the delivered frame to be cropped.
130 EXPECT_EQ(expected_height, sink.frame_size().height()); 213 EXPECT_EQ(expected_height, sink.frame_size().height());
131 EXPECT_EQ(expected_width, sink.frame_size().width()); 214 EXPECT_EQ(expected_width, sink.frame_size().width());
132 sink.DisconnectFromTrack(); 215 sink.DisconnectFromTrack();
133 } 216 }
134 217
135 void DeliverVideoFrameAndWaitForRenderer(int width, int height, 218 void DeliverVideoFrameAndWaitForRenderer(int width, int height,
136 MockMediaStreamVideoSink* sink) { 219 MockMediaStreamVideoSink* sink) {
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 EXPECT_EQ(expected_height1, sink1.frame_size().height()); 276 EXPECT_EQ(expected_height1, sink1.frame_size().height());
194 277
195 EXPECT_EQ(1, sink2.number_of_frames()); 278 EXPECT_EQ(1, sink2.number_of_frames());
196 EXPECT_EQ(expected_width2, sink2.frame_size().width()); 279 EXPECT_EQ(expected_width2, sink2.frame_size().width());
197 EXPECT_EQ(expected_height2, sink2.frame_size().height()); 280 EXPECT_EQ(expected_height2, sink2.frame_size().height());
198 281
199 sink1.DisconnectFromTrack(); 282 sink1.DisconnectFromTrack();
200 sink2.DisconnectFromTrack(); 283 sink2.DisconnectFromTrack();
201 } 284 }
202 285
286 void TestTwoTracksWithDifferentSettings(int capture_width,
287 int capture_height,
288 int expected_width1,
289 int expected_height1,
290 int expected_width2,
291 int expected_height2) {
292 blink::WebMediaStreamTrack track1 =
293 CreateTrackAndStartSource(expected_width1, expected_height1,
294 MediaStreamVideoSource::kDefaultFrameRate);
295
296 blink::WebMediaStreamTrack track2 =
297 CreateTrack("dummy",
298 VideoTrackAdapterSettings(
299 expected_width2, expected_height2, 0.0, HUGE_VAL,
300 MediaStreamVideoSource::kDefaultFrameRate),
301 base::Optional<bool>(), false, 0.0);
302
303 MockMediaStreamVideoSink sink1;
304 sink1.ConnectToTrack(track1);
305 EXPECT_EQ(0, sink1.number_of_frames());
306
307 MockMediaStreamVideoSink sink2;
308 sink2.ConnectToTrack(track2);
309 EXPECT_EQ(0, sink2.number_of_frames());
310
311 DeliverVideoFrameAndWaitForTwoRenderers(capture_width, capture_height,
312 &sink1, &sink2);
313
314 EXPECT_EQ(1, sink1.number_of_frames());
315 EXPECT_EQ(expected_width1, sink1.frame_size().width());
316 EXPECT_EQ(expected_height1, sink1.frame_size().height());
317
318 EXPECT_EQ(1, sink2.number_of_frames());
319 EXPECT_EQ(expected_width2, sink2.frame_size().width());
320 EXPECT_EQ(expected_height2, sink2.frame_size().height());
321
322 sink1.DisconnectFromTrack();
323 sink2.DisconnectFromTrack();
324 }
203 void SetSourceSupportedFormats(const media::VideoCaptureFormats& formats) { 325 void SetSourceSupportedFormats(const media::VideoCaptureFormats& formats) {
204 mock_source_->SetSupportedFormats(formats); 326 mock_source_->SetSupportedFormats(formats);
205 } 327 }
206 328
207 void ReleaseTrackAndSourceOnAddTrackCallback( 329 void ReleaseTrackAndSourceOnAddTrackCallback(
208 const blink::WebMediaStreamTrack& track_to_release) { 330 const blink::WebMediaStreamTrack& track_to_release) {
209 track_to_release_ = track_to_release; 331 track_to_release_ = track_to_release;
210 } 332 }
211 333
212 private: 334 private:
213 void OnConstraintsApplied(MediaStreamSource* source, 335 void OnConstraintsApplied(MediaStreamSource* source,
214 MediaStreamRequestResult result, 336 MediaStreamRequestResult result,
215 const blink::WebString& result_name) { 337 const blink::WebString& result_name) {
216 ASSERT_EQ(source, webkit_source_.getExtraData()); 338 ASSERT_EQ(source, webkit_source().getExtraData());
217 339
218 if (result == MEDIA_DEVICE_OK) { 340 if (result == MEDIA_DEVICE_OK) {
219 ++number_of_successful_constraints_applied_; 341 ++number_of_successful_constraints_applied_;
220 } else { 342 } else {
221 result_ = result; 343 result_ = result;
222 result_name_ = result_name; 344 result_name_ = result_name;
223 ++number_of_failed_constraints_applied_; 345 ++number_of_failed_constraints_applied_;
224 } 346 }
225 347
226 if (!track_to_release_.isNull()) { 348 if (!track_to_release_.isNull()) {
227 mock_source_ = NULL; 349 mock_source_ = nullptr;
228 webkit_source_.reset(); 350 webkit_source_.reset();
351 mock_source2_ = nullptr;
352 webkit_source2_.reset();
229 track_to_release_.reset(); 353 track_to_release_.reset();
230 } 354 }
231 } 355 }
232 const base::MessageLoopForUI message_loop_; 356 const base::MessageLoopForUI message_loop_;
233 const std::unique_ptr<ChildProcess> child_process_; 357 const std::unique_ptr<ChildProcess> child_process_;
234 blink::WebMediaStreamTrack track_to_release_; 358 blink::WebMediaStreamTrack track_to_release_;
235 int number_of_successful_constraints_applied_; 359 int number_of_successful_constraints_applied_;
236 int number_of_failed_constraints_applied_; 360 int number_of_failed_constraints_applied_;
237 content::MediaStreamRequestResult result_; 361 content::MediaStreamRequestResult result_;
238 blink::WebString result_name_; 362 blink::WebString result_name_;
239 blink::WebMediaStreamSource webkit_source_; 363 blink::WebMediaStreamSource webkit_source_;
240 // |mock_source_| is owned by |webkit_source_|. 364 // |mock_source_| is owned by |webkit_source_|.
241 MockMediaStreamVideoSource* mock_source_; 365 MockMediaStreamVideoSource* mock_source_;
366 blink::WebMediaStreamSource webkit_source2_;
367 // |mock_source2_| is owned by |webkit_source2_|.
368 MockMediaStreamVideoSource* mock_source2_;
242 }; 369 };
243 370
244 TEST_F(MediaStreamVideoSourceTest, AddTrackAndStartSource) { 371 TEST_F(MediaStreamVideoSourceTest, AddTrackAndStartSource) {
372 base::test::ScopedFeatureList scoped_feature_list;
373 scoped_feature_list.InitAndEnableFeature(
374 features::kMediaStreamOldVideoConstraints);
245 blink::WebMediaConstraints constraints; 375 blink::WebMediaConstraints constraints;
246 constraints.initialize(); 376 constraints.initialize();
247 blink::WebMediaStreamTrack track = CreateTrack("123", constraints); 377 blink::WebMediaStreamTrack track = CreateTrack("123", constraints);
248 mock_source()->CompleteGetSupportedFormats(); 378 mock_source()->CompleteGetSupportedFormats();
249 mock_source()->StartMockedSource(); 379 mock_source()->StartMockedSource();
250 EXPECT_EQ(1, NumberOfSuccessConstraintsCallbacks()); 380 EXPECT_EQ(1, NumberOfSuccessConstraintsCallbacks());
251 } 381 }
252 382
383 TEST_F(MediaStreamVideoSourceTest, AddTrackAndStartSourceNew) {
384 base::test::ScopedFeatureList scoped_feature_list;
385 scoped_feature_list.InitAndDisableFeature(
386 features::kMediaStreamOldVideoConstraints);
387 blink::WebMediaStreamTrack track = CreateTrack("123");
388 mock_source()->StartMockedSource();
389 EXPECT_EQ(1, NumberOfSuccessConstraintsCallbacks());
390 }
391
253 TEST_F(MediaStreamVideoSourceTest, AddTwoTracksBeforeSourceStarts) { 392 TEST_F(MediaStreamVideoSourceTest, AddTwoTracksBeforeSourceStarts) {
393 base::test::ScopedFeatureList scoped_feature_list;
394 scoped_feature_list.InitAndEnableFeature(
395 features::kMediaStreamOldVideoConstraints);
254 blink::WebMediaConstraints constraints; 396 blink::WebMediaConstraints constraints;
255 constraints.initialize(); 397 constraints.initialize();
256 blink::WebMediaStreamTrack track1 = CreateTrack("123", constraints); 398 blink::WebMediaStreamTrack track1 = CreateTrack("123", constraints);
257 mock_source()->CompleteGetSupportedFormats(); 399 mock_source()->CompleteGetSupportedFormats();
258 blink::WebMediaStreamTrack track2 = CreateTrack("123", constraints); 400 blink::WebMediaStreamTrack track2 = CreateTrack("123", constraints);
259 EXPECT_EQ(0, NumberOfSuccessConstraintsCallbacks()); 401 EXPECT_EQ(0, NumberOfSuccessConstraintsCallbacks());
260 mock_source()->StartMockedSource(); 402 mock_source()->StartMockedSource();
261 EXPECT_EQ(2, NumberOfSuccessConstraintsCallbacks()); 403 EXPECT_EQ(2, NumberOfSuccessConstraintsCallbacks());
262 } 404 }
263 405
406 TEST_F(MediaStreamVideoSourceTest, AddTwoTracksBeforeSourceStartsNew) {
407 base::test::ScopedFeatureList scoped_feature_list;
408 scoped_feature_list.InitAndDisableFeature(
409 features::kMediaStreamOldVideoConstraints);
410 blink::WebMediaStreamTrack track1 = CreateTrack("123");
411 blink::WebMediaStreamTrack track2 = CreateTrack("123");
412 EXPECT_EQ(0, NumberOfSuccessConstraintsCallbacks());
413 mock_source()->StartMockedSource();
414 EXPECT_EQ(2, NumberOfSuccessConstraintsCallbacks());
415 }
416
264 TEST_F(MediaStreamVideoSourceTest, AddTrackAfterSourceStarts) { 417 TEST_F(MediaStreamVideoSourceTest, AddTrackAfterSourceStarts) {
418 base::test::ScopedFeatureList scoped_feature_list;
419 scoped_feature_list.InitAndEnableFeature(
420 features::kMediaStreamOldVideoConstraints);
265 blink::WebMediaConstraints constraints; 421 blink::WebMediaConstraints constraints;
266 constraints.initialize(); 422 constraints.initialize();
267 blink::WebMediaStreamTrack track1 = CreateTrack("123", constraints); 423 blink::WebMediaStreamTrack track1 = CreateTrack("123", constraints);
268 mock_source()->CompleteGetSupportedFormats(); 424 mock_source()->CompleteGetSupportedFormats();
269 mock_source()->StartMockedSource(); 425 mock_source()->StartMockedSource();
270 EXPECT_EQ(1, NumberOfSuccessConstraintsCallbacks()); 426 EXPECT_EQ(1, NumberOfSuccessConstraintsCallbacks());
271 blink::WebMediaStreamTrack track2 = CreateTrack("123", constraints); 427 blink::WebMediaStreamTrack track2 = CreateTrack("123", constraints);
272 EXPECT_EQ(2, NumberOfSuccessConstraintsCallbacks()); 428 EXPECT_EQ(2, NumberOfSuccessConstraintsCallbacks());
273 } 429 }
274 430
431 TEST_F(MediaStreamVideoSourceTest, AddTrackAfterSourceStartsNew) {
432 base::test::ScopedFeatureList scoped_feature_list;
433 scoped_feature_list.InitAndDisableFeature(
434 features::kMediaStreamOldVideoConstraints);
435 blink::WebMediaStreamTrack track1 = CreateTrack("123");
436 mock_source()->StartMockedSource();
437 EXPECT_EQ(1, NumberOfSuccessConstraintsCallbacks());
438 blink::WebMediaStreamTrack track2 = CreateTrack("123");
439 EXPECT_EQ(2, NumberOfSuccessConstraintsCallbacks());
440 }
441
275 TEST_F(MediaStreamVideoSourceTest, AddTrackAndFailToStartSource) { 442 TEST_F(MediaStreamVideoSourceTest, AddTrackAndFailToStartSource) {
443 base::test::ScopedFeatureList scoped_feature_list;
444 scoped_feature_list.InitAndEnableFeature(
445 features::kMediaStreamOldVideoConstraints);
276 blink::WebMediaConstraints constraints; 446 blink::WebMediaConstraints constraints;
277 constraints.initialize(); 447 constraints.initialize();
278 blink::WebMediaStreamTrack track = CreateTrack("123", constraints); 448 blink::WebMediaStreamTrack track = CreateTrack("123", constraints);
279 mock_source()->CompleteGetSupportedFormats(); 449 mock_source()->CompleteGetSupportedFormats();
280 mock_source()->FailToStartMockedSource(); 450 mock_source()->FailToStartMockedSource();
281 EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks()); 451 EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks());
282 } 452 }
283 453
454 TEST_F(MediaStreamVideoSourceTest, AddTrackAndFailToStartSourceNew) {
455 base::test::ScopedFeatureList scoped_feature_list;
456 scoped_feature_list.InitAndDisableFeature(
457 features::kMediaStreamOldVideoConstraints);
458 blink::WebMediaStreamTrack track = CreateTrack("123");
459 mock_source()->FailToStartMockedSource();
460 EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks());
461 }
462
463 // Does not apply with spec-compliant constraints.
284 TEST_F(MediaStreamVideoSourceTest, AddTwoTracksBeforeGetSupportedFormats) { 464 TEST_F(MediaStreamVideoSourceTest, AddTwoTracksBeforeGetSupportedFormats) {
465 base::test::ScopedFeatureList scoped_feature_list;
466 scoped_feature_list.InitAndEnableFeature(
467 features::kMediaStreamOldVideoConstraints);
285 blink::WebMediaConstraints constraints; 468 blink::WebMediaConstraints constraints;
286 constraints.initialize(); 469 constraints.initialize();
287 blink::WebMediaStreamTrack track1 = CreateTrack("123", constraints); 470 blink::WebMediaStreamTrack track1 = CreateTrack("123", constraints);
288 blink::WebMediaStreamTrack track2 = CreateTrack("123", constraints); 471 blink::WebMediaStreamTrack track2 = CreateTrack("123", constraints);
289 mock_source()->CompleteGetSupportedFormats(); 472 mock_source()->CompleteGetSupportedFormats();
290 mock_source()->StartMockedSource(); 473 mock_source()->StartMockedSource();
291 EXPECT_EQ(2, NumberOfSuccessConstraintsCallbacks()); 474 EXPECT_EQ(2, NumberOfSuccessConstraintsCallbacks());
292 } 475 }
293 476
294 // Test that the capture output is CIF if we set max constraints to CIF. 477 // Test that the capture output is CIF if we set max constraints to CIF.
295 // and the capture device support CIF. 478 // and the capture device support CIF.
479 // Does not apply with spec-compliant constraints.
296 TEST_F(MediaStreamVideoSourceTest, MandatoryConstraintCif5Fps) { 480 TEST_F(MediaStreamVideoSourceTest, MandatoryConstraintCif5Fps) {
481 base::test::ScopedFeatureList scoped_feature_list;
482 scoped_feature_list.InitAndEnableFeature(
483 features::kMediaStreamOldVideoConstraints);
297 MockConstraintFactory factory; 484 MockConstraintFactory factory;
298 factory.basic().width.setMax(352); 485 factory.basic().width.setMax(352);
299 factory.basic().height.setMax(288); 486 factory.basic().height.setMax(288);
300 factory.basic().frameRate.setMax(5.0); 487 factory.basic().frameRate.setMax(5.0);
301 488
302 CreateTrackAndStartSource(factory.CreateWebMediaConstraints(), 352, 288, 5); 489 CreateTrackAndStartSource(factory.CreateWebMediaConstraints(), 352, 288, 5);
303 } 490 }
304 491
305 // Test that the capture output is 720P if the camera support it and the 492 // Test that the capture output is 720P if the camera support it and the
306 // optional constraint is set to 720P. 493 // optional constraint is set to 720P.
494 // Does not apply with spec-compliant constraints.
307 TEST_F(MediaStreamVideoSourceTest, MandatoryMinVgaOptional720P) { 495 TEST_F(MediaStreamVideoSourceTest, MandatoryMinVgaOptional720P) {
496 base::test::ScopedFeatureList scoped_feature_list;
497 scoped_feature_list.InitAndEnableFeature(
498 features::kMediaStreamOldVideoConstraints);
308 MockConstraintFactory factory; 499 MockConstraintFactory factory;
309 factory.basic().width.setMin(640); 500 factory.basic().width.setMin(640);
310 factory.basic().height.setMin(480); 501 factory.basic().height.setMin(480);
311 factory.AddAdvanced().width.setMin(1280); 502 factory.AddAdvanced().width.setMin(1280);
312 factory.AddAdvanced().aspectRatio.setMin(1280.0 / 720); 503 factory.AddAdvanced().aspectRatio.setMin(1280.0 / 720);
313 504
314 CreateTrackAndStartSource(factory.CreateWebMediaConstraints(), 1280, 720, 30); 505 CreateTrackAndStartSource(factory.CreateWebMediaConstraints(), 1280, 720, 30);
315 } 506 }
316 507
317 // Test that the capture output is 720P if the camera supports it and the 508 // Test that the capture output is 720P if the camera supports it and the
318 // mandatory constraint is exactly width 1280. 509 // mandatory constraint is exactly width 1280.
510 // Does not apply with spec-compliant constraints.
319 TEST_F(MediaStreamVideoSourceTest, MandatoryExact720P) { 511 TEST_F(MediaStreamVideoSourceTest, MandatoryExact720P) {
512 base::test::ScopedFeatureList scoped_feature_list;
513 scoped_feature_list.InitAndEnableFeature(
514 features::kMediaStreamOldVideoConstraints);
320 MockConstraintFactory factory; 515 MockConstraintFactory factory;
321 factory.basic().width.setExact(1280); 516 factory.basic().width.setExact(1280);
322 CreateTrackAndStartSource(factory.CreateWebMediaConstraints(), 1280, 720, 30); 517 CreateTrackAndStartSource(factory.CreateWebMediaConstraints(), 1280, 720, 30);
323 } 518 }
324 519
325 // Test that the capture output have aspect ratio 4:3 if a mandatory constraint 520 // Test that the capture output have aspect ratio 4:3 if a mandatory constraint
326 // require it even if an optional constraint request a higher resolution 521 // require it even if an optional constraint request a higher resolution
327 // that don't have this aspect ratio. 522 // that don't have this aspect ratio.
328 TEST_F(MediaStreamVideoSourceTest, MandatoryAspectRatio4To3) { 523 TEST_F(MediaStreamVideoSourceTest, MandatoryAspectRatio4To3) {
524 base::test::ScopedFeatureList scoped_feature_list;
525 scoped_feature_list.InitAndEnableFeature(
526 features::kMediaStreamOldVideoConstraints);
329 MockConstraintFactory factory; 527 MockConstraintFactory factory;
330 factory.basic().width.setMin(640); 528 factory.basic().width.setMin(640);
331 factory.basic().height.setMin(480); 529 factory.basic().height.setMin(480);
332 factory.basic().aspectRatio.setMax(640.0 / 480); 530 factory.basic().aspectRatio.setMax(640.0 / 480);
333 factory.AddAdvanced().width.setMin(1280); 531 factory.AddAdvanced().width.setMin(1280);
334 532
335 TestSourceCropFrame(1280, 720, 533 TestSourceCropFrame(1280, 720, factory.CreateWebMediaConstraints(), 960, 720);
336 factory.CreateWebMediaConstraints(), 960, 720); 534 }
535
536 TEST_F(MediaStreamVideoSourceTest, MandatoryAspectRatio4To3New) {
537 base::test::ScopedFeatureList scoped_feature_list;
538 scoped_feature_list.InitAndDisableFeature(
539 features::kMediaStreamOldVideoConstraints);
540 TestSourceCropFrame(1280, 720, 960, 720);
337 } 541 }
338 542
339 // Test that AddTrack succeeds if the mandatory min aspect ratio it set to 2. 543 // Test that AddTrack succeeds if the mandatory min aspect ratio it set to 2.
340 TEST_F(MediaStreamVideoSourceTest, MandatoryAspectRatio2) { 544 TEST_F(MediaStreamVideoSourceTest, MandatoryAspectRatio2) {
545 base::test::ScopedFeatureList scoped_feature_list;
546 scoped_feature_list.InitAndEnableFeature(
547 features::kMediaStreamOldVideoConstraints);
341 MockConstraintFactory factory; 548 MockConstraintFactory factory;
342 factory.basic().aspectRatio.setMin(2.0); 549 factory.basic().aspectRatio.setMin(2.0);
343 550
344 TestSourceCropFrame(MediaStreamVideoSource::kDefaultWidth, 551 TestSourceCropFrame(MediaStreamVideoSource::kDefaultWidth,
345 MediaStreamVideoSource::kDefaultHeight, 552 MediaStreamVideoSource::kDefaultHeight,
346 factory.CreateWebMediaConstraints(), 640, 320); 553 factory.CreateWebMediaConstraints(), 640, 320);
347 } 554 }
348 555
556 TEST_F(MediaStreamVideoSourceTest, MandatoryAspectRatio2New) {
557 base::test::ScopedFeatureList scoped_feature_list;
558 scoped_feature_list.InitAndDisableFeature(
559 features::kMediaStreamOldVideoConstraints);
560 TestSourceCropFrame(1280, 720, 960, 720);
561 }
562
563 // Does not apply with spec-compliant constraints.
349 TEST_F(MediaStreamVideoSourceTest, MinAspectRatioLargerThanMaxAspectRatio) { 564 TEST_F(MediaStreamVideoSourceTest, MinAspectRatioLargerThanMaxAspectRatio) {
565 base::test::ScopedFeatureList scoped_feature_list;
566 scoped_feature_list.InitAndEnableFeature(
567 features::kMediaStreamOldVideoConstraints);
350 MockConstraintFactory factory; 568 MockConstraintFactory factory;
351 factory.basic().aspectRatio.setMin(2.0); 569 factory.basic().aspectRatio.setMin(2.0);
352 factory.basic().aspectRatio.setMax(1.0); 570 factory.basic().aspectRatio.setMax(1.0);
353 blink::WebMediaStreamTrack track = CreateTrack( 571 blink::WebMediaStreamTrack track =
354 "123", factory.CreateWebMediaConstraints()); 572 CreateTrack("123", factory.CreateWebMediaConstraints());
355 mock_source()->CompleteGetSupportedFormats(); 573 mock_source()->CompleteGetSupportedFormats();
356 EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks()); 574 EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks());
357 } 575 }
358 576
577 // Does not apply with spec-compliant constraints.
359 TEST_F(MediaStreamVideoSourceTest, MinWidthLargerThanMaxWidth) { 578 TEST_F(MediaStreamVideoSourceTest, MinWidthLargerThanMaxWidth) {
579 base::test::ScopedFeatureList scoped_feature_list;
580 scoped_feature_list.InitAndEnableFeature(
581 features::kMediaStreamOldVideoConstraints);
360 MockConstraintFactory factory; 582 MockConstraintFactory factory;
361 factory.basic().width.setMin(640); 583 factory.basic().width.setMin(640);
362 factory.basic().width.setMax(320); 584 factory.basic().width.setMax(320);
363 blink::WebMediaStreamTrack track = CreateTrack( 585 blink::WebMediaStreamTrack track =
364 "123", factory.CreateWebMediaConstraints()); 586 CreateTrack("123", factory.CreateWebMediaConstraints());
365 mock_source()->CompleteGetSupportedFormats(); 587 mock_source()->CompleteGetSupportedFormats();
366 EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks()); 588 EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks());
367 } 589 }
368 590
591 // Does not apply with spec-compliant constraints.
369 TEST_F(MediaStreamVideoSourceTest, MinHeightLargerThanMaxHeight) { 592 TEST_F(MediaStreamVideoSourceTest, MinHeightLargerThanMaxHeight) {
593 base::test::ScopedFeatureList scoped_feature_list;
594 scoped_feature_list.InitAndEnableFeature(
595 features::kMediaStreamOldVideoConstraints);
370 MockConstraintFactory factory; 596 MockConstraintFactory factory;
371 factory.basic().height.setMin(480); 597 factory.basic().height.setMin(480);
372 factory.basic().height.setMax(360); 598 factory.basic().height.setMax(360);
373 599
374 blink::WebMediaStreamTrack track = CreateTrack( 600 blink::WebMediaStreamTrack track =
375 "123", factory.CreateWebMediaConstraints()); 601 CreateTrack("123", factory.CreateWebMediaConstraints());
376 mock_source()->CompleteGetSupportedFormats(); 602 mock_source()->CompleteGetSupportedFormats();
377 EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks()); 603 EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks());
378 } 604 }
379 605
606 // Does not apply with spec-compliant constraints.
380 TEST_F(MediaStreamVideoSourceTest, MinFrameRateLargerThanMaxFrameRate) { 607 TEST_F(MediaStreamVideoSourceTest, MinFrameRateLargerThanMaxFrameRate) {
608 base::test::ScopedFeatureList scoped_feature_list;
609 scoped_feature_list.InitAndEnableFeature(
610 features::kMediaStreamOldVideoConstraints);
381 MockConstraintFactory factory; 611 MockConstraintFactory factory;
382 factory.basic().frameRate.setMin(25); 612 factory.basic().frameRate.setMin(25);
383 factory.basic().frameRate.setMax(15); 613 factory.basic().frameRate.setMax(15);
384 blink::WebMediaStreamTrack track = 614 blink::WebMediaStreamTrack track =
385 CreateTrack("123", factory.CreateWebMediaConstraints()); 615 CreateTrack("123", factory.CreateWebMediaConstraints());
386 mock_source()->CompleteGetSupportedFormats(); 616 mock_source()->CompleteGetSupportedFormats();
387 EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks()); 617 EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks());
388 } 618 }
389 619
620 // Does not apply with spec-compliant constraints.
390 TEST_F(MediaStreamVideoSourceTest, ExactWidthNotSupported) { 621 TEST_F(MediaStreamVideoSourceTest, ExactWidthNotSupported) {
622 base::test::ScopedFeatureList scoped_feature_list;
623 scoped_feature_list.InitAndEnableFeature(
624 features::kMediaStreamOldVideoConstraints);
391 MockConstraintFactory factory; 625 MockConstraintFactory factory;
392 factory.basic().width.setExact(12000); 626 factory.basic().width.setExact(12000);
393 blink::WebMediaStreamTrack track = 627 blink::WebMediaStreamTrack track =
394 CreateTrack("123", factory.CreateWebMediaConstraints()); 628 CreateTrack("123", factory.CreateWebMediaConstraints());
395 mock_source()->CompleteGetSupportedFormats(); 629 mock_source()->CompleteGetSupportedFormats();
396 EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks()); 630 EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks());
397 } 631 }
398 632
633 // Does not apply with spec-compliant constraints.
399 TEST_F(MediaStreamVideoSourceTest, MinWidthNotSupported) { 634 TEST_F(MediaStreamVideoSourceTest, MinWidthNotSupported) {
635 base::test::ScopedFeatureList scoped_feature_list;
636 scoped_feature_list.InitAndEnableFeature(
637 features::kMediaStreamOldVideoConstraints);
400 MockConstraintFactory factory; 638 MockConstraintFactory factory;
401 factory.basic().width.setMin(12000); 639 factory.basic().width.setMin(12000);
402 blink::WebMediaStreamTrack track = 640 blink::WebMediaStreamTrack track =
403 CreateTrack("123", factory.CreateWebMediaConstraints()); 641 CreateTrack("123", factory.CreateWebMediaConstraints());
404 mock_source()->CompleteGetSupportedFormats(); 642 mock_source()->CompleteGetSupportedFormats();
405 EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks()); 643 EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks());
406 } 644 }
407 645
408 // Test that its safe to release the last reference of a blink track and the 646 // Test that its safe to release the last reference of a blink track and the
409 // source during the callback if adding a track succeeds. 647 // source during the callback if adding a track succeeds.
410 TEST_F(MediaStreamVideoSourceTest, ReleaseTrackAndSourceOnSuccessCallBack) { 648 TEST_F(MediaStreamVideoSourceTest, ReleaseTrackAndSourceOnSuccessCallBack) {
649 base::test::ScopedFeatureList scoped_feature_list;
650 scoped_feature_list.InitAndEnableFeature(
651 features::kMediaStreamOldVideoConstraints);
411 MockConstraintFactory factory; 652 MockConstraintFactory factory;
412 { 653 blink::WebMediaStreamTrack track =
413 blink::WebMediaStreamTrack track = 654 CreateTrack("123", factory.CreateWebMediaConstraints());
414 CreateTrack("123", factory.CreateWebMediaConstraints()); 655 ReleaseTrackAndSourceOnAddTrackCallback(track);
415 ReleaseTrackAndSourceOnAddTrackCallback(track);
416 }
417 mock_source()->CompleteGetSupportedFormats(); 656 mock_source()->CompleteGetSupportedFormats();
418 mock_source()->StartMockedSource(); 657 mock_source()->StartMockedSource();
419 EXPECT_EQ(1, NumberOfSuccessConstraintsCallbacks()); 658 EXPECT_EQ(1, NumberOfSuccessConstraintsCallbacks());
420 } 659 }
421 660
661 TEST_F(MediaStreamVideoSourceTest, ReleaseTrackAndSourceOnSuccessCallBackNew) {
662 base::test::ScopedFeatureList scoped_feature_list;
663 scoped_feature_list.InitAndDisableFeature(
664 features::kMediaStreamOldVideoConstraints);
665 blink::WebMediaStreamTrack track = CreateTrack("123");
666 ReleaseTrackAndSourceOnAddTrackCallback(track);
667 mock_source()->StartMockedSource();
668 EXPECT_EQ(1, NumberOfSuccessConstraintsCallbacks());
669 }
670
422 // Test that its safe to release the last reference of a blink track and the 671 // Test that its safe to release the last reference of a blink track and the
423 // source during the callback if adding a track fails. 672 // source during the callback if adding a track fails.
673 // Does not apply with spec-compliant constraints.
424 TEST_F(MediaStreamVideoSourceTest, ReleaseTrackAndSourceOnFailureCallBack) { 674 TEST_F(MediaStreamVideoSourceTest, ReleaseTrackAndSourceOnFailureCallBack) {
675 base::test::ScopedFeatureList scoped_feature_list;
676 scoped_feature_list.InitAndEnableFeature(
677 features::kMediaStreamOldVideoConstraints);
425 MockConstraintFactory factory; 678 MockConstraintFactory factory;
426 factory.basic().width.setMin(99999); 679 factory.basic().width.setMin(99999);
427 { 680 {
428 blink::WebMediaStreamTrack track = 681 blink::WebMediaStreamTrack track =
429 CreateTrack("123", factory.CreateWebMediaConstraints()); 682 CreateTrack("123", factory.CreateWebMediaConstraints());
430 ReleaseTrackAndSourceOnAddTrackCallback(track); 683 ReleaseTrackAndSourceOnAddTrackCallback(track);
431 } 684 }
432 mock_source()->CompleteGetSupportedFormats(); 685 mock_source()->CompleteGetSupportedFormats();
433 EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks()); 686 EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks());
434 } 687 }
435 688
436 // Test that the source ignores an optional aspect ratio that is higher than 689 // Test that the source ignores an optional aspect ratio that is higher than
437 // supported. 690 // supported.
691 // Does not apply with spec-compliant constraints.
438 TEST_F(MediaStreamVideoSourceTest, OptionalAspectRatioTooHigh) { 692 TEST_F(MediaStreamVideoSourceTest, OptionalAspectRatioTooHigh) {
693 base::test::ScopedFeatureList scoped_feature_list;
694 scoped_feature_list.InitAndEnableFeature(
695 features::kMediaStreamOldVideoConstraints);
439 MockConstraintFactory factory; 696 MockConstraintFactory factory;
440 factory.AddAdvanced().aspectRatio.setMin(2.0); 697 factory.AddAdvanced().aspectRatio.setMin(2.0);
441 blink::WebMediaStreamTrack track = CreateTrack( 698 blink::WebMediaStreamTrack track =
442 "123", factory.CreateWebMediaConstraints()); 699 CreateTrack("123", factory.CreateWebMediaConstraints());
443 mock_source()->CompleteGetSupportedFormats(); 700 mock_source()->CompleteGetSupportedFormats();
444 701
445 const media::VideoCaptureFormat& format = mock_source()->start_format(); 702 const media::VideoCaptureFormat& format = mock_source()->start_format();
446 const double aspect_ratio = static_cast<double>(format.frame_size.width()) / 703 const double aspect_ratio = static_cast<double>(format.frame_size.width()) /
447 format.frame_size.height(); 704 format.frame_size.height();
448 EXPECT_LT(aspect_ratio, 2); 705 EXPECT_LT(aspect_ratio, 2);
449 } 706 }
450 707
451 // Test that the source starts video with the default resolution if the 708 // Test that the source starts video with the default resolution if the
452 // that is the only supported. 709 // that is the only supported.
710 // Does not apply with spec-compliant constraints.
453 TEST_F(MediaStreamVideoSourceTest, DefaultCapability) { 711 TEST_F(MediaStreamVideoSourceTest, DefaultCapability) {
712 base::test::ScopedFeatureList scoped_feature_list;
713 scoped_feature_list.InitAndEnableFeature(
714 features::kMediaStreamOldVideoConstraints);
454 media::VideoCaptureFormats formats; 715 media::VideoCaptureFormats formats;
455 formats.push_back(media::VideoCaptureFormat( 716 formats.push_back(media::VideoCaptureFormat(
456 gfx::Size(MediaStreamVideoSource::kDefaultWidth, 717 gfx::Size(MediaStreamVideoSource::kDefaultWidth,
457 MediaStreamVideoSource::kDefaultHeight), 718 MediaStreamVideoSource::kDefaultHeight),
458 MediaStreamVideoSource::kDefaultFrameRate, 719 MediaStreamVideoSource::kDefaultFrameRate, media::PIXEL_FORMAT_I420));
459 media::PIXEL_FORMAT_I420));
460 mock_source()->SetSupportedFormats(formats); 720 mock_source()->SetSupportedFormats(formats);
461 721
462 blink::WebMediaConstraints constraints; 722 blink::WebMediaConstraints constraints;
463 constraints.initialize(); 723 constraints.initialize();
464 CreateTrackAndStartSource(constraints, 724 CreateTrackAndStartSource(constraints, MediaStreamVideoSource::kDefaultWidth,
465 MediaStreamVideoSource::kDefaultWidth, 725 MediaStreamVideoSource::kDefaultHeight, 30);
466 MediaStreamVideoSource::kDefaultHeight,
467 30);
468 } 726 }
469 727
728 // Does not apply with spec-compliant constraints.
470 TEST_F(MediaStreamVideoSourceTest, InvalidMandatoryConstraint) { 729 TEST_F(MediaStreamVideoSourceTest, InvalidMandatoryConstraint) {
730 base::test::ScopedFeatureList scoped_feature_list;
731 scoped_feature_list.InitAndEnableFeature(
732 features::kMediaStreamOldVideoConstraints);
471 MockConstraintFactory factory; 733 MockConstraintFactory factory;
472 // Use a constraint that is only known for audio. 734 // Use a constraint that is only known for audio.
473 factory.basic().echoCancellation.setExact(true); 735 factory.basic().echoCancellation.setExact(true);
474 blink::WebMediaStreamTrack track = CreateTrack( 736 blink::WebMediaStreamTrack track =
475 "123", factory.CreateWebMediaConstraints()); 737 CreateTrack("123", factory.CreateWebMediaConstraints());
476 mock_source()->CompleteGetSupportedFormats(); 738 mock_source()->CompleteGetSupportedFormats();
477 EXPECT_EQ(MEDIA_DEVICE_CONSTRAINT_NOT_SATISFIED, error_type()); 739 EXPECT_EQ(MEDIA_DEVICE_CONSTRAINT_NOT_SATISFIED, error_type());
478 EXPECT_EQ("echoCancellation", error_name()); 740 EXPECT_EQ("echoCancellation", error_name());
479 EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks()); 741 EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks());
480 } 742 }
481 743
482 // Test that the source ignores an unknown optional constraint. 744 // Test that the source ignores an unknown optional constraint.
745 // Does not apply with spec-compliant constraints.
483 TEST_F(MediaStreamVideoSourceTest, InvalidOptionalConstraint) { 746 TEST_F(MediaStreamVideoSourceTest, InvalidOptionalConstraint) {
747 base::test::ScopedFeatureList scoped_feature_list;
748 scoped_feature_list.InitAndEnableFeature(
749 features::kMediaStreamOldVideoConstraints);
484 MockConstraintFactory factory; 750 MockConstraintFactory factory;
485 factory.AddAdvanced().echoCancellation.setExact(true); 751 factory.AddAdvanced().echoCancellation.setExact(true);
486 752
487 CreateTrackAndStartSource(factory.CreateWebMediaConstraints(), 753 CreateTrackAndStartSource(factory.CreateWebMediaConstraints(),
488 MediaStreamVideoSource::kDefaultWidth, 754 MediaStreamVideoSource::kDefaultWidth,
489 MediaStreamVideoSource::kDefaultHeight, 755 MediaStreamVideoSource::kDefaultHeight, 30);
490 30);
491 } 756 }
492 757
493 // Tests that the source starts video with the max width and height set by 758 // Tests that the source starts video with the max width and height set by
494 // constraints for screencast. 759 // constraints for screencast.
760 // Does not apply with spec-compliant constraints.
495 TEST_F(MediaStreamVideoSourceTest, ScreencastResolutionWithConstraint) { 761 TEST_F(MediaStreamVideoSourceTest, ScreencastResolutionWithConstraint) {
762 base::test::ScopedFeatureList scoped_feature_list;
763 scoped_feature_list.InitAndEnableFeature(
764 features::kMediaStreamOldVideoConstraints);
496 media::VideoCaptureFormats formats; 765 media::VideoCaptureFormats formats;
497 formats.push_back(media::VideoCaptureFormat( 766 formats.push_back(media::VideoCaptureFormat(gfx::Size(480, 270), 30,
498 gfx::Size(480, 270), 30, media::PIXEL_FORMAT_I420)); 767 media::PIXEL_FORMAT_I420));
499 mock_source()->SetSupportedFormats(formats); 768 mock_source()->SetSupportedFormats(formats);
500 MockConstraintFactory factory; 769 MockConstraintFactory factory;
501 factory.basic().width.setMax(480); 770 factory.basic().width.setMax(480);
502 factory.basic().height.setMax(270); 771 factory.basic().height.setMax(270);
503 772
504 blink::WebMediaStreamTrack track = CreateTrackAndStartSource( 773 blink::WebMediaStreamTrack track = CreateTrackAndStartSource(
505 factory.CreateWebMediaConstraints(), 480, 270, 30); 774 factory.CreateWebMediaConstraints(), 480, 270, 30);
506 EXPECT_EQ(480, mock_source()->max_requested_height()); 775 EXPECT_EQ(480, mock_source()->max_requested_height());
507 EXPECT_EQ(270, mock_source()->max_requested_width()); 776 EXPECT_EQ(270, mock_source()->max_requested_width());
508 } 777 }
509 778
510 // Test that optional constraints are applied in order. 779 // Test that optional constraints are applied in order.
780 // Does not apply with spec-compliant constraints.
511 TEST_F(MediaStreamVideoSourceTest, OptionalConstraints) { 781 TEST_F(MediaStreamVideoSourceTest, OptionalConstraints) {
782 base::test::ScopedFeatureList scoped_feature_list;
783 scoped_feature_list.InitAndEnableFeature(
784 features::kMediaStreamOldVideoConstraints);
512 MockConstraintFactory factory; 785 MockConstraintFactory factory;
513 // Min width of 2056 pixels can not be fulfilled. 786 // Min width of 2056 pixels can not be fulfilled.
514 factory.AddAdvanced().width.setMin(2056); 787 factory.AddAdvanced().width.setMin(2056);
515 factory.AddAdvanced().width.setMin(641); 788 factory.AddAdvanced().width.setMin(641);
516 // Since min width is set to 641 pixels, max width 640 can not be fulfilled. 789 // Since min width is set to 641 pixels, max width 640 can not be fulfilled.
517 factory.AddAdvanced().width.setMax(640); 790 factory.AddAdvanced().width.setMax(640);
518 CreateTrackAndStartSource(factory.CreateWebMediaConstraints(), 1280, 720, 30); 791 CreateTrackAndStartSource(factory.CreateWebMediaConstraints(), 1280, 720, 30);
519 } 792 }
520 793
521 // Test that the source crops to the requested max width and 794 // Test that the source crops to the requested max width and
522 // height even though the camera delivers a larger frame. 795 // height even though the camera delivers a larger frame.
796 // Redundant with spec-compliant constraints.
523 TEST_F(MediaStreamVideoSourceTest, DeliverCroppedVideoFrameOptional640360) { 797 TEST_F(MediaStreamVideoSourceTest, DeliverCroppedVideoFrameOptional640360) {
798 base::test::ScopedFeatureList scoped_feature_list;
799 scoped_feature_list.InitAndEnableFeature(
800 features::kMediaStreamOldVideoConstraints);
524 MockConstraintFactory factory; 801 MockConstraintFactory factory;
525 factory.AddAdvanced().width.setMax(640); 802 factory.AddAdvanced().width.setMax(640);
526 factory.AddAdvanced().height.setMax(360); 803 factory.AddAdvanced().height.setMax(360);
527 TestSourceCropFrame(640, 480, factory.CreateWebMediaConstraints(), 640, 360); 804 TestSourceCropFrame(640, 480, factory.CreateWebMediaConstraints(), 640, 360);
528 } 805 }
529 806
807 // Redundant with spec-compliant constraints.
530 TEST_F(MediaStreamVideoSourceTest, DeliverCroppedVideoFrameMandatory640360) { 808 TEST_F(MediaStreamVideoSourceTest, DeliverCroppedVideoFrameMandatory640360) {
809 base::test::ScopedFeatureList scoped_feature_list;
810 scoped_feature_list.InitAndEnableFeature(
811 features::kMediaStreamOldVideoConstraints);
531 MockConstraintFactory factory; 812 MockConstraintFactory factory;
532 factory.basic().width.setMax(640); 813 factory.basic().width.setMax(640);
533 factory.basic().height.setMax(360); 814 factory.basic().height.setMax(360);
534 TestSourceCropFrame(640, 480, factory.CreateWebMediaConstraints(), 640, 360); 815 TestSourceCropFrame(640, 480, factory.CreateWebMediaConstraints(), 640, 360);
535 } 816 }
536 817
818 // Redundant with spec-compliant constraints.
537 TEST_F(MediaStreamVideoSourceTest, DeliverCroppedVideoFrameMandatory732489) { 819 TEST_F(MediaStreamVideoSourceTest, DeliverCroppedVideoFrameMandatory732489) {
820 base::test::ScopedFeatureList scoped_feature_list;
821 scoped_feature_list.InitAndEnableFeature(
822 features::kMediaStreamOldVideoConstraints);
538 MockConstraintFactory factory; 823 MockConstraintFactory factory;
539 factory.basic().width.setMax(732); 824 factory.basic().width.setMax(732);
540 factory.basic().height.setMax(489); 825 factory.basic().height.setMax(489);
541 factory.basic().width.setMin(732); 826 factory.basic().width.setMin(732);
542 factory.basic().height.setMin(489); 827 factory.basic().height.setMin(489);
543 TestSourceCropFrame(1280, 720, factory.CreateWebMediaConstraints(), 732, 489); 828 TestSourceCropFrame(1280, 720, factory.CreateWebMediaConstraints(), 732, 489);
544 } 829 }
545 830
546 // Test that the source crops to the requested max width and 831 // Test that the source crops to the requested max width and
547 // height even though the requested frame has odd size. 832 // height even though the requested frame has odd size.
833 // Redundant with spec-compliant constraints.
548 TEST_F(MediaStreamVideoSourceTest, DeliverCroppedVideoFrame637359) { 834 TEST_F(MediaStreamVideoSourceTest, DeliverCroppedVideoFrame637359) {
835 base::test::ScopedFeatureList scoped_feature_list;
836 scoped_feature_list.InitAndEnableFeature(
837 features::kMediaStreamOldVideoConstraints);
549 MockConstraintFactory factory; 838 MockConstraintFactory factory;
550 factory.AddAdvanced().width.setMax(637); 839 factory.AddAdvanced().width.setMax(637);
551 factory.AddAdvanced().height.setMax(359); 840 factory.AddAdvanced().height.setMax(359);
552 TestSourceCropFrame(640, 480, factory.CreateWebMediaConstraints(), 637, 359); 841 TestSourceCropFrame(640, 480, factory.CreateWebMediaConstraints(), 637, 359);
553 } 842 }
554 843
844 // Redundant with spec-compliant constraints.
555 TEST_F(MediaStreamVideoSourceTest, DeliverCroppedVideoFrame320320) { 845 TEST_F(MediaStreamVideoSourceTest, DeliverCroppedVideoFrame320320) {
846 base::test::ScopedFeatureList scoped_feature_list;
847 scoped_feature_list.InitAndEnableFeature(
848 features::kMediaStreamOldVideoConstraints);
556 MockConstraintFactory factory; 849 MockConstraintFactory factory;
557 factory.basic().width.setMax(320); 850 factory.basic().width.setMax(320);
558 factory.basic().height.setMax(320); 851 factory.basic().height.setMax(320);
559 factory.basic().height.setMin(320); 852 factory.basic().height.setMin(320);
560 factory.basic().width.setMax(320); 853 factory.basic().width.setMax(320);
561 TestSourceCropFrame(640, 480, factory.CreateWebMediaConstraints(), 320, 320); 854 TestSourceCropFrame(640, 480, factory.CreateWebMediaConstraints(), 320, 320);
562 } 855 }
563 856
857 // Redundant with spec-compliant constraints.
564 TEST_F(MediaStreamVideoSourceTest, DeliverSmallerSizeWhenTooLargeMax) { 858 TEST_F(MediaStreamVideoSourceTest, DeliverSmallerSizeWhenTooLargeMax) {
859 base::test::ScopedFeatureList scoped_feature_list;
860 scoped_feature_list.InitAndEnableFeature(
861 features::kMediaStreamOldVideoConstraints);
565 MockConstraintFactory factory; 862 MockConstraintFactory factory;
566 factory.AddAdvanced().width.setMax(1920); 863 factory.AddAdvanced().width.setMax(1920);
567 factory.AddAdvanced().height.setMax(1080); 864 factory.AddAdvanced().height.setMax(1080);
568 factory.AddAdvanced().width.setMin(1280); 865 factory.AddAdvanced().width.setMin(1280);
569 factory.AddAdvanced().height.setMin(720); 866 factory.AddAdvanced().height.setMin(720);
570 TestSourceCropFrame(1280, 720, factory.CreateWebMediaConstraints(), 867 TestSourceCropFrame(1280, 720, factory.CreateWebMediaConstraints(), 1280,
571 1280, 720); 868 720);
572 } 869 }
573 870
574 TEST_F(MediaStreamVideoSourceTest, TwoTracksWithVGAAndWVGA) { 871 TEST_F(MediaStreamVideoSourceTest, TwoTracksWithVGAAndWVGA) {
872 base::test::ScopedFeatureList scoped_feature_list;
873 scoped_feature_list.InitAndEnableFeature(
874 features::kMediaStreamOldVideoConstraints);
575 MockConstraintFactory factory1; 875 MockConstraintFactory factory1;
576 factory1.AddAdvanced().width.setMax(640); 876 factory1.AddAdvanced().width.setMax(640);
577 factory1.AddAdvanced().height.setMax(480); 877 factory1.AddAdvanced().height.setMax(480);
578 878
579 MockConstraintFactory factory2; 879 MockConstraintFactory factory2;
580 factory2.AddAdvanced().height.setMax(360); 880 factory2.AddAdvanced().height.setMax(360);
581 881
582 TestTwoTracksWithDifferentConstraints(factory1.CreateWebMediaConstraints(), 882 TestTwoTracksWithDifferentConstraints(factory1.CreateWebMediaConstraints(),
583 factory2.CreateWebMediaConstraints(), 883 factory2.CreateWebMediaConstraints(),
584 640, 480, 884 640, 480, 640, 480, 640, 360);
585 640, 480, 885 }
586 640, 360); 886
887 TEST_F(MediaStreamVideoSourceTest, TwoTracksWithVGAAndWVGANew) {
888 base::test::ScopedFeatureList scoped_feature_list;
889 scoped_feature_list.InitAndDisableFeature(
890 features::kMediaStreamOldVideoConstraints);
891 TestTwoTracksWithDifferentSettings(640, 480, 640, 480, 640, 360);
587 } 892 }
588 893
589 TEST_F(MediaStreamVideoSourceTest, TwoTracksWith720AndWVGA) { 894 TEST_F(MediaStreamVideoSourceTest, TwoTracksWith720AndWVGA) {
895 base::test::ScopedFeatureList scoped_feature_list;
896 scoped_feature_list.InitAndEnableFeature(
897 features::kMediaStreamOldVideoConstraints);
590 MockConstraintFactory factory1; 898 MockConstraintFactory factory1;
591 factory1.AddAdvanced().width.setMin(1280); 899 factory1.AddAdvanced().width.setMin(1280);
592 factory1.AddAdvanced().height.setMin(720); 900 factory1.AddAdvanced().height.setMin(720);
593 901
594 MockConstraintFactory factory2; 902 MockConstraintFactory factory2;
595 factory2.basic().width.setMax(640); 903 factory2.basic().width.setMax(640);
596 factory2.basic().height.setMax(360); 904 factory2.basic().height.setMax(360);
597 905
598 TestTwoTracksWithDifferentConstraints(factory1.CreateWebMediaConstraints(), 906 TestTwoTracksWithDifferentConstraints(factory1.CreateWebMediaConstraints(),
599 factory2.CreateWebMediaConstraints(), 907 factory2.CreateWebMediaConstraints(),
600 1280, 720, 908 1280, 720, 1280, 720, 640, 360);
601 1280, 720,
602 640, 360);
603 } 909 }
604 910
911 TEST_F(MediaStreamVideoSourceTest, TwoTracksWith720AndWVGANew) {
912 base::test::ScopedFeatureList scoped_feature_list;
913 scoped_feature_list.InitAndDisableFeature(
914 features::kMediaStreamOldVideoConstraints);
915 TestTwoTracksWithDifferentSettings(1280, 720, 1280, 720, 640, 360);
916 }
917
918 // Redundant with spec-compliant constraints
605 TEST_F(MediaStreamVideoSourceTest, TwoTracksWith720AndW700H700) { 919 TEST_F(MediaStreamVideoSourceTest, TwoTracksWith720AndW700H700) {
920 base::test::ScopedFeatureList scoped_feature_list;
921 scoped_feature_list.InitAndEnableFeature(
922 features::kMediaStreamOldVideoConstraints);
606 MockConstraintFactory factory1; 923 MockConstraintFactory factory1;
607 factory1.AddAdvanced().width.setMin(1280); 924 factory1.AddAdvanced().width.setMin(1280);
608 factory1.AddAdvanced().height.setMin(720); 925 factory1.AddAdvanced().height.setMin(720);
609 926
610 MockConstraintFactory factory2; 927 MockConstraintFactory factory2;
611 factory2.basic().width.setMax(700); 928 factory2.basic().width.setMax(700);
612 factory2.basic().height.setMax(700); 929 factory2.basic().height.setMax(700);
613 930
614 TestTwoTracksWithDifferentConstraints(factory1.CreateWebMediaConstraints(), 931 TestTwoTracksWithDifferentConstraints(factory1.CreateWebMediaConstraints(),
615 factory2.CreateWebMediaConstraints(), 932 factory2.CreateWebMediaConstraints(),
616 1280, 720, 933 1280, 720, 1280, 720, 700, 700);
617 1280, 720,
618 700, 700);
619 } 934 }
620 935
936 // Redundant with spec-compliant constraints
621 TEST_F(MediaStreamVideoSourceTest, TwoTracksWith720AndMaxAspectRatio4To3) { 937 TEST_F(MediaStreamVideoSourceTest, TwoTracksWith720AndMaxAspectRatio4To3) {
938 base::test::ScopedFeatureList scoped_feature_list;
939 scoped_feature_list.InitAndEnableFeature(
940 features::kMediaStreamOldVideoConstraints);
622 MockConstraintFactory factory1; 941 MockConstraintFactory factory1;
623 factory1.AddAdvanced().width.setMin(1280); 942 factory1.AddAdvanced().width.setMin(1280);
624 factory1.AddAdvanced().height.setMin(720); 943 factory1.AddAdvanced().height.setMin(720);
625 944
626 MockConstraintFactory factory2; 945 MockConstraintFactory factory2;
627 factory2.basic().aspectRatio.setMax(640.0 / 480); 946 factory2.basic().aspectRatio.setMax(640.0 / 480);
628 947
629 TestTwoTracksWithDifferentConstraints(factory1.CreateWebMediaConstraints(), 948 TestTwoTracksWithDifferentConstraints(factory1.CreateWebMediaConstraints(),
630 factory2.CreateWebMediaConstraints(), 949 factory2.CreateWebMediaConstraints(),
631 1280, 720, 950 1280, 720, 1280, 720, 960, 720);
632 1280, 720,
633 960, 720);
634 } 951 }
635 952
953 // Redundant with spec-compliant constraints
636 TEST_F(MediaStreamVideoSourceTest, TwoTracksWithVgaAndMinAspectRatio) { 954 TEST_F(MediaStreamVideoSourceTest, TwoTracksWithVgaAndMinAspectRatio) {
955 base::test::ScopedFeatureList scoped_feature_list;
956 scoped_feature_list.InitAndEnableFeature(
957 features::kMediaStreamOldVideoConstraints);
637 MockConstraintFactory factory1; 958 MockConstraintFactory factory1;
638 factory1.AddAdvanced().width.setMax(640); 959 factory1.AddAdvanced().width.setMax(640);
639 factory1.AddAdvanced().height.setMax(480); 960 factory1.AddAdvanced().height.setMax(480);
640 961
641 MockConstraintFactory factory2; 962 MockConstraintFactory factory2;
642 factory2.basic().aspectRatio.setMin(640.0 / 360); 963 factory2.basic().aspectRatio.setMin(640.0 / 360);
643 964
644 TestTwoTracksWithDifferentConstraints(factory1.CreateWebMediaConstraints(), 965 TestTwoTracksWithDifferentConstraints(factory1.CreateWebMediaConstraints(),
645 factory2.CreateWebMediaConstraints(), 966 factory2.CreateWebMediaConstraints(),
646 640, 480, 967 640, 480, 640, 480, 640, 360);
647 640, 480,
648 640, 360);
649 } 968 }
650 969
970 // Does not apply with spec-compliant constraints
651 TEST_F(MediaStreamVideoSourceTest, 971 TEST_F(MediaStreamVideoSourceTest,
652 TwoTracksWithSecondTrackFrameRateHigherThanFirst) { 972 TwoTracksWithSecondTrackFrameRateHigherThanFirst) {
973 base::test::ScopedFeatureList scoped_feature_list;
974 scoped_feature_list.InitAndEnableFeature(
975 features::kMediaStreamOldVideoConstraints);
653 MockConstraintFactory factory1; 976 MockConstraintFactory factory1;
654 factory1.basic().frameRate.setMin(15); 977 factory1.basic().frameRate.setMin(15);
655 factory1.basic().frameRate.setMax(15); 978 factory1.basic().frameRate.setMax(15);
656 979
657 blink::WebMediaStreamTrack track1 = 980 blink::WebMediaStreamTrack track1 =
658 CreateTrackAndStartSource(factory1.CreateWebMediaConstraints(), 981 CreateTrackAndStartSource(factory1.CreateWebMediaConstraints(),
659 MediaStreamVideoSource::kDefaultWidth, 982 MediaStreamVideoSource::kDefaultWidth,
660 MediaStreamVideoSource::kDefaultHeight, 983 MediaStreamVideoSource::kDefaultHeight, 15);
661 15);
662 984
663 MockConstraintFactory factory2; 985 MockConstraintFactory factory2;
664 factory2.basic().frameRate.setMin(30); 986 factory2.basic().frameRate.setMin(30);
665 blink::WebMediaStreamTrack track2 = CreateTrack( 987 blink::WebMediaStreamTrack track2 =
666 "123", factory2.CreateWebMediaConstraints()); 988 CreateTrack("123", factory2.CreateWebMediaConstraints());
667 EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks()); 989 EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks());
668 } 990 }
669 991
670 // Test that a source can change the frame resolution on the fly and that 992 // Test that a source can change the frame resolution on the fly and that
671 // tracks sinks get the new frame size unless constraints force the frame to be 993 // tracks sinks get the new frame size unless constraints force the frame to be
672 // cropped. 994 // cropped.
673 TEST_F(MediaStreamVideoSourceTest, SourceChangeFrameSize) { 995 TEST_F(MediaStreamVideoSourceTest, SourceChangeFrameSize) {
996 base::test::ScopedFeatureList scoped_feature_list;
997 scoped_feature_list.InitAndEnableFeature(
998 features::kMediaStreamOldVideoConstraints);
674 MockConstraintFactory factory; 999 MockConstraintFactory factory;
675 factory.AddAdvanced().width.setMax(800); 1000 factory.AddAdvanced().width.setMax(800);
676 factory.AddAdvanced().height.setMax(700); 1001 factory.AddAdvanced().height.setMax(700);
677 1002
678 // Expect the source to start capture with the supported resolution. 1003 // Expect the source to start capture with the supported resolution.
679 blink::WebMediaStreamTrack track = 1004 // Disable frame-rate adjustment in spec-compliant mode to ensure no frames
680 CreateTrackAndStartSource(factory.CreateWebMediaConstraints(), 1005 // are dropped.
681 640, 480, 30); 1006 blink::WebMediaStreamTrack track = CreateTrackAndStartSource(
1007 factory.CreateWebMediaConstraints(), 640, 480, 30);
682 1008
683 MockMediaStreamVideoSink sink; 1009 MockMediaStreamVideoSink sink;
684 sink.ConnectToTrack(track); 1010 sink.ConnectToTrack(track);
685 EXPECT_EQ(0, sink.number_of_frames()); 1011 EXPECT_EQ(0, sink.number_of_frames());
686 DeliverVideoFrameAndWaitForRenderer(320, 240, &sink); 1012 DeliverVideoFrameAndWaitForRenderer(320, 240, &sink);
687 EXPECT_EQ(1, sink.number_of_frames()); 1013 EXPECT_EQ(1, sink.number_of_frames());
688 // Expect the delivered frame to be passed unchanged since its smaller than 1014 // Expect the delivered frame to be passed unchanged since its smaller than
689 // max requested. 1015 // max requested.
690 EXPECT_EQ(320, sink.frame_size().width()); 1016 EXPECT_EQ(320, sink.frame_size().width());
691 EXPECT_EQ(240, sink.frame_size().height()); 1017 EXPECT_EQ(240, sink.frame_size().height());
692 1018
693 DeliverVideoFrameAndWaitForRenderer(640, 480, &sink); 1019 DeliverVideoFrameAndWaitForRenderer(640, 480, &sink);
694 EXPECT_EQ(2, sink.number_of_frames()); 1020 EXPECT_EQ(2, sink.number_of_frames());
695 // Expect the delivered frame to be passed unchanged since its smaller than 1021 // Expect the delivered frame to be passed unchanged since its smaller than
696 // max requested. 1022 // max requested.
697 EXPECT_EQ(640, sink.frame_size().width()); 1023 EXPECT_EQ(640, sink.frame_size().width());
698 EXPECT_EQ(480, sink.frame_size().height()); 1024 EXPECT_EQ(480, sink.frame_size().height());
699 1025
700 DeliverVideoFrameAndWaitForRenderer(1280, 720, &sink); 1026 DeliverVideoFrameAndWaitForRenderer(1280, 720, &sink);
701
702 EXPECT_EQ(3, sink.number_of_frames()); 1027 EXPECT_EQ(3, sink.number_of_frames());
703 // Expect a frame to be cropped since its larger than max requested. 1028 // Expect a frame to be cropped since its larger than max requested.
704 EXPECT_EQ(800, sink.frame_size().width()); 1029 EXPECT_EQ(800, sink.frame_size().width());
1030 EXPECT_EQ(700, sink.frame_size().height());
1031
1032 sink.DisconnectFromTrack();
1033 }
1034
1035 TEST_F(MediaStreamVideoSourceTest, SourceChangeFrameSizeNew) {
1036 base::test::ScopedFeatureList scoped_feature_list;
1037 scoped_feature_list.InitAndDisableFeature(
1038 features::kMediaStreamOldVideoConstraints);
1039 MockConstraintFactory factory;
1040 factory.AddAdvanced().width.setMax(800);
1041 factory.AddAdvanced().height.setMax(700);
1042
1043 // Expect the source to start capture with the supported resolution.
1044 // Disable frame-rate adjustment in spec-compliant mode to ensure no frames
1045 // are dropped.
1046 blink::WebMediaStreamTrack track = CreateTrackAndStartSource(800, 700, 0.0);
1047
1048 MockMediaStreamVideoSink sink;
1049 sink.ConnectToTrack(track);
1050 EXPECT_EQ(0, sink.number_of_frames());
1051 DeliverVideoFrameAndWaitForRenderer(320, 240, &sink);
1052 EXPECT_EQ(1, sink.number_of_frames());
1053 // Expect the delivered frame to be passed unchanged since its smaller than
1054 // max requested.
1055 EXPECT_EQ(320, sink.frame_size().width());
1056 EXPECT_EQ(240, sink.frame_size().height());
1057
1058 DeliverVideoFrameAndWaitForRenderer(640, 480, &sink);
1059 EXPECT_EQ(2, sink.number_of_frames());
1060 // Expect the delivered frame to be passed unchanged since its smaller than
1061 // max requested.
1062 EXPECT_EQ(640, sink.frame_size().width());
1063 EXPECT_EQ(480, sink.frame_size().height());
1064
1065 DeliverVideoFrameAndWaitForRenderer(1280, 720, &sink);
1066 EXPECT_EQ(3, sink.number_of_frames());
1067 // Expect a frame to be cropped since its larger than max requested.
1068 EXPECT_EQ(800, sink.frame_size().width());
705 EXPECT_EQ(700, sink.frame_size().height()); 1069 EXPECT_EQ(700, sink.frame_size().height());
706 1070
707 sink.DisconnectFromTrack(); 1071 sink.DisconnectFromTrack();
708 } 1072 }
709 1073
710 // Test that the constraint negotiation can handle 0.0 fps as frame rate. 1074 // Test that the constraint negotiation can handle 0.0 fps as frame rate.
1075 // Does not apply to spec-compliant constraints.
711 TEST_F(MediaStreamVideoSourceTest, Use0FpsSupportedFormat) { 1076 TEST_F(MediaStreamVideoSourceTest, Use0FpsSupportedFormat) {
1077 base::test::ScopedFeatureList scoped_feature_list;
1078 scoped_feature_list.InitAndEnableFeature(
1079 features::kMediaStreamOldVideoConstraints);
712 media::VideoCaptureFormats formats; 1080 media::VideoCaptureFormats formats;
713 formats.push_back(media::VideoCaptureFormat( 1081 formats.push_back(media::VideoCaptureFormat(gfx::Size(640, 480), 0.0f,
714 gfx::Size(640, 480), 0.0f, media::PIXEL_FORMAT_I420)); 1082 media::PIXEL_FORMAT_I420));
715 formats.push_back(media::VideoCaptureFormat( 1083 formats.push_back(media::VideoCaptureFormat(gfx::Size(320, 240), 0.0f,
716 gfx::Size(320, 240), 0.0f, media::PIXEL_FORMAT_I420)); 1084 media::PIXEL_FORMAT_I420));
717 mock_source()->SetSupportedFormats(formats); 1085 mock_source()->SetSupportedFormats(formats);
718 1086
719 blink::WebMediaConstraints constraints; 1087 blink::WebMediaConstraints constraints;
720 constraints.initialize(); 1088 constraints.initialize();
721 blink::WebMediaStreamTrack track = CreateTrack("123", constraints); 1089 blink::WebMediaStreamTrack track = CreateTrack("123", constraints);
722 mock_source()->CompleteGetSupportedFormats(); 1090 mock_source()->CompleteGetSupportedFormats();
723 mock_source()->StartMockedSource(); 1091 mock_source()->StartMockedSource();
724 EXPECT_EQ(1, NumberOfSuccessConstraintsCallbacks()); 1092 EXPECT_EQ(1, NumberOfSuccessConstraintsCallbacks());
725 1093
726 MockMediaStreamVideoSink sink; 1094 MockMediaStreamVideoSink sink;
727 sink.ConnectToTrack(track); 1095 sink.ConnectToTrack(track);
728 EXPECT_EQ(0, sink.number_of_frames()); 1096 EXPECT_EQ(0, sink.number_of_frames());
729 DeliverVideoFrameAndWaitForRenderer(320, 240, &sink); 1097 DeliverVideoFrameAndWaitForRenderer(320, 240, &sink);
730 EXPECT_EQ(1, sink.number_of_frames()); 1098 EXPECT_EQ(1, sink.number_of_frames());
731 // Expect the delivered frame to be passed unchanged since its smaller than 1099 // Expect the delivered frame to be passed unchanged since its smaller than
732 // max requested. 1100 // max requested.
733 EXPECT_EQ(320, sink.frame_size().width()); 1101 EXPECT_EQ(320, sink.frame_size().width());
734 EXPECT_EQ(240, sink.frame_size().height()); 1102 EXPECT_EQ(240, sink.frame_size().height());
735 sink.DisconnectFromTrack(); 1103 sink.DisconnectFromTrack();
736 } 1104 }
737 1105
738 // Test that a source producing no frames change the source ReadyState to muted. 1106 // Test that a source producing no frames change the source ReadyState to muted.
739 // that in a reasonable time frame the muted state turns to false. 1107 // that in a reasonable time frame the muted state turns to false.
740 TEST_F(MediaStreamVideoSourceTest, MutedSource) { 1108 TEST_F(MediaStreamVideoSourceTest, MutedSource) {
1109 base::test::ScopedFeatureList scoped_feature_list;
1110 scoped_feature_list.InitAndEnableFeature(
1111 features::kMediaStreamOldVideoConstraints);
741 // Setup the source for support a frame rate of 999 fps in order to test 1112 // Setup the source for support a frame rate of 999 fps in order to test
742 // the muted event faster. This is since the frame monitoring uses 1113 // the muted event faster. This is since the frame monitoring uses
743 // PostDelayedTask that is dependent on the source frame rate. 1114 // PostDelayedTask that is dependent on the source frame rate.
744 // Note that media::limits::kMaxFramesPerSecond is 1000. 1115 // Note that media::limits::kMaxFramesPerSecond is 1000.
745 media::VideoCaptureFormats formats; 1116 media::VideoCaptureFormats formats;
746 formats.push_back(media::VideoCaptureFormat( 1117 formats.push_back(media::VideoCaptureFormat(
747 gfx::Size(640, 480), media::limits::kMaxFramesPerSecond - 1, 1118 gfx::Size(640, 480), media::limits::kMaxFramesPerSecond - 1,
748 media::PIXEL_FORMAT_I420)); 1119 media::PIXEL_FORMAT_I420));
749 SetSourceSupportedFormats(formats); 1120 SetSourceSupportedFormats(formats);
750 1121
751 MockConstraintFactory factory; 1122 MockConstraintFactory factory;
752 blink::WebMediaStreamTrack track = 1123 blink::WebMediaStreamTrack track =
753 CreateTrackAndStartSource(factory.CreateWebMediaConstraints(), 640, 480, 1124 CreateTrackAndStartSource(factory.CreateWebMediaConstraints(), 640, 480,
754 media::limits::kMaxFramesPerSecond - 1); 1125 media::limits::kMaxFramesPerSecond - 1);
1126
755 MockMediaStreamVideoSink sink; 1127 MockMediaStreamVideoSink sink;
756 sink.ConnectToTrack(track); 1128 sink.ConnectToTrack(track);
757 EXPECT_EQ(track.source().getReadyState(), 1129 EXPECT_EQ(track.source().getReadyState(),
1130 blink::WebMediaStreamSource::ReadyStateLive);
1131
1132 base::RunLoop run_loop;
1133 base::Closure quit_closure = run_loop.QuitClosure();
1134 bool muted_state = false;
1135 EXPECT_CALL(*mock_source(), DoSetMutedState(_))
1136 .WillOnce(DoAll(SaveArg<0>(&muted_state), RunClosure(quit_closure)));
1137 run_loop.Run();
1138 EXPECT_EQ(muted_state, true);
1139
1140 EXPECT_EQ(track.source().getReadyState(),
1141 blink::WebMediaStreamSource::ReadyStateMuted);
1142
1143 base::RunLoop run_loop2;
1144 base::Closure quit_closure2 = run_loop2.QuitClosure();
1145 EXPECT_CALL(*mock_source(), DoSetMutedState(_))
1146 .WillOnce(DoAll(SaveArg<0>(&muted_state), RunClosure(quit_closure2)));
1147 DeliverVideoFrameAndWaitForRenderer(640, 480, &sink);
1148 run_loop2.Run();
1149
1150 EXPECT_EQ(muted_state, false);
1151 EXPECT_EQ(track.source().getReadyState(),
1152 blink::WebMediaStreamSource::ReadyStateLive);
1153
1154 sink.DisconnectFromTrack();
1155 }
1156
1157 // Test that a source producing no frames change the source ReadyState to muted.
1158 // that in a reasonable time frame the muted state turns to false.
1159 TEST_F(MediaStreamVideoSourceTest, MutedSourceNew) {
1160 base::test::ScopedFeatureList scoped_feature_list;
1161 scoped_feature_list.InitAndDisableFeature(
1162 features::kMediaStreamOldVideoConstraints);
1163 // Setup the source for support a frame rate of 999 fps in order to test
1164 // the muted event faster. This is since the frame monitoring uses
1165 // PostDelayedTask that is dependent on the source frame rate.
1166 // Note that media::limits::kMaxFramesPerSecond is 1000.
1167 blink::WebMediaStreamTrack track = CreateTrackAndStartSource(
1168 640, 480, media::limits::kMaxFramesPerSecond - 2);
1169 MockMediaStreamVideoSink sink;
1170 sink.ConnectToTrack(track);
1171 EXPECT_EQ(track.source().getReadyState(),
758 blink::WebMediaStreamSource::ReadyStateLive); 1172 blink::WebMediaStreamSource::ReadyStateLive);
759 1173
760 base::RunLoop run_loop; 1174 base::RunLoop run_loop;
761 base::Closure quit_closure = run_loop.QuitClosure(); 1175 base::Closure quit_closure = run_loop.QuitClosure();
762 bool muted_state = false; 1176 bool muted_state = false;
763 EXPECT_CALL(*mock_source(), DoSetMutedState(_)) 1177 EXPECT_CALL(*mock_source(), DoSetMutedState(_))
764 .WillOnce(DoAll(SaveArg<0>(&muted_state), RunClosure(quit_closure))); 1178 .WillOnce(DoAll(SaveArg<0>(&muted_state), RunClosure(quit_closure)));
765 run_loop.Run(); 1179 run_loop.Run();
766 EXPECT_EQ(muted_state, true); 1180 EXPECT_EQ(muted_state, true);
767 1181
768 EXPECT_EQ(track.source().getReadyState(), 1182 EXPECT_EQ(track.source().getReadyState(),
769 blink::WebMediaStreamSource::ReadyStateMuted); 1183 blink::WebMediaStreamSource::ReadyStateMuted);
770 1184
771 base::RunLoop run_loop2; 1185 base::RunLoop run_loop2;
772 base::Closure quit_closure2 = run_loop2.QuitClosure(); 1186 base::Closure quit_closure2 = run_loop2.QuitClosure();
773 EXPECT_CALL(*mock_source(), DoSetMutedState(_)) 1187 EXPECT_CALL(*mock_source(), DoSetMutedState(_))
774 .WillOnce(DoAll(SaveArg<0>(&muted_state), RunClosure(quit_closure2))); 1188 .WillOnce(DoAll(SaveArg<0>(&muted_state), RunClosure(quit_closure2)));
775 DeliverVideoFrameAndWaitForRenderer(640, 480, &sink); 1189 DeliverVideoFrameAndWaitForRenderer(640, 480, &sink);
776 run_loop2.Run(); 1190 run_loop2.Run();
777 1191
778 EXPECT_EQ(muted_state, false); 1192 EXPECT_EQ(muted_state, false);
779 EXPECT_EQ(track.source().getReadyState(), 1193 EXPECT_EQ(track.source().getReadyState(),
780 blink::WebMediaStreamSource::ReadyStateLive); 1194 blink::WebMediaStreamSource::ReadyStateLive);
781 1195
782 sink.DisconnectFromTrack(); 1196 sink.DisconnectFromTrack();
783 } 1197 }
784 1198
785 // Test that an optional constraint with an invalid aspect ratio is ignored. 1199 // Test that an optional constraint with an invalid aspect ratio is ignored.
1200 // Does not apply with spec-compliant constraints.
786 TEST_F(MediaStreamVideoSourceTest, InvalidOptionalAspectRatioIgnored) { 1201 TEST_F(MediaStreamVideoSourceTest, InvalidOptionalAspectRatioIgnored) {
1202 base::test::ScopedFeatureList scoped_feature_list;
1203 scoped_feature_list.InitAndEnableFeature(
1204 features::kMediaStreamOldVideoConstraints);
787 MockConstraintFactory factory; 1205 MockConstraintFactory factory;
788 factory.AddAdvanced().aspectRatio.setMax(0.0); 1206 factory.AddAdvanced().aspectRatio.setMax(0.0);
789 blink::WebMediaStreamTrack track = 1207 blink::WebMediaStreamTrack track =
790 CreateTrack("123", factory.CreateWebMediaConstraints()); 1208 CreateTrack("123", factory.CreateWebMediaConstraints());
791 mock_source()->CompleteGetSupportedFormats(); 1209 mock_source()->CompleteGetSupportedFormats();
792 EXPECT_EQ(0, NumberOfFailedConstraintsCallbacks()); 1210 EXPECT_EQ(0, NumberOfFailedConstraintsCallbacks());
793 } 1211 }
794 1212
795 // Test that setting an invalid mandatory aspect ratio fails. 1213 // Test that setting an invalid mandatory aspect ratio fails.
1214 // Does not apply with spec-compliant constraints.
796 TEST_F(MediaStreamVideoSourceTest, InvalidMandatoryAspectRatioFails) { 1215 TEST_F(MediaStreamVideoSourceTest, InvalidMandatoryAspectRatioFails) {
1216 base::test::ScopedFeatureList scoped_feature_list;
1217 scoped_feature_list.InitAndEnableFeature(
1218 features::kMediaStreamOldVideoConstraints);
797 MockConstraintFactory factory; 1219 MockConstraintFactory factory;
798 factory.basic().aspectRatio.setMax(0.0); 1220 factory.basic().aspectRatio.setMax(0.0);
799 blink::WebMediaStreamTrack track = 1221 blink::WebMediaStreamTrack track =
800 CreateTrack("123", factory.CreateWebMediaConstraints()); 1222 CreateTrack("123", factory.CreateWebMediaConstraints());
801 mock_source()->CompleteGetSupportedFormats(); 1223 mock_source()->CompleteGetSupportedFormats();
802 EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks()); 1224 EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks());
803 } 1225 }
804 1226
805 } // namespace content 1227 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698