Coverage Report

Created: 2018-09-25 14:53

/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
}