| Index: content/renderer/media/media_stream_constraints_util_video_device_unittest.cc
 | 
| diff --git a/content/renderer/media/media_stream_constraints_util_video_device_unittest.cc b/content/renderer/media/media_stream_constraints_util_video_device_unittest.cc
 | 
| index 4222ea37bfde4d3088dcc3077b5da4f2b1226286..f46b470a0d3385c6c2671f04f27c163b333ff9a9 100644
 | 
| --- a/content/renderer/media/media_stream_constraints_util_video_device_unittest.cc
 | 
| +++ b/content/renderer/media/media_stream_constraints_util_video_device_unittest.cc
 | 
| @@ -21,8 +21,40 @@ const char kDeviceID1[] = "fake_device_1";
 | 
|  const char kDeviceID2[] = "fake_device_2";
 | 
|  const char kDeviceID3[] = "fake_device_3";
 | 
|  const char kDeviceID4[] = "fake_device_4";
 | 
| +
 | 
| +void CheckTrackAdapterSettingsEqualsResolution(
 | 
| +    const VideoCaptureSettings& settings) {
 | 
| +  EXPECT_EQ(settings.Format().frame_size.width(),
 | 
| +            settings.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(settings.Format().frame_size.height(),
 | 
| +            settings.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(1.0 / settings.Format().frame_size.height(),
 | 
| +            settings.track_adapter_settings().min_aspect_ratio);
 | 
| +  EXPECT_EQ(settings.Format().frame_size.width(),
 | 
| +            settings.track_adapter_settings().max_aspect_ratio);
 | 
| +}
 | 
| +
 | 
| +void CheckTrackAdapterSettingsEqualsFrameRate(
 | 
| +    const VideoCaptureSettings& settings,
 | 
| +    double value = 0.0) {
 | 
| +  if (value >= settings.FrameRate())
 | 
| +    value = 0.0;
 | 
| +  EXPECT_EQ(value, settings.track_adapter_settings().max_frame_rate);
 | 
| +}
 | 
| +
 | 
| +void CheckTrackAdapterSettingsEqualsFormat(
 | 
| +    const VideoCaptureSettings& settings) {
 | 
| +  CheckTrackAdapterSettingsEqualsResolution(settings);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(settings);
 | 
|  }
 | 
|  
 | 
| +double AspectRatio(const media::VideoCaptureFormat& format) {
 | 
| +  return static_cast<double>(format.frame_size.width()) /
 | 
| +         static_cast<double>(format.frame_size.height());
 | 
| +}
 | 
| +
 | 
| +}  // namespace
 | 
| +
 | 
|  class MediaStreamConstraintsUtilVideoDeviceTest : public testing::Test {
 | 
|   public:
 | 
|    void SetUp() override {
 | 
| @@ -101,8 +133,8 @@ class MediaStreamConstraintsUtilVideoDeviceTest : public testing::Test {
 | 
|      };
 | 
|  
 | 
|      capabilities_.noise_reduction_capabilities = {
 | 
| -        rtc::Optional<bool>(), rtc::Optional<bool>(true),
 | 
| -        rtc::Optional<bool>(false),
 | 
| +        base::Optional<bool>(), base::Optional<bool>(true),
 | 
| +        base::Optional<bool>(false),
 | 
|      };
 | 
|  
 | 
|      default_device_ = capabilities_.device_capabilities[0].get();
 | 
| @@ -115,10 +147,10 @@ class MediaStreamConstraintsUtilVideoDeviceTest : public testing::Test {
 | 
|    }
 | 
|  
 | 
|   protected:
 | 
| -  VideoDeviceCaptureSourceSelectionResult SelectSettings() {
 | 
| +  VideoCaptureSettings SelectSettings() {
 | 
|      blink::WebMediaConstraints constraints =
 | 
|          constraint_factory_.CreateWebMediaConstraints();
 | 
| -    return SelectVideoDeviceCaptureSourceSettings(capabilities_, constraints);
 | 
| +    return SelectSettingsVideoDeviceCapture(capabilities_, constraints);
 | 
|    }
 | 
|  
 | 
|    VideoDeviceCaptureCapabilities capabilities_;
 | 
| @@ -141,12 +173,11 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, Unconstrained) {
 | 
|    EXPECT_TRUE(result.HasValue());
 | 
|    // Should select the default device with closest-to-default settings.
 | 
|    EXPECT_EQ(default_device_->device_id, result.device_id());
 | 
| -  EXPECT_EQ(default_device_->facing_mode, result.facing_mode());
 | 
|    EXPECT_EQ(*default_closest_format_, result.Format());
 | 
|    // Should select default settings for other constraints.
 | 
|    EXPECT_EQ(media::PowerLineFrequency::FREQUENCY_DEFAULT,
 | 
|              result.PowerLineFrequency());
 | 
| -  EXPECT_EQ(rtc::Optional<bool>(), result.noise_reduction());
 | 
| +  EXPECT_EQ(base::Optional<bool>(), result.noise_reduction());
 | 
|  }
 | 
|  
 | 
|  // The "Overconstrained" tests verify that failure of any single required
 | 
| @@ -318,13 +349,12 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
|    };
 | 
|    capabilities.device_capabilities.push_back(std::move(device));
 | 
|    capabilities.power_line_capabilities = capabilities_.power_line_capabilities;
 | 
| -  capabilities.noise_reduction_capabilities = {rtc::Optional<bool>(false)};
 | 
| +  capabilities.noise_reduction_capabilities = {base::Optional<bool>(false)};
 | 
|  
 | 
|    constraint_factory_.Reset();
 | 
|    constraint_factory_.basic().googNoiseReduction.setExact(true);
 | 
|    auto constraints = constraint_factory_.CreateWebMediaConstraints();
 | 
| -  auto result =
 | 
| -      SelectVideoDeviceCaptureSourceSettings(capabilities, constraints);
 | 
| +  auto result = SelectSettingsVideoDeviceCapture(capabilities, constraints);
 | 
|    EXPECT_FALSE(result.HasValue());
 | 
|    EXPECT_EQ(constraint_factory_.basic().googNoiseReduction.name(),
 | 
|              result.failed_constraint_name());
 | 
| @@ -342,6 +372,7 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryDeviceID) {
 | 
|    EXPECT_EQ(*default_closest_format_, result.Format());
 | 
|    EXPECT_EQ(media::PowerLineFrequency::FREQUENCY_DEFAULT,
 | 
|              result.PowerLineFrequency());
 | 
| +  CheckTrackAdapterSettingsEqualsFormat(result);
 | 
|  
 | 
|    constraint_factory_.basic().deviceId.setExact(
 | 
|        blink::WebString::fromASCII(low_res_device_->device_id));
 | 
| @@ -350,6 +381,7 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryDeviceID) {
 | 
|    EXPECT_EQ(*low_res_closest_format_, result.Format());
 | 
|    EXPECT_EQ(media::PowerLineFrequency::FREQUENCY_DEFAULT,
 | 
|              result.PowerLineFrequency());
 | 
| +  CheckTrackAdapterSettingsEqualsFormat(result);
 | 
|  
 | 
|    constraint_factory_.basic().deviceId.setExact(
 | 
|        blink::WebString::fromASCII(high_res_device_->device_id));
 | 
| @@ -358,6 +390,7 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryDeviceID) {
 | 
|    EXPECT_EQ(*high_res_closest_format_, result.Format());
 | 
|    EXPECT_EQ(media::PowerLineFrequency::FREQUENCY_DEFAULT,
 | 
|              result.PowerLineFrequency());
 | 
| +  CheckTrackAdapterSettingsEqualsFormat(result);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryFacingMode) {
 | 
| @@ -366,25 +399,27 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryFacingMode) {
 | 
|        blink::WebString::fromASCII("environment"));
 | 
|    auto result = SelectSettings();
 | 
|    EXPECT_TRUE(result.HasValue());
 | 
| -  EXPECT_EQ(::mojom::FacingMode::ENVIRONMENT, result.facing_mode());
 | 
|    // Only the low-res device supports environment facing mode. Should select
 | 
|    // default settings for everything else.
 | 
|    EXPECT_EQ(low_res_device_->device_id, result.device_id());
 | 
| +  EXPECT_EQ(::mojom::FacingMode::ENVIRONMENT, low_res_device_->facing_mode);
 | 
|    EXPECT_EQ(*low_res_closest_format_, result.Format());
 | 
|    EXPECT_EQ(media::PowerLineFrequency::FREQUENCY_DEFAULT,
 | 
|              result.PowerLineFrequency());
 | 
| +  CheckTrackAdapterSettingsEqualsFormat(result);
 | 
|  
 | 
|    constraint_factory_.basic().facingMode.setExact(
 | 
|        blink::WebString::fromASCII("user"));
 | 
|    result = SelectSettings();
 | 
|    EXPECT_TRUE(result.HasValue());
 | 
| -  EXPECT_EQ(::mojom::FacingMode::USER, result.facing_mode());
 | 
|    // Only the high-res device supports user facing mode. Should select default
 | 
|    // settings for everything else.
 | 
|    EXPECT_EQ(high_res_device_->device_id, result.device_id());
 | 
| +  EXPECT_EQ(::mojom::FacingMode::USER, high_res_device_->facing_mode);
 | 
|    EXPECT_EQ(*high_res_closest_format_, result.Format());
 | 
|    EXPECT_EQ(media::PowerLineFrequency::FREQUENCY_DEFAULT,
 | 
|              result.PowerLineFrequency());
 | 
| +  CheckTrackAdapterSettingsEqualsFormat(result);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryVideoKind) {
 | 
| @@ -395,12 +430,14 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryVideoKind) {
 | 
|    EXPECT_TRUE(result.HasValue());
 | 
|    EXPECT_EQ(kDeviceID4, result.device_id());
 | 
|    EXPECT_EQ(media::PIXEL_FORMAT_Y16, result.Format().pixel_format);
 | 
| +  CheckTrackAdapterSettingsEqualsFormat(result);
 | 
|  
 | 
|    constraint_factory_.basic().videoKind.setExact(
 | 
|        blink::WebString::fromASCII("color"));
 | 
|    result = SelectSettings();
 | 
|    EXPECT_TRUE(result.HasValue());
 | 
|    EXPECT_EQ(default_device_->device_id, result.device_id());
 | 
| +  CheckTrackAdapterSettingsEqualsFormat(result);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryPowerLineFrequency) {
 | 
| @@ -417,8 +454,8 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryPowerLineFrequency) {
 | 
|      // The default device and settings closest to the default should be
 | 
|      // selected.
 | 
|      EXPECT_EQ(default_device_->device_id, result.device_id());
 | 
| -    EXPECT_EQ(default_device_->facing_mode, result.facing_mode());
 | 
|      EXPECT_EQ(*default_closest_format_, result.Format());
 | 
| +    CheckTrackAdapterSettingsEqualsFormat(result);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -433,8 +470,8 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryNoiseReduction) {
 | 
|      // The default device and settings closest to the default should be
 | 
|      // selected.
 | 
|      EXPECT_EQ(default_device_->device_id, result.device_id());
 | 
| -    EXPECT_EQ(default_device_->facing_mode, result.facing_mode());
 | 
|      EXPECT_EQ(*default_closest_format_, result.Format());
 | 
| +    CheckTrackAdapterSettingsEqualsFormat(result);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -449,6 +486,7 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryExactHeight) {
 | 
|    // which is the low-res device.
 | 
|    EXPECT_EQ(low_res_device_->device_id, result.device_id());
 | 
|    EXPECT_EQ(kHeight, result.Height());
 | 
| +  EXPECT_EQ(kHeight, result.track_adapter_settings().max_height);
 | 
|  
 | 
|    const int kLargeHeight = 1500;
 | 
|    constraint_factory_.basic().height.setExact(kLargeHeight);
 | 
| @@ -458,6 +496,9 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryExactHeight) {
 | 
|    // height, even if not natively.
 | 
|    EXPECT_EQ(high_res_device_->device_id, result.device_id());
 | 
|    EXPECT_EQ(*high_res_highest_format_, result.Format());
 | 
| +  EXPECT_EQ(kLargeHeight, result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(std::round(kLargeHeight * AspectRatio(*high_res_highest_format_)),
 | 
| +            result.track_adapter_settings().max_width);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryMinHeight) {
 | 
| @@ -470,6 +511,13 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryMinHeight) {
 | 
|    // algorithm should prefer the default device.
 | 
|    EXPECT_EQ(default_device_->device_id, result.device_id());
 | 
|    EXPECT_LE(kHeight, result.Height());
 | 
| +  EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(static_cast<double>(result.Width()) / kHeight,
 | 
| +            result.track_adapter_settings().max_aspect_ratio);
 | 
| +  EXPECT_EQ(1.0 / result.Height(),
 | 
| +            result.track_adapter_settings().min_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|  
 | 
|    const int kLargeHeight = 1500;
 | 
|    constraint_factory_.basic().height.setMin(kLargeHeight);
 | 
| @@ -479,6 +527,14 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryMinHeight) {
 | 
|    // height range.
 | 
|    EXPECT_EQ(high_res_device_->device_id, result.device_id());
 | 
|    EXPECT_EQ(*high_res_highest_format_, result.Format());
 | 
| +  EXPECT_LE(kHeight, result.Height());
 | 
| +  EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(static_cast<double>(result.Width()) / kLargeHeight,
 | 
| +            result.track_adapter_settings().max_aspect_ratio);
 | 
| +  EXPECT_EQ(1.0 / result.Height(),
 | 
| +            result.track_adapter_settings().min_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryMaxHeight) {
 | 
| @@ -492,6 +548,13 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryMaxHeight) {
 | 
|    // maximum by the lowest amount. In this case it is the low-res device.
 | 
|    EXPECT_EQ(low_res_device_->device_id, result.device_id());
 | 
|    EXPECT_EQ(low_res_device_->formats[0], result.Format());
 | 
| +  EXPECT_EQ(kLowHeight, result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(std::round(kLowHeight * AspectRatio(result.Format())),
 | 
| +            result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(static_cast<double>(result.Width()),
 | 
| +            result.track_adapter_settings().max_aspect_ratio);
 | 
| +  EXPECT_EQ(1.0 / kLowHeight, result.track_adapter_settings().min_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryHeightRange) {
 | 
| @@ -511,6 +574,13 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryHeightRange) {
 | 
|      // range.
 | 
|      EXPECT_EQ(default_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(*default_closest_format_, result.Format());
 | 
| +    EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height);
 | 
| +    EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +    EXPECT_EQ(static_cast<double>(result.Width()) / kMinHeight,
 | 
| +              result.track_adapter_settings().max_aspect_ratio);
 | 
| +    EXPECT_EQ(1.0 / result.Height(),
 | 
| +              result.track_adapter_settings().min_aspect_ratio);
 | 
| +    CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|    }
 | 
|  
 | 
|    {
 | 
| @@ -528,6 +598,13 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryHeightRange) {
 | 
|      EXPECT_EQ(low_res_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(800, result.Width());
 | 
|      EXPECT_EQ(600, result.Height());
 | 
| +    EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height);
 | 
| +    EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +    EXPECT_EQ(static_cast<double>(result.Width()) / kMinHeight,
 | 
| +              result.track_adapter_settings().max_aspect_ratio);
 | 
| +    EXPECT_EQ(1.0 / result.Height(),
 | 
| +              result.track_adapter_settings().min_aspect_ratio);
 | 
| +    CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|    }
 | 
|  
 | 
|    {
 | 
| @@ -545,6 +622,13 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryHeightRange) {
 | 
|      EXPECT_EQ(high_res_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(1280, result.Width());
 | 
|      EXPECT_EQ(720, result.Height());
 | 
| +    EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height);
 | 
| +    EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +    EXPECT_EQ(static_cast<double>(result.Width()) / kMinHeight,
 | 
| +              result.track_adapter_settings().max_aspect_ratio);
 | 
| +    EXPECT_EQ(1.0 / result.Height(),
 | 
| +              result.track_adapter_settings().min_aspect_ratio);
 | 
| +    CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -559,6 +643,7 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, IdealHeight) {
 | 
|      // height natively.
 | 
|      EXPECT_EQ(low_res_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(kIdealHeight, result.Height());
 | 
| +    CheckTrackAdapterSettingsEqualsFormat(result);
 | 
|    }
 | 
|  
 | 
|    {
 | 
| @@ -572,6 +657,15 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, IdealHeight) {
 | 
|      // 500 cropped to 480.
 | 
|      EXPECT_EQ(default_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(*default_closest_format_, result.Format());
 | 
| +    // The track is cropped to the ideal height, maintaining the source aspect
 | 
| +    // ratio.
 | 
| +    EXPECT_EQ(kIdealHeight, result.track_adapter_settings().max_height);
 | 
| +    EXPECT_EQ(std::round(kIdealHeight * AspectRatio(result.Format())),
 | 
| +              result.track_adapter_settings().max_width);
 | 
| +    EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio);
 | 
| +    EXPECT_EQ(1.0 / result.Height(),
 | 
| +              result.track_adapter_settings().min_aspect_ratio);
 | 
| +    CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|    }
 | 
|  
 | 
|    {
 | 
| @@ -585,6 +679,13 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, IdealHeight) {
 | 
|      EXPECT_EQ(high_res_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(1920, result.Width());
 | 
|      EXPECT_EQ(1080, result.Height());
 | 
| +    EXPECT_EQ(kIdealHeight, result.track_adapter_settings().max_height);
 | 
| +    EXPECT_EQ(std::round(kIdealHeight * AspectRatio(result.Format())),
 | 
| +              result.track_adapter_settings().max_width);
 | 
| +    EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio);
 | 
| +    EXPECT_EQ(1.0 / result.Height(),
 | 
| +              result.track_adapter_settings().min_aspect_ratio);
 | 
| +    CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|    }
 | 
|  
 | 
|    {
 | 
| @@ -596,6 +697,13 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, IdealHeight) {
 | 
|      // which is the high-res device at the highest resolution.
 | 
|      EXPECT_EQ(high_res_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(*high_res_highest_format_, result.Format());
 | 
| +    EXPECT_EQ(kIdealHeight, result.track_adapter_settings().max_height);
 | 
| +    EXPECT_EQ(std::round(kIdealHeight * AspectRatio(result.Format())),
 | 
| +              result.track_adapter_settings().max_width);
 | 
| +    EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio);
 | 
| +    EXPECT_EQ(1.0 / result.Height(),
 | 
| +              result.track_adapter_settings().min_aspect_ratio);
 | 
| +    CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -610,6 +718,13 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryExactWidth) {
 | 
|    // which is the low-res device.
 | 
|    EXPECT_EQ(low_res_device_->device_id, result.device_id());
 | 
|    EXPECT_EQ(kWidth, result.Width());
 | 
| +  EXPECT_EQ(std::round(kWidth / AspectRatio(result.Format())),
 | 
| +            result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(kWidth, result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(kWidth, result.track_adapter_settings().max_aspect_ratio);
 | 
| +  EXPECT_EQ(static_cast<double>(kWidth) / result.Height(),
 | 
| +            result.track_adapter_settings().min_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|  
 | 
|    const int kLargeWidth = 2000;
 | 
|    constraint_factory_.basic().width.setExact(kLargeWidth);
 | 
| @@ -620,6 +735,13 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryExactWidth) {
 | 
|    // width, even if not natively.
 | 
|    EXPECT_EQ(high_res_device_->device_id, result.device_id());
 | 
|    EXPECT_EQ(*high_res_highest_format_, result.Format());
 | 
| +  EXPECT_EQ(std::round(kLargeWidth / AspectRatio(result.Format())),
 | 
| +            result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(kLargeWidth, result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(kLargeWidth, result.track_adapter_settings().max_aspect_ratio);
 | 
| +  EXPECT_EQ(static_cast<double>(kLargeWidth) / result.Height(),
 | 
| +            result.track_adapter_settings().min_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryMinWidth) {
 | 
| @@ -635,6 +757,12 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryMinWidth) {
 | 
|    EXPECT_LE(kWidth, result.Width());
 | 
|    EXPECT_EQ(1000, result.Width());
 | 
|    EXPECT_EQ(1000, result.Height());
 | 
| +  EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio);
 | 
| +  EXPECT_EQ(static_cast<double>(kWidth) / result.Height(),
 | 
| +            result.track_adapter_settings().min_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|  
 | 
|    const int kLargeWidth = 2000;
 | 
|    constraint_factory_.basic().width.setMin(kLargeWidth);
 | 
| @@ -645,6 +773,12 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryMinWidth) {
 | 
|    EXPECT_EQ(high_res_device_->device_id, result.device_id());
 | 
|    EXPECT_LE(kLargeWidth, result.Width());
 | 
|    EXPECT_EQ(*high_res_highest_format_, result.Format());
 | 
| +  EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio);
 | 
| +  EXPECT_EQ(static_cast<double>(kLargeWidth) / result.Height(),
 | 
| +            result.track_adapter_settings().min_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryMaxWidth) {
 | 
| @@ -659,6 +793,14 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryMaxWidth) {
 | 
|    // lowest resolution.
 | 
|    EXPECT_EQ(low_res_device_->device_id, result.device_id());
 | 
|    EXPECT_EQ(low_res_device_->formats[0], result.Format());
 | 
| +  // The track is cropped to kLowWidth and keeps the source aspect ratio.
 | 
| +  EXPECT_EQ(std::round(kLowWidth / AspectRatio(result.Format())),
 | 
| +            result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(kLowWidth, result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(kLowWidth, result.track_adapter_settings().max_aspect_ratio);
 | 
| +  EXPECT_EQ(1.0 / result.Height(),
 | 
| +            result.track_adapter_settings().min_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryWidthRange) {
 | 
| @@ -678,6 +820,12 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryWidthRange) {
 | 
|      EXPECT_EQ(default_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(1000, result.Width());
 | 
|      EXPECT_EQ(1000, result.Height());
 | 
| +    EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height);
 | 
| +    EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +    EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio);
 | 
| +    EXPECT_EQ(static_cast<double>(kMinWidth) / result.Height(),
 | 
| +              result.track_adapter_settings().min_aspect_ratio);
 | 
| +    CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|    }
 | 
|  
 | 
|    {
 | 
| @@ -695,6 +843,12 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryWidthRange) {
 | 
|      EXPECT_EQ(low_res_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(800, result.Width());
 | 
|      EXPECT_EQ(600, result.Height());
 | 
| +    EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height);
 | 
| +    EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +    EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio);
 | 
| +    EXPECT_EQ(static_cast<double>(kMinWidth) / result.Height(),
 | 
| +              result.track_adapter_settings().min_aspect_ratio);
 | 
| +    CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|    }
 | 
|  
 | 
|    {
 | 
| @@ -712,6 +866,12 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryWidthRange) {
 | 
|      EXPECT_EQ(high_res_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(1920, result.Width());
 | 
|      EXPECT_EQ(1080, result.Height());
 | 
| +    EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height);
 | 
| +    EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +    EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio);
 | 
| +    EXPECT_EQ(static_cast<double>(kMinWidth) / result.Height(),
 | 
| +              result.track_adapter_settings().min_aspect_ratio);
 | 
| +    CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -726,6 +886,13 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, IdealWidth) {
 | 
|      // width natively, which is the low-res device at 320x240.
 | 
|      EXPECT_EQ(low_res_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(kIdealWidth, result.Width());
 | 
| +    EXPECT_EQ(std::round(kIdealWidth / AspectRatio(result.Format())),
 | 
| +              result.track_adapter_settings().max_height);
 | 
| +    EXPECT_EQ(kIdealWidth, result.track_adapter_settings().max_width);
 | 
| +    EXPECT_EQ(kIdealWidth, result.track_adapter_settings().max_aspect_ratio);
 | 
| +    EXPECT_EQ(1.0 / result.Height(),
 | 
| +              result.track_adapter_settings().min_aspect_ratio);
 | 
| +    CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|    }
 | 
|  
 | 
|    {
 | 
| @@ -739,6 +906,14 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, IdealWidth) {
 | 
|      // 321 than 500 cropped to 321.
 | 
|      EXPECT_EQ(default_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(*default_closest_format_, result.Format());
 | 
| +    // The track is cropped to kIdealWidth and keeps the source aspect ratio.
 | 
| +    EXPECT_EQ(std::round(kIdealWidth / AspectRatio(result.Format())),
 | 
| +              result.track_adapter_settings().max_height);
 | 
| +    EXPECT_EQ(kIdealWidth, result.track_adapter_settings().max_width);
 | 
| +    EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio);
 | 
| +    EXPECT_EQ(1.0 / result.Height(),
 | 
| +              result.track_adapter_settings().min_aspect_ratio);
 | 
| +    CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|    }
 | 
|  
 | 
|    {
 | 
| @@ -749,6 +924,14 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, IdealWidth) {
 | 
|      // The algorithm must the select the only device that can satisfy the ideal.
 | 
|      EXPECT_EQ(high_res_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(*high_res_highest_format_, result.Format());
 | 
| +    // The track is cropped to kIdealWidth and keeps the source aspect ratio.
 | 
| +    EXPECT_EQ(std::round(kIdealWidth / AspectRatio(result.Format())),
 | 
| +              result.track_adapter_settings().max_height);
 | 
| +    EXPECT_EQ(kIdealWidth, result.track_adapter_settings().max_width);
 | 
| +    EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio);
 | 
| +    EXPECT_EQ(1.0 / result.Height(),
 | 
| +              result.track_adapter_settings().min_aspect_ratio);
 | 
| +    CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|    }
 | 
|  
 | 
|    {
 | 
| @@ -760,6 +943,7 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, IdealWidth) {
 | 
|      // to the ideal.
 | 
|      EXPECT_EQ(high_res_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(*high_res_highest_format_, result.Format());
 | 
| +    CheckTrackAdapterSettingsEqualsFormat(result);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -776,6 +960,8 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryExactFrameRate) {
 | 
|    EXPECT_EQ(kFrameRate, result.FrameRate());
 | 
|    EXPECT_EQ(640, result.Width());
 | 
|    EXPECT_EQ(480, result.Height());
 | 
| +  CheckTrackAdapterSettingsEqualsResolution(result);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result, kFrameRate);
 | 
|  
 | 
|    const double kLargeFrameRate = 50;
 | 
|    constraint_factory_.basic().frameRate.setExact(kLargeFrameRate);
 | 
| @@ -788,6 +974,8 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryExactFrameRate) {
 | 
|    EXPECT_EQ(60.0, result.FrameRate());
 | 
|    EXPECT_EQ(1280, result.Width());
 | 
|    EXPECT_EQ(720, result.Height());
 | 
| +  CheckTrackAdapterSettingsEqualsResolution(result);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result, kLargeFrameRate);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryMinFrameRate) {
 | 
| @@ -801,6 +989,7 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryMinFrameRate) {
 | 
|    EXPECT_EQ(default_device_->device_id, result.device_id());
 | 
|    // The format closest to the default satisfies the constraint.
 | 
|    EXPECT_EQ(*default_closest_format_, result.Format());
 | 
| +  CheckTrackAdapterSettingsEqualsFormat(result);
 | 
|  
 | 
|    const double kLargeFrameRate = 50;
 | 
|    constraint_factory_.basic().frameRate.setMin(kLargeFrameRate);
 | 
| @@ -812,6 +1001,7 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryMinFrameRate) {
 | 
|    EXPECT_LE(kLargeFrameRate, result.FrameRate());
 | 
|    EXPECT_EQ(1280, result.Width());
 | 
|    EXPECT_EQ(720, result.Height());
 | 
| +  CheckTrackAdapterSettingsEqualsFormat(result);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryMaxFrameRate) {
 | 
| @@ -828,6 +1018,8 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryMaxFrameRate) {
 | 
|    EXPECT_EQ(kLowFrameRate, result.FrameRate());
 | 
|    EXPECT_EQ(MediaStreamVideoSource::kDefaultHeight, result.Height());
 | 
|    EXPECT_EQ(MediaStreamVideoSource::kDefaultWidth, result.Width());
 | 
| +  CheckTrackAdapterSettingsEqualsResolution(result);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result, kLowFrameRate);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryFrameRateRange) {
 | 
| @@ -846,6 +1038,7 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryFrameRateRange) {
 | 
|      // format has a frame rate included in the requested range.
 | 
|      EXPECT_EQ(default_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(*default_closest_format_, result.Format());
 | 
| +    CheckTrackAdapterSettingsEqualsFormat(result);
 | 
|    }
 | 
|  
 | 
|    {
 | 
| @@ -862,6 +1055,7 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryFrameRateRange) {
 | 
|      // range. The default resolution should be preferred as secondary criterion.
 | 
|      EXPECT_EQ(low_res_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(*low_res_closest_format_, result.Format());
 | 
| +    CheckTrackAdapterSettingsEqualsFormat(result);
 | 
|    }
 | 
|  
 | 
|    {
 | 
| @@ -880,6 +1074,7 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryFrameRateRange) {
 | 
|      EXPECT_EQ(high_res_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(1280, result.Width());
 | 
|      EXPECT_EQ(720, result.Height());
 | 
| +    CheckTrackAdapterSettingsEqualsFormat(result);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -895,6 +1090,8 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, IdealFrameRate) {
 | 
|      // resolution should be selected as secondary criterion.
 | 
|      EXPECT_EQ(low_res_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(*low_res_closest_format_, result.Format());
 | 
| +    CheckTrackAdapterSettingsEqualsResolution(result);
 | 
| +    CheckTrackAdapterSettingsEqualsFrameRate(result, kIdealFrameRate);
 | 
|    }
 | 
|  
 | 
|    {
 | 
| @@ -908,6 +1105,8 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, IdealFrameRate) {
 | 
|      // 31 adjusted to 30.
 | 
|      EXPECT_EQ(default_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(*default_closest_format_, result.Format());
 | 
| +    CheckTrackAdapterSettingsEqualsResolution(result);
 | 
| +    CheckTrackAdapterSettingsEqualsFrameRate(result, kIdealFrameRate);
 | 
|    }
 | 
|  
 | 
|    {
 | 
| @@ -922,6 +1121,8 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, IdealFrameRate) {
 | 
|      EXPECT_EQ(1280, result.Width());
 | 
|      EXPECT_EQ(720, result.Height());
 | 
|      EXPECT_EQ(60, result.FrameRate());
 | 
| +    CheckTrackAdapterSettingsEqualsResolution(result);
 | 
| +    CheckTrackAdapterSettingsEqualsFrameRate(result, kIdealFrameRate);
 | 
|    }
 | 
|  
 | 
|    {
 | 
| @@ -937,6 +1138,7 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, IdealFrameRate) {
 | 
|      EXPECT_EQ(1280, result.Width());
 | 
|      EXPECT_EQ(720, result.Height());
 | 
|      EXPECT_EQ(60, result.FrameRate());
 | 
| +    CheckTrackAdapterSettingsEqualsFormat(result);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -960,6 +1162,12 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryExactAspectRatio) {
 | 
|    // aspect ratio.
 | 
|    EXPECT_EQ(default_device_->device_id, result.device_id());
 | 
|    EXPECT_EQ(*default_closest_format_, result.Format());
 | 
| +  EXPECT_EQ(std::round(result.Width() / kAspectRatio),
 | 
| +            result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(kAspectRatio, result.track_adapter_settings().min_aspect_ratio);
 | 
| +  EXPECT_EQ(kAspectRatio, result.track_adapter_settings().max_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|  
 | 
|    const int kMinWidth = 500;
 | 
|    const int kMaxWidth = 1000;
 | 
| @@ -983,6 +1191,12 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryExactAspectRatio) {
 | 
|    // settings (500x500) using cropping.
 | 
|    EXPECT_EQ(default_device_->device_id, result.device_id());
 | 
|    EXPECT_EQ(*default_closest_format_, result.Format());
 | 
| +  EXPECT_EQ(std::round(result.Width() / kAspectRatio),
 | 
| +            result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(kAspectRatio, result.track_adapter_settings().min_aspect_ratio);
 | 
| +  EXPECT_EQ(kAspectRatio, result.track_adapter_settings().max_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|  
 | 
|    const int kMinHeight = 480;
 | 
|    constraint_factory_.basic().height.setMin(kMinHeight);
 | 
| @@ -1009,6 +1223,12 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryExactAspectRatio) {
 | 
|    // low-res device.
 | 
|    EXPECT_EQ(low_res_device_->device_id, result.device_id());
 | 
|    EXPECT_EQ(*low_res_closest_format_, result.Format());
 | 
| +  EXPECT_EQ(std::round(result.Width() / kAspectRatio),
 | 
| +            result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(kAspectRatio, result.track_adapter_settings().min_aspect_ratio);
 | 
| +  EXPECT_EQ(kAspectRatio, result.track_adapter_settings().max_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryMinAspectRatio) {
 | 
| @@ -1028,6 +1248,14 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryMinAspectRatio) {
 | 
|    // aspect-ratio range, which in this case is the default device.
 | 
|    EXPECT_EQ(default_device_->device_id, result.device_id());
 | 
|    EXPECT_EQ(*default_closest_format_, result.Format());
 | 
| +  // Adjust the track resolution to use the minimum aspect ratio, which is
 | 
| +  // greater than the source's aspect ratio.
 | 
| +  EXPECT_EQ(std::round(result.Width() / kAspectRatio),
 | 
| +            result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(kAspectRatio, result.track_adapter_settings().min_aspect_ratio);
 | 
| +  EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|  
 | 
|    const int kMinWidth = 500;
 | 
|    const int kMaxWidth = 1000;
 | 
| @@ -1054,6 +1282,12 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryMinAspectRatio) {
 | 
|    // constraints than the default native resolution of the low-res device.
 | 
|    EXPECT_EQ(low_res_device_->device_id, result.device_id());
 | 
|    EXPECT_EQ(*low_res_closest_format_, result.Format());
 | 
| +  // The source's native aspect ratio equals the minimum aspect ratio.
 | 
| +  EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(kAspectRatio, result.track_adapter_settings().min_aspect_ratio);
 | 
| +  EXPECT_EQ(max_aspect_ratio, result.track_adapter_settings().max_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryMaxAspectRatio) {
 | 
| @@ -1073,6 +1307,14 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryMaxAspectRatio) {
 | 
|    // aspect-ratio range, which in this case is the default device.
 | 
|    EXPECT_EQ(default_device_->device_id, result.device_id());
 | 
|    EXPECT_EQ(*default_closest_format_, result.Format());
 | 
| +  // The track's aspect ratio is adjusted to the maximum, which is lower than
 | 
| +  // the source's native aspect ratio.
 | 
| +  EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(std::round(result.Height() * kAspectRatio),
 | 
| +            result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(min_aspect_ratio, result.track_adapter_settings().min_aspect_ratio);
 | 
| +  EXPECT_EQ(kAspectRatio, result.track_adapter_settings().max_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|  
 | 
|    const int kExactWidth = 360;
 | 
|    const int kMinHeight = 360;
 | 
| @@ -1098,6 +1340,14 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryMaxAspectRatio) {
 | 
|    EXPECT_EQ(high_res_device_->device_id, result.device_id());
 | 
|    EXPECT_EQ(1280, result.Width());
 | 
|    EXPECT_EQ(720, result.Height());
 | 
| +  // The track's aspect ratio is adjusted to the maximum, which is lower than
 | 
| +  // the source's native aspect ratio.
 | 
| +  EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(std::round(result.Height() * kAspectRatio),
 | 
| +            result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(min_aspect_ratio, result.track_adapter_settings().min_aspect_ratio);
 | 
| +  EXPECT_EQ(kAspectRatio, result.track_adapter_settings().max_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryAspectRatioRange) {
 | 
| @@ -1125,15 +1375,24 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryAspectRatioRange) {
 | 
|      // aspect-ratio range, which in this case is the default device.
 | 
|      EXPECT_EQ(default_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(*default_closest_format_, result.Format());
 | 
| +    // The source's aspect ratio matches the maximum aspect ratio. No adjustment
 | 
| +    // is required.
 | 
| +    EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height);
 | 
| +    EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +    EXPECT_EQ(kMinAspectRatio,
 | 
| +              result.track_adapter_settings().min_aspect_ratio);
 | 
| +    EXPECT_EQ(kMaxAspectRatio,
 | 
| +              result.track_adapter_settings().max_aspect_ratio);
 | 
| +    CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|    }
 | 
|  
 | 
|    {
 | 
|      const double kMinAspectRatio = 3.0;
 | 
|      const double kMaxAspectRatio = 4.0;
 | 
|  
 | 
| -    const long kExactHeight = 600;
 | 
| +    const long kMinHeight = 600;
 | 
|      constraint_factory_.Reset();
 | 
| -    constraint_factory_.basic().height.setMin(kExactHeight);
 | 
| +    constraint_factory_.basic().height.setMin(kMinHeight);
 | 
|      constraint_factory_.basic().aspectRatio.setMin(kMinAspectRatio);
 | 
|      constraint_factory_.basic().aspectRatio.setMax(kMaxAspectRatio);
 | 
|      auto result = SelectSettings();
 | 
| @@ -1153,6 +1412,15 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, MandatoryAspectRatioRange) {
 | 
|      EXPECT_EQ(high_res_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(1920, result.Width());
 | 
|      EXPECT_EQ(1080, result.Height());
 | 
| +    // The track is cropped to support the minimum aspect ratio.
 | 
| +    EXPECT_EQ(std::round(result.Width() / kMinAspectRatio),
 | 
| +              result.track_adapter_settings().max_height);
 | 
| +    EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +    EXPECT_EQ(kMinAspectRatio,
 | 
| +              result.track_adapter_settings().min_aspect_ratio);
 | 
| +    EXPECT_EQ(static_cast<double>(result.Width()) / kMinHeight,
 | 
| +              result.track_adapter_settings().max_aspect_ratio);
 | 
| +    CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -1176,6 +1444,15 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, IdealAspectRatio) {
 | 
|      EXPECT_GE(kIdealAspectRatio, min_aspect_ratio);
 | 
|      EXPECT_EQ(default_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(*default_closest_format_, result.Format());
 | 
| +    // The track is cropped to support the ideal aspect ratio.
 | 
| +    EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height);
 | 
| +    EXPECT_EQ(std::round(result.Height() * kIdealAspectRatio),
 | 
| +              result.track_adapter_settings().max_width);
 | 
| +    EXPECT_EQ(min_aspect_ratio,
 | 
| +              result.track_adapter_settings().min_aspect_ratio);
 | 
| +    EXPECT_EQ(max_aspect_ratio,
 | 
| +              result.track_adapter_settings().max_aspect_ratio);
 | 
| +    CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|    }
 | 
|  
 | 
|    {
 | 
| @@ -1184,11 +1461,22 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, IdealAspectRatio) {
 | 
|      auto result = SelectSettings();
 | 
|      EXPECT_TRUE(result.HasValue());
 | 
|      // The only device that supports the ideal aspect ratio is the high-res
 | 
| -    // device. The least expensive way to support it with the 1920x1080 format
 | 
| -    // cropped to 1500x1.
 | 
| +    // device.
 | 
|      EXPECT_EQ(high_res_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(1920, result.Width());
 | 
|      EXPECT_EQ(1080, result.Height());
 | 
| +    // The most exact way to support the ideal aspect ratio would be to crop to
 | 
| +    // 1500x1. However, the algorithm tries to crop to 1920x1.28 and rounds.
 | 
| +    // In this case, the effect of rounding is noticeable because of the
 | 
| +    // resulting low value for height. For more typical resolution values,
 | 
| +    // the at-most 1-pixel error caused by rounding is not an issue.
 | 
| +    EXPECT_EQ(std::round(result.Width() / kIdealAspectRatio),
 | 
| +              result.track_adapter_settings().max_height);
 | 
| +    EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +    EXPECT_EQ(1.0 / result.Height(),
 | 
| +              result.track_adapter_settings().min_aspect_ratio);
 | 
| +    EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio);
 | 
| +    CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|    }
 | 
|  
 | 
|    {
 | 
| @@ -1197,9 +1485,16 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, IdealAspectRatio) {
 | 
|      auto result = SelectSettings();
 | 
|      EXPECT_TRUE(result.HasValue());
 | 
|      // The only device that supports the ideal aspect ratio is the high-res
 | 
| -    // device with its highest resolution, cropped to 2000x1.
 | 
| +    // device with its highest resolution.
 | 
|      EXPECT_EQ(high_res_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(*high_res_highest_format_, result.Format());
 | 
| +    EXPECT_EQ(std::round(result.Width() / kIdealAspectRatio),
 | 
| +              result.track_adapter_settings().max_height);
 | 
| +    EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +    EXPECT_EQ(1.0 / result.Height(),
 | 
| +              result.track_adapter_settings().min_aspect_ratio);
 | 
| +    EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio);
 | 
| +    CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|    }
 | 
|  
 | 
|    {
 | 
| @@ -1211,12 +1506,20 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, IdealAspectRatio) {
 | 
|      // device with its highest resolution, cropped to 2304x1.
 | 
|      EXPECT_EQ(high_res_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(*high_res_highest_format_, result.Format());
 | 
| +    // In this case there is no rounding error.
 | 
| +    EXPECT_EQ(1, result.track_adapter_settings().max_height);
 | 
| +    EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +    EXPECT_EQ(1.0 / result.Height(),
 | 
| +              result.track_adapter_settings().min_aspect_ratio);
 | 
| +    EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio);
 | 
| +    CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|    }
 | 
|  
 | 
|    {
 | 
|      const double kIdealAspectRatio = 2.0;
 | 
| +    const int kExactHeight = 400;
 | 
|      constraint_factory_.basic().aspectRatio.setIdeal(kIdealAspectRatio);
 | 
| -    constraint_factory_.basic().height.setExact(400);
 | 
| +    constraint_factory_.basic().height.setExact(kExactHeight);
 | 
|      auto result = SelectSettings();
 | 
|      EXPECT_TRUE(result.HasValue());
 | 
|      // The first device to support the ideal aspect ratio and the resolution
 | 
| @@ -1225,12 +1528,21 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, IdealAspectRatio) {
 | 
|      EXPECT_EQ(low_res_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(800, result.Width());
 | 
|      EXPECT_EQ(600, result.Height());
 | 
| +    EXPECT_EQ(kExactHeight, result.track_adapter_settings().max_height);
 | 
| +    EXPECT_EQ(kExactHeight * kIdealAspectRatio,
 | 
| +              result.track_adapter_settings().max_width);
 | 
| +    EXPECT_EQ(1.0 / kExactHeight,
 | 
| +              result.track_adapter_settings().min_aspect_ratio);
 | 
| +    EXPECT_EQ(static_cast<double>(result.Width()) / kExactHeight,
 | 
| +              result.track_adapter_settings().max_aspect_ratio);
 | 
| +    CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|    }
 | 
|  
 | 
|    {
 | 
|      const double kIdealAspectRatio = 3.0;
 | 
| +    const int kExactHeight = 400;
 | 
|      constraint_factory_.basic().aspectRatio.setIdeal(kIdealAspectRatio);
 | 
| -    constraint_factory_.basic().height.setExact(400);
 | 
| +    constraint_factory_.basic().height.setExact(kExactHeight);
 | 
|      auto result = SelectSettings();
 | 
|      EXPECT_TRUE(result.HasValue());
 | 
|      // The only device that supports the ideal aspect ratio and the resolution
 | 
| @@ -1239,6 +1551,14 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, IdealAspectRatio) {
 | 
|      EXPECT_EQ(high_res_device_->device_id, result.device_id());
 | 
|      EXPECT_EQ(1280, result.Width());
 | 
|      EXPECT_EQ(720, result.Height());
 | 
| +    EXPECT_EQ(kExactHeight, result.track_adapter_settings().max_height);
 | 
| +    EXPECT_EQ(kExactHeight * kIdealAspectRatio,
 | 
| +              result.track_adapter_settings().max_width);
 | 
| +    EXPECT_EQ(1.0 / kExactHeight,
 | 
| +              result.track_adapter_settings().min_aspect_ratio);
 | 
| +    EXPECT_EQ(static_cast<double>(result.Width()) / kExactHeight,
 | 
| +              result.track_adapter_settings().max_aspect_ratio);
 | 
| +    CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -1257,6 +1577,7 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
|    auto result = SelectSettings();
 | 
|    EXPECT_EQ(default_device_->device_id, result.device_id());
 | 
|    EXPECT_EQ(*default_closest_format_, result.Format());
 | 
| +  CheckTrackAdapterSettingsEqualsFormat(result);
 | 
|  
 | 
|    blink::WebMediaTrackConstraintSet& advanced2 =
 | 
|        constraint_factory_.AddAdvanced();
 | 
| @@ -1270,6 +1591,11 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
|    EXPECT_EQ(low_res_device_->device_id, result.device_id());
 | 
|    EXPECT_EQ(640, result.Width());
 | 
|    EXPECT_EQ(480, result.Height());
 | 
| +  EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(320.0 / 480.0, result.track_adapter_settings().min_aspect_ratio);
 | 
| +  EXPECT_EQ(640.0 / 240.0, result.track_adapter_settings().max_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|  
 | 
|    blink::WebMediaTrackConstraintSet& advanced3 =
 | 
|        constraint_factory_.AddAdvanced();
 | 
| @@ -1281,6 +1607,11 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
|    EXPECT_EQ(high_res_device_->device_id, result.device_id());
 | 
|    EXPECT_EQ(640, result.Width());
 | 
|    EXPECT_EQ(480, result.Height());
 | 
| +  EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(320.0 / 480.0, result.track_adapter_settings().min_aspect_ratio);
 | 
| +  EXPECT_EQ(640.0 / 240.0, result.track_adapter_settings().max_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result, 10.0);
 | 
|  
 | 
|    blink::WebMediaTrackConstraintSet& advanced4 =
 | 
|        constraint_factory_.AddAdvanced();
 | 
| @@ -1294,6 +1625,11 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
|    EXPECT_EQ(high_res_device_->device_id, result.device_id());
 | 
|    EXPECT_EQ(640, result.Width());
 | 
|    EXPECT_EQ(480, result.Height());
 | 
| +  EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(320.0 / 480.0, result.track_adapter_settings().min_aspect_ratio);
 | 
| +  EXPECT_EQ(640.0 / 240.0, result.track_adapter_settings().max_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result, 10.0);
 | 
|  
 | 
|    constraint_factory_.basic().width.setIdeal(100);
 | 
|    constraint_factory_.basic().height.setIdeal(100);
 | 
| @@ -1308,6 +1644,11 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
|    EXPECT_EQ(high_res_device_->device_id, result.device_id());
 | 
|    EXPECT_EQ(600, result.Width());
 | 
|    EXPECT_EQ(400, result.Height());
 | 
| +  EXPECT_EQ(320, result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(240, result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(320.0 / 400.0, result.track_adapter_settings().min_aspect_ratio);
 | 
| +  EXPECT_EQ(600.0 / 240.0, result.track_adapter_settings().max_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result, 10.0);
 | 
|  
 | 
|    constraint_factory_.basic().width.setIdeal(2000);
 | 
|    constraint_factory_.basic().height.setIdeal(1500);
 | 
| @@ -1318,6 +1659,11 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
|    EXPECT_EQ(high_res_device_->device_id, result.device_id());
 | 
|    EXPECT_EQ(640, result.Width());
 | 
|    EXPECT_EQ(480, result.Height());
 | 
| +  EXPECT_EQ(640, result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(480, result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(320.0 / 480.0, result.track_adapter_settings().min_aspect_ratio);
 | 
| +  EXPECT_EQ(640.0 / 240.0, result.track_adapter_settings().max_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result, 10.0);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
| @@ -1344,6 +1690,11 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
|    EXPECT_EQ(1920, result.Width());
 | 
|    EXPECT_EQ(1080, result.Height());
 | 
|    EXPECT_EQ(60.0, result.FrameRate());
 | 
| +  EXPECT_EQ(1920, result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(1080, result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(1920.0 / 1080.0, result.track_adapter_settings().min_aspect_ratio);
 | 
| +  EXPECT_EQ(1920.0 / 1080.0, result.track_adapter_settings().max_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result, 60.0);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, AdvancedNoiseReduction) {
 | 
| @@ -1363,6 +1714,13 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, AdvancedNoiseReduction) {
 | 
|    EXPECT_LE(1920, result.Width());
 | 
|    EXPECT_LE(1080, result.Height());
 | 
|    EXPECT_TRUE(result.noise_reduction() && !*result.noise_reduction());
 | 
| +  EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(1920.0 / result.Height(),
 | 
| +            result.track_adapter_settings().min_aspect_ratio);
 | 
| +  EXPECT_EQ(result.Width() / 1080.0,
 | 
| +            result.track_adapter_settings().max_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
| @@ -1388,6 +1746,13 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
|      EXPECT_LE(640, result.Width());
 | 
|      EXPECT_LE(480, result.Height());
 | 
|      EXPECT_TRUE(result.noise_reduction() && *result.noise_reduction());
 | 
| +    EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +    EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height);
 | 
| +    EXPECT_EQ(640.0 / result.Height(),
 | 
| +              result.track_adapter_settings().min_aspect_ratio);
 | 
| +    EXPECT_EQ(result.Width() / 480.0,
 | 
| +              result.track_adapter_settings().max_aspect_ratio);
 | 
| +    CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|    }
 | 
|  
 | 
|    // Same test without noise reduction
 | 
| @@ -1409,6 +1774,13 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
|      EXPECT_LE(1080, result.Height());
 | 
|      // Should select default noise reduction setting.
 | 
|      EXPECT_TRUE(!result.noise_reduction());
 | 
| +    EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +    EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height);
 | 
| +    EXPECT_EQ(1920.0 / result.Height(),
 | 
| +              result.track_adapter_settings().min_aspect_ratio);
 | 
| +    EXPECT_EQ(result.Width() / 1080.0,
 | 
| +              result.track_adapter_settings().max_aspect_ratio);
 | 
| +    CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -1431,6 +1803,11 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
|    EXPECT_EQ(low_res_device_->device_id, result.device_id());
 | 
|    EXPECT_EQ(640, result.Width());
 | 
|    EXPECT_EQ(480, result.Height());
 | 
| +  EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(640.0 / 480.0, result.track_adapter_settings().min_aspect_ratio);
 | 
| +  EXPECT_EQ(640.0 / 480.0, result.track_adapter_settings().max_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
| @@ -1455,6 +1832,12 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
|    EXPECT_EQ(200, result.Width());
 | 
|    EXPECT_EQ(200, result.Height());
 | 
|    EXPECT_EQ(40, result.FrameRate());
 | 
| +  EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(1.0 / result.Height(),
 | 
| +            result.track_adapter_settings().min_aspect_ratio);
 | 
| +  EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
| @@ -1479,6 +1862,13 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
|    EXPECT_EQ(1000, result.Width());
 | 
|    EXPECT_EQ(1000, result.Height());
 | 
|    EXPECT_EQ(20, result.FrameRate());
 | 
| +  EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(800.0 / result.Height(),
 | 
| +            result.track_adapter_settings().min_aspect_ratio);
 | 
| +  EXPECT_EQ(result.Width() / 600.0,
 | 
| +            result.track_adapter_settings().max_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
| @@ -1497,6 +1887,13 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
|    // requested aspect ratio.
 | 
|    EXPECT_EQ(high_res_device_->device_id, result.device_id());
 | 
|    EXPECT_EQ(*high_res_highest_format_, result.Format());
 | 
| +  // The track is cropped to support the exact aspect ratio.
 | 
| +  EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(std::round(result.Height() / 2300.0),
 | 
| +            result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(2300.0, result.track_adapter_settings().min_aspect_ratio);
 | 
| +  EXPECT_EQ(2300.0, result.track_adapter_settings().max_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
| @@ -1515,6 +1912,13 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
|    // requested aspect ratio.
 | 
|    EXPECT_EQ(high_res_device_->device_id, result.device_id());
 | 
|    EXPECT_EQ(*high_res_highest_format_, result.Format());
 | 
| +  // The track is cropped to support the min aspect ratio.
 | 
| +  EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +  EXPECT_EQ(std::round(result.Height() / 2300.0),
 | 
| +            result.track_adapter_settings().max_height);
 | 
| +  EXPECT_EQ(2300.0, result.track_adapter_settings().min_aspect_ratio);
 | 
| +  EXPECT_EQ(result.Width(), result.track_adapter_settings().max_aspect_ratio);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
| @@ -1531,6 +1935,8 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
|    // The second advanced set must be ignored because it contradicts the first
 | 
|    // set.
 | 
|    EXPECT_EQ(40.0, result.FrameRate());
 | 
| +  CheckTrackAdapterSettingsEqualsResolution(result);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
| @@ -1547,6 +1953,8 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
|    // The second advanced set must be ignored because it contradicts the first
 | 
|    // set.
 | 
|    EXPECT_LE(40.0, result.FrameRate());
 | 
| +  CheckTrackAdapterSettingsEqualsResolution(result);
 | 
| +  CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
| @@ -1570,6 +1978,7 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
|    EXPECT_EQ(low_res_device_->device_id, result.device_id());
 | 
|    EXPECT_EQ(30.0, result.FrameRate());
 | 
|    EXPECT_GE(1920, result.Width());
 | 
| +  CheckTrackAdapterSettingsEqualsFormat(result);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
| @@ -1594,6 +2003,7 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
|    EXPECT_EQ(high_res_device_->device_id, result.device_id());
 | 
|    EXPECT_EQ(60.0, result.FrameRate());
 | 
|    EXPECT_GE(1080, result.Height());
 | 
| +  CheckTrackAdapterSettingsEqualsFormat(result);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, AdvancedDeviceID) {
 | 
| @@ -1615,6 +2025,7 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, AdvancedDeviceID) {
 | 
|    // kDeviceID2 must be selected because it is the only one that satisfies both
 | 
|    // advanced sets.
 | 
|    EXPECT_EQ(std::string(kDeviceID2), result.device_id());
 | 
| +  CheckTrackAdapterSettingsEqualsFormat(result);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
| @@ -1637,6 +2048,7 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
|    // The second advanced set must be ignored because it contradicts the first
 | 
|    // set.
 | 
|    EXPECT_EQ(std::string(kDeviceID1), result.device_id());
 | 
| +  CheckTrackAdapterSettingsEqualsFormat(result);
 | 
|  }
 | 
|  
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
| @@ -1662,6 +2074,13 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
|      EXPECT_LE(640, result.Width());
 | 
|      EXPECT_LE(480, result.Height());
 | 
|      EXPECT_EQ(50, static_cast<int>(result.PowerLineFrequency()));
 | 
| +    EXPECT_EQ(result.Width(), result.track_adapter_settings().max_width);
 | 
| +    EXPECT_EQ(result.Height(), result.track_adapter_settings().max_height);
 | 
| +    EXPECT_EQ(640.0 / result.Height(),
 | 
| +              result.track_adapter_settings().min_aspect_ratio);
 | 
| +    EXPECT_EQ(result.Width() / 480.0,
 | 
| +              result.track_adapter_settings().max_aspect_ratio);
 | 
| +    CheckTrackAdapterSettingsEqualsFrameRate(result);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -1670,7 +2089,7 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest,
 | 
|  TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, NoDevicesNoConstraints) {
 | 
|    constraint_factory_.Reset();
 | 
|    VideoDeviceCaptureCapabilities capabilities;
 | 
| -  auto result = SelectVideoDeviceCaptureSourceSettings(
 | 
| +  auto result = SelectSettingsVideoDeviceCapture(
 | 
|        capabilities, constraint_factory_.CreateWebMediaConstraints());
 | 
|    EXPECT_FALSE(result.HasValue());
 | 
|    EXPECT_TRUE(std::string(result.failed_constraint_name()).empty());
 | 
| @@ -1680,7 +2099,7 @@ TEST_F(MediaStreamConstraintsUtilVideoDeviceTest, NoDevicesWithConstraints) {
 | 
|    constraint_factory_.Reset();
 | 
|    constraint_factory_.basic().height.setExact(100);
 | 
|    VideoDeviceCaptureCapabilities capabilities;
 | 
| -  auto result = SelectVideoDeviceCaptureSourceSettings(
 | 
| +  auto result = SelectSettingsVideoDeviceCapture(
 | 
|        capabilities, constraint_factory_.CreateWebMediaConstraints());
 | 
|    EXPECT_FALSE(result.HasValue());
 | 
|    EXPECT_TRUE(std::string(result.failed_constraint_name()).empty());
 | 
| 
 |