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

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

Issue 2719153002: Patch constraints algorithm for device video-capture sources. (Closed)
Patch Set: address comments by hbos Created 3 years, 9 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 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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 "content/renderer/media/media_stream_constraints_util_video_device.h" 5 #include "content/renderer/media/media_stream_constraints_util_video_device.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/optional.h" 10 #include "base/optional.h"
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 media::VideoCaptureFormat(gfx::Size(800, 600), 20.0f, 60 media::VideoCaptureFormat(gfx::Size(800, 600), 20.0f,
61 media::PIXEL_FORMAT_I420), 61 media::PIXEL_FORMAT_I420),
62 }; 62 };
63 capabilities_.device_capabilities.push_back(std::move(device)); 63 capabilities_.device_capabilities.push_back(std::move(device));
64 64
65 // A high-resolution device. 65 // A high-resolution device.
66 device = ::mojom::VideoInputDeviceCapabilities::New(); 66 device = ::mojom::VideoInputDeviceCapabilities::New();
67 device->device_id = kDeviceID3; 67 device->device_id = kDeviceID3;
68 device->facing_mode = ::mojom::FacingMode::USER; 68 device->facing_mode = ::mojom::FacingMode::USER;
69 device->formats = { 69 device->formats = {
70 media::VideoCaptureFormat(gfx::Size(320, 240), 10.0f, 70 media::VideoCaptureFormat(gfx::Size(600, 400), 10.0f,
71 media::PIXEL_FORMAT_I420), 71 media::PIXEL_FORMAT_I420),
72 media::VideoCaptureFormat(gfx::Size(640, 480), 10.0f, 72 media::VideoCaptureFormat(gfx::Size(640, 480), 10.0f,
73 media::PIXEL_FORMAT_I420), 73 media::PIXEL_FORMAT_I420),
74 // This format has defaults for all settings 74 // This format has defaults for all settings
75 media::VideoCaptureFormat( 75 media::VideoCaptureFormat(
76 gfx::Size(MediaStreamVideoSource::kDefaultWidth, 76 gfx::Size(MediaStreamVideoSource::kDefaultWidth,
77 MediaStreamVideoSource::kDefaultHeight), 77 MediaStreamVideoSource::kDefaultHeight),
78 MediaStreamVideoSource::kDefaultFrameRate, 78 MediaStreamVideoSource::kDefaultFrameRate,
79 media::PIXEL_FORMAT_I420), 79 media::PIXEL_FORMAT_I420),
80 media::VideoCaptureFormat(gfx::Size(1280, 720), 60.0f, 80 media::VideoCaptureFormat(gfx::Size(1280, 720), 60.0f,
(...skipping 1156 matching lines...) Expand 10 before | Expand all | Expand 10 after
1237 // constraint is the high-res device. The 1280x720 cropped to 1200x400 is 1237 // constraint is the high-res device. The 1280x720 cropped to 1200x400 is
1238 // the lest expensive way to achieve it. 1238 // the lest expensive way to achieve it.
1239 EXPECT_EQ(high_res_device_->device_id, result.device_id); 1239 EXPECT_EQ(high_res_device_->device_id, result.device_id);
1240 EXPECT_EQ(1280, result.Width()); 1240 EXPECT_EQ(1280, result.Width());
1241 EXPECT_EQ(720, result.Height()); 1241 EXPECT_EQ(720, result.Height());
1242 } 1242 }
1243 } 1243 }
1244 1244
1245 // The "Advanced" tests check selection criteria involving advanced constraint 1245 // The "Advanced" tests check selection criteria involving advanced constraint
1246 // sets. 1246 // sets.
1247 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, AdvancedExactResolution) { 1247 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
1248 AdvancedMinMaxResolutionFrameRate) {
1248 constraint_factory_.Reset(); 1249 constraint_factory_.Reset();
1249 blink::WebMediaTrackConstraintSet& advanced1 = 1250 blink::WebMediaTrackConstraintSet& advanced1 =
1250 constraint_factory_.AddAdvanced(); 1251 constraint_factory_.AddAdvanced();
1251 advanced1.width.setExact(4000); 1252 advanced1.width.setMin(4000);
1252 advanced1.height.setExact(4000); 1253 advanced1.height.setMin(4000);
1253 blink::WebMediaTrackConstraintSet& advanced2 = 1254 // No device supports the first advanced set.
hta - Chromium 2017/02/28 19:32:21 Add a comment: This first advanced constraint is t
Guido Urdaneta 2017/03/01 11:32:42 Done.
1254 constraint_factory_.AddAdvanced(); 1255 // Tie-breaker rule that applies is closeness to default settings.
1255 advanced2.width.setExact(3000);
1256 advanced2.height.setExact(3000);
1257 auto result = SelectSettings(); 1256 auto result = SelectSettings();
1258 // No device supports the advanced constraint sets.
1259 // Tie-breaker rule that applies is closeness to default settings.
1260 EXPECT_EQ(default_device_->device_id, result.device_id); 1257 EXPECT_EQ(default_device_->device_id, result.device_id);
1261 EXPECT_EQ(*default_closest_format_, result.Format()); 1258 EXPECT_EQ(*default_closest_format_, result.Format());
1262 1259
1260 blink::WebMediaTrackConstraintSet& advanced2 =
1261 constraint_factory_.AddAdvanced();
1262 advanced2.width.setMin(320);
1263 advanced2.height.setMin(240);
1264 advanced2.width.setMax(640);
1265 advanced2.height.setMax(480);
1266 result = SelectSettings();
1267 // The device that best supports this advanced set is the low-res device,
1268 // which natively supports the maximum resolution.
1269 EXPECT_EQ(low_res_device_->device_id, result.device_id);
1270 EXPECT_EQ(640, result.Width());
1271 EXPECT_EQ(480, result.Height());
1272
1263 blink::WebMediaTrackConstraintSet& advanced3 = 1273 blink::WebMediaTrackConstraintSet& advanced3 =
1264 constraint_factory_.AddAdvanced(); 1274 constraint_factory_.AddAdvanced();
1265 advanced3.width.setExact(1920); 1275 advanced3.frameRate.setMax(10.0);
1266 advanced3.height.setExact(1080);
1267 result = SelectSettings(); 1276 result = SelectSettings();
1268 EXPECT_TRUE(result.HasValue()); 1277 EXPECT_TRUE(result.HasValue());
1269 // The high-res device natively supports the third advanced constraint set 1278 // The high-res device natively supports the third advanced set and should be
1270 // and should be selected. 1279 // selected.
1271 // First tie-breaker rule that applies is support for advanced constraints
1272 // that appear first. Second tie-breaker rule is custom distance to advanced
1273 // constraint sets that appear first.
1274 EXPECT_EQ(high_res_device_->device_id, result.device_id); 1280 EXPECT_EQ(high_res_device_->device_id, result.device_id);
1275 EXPECT_EQ(1920, result.Width()); 1281 EXPECT_EQ(640, result.Width());
1276 EXPECT_EQ(1080, result.Height()); 1282 EXPECT_EQ(480, result.Height());
1277 1283
1278 blink::WebMediaTrackConstraintSet& advanced4 = 1284 blink::WebMediaTrackConstraintSet& advanced4 =
1279 constraint_factory_.AddAdvanced(); 1285 constraint_factory_.AddAdvanced();
1280 advanced4.width.setExact(640); 1286 advanced4.width.setMax(1000);
1281 advanced4.height.setExact(480); 1287 advanced4.height.setMax(1000);
1288 result = SelectSettings();
1289 // Even though the default device supports the resolution in the fourth
1290 // advanced natively, having better support for the previous sets has
1291 // precedence.
1292 EXPECT_TRUE(result.HasValue());
1293 EXPECT_EQ(high_res_device_->device_id, result.device_id);
1294 EXPECT_EQ(640, result.Width());
1295 EXPECT_EQ(480, result.Height());
1296
1297 constraint_factory_.basic().width.setIdeal(100);
1298 constraint_factory_.basic().height.setIdeal(100);
1282 result = SelectSettings(); 1299 result = SelectSettings();
1283 EXPECT_TRUE(result.HasValue()); 1300 EXPECT_TRUE(result.HasValue());
1284 // First tie-breaker rule that applies is support for advanced constraints 1301 // The high-res device at 600x400@10Hz supports all advanced sets and is
1285 // that appear first, which leaves out configurations that only support the 1302 // better at supporting the ideal value.
1286 // fourth advanced constraint set in favor of configurations that support 1303 // It beats 320x240@30Hz because the penalty for the frame rate takes
1287 // the third set. 1304 // precedence over the native fitness distance.
1288 // Second tie-breaker rule is custom distance to advanced constraint sets 1305 // Both support standard fitness distance equally, since 600x400 can be
1289 // that appear first. 1306 // cropped to 320x240.
1290 EXPECT_EQ(high_res_device_->device_id, result.device_id); 1307 EXPECT_EQ(high_res_device_->device_id, result.device_id);
1291 EXPECT_EQ(1920, result.Width()); 1308 EXPECT_EQ(600, result.Width());
1292 EXPECT_EQ(1080, result.Height()); 1309 EXPECT_EQ(400, result.Height());
1293
1294 constraint_factory_.basic().width.setIdeal(800);
1295 constraint_factory_.basic().height.setIdeal(600);
1296 result = SelectSettings();
1297 EXPECT_TRUE(result.HasValue());
1298 // The ideal value is supported by the same configuration, so nothing
1299 // changes.
1300 EXPECT_EQ(high_res_device_->device_id, result.device_id);
1301 EXPECT_EQ(1920, result.Width());
1302 EXPECT_EQ(1080, result.Height());
1303 1310
1304 constraint_factory_.basic().width.setIdeal(2000); 1311 constraint_factory_.basic().width.setIdeal(2000);
1305 constraint_factory_.basic().height.setIdeal(1500); 1312 constraint_factory_.basic().height.setIdeal(1500);
1306 result = SelectSettings(); 1313 result = SelectSettings();
1307 EXPECT_TRUE(result.HasValue()); 1314 EXPECT_TRUE(result.HasValue());
1308 // The closest configuration to the ideal resolution is the high-res device 1315 // The high-res device at 640x480@10Hz is closer to the large ideal
1309 // at the highest resolution. 1316 // resolution.
1310 EXPECT_EQ(high_res_device_->device_id, result.device_id); 1317 EXPECT_EQ(high_res_device_->device_id, result.device_id);
1311 EXPECT_EQ(*high_res_highest_format_, result.Format()); 1318 EXPECT_EQ(640, result.Width());
1319 EXPECT_EQ(480, result.Height());
1312 } 1320 }
1313 1321
1314 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, 1322 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
1315 AdvancedResolutionAndFrameRate) { 1323 AdvancedResolutionAndFrameRate) {
1316 constraint_factory_.Reset(); 1324 constraint_factory_.Reset();
1317 blink::WebMediaTrackConstraintSet& advanced1 = 1325 blink::WebMediaTrackConstraintSet& advanced1 =
1318 constraint_factory_.AddAdvanced(); 1326 constraint_factory_.AddAdvanced();
1319 advanced1.width.setExact(1920); 1327 advanced1.width.setExact(1920);
1320 advanced1.height.setExact(1080); 1328 advanced1.height.setExact(1080);
1321 blink::WebMediaTrackConstraintSet& advanced2 = 1329 blink::WebMediaTrackConstraintSet& advanced2 =
(...skipping 12 matching lines...) Expand all
1334 EXPECT_EQ(high_res_device_->device_id, result.device_id); 1342 EXPECT_EQ(high_res_device_->device_id, result.device_id);
1335 EXPECT_EQ(1920, result.Width()); 1343 EXPECT_EQ(1920, result.Width());
1336 EXPECT_EQ(1080, result.Height()); 1344 EXPECT_EQ(1080, result.Height());
1337 EXPECT_EQ(60.0, result.FrameRate()); 1345 EXPECT_EQ(60.0, result.FrameRate());
1338 } 1346 }
1339 1347
1340 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, AdvancedNoiseReduction) { 1348 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, AdvancedNoiseReduction) {
1341 constraint_factory_.Reset(); 1349 constraint_factory_.Reset();
1342 blink::WebMediaTrackConstraintSet& advanced1 = 1350 blink::WebMediaTrackConstraintSet& advanced1 =
1343 constraint_factory_.AddAdvanced(); 1351 constraint_factory_.AddAdvanced();
1344 advanced1.width.setExact(640); 1352 advanced1.width.setMin(640);
1345 advanced1.height.setExact(480); 1353 advanced1.height.setMin(480);
1346 blink::WebMediaTrackConstraintSet& advanced2 = 1354 blink::WebMediaTrackConstraintSet& advanced2 =
1347 constraint_factory_.AddAdvanced(); 1355 constraint_factory_.AddAdvanced();
1348 advanced2.width.setExact(1920); 1356 advanced2.width.setMin(1920);
1349 advanced2.height.setExact(1080); 1357 advanced2.height.setMin(1080);
1350 advanced2.googNoiseReduction.setExact(false); 1358 advanced2.googNoiseReduction.setExact(false);
1351 auto result = SelectSettings(); 1359 auto result = SelectSettings();
1352 EXPECT_TRUE(result.HasValue()); 1360 EXPECT_TRUE(result.HasValue());
1353 EXPECT_EQ(high_res_device_->device_id, result.device_id); 1361 EXPECT_EQ(high_res_device_->device_id, result.device_id);
1354 EXPECT_EQ(1920, result.Width()); 1362 EXPECT_LE(1920, result.Width());
1355 EXPECT_EQ(1080, result.Height()); 1363 EXPECT_LE(1080, result.Height());
1356 EXPECT_TRUE(result.noise_reduction && !*result.noise_reduction); 1364 EXPECT_TRUE(result.noise_reduction && !*result.noise_reduction);
1357 } 1365 }
1358 1366
1359 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, 1367 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
1360 AdvancedContradictoryNoiseReduction) { 1368 AdvancedContradictoryNoiseReduction) {
1361 { 1369 {
1362 constraint_factory_.Reset(); 1370 constraint_factory_.Reset();
1363 blink::WebMediaTrackConstraintSet& advanced1 = 1371 blink::WebMediaTrackConstraintSet& advanced1 =
1364 constraint_factory_.AddAdvanced(); 1372 constraint_factory_.AddAdvanced();
1365 advanced1.width.setMin(640); 1373 advanced1.width.setMin(640);
(...skipping 30 matching lines...) Expand all
1396 EXPECT_TRUE(result.HasValue()); 1404 EXPECT_TRUE(result.HasValue());
1397 // Only the high-res device can satisfy the second advanced set. 1405 // Only the high-res device can satisfy the second advanced set.
1398 EXPECT_EQ(high_res_device_->device_id, result.device_id); 1406 EXPECT_EQ(high_res_device_->device_id, result.device_id);
1399 EXPECT_LE(1920, result.Width()); 1407 EXPECT_LE(1920, result.Width());
1400 EXPECT_LE(1080, result.Height()); 1408 EXPECT_LE(1080, result.Height());
1401 // Should select default noise reduction setting. 1409 // Should select default noise reduction setting.
1402 EXPECT_TRUE(!result.noise_reduction); 1410 EXPECT_TRUE(!result.noise_reduction);
1403 } 1411 }
1404 } 1412 }
1405 1413
1414 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
1415 AdvancedContradictoryExactResolution) {
1416 constraint_factory_.Reset();
1417 blink::WebMediaTrackConstraintSet& advanced1 =
1418 constraint_factory_.AddAdvanced();
1419 advanced1.width.setExact(640);
1420 advanced1.height.setExact(480);
1421 blink::WebMediaTrackConstraintSet& advanced2 =
1422 constraint_factory_.AddAdvanced();
1423 advanced2.width.setExact(1920);
1424 advanced2.height.setExact(1080);
1425 auto result = SelectSettings();
1426 EXPECT_TRUE(result.HasValue());
1427 // The second advanced set must be ignored because it contradicts the first
1428 // set. The low-res device is the one that best supports the requested
1429 // resolution.
1430 EXPECT_EQ(low_res_device_->device_id, result.device_id);
1431 EXPECT_EQ(640, result.Width());
1432 EXPECT_EQ(480, result.Height());
1433 }
1434
1435 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
1436 AdvancedContradictoryResolutionRange) {
1437 constraint_factory_.Reset();
1438 blink::WebMediaTrackConstraintSet& advanced1 =
1439 constraint_factory_.AddAdvanced();
1440 advanced1.width.setMax(640);
1441 advanced1.height.setMax(480);
1442 blink::WebMediaTrackConstraintSet& advanced2 =
1443 constraint_factory_.AddAdvanced();
1444 advanced2.width.setMin(1920);
1445 advanced2.height.setMin(1080);
1446 auto result = SelectSettings();
1447 EXPECT_TRUE(result.HasValue());
1448 // The second advanced set must be ignored because it contradicts the first
1449 // set.
1450 EXPECT_EQ(default_device_->device_id, result.device_id);
1451 EXPECT_GE(640, result.Width());
1452 EXPECT_GE(480, result.Height());
1453 }
1454
1455 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
1456 AdvancedContradictoryExactAspectRatio) {
1457 constraint_factory_.Reset();
1458 blink::WebMediaTrackConstraintSet& advanced1 =
1459 constraint_factory_.AddAdvanced();
1460 advanced1.aspectRatio.setExact(2300.0);
1461 blink::WebMediaTrackConstraintSet& advanced2 =
1462 constraint_factory_.AddAdvanced();
1463 advanced2.aspectRatio.setExact(3.0);
1464 auto result = SelectSettings();
1465 EXPECT_TRUE(result.HasValue());
1466 // The second advanced set must be ignored because it contradicts the first
1467 // set. Only the high-res device in the highest-resolution format supports the
1468 // requested aspect ratio.
1469 EXPECT_EQ(high_res_device_->device_id, result.device_id);
1470 EXPECT_EQ(*high_res_highest_format_, result.Format());
1471 }
1472
1473 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
1474 AdvancedContradictoryAspectRatioRange) {
1475 constraint_factory_.Reset();
1476 blink::WebMediaTrackConstraintSet& advanced1 =
1477 constraint_factory_.AddAdvanced();
1478 advanced1.aspectRatio.setMin(2300.0);
1479 blink::WebMediaTrackConstraintSet& advanced2 =
1480 constraint_factory_.AddAdvanced();
1481 advanced2.aspectRatio.setMax(3.0);
1482 auto result = SelectSettings();
1483 EXPECT_TRUE(result.HasValue());
1484 // The second advanced set must be ignored because it contradicts the first
1485 // set. Only the high-res device in the highest-resolution format supports the
1486 // requested aspect ratio.
1487 EXPECT_EQ(high_res_device_->device_id, result.device_id);
1488 EXPECT_EQ(*high_res_highest_format_, result.Format());
1489 }
1490
1491 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
1492 AdvancedContradictoryExactFrameRate) {
1493 constraint_factory_.Reset();
1494 blink::WebMediaTrackConstraintSet& advanced1 =
1495 constraint_factory_.AddAdvanced();
1496 advanced1.frameRate.setExact(40.0);
1497 blink::WebMediaTrackConstraintSet& advanced2 =
1498 constraint_factory_.AddAdvanced();
1499 advanced2.frameRate.setExact(45.0);
1500 auto result = SelectSettings();
1501 EXPECT_TRUE(result.HasValue());
1502 // The second advanced set must be ignored because it contradicts the first
1503 // set.
1504 EXPECT_EQ(40.0, result.FrameRate());
1505 }
1506
1507 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
1508 AdvancedContradictoryFrameRateRange) {
1509 constraint_factory_.Reset();
1510 blink::WebMediaTrackConstraintSet& advanced1 =
1511 constraint_factory_.AddAdvanced();
1512 advanced1.frameRate.setMin(40.0);
1513 blink::WebMediaTrackConstraintSet& advanced2 =
1514 constraint_factory_.AddAdvanced();
1515 advanced2.frameRate.setMax(35.0);
1516 auto result = SelectSettings();
1517 EXPECT_TRUE(result.HasValue());
1518 // The second advanced set must be ignored because it contradicts the first
1519 // set.
1520 EXPECT_LE(40.0, result.FrameRate());
1521 }
1522
1523 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
1524 AdvancedContradictoryWidthFrameRate) {
1525 constraint_factory_.Reset();
1526 blink::WebMediaTrackConstraintSet& advanced1 =
1527 constraint_factory_.AddAdvanced();
1528 advanced1.width.setMax(1920);
1529 blink::WebMediaTrackConstraintSet& advanced2 =
1530 constraint_factory_.AddAdvanced();
1531 advanced2.width.setMin(2000);
1532 advanced2.frameRate.setExact(10.0);
1533 blink::WebMediaTrackConstraintSet& advanced3 =
1534 constraint_factory_.AddAdvanced();
1535 advanced3.frameRate.setExact(30.0);
1536 auto result = SelectSettings();
1537 EXPECT_TRUE(result.HasValue());
1538 // The low-res device at 320x240@30Hz satisfies advanced sets 1 and 3.
1539 // The high-res device at 2304x1536@10.0f can satisfy sets 1 and 2, but not
1540 // both at the same time. Thus, low-res device must be preferred.
1541 EXPECT_EQ(low_res_device_->device_id, result.device_id);
1542 EXPECT_EQ(30.0, result.FrameRate());
1543 EXPECT_GE(1920, result.Width());
1544 }
1545
1546 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
1547 AdvancedContradictoryHeightFrameRate) {
1548 constraint_factory_.Reset();
1549 blink::WebMediaTrackConstraintSet& advanced1 =
1550 constraint_factory_.AddAdvanced();
1551 advanced1.height.setMax(1080);
1552 blink::WebMediaTrackConstraintSet& advanced2 =
1553 constraint_factory_.AddAdvanced();
1554 advanced2.height.setMin(1500);
1555 advanced2.frameRate.setExact(10.0);
1556 blink::WebMediaTrackConstraintSet& advanced3 =
1557 constraint_factory_.AddAdvanced();
1558 advanced3.frameRate.setExact(60.0);
1559 auto result = SelectSettings();
1560 EXPECT_TRUE(result.HasValue());
1561 // The high-res device at 1280x768@60Hz and 1920x1080@60Hz satisfies advanced
1562 // sets 1 and 3. The same device at 2304x1536@10.0f can satisfy sets 1 and 2,
1563 // but not both at the same time. Thus, the format closest to default that
1564 // satisfies sets 1 and 3 must be chosen.
1565 EXPECT_EQ(high_res_device_->device_id, result.device_id);
1566 EXPECT_EQ(60.0, result.FrameRate());
1567 EXPECT_GE(1080, result.Height());
1568 }
1569
1570 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, AdvancedDeviceID) {
1571 constraint_factory_.Reset();
1572 blink::WebMediaTrackConstraintSet& advanced1 =
1573 constraint_factory_.AddAdvanced();
1574 blink::WebString id_vector1[] = {blink::WebString::fromASCII(kDeviceID1),
1575 blink::WebString::fromASCII(kDeviceID2)};
1576 advanced1.deviceId.setExact(
1577 blink::WebVector<blink::WebString>(id_vector1, arraysize(id_vector1)));
1578 blink::WebString id_vector2[] = {blink::WebString::fromASCII(kDeviceID2),
1579 blink::WebString::fromASCII(kDeviceID3)};
1580 blink::WebMediaTrackConstraintSet& advanced2 =
1581 constraint_factory_.AddAdvanced();
1582 advanced2.deviceId.setExact(
1583 blink::WebVector<blink::WebString>(id_vector2, arraysize(id_vector2)));
1584 auto result = SelectSettings();
1585 EXPECT_TRUE(result.HasValue());
1586 // kDeviceID2 must be selected because it is the only one that satisfies both
1587 // advanced sets.
1588 EXPECT_EQ(std::string(kDeviceID2), result.device_id);
1589 }
1590
1591 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
1592 AdvancedContradictoryDeviceID) {
1593 constraint_factory_.Reset();
1594 blink::WebMediaTrackConstraintSet& advanced1 =
1595 constraint_factory_.AddAdvanced();
1596 blink::WebString id_vector1[] = {blink::WebString::fromASCII(kDeviceID1),
1597 blink::WebString::fromASCII(kDeviceID2)};
1598 advanced1.deviceId.setExact(
1599 blink::WebVector<blink::WebString>(id_vector1, arraysize(id_vector1)));
1600 blink::WebString id_vector2[] = {blink::WebString::fromASCII(kDeviceID3),
1601 blink::WebString::fromASCII(kDeviceID4)};
1602 blink::WebMediaTrackConstraintSet& advanced2 =
1603 constraint_factory_.AddAdvanced();
1604 advanced2.deviceId.setExact(
1605 blink::WebVector<blink::WebString>(id_vector2, arraysize(id_vector2)));
1606 auto result = SelectSettings();
1607 EXPECT_TRUE(result.HasValue());
1608 // The second advanced set must be ignored because it contradicts the first
1609 // set.
1610 EXPECT_EQ(std::string(kDeviceID1), result.device_id);
1611 }
1612
1613 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
1614 AdvancedContradictoryPowerLineFrequency) {
1615 {
1616 constraint_factory_.Reset();
1617 blink::WebMediaTrackConstraintSet& advanced1 =
1618 constraint_factory_.AddAdvanced();
1619 advanced1.width.setMin(640);
1620 advanced1.height.setMin(480);
1621 advanced1.googPowerLineFrequency.setExact(50);
1622 blink::WebMediaTrackConstraintSet& advanced2 =
1623 constraint_factory_.AddAdvanced();
1624 advanced2.width.setMin(1920);
1625 advanced2.height.setMin(1080);
1626 advanced2.googPowerLineFrequency.setExact(60);
1627 auto result = SelectSettings();
1628 EXPECT_TRUE(result.HasValue());
1629 // The second advanced set cannot be satisfied because it contradicts the
1630 // first set. The default device supports the first set and should be
1631 // selected.
1632 EXPECT_EQ(default_device_->device_id, result.device_id);
1633 EXPECT_LE(640, result.Width());
1634 EXPECT_LE(480, result.Height());
1635 EXPECT_EQ(50, static_cast<int>(result.PowerLineFrequency()));
1636 }
1637 }
1638
1406 // The "NoDevices" tests verify that the algorithm returns the expected result 1639 // The "NoDevices" tests verify that the algorithm returns the expected result
1407 // when there are no candidates to choose from. 1640 // when there are no candidates to choose from.
1408 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, NoDevicesNoConstraints) { 1641 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, NoDevicesNoConstraints) {
1409 constraint_factory_.Reset(); 1642 constraint_factory_.Reset();
1410 VideoDeviceCaptureCapabilities capabilities; 1643 VideoDeviceCaptureCapabilities capabilities;
1411 auto result = SelectVideoDeviceCaptureSourceSettings( 1644 auto result = SelectVideoDeviceCaptureSourceSettings(
1412 capabilities, constraint_factory_.CreateWebMediaConstraints()); 1645 capabilities, constraint_factory_.CreateWebMediaConstraints());
1413 EXPECT_FALSE(result.HasValue()); 1646 EXPECT_FALSE(result.HasValue());
1414 EXPECT_TRUE(std::string(result.failed_constraint_name).empty()); 1647 EXPECT_TRUE(std::string(result.failed_constraint_name).empty());
1415 } 1648 }
1416 1649
1417 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, NoDevicesWithConstraints) { 1650 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, NoDevicesWithConstraints) {
1418 constraint_factory_.Reset(); 1651 constraint_factory_.Reset();
1419 constraint_factory_.basic().height.setExact(100); 1652 constraint_factory_.basic().height.setExact(100);
1420 VideoDeviceCaptureCapabilities capabilities; 1653 VideoDeviceCaptureCapabilities capabilities;
1421 auto result = SelectVideoDeviceCaptureSourceSettings( 1654 auto result = SelectVideoDeviceCaptureSourceSettings(
1422 capabilities, constraint_factory_.CreateWebMediaConstraints()); 1655 capabilities, constraint_factory_.CreateWebMediaConstraints());
1423 EXPECT_FALSE(result.HasValue()); 1656 EXPECT_FALSE(result.HasValue());
1424 EXPECT_TRUE(std::string(result.failed_constraint_name).empty()); 1657 EXPECT_TRUE(std::string(result.failed_constraint_name).empty());
1425 } 1658 }
1426 1659
1427 } // namespace content 1660 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698