OLD | NEW |
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 Loading... |
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 |
OLD | NEW |