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
- trunk/LayoutTests/ChangeLog
- trunk/Source/WTF/ChangeLog
- trunk/Source/WTF/wtf/text/StringToIntegerConversion.h
- trunk/Source/WebCore/ChangeLog
- trunk/Source/WebCore/Sources.txt
- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
- trunk/Source/WebCore/testing/Internals.cpp
- trunk/Source/WebCore/testing/Internals.h
- trunk/Source/WebCore/testing/Internals.idl
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