зеркало из https://github.com/mozilla/gecko-dev.git
234 строки
12 KiB
HTML
234 строки
12 KiB
HTML
<!DOCTYPE html>
|
|
<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
|
|
<html>
|
|
<head>
|
|
<title>SourceBuffer.buffered test cases.</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>
|
|
var subType = MediaSourceUtil.getSubType(MediaSourceUtil.AUDIO_ONLY_TYPE);
|
|
|
|
var manifestFilenameA = subType + "/test-a-128k-44100Hz-1ch-manifest.json";
|
|
var manifestFilenameB = subType + "/test-v-128k-320x240-30fps-10kfr-manifest.json";
|
|
|
|
// Audio track expectations
|
|
var expectationsA = {
|
|
webm: "{ [0.000, 2.023) }",
|
|
mp4: "{ [0.000, 2.043) }",
|
|
};
|
|
|
|
// Video track expectations
|
|
var expectationsB = {
|
|
webm: "{ [0.000, 2.001) }",
|
|
mp4: "{ [0.067, 2.067) }",
|
|
};
|
|
|
|
// Audio and Video intersection expectations.
|
|
// https://w3c.github.io/media-source/index.html#dom-sourcebuffer-buffered
|
|
// When mediaSource.readyState is "ended", then set the end time on the last range in track ranges to highest end time.
|
|
var expectationsC = {
|
|
webm: ["{ [0.000, 2.001) }", "{ [0.000, 2.023) }"],
|
|
mp4: ["{ [0.067, 2.043) }", "{ [0.067, 2.067) }"]
|
|
};
|
|
|
|
function mediaSourceDemuxedTest(callback, description)
|
|
{
|
|
mediasource_test(function(test, mediaElement, mediaSource)
|
|
{
|
|
mediaElement.pause();
|
|
mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
|
|
mediaElement.addEventListener("ended", test.step_func_done());
|
|
|
|
MediaSourceUtil.fetchManifestAndData(test, manifestFilenameA, function(typeA, dataA)
|
|
{
|
|
MediaSourceUtil.fetchManifestAndData(test, manifestFilenameB, function(typeB, dataB)
|
|
{
|
|
mediaSource.addSourceBuffer(typeA);
|
|
mediaSource.addSourceBuffer(typeB);
|
|
assert_equals(mediaSource.sourceBuffers.length, 2);
|
|
|
|
callback(test, mediaElement, mediaSource, dataA, dataB);
|
|
});
|
|
});
|
|
}, description);
|
|
};
|
|
|
|
function appendData(test, mediaSource, dataA, dataB, callback)
|
|
{
|
|
var sourceBufferA = mediaSource.sourceBuffers[0];
|
|
var sourceBufferB = mediaSource.sourceBuffers[1];
|
|
|
|
test.expectEvent(sourceBufferA, "update");
|
|
test.expectEvent(sourceBufferA, "updateend");
|
|
sourceBufferA.appendBuffer(dataA);
|
|
|
|
test.expectEvent(sourceBufferB, "update");
|
|
test.expectEvent(sourceBufferB, "updateend");
|
|
sourceBufferB.appendBuffer(dataB);
|
|
|
|
test.waitForExpectedEvents(function()
|
|
{
|
|
callback();
|
|
});
|
|
}
|
|
|
|
mediaSourceDemuxedTest(function(test, mediaElement, mediaSource, dataA, dataB) {
|
|
test.expectEvent(mediaElement, "loadedmetadata");
|
|
appendData(test, mediaSource, dataA, dataB, function()
|
|
{
|
|
var expectedBeforeEndOfStreamIntersection = expectationsC[subType][0];
|
|
var expectedAfterEndOfStreamIntersection = expectationsC[subType][1];
|
|
|
|
assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectationsA[subType], "mediaSource.activeSourceBuffers[0]");
|
|
assertBufferedEquals(mediaSource.activeSourceBuffers[1], expectationsB[subType], "mediaSource.activeSourceBuffers[1]");
|
|
assertBufferedEquals(mediaElement, expectedBeforeEndOfStreamIntersection, "mediaElement.buffered");
|
|
|
|
mediaSource.endOfStream();
|
|
|
|
assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectationsA[subType], "mediaSource.activeSourceBuffers[0]");
|
|
assertBufferedEquals(mediaSource.activeSourceBuffers[1], expectationsB[subType], "mediaSource.activeSourceBuffers[1]");
|
|
assertBufferedEquals(mediaElement, expectedAfterEndOfStreamIntersection, "mediaElement.buffered");
|
|
|
|
test.done();
|
|
});
|
|
}, "Demuxed content with different lengths");
|
|
|
|
mediasource_test(function(test, mediaElement, mediaSource)
|
|
{
|
|
mediaElement.pause();
|
|
mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
|
|
mediaElement.addEventListener("ended", test.step_func_done());
|
|
|
|
MediaSourceUtil.fetchManifestAndData(test, subType + "/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr-manifest.json", function(type, data)
|
|
{
|
|
var sourceBuffer = mediaSource.addSourceBuffer(type);
|
|
test.expectEvent(sourceBuffer, "update");
|
|
test.expectEvent(sourceBuffer, "updateend");
|
|
sourceBuffer.appendBuffer(data);
|
|
|
|
test.waitForExpectedEvents(function()
|
|
{
|
|
var expectationsAV = {
|
|
webm: ["{ [0.003, 2.004) }", "{ [0.003, 2.023) }"],
|
|
mp4: ["{ [0.067, 2.043) }", "{ [0.067, 2.067) }"],
|
|
};
|
|
|
|
var expectedBeforeEndOfStream = expectationsAV[subType][0];
|
|
var expectedAfterEndOfStream = expectationsAV[subType][1];
|
|
|
|
assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectedBeforeEndOfStream, "mediaSource.activeSourceBuffers[0]");
|
|
assertBufferedEquals(mediaElement, expectedBeforeEndOfStream, "mediaElement.buffered");
|
|
|
|
mediaSource.endOfStream();
|
|
|
|
assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectedAfterEndOfStream, "mediaSource.activeSourceBuffers[0]");
|
|
assertBufferedEquals(mediaElement, expectedAfterEndOfStream, "mediaElement.buffered");
|
|
|
|
test.done();
|
|
});
|
|
});
|
|
}, "Muxed content with different lengths");
|
|
|
|
mediaSourceDemuxedTest(function(test, mediaElement, mediaSource, dataA, dataB) {
|
|
var dataBSize = {
|
|
webm: 318,
|
|
mp4: 835,
|
|
};
|
|
test.expectEvent(mediaElement, "loadedmetadata");
|
|
appendData(test, mediaSource, dataA, dataB.subarray(0, dataBSize[subType]), function()
|
|
{
|
|
assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectationsA[subType], "mediaSource.activeSourceBuffers[0]");
|
|
assertBufferedEquals(mediaSource.activeSourceBuffers[1], "{ }", "mediaSource.activeSourceBuffers[1]");
|
|
assertBufferedEquals(mediaElement, "{ }", "mediaElement.buffered");
|
|
|
|
mediaSource.endOfStream();
|
|
|
|
assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectationsA[subType], "mediaSource.activeSourceBuffers[0]");
|
|
assertBufferedEquals(mediaSource.activeSourceBuffers[1], "{ }", "mediaSource.activeSourceBuffers[1]");
|
|
assertBufferedEquals(mediaElement, "{ }", "mediaElement.buffered");
|
|
|
|
test.done();
|
|
});
|
|
}, "Demuxed content with an empty buffered range on one SourceBuffer");
|
|
|
|
mediasource_test(function(test, mediaElement, mediaSource)
|
|
{
|
|
mediaElement.pause();
|
|
mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
|
|
mediaElement.addEventListener("ended", test.step_func_done());
|
|
|
|
MediaSourceUtil.fetchManifestAndData(test, subType + "/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr-manifest.json", function(type, data)
|
|
{
|
|
var sourceBuffer = mediaSource.addSourceBuffer(type);
|
|
test.expectEvent(mediaElement, "loadedmetadata");
|
|
test.expectEvent(sourceBuffer, "update");
|
|
test.expectEvent(sourceBuffer, "updateend");
|
|
sourceBuffer.appendBuffer(data.subarray(0, 4052));
|
|
|
|
test.waitForExpectedEvents(function()
|
|
{
|
|
assertBufferedEquals(mediaSource.activeSourceBuffers[0], "{ }", "mediaSource.activeSourceBuffers[0]");
|
|
assertBufferedEquals(mediaElement, "{ }", "mediaElement.buffered");
|
|
|
|
mediaSource.endOfStream();
|
|
|
|
assertBufferedEquals(mediaSource.activeSourceBuffers[0], "{ }", "mediaSource.activeSourceBuffers[0]");
|
|
assertBufferedEquals(mediaElement, "{ }", "mediaElement.buffered");
|
|
|
|
test.done();
|
|
});
|
|
});
|
|
}, "Muxed content empty buffered ranges.");
|
|
|
|
mediasource_test(function(test, mediaElement, mediaSource)
|
|
{
|
|
mediaElement.pause();
|
|
mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
|
|
mediaElement.addEventListener("ended", test.step_func_done());
|
|
|
|
var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_ONLY_TYPE);
|
|
|
|
assertBufferedEquals(mediaSource.sourceBuffers[0], "{ }", "mediaSource.sourceBuffers[0]");
|
|
assertBufferedEquals(mediaElement, "{ }", "mediaElement.buffered");
|
|
test.done();
|
|
|
|
}, "Get buffered range when sourcebuffer is empty.");
|
|
|
|
mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
|
|
{
|
|
var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init);
|
|
|
|
test.expectEvent(mediaElement, "loadedmetadata");
|
|
test.expectEvent(sourceBuffer, "updateend", "initSegment append ended.");
|
|
sourceBuffer.appendBuffer(initSegment);
|
|
test.waitForExpectedEvents(function()
|
|
{
|
|
assertBufferedEquals(mediaSource.sourceBuffers[0], "{ }", "mediaSource.sourceBuffers[0]");
|
|
assertBufferedEquals(mediaSource.activeSourceBuffers[0], "{ }", "mediaSource.activeSourceBuffers[0]");
|
|
assertBufferedEquals(mediaElement, "{ }", "mediaElement.buffered");
|
|
test.done();
|
|
});
|
|
|
|
}, "Get buffered range when only init segment is appended.");
|
|
|
|
mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
|
|
{
|
|
test.expectEvent(mediaSource.sourceBuffers, "removesourcebuffer", "SourceBuffer removed.");
|
|
mediaSource.removeSourceBuffer(sourceBuffer);
|
|
|
|
test.waitForExpectedEvents(function()
|
|
{
|
|
assert_throws("InvalidStateError",
|
|
function() { sourceBuffer.buffered; },
|
|
"get sourceBuffer.buffered throws an exception for InvalidStateError.");
|
|
test.done();
|
|
});
|
|
}, "Get buffered range after removing sourcebuffer.");
|
|
</script>
|
|
</body>
|
|
</html>
|