зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1355252 - Don't assume default codecs for MP4 and WebM in EME MediaCapabilities r=jwwang
Step 10 of EME's "Get Supported Capabilities for Audio/Video Type" algorithm says we can assume default codecs only if a container normatively implies a specific set of codec and codec constraints. Our code assumes that WebM implies Vorbis/VP8 and MP4 implies AAC/H.264, but those aren't actually normatively required by either of these containers' specifications. So we shouldn't assume these containers imply those codecs. MozReview-Commit-ID: G9TDOmrjhpp --HG-- extra : rebase_source : 2f040d76c8cb240359401fe1dc1e3eefa029d77b
This commit is contained in:
Родитель
0078b05711
Коммит
5064845788
|
@ -103,7 +103,7 @@ add_task(async function test() {
|
|||
let access = await content.navigator.requestMediaKeySystemAccess("org.w3.clearkey",
|
||||
[{
|
||||
initDataTypes: [aKeyInfo.initDataType],
|
||||
videoCapabilities: [{contentType: "video/webm"}],
|
||||
videoCapabilities: [{contentType: 'video/webm; codecs="vp9"'}],
|
||||
sessionTypes: ["persistent-license"],
|
||||
persistentState: "required",
|
||||
}]);
|
||||
|
@ -156,7 +156,7 @@ add_task(async function test() {
|
|||
let access = await content.navigator.requestMediaKeySystemAccess("org.w3.clearkey",
|
||||
[{
|
||||
initDataTypes: [aKeyInfo.initDataType],
|
||||
videoCapabilities: [{contentType: "video/webm"}],
|
||||
videoCapabilities: [{contentType: 'video/webm; codecs="vp9"'}],
|
||||
sessionTypes: ["persistent-license"],
|
||||
persistentState: "required",
|
||||
}]);
|
||||
|
|
|
@ -98,7 +98,7 @@ async function setupEMEKey(browser) {
|
|||
let access = await content.navigator.requestMediaKeySystemAccess("org.w3.clearkey",
|
||||
[{
|
||||
initDataTypes: [aKeyInfo.initDataType],
|
||||
videoCapabilities: [{contentType: "video/webm"}],
|
||||
videoCapabilities: [{contentType: 'video/webm; codecs="vp9"'}],
|
||||
sessionTypes: ["persistent-license"],
|
||||
persistentState: "required",
|
||||
}]);
|
||||
|
@ -153,7 +153,7 @@ async function checkEMEKey(browser, emeSessionId) {
|
|||
let access = await content.navigator.requestMediaKeySystemAccess("org.w3.clearkey",
|
||||
[{
|
||||
initDataTypes: [aKeyInfo.initDataType],
|
||||
videoCapabilities: [{contentType: "video/webm"}],
|
||||
videoCapabilities: [{contentType: 'video/webm; codecs="vp9"'}],
|
||||
sessionTypes: ["persistent-license"],
|
||||
persistentState: "required",
|
||||
}]);
|
||||
|
|
|
@ -662,21 +662,8 @@ GetSupportedCapabilities(const CodecType aCodecType,
|
|||
if (codecs.IsEmpty()) {
|
||||
// If container normatively implies a specific set of codecs and codec constraints:
|
||||
// Let parameters be that set.
|
||||
if (isMP4) {
|
||||
if (aCodecType == Audio) {
|
||||
codecs.AppendElement(EME_CODEC_AAC);
|
||||
} else if (aCodecType == Video) {
|
||||
codecs.AppendElement(EME_CODEC_H264);
|
||||
}
|
||||
} else if (isWebM) {
|
||||
if (aCodecType == Audio) {
|
||||
codecs.AppendElement(EME_CODEC_VORBIS);
|
||||
} else if (aCodecType == Video) {
|
||||
codecs.AppendElement(EME_CODEC_VP8);
|
||||
}
|
||||
}
|
||||
// Otherwise: Continue to the next iteration.
|
||||
// (Note: all containers we support have implied codecs, so don't continue here.)
|
||||
continue;
|
||||
}
|
||||
|
||||
// If container type is not strictly a audio/video type, continue to the next iteration.
|
||||
|
|
|
@ -2,8 +2,8 @@ const CLEARKEY_KEYSYSTEM = "org.w3.clearkey";
|
|||
|
||||
const gCencMediaKeySystemConfig = [{
|
||||
initDataTypes: ['cenc'],
|
||||
videoCapabilities: [{ contentType: 'video/mp4' }],
|
||||
audioCapabilities: [{ contentType: 'audio/mp4' }],
|
||||
videoCapabilities: [{ contentType: 'video/mp4; codecs="avc1.42E01E"' }],
|
||||
audioCapabilities: [{ contentType: 'audio/mp4; codecs="mp4a.40.2"' }],
|
||||
}];
|
||||
|
||||
function IsMacOSSnowLeopardOrEarlier() {
|
||||
|
|
|
@ -94,11 +94,7 @@ function PrepareInitData(initDataType, initData)
|
|||
|
||||
function Test(test) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
var configs = [{
|
||||
initDataTypes: [test.initDataType],
|
||||
videoCapabilities: [{contentType: 'video/mp4' }],
|
||||
}];
|
||||
navigator.requestMediaKeySystemAccess('org.w3.clearkey', configs)
|
||||
navigator.requestMediaKeySystemAccess('org.w3.clearkey', gCencMediaKeySystemConfig)
|
||||
.then((access) => access.createMediaKeys())
|
||||
.then((mediaKeys) => {
|
||||
var session = mediaKeys.createSession(test.sessionType);
|
||||
|
|
|
@ -70,6 +70,13 @@ function Test(test) {
|
|||
});
|
||||
}
|
||||
|
||||
const AUDIO_WEBM_VORBIS = 'audio/webm; codecs="vorbis"';
|
||||
const VIDEO_WEBM_VP8 = 'video/webm; codecs="vp8"';
|
||||
const VIDEO_WEBM_VP9 = 'video/webm; codecs="vp9"';
|
||||
|
||||
const AUDIO_MP4_AAC = 'audio/mp4; codecs="mp4a.40.2"';
|
||||
const VIDEO_MP4_H264 = 'video/mp4; codecs="avc1.42E01E"';
|
||||
|
||||
var tests = [
|
||||
{
|
||||
name: 'Empty keySystem string',
|
||||
|
@ -77,7 +84,7 @@ var tests = [
|
|||
options: [
|
||||
{
|
||||
initDataTypes: ['cenc'],
|
||||
videoCapabilities: [{contentType: 'video/mp4'}],
|
||||
videoCapabilities: [{contentType: VIDEO_MP4_H264}],
|
||||
}
|
||||
],
|
||||
shouldPass: false,
|
||||
|
@ -97,15 +104,15 @@ var tests = [
|
|||
{
|
||||
label: SUPPORTED_LABEL,
|
||||
initDataTypes: ['cenc'],
|
||||
audioCapabilities: [{contentType: 'audio/mp4'}],
|
||||
videoCapabilities: [{contentType: 'video/mp4'}],
|
||||
audioCapabilities: [{contentType: AUDIO_MP4_AAC}],
|
||||
videoCapabilities: [{contentType: VIDEO_MP4_H264}],
|
||||
}
|
||||
],
|
||||
expectedConfig: {
|
||||
label: SUPPORTED_LABEL,
|
||||
initDataTypes: ['cenc'],
|
||||
audioCapabilities: [{contentType: 'audio/mp4'}],
|
||||
videoCapabilities: [{contentType: 'video/mp4'}],
|
||||
audioCapabilities: [{contentType: AUDIO_MP4_AAC}],
|
||||
videoCapabilities: [{contentType: VIDEO_MP4_H264}],
|
||||
},
|
||||
shouldPass: true,
|
||||
},
|
||||
|
@ -115,7 +122,7 @@ var tests = [
|
|||
options: [
|
||||
{
|
||||
initDataTypes: ['cenc'],
|
||||
videoCapabilities: [{contentType: 'video/mp4'}],
|
||||
videoCapabilities: [{contentType: VIDEO_MP4_H264}],
|
||||
}
|
||||
],
|
||||
shouldPass: false,
|
||||
|
@ -125,7 +132,7 @@ var tests = [
|
|||
options: [
|
||||
{
|
||||
initDataTypes: ['bogus'],
|
||||
audioCapabilities: [{contentType: 'audio/mp4'}],
|
||||
audioCapabilities: [{contentType: AUDIO_MP4_AAC}],
|
||||
}
|
||||
],
|
||||
shouldPass: false,
|
||||
|
@ -136,13 +143,13 @@ var tests = [
|
|||
{
|
||||
label: SUPPORTED_LABEL,
|
||||
initDataTypes: ['bogus', 'invalid', 'cenc'],
|
||||
audioCapabilities: [{contentType: 'audio/mp4'}],
|
||||
audioCapabilities: [{contentType: AUDIO_MP4_AAC}],
|
||||
}
|
||||
],
|
||||
expectedConfig: {
|
||||
label: SUPPORTED_LABEL,
|
||||
initDataTypes: ['cenc'],
|
||||
audioCapabilities: [{contentType: 'audio/mp4'}],
|
||||
audioCapabilities: [{contentType: AUDIO_MP4_AAC}],
|
||||
},
|
||||
shouldPass: true,
|
||||
},
|
||||
|
@ -161,7 +168,7 @@ var tests = [
|
|||
options: [
|
||||
{
|
||||
initDataTypes: ['cenc'],
|
||||
videoCapabilities: [{contentType: 'video/mp4'}],
|
||||
videoCapabilities: [{contentType: VIDEO_MP4_H264}],
|
||||
distinctiveIdentifier: 'bogus',
|
||||
persistentState: 'bogus',
|
||||
}
|
||||
|
@ -173,7 +180,7 @@ var tests = [
|
|||
options: [
|
||||
{
|
||||
initDataTypes: ['cenc'],
|
||||
videoCapabilities: [{contentType: 'video/mp4'}],
|
||||
videoCapabilities: [{contentType: VIDEO_MP4_H264}],
|
||||
distinctiveIdentifier: 'required',
|
||||
}
|
||||
],
|
||||
|
@ -184,7 +191,7 @@ var tests = [
|
|||
options: [
|
||||
{
|
||||
initDataTypes: ['cenc'],
|
||||
videoCapabilities: [{contentType: 'video/mp4'}],
|
||||
videoCapabilities: [{contentType: VIDEO_MP4_H264}],
|
||||
persistentState: 'bogus',
|
||||
}
|
||||
],
|
||||
|
@ -195,7 +202,7 @@ var tests = [
|
|||
options: [
|
||||
{
|
||||
initDataTypes: ['cenc'],
|
||||
videoCapabilities: [{contentType: 'video/mp4', robustness: 'very much so'}],
|
||||
videoCapabilities: [{contentType: VIDEO_MP4_H264, robustness: 'very much so'}],
|
||||
}
|
||||
],
|
||||
shouldPass: false,
|
||||
|
@ -206,14 +213,14 @@ var tests = [
|
|||
{
|
||||
label: SUPPORTED_LABEL,
|
||||
initDataTypes: ['cenc'],
|
||||
videoCapabilities: [{contentType: 'video/mp4'}],
|
||||
videoCapabilities: [{contentType: VIDEO_MP4_H264}],
|
||||
unexpectedEntry: 'this should be ignored',
|
||||
}
|
||||
],
|
||||
expectedConfig: {
|
||||
label: SUPPORTED_LABEL,
|
||||
initDataTypes: ['cenc'],
|
||||
videoCapabilities: [{contentType: 'video/mp4'}],
|
||||
videoCapabilities: [{contentType: VIDEO_MP4_H264}],
|
||||
},
|
||||
shouldPass: true,
|
||||
},
|
||||
|
@ -227,13 +234,13 @@ var tests = [
|
|||
{
|
||||
label: SUPPORTED_LABEL,
|
||||
initDataTypes: ['cenc'],
|
||||
videoCapabilities: [{contentType: 'video/mp4'}],
|
||||
videoCapabilities: [{contentType: VIDEO_MP4_H264}],
|
||||
}
|
||||
],
|
||||
expectedConfig: {
|
||||
label: SUPPORTED_LABEL,
|
||||
initDataTypes: ['cenc'],
|
||||
videoCapabilities: [{contentType: 'video/mp4'}],
|
||||
videoCapabilities: [{contentType: VIDEO_MP4_H264}],
|
||||
},
|
||||
shouldPass: true,
|
||||
},
|
||||
|
@ -242,7 +249,7 @@ var tests = [
|
|||
options: [
|
||||
{
|
||||
initDataTypes: ['cenc'],
|
||||
videoCapabilities: [{contentType: 'video/mp4'}],
|
||||
videoCapabilities: [{contentType: VIDEO_MP4_H264}],
|
||||
sessionTypes: ['persistent-license'],
|
||||
persistentState: 'optional',
|
||||
}
|
||||
|
@ -254,7 +261,7 @@ var tests = [
|
|||
options: [
|
||||
{
|
||||
initDataTypes: ['cenc'],
|
||||
videoCapabilities: [{contentType: 'video/mp4'}],
|
||||
videoCapabilities: [{contentType: VIDEO_MP4_H264}],
|
||||
sessionTypes: ['persistent-usage-record'],
|
||||
persistentState: 'optional',
|
||||
}
|
||||
|
@ -267,13 +274,13 @@ var tests = [
|
|||
{
|
||||
label: SUPPORTED_LABEL,
|
||||
initDataTypes: ['cenc'],
|
||||
audioCapabilities: [{contentType: 'audio/mp4'}],
|
||||
audioCapabilities: [{contentType: AUDIO_MP4_AAC}],
|
||||
}
|
||||
],
|
||||
expectedConfig: {
|
||||
label: SUPPORTED_LABEL,
|
||||
initDataTypes: ['cenc'],
|
||||
audioCapabilities: [{contentType: 'audio/mp4'}],
|
||||
audioCapabilities: [{contentType: AUDIO_MP4_AAC}],
|
||||
},
|
||||
shouldPass: true,
|
||||
},
|
||||
|
@ -283,13 +290,13 @@ var tests = [
|
|||
{
|
||||
label: SUPPORTED_LABEL,
|
||||
initDataTypes: ['cenc'],
|
||||
audioCapabilities: [{contentType: 'audio/mp4; codecs="mp4a.40.2"'}],
|
||||
audioCapabilities: [{contentType: AUDIO_MP4_AAC}],
|
||||
}
|
||||
],
|
||||
expectedConfig: {
|
||||
label: SUPPORTED_LABEL,
|
||||
initDataTypes: ['cenc'],
|
||||
audioCapabilities: [{contentType: 'audio/mp4; codecs="mp4a.40.2"'}],
|
||||
audioCapabilities: [{contentType: AUDIO_MP4_AAC}],
|
||||
},
|
||||
shouldPass: true,
|
||||
},
|
||||
|
@ -339,13 +346,13 @@ var tests = [
|
|||
{
|
||||
label: SUPPORTED_LABEL,
|
||||
initDataTypes: ['cenc'],
|
||||
videoCapabilities: [{contentType: 'video/mp4; codecs="avc1.42E01E"'}],
|
||||
videoCapabilities: [{contentType: VIDEO_MP4_H264}],
|
||||
}
|
||||
],
|
||||
expectedConfig: {
|
||||
label: SUPPORTED_LABEL,
|
||||
initDataTypes: ['cenc'],
|
||||
videoCapabilities: [{contentType: 'video/mp4; codecs="avc1.42E01E"'}],
|
||||
videoCapabilities: [{contentType: VIDEO_MP4_H264}],
|
||||
},
|
||||
shouldPass: true,
|
||||
},
|
||||
|
@ -375,15 +382,15 @@ var tests = [
|
|||
{
|
||||
label: SUPPORTED_LABEL,
|
||||
initDataTypes: ['cenc'],
|
||||
videoCapabilities: [{contentType: 'video/mp4; codecs="avc1.42E01E"'}],
|
||||
audioCapabilities: [{contentType: 'audio/mp4; codecs="mp4a.40.2"'}],
|
||||
audioCapabilities: [{contentType: AUDIO_MP4_AAC}],
|
||||
videoCapabilities: [{contentType: VIDEO_MP4_H264}],
|
||||
}
|
||||
],
|
||||
expectedConfig: {
|
||||
label: SUPPORTED_LABEL,
|
||||
initDataTypes: ['cenc'],
|
||||
videoCapabilities: [{contentType: 'video/mp4; codecs="avc1.42E01E"'}],
|
||||
audioCapabilities: [{contentType: 'audio/mp4; codecs="mp4a.40.2"'}],
|
||||
audioCapabilities: [{contentType: AUDIO_MP4_AAC}],
|
||||
videoCapabilities: [{contentType: VIDEO_MP4_H264}],
|
||||
},
|
||||
shouldPass: true,
|
||||
},
|
||||
|
@ -393,13 +400,13 @@ var tests = [
|
|||
{
|
||||
label: SUPPORTED_LABEL,
|
||||
initDataTypes: ['webm'],
|
||||
videoCapabilities: [{contentType: 'video/webm'}],
|
||||
videoCapabilities: [{contentType: VIDEO_WEBM_VP9}],
|
||||
}
|
||||
],
|
||||
expectedConfig: {
|
||||
label: SUPPORTED_LABEL,
|
||||
initDataTypes: ['webm'],
|
||||
videoCapabilities: [{contentType: 'video/webm'}],
|
||||
videoCapabilities: [{contentType: VIDEO_WEBM_VP9}],
|
||||
},
|
||||
shouldPass: true,
|
||||
},
|
||||
|
@ -409,13 +416,13 @@ var tests = [
|
|||
{
|
||||
label: SUPPORTED_LABEL,
|
||||
initDataTypes: ['webm'],
|
||||
audioCapabilities: [{contentType: 'audio/webm'}],
|
||||
audioCapabilities: [{contentType: AUDIO_WEBM_VORBIS}],
|
||||
}
|
||||
],
|
||||
expectedConfig: {
|
||||
label: SUPPORTED_LABEL,
|
||||
initDataTypes: ['webm'],
|
||||
audioCapabilities: [{contentType: 'audio/webm'}],
|
||||
audioCapabilities: [{contentType: AUDIO_WEBM_VORBIS}],
|
||||
},
|
||||
shouldPass: true,
|
||||
},
|
||||
|
@ -425,15 +432,15 @@ var tests = [
|
|||
{
|
||||
label: SUPPORTED_LABEL,
|
||||
initDataTypes: ['webm'],
|
||||
videoCapabilities: [{contentType: 'video/webm;codecs="vp8"'}],
|
||||
audioCapabilities: [{contentType: 'audio/webm;codecs="vorbis"'}],
|
||||
videoCapabilities: [{contentType: VIDEO_WEBM_VP8}],
|
||||
audioCapabilities: [{contentType: AUDIO_WEBM_VORBIS}],
|
||||
}
|
||||
],
|
||||
expectedConfig: {
|
||||
label: SUPPORTED_LABEL,
|
||||
initDataTypes: ['webm'],
|
||||
videoCapabilities: [{contentType: 'video/webm;codecs="vp8"'}],
|
||||
audioCapabilities: [{contentType: 'audio/webm;codecs="vorbis"'}],
|
||||
videoCapabilities: [{contentType: VIDEO_WEBM_VP8}],
|
||||
audioCapabilities: [{contentType: AUDIO_WEBM_VORBIS}],
|
||||
},
|
||||
shouldPass: true,
|
||||
},
|
||||
|
@ -443,15 +450,15 @@ var tests = [
|
|||
{
|
||||
label: SUPPORTED_LABEL,
|
||||
initDataTypes: ['webm'],
|
||||
videoCapabilities: [{contentType: 'video/webm;codecs="vp9"'}],
|
||||
audioCapabilities: [{contentType: 'audio/webm;codecs="vorbis"'}],
|
||||
videoCapabilities: [{contentType: VIDEO_WEBM_VP9}],
|
||||
audioCapabilities: [{contentType: AUDIO_WEBM_VORBIS}],
|
||||
}
|
||||
],
|
||||
expectedConfig: {
|
||||
label: SUPPORTED_LABEL,
|
||||
initDataTypes: ['webm'],
|
||||
videoCapabilities: [{contentType: 'video/webm;codecs="vp9"'}],
|
||||
audioCapabilities: [{contentType: 'audio/webm;codecs="vorbis"'}],
|
||||
videoCapabilities: [{contentType: VIDEO_WEBM_VP9}],
|
||||
audioCapabilities: [{contentType: AUDIO_WEBM_VORBIS}],
|
||||
},
|
||||
shouldPass: true,
|
||||
},
|
||||
|
|
|
@ -58,8 +58,8 @@
|
|||
|
||||
function LoadEME() {
|
||||
var options = [{
|
||||
initDataType: "cenc",
|
||||
videoType: test.track.type,
|
||||
initDataTypes: ['cenc'],
|
||||
videoCapabilities: [{contentType: test.track.type}],
|
||||
}];
|
||||
|
||||
return navigator.requestMediaKeySystemAccess("org.w3.clearkey", options)
|
||||
|
@ -143,4 +143,4 @@
|
|||
</pre>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
</html>
|
||||
|
|
|
@ -84,7 +84,7 @@ function runTest(config, qualifier) {
|
|||
|
||||
// Tests for trivial configurations.
|
||||
expect_error(config.keysystem, [], 'TypeError', 'Empty supportedConfigurations');
|
||||
expect_config(config.keysystem, [{}], {}, 'Empty configuration');
|
||||
expect_error(config.keysystem, [{}], 'NotSupportedError', 'Empty configuration');
|
||||
|
||||
// Various combinations of supportedConfigurations.
|
||||
expect_config(config.keysystem, [{
|
||||
|
@ -156,13 +156,13 @@ function runTest(config, qualifier) {
|
|||
}], 'NotSupportedError', 'Mismatched audio container/codec (%audiocontenttype)');
|
||||
|
||||
expect_config(config.keysystem, [
|
||||
{initDataTypes: ['fakeidt']},
|
||||
{initDataTypes: [config.initDataType]}
|
||||
], {initDataTypes: [config.initDataType]}, 'Two configurations, one supported');
|
||||
{initDataTypes: ['fakeidt'], videoCapabilities: [{contentType: config.videoType}] },
|
||||
{initDataTypes: [config.initDataType], videoCapabilities: [{contentType: config.videoType}]}
|
||||
], {initDataTypes: [config.initDataType], videoCapabilities: [{contentType: config.videoType}]}, 'Two configurations, one supported');
|
||||
|
||||
expect_config(config.keysystem, [
|
||||
{initDataTypes: [config.initDataType]},
|
||||
{}
|
||||
{initDataTypes: [config.initDataType], videoCapabilities: [{contentType: config.videoType}]},
|
||||
{videoCapabilities: [{contentType: config.videoType}]}
|
||||
], {initDataTypes: [config.initDataType]}, 'Two configurations, both supported');
|
||||
|
||||
// Audio MIME type does not support video codecs.
|
||||
|
|
Загрузка…
Ссылка в новой задаче