/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include "VideoUtils.h" using namespace mozilla; struct TestData { const char16_t* const mCodecParameterString; const bool mExpectedValue; const char* const mComment; }; TEST(ExtractVPXCodecDetails, TestInputData) { TestData tests[] = { // ..... // ... // // Format checks {u"vp09.0.10.8", true, "Valid minimum length"}, {u"vp9.00.10.08", false, "Invalid 4CC"}, {u"vp09.00..08", false, "Blank field"}, {u"vp09", false, "0 of 3 required fields"}, {u"vp09.00", false, "1 of 3 required fields"}, {u"vp09.00.10", false, "2 of 3 required fields"}, // Profiles {u"vp09.00.10.08", true, "Profile 0"}, {u"vp09.01.10.08", true, "Profile 1"}, {u"vp09.02.10.10", true, "Profile 2"}, {u"vp09.03.10.10", true, "Profile 3"}, {u"vp09.-1.10.08", false, "Invalid profile < 0"}, {u"vp09.04.10.08", false, "Invalid profile > 3"}, // Levels {u"vp09.00.11.08", true, "Level 1.1"}, {u"vp09.00.12.08", false, "Invalid level 1.2"}, {u"vp09.00.52.08", true, "Level 5.2"}, {u"vp09.00.64.08", false, "Level greater than max"}, // Bit depths // - 8-bit tested in Profiles section // - 10-bit tested in Profiles section {u"vp09.02.10.12", true, "12-bit"}, {u"vp09.00.10.07", false, "Invalid, 7-bit"}, {u"vp09.02.10.11", false, "Invalid, 11-bit"}, {u"vp09.02.10.13", false, "Invalid, 13-bit"}, // Chroma subsampling {u"vp09.00.10.08.00", true, "4:2:0 vertical"}, {u"vp09.00.10.08.01", true, "4:2:0 colocated"}, {u"vp09.00.10.08.02", true, "4:2:2"}, {u"vp09.00.10.08.03", true, "4:4:4"}, {u"vp09.00.10.08.04", false, "Invalid chroma"}, // Color primaries {u"vp09.00.10.08.01.00", false, "CP 0: Reserved"}, {u"vp09.00.10.08.01.01", true, "CP 1: BT.709"}, {u"vp09.00.10.08.01.03", false, "CP 3: Reserved"}, {u"vp09.00.10.08.01.09", true, "CP 9: BT.2020"}, {u"vp09.00.10.08.01.21", false, "CP 21: Reserved"}, {u"vp09.00.10.08.01.22", true, "CP 22: EBU Tech 3213"}, {u"vp09.00.10.08.01.23", false, "CP 23: Out of range"}, // Transfer characteristics {u"vp09.00.10.08.01.01.00", false, "TC 0: Reserved"}, {u"vp09.00.10.08.01.01.01", true, "TC 1: BT.709"}, {u"vp09.00.10.08.01.01.03", false, "TC 3: Reserved"}, {u"vp09.00.10.08.01.09.16", true, "TC 16: ST 2084"}, {u"vp09.00.10.08.01.09.19", false, "TC 19: Out of range"}, // Matrix coefficients {u"vp09.00.10.08.03.09.16.00", true, "MC 0: Identity"}, {u"vp09.00.10.08.01.09.16.00", false, "MC 0: Identity without 4:4:4"}, {u"vp09.00.10.08.01.09.16.01", true, "MC 1: BT.709"}, {u"vp09.00.10.08.01.09.16.03", false, "MC 3: Reserved"}, {u"vp09.00.10.08.01.09.16.09", true, "MC 9: BT.2020"}, {u"vp09.00.10.08.01.09.16.15", false, "MC 15: Out of range"}, // Color range {u"vp09.00.10.08.01.09.16.09.00", true, "Limited range"}, {u"vp09.00.10.08.01.09.16.09.01", true, "Full range"}, {u"vp09.00.10.08.01.09.16.09.02", false, "Invalid range value"}, {u"vp09.00.10.08.01.09.16.09.00.", false, "Extra ."}, {u"vp09.00.10.08.01.09.16.09.00.00", false, "More than 9 fields"}, }; for (const auto& data : tests) { uint8_t profile = 0; uint8_t level = 0; uint8_t bitDepth = 0; bool result = ExtractVPXCodecDetails(nsString(data.mCodecParameterString), profile, level, bitDepth); EXPECT_EQ(result, data.mExpectedValue) << NS_ConvertUTF16toUTF8(data.mCodecParameterString).get() << " (" << data.mComment << ")"; } } TEST(ExtractVPXCodecDetails, TestParsingOutput) { uint8_t profile = 0; uint8_t level = 0; uint8_t bitDepth = 0; uint8_t chromaSubsampling = 0; VideoColorSpace colorSpace; auto data = u"vp09.01.11.08"; bool result = ExtractVPXCodecDetails(nsString(data), profile, level, bitDepth, chromaSubsampling, colorSpace); EXPECT_EQ(result, true); EXPECT_EQ(profile, 1); EXPECT_EQ(level, 11); EXPECT_EQ(bitDepth, 8); // Should keep spec defined default value. EXPECT_EQ(chromaSubsampling, 1); EXPECT_EQ(colorSpace.mPrimaries, gfx::CICP::CP_BT709); EXPECT_EQ(colorSpace.mTransfer, gfx::CICP::TC_BT709); EXPECT_EQ(colorSpace.mMatrix, gfx::CICP::MC_BT709); EXPECT_EQ(colorSpace.mRange, gfx::ColorRange::LIMITED); data = u"vp09.02.10.10.01.09.16.09.01"; result = ExtractVPXCodecDetails(nsString(data), profile, level, bitDepth, chromaSubsampling, colorSpace); EXPECT_EQ(result, true); EXPECT_EQ(profile, 2); EXPECT_EQ(level, 10); EXPECT_EQ(bitDepth, 10); EXPECT_EQ(chromaSubsampling, 1); EXPECT_EQ(colorSpace.mPrimaries, gfx::CICP::CP_BT2020); EXPECT_EQ(colorSpace.mTransfer, gfx::CICP::TC_SMPTE2084); EXPECT_EQ(colorSpace.mMatrix, gfx::CICP::MC_BT2020_NCL); EXPECT_EQ(colorSpace.mRange, gfx::ColorRange::FULL); }