summaryrefslogtreecommitdiffstats
path: root/dom/media/mediasource/gtest/TestExtractVPXCodecDetails.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/mediasource/gtest/TestExtractVPXCodecDetails.cpp')
-rw-r--r--dom/media/mediasource/gtest/TestExtractVPXCodecDetails.cpp141
1 files changed, 141 insertions, 0 deletions
diff --git a/dom/media/mediasource/gtest/TestExtractVPXCodecDetails.cpp b/dom/media/mediasource/gtest/TestExtractVPXCodecDetails.cpp
new file mode 100644
index 0000000000..7e255e2dc7
--- /dev/null
+++ b/dom/media/mediasource/gtest/TestExtractVPXCodecDetails.cpp
@@ -0,0 +1,141 @@
+/* -*- 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 <gtest/gtest.h>
+#include <stdint.h>
+
+#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[] = {
+ // <sample entry 4CC>.<profile>.<level>.<bitDepth>.<chromaSubsampling>.
+ // <colourPrimaries>.<transferCharacteristics>.<matrixCoefficients>.
+ // <videoFullRangeFlag>
+
+ // 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);
+}