blob: 02ebecc7738aba01759d0b3d464a28f26862edc0 [file] [log] [blame]
<!DOCTYPE html>
<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
<html>
<head>
<title>Checks MediaSource.activeSourceBuffers and changes to selected/enabled track state</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="mediasource-util.js"></script>
</head>
<body>
<div id="log"></div>
<script>
// Audio / Video files supported by the user agent under test
var subType = MediaSourceUtil.getSubType(MediaSourceUtil.AUDIO_ONLY_TYPE);
var manifestFilenameAudio = subType + "/test-a-128k-44100Hz-1ch-manifest.json";
var manifestFilenameVideo = subType + "/test-v-128k-320x240-30fps-10kfr-manifest.json";
var manifestFilenameAV = subType + "/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr-manifest.json";
mediasource_test(function(test, mediaElement, mediaSource)
{
mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
MediaSourceUtil.fetchManifestAndData(test, manifestFilenameAudio, function (typeAudio, dataAudio)
{
var sourceBuffer = mediaSource.addSourceBuffer(typeAudio);
assert_equals(mediaSource.sourceBuffers.length, 1,
"sourceBuffers list contains one SourceBuffer");
assert_equals(mediaSource.activeSourceBuffers.length, 0,
"activeSourceBuffers is empty to start with");
test.expectEvent(mediaSource.activeSourceBuffers, "addsourcebuffer");
test.expectEvent(mediaElement, "loadedmetadata");
sourceBuffer.appendBuffer(dataAudio);
test.waitForExpectedEvents(function()
{
assert_equals(mediaSource.activeSourceBuffers.length, 1,
"activeSourceBuffers updated when media element is loaded");
assert_equals(mediaSource.activeSourceBuffers[0], sourceBuffer,
"activeSourceBuffers contains sourceBuffer when media element is loaded");
test.done();
});
});
}, "SourceBuffer added to activeSourceBuffers list when its only audio track gets loaded (and thus becomes enabled).");
mediasource_test(function(test, mediaElement, mediaSource)
{
mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
MediaSourceUtil.fetchManifestAndData(test, manifestFilenameVideo, function (typeVideo, dataVideo)
{
var sourceBuffer = mediaSource.addSourceBuffer(typeVideo);
assert_equals(mediaSource.sourceBuffers.length, 1,
"sourceBuffers list contains one SourceBuffer");
assert_equals(mediaSource.activeSourceBuffers.length, 0,
"activeSourceBuffers is empty to start with");
test.expectEvent(mediaSource.activeSourceBuffers, "addsourcebuffer");
test.expectEvent(mediaElement, "loadedmetadata");
sourceBuffer.appendBuffer(dataVideo);
test.waitForExpectedEvents(function()
{
assert_equals(mediaSource.activeSourceBuffers.length, 1,
"activeSourceBuffers updated when media element is loaded");
assert_equals(mediaSource.activeSourceBuffers[0], sourceBuffer,
"activeSourceBuffers contains sourceBuffer when media element is loaded");
test.done();
});
});
}, "SourceBuffer added to activeSourceBuffers list when its only video track gets loaded (and thus becomes selected).");
function mediaSourceActiveSourceBufferOrderTest(addAudioFirst, appendAudioFirst)
{
mediasource_test(function(test, mediaElement, mediaSource)
{
mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
MediaSourceUtil.fetchManifestAndData(test, manifestFilenameAudio, function (typeAudio, dataAudio)
{
MediaSourceUtil.fetchManifestAndData(test, manifestFilenameVideo, function (typeVideo, dataVideo)
{
var sourceBufferAudio, sourceBufferVideo, expectedFirstSB, expectedSecondSB;
if (addAudioFirst) {
expectedFirstSB = sourceBufferAudio = mediaSource.addSourceBuffer(typeAudio);
expectedSecondSB = sourceBufferVideo = mediaSource.addSourceBuffer(typeVideo);
} else {
expectedFirstSB = sourceBufferVideo = mediaSource.addSourceBuffer(typeVideo);
expectedSecondSB = sourceBufferAudio = mediaSource.addSourceBuffer(typeAudio);
}
assert_equals(mediaSource.activeSourceBuffers.length, 0,
"activeSourceBuffers is empty to start with");
assert_equals(mediaSource.sourceBuffers.length, 2,
"sourceBuffers list contains both SourceBuffers");
assert_equals(mediaSource.sourceBuffers[0], expectedFirstSB,
"first SourceBuffer matches expectation");
assert_equals(mediaSource.sourceBuffers[1], expectedSecondSB,
"second SourceBuffer matches expectation");
test.expectEvent(mediaSource.activeSourceBuffers, "addsourcebuffer");
test.expectEvent(mediaSource.activeSourceBuffers, "addsourcebuffer");
test.expectEvent(mediaElement, "loadedmetadata");
if (appendAudioFirst) {
sourceBufferAudio.appendBuffer(dataAudio);
sourceBufferVideo.appendBuffer(dataVideo);
} else {
sourceBufferVideo.appendBuffer(dataVideo);
sourceBufferAudio.appendBuffer(dataAudio);
}
test.waitForExpectedEvents(function()
{
assert_equals(mediaSource.activeSourceBuffers.length, 2,
"activeSourceBuffers list updated when tracks are loaded");
assert_equals(mediaSource.activeSourceBuffers[0], mediaSource.sourceBuffers[0],
"first active SourceBuffer matches first SourceBuffer");
assert_equals(mediaSource.activeSourceBuffers[1], mediaSource.sourceBuffers[1],
"second active SourceBuffer matches second SourceBuffer");
test.done();
});
});
});
},
"Active SourceBuffers must appear in the same order as they appear in the sourceBuffers attribute: " +
(addAudioFirst ? "audio is first sourceBuffer" : "video is first sourceBuffer") + ", " +
(appendAudioFirst ? "audio media appended first" : "video media appended first"));
}
mediaSourceActiveSourceBufferOrderTest(true, true);
mediaSourceActiveSourceBufferOrderTest(true, false);
mediaSourceActiveSourceBufferOrderTest(false, true);
mediaSourceActiveSourceBufferOrderTest(false, false);
mediasource_test(function(test, mediaElement, mediaSource)
{
mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
MediaSourceUtil.fetchManifestAndData(test, manifestFilenameAudio, function (typeAudio, dataAudio)
{
MediaSourceUtil.fetchManifestAndData(test, manifestFilenameVideo, function (typeVideo, dataVideo)
{
var sourceBufferAudio = mediaSource.addSourceBuffer(typeAudio);
var sourceBufferVideo = mediaSource.addSourceBuffer(typeVideo);
test.expectEvent(sourceBufferAudio.audioTracks, "addtrack");
test.expectEvent(sourceBufferVideo.videoTracks, "addtrack");
sourceBufferAudio.appendBuffer(dataAudio);
sourceBufferVideo.appendBuffer(dataVideo);
test.waitForExpectedEvents(function()
{
assert_equals(mediaSource.activeSourceBuffers.length, 2,
"activeSourceBuffers list updated when tracks are loaded");
assert_equals(sourceBufferAudio.audioTracks.length, 1,
"audio track list contains loaded audio track");
assert_equals(sourceBufferVideo.videoTracks.length, 1,
"video track list contains loaded video track");
test.expectEvent(mediaSource.activeSourceBuffers, "removesourcebuffer");
sourceBufferAudio.audioTracks[0].enabled = false;
});
test.waitForExpectedEvents(function()
{
assert_equals(mediaSource.activeSourceBuffers.length, 1,
"audio source buffer no longer in the activeSourceBuffers list");
assert_equals(mediaSource.activeSourceBuffers[0], sourceBufferVideo,
"activeSourceBuffers list only contains the video SourceBuffer");
test.expectEvent(mediaSource.activeSourceBuffers, "addsourcebuffer");
test.expectEvent(mediaSource.activeSourceBuffers, "removesourcebuffer");
sourceBufferAudio.audioTracks[0].enabled = true;
sourceBufferVideo.videoTracks[0].selected = false;
});
test.waitForExpectedEvents(function()
{
assert_equals(mediaSource.activeSourceBuffers.length, 1,
"video source buffer no longer in the activeSourceBuffers list");
assert_equals(mediaSource.activeSourceBuffers[0], sourceBufferAudio,
"activeSourceBuffers list only contains the audio SourceBuffer");
test.done();
});
});
});
}, "Active SourceBuffers list reflects changes to selected audio/video tracks associated with separate SourceBuffers.");
mediasource_test(function(test, mediaElement, mediaSource)
{
mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
MediaSourceUtil.fetchManifestAndData(test, manifestFilenameAV, function (typeAV, dataAV)
{
var sourceBuffer = mediaSource.addSourceBuffer(typeAV);
test.expectEvent(sourceBuffer.audioTracks, "addtrack");
test.expectEvent(sourceBuffer.videoTracks, "addtrack");
sourceBuffer.appendBuffer(dataAV);
test.waitForExpectedEvents(function()
{
assert_equals(mediaSource.activeSourceBuffers.length, 1,
"activeSourceBuffers list updated when tracks are loaded");
assert_equals(sourceBuffer.audioTracks.length, 1,
"audio track list contains loaded audio track");
assert_equals(sourceBuffer.videoTracks.length, 1,
"video track list contains loaded video track");
mediaSource.activeSourceBuffers.addEventListener("removesourcebuffer", test.unreached_func(
"Unexpected removal from activeSourceBuffers list"));
mediaSource.activeSourceBuffers.addEventListener("addsourcebuffer", test.unreached_func(
"Unexpected insertion in activeSourceBuffers list"));
// Changes should only trigger events at the
// AudioTrack/VideoTrack instance
test.expectEvent(sourceBuffer.audioTracks, "change");
sourceBuffer.audioTracks[0].enabled = false;
});
test.waitForExpectedEvents(function()
{
assert_equals(mediaSource.activeSourceBuffers.length, 1,
"activeSourceBuffers list unchanged");
test.expectEvent(sourceBuffer.videoTracks, "change");
sourceBuffer.audioTracks[0].enabled = true;
sourceBuffer.videoTracks[0].selected = false;
});
test.waitForExpectedEvents(function()
{
assert_equals(mediaSource.activeSourceBuffers.length, 1,
"activeSourceBuffers list unchanged");
test.done();
});
});
}, "Active SourceBuffers list ignores changes to selected audio/video tracks " +
"that do not affect the activation of the SourceBuffer.");
</script>
</body>
</html>