Title: [264367] trunk
Revision
264367
Author
jer.no...@apple.com
Date
2020-07-14 12:18:39 -0700 (Tue, 14 Jul 2020)

Log Message

Add support for parsing VP-style codec strings.
https://bugs.webkit.org/show_bug.cgi?id=214270
Source/WebCore:

Reviewed by Eric Carlson.

Test: media/vp-codec-parameters.html

* Sources.txt:
* WebCore.xcodeproj/project.pbxproj:
* platform/graphics/VP9Utilities.cpp: Added.
(WebCore::validVPLevels):
(WebCore::validColorPrimaries):
(WebCore::parseVPCodecParameters):
* platform/graphics/VP9Utilities.h: Added.
* testing/Internals.cpp:
(WebCore::Internals::parseVPCodecParameters):
* testing/Internals.h:
* testing/Internals.idl:

Source/WTF:

<rdar://problem/65500048>

Reviewed by Eric Carlson.

Add a variant of toIntegralType<> which returns an Optional. Since no existing callers of the
original toIntegralType fail to pass in the optional bool* parameter, make that parameter
non-optional, as it causes a conflict with the new Optional-returning version.

* wtf/text/StringToIntegerConversion.h:
(WTF::toIntegralType):

LayoutTests:

Reviewed by Eric Carlson.

* media/vp-codec-parameters-expected.txt: Added.
* media/vp-codec-parameters.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (264366 => 264367)


--- trunk/LayoutTests/ChangeLog	2020-07-14 19:10:48 UTC (rev 264366)
+++ trunk/LayoutTests/ChangeLog	2020-07-14 19:18:39 UTC (rev 264367)
@@ -1,3 +1,13 @@
+2020-07-14  Jer Noble  <jer.no...@apple.com>
+
+        Add support for parsing VP-style codec strings.
+        https://bugs.webkit.org/show_bug.cgi?id=214270
+
+        Reviewed by Eric Carlson.
+
+        * media/vp-codec-parameters-expected.txt: Added.
+        * media/vp-codec-parameters.html: Added.
+
 2020-07-14  Said Abou-Hallawa  <sabouhall...@apple.com>
 
         When invalidating the clients of an SVG resource we should not go beyond the RenderSVGRoot

Added: trunk/LayoutTests/media/vp-codec-parameters-expected.txt (0 => 264367)


