Commit e917df9e authored by Ted Meyer's avatar Ted Meyer Committed by Commit Bot

Follow spec on generating video natural size

Basically we always scale up, rather than scale width, which is what the
spec was changed to require about a year ago.

BUG=606039

Change-Id: Iebfed41771a5b11bad6daf3655de750cce4c6cf8
Reviewed-on: https://chromium-review.googlesource.com/813201Reviewed-by: default avatarXiaohan Wang <xhwang@chromium.org>
Reviewed-by: default avatarMounir Lamouri <mlamouri@chromium.org>
Commit-Queue: Ted Meyer <tmathmeyer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#523683}
parent 07e9c645
...@@ -70,11 +70,13 @@ TEST(VideoDecoderConfigTest, Invalid_AspectRatioNumeratorTooLarge) { ...@@ -70,11 +70,13 @@ TEST(VideoDecoderConfigTest, Invalid_AspectRatioNumeratorTooLarge) {
EXPECT_FALSE(config.IsValidConfig()); EXPECT_FALSE(config.IsValidConfig());
} }
TEST(VideoDecoderConfigTest, Invalid_AspectRatioDenominatorTooLarge) { TEST(VideoDecoderConfigTest, Invalid_AspectRatioDenominatorVeryLarge) {
// Denominator is large enough that the natural size height will be zero. // This test makes sure that highly skewed pixel ratios arent counted as valid
// configurations.
int den = 2 * kVisibleRect.size().width() + 1; int den = 2 * kVisibleRect.size().width() + 1;
gfx::Size natural_size = GetNaturalSize(kVisibleRect.size(), 1, den); gfx::Size natural_size = GetNaturalSize(kVisibleRect.size(), 1, den);
EXPECT_EQ(0, natural_size.width()); EXPECT_EQ(320, natural_size.width());
EXPECT_EQ(240 * 641, natural_size.height());
VideoDecoderConfig config(kCodecVP8, VP8PROFILE_ANY, kVideoFormat, VideoDecoderConfig config(kCodecVP8, VP8PROFILE_ANY, kVideoFormat,
COLOR_SPACE_UNSPECIFIED, VIDEO_ROTATION_0, COLOR_SPACE_UNSPECIFIED, VIDEO_ROTATION_0,
kCodedSize, kVisibleRect, natural_size, kCodedSize, kVisibleRect, natural_size,
......
...@@ -54,16 +54,23 @@ void FillRegionOutsideVisibleRect(uint8_t* data, ...@@ -54,16 +54,23 @@ void FillRegionOutsideVisibleRect(uint8_t* data,
gfx::Size GetNaturalSize(const gfx::Size& visible_size, gfx::Size GetNaturalSize(const gfx::Size& visible_size,
int aspect_ratio_numerator, int aspect_ratio_numerator,
int aspect_ratio_denominator) { int aspect_ratio_denominator) {
if (aspect_ratio_denominator == 0 || if (aspect_ratio_denominator <= 0 || aspect_ratio_numerator <= 0) {
aspect_ratio_numerator < 0 ||
aspect_ratio_denominator < 0)
return gfx::Size(); return gfx::Size();
}
double aspect_ratio = aspect_ratio_numerator / double aspect_ratio = aspect_ratio_numerator /
static_cast<double>(aspect_ratio_denominator); static_cast<double>(aspect_ratio_denominator);
return gfx::Size(round(visible_size.width() * aspect_ratio), // The HTML spec requires that we always grow a dimension to match aspect
visible_size.height()); // ratio, rather than modify just the width:
// github.com/whatwg/html/commit/2e94aa64fcf9adbd2f70d8c2aecd192c8678e298
if (aspect_ratio_numerator > aspect_ratio_denominator) {
return gfx::Size(round(visible_size.width() * aspect_ratio),
visible_size.height());
}
return gfx::Size(visible_size.width(),
round(visible_size.height() / aspect_ratio));
} }
void FillYUV(VideoFrame* frame, uint8_t y, uint8_t u, uint8_t v) { void FillYUV(VideoFrame* frame, uint8_t y, uint8_t u, uint8_t v) {
......
...@@ -200,23 +200,23 @@ TEST_F(VideoUtilTest, GetNaturalSize) { ...@@ -200,23 +200,23 @@ TEST_F(VideoUtilTest, GetNaturalSize) {
// Test abnormal ratios. // Test abnormal ratios.
EXPECT_EQ(gfx::Size(0, 0), GetNaturalSize(visible_size, 0, 0)); EXPECT_EQ(gfx::Size(0, 0), GetNaturalSize(visible_size, 0, 0));
EXPECT_EQ(gfx::Size(0, 0), GetNaturalSize(visible_size, 0, 1));
EXPECT_EQ(gfx::Size(0, 0), GetNaturalSize(visible_size, 1, 0)); EXPECT_EQ(gfx::Size(0, 0), GetNaturalSize(visible_size, 1, 0));
EXPECT_EQ(gfx::Size(0, 0), GetNaturalSize(visible_size, 1, -1)); EXPECT_EQ(gfx::Size(0, 0), GetNaturalSize(visible_size, 1, -1));
EXPECT_EQ(gfx::Size(0, 0), GetNaturalSize(visible_size, -1, 1)); EXPECT_EQ(gfx::Size(0, 0), GetNaturalSize(visible_size, -1, 1));
// Test normal sizes and ratios. // Test normal sizes and ratios.
EXPECT_EQ(gfx::Size(0, 240), GetNaturalSize(visible_size, 0, 1));
EXPECT_EQ(gfx::Size(320, 240), GetNaturalSize(visible_size, 1, 1)); EXPECT_EQ(gfx::Size(320, 240), GetNaturalSize(visible_size, 1, 1));
EXPECT_EQ(gfx::Size(640, 240), GetNaturalSize(visible_size, 2, 1)); EXPECT_EQ(gfx::Size(640, 240), GetNaturalSize(visible_size, 2, 1));
EXPECT_EQ(gfx::Size(160, 240), GetNaturalSize(visible_size, 1, 2)); EXPECT_EQ(gfx::Size(320, 480), GetNaturalSize(visible_size, 1, 2));
EXPECT_EQ(gfx::Size(427, 240), GetNaturalSize(visible_size, 4, 3)); EXPECT_EQ(gfx::Size(427, 240), GetNaturalSize(visible_size, 4, 3));
EXPECT_EQ(gfx::Size(240, 240), GetNaturalSize(visible_size, 3, 4)); EXPECT_EQ(gfx::Size(320, 320), GetNaturalSize(visible_size, 3, 4));
EXPECT_EQ(gfx::Size(569, 240), GetNaturalSize(visible_size, 16, 9)); EXPECT_EQ(gfx::Size(569, 240), GetNaturalSize(visible_size, 16, 9));
EXPECT_EQ(gfx::Size(180, 240), GetNaturalSize(visible_size, 9, 16)); EXPECT_EQ(gfx::Size(320, 427), GetNaturalSize(visible_size, 9, 16));
// Test some random ratios. // Test some random ratios.
EXPECT_EQ(gfx::Size(495, 240), GetNaturalSize(visible_size, 17, 11)); EXPECT_EQ(gfx::Size(495, 240), GetNaturalSize(visible_size, 17, 11));
EXPECT_EQ(gfx::Size(207, 240), GetNaturalSize(visible_size, 11, 17)); EXPECT_EQ(gfx::Size(320, 371), GetNaturalSize(visible_size, 11, 17));
} }
namespace { namespace {
......
<!DOCTYPE html>
<title>Test video dimension aspect ratio.</title>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="media-file.js"></script>
<video></video>
<script>
async_test(function(t) {
var video = document.querySelector("video");
assert_equals(video.videoWidth, 0);
assert_equals(video.videoHeight, 0);
video.onloadedmetadata = t.step_func_done(function() {
assert_equals(video.videoWidth, 320);
assert_equals(video.videoHeight, 449);
});
assert_equals(video.canPlayType("video/webm"), "maybe")
// Note: can't use findMediaFile because it prioritizes ogv over webm.
// ogv files do not seem to support pixel aspect ratios, where as webms do.
video.src = "content/test-par-5-7.webm";
});
</script>
...@@ -17,4 +17,4 @@ async_test(function(t) { ...@@ -17,4 +17,4 @@ async_test(function(t) {
video.src = findMediaFile("video", "content/test-par-16-9"); video.src = findMediaFile("video", "content/test-par-16-9");
}); });
</script> </script>
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment