From f1f1925c4876c73f932d35e0a038b619b861ed83 Mon Sep 17 00:00:00 2001 From: Dale Curtis Date: Tue, 31 Oct 2023 16:22:22 -0700 Subject: [PATCH] Prepare to enable HDR media capabilities by default. I2S approved here: https://groups.google.com/a/chromium.org/g/blink-dev/c/0neM-5GDn8I/m/ymH32sDDAgAJ This cleans up an unnecessary feature flag and implements the rest of the feature per the current spec. Adds a test for mismatched color space information. https://github.com/w3c/media-capabilities/issues/152 covers how we should reject mismatched color parameters, though a PR to add it to the spec hasn't yet been made. Safari has implemented this behavior though, so copy it. Bug: 1048045 Change-Id: I4fee62361c697922bb041724f4e4ac8c8e9d5c2d Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4989038 Reviewed-by: Johannes Kron Commit-Queue: Dale Curtis Cr-Commit-Position: refs/heads/main@{#1217958} --- media-capabilities/decodingInfo.any.js | 38 ++++++++++++++++++++------ 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/media-capabilities/decodingInfo.any.js b/media-capabilities/decodingInfo.any.js index 061a226e3f676f..7362c11f932c7c 100644 --- a/media-capabilities/decodingInfo.any.js +++ b/media-capabilities/decodingInfo.any.js @@ -3,7 +3,7 @@ // Minimal VideoConfiguration that will be allowed per spec. All optional // properties are missing. -var minimalVideoConfiguration = { +const minimalVideoConfiguration = { contentType: 'video/webm; codecs="vp09.00.10.08"', width: 800, height: 600, @@ -13,28 +13,29 @@ var minimalVideoConfiguration = { // Minimal AudioConfiguration that will be allowed per spec. All optional // properties are missing. -var minimalAudioConfiguration = { +const minimalAudioConfiguration = { contentType: 'audio/webm; codecs="opus"', }; // AudioConfiguration with optional spatialRendering param. -var audioConfigurationWithSpatialRendering = { +const audioConfigurationWithSpatialRendering = { contentType: 'audio/webm; codecs="opus"', spatialRendering: true, }; // VideoConfiguration with optional hdrMetadataType, colorGamut, and // transferFunction properties. -var videoConfigurationWithDynamicRange = { - contentType: 'video/webm; codecs="vp09.00.10.08"', +const videoConfigurationWithDynamicRange = { + contentType: 'video/webm; codecs="vp09.00.10.08.00.09.16.09.00"', width: 800, height: 600, bitrate: 3000, framerate: 24, - hdrMetadataType: "smpteSt2086", - colorGamut: "srgb", - transferFunction: "srgb", -} + hdrMetadataType: 'smpteSt2086', + colorGamut: 'rec2020', + transferFunction: 'pq', +}; + promise_test(t => { return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo()); @@ -363,6 +364,25 @@ promise_test(t => { }); }, "Test that decodingInfo with hdrMetadataType, colorGamut, and transferFunction set returns a valid MediaCapabilitiesInfo objects"); +promise_test(t => { + // VP9 has a default color space of BT.709 in the codec string. So this will + // mismatch against the provided colorGamut and transferFunction. + let bt709Config = videoConfigurationWithDynamicRange; + bt709Config.contentType = 'video/webm; codecs="vp09.00.10.08"'; + return navigator.mediaCapabilities + .decodingInfo({ + type: 'file', + video: bt709Config, + }) + .then(ability => { + assert_equals(typeof ability.supported, 'boolean'); + assert_equals(typeof ability.smooth, 'boolean'); + assert_equals(typeof ability.powerEfficient, 'boolean'); + assert_equals(typeof ability.keySystemAccess, 'object'); + assert_false(ability.supported); + }); +}, 'Test that decodingInfo with mismatched codec color space is unsupported'); + promise_test(t => { return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({ type: 'file',