tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }