/src/mozilla-central/dom/media/mediasource/gtest/TestExtractVPXCodecDetails.cpp
Line | Count | Source (jump to first uncovered line) |
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 | | { |
15 | | const char16_t* const mCodecParameterString; |
16 | | const bool mExpectedValue; |
17 | | }; |
18 | | |
19 | 0 | TEST(ExtractVPXCodecDetails, TestDataLength) { |
20 | 0 | TestData tests[] = |
21 | 0 | { |
22 | 0 | {u"vp09.00.11.08", true }, // valid case |
23 | 0 | {u"vp09.00.11.08.00", true }, // valid case, have extra optional field |
24 | 0 | {u"vp09.02.10.10.01.09.16.09.01", true}, // maximum length valid case |
25 | 0 | {u"vp09", false }, // lack of mandatory fields |
26 | 0 | {u"vp09.00", false }, // lack of mandatory fields |
27 | 0 | {u"vp09.00.11", false }, // lack of mandatory fields |
28 | 0 | {u"vp09.02.10.10.01.09.16.09.01.00", false} // more than 9 fields, invalid case. |
29 | 0 | }; |
30 | 0 |
|
31 | 0 | for (const auto& data : tests) { |
32 | 0 | uint8_t profile = 0; |
33 | 0 | uint8_t level = 0; |
34 | 0 | uint8_t bitDepth = 0; |
35 | 0 | bool result = ExtractVPXCodecDetails(nsString(data.mCodecParameterString), profile, level, bitDepth); |
36 | 0 | EXPECT_EQ(result, data.mExpectedValue) << NS_ConvertUTF16toUTF8(data.mCodecParameterString).get(); |
37 | 0 | } |
38 | 0 | } |
39 | | |
40 | 0 | TEST(ExtractVPXCodecDetails, TestInputData) { |
41 | 0 | TestData tests[] = |
42 | 0 | { |
43 | 0 | {u"vp09.02..08", false}, // malformed |
44 | 0 | {u"vp9.02.10.08", false}, // invalid 4CC |
45 | 0 | {u"vp09.03.11.08", false }, // profile should < 3 |
46 | 0 | {u"vp09.00.63.08.00", false }, // invalid level |
47 | 0 | {u"vp09.02.10.13", false}, // invalid bitDepth |
48 | 0 | {u"vp09.02.10.10.04", false}, // invalid chromasubsampling, should < 4 |
49 | 0 | {u"vp09.02.10.10.01.00", false}, // invalid Colour primaries, should not be 0,3 or < 23. |
50 | 0 | {u"vp09.02.10.10.01.03", false}, // invalid Colour primaries. |
51 | 0 | {u"vp09.02.10.10.01.23", false}, // invalid Colour primaries. |
52 | 0 | {u"vp09.02.10.10.01.09.00", false}, // invalid Transfer characteristics, should not be 0,3 or < 19. |
53 | 0 | {u"vp09.02.10.10.01.09.03", false}, // invalid Transfer characteristics. |
54 | 0 | {u"vp09.02.10.10.01.09.19", false}, // invalid Transfer characteristics. |
55 | 0 | {u"vp09.02.10.10.01.09.16.12", false}, // invalid Matrix coefficients, should not be 3 or < 12. |
56 | 0 | {u"vp09.02.10.10.01.09.16.03", false}, // invalid matrix. |
57 | 0 | {u"vp09.02.10.10.01.09.16.09.02", false}, // invalid range, should < 2. |
58 | 0 | // Test if matrixCoefficients is 0 (RGB), then chroma subsampling MUST be 3 (4:4:4). |
59 | 0 | {u"vp09.02.10.08.03.09.16.00.00", true} // invalid combination. |
60 | 0 | }; |
61 | 0 |
|
62 | 0 | for (const auto& data : tests) { |
63 | 0 | uint8_t profile = 0; |
64 | 0 | uint8_t level = 0; |
65 | 0 | uint8_t bitDepth = 0; |
66 | 0 | bool result = ExtractVPXCodecDetails(nsString(data.mCodecParameterString), profile, level, bitDepth); |
67 | 0 | EXPECT_EQ(result, data.mExpectedValue) << NS_ConvertUTF16toUTF8(data.mCodecParameterString).get(); |
68 | 0 | } |
69 | 0 | } |
70 | | |
71 | 0 | TEST(ExtractVPXCodecDetails, TestParsingOutput) { |
72 | 0 | uint8_t profile = 0; |
73 | 0 | uint8_t level = 0; |
74 | 0 | uint8_t bitDepth = 0; |
75 | 0 | uint8_t chromaSubsampling = 0; |
76 | 0 | VideoColorSpace colorSpace; |
77 | 0 | auto data = u"vp09.01.11.08"; |
78 | 0 | bool result = ExtractVPXCodecDetails(nsString(data), |
79 | 0 | profile, |
80 | 0 | level, |
81 | 0 | bitDepth, |
82 | 0 | chromaSubsampling, |
83 | 0 | colorSpace); |
84 | 0 | EXPECT_EQ(result, true); |
85 | 0 | EXPECT_EQ(profile, 1); |
86 | 0 | EXPECT_EQ(level, 11); |
87 | 0 | EXPECT_EQ(bitDepth, 8); |
88 | 0 | // Should keep spec defined default value. |
89 | 0 | EXPECT_EQ(chromaSubsampling, 1); |
90 | 0 | EXPECT_EQ(colorSpace.mPrimaryId, 1); |
91 | 0 | EXPECT_EQ(colorSpace.mTransferId, 1); |
92 | 0 | EXPECT_EQ(colorSpace.mMatrixId, 1); |
93 | 0 | EXPECT_EQ(colorSpace.mRangeId, 0); |
94 | 0 |
|
95 | 0 | data = u"vp09.02.10.10.01.09.16.09.01"; |
96 | 0 | result = ExtractVPXCodecDetails(nsString(data), |
97 | 0 | profile, |
98 | 0 | level, |
99 | 0 | bitDepth, |
100 | 0 | chromaSubsampling, |
101 | 0 | colorSpace); |
102 | 0 | EXPECT_EQ(result, true); |
103 | 0 | EXPECT_EQ(profile, 2); |
104 | 0 | EXPECT_EQ(level, 10); |
105 | 0 | EXPECT_EQ(bitDepth, 10); |
106 | 0 | EXPECT_EQ(chromaSubsampling, 1); |
107 | 0 | EXPECT_EQ(colorSpace.mPrimaryId, 9); |
108 | 0 | EXPECT_EQ(colorSpace.mTransferId, 16); |
109 | 0 | EXPECT_EQ(colorSpace.mMatrixId, 9); |
110 | 0 | EXPECT_EQ(colorSpace.mRangeId, 1); |
111 | 0 | } |