Bug 1016413 - Tests for fmp4 metadata backend. r=rillian

The reporting of metadata with fmp4 backend is tested here with the
file gizmo.metadata.mp4, and some changes are made on test_metadata.html
to integrate tests on mp4 files with restriction to certain platforms.
A 'type' field has also been added to gMetadataTests' elements in
manifest.js in order to correctly test the type with canPlayType method
for instance.
This commit is contained in:
Corentin Cos 2014-06-17 00:32:18 +02:00
Родитель f09bb3e0fc
Коммит 54fa326eb6
4 изменённых файлов: 116 добавлений и 37 удалений

Двоичные данные
content/media/test/gizmo.metadata.mp4 Normal file

Двоичный файл не отображается.

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

@ -486,7 +486,9 @@ var gAspectRatioTests = [
// Used by test_metadata.html.
var gMetadataTests = [
// Ogg Vorbis files
{ name:"short-video.ogv", tags: {
{ name:"short-video.ogv",
type:"video/ogg",
tags: {
TITLE:"Lepidoptera",
ARTIST:"Epoq",
ALBUM:"Kahvi Collective",
@ -494,7 +496,9 @@ var gMetadataTests = [
COMMENT:"http://www.kahvi.org",
}
},
{ name:"bug516323.ogv", tags: {
{ name:"bug516323.ogv",
type:"video/ogg",
tags: {
GENRE:"Open Movie",
ENCODER:"Audacity",
TITLE:"Elephants Dream",
@ -502,7 +506,9 @@ var gMetadataTests = [
COMMENTS:"Audio Description"
}
},
{ name:"bug516323.indexed.ogv", tags: {
{ name:"bug516323.indexed.ogv",
type:"video/ogg",
tags: {
GENRE:"Open Movie",
ENCODER:"Audacity",
TITLE:"Elephants Dream",
@ -510,17 +516,26 @@ var gMetadataTests = [
COMMENTS:"Audio Description"
}
},
{ name:"detodos.opus", tags: {
{ name:"detodos.opus",
type:"audio/ogg; codecs=opus",
tags: {
title:"De todos. Para todos.",
artist:"Mozilla.org"
}
},
{ name:"sound.ogg", tags: { } },
{ name:"small-shot.ogg", tags: {
{ name:"sound.ogg",
type:"audio/ogg",
tags: { }
},
{ name:"small-shot.ogg",
type:"video/ogg",
tags: {
title:"Pew SFX"
}
},
{ name:"badtags.ogg", tags: {
{ name:"badtags.ogg",
type:"audio/ogg",
tags: {
// We list only the valid tags here, and verify
// the invalid ones are filtered out.
title:"Invalid comments test file",
@ -535,41 +550,70 @@ var gMetadataTests = [
// "not-utf-8":"invalid sequences: \xff\xfe\xfa\xfb\0eol"
}
},
{ name:"wave_metadata.wav", tags: {
{ name:"wave_metadata.wav",
type:"audio/x-wav",
tags: {
name:"Track Title",
artist:"Artist Name",
comments:"Comments",
}
},
{ name:"wave_metadata_utf8.wav", tags: {
{ name:"wave_metadata_utf8.wav",
type:"audio/x-wav",
tags: {
name:"歌曲名稱",
artist:"作曲者",
comments:"註解",
}
},
{ name:"wave_metadata_unknown_tag.wav", tags: {
{ name:"wave_metadata_unknown_tag.wav",
type:"audio/x-wav",
tags: {
name:"Track Title",
comments:"Comments",
}
},
{ name:"wave_metadata_bad_len.wav", tags: {
{ name:"wave_metadata_bad_len.wav",
type:"audio/x-wav",
tags: {
name:"Track Title",
artist:"Artist Name",
}
},
{ name:"wave_metadata_bad_no_null.wav", tags: {
{ name:"wave_metadata_bad_no_null.wav",
type:"audio/x-wav",
tags: {
name:"Track Title",
artist:"Artist Name",
comments:"Comments!!",
}
},
{ name:"wave_metadata_bad_utf8.wav", tags: {
{ name:"wave_metadata_bad_utf8.wav",
type:"audio/x-wav",
tags: {
name:"歌曲名稱",
comments:"註解",
}
},
{ name:"wavedata_u8.wav", tags: { }
{ name:"wavedata_u8.wav",
type:"audio/x-wav",
tags: { }
},
{ name:"gizmo.metadata.mp4",
type:"video/mp4",
tags: {
artist:"Artist name",
title:"Title name",
album:"Album name",
albumArtist:"Album Artist name",
genre:"Genre name",
date:"20140326T002053.000Z",
year:"2014",
writer:"Composer name",
discNumber:"1/0",
cdTrackNumber:"1/0"
}
}
];
function checkMetadata(msg, e, test) {

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

@ -144,6 +144,7 @@ support-files =
file_access_controls.html
fragment_noplay.js
fragment_play.js
gizmo.metadata.mp4
gizmo.mp4
gizmo.mp4^headers^
huge-id3.mp3

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

@ -13,30 +13,34 @@
<script class="testbody" type="text/javascript">
var manager = new MediaTestManager;
SimpleTest.waitForExplicitFinish();
SpecialPowers.pushPrefEnv({
'set': [
["media.fragmented-mp4.ffmpeg.enabled", true],
["media.fragmented-mp4.exposed", true]
]
}, beginTest);
function startTest(test, token) {
var a = document.createElement('audio');
a.preload = "auto";
a.token = token;
manager.started(token);
function isMP4(value) {
return value === "mp4" || value === "x-m4a";
}
a.src = test.name;
a.name = test.name;
// Returns true if mp4 metadata reporting shall not be tested on the current platform
function MP4isNotTested() {
return !(
navigator.userAgent.indexOf("Linux") != -1 || // Linux
navigator.userAgent.indexOf("Windows NT 6.1") != -1 || // Windows 7
navigator.userAgent.indexOf("Windows NT 6.2") != -1 // Windows 8
);
}
// Tags should not be available immediately.
var exception_fired = false;
try {
var m = a.mozGetMetadata();
} catch (e) {
is(e.name, 'InvalidStateError',
"early mozGetMetadata() should throw InvalidStateError");
exception_fired = true;
}
ok(exception_fired,
"mozGetMetadata() should throw an exception before HAVE_METADATA");
function beginTest() {
manager.runTests(gMetadataTests, startTest);
}
// Wait until metadata has loaded.
a.addEventListener('loadedmetadata', function() {
function checkTags(event) {
var a = event.target;
var test = a.value;
// read decoded tags
tags = a.mozGetMetadata();
ok(tags, "mozGetMetadata() should return a truthy value");
@ -68,11 +72,41 @@ function startTest(test, token) {
for (tag in test.tags) {
is(tags[tag], test.tags[tag], "Tag '"+tag+"' should match");
}
manager.finished(token);
}, false);
manager.finished(a.token);
}
manager.runTests(gMetadataTests, startTest);
function startTest(test, token) {
// Tests on MP4 are restricted to certain platforms
var format = test.type.split('/')[1];
if (isMP4(format) && MP4isNotTested()) {
return;
}
var a = document.createElement(getMajorMimeType(test.type));
a.preload = "auto";
a.token = token;
manager.started(token);
a.src = test.name;
a.name = test.name;
a.value = test;
// Tags should not be available immediately.
var exception_fired = false;
try {
var m = a.mozGetMetadata();
} catch (e) {
is(e.name, 'InvalidStateError',
"early mozGetMetadata() should throw InvalidStateError");
exception_fired = true;
}
ok(exception_fired,
"mozGetMetadata() should throw an exception before HAVE_METADATA");
// Wait until metadata has loaded.
a.addEventListener('loadedmetadata', checkTags, false);
}
</script>
</pre>