TestExtractVPXCodecDetails.cpp (5498B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #include <gtest/gtest.h> 7 #include <stdint.h> 8 9 #include "VideoUtils.h" 10 11 using namespace mozilla; 12 13 struct TestData { 14 const char16_t* const mCodecParameterString; 15 const bool mExpectedValue; 16 const char* const mComment; 17 }; 18 19 TEST(ExtractVPXCodecDetails, TestInputData) 20 { 21 TestData tests[] = { 22 // <sample entry 4CC>.<profile>.<level>.<bitDepth>.<chromaSubsampling>. 23 // <colourPrimaries>.<transferCharacteristics>.<matrixCoefficients>. 24 // <videoFullRangeFlag> 25 26 // Format checks 27 {u"vp09.0.10.8", true, "Valid minimum length"}, 28 {u"vp9.00.10.08", false, "Invalid 4CC"}, 29 {u"vp09.00..08", false, "Blank field"}, 30 {u"vp09", false, "0 of 3 required fields"}, 31 {u"vp09.00", false, "1 of 3 required fields"}, 32 {u"vp09.00.10", false, "2 of 3 required fields"}, 33 34 // Profiles 35 {u"vp09.00.10.08", true, "Profile 0"}, 36 {u"vp09.01.10.08", true, "Profile 1"}, 37 {u"vp09.02.10.10", true, "Profile 2"}, 38 {u"vp09.03.10.10", true, "Profile 3"}, 39 {u"vp09.-1.10.08", false, "Invalid profile < 0"}, 40 {u"vp09.04.10.08", false, "Invalid profile > 3"}, 41 42 // Levels 43 {u"vp09.00.11.08", true, "Level 1.1"}, 44 {u"vp09.00.12.08", false, "Invalid level 1.2"}, 45 {u"vp09.00.52.08", true, "Level 5.2"}, 46 {u"vp09.00.64.08", false, "Level greater than max"}, 47 48 // Bit depths 49 // - 8-bit tested in Profiles section 50 // - 10-bit tested in Profiles section 51 {u"vp09.02.10.12", true, "12-bit"}, 52 {u"vp09.00.10.07", false, "Invalid, 7-bit"}, 53 {u"vp09.02.10.11", false, "Invalid, 11-bit"}, 54 {u"vp09.02.10.13", false, "Invalid, 13-bit"}, 55 56 // Chroma subsampling 57 {u"vp09.00.10.08.00", true, "4:2:0 vertical"}, 58 {u"vp09.00.10.08.01", true, "4:2:0 colocated"}, 59 {u"vp09.00.10.08.02", true, "4:2:2"}, 60 {u"vp09.00.10.08.03", true, "4:4:4"}, 61 {u"vp09.00.10.08.04", false, "Invalid chroma"}, 62 63 // Color primaries 64 {u"vp09.00.10.08.01.00", false, "CP 0: Reserved"}, 65 {u"vp09.00.10.08.01.01", true, "CP 1: BT.709"}, 66 {u"vp09.00.10.08.01.03", false, "CP 3: Reserved"}, 67 {u"vp09.00.10.08.01.09", true, "CP 9: BT.2020"}, 68 {u"vp09.00.10.08.01.21", false, "CP 21: Reserved"}, 69 {u"vp09.00.10.08.01.22", true, "CP 22: EBU Tech 3213"}, 70 {u"vp09.00.10.08.01.23", false, "CP 23: Out of range"}, 71 72 // Transfer characteristics 73 {u"vp09.00.10.08.01.01.00", false, "TC 0: Reserved"}, 74 {u"vp09.00.10.08.01.01.01", true, "TC 1: BT.709"}, 75 {u"vp09.00.10.08.01.01.03", false, "TC 3: Reserved"}, 76 {u"vp09.00.10.08.01.09.16", true, "TC 16: ST 2084"}, 77 {u"vp09.00.10.08.01.09.19", false, "TC 19: Out of range"}, 78 79 // Matrix coefficients 80 {u"vp09.00.10.08.03.09.16.00", true, "MC 0: Identity"}, 81 {u"vp09.00.10.08.01.09.16.00", false, "MC 0: Identity without 4:4:4"}, 82 {u"vp09.00.10.08.01.09.16.01", true, "MC 1: BT.709"}, 83 {u"vp09.00.10.08.01.09.16.03", false, "MC 3: Reserved"}, 84 {u"vp09.00.10.08.01.09.16.09", true, "MC 9: BT.2020"}, 85 {u"vp09.00.10.08.01.09.16.15", false, "MC 15: Out of range"}, 86 87 // Color range 88 {u"vp09.00.10.08.01.09.16.09.00", true, "Limited range"}, 89 {u"vp09.00.10.08.01.09.16.09.01", true, "Full range"}, 90 {u"vp09.00.10.08.01.09.16.09.02", false, "Invalid range value"}, 91 92 {u"vp09.00.10.08.01.09.16.09.00.", false, "Extra ."}, 93 {u"vp09.00.10.08.01.09.16.09.00.00", false, "More than 9 fields"}, 94 }; 95 96 for (const auto& data : tests) { 97 uint8_t profile = 0; 98 uint8_t level = 0; 99 uint8_t bitDepth = 0; 100 bool result = ExtractVPXCodecDetails(nsString(data.mCodecParameterString), 101 profile, level, bitDepth); 102 EXPECT_EQ(result, data.mExpectedValue) 103 << NS_ConvertUTF16toUTF8(data.mCodecParameterString).get() << " (" 104 << data.mComment << ")"; 105 } 106 } 107 108 TEST(ExtractVPXCodecDetails, TestParsingOutput) 109 { 110 uint8_t profile = 0; 111 uint8_t level = 0; 112 uint8_t bitDepth = 0; 113 uint8_t chromaSubsampling = 0; 114 VideoColorSpace colorSpace; 115 auto data = u"vp09.01.11.08"; 116 bool result = ExtractVPXCodecDetails(nsString(data), profile, level, bitDepth, 117 chromaSubsampling, colorSpace); 118 EXPECT_EQ(result, true); 119 EXPECT_EQ(profile, 1); 120 EXPECT_EQ(level, 11); 121 EXPECT_EQ(bitDepth, 8); 122 // Should keep spec defined default value. 123 EXPECT_EQ(chromaSubsampling, 1); 124 EXPECT_EQ(colorSpace.mPrimaries, gfx::CICP::CP_BT709); 125 EXPECT_EQ(colorSpace.mTransfer, gfx::CICP::TC_BT709); 126 EXPECT_EQ(colorSpace.mMatrix, gfx::CICP::MC_BT709); 127 EXPECT_EQ(colorSpace.mRange, gfx::ColorRange::LIMITED); 128 129 data = u"vp09.02.10.10.01.09.16.09.01"; 130 result = ExtractVPXCodecDetails(nsString(data), profile, level, bitDepth, 131 chromaSubsampling, colorSpace); 132 EXPECT_EQ(result, true); 133 EXPECT_EQ(profile, 2); 134 EXPECT_EQ(level, 10); 135 EXPECT_EQ(bitDepth, 10); 136 EXPECT_EQ(chromaSubsampling, 1); 137 EXPECT_EQ(colorSpace.mPrimaries, gfx::CICP::CP_BT2020); 138 EXPECT_EQ(colorSpace.mTransfer, gfx::CICP::TC_SMPTE2084); 139 EXPECT_EQ(colorSpace.mMatrix, gfx::CICP::MC_BT2020_NCL); 140 EXPECT_EQ(colorSpace.mRange, gfx::ColorRange::FULL); 141 }