| OLD | NEW |
| 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 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 device->formats = {media::VideoCaptureFormat(gfx::Size(640, 480), 30.0f, | 93 device->formats = {media::VideoCaptureFormat(gfx::Size(640, 480), 30.0f, |
| 94 media::PIXEL_FORMAT_Y16)}; | 94 media::PIXEL_FORMAT_Y16)}; |
| 95 capabilities_.device_capabilities.push_back(std::move(device)); | 95 capabilities_.device_capabilities.push_back(std::move(device)); |
| 96 | 96 |
| 97 capabilities_.power_line_capabilities = { | 97 capabilities_.power_line_capabilities = { |
| 98 media::PowerLineFrequency::FREQUENCY_DEFAULT, | 98 media::PowerLineFrequency::FREQUENCY_DEFAULT, |
| 99 media::PowerLineFrequency::FREQUENCY_50HZ, | 99 media::PowerLineFrequency::FREQUENCY_50HZ, |
| 100 media::PowerLineFrequency::FREQUENCY_60HZ, | 100 media::PowerLineFrequency::FREQUENCY_60HZ, |
| 101 }; | 101 }; |
| 102 | 102 |
| 103 capabilities_.noise_reduction_capabilities = { |
| 104 rtc::Optional<bool>(), rtc::Optional<bool>(true), |
| 105 rtc::Optional<bool>(false), |
| 106 }; |
| 107 |
| 103 default_device_ = capabilities_.device_capabilities[0].get(); | 108 default_device_ = capabilities_.device_capabilities[0].get(); |
| 104 low_res_device_ = capabilities_.device_capabilities[1].get(); | 109 low_res_device_ = capabilities_.device_capabilities[1].get(); |
| 105 high_res_device_ = capabilities_.device_capabilities[2].get(); | 110 high_res_device_ = capabilities_.device_capabilities[2].get(); |
| 106 default_closest_format_ = &default_device_->formats[1]; | 111 default_closest_format_ = &default_device_->formats[1]; |
| 107 low_res_closest_format_ = &low_res_device_->formats[2]; | 112 low_res_closest_format_ = &low_res_device_->formats[2]; |
| 108 high_res_closest_format_ = &high_res_device_->formats[2]; | 113 high_res_closest_format_ = &high_res_device_->formats[2]; |
| 109 high_res_highest_format_ = &high_res_device_->formats[5]; | 114 high_res_highest_format_ = &high_res_device_->formats[5]; |
| 110 } | 115 } |
| 111 | 116 |
| 112 protected: | 117 protected: |
| (...skipping 18 matching lines...) Expand all Loading... |
| 131 | 136 |
| 132 // The Unconstrained test checks the default selection criteria. | 137 // The Unconstrained test checks the default selection criteria. |
| 133 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, Unconstrained) { | 138 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, Unconstrained) { |
| 134 constraint_factory_.Reset(); | 139 constraint_factory_.Reset(); |
| 135 auto result = SelectSettings(); | 140 auto result = SelectSettings(); |
| 136 EXPECT_TRUE(result.HasValue()); | 141 EXPECT_TRUE(result.HasValue()); |
| 137 // Should select the default device with closest-to-default settings. | 142 // Should select the default device with closest-to-default settings. |
| 138 EXPECT_EQ(default_device_->device_id, result.device_id); | 143 EXPECT_EQ(default_device_->device_id, result.device_id); |
| 139 EXPECT_EQ(default_device_->facing_mode, result.facing_mode); | 144 EXPECT_EQ(default_device_->facing_mode, result.facing_mode); |
| 140 EXPECT_EQ(*default_closest_format_, result.Format()); | 145 EXPECT_EQ(*default_closest_format_, result.Format()); |
| 146 // Should select default settings for other constraints. |
| 147 EXPECT_EQ(media::PowerLineFrequency::FREQUENCY_DEFAULT, |
| 148 result.PowerLineFrequency()); |
| 149 EXPECT_EQ(rtc::Optional<bool>(), result.noise_reduction); |
| 141 } | 150 } |
| 142 | 151 |
| 143 // The "Overconstrained" tests verify that failure of any single required | 152 // The "Overconstrained" tests verify that failure of any single required |
| 144 // constraint results in failure to select a candidate. | 153 // constraint results in failure to select a candidate. |
| 145 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, OverconstrainedOnDeviceID) { | 154 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, OverconstrainedOnDeviceID) { |
| 146 constraint_factory_.Reset(); | 155 constraint_factory_.Reset(); |
| 147 constraint_factory_.basic().deviceId.setExact( | 156 constraint_factory_.basic().deviceId.setExact( |
| 148 blink::WebString::fromASCII("NONEXISTING")); | 157 blink::WebString::fromASCII("NONEXISTING")); |
| 149 auto result = SelectSettings(); | 158 auto result = SelectSettings(); |
| 150 EXPECT_FALSE(result.HasValue()); | 159 EXPECT_FALSE(result.HasValue()); |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 result.failed_constraint_name); | 295 result.failed_constraint_name); |
| 287 | 296 |
| 288 constraint_factory_.Reset(); | 297 constraint_factory_.Reset(); |
| 289 constraint_factory_.basic().googPowerLineFrequency.setMax(-1); | 298 constraint_factory_.basic().googPowerLineFrequency.setMax(-1); |
| 290 result = SelectSettings(); | 299 result = SelectSettings(); |
| 291 EXPECT_FALSE(result.HasValue()); | 300 EXPECT_FALSE(result.HasValue()); |
| 292 EXPECT_EQ(constraint_factory_.basic().googPowerLineFrequency.name(), | 301 EXPECT_EQ(constraint_factory_.basic().googPowerLineFrequency.name(), |
| 293 result.failed_constraint_name); | 302 result.failed_constraint_name); |
| 294 } | 303 } |
| 295 | 304 |
| 305 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, |
| 306 OverconstrainedOnNoiseReduction) { |
| 307 // Simulate a system that does not support noise reduction. |
| 308 // Manually adding device capabilities because VideoDeviceCaptureCapabilities |
| 309 // is move only. |
| 310 VideoDeviceCaptureCapabilities capabilities; |
| 311 ::mojom::VideoInputDeviceCapabilitiesPtr device = |
| 312 ::mojom::VideoInputDeviceCapabilities::New(); |
| 313 device->device_id = kDeviceID1; |
| 314 device->facing_mode = ::mojom::FacingMode::NONE; |
| 315 device->formats = { |
| 316 media::VideoCaptureFormat(gfx::Size(200, 200), 40.0f, |
| 317 media::PIXEL_FORMAT_I420), |
| 318 }; |
| 319 capabilities.device_capabilities.push_back(std::move(device)); |
| 320 capabilities.power_line_capabilities = capabilities_.power_line_capabilities; |
| 321 capabilities.noise_reduction_capabilities = {rtc::Optional<bool>(false)}; |
| 322 |
| 323 constraint_factory_.Reset(); |
| 324 constraint_factory_.basic().googNoiseReduction.setExact(true); |
| 325 auto constraints = constraint_factory_.CreateWebMediaConstraints(); |
| 326 auto result = |
| 327 SelectVideoDeviceCaptureSourceSettings(capabilities, constraints); |
| 328 EXPECT_FALSE(result.HasValue()); |
| 329 EXPECT_EQ(constraint_factory_.basic().googNoiseReduction.name(), |
| 330 result.failed_constraint_name); |
| 331 } |
| 332 |
| 296 // The "Mandatory" and "Ideal" tests check that various selection criteria work | 333 // The "Mandatory" and "Ideal" tests check that various selection criteria work |
| 297 // for each individual constraint in the basic constraint set. | 334 // for each individual constraint in the basic constraint set. |
| 298 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryDeviceID) { | 335 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryDeviceID) { |
| 299 constraint_factory_.Reset(); | 336 constraint_factory_.Reset(); |
| 300 constraint_factory_.basic().deviceId.setExact( | 337 constraint_factory_.basic().deviceId.setExact( |
| 301 blink::WebString::fromASCII(default_device_->device_id)); | 338 blink::WebString::fromASCII(default_device_->device_id)); |
| 302 auto result = SelectSettings(); | 339 auto result = SelectSettings(); |
| 303 EXPECT_TRUE(result.HasValue()); | 340 EXPECT_TRUE(result.HasValue()); |
| 304 EXPECT_EQ(default_device_->device_id, result.device_id); | 341 EXPECT_EQ(default_device_->device_id, result.device_id); |
| 305 EXPECT_EQ(*default_closest_format_, result.Format()); | 342 EXPECT_EQ(*default_closest_format_, result.Format()); |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 378 EXPECT_TRUE(result.HasValue()); | 415 EXPECT_TRUE(result.HasValue()); |
| 379 EXPECT_EQ(power_line_frequency, result.PowerLineFrequency()); | 416 EXPECT_EQ(power_line_frequency, result.PowerLineFrequency()); |
| 380 // The default device and settings closest to the default should be | 417 // The default device and settings closest to the default should be |
| 381 // selected. | 418 // selected. |
| 382 EXPECT_EQ(default_device_->device_id, result.device_id); | 419 EXPECT_EQ(default_device_->device_id, result.device_id); |
| 383 EXPECT_EQ(default_device_->facing_mode, result.facing_mode); | 420 EXPECT_EQ(default_device_->facing_mode, result.facing_mode); |
| 384 EXPECT_EQ(*default_closest_format_, result.Format()); | 421 EXPECT_EQ(*default_closest_format_, result.Format()); |
| 385 } | 422 } |
| 386 } | 423 } |
| 387 | 424 |
| 425 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryNoiseReduction) { |
| 426 constraint_factory_.Reset(); |
| 427 const bool kNoiseReductionValues[] = {true, false}; |
| 428 for (auto noise_reduction : kNoiseReductionValues) { |
| 429 constraint_factory_.basic().googNoiseReduction.setExact(noise_reduction); |
| 430 auto result = SelectSettings(); |
| 431 EXPECT_TRUE(result.HasValue()); |
| 432 EXPECT_EQ(noise_reduction, result.noise_reduction); |
| 433 // The default device and settings closest to the default should be |
| 434 // selected. |
| 435 EXPECT_EQ(default_device_->device_id, result.device_id); |
| 436 EXPECT_EQ(default_device_->facing_mode, result.facing_mode); |
| 437 EXPECT_EQ(*default_closest_format_, result.Format()); |
| 438 } |
| 439 } |
| 440 |
| 388 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryExactHeight) { | 441 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryExactHeight) { |
| 389 constraint_factory_.Reset(); | 442 constraint_factory_.Reset(); |
| 390 const int kHeight = MediaStreamVideoSource::kDefaultHeight; | 443 const int kHeight = MediaStreamVideoSource::kDefaultHeight; |
| 391 constraint_factory_.basic().height.setExact(kHeight); | 444 constraint_factory_.basic().height.setExact(kHeight); |
| 392 auto result = SelectSettings(); | 445 auto result = SelectSettings(); |
| 393 EXPECT_TRUE(result.HasValue()); | 446 EXPECT_TRUE(result.HasValue()); |
| 394 // All devices in |capabilities_| support the requested height. The algorithm | 447 // All devices in |capabilities_| support the requested height. The algorithm |
| 395 // should prefer the first device that supports the requested height natively, | 448 // should prefer the first device that supports the requested height natively, |
| 396 // which is the low-res device. | 449 // which is the low-res device. |
| 397 EXPECT_EQ(low_res_device_->device_id, result.device_id); | 450 EXPECT_EQ(low_res_device_->device_id, result.device_id); |
| (...skipping 787 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1185 // the lest expensive way to achieve it. | 1238 // the lest expensive way to achieve it. |
| 1186 EXPECT_EQ(high_res_device_->device_id, result.device_id); | 1239 EXPECT_EQ(high_res_device_->device_id, result.device_id); |
| 1187 EXPECT_EQ(1280, result.Width()); | 1240 EXPECT_EQ(1280, result.Width()); |
| 1188 EXPECT_EQ(720, result.Height()); | 1241 EXPECT_EQ(720, result.Height()); |
| 1189 } | 1242 } |
| 1190 } | 1243 } |
| 1191 | 1244 |
| 1192 // The "Advanced" tests check selection criteria involving advanced constraint | 1245 // The "Advanced" tests check selection criteria involving advanced constraint |
| 1193 // sets. | 1246 // sets. |
| 1194 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, AdvancedExactResolution) { | 1247 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, AdvancedExactResolution) { |
| 1248 constraint_factory_.Reset(); |
| 1249 blink::WebMediaTrackConstraintSet& advanced1 = |
| 1250 constraint_factory_.AddAdvanced(); |
| 1251 advanced1.width.setExact(4000); |
| 1252 advanced1.height.setExact(4000); |
| 1253 blink::WebMediaTrackConstraintSet& advanced2 = |
| 1254 constraint_factory_.AddAdvanced(); |
| 1255 advanced2.width.setExact(3000); |
| 1256 advanced2.height.setExact(3000); |
| 1257 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); |
| 1261 EXPECT_EQ(*default_closest_format_, result.Format()); |
| 1262 |
| 1263 blink::WebMediaTrackConstraintSet& advanced3 = |
| 1264 constraint_factory_.AddAdvanced(); |
| 1265 advanced3.width.setExact(1920); |
| 1266 advanced3.height.setExact(1080); |
| 1267 result = SelectSettings(); |
| 1268 EXPECT_TRUE(result.HasValue()); |
| 1269 // The high-res device natively supports the third advanced constraint set |
| 1270 // and should be 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); |
| 1275 EXPECT_EQ(1920, result.Width()); |
| 1276 EXPECT_EQ(1080, result.Height()); |
| 1277 |
| 1278 blink::WebMediaTrackConstraintSet& advanced4 = |
| 1279 constraint_factory_.AddAdvanced(); |
| 1280 advanced4.width.setExact(640); |
| 1281 advanced4.height.setExact(480); |
| 1282 result = SelectSettings(); |
| 1283 EXPECT_TRUE(result.HasValue()); |
| 1284 // First tie-breaker rule that applies is support for advanced constraints |
| 1285 // that appear first, which leaves out configurations that only support the |
| 1286 // fourth advanced constraint set in favor of configurations that support |
| 1287 // the third set. |
| 1288 // Second tie-breaker rule is custom distance to advanced constraint sets |
| 1289 // that appear first. |
| 1290 EXPECT_EQ(high_res_device_->device_id, result.device_id); |
| 1291 EXPECT_EQ(1920, result.Width()); |
| 1292 EXPECT_EQ(1080, 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 |
| 1304 constraint_factory_.basic().width.setIdeal(2000); |
| 1305 constraint_factory_.basic().height.setIdeal(1500); |
| 1306 result = SelectSettings(); |
| 1307 EXPECT_TRUE(result.HasValue()); |
| 1308 // The closest configuration to the ideal resolution is the high-res device |
| 1309 // at the highest resolution. |
| 1310 EXPECT_EQ(high_res_device_->device_id, result.device_id); |
| 1311 EXPECT_EQ(*high_res_highest_format_, result.Format()); |
| 1312 } |
| 1313 |
| 1314 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, |
| 1315 AdvancedResolutionAndFrameRate) { |
| 1316 constraint_factory_.Reset(); |
| 1317 blink::WebMediaTrackConstraintSet& advanced1 = |
| 1318 constraint_factory_.AddAdvanced(); |
| 1319 advanced1.width.setExact(1920); |
| 1320 advanced1.height.setExact(1080); |
| 1321 blink::WebMediaTrackConstraintSet& advanced2 = |
| 1322 constraint_factory_.AddAdvanced(); |
| 1323 advanced2.frameRate.setExact(60.0); |
| 1324 blink::WebMediaTrackConstraintSet& advanced3 = |
| 1325 constraint_factory_.AddAdvanced(); |
| 1326 advanced3.width.setExact(2304); |
| 1327 advanced3.height.setExact(1536); |
| 1328 auto result = SelectSettings(); |
| 1329 EXPECT_TRUE(result.HasValue()); |
| 1330 // The high-res device is the only one that satisfies the first advanced |
| 1331 // set. 2304x1536x10.0 satisfies sets 1 and 3, while 1920x1080x60.0 |
| 1332 // satisfies sets 1, and 2. The latter must be selected, regardless of |
| 1333 // any other criteria. |
| 1334 EXPECT_EQ(high_res_device_->device_id, result.device_id); |
| 1335 EXPECT_EQ(1920, result.Width()); |
| 1336 EXPECT_EQ(1080, result.Height()); |
| 1337 EXPECT_EQ(60.0, result.FrameRate()); |
| 1338 } |
| 1339 |
| 1340 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, AdvancedNoiseReduction) { |
| 1341 constraint_factory_.Reset(); |
| 1342 blink::WebMediaTrackConstraintSet& advanced1 = |
| 1343 constraint_factory_.AddAdvanced(); |
| 1344 advanced1.width.setExact(640); |
| 1345 advanced1.height.setExact(480); |
| 1346 blink::WebMediaTrackConstraintSet& advanced2 = |
| 1347 constraint_factory_.AddAdvanced(); |
| 1348 advanced2.width.setExact(1920); |
| 1349 advanced2.height.setExact(1080); |
| 1350 advanced2.googNoiseReduction.setExact(false); |
| 1351 auto result = SelectSettings(); |
| 1352 EXPECT_TRUE(result.HasValue()); |
| 1353 EXPECT_EQ(high_res_device_->device_id, result.device_id); |
| 1354 EXPECT_EQ(1920, result.Width()); |
| 1355 EXPECT_EQ(1080, result.Height()); |
| 1356 EXPECT_TRUE(result.noise_reduction && !*result.noise_reduction); |
| 1357 } |
| 1358 |
| 1359 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, |
| 1360 AdvancedContradictoryNoiseReduction) { |
| 1195 { | 1361 { |
| 1196 constraint_factory_.Reset(); | 1362 constraint_factory_.Reset(); |
| 1197 blink::WebMediaTrackConstraintSet& advanced1 = | 1363 blink::WebMediaTrackConstraintSet& advanced1 = |
| 1198 constraint_factory_.AddAdvanced(); | 1364 constraint_factory_.AddAdvanced(); |
| 1199 advanced1.width.setExact(4000); | 1365 advanced1.width.setMin(640); |
| 1200 advanced1.height.setExact(4000); | 1366 advanced1.height.setMin(480); |
| 1367 advanced1.googNoiseReduction.setExact(true); |
| 1201 blink::WebMediaTrackConstraintSet& advanced2 = | 1368 blink::WebMediaTrackConstraintSet& advanced2 = |
| 1202 constraint_factory_.AddAdvanced(); | 1369 constraint_factory_.AddAdvanced(); |
| 1203 advanced2.width.setExact(3000); | 1370 advanced2.width.setMin(1920); |
| 1204 advanced2.height.setExact(3000); | 1371 advanced2.height.setMin(1080); |
| 1372 advanced2.googNoiseReduction.setExact(false); |
| 1205 auto result = SelectSettings(); | 1373 auto result = SelectSettings(); |
| 1206 // No device supports the advanced constraint sets. | 1374 EXPECT_TRUE(result.HasValue()); |
| 1207 // Tie-breaker rule that applies is closeness to default settings. | 1375 // The second advanced set cannot be satisfied because it contradicts the |
| 1376 // first set. The default device supports the first set and should be |
| 1377 // selected. |
| 1208 EXPECT_EQ(default_device_->device_id, result.device_id); | 1378 EXPECT_EQ(default_device_->device_id, result.device_id); |
| 1209 EXPECT_EQ(*default_closest_format_, result.Format()); | 1379 EXPECT_LE(640, result.Width()); |
| 1380 EXPECT_LE(480, result.Height()); |
| 1381 EXPECT_TRUE(result.noise_reduction && *result.noise_reduction); |
| 1382 } |
| 1210 | 1383 |
| 1211 blink::WebMediaTrackConstraintSet& advanced3 = | 1384 // Same test without noise reduction |
| 1212 constraint_factory_.AddAdvanced(); | |
| 1213 advanced3.width.setExact(1920); | |
| 1214 advanced3.height.setExact(1080); | |
| 1215 result = SelectSettings(); | |
| 1216 EXPECT_TRUE(result.HasValue()); | |
| 1217 // The high-res device natively supports the third advanced constraint set | |
| 1218 // and should be selected. | |
| 1219 // First tie-breaker rule that applies is support for advanced constraints | |
| 1220 // that appear first. Second tie-breaker rule is custom distance to advanced | |
| 1221 // constraint sets that appear first. | |
| 1222 EXPECT_EQ(high_res_device_->device_id, result.device_id); | |
| 1223 EXPECT_EQ(1920, result.Width()); | |
| 1224 EXPECT_EQ(1080, result.Height()); | |
| 1225 | |
| 1226 blink::WebMediaTrackConstraintSet& advanced4 = | |
| 1227 constraint_factory_.AddAdvanced(); | |
| 1228 advanced4.width.setExact(640); | |
| 1229 advanced4.height.setExact(480); | |
| 1230 result = SelectSettings(); | |
| 1231 EXPECT_TRUE(result.HasValue()); | |
| 1232 // First tie-breaker rule that applies is support for advanced constraints | |
| 1233 // that appear first, which leaves out configurations that only support the | |
| 1234 // fourth advanced constraint set in favor of configurations that support | |
| 1235 // the third set. | |
| 1236 // Second tie-breaker rule is custom distance to advanced constraint sets | |
| 1237 // that appear first. | |
| 1238 EXPECT_EQ(high_res_device_->device_id, result.device_id); | |
| 1239 EXPECT_EQ(1920, result.Width()); | |
| 1240 EXPECT_EQ(1080, result.Height()); | |
| 1241 | |
| 1242 constraint_factory_.basic().width.setIdeal(800); | |
| 1243 constraint_factory_.basic().height.setIdeal(600); | |
| 1244 result = SelectSettings(); | |
| 1245 EXPECT_TRUE(result.HasValue()); | |
| 1246 // The ideal value is supported by the same configuration, so nothing | |
| 1247 // changes. | |
| 1248 EXPECT_EQ(high_res_device_->device_id, result.device_id); | |
| 1249 EXPECT_EQ(1920, result.Width()); | |
| 1250 EXPECT_EQ(1080, result.Height()); | |
| 1251 | |
| 1252 constraint_factory_.basic().width.setIdeal(2000); | |
| 1253 constraint_factory_.basic().height.setIdeal(1500); | |
| 1254 result = SelectSettings(); | |
| 1255 EXPECT_TRUE(result.HasValue()); | |
| 1256 // The closest configuration to the ideal resolution is the high-res device | |
| 1257 // at the highest resolution. | |
| 1258 EXPECT_EQ(high_res_device_->device_id, result.device_id); | |
| 1259 EXPECT_EQ(*high_res_highest_format_, result.Format()); | |
| 1260 } | |
| 1261 } | |
| 1262 | |
| 1263 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, | |
| 1264 AdvancedResolutionAndFrameRate) { | |
| 1265 { | 1385 { |
| 1266 constraint_factory_.Reset(); | 1386 constraint_factory_.Reset(); |
| 1267 blink::WebMediaTrackConstraintSet& advanced1 = | 1387 blink::WebMediaTrackConstraintSet& advanced1 = |
| 1268 constraint_factory_.AddAdvanced(); | 1388 constraint_factory_.AddAdvanced(); |
| 1269 advanced1.width.setExact(1920); | 1389 advanced1.width.setMin(640); |
| 1270 advanced1.height.setExact(1080); | 1390 advanced1.height.setMin(480); |
| 1271 blink::WebMediaTrackConstraintSet& advanced2 = | 1391 blink::WebMediaTrackConstraintSet& advanced2 = |
| 1272 constraint_factory_.AddAdvanced(); | 1392 constraint_factory_.AddAdvanced(); |
| 1273 advanced2.frameRate.setExact(60.0); | 1393 advanced2.width.setMin(1920); |
| 1274 blink::WebMediaTrackConstraintSet& advanced3 = | 1394 advanced2.height.setMin(1080); |
| 1275 constraint_factory_.AddAdvanced(); | |
| 1276 advanced3.width.setExact(2304); | |
| 1277 advanced3.height.setExact(1536); | |
| 1278 auto result = SelectSettings(); | 1395 auto result = SelectSettings(); |
| 1279 EXPECT_TRUE(result.HasValue()); | 1396 EXPECT_TRUE(result.HasValue()); |
| 1280 // The high-res device is the only one that satisfies the first advanced | 1397 // Only the high-res device can satisfy the second advanced set. |
| 1281 // set. 2304x1536x10.0 satisfies sets 1 and 3, while 1920x1080x60.0 | |
| 1282 // satisfies sets 1, and 2. The latter must be selected, regardless of | |
| 1283 // any other criteria. | |
| 1284 EXPECT_EQ(high_res_device_->device_id, result.device_id); | 1398 EXPECT_EQ(high_res_device_->device_id, result.device_id); |
| 1285 EXPECT_EQ(1920, result.Width()); | 1399 EXPECT_LE(1920, result.Width()); |
| 1286 EXPECT_EQ(1080, result.Height()); | 1400 EXPECT_LE(1080, result.Height()); |
| 1287 EXPECT_EQ(60.0, result.FrameRate()); | 1401 // Should select default noise reduction setting. |
| 1402 EXPECT_TRUE(!result.noise_reduction); |
| 1288 } | 1403 } |
| 1289 } | 1404 } |
| 1290 | 1405 |
| 1291 // The "NoDevices" tests verify that the algorithm returns the expected result | 1406 // The "NoDevices" tests verify that the algorithm returns the expected result |
| 1292 // when there are no candidates to choose from. | 1407 // when there are no candidates to choose from. |
| 1293 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, NoDevicesNoConstraints) { | 1408 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, NoDevicesNoConstraints) { |
| 1294 constraint_factory_.Reset(); | 1409 constraint_factory_.Reset(); |
| 1295 VideoDeviceCaptureCapabilities capabilities; | 1410 VideoDeviceCaptureCapabilities capabilities; |
| 1296 auto result = SelectVideoDeviceCaptureSourceSettings( | 1411 auto result = SelectVideoDeviceCaptureSourceSettings( |
| 1297 capabilities, constraint_factory_.CreateWebMediaConstraints()); | 1412 capabilities, constraint_factory_.CreateWebMediaConstraints()); |
| 1298 EXPECT_FALSE(result.HasValue()); | 1413 EXPECT_FALSE(result.HasValue()); |
| 1299 EXPECT_TRUE(std::string(result.failed_constraint_name).empty()); | 1414 EXPECT_TRUE(std::string(result.failed_constraint_name).empty()); |
| 1300 } | 1415 } |
| 1301 | 1416 |
| 1302 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, NoDevicesWithConstraints) { | 1417 TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, NoDevicesWithConstraints) { |
| 1303 constraint_factory_.Reset(); | 1418 constraint_factory_.Reset(); |
| 1304 constraint_factory_.basic().height.setExact(100); | 1419 constraint_factory_.basic().height.setExact(100); |
| 1305 VideoDeviceCaptureCapabilities capabilities; | 1420 VideoDeviceCaptureCapabilities capabilities; |
| 1306 auto result = SelectVideoDeviceCaptureSourceSettings( | 1421 auto result = SelectVideoDeviceCaptureSourceSettings( |
| 1307 capabilities, constraint_factory_.CreateWebMediaConstraints()); | 1422 capabilities, constraint_factory_.CreateWebMediaConstraints()); |
| 1308 EXPECT_FALSE(result.HasValue()); | 1423 EXPECT_FALSE(result.HasValue()); |
| 1309 EXPECT_TRUE(std::string(result.failed_constraint_name).empty()); | 1424 EXPECT_TRUE(std::string(result.failed_constraint_name).empty()); |
| 1310 } | 1425 } |
| 1311 | 1426 |
| 1312 } // namespace content | 1427 } // namespace content |
| OLD | NEW |