summaryrefslogtreecommitdiff
path: root/dom/media/mediasource/gtest/TestExtractVPXCodecDetails.cpp
blob: be8a120f61aa53b8943018c1400d46a563843276 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/* -*- 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;
};

TEST(ExtractVPXCodecDetails, TestDataLength) {
  TestData tests[] =
  {
    {u"vp09.00.11.08", true }, // valid case
    {u"vp09.00.11.08.00", true }, // valid case, have extra optional field
    {u"vp09.02.10.10.01.09.16.09.01", true}, // maximum length valid case
    {u"vp09", false }, // lack of mandatory fields
    {u"vp09.00", false }, // lack of mandatory fields
    {u"vp09.00.11", false }, // lack of mandatory fields
    {u"vp09.02.10.10.01.09.16.09.01.00", false} // more than 9 fields, invalid case.
  };

  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();
  }
}

TEST(ExtractVPXCodecDetails, TestInputData) {
  TestData tests[] =
  {
    {u"vp09.02..08", false}, // malformed
    {u"vp9.02.10.08", false}, // invalid 4CC
    {u"vp09.03.11.08", false }, // profile should < 3
    {u"vp09.00.63.08.00", false }, // invalid level
    {u"vp09.02.10.13", false}, // invalid bitDepth
    {u"vp09.02.10.10.04", false}, // invalid chromasubsampling, should < 4
    {u"vp09.02.10.10.01.00", false}, // invalid Colour primaries, should not be 0,3 or < 23.
    {u"vp09.02.10.10.01.03", false}, // invalid Colour primaries.
    {u"vp09.02.10.10.01.23", false}, // invalid Colour primaries.
    {u"vp09.02.10.10.01.09.00", false}, // invalid Transfer characteristics, should not be 0,3 or < 19.
    {u"vp09.02.10.10.01.09.03", false}, // invalid Transfer characteristics.
    {u"vp09.02.10.10.01.09.19", false}, // invalid Transfer characteristics.
    {u"vp09.02.10.10.01.09.16.12", false}, // invalid Matrix coefficients, should not be 3 or < 12.
    {u"vp09.02.10.10.01.09.16.03", false}, // invalid matrix.
    {u"vp09.02.10.10.01.09.16.09.02", false}, // invalid range, should < 2.
    // Test if matrixCoefficients is 0 (RGB), then chroma subsampling MUST be 3 (4:4:4).
    {u"vp09.02.10.08.03.09.16.00.00", true} // invalid combination.
  };

  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();
  }
}

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.mPrimaryId, 1);
    EXPECT_EQ(colorSpace.mTransferId, 1);
    EXPECT_EQ(colorSpace.mMatrixId, 1);
    EXPECT_EQ(colorSpace.mRangeId, 0);

    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.mPrimaryId, 9);
    EXPECT_EQ(colorSpace.mTransferId, 16);
    EXPECT_EQ(colorSpace.mMatrixId, 9);
    EXPECT_EQ(colorSpace.mRangeId, 1);
}