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:
Chris Pearce 2017-05-11 14:23:33 +12:00
Родитель 0078b05711
Коммит 5064845788
8 изменённых файлов: 65 добавлений и 75 удалений

Просмотреть файл

@ -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.