--- trunk/LayoutTests/media/vp-codec-parameters-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/vp-codec-parameters-expected.txt	2020-07-14 19:18:39 UTC (rev 264367)
@@ -0,0 +1,130 @@
+EXPECTED (internals.parseVPCodecParameters("bad-parameter") == 'null') OK
+
+Test invalid number of required parameters:
+EXPECTED (internals.parseVPCodecParameters("vp09") == 'null') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.00") == 'null') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.00.41") == 'null') OK
+
+Test valid default optional parameters:
+EXPECTED (internals.parseVPCodecParameters("vp09.00.41.08") === '{ vp09, 0, 41, 8, 1, 1, 1, 1, 0}') OK
+
+Test invalid number of optional parameters:
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01") == 'null') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09") == 'null') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.16") == 'null') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.09") == 'null') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.09.01.00") == 'null') OK
+
+Test valid required and optional parameters:
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.09.01") === '{ vp09, 2, 10, 10, 1, 9, 16, 9, 1}') OK
+
+Test invalid codec type
+EXPECTED (internals.parseVPCodecParameters("vp10.00.41.08") == 'null') OK
+
+Test invalid combination of matrixCoefficients and chromaSubsampling
+EXPECTED (internals.parseVPCodecParameters("vp09.00.41.08.01.01.01.00.00") == 'null') OK
+
+Test valid profiles:
+EXPECTED (internals.parseVPCodecParameters("vp09.00.41.08") === '{ vp09, 0, 41, 8, 1, 1, 1, 1, 0}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.01.41.08") === '{ vp09, 1, 41, 8, 1, 1, 1, 1, 0}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.41.08") === '{ vp09, 2, 41, 8, 1, 1, 1, 1, 0}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.03.41.08") === '{ vp09, 3, 41, 8, 1, 1, 1, 1, 0}') OK
+
+Test invalid profile:
+EXPECTED (internals.parseVPCodecParameters("vp09.04.41.08") == 'null') OK
+
+Test valid levels:
+EXPECTED (internals.parseVPCodecParameters("vp09.00.10.08") === '{ vp09, 0, 10, 8, 1, 1, 1, 1, 0}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.00.11.08") === '{ vp09, 0, 11, 8, 1, 1, 1, 1, 0}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.00.20.08") === '{ vp09, 0, 20, 8, 1, 1, 1, 1, 0}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.00.21.08") === '{ vp09, 0, 21, 8, 1, 1, 1, 1, 0}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.00.30.08") === '{ vp09, 0, 30, 8, 1, 1, 1, 1, 0}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.00.31.08") === '{ vp09, 0, 31, 8, 1, 1, 1, 1, 0}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.00.40.08") === '{ vp09, 0, 40, 8, 1, 1, 1, 1, 0}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.00.41.08") === '{ vp09, 0, 41, 8, 1, 1, 1, 1, 0}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.00.50.08") === '{ vp09, 0, 50, 8, 1, 1, 1, 1, 0}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.00.51.08") === '{ vp09, 0, 51, 8, 1, 1, 1, 1, 0}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.00.52.08") === '{ vp09, 0, 52, 8, 1, 1, 1, 1, 0}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.00.60.08") === '{ vp09, 0, 60, 8, 1, 1, 1, 1, 0}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.00.61.08") === '{ vp09, 0, 61, 8, 1, 1, 1, 1, 0}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.00.62.08") === '{ vp09, 0, 62, 8, 1, 1, 1, 1, 0}') OK
+
+Test invalid level:
+EXPECTED (internals.parseVPCodecParameters("vp09.00.12.08") == 'null') OK
+
+Test valid bitDepths:
+EXPECTED (internals.parseVPCodecParameters("vp09.00.41.08") === '{ vp09, 0, 41, 8, 1, 1, 1, 1, 0}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.00.41.10") === '{ vp09, 0, 41, 10, 1, 1, 1, 1, 0}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.00.41.12") === '{ vp09, 0, 41, 12, 1, 1, 1, 1, 0}') OK
+
+Test invalid bitDepth:
+EXPECTED (internals.parseVPCodecParameters("vp09.00.41.09") == 'null') OK
+
+Test valid chromaSubsampling:
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.00.09.16.09.01") === '{ vp09, 2, 10, 10, 0, 9, 16, 9, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.09.01") === '{ vp09, 2, 10, 10, 1, 9, 16, 9, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.02.09.16.09.01") === '{ vp09, 2, 10, 10, 2, 9, 16, 9, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.03.09.16.09.01") === '{ vp09, 2, 10, 10, 3, 9, 16, 9, 1}') OK
+
+Test invalid chromaSubsampling:
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.04.09.16.09.01") == 'null') OK
+
+Test valid colorPrimaries:
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.01.16.09.01") === '{ vp09, 2, 10, 10, 1, 1, 16, 9, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.04.16.09.01") === '{ vp09, 2, 10, 10, 1, 4, 16, 9, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.05.16.09.01") === '{ vp09, 2, 10, 10, 1, 5, 16, 9, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.06.16.09.01") === '{ vp09, 2, 10, 10, 1, 6, 16, 9, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.07.16.09.01") === '{ vp09, 2, 10, 10, 1, 7, 16, 9, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.08.16.09.01") === '{ vp09, 2, 10, 10, 1, 8, 16, 9, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.09.01") === '{ vp09, 2, 10, 10, 1, 9, 16, 9, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.10.16.09.01") === '{ vp09, 2, 10, 10, 1, 10, 16, 9, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.11.16.09.01") === '{ vp09, 2, 10, 10, 1, 11, 16, 9, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.12.16.09.01") === '{ vp09, 2, 10, 10, 1, 12, 16, 9, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.22.16.09.01") === '{ vp09, 2, 10, 10, 1, 22, 16, 9, 1}') OK
+
+Test invalid colorPrimaries:
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.02.16.09.01") == 'null') OK
+
+Test valid transferCharacteristics:
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.01.09.01") === '{ vp09, 2, 10, 10, 1, 9, 1, 9, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.04.09.01") === '{ vp09, 2, 10, 10, 1, 9, 4, 9, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.05.09.01") === '{ vp09, 2, 10, 10, 1, 9, 5, 9, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.06.09.01") === '{ vp09, 2, 10, 10, 1, 9, 6, 9, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.07.09.01") === '{ vp09, 2, 10, 10, 1, 9, 7, 9, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.08.09.01") === '{ vp09, 2, 10, 10, 1, 9, 8, 9, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.09.09.01") === '{ vp09, 2, 10, 10, 1, 9, 9, 9, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.10.09.01") === '{ vp09, 2, 10, 10, 1, 9, 10, 9, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.11.09.01") === '{ vp09, 2, 10, 10, 1, 9, 11, 9, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.12.09.01") === '{ vp09, 2, 10, 10, 1, 9, 12, 9, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.13.09.01") === '{ vp09, 2, 10, 10, 1, 9, 13, 9, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.14.09.01") === '{ vp09, 2, 10, 10, 1, 9, 14, 9, 1}') OK
+
+Test invalid transferCharacteristics:
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.03.09.01") == 'null') OK
+
+Test valid matrixCoefficients:
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.03.09.16.00.01") === '{ vp09, 2, 10, 10, 3, 9, 16, 0, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.01.01") === '{ vp09, 2, 10, 10, 1, 9, 16, 1, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.04.01") === '{ vp09, 2, 10, 10, 1, 9, 16, 4, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.05.01") === '{ vp09, 2, 10, 10, 1, 9, 16, 5, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.06.01") === '{ vp09, 2, 10, 10, 1, 9, 16, 6, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.07.01") === '{ vp09, 2, 10, 10, 1, 9, 16, 7, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.08.01") === '{ vp09, 2, 10, 10, 1, 9, 16, 8, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.09.01") === '{ vp09, 2, 10, 10, 1, 9, 16, 9, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.10.01") === '{ vp09, 2, 10, 10, 1, 9, 16, 10, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.11.01") === '{ vp09, 2, 10, 10, 1, 9, 16, 11, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.12.01") === '{ vp09, 2, 10, 10, 1, 9, 16, 12, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.13.01") === '{ vp09, 2, 10, 10, 1, 9, 16, 13, 1}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.14.01") === '{ vp09, 2, 10, 10, 1, 9, 16, 14, 1}') OK
+
+Test invalid matrixCoefficients:
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.09.03") == 'null') OK
+
+Test valid videoFullRangeFlag:
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.01.00") === '{ vp09, 2, 10, 10, 1, 9, 16, 1, 0}') OK
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.01.01") === '{ vp09, 2, 10, 10, 1, 9, 16, 1, 1}') OK
+
+Test invalid videoFullRangeFlag:
+EXPECTED (internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.01.02") == 'null') OK
+END OF TEST
+

Added: trunk/LayoutTests/media/vp-codec-parameters.html (0 => 264367)


--- trunk/LayoutTests/media/vp-codec-parameters.html	                        (rev 0)
+++ trunk/LayoutTests/media/vp-codec-parameters.html	2020-07-14 19:18:39 UTC (rev 264367)
@@ -0,0 +1,136 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <script src=""
+    <script>
+    function VPCodecConfigurationRecordToString(set) {
+        try {
+            return `{ ${set.codecName}, ${set.profile}, ${set.level}, ${set.bitDepth}, ${set.chromaSubsampling}, ${set.colorPrimaries}, ${set.transferCharacteristics}, ${set.matrixCoefficients}, ${set.videoFullRangeFlag}}`;
+        } catch(e) {
+            return `{ ${set} }`;
+        }
+    }
+    function isEqualVPCodecConfigurationRecord(setA, setB) {
+        try {
+            return setA.profile == setB.profile &&
+                setA.level == setB.level &&
+                setA.bitDepth == setB.bitDepth &&
+                setA.chromaSubsampling == setB.chromaSubsampling &&
+                setA.videoFullRangeFlag == setB.videoFullRangeFlag &&
+                setA.colorPrimaries == setB.colorPrimaries &&
+                setA.transferCharacteristics == setB.transferCharacteristics &&
+                setA.matrixCoefficients == setB.matrixCoefficients;
+        } catch(e) {
+            return false;
+        }
+    }
+    function makeVPCodecConfigurationRecord(codecName, profile, level, bitDepth, chromaSubsampling, colorPrimaries, transferCharacteristics, matrixCoefficients, videoFullRangeFlag)
+    {
+        return {
+            codecName: codecName,
+            profile: profile,
+            level: level,
+            bitDepth: bitDepth,
+            chromaSubsampling: chromaSubsampling,
+            videoFullRangeFlag: videoFullRangeFlag,
+            colorPrimaries: colorPrimaries,
+            transferCharacteristics: transferCharacteristics,
+            matrixCoefficients: matrixCoefficients
+        };
+    }
+    function testExpectedVPCodecConfigurationRecord(testFuncString, expected)
+    {
+        let observed = eval(testFuncString);
+        let success = isEqualVPCodecConfigurationRecord(observed, expected);
+        reportExpected(success, testFuncString, '===', VPCodecConfigurationRecordToString(expected), VPCodecConfigurationRecordToString(observed));
+    }
+    window.addEventListener('load', event => {
+        testExpected('internals.parseVPCodecParameters("bad-parameter")', null);
+        consoleWrite('');
+        consoleWrite('Test invalid number of required parameters:')
+        testExpected('internals.parseVPCodecParameters("vp09")', null);
+        testExpected('internals.parseVPCodecParameters("vp09.00")', null);
+        testExpected('internals.parseVPCodecParameters("vp09.00.41")', null);
+        consoleWrite('');
+        consoleWrite('Test valid default optional parameters:')
+        testExpectedVPCodecConfigurationRecord('internals.parseVPCodecParameters("vp09.00.41.08")', makeVPCodecConfigurationRecord('vp09', 0, 41, 8, 1, 1, 1, 1, 0));
+        consoleWrite('');
+        consoleWrite('Test invalid number of optional parameters:')
+        testExpected('internals.parseVPCodecParameters("vp09.02.10.10.01")', null);
+        testExpected('internals.parseVPCodecParameters("vp09.02.10.10.01.09")', null);
+        testExpected('internals.parseVPCodecParameters("vp09.02.10.10.01.09.16")', null);
+        testExpected('internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.09")', null);
+        testExpected('internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.09.01.00")', null);
+        consoleWrite('');
+        consoleWrite('Test valid required and optional parameters:')
+        testExpectedVPCodecConfigurationRecord('internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.09.01")', makeVPCodecConfigurationRecord('vp09', 2, 10, 10, 1, 9, 16, 9, 1));
+        consoleWrite('');
+        consoleWrite('Test invalid codec type');
+        testExpected('internals.parseVPCodecParameters("vp10.00.41.08")', null);
+        consoleWrite('');
+        consoleWrite('Test invalid combination of matrixCoefficients and chromaSubsampling');
+        testExpected('internals.parseVPCodecParameters("vp09.00.41.08.01.01.01.00.00")', null);
+        consoleWrite('');
+        consoleWrite('Test valid profiles:');
+        for (let profile of [0, 1, 2, 3])
+            testExpectedVPCodecConfigurationRecord(`internals.parseVPCodecParameters("vp09.${profile.toString().padStart(2, '0')}.41.08")`, makeVPCodecConfigurationRecord('vp09', profile, 41, 8, 1, 1, 1, 1, 0));
+        consoleWrite('');
+        consoleWrite('Test invalid profile:');
+        testExpected('internals.parseVPCodecParameters("vp09.04.41.08")', null);
+        consoleWrite('');
+        consoleWrite('Test valid levels:');
+        for (let level of [10, 11, 20, 21, 30, 31, 40, 41, 50, 51, 52, 60, 61, 62])
+            testExpectedVPCodecConfigurationRecord(`internals.parseVPCodecParameters("vp09.00.${level.toString().padStart(2, '0')}.08")`, makeVPCodecConfigurationRecord('vp09', 0, level, 8, 1, 1, 1, 1, 0));
+        consoleWrite('');
+        consoleWrite('Test invalid level:');
+        testExpected('internals.parseVPCodecParameters("vp09.00.12.08")', null);
+        consoleWrite('');
+        consoleWrite('Test valid bitDepths:');
+        for (let bitDepth of [8, 10, 12])
+            testExpectedVPCodecConfigurationRecord(`internals.parseVPCodecParameters("vp09.00.41.${bitDepth.toString().padStart(2, '0')}")`, makeVPCodecConfigurationRecord('vp09', 0, 41, bitDepth, 1, 1, 1, 1, 0));
+        consoleWrite('');
+        consoleWrite('Test invalid bitDepth:');
+        testExpected('internals.parseVPCodecParameters("vp09.00.41.09")', null);
+        consoleWrite('');
+        consoleWrite('Test valid chromaSubsampling:');
+        for (let chromaSubsampling of [0, 1, 2, 3])
+            testExpectedVPCodecConfigurationRecord(`internals.parseVPCodecParameters("vp09.02.10.10.${chromaSubsampling.toString().padStart(2, '0')}.09.16.09.01")`, makeVPCodecConfigurationRecord('vp09', 2, 10, 10, chromaSubsampling, 9, 16, 9, 1));
+        consoleWrite('');
+        consoleWrite('Test invalid chromaSubsampling:');
+        testExpected('internals.parseVPCodecParameters("vp09.02.10.10.04.09.16.09.01")', null);
+        consoleWrite('');
+        consoleWrite('Test valid colorPrimaries:');
+        for (let colorPrimaries of [1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 22])
+            testExpectedVPCodecConfigurationRecord(`internals.parseVPCodecParameters("vp09.02.10.10.01.${colorPrimaries.toString().padStart(2, '0')}.16.09.01")`, makeVPCodecConfigurationRecord('vp09', 2, 10, 10, 1, colorPrimaries, 16, 9, 1));
+        consoleWrite('');
+        consoleWrite('Test invalid colorPrimaries:');
+        testExpected('internals.parseVPCodecParameters("vp09.02.10.10.01.02.16.09.01")', null);
+        consoleWrite('');
+        consoleWrite('Test valid transferCharacteristics:');
+        for (let transferCharacteristics of [1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
+            testExpectedVPCodecConfigurationRecord(`internals.parseVPCodecParameters("vp09.02.10.10.01.09.${transferCharacteristics.toString().padStart(2, '0')}.09.01")`, makeVPCodecConfigurationRecord('vp09', 2, 10, 10, 1, 9, transferCharacteristics, 9, 1));
+        consoleWrite('');
+        consoleWrite('Test invalid transferCharacteristics:');
+        testExpected('internals.parseVPCodecParameters("vp09.02.10.10.01.09.03.09.01")', null);
+        consoleWrite('');
+        consoleWrite('Test valid matrixCoefficients:');
+        testExpectedVPCodecConfigurationRecord(`internals.parseVPCodecParameters("vp09.02.10.10.03.09.16.00.01")`, makeVPCodecConfigurationRecord('vp09', 2, 10, 10, 3, 9, 16, 0, 1));
+        for (let matrixCoefficients of [1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
+            testExpectedVPCodecConfigurationRecord(`internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.${matrixCoefficients.toString().padStart(2, '0')}.01")`, makeVPCodecConfigurationRecord('vp09', 2, 10, 10, 1, 9, 16, matrixCoefficients, 1));
+        consoleWrite('');
+        consoleWrite('Test invalid matrixCoefficients:');
+        testExpected('internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.09.03")', null);
+        consoleWrite('');
+        consoleWrite('Test valid videoFullRangeFlag:');
+        testExpectedVPCodecConfigurationRecord(`internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.01.00")`, makeVPCodecConfigurationRecord('vp09', 2, 10, 10, 1, 9, 16, 1, 0));
+        testExpectedVPCodecConfigurationRecord(`internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.01.01")`, makeVPCodecConfigurationRecord('vp09', 2, 10, 10, 1, 9, 16, 1, 1));
+        consoleWrite('');
+        consoleWrite('Test invalid videoFullRangeFlag:');
+        testExpected('internals.parseVPCodecParameters("vp09.02.10.10.01.09.16.01.02")', null);
+        endTest();
+    }, { once: true });
+    </script>
+</head>
+<body>
+</body>
+</html>
\ No newline at end of file

Modified: trunk/Source/WTF/ChangeLog (264366 => 264367)


--- trunk/Source/WTF/ChangeLog	2020-07-14 19:10:48 UTC (rev 264366)
+++ trunk/Source/WTF/ChangeLog	2020-07-14 19:18:39 UTC (rev 264367)
@@ -1,3 +1,18 @@
+2020-07-14  Jer Noble  <jer.no...@apple.com>
+
+        Add support for parsing VP-style codec strings.
+        https://bugs.webkit.org/show_bug.cgi?id=214270
+        <rdar://problem/65500048>
+
+        Reviewed by Eric Carlson.
+
+        Add a variant of toIntegralType<> which returns an Optional. Since no existing callers of the
+        original toIntegralType fail to pass in the optional bool* parameter, make that parameter
+        non-optional, as it causes a conflict with the new Optional-returning version.
+
+        * wtf/text/StringToIntegerConversion.h:
+        (WTF::toIntegralType):
+
 2020-07-13  Keith Miller  <keith_mil...@apple.com>
 
         Clean up SourceProvider and add caller relative load script to jsc.cpp

Modified: trunk/Source/WTF/wtf/text/StringToIntegerConversion.h (264366 => 264367)


--- trunk/Source/WTF/wtf/text/StringToIntegerConversion.h	2020-07-14 19:10:48 UTC (rev 264366)
+++ trunk/Source/WTF/wtf/text/StringToIntegerConversion.h	2020-07-14 19:18:39 UTC (rev 264367)
@@ -46,7 +46,7 @@
 }
 
 template<typename IntegralType, typename CharacterType>
-inline IntegralType toIntegralType(const CharacterType* data, size_t length, bool* ok = nullptr, int base = 10)
+inline IntegralType toIntegralType(const CharacterType* data, size_t length, bool* ok, int base = 10)
 {
     static constexpr IntegralType integralMax = std::numeric_limits<IntegralType>::max();
     static constexpr bool isSigned = std::numeric_limits<IntegralType>::is_signed;
@@ -122,7 +122,7 @@
 }
 
 template<typename IntegralType, typename StringOrStringView>
-inline IntegralType toIntegralType(const StringOrStringView& stringView, bool* ok = nullptr, int base = 10)
+inline IntegralType toIntegralType(const StringOrStringView& stringView, bool* ok, int base = 10)
 {
     if (stringView.is8Bit())
         return toIntegralType<IntegralType, LChar>(stringView.characters8(), stringView.length(), ok, base);
@@ -129,6 +129,26 @@
     return toIntegralType<IntegralType, UChar>(stringView.characters16(), stringView.length(), ok, base);
 }
 
+template<typename IntegralType, typename CharacterType>
+inline Optional<IntegralType> toIntegralType(const CharacterType* data, size_t length, int base = 10)
+{
+    bool ok = false;
+    IntegralType value = toIntegralType<IntegralType>(data, length, &ok, base);
+    if (!ok)
+        return WTF::nullopt;
+    return value;
 }
 
+template<typename IntegralType, typename StringOrStringView>
+inline Optional<IntegralType> toIntegralType(const StringOrStringView& stringView, int base = 10)
+{
+    bool ok = false;
+    IntegralType value = toIntegralType<IntegralType>(stringView, &ok, base);
+    if (!ok)
+        return WTF::nullopt;
+    return value;
+}
+
+}
+
 using WTF::toIntegralType;

Modified: trunk/Source/WebCore/ChangeLog (264366 => 264367)


--- trunk/Source/WebCore/ChangeLog	2020-07-14 19:10:48 UTC (rev 264366)
+++ trunk/Source/WebCore/ChangeLog	2020-07-14 19:18:39 UTC (rev 264367)
@@ -1,3 +1,24 @@
+2020-07-14  Jer Noble  <jer.no...@apple.com>
+
+        Add support for parsing VP-style codec strings.
+        https://bugs.webkit.org/show_bug.cgi?id=214270
+
+        Reviewed by Eric Carlson.
+
+        Test: media/vp-codec-parameters.html
+
+        * Sources.txt:
+        * WebCore.xcodeproj/project.pbxproj:
+        * platform/graphics/VP9Utilities.cpp: Added.
+        (WebCore::validVPLevels):
+        (WebCore::validColorPrimaries):
+        (WebCore::parseVPCodecParameters):
+        * platform/graphics/VP9Utilities.h: Added.
+        * testing/Internals.cpp:
+        (WebCore::Internals::parseVPCodecParameters):
+        * testing/Internals.h:
+        * testing/Internals.idl:
+
 2020-07-14  Said Abou-Hallawa  <sabouhall...@apple.com>
 
         When invalidating the clients of an SVG resource we should not go beyond the RenderSVGRoot

Modified: trunk/Source/WebCore/Sources.txt (264366 => 264367)


--- trunk/Source/WebCore/Sources.txt	2020-07-14 19:10:48 UTC (rev 264366)
+++ trunk/Source/WebCore/Sources.txt	2020-07-14 19:18:39 UTC (rev 264367)
@@ -1890,6 +1890,7 @@
 platform/graphics/TextRun.cpp
 platform/graphics/TextTrackRepresentation.cpp
 platform/graphics/TrackPrivateBase.cpp
+platform/graphics/VP9Utilities.cpp
 platform/graphics/VelocityData.cpp
 platform/graphics/WOFFFileFormat.cpp
 platform/graphics/WidthIterator.cpp

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (264366 => 264367)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2020-07-14 19:10:48 UTC (rev 264366)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2020-07-14 19:18:39 UTC (rev 264367)
@@ -14107,6 +14107,8 @@
 		CD641EB11818F5ED00EE4C41 /* MediaSourcePrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaSourcePrivate.h; sourceTree = "<group>"; };
 		CD641EB21818F5ED00EE4C41 /* SourceBufferPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SourceBufferPrivate.h; sourceTree = "<group>"; };
 		CD641EC7181ED60100EE4C41 /* MediaSample.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MediaSample.h; sourceTree = "<group>"; };
+		CD6FE5BA24BCE7B6009FCDA4 /* VP9Utilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VP9Utilities.h; sourceTree = "<group>"; };
+		CD6FE5BB24BCE7B6009FCDA4 /* VP9Utilities.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = VP9Utilities.cpp; sourceTree = "<group>"; };
 		CD720B4722682C7E00047FDE /* ISOFairPlayStreamingPsshBox.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ISOFairPlayStreamingPsshBox.cpp; sourceTree = "<group>"; };
 		CD720B4922682C7F00047FDE /* ISOFairPlayStreamingPsshBox.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ISOFairPlayStreamingPsshBox.h; sourceTree = "<group>"; };
 		CD78A2EC1F75648600DE371B /* CDMInstanceFairPlayStreamingAVFObjC.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CDMInstanceFairPlayStreamingAVFObjC.mm; sourceTree = "<group>"; };
@@ -25742,6 +25744,8 @@
 				076E11BE1F683E0D00177395 /* TrackPrivateBase.cpp */,
 				BE913D7F181EF8E500DCB09E /* TrackPrivateBase.h */,
 				E4AFCFA40DAF29A300F5F55C /* UnitBezier.h */,
+				CD6FE5BA24BCE7B6009FCDA4 /* VP9Utilities.h */,
+				CD6FE5BB24BCE7B6009FCDA4 /* VP9Utilities.cpp */,
 				0F5A57CA229B18AE0025EDA9 /* VelocityData.cpp */,
 				0F1A0C36229A481800D37ADB /* VelocityData.h */,
 				BEF29EEA1715DD0900C4B4C9 /* VideoTrackPrivate.h */,

Added: trunk/Source/WebCore/platform/graphics/VP9Utilities.cpp (0 => 264367)


--- trunk/Source/WebCore/platform/graphics/VP9Utilities.cpp	                        (rev 0)
+++ trunk/Source/WebCore/platform/graphics/VP9Utilities.cpp	2020-07-14 19:18:39 UTC (rev 264367)
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2020 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "VP9Utilities.h"
+
+#include <wtf/NeverDestroyed.h>
+#include <wtf/text/StringToIntegerConversion.h>
+
+namespace WebCore {
+
+static bool isValidVPLevel(uint8_t level)
+{
+    constexpr uint8_t validLevels[] = {
+        10,
+        11,
+        20,
+        21,
+        30,
+        31,
+        40,
+        41,
+        50,
+        51,
+        52,
+        60,
+        61,
+        62,
+    };
+
+    ASSERT(std::is_sorted(std::begin(validLevels), std::end(validLevels)));
+    return std::binary_search(std::begin(validLevels), std::end(validLevels), level);
+}
+
+static bool isValidVPcolorPrimaries(uint8_t colorPrimaries)
+{
+    constexpr uint8_t validColorPrimaries[] = {
+        1,
+        4,
+        5,
+        6,
+        7,
+        8,
+        9,
+        10,
+        11,
+        12,
+        22,
+    };
+
+    ASSERT(std::is_sorted(std::begin(validColorPrimaries), std::end(validColorPrimaries)));
+    return std::binary_search(std::begin(validColorPrimaries), std::end(validColorPrimaries), colorPrimaries);
+}
+
+Optional<VPCodecConfigurationRecord> parseVPCodecParameters(StringView codecView)
+{
+    // The format of the 'vp09' codec string is specified in the webm GitHub repo:
+    // <https://github.com/webmproject/vp9-dash/blob/master/VPCodecISOMediaFileFormatBinding.md#codecs-parameter-string>
+
+    // "sample entry 4CC, profile, level, and bitDepth are all mandatory fields. If any of these fields are empty, or not
+    // within their allowed range, the processing device SHALL treat it as an error."
+
+    auto codecSplit = codecView.split('.');
+    auto nextElement = codecSplit.begin();
+    if (nextElement == codecSplit.end())
+        return WTF::nullopt;
+
+    VPCodecConfigurationRecord configuration;
+
+    // Codec identifier: legal values are 'vp08' or 'vp09'.
+    configuration.codecName = (*nextElement).toString();
+    if (configuration.codecName != "vp08" && configuration.codecName != "vp09")
+        return WTF::nullopt;
+
+    if (++nextElement == codecSplit.end())
+        return WTF::nullopt;
+
+    // First element: profile. Legal values are 0-3.
+    auto profile = ""
+    if (!profile || *profile > 3)
+        return WTF::nullopt;
+    configuration.profile = ""
+
+    if (++nextElement == codecSplit.end())
+        return WTF::nullopt;
+
+    // Second element: level. Legal values are enumerated in validVPLevels above.
+    auto level = toIntegralType<uint8_t>(*nextElement);
+    if (!level || !isValidVPLevel(*level))
+        return WTF::nullopt;
+    configuration.level = *level;
+
+    if (++nextElement == codecSplit.end())
+        return WTF::nullopt;
+
+    // Third element: bitDepth. Legal values are 8, 10, and 12.
+    auto bitDepth = toIntegralType<uint8_t>(*nextElement);
+    if (!bitDepth || (*bitDepth != 8 && *bitDepth != 10 && *bitDepth != 12))
+        return WTF::nullopt;
+    configuration.bitDepth = *bitDepth;
+
+    // "colorPrimaries, transferCharacteristics, matrixCoefficients, videoFullRangeFlag, and chromaSubsampling are OPTIONAL,
+    // mutually inclusive (all or none) fields. If not specified then the processing device MUST use the values listed in the
+    // table below as defaults when deciding if the device is able to decode and potentially render the video."
+
+    if (++nextElement == codecSplit.end())
+        return configuration;
+
+    // Fourth element: chromaSubsampling. Legal values are 0-3.
+    auto chromaSubsampling = toIntegralType<uint8_t>(*nextElement);
+    if (!chromaSubsampling || *chromaSubsampling > 3)
+        return WTF::nullopt;
+    configuration.chromaSubsampling = *chromaSubsampling;
+
+    if (++nextElement == codecSplit.end())
+        return WTF::nullopt;
+
+    // Fifth element: colorPrimaries. Legal values are defined by  ISO/IEC 23001-8:2016, superceded
+    // by ISO/IEC 23091-2:2019.
+    auto colorPrimaries = toIntegralType<uint8_t>(*nextElement);
+    if (!colorPrimaries || !isValidVPcolorPrimaries(*colorPrimaries))
+        return WTF::nullopt;
+    configuration.colorPrimaries = *colorPrimaries;
+
+    if (++nextElement == codecSplit.end())
+        return WTF::nullopt;
+
+    // Sixth element: transferCharacteristics. Legal values are defined by  ISO/IEC 23001-8:2016, superceded
+    // by ISO/IEC 23091-2:2019.
+    auto transferCharacteristics = toIntegralType<uint8_t>(*nextElement);
+    if (!transferCharacteristics || (!*transferCharacteristics || *transferCharacteristics == 2 || *transferCharacteristics == 3 || *transferCharacteristics > 18))
+        return WTF::nullopt;
+    configuration.transferCharacteristics = *transferCharacteristics;
+
+    if (++nextElement == codecSplit.end())
+        return WTF::nullopt;
+
+    // Seventh element: matrixCoefficients. Legal values are defined by  ISO/IEC 23001-8:2016, superceded
+    // by ISO/IEC 23091-2:2019.
+    auto matrixCoefficients = toIntegralType<uint8_t>(*nextElement);
+    if (!matrixCoefficients || (*matrixCoefficients == 2 || *matrixCoefficients == 3 || *matrixCoefficients > 14))
+        return WTF::nullopt;
+    configuration.matrixCoefficients = *matrixCoefficients;
+
+    // "If matrixCoefficients is 0 (RGB), then chroma subsampling MUST be 3 (4:4:4)."
+    if (!configuration.matrixCoefficients && configuration.chromaSubsampling != 3)
+        return WTF::nullopt;
+
+    if (++nextElement == codecSplit.end())
+        return WTF::nullopt;
+
+    // Eighth element: videoFullRangeFlag. Legal values are 0 and 1.
+    auto videoFullRangeFlag = toIntegralType<uint8_t>(*nextElement);
+    if (!videoFullRangeFlag || *videoFullRangeFlag > 1)
+        return WTF::nullopt;
+    configuration.videoFullRangeFlag = *videoFullRangeFlag;
+
+    if (++nextElement != codecSplit.end())
+        return WTF::nullopt;
+
+    return configuration;
+}
+
+}

Added: trunk/Source/WebCore/platform/graphics/VP9Utilities.h (0 => 264367)


--- trunk/Source/WebCore/platform/graphics/VP9Utilities.h	                        (rev 0)
+++ trunk/Source/WebCore/platform/graphics/VP9Utilities.h	2020-07-14 19:18:39 UTC (rev 264367)
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2020 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include <wtf/text/StringView.h>
+#include <wtf/text/WTFString.h>
+
+namespace WebCore {
+
+struct VPCodecConfigurationRecord {
+    String codecName;
+    uint8_t profile { 0 };
+    uint8_t level { 0 };
+    uint8_t bitDepth { 0 };
+    uint8_t chromaSubsampling { 1 };
+    uint8_t videoFullRangeFlag { 0 };
+    uint8_t colorPrimaries { 1 };
+    uint8_t transferCharacteristics { 1 };
+    uint8_t matrixCoefficients { 1 };
+};
+
+WEBCORE_EXPORT Optional<VPCodecConfigurationRecord> parseVPCodecParameters(StringView codecString);
+
+}

Modified: trunk/Source/WebCore/testing/Internals.cpp (264366 => 264367)


--- trunk/Source/WebCore/testing/Internals.cpp	2020-07-14 19:10:48 UTC (rev 264366)
+++ trunk/Source/WebCore/testing/Internals.cpp	2020-07-14 19:18:39 UTC (rev 264367)
@@ -5600,6 +5600,11 @@
     return WebCore::parseDoViCodecParameters(codecString);
 }
 
+Optional<VPCodecConfigurationRecord> Internals::parseVPCodecParameters(const String& codecString)
+{
+    return WebCore::parseVPCodecParameters(codecString);
+}
+
 auto Internals::getCookies() const -> Vector<CookieData>
 {
     auto* document = contextDocument();

Modified: trunk/Source/WebCore/testing/Internals.h (264366 => 264367)


--- trunk/Source/WebCore/testing/Internals.h	2020-07-14 19:10:48 UTC (rev 264366)
+++ trunk/Source/WebCore/testing/Internals.h	2020-07-14 19:18:39 UTC (rev 264367)
@@ -37,6 +37,7 @@
 #include "RealtimeMediaSource.h"
 #include "SleepDisabler.h"
 #include "TextIndicator.h"
+#include "VP9Utilities.h"
 #include <_javascript_Core/Float32Array.h>
 #include <wtf/Optional.h>
 
@@ -915,6 +916,9 @@
     using DoViParameterSet = WebCore::DoViParameterSet;
     Optional<DoViParameterSet> parseDoViCodecParameters(const String& codecString);
 
+    using VPCodecConfigurationRecord = WebCore::VPCodecConfigurationRecord;
+    Optional<VPCodecConfigurationRecord> parseVPCodecParameters(const String& codecString);
+
     struct CookieData {
         String name;
         String value;

Modified: trunk/Source/WebCore/testing/Internals.idl (264366 => 264367)


--- trunk/Source/WebCore/testing/Internals.idl	2020-07-14 19:10:48 UTC (rev 264366)
+++ trunk/Source/WebCore/testing/Internals.idl	2020-07-14 19:18:39 UTC (rev 264367)
@@ -192,6 +192,21 @@
 [
     ExportMacro=WEBCORE_TESTSUPPORT_EXPORT,
     JSGenerateToJSObject,
+] dictionary VPCodecConfigurationRecord {
+    DOMString codecName;
+    octet profile;
+    octet level;
+    octet bitDepth;
+    octet chromaSubsampling;
+    octet videoFullRangeFlag;
+    octet colorPrimaries;
+    octet transferCharacteristics;
+    octet matrixCoefficients;
+};
+
+[
+    ExportMacro=WEBCORE_TESTSUPPORT_EXPORT,
+    JSGenerateToJSObject,
 ] dictionary AcceleratedAnimation {
     DOMString property;
     double speed;
@@ -881,6 +896,7 @@
 
     HEVCParameterSet? parseHEVCCodecParameters(DOMString codecParameters);
     DoViParameterSet? parseDoViCodecParameters(DOMString codecParameters);
+    VPCodecConfigurationRecord? parseVPCodecParameters(DOMString codecParameters);
 
     sequence<CookieData> getCookies();
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to