blob: 69ff7bc9af5bbc15c81730d6e9247ddd93c90f77 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<script src="/w3c/resources/testharness.js"></script>
<script src="/w3c/resources/testharnessreport.js"></script>
<script src="mediasource-util.js"></script>
</head>
<body>
<script>
function verifyTrackProperties(trackType, track, expectedTrackInfo) {
assert_equals(track.kind, expectedTrackInfo.kind, trackType + ".kind");
assert_equals(track.label, expectedTrackInfo.label, trackType + ".label");
assert_equals(track.language, expectedTrackInfo.language, trackType + ".language");
}
function loadMediaAndVerifyAddedTracks(test, mediaElement, segmentInfo, sourceBuffer, mediaData, expectedAudioTrackInfo, expectedVideoTrackInfo, successCallback)
{
var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init);
test.expectEvent(sourceBuffer.audioTracks, "addtrack", "sourceBuffer.audioTracks addtrack event");
test.expectEvent(sourceBuffer.videoTracks, "addtrack", "sourceBuffer.videoTracks addtrack event");
test.expectEvent(mediaElement.audioTracks, "addtrack", "mediaElement.audioTracks addtrack event");
test.expectEvent(mediaElement.videoTracks, "addtrack", "mediaElement.videoTracks addtrack event");
test.expectEvent(mediaElement, "loadedmetadata", "loadedmetadata done.");
test.expectEvent(sourceBuffer, "updateend", "initSegment append ended.");
sourceBuffer.appendBuffer(initSegment);
test.waitForExpectedEvents(function()
{
assert_equals(sourceBuffer.audioTracks.length, 1, "audioTracks.length");
verifyTrackProperties("audio", sourceBuffer.audioTracks[0], expectedAudioTrackInfo);
assert_equals(sourceBuffer.audioTracks[0].sourceBuffer, sourceBuffer, "audioTrack.sourceBuffer");
// The first audio track is enabled by default.
assert_true(sourceBuffer.audioTracks[0].enabled, "sourceBuffer.audioTracks[0].enabled");
assert_equals(sourceBuffer.videoTracks.length, 1, "videoTracks.length");
verifyTrackProperties("video", sourceBuffer.videoTracks[0], expectedVideoTrackInfo);
assert_equals(sourceBuffer.videoTracks[0].sourceBuffer, sourceBuffer, "videoTrack.sourceBuffer");
// The first video track is selected by default.
assert_true(sourceBuffer.videoTracks[0].selected, "sourceBuffer.videoTracks[0].selected");
assert_not_equals(sourceBuffer.audioTracks[0].id, sourceBuffer.videoTracks[0].id, "track ids must be unique");
assert_equals(mediaElement.videoTracks.length, 1, "videoTracks.length");
assert_equals(mediaElement.videoTracks[0], sourceBuffer.videoTracks[0], "mediaElement.videoTrack == sourceBuffer.videoTrack");
assert_equals(mediaElement.audioTracks.length, 1, "audioTracks.length");
assert_equals(mediaElement.audioTracks[0], sourceBuffer.audioTracks[0], "mediaElement.audioTrack == sourceBuffer.audioTrack");
successCallback();
});
}
mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
{
var expectedAudioTrackInfo = { kind: "main", label: "", language: "" };
var expectedVideoTrackInfo = { kind: "main", label: "", language: "" };
loadMediaAndVerifyAddedTracks(test, mediaElement, segmentInfo, sourceBuffer, mediaData, expectedAudioTrackInfo, expectedVideoTrackInfo, test.step_func(function ()
{
// Now append the same exact init segment again. This should succeed, but no new tracks should
// be added to the SourceBuffer or MediaElement.
test.failOnEvent(sourceBuffer.audioTracks, "addtrack", "Unexpected addtrack event on sourceBuffer.audioTracks for second init segment");
test.failOnEvent(sourceBuffer.videoTracks, "addtrack", "Unexpected addtrack event on sourceBuffer.videoTracks for second init segment");
test.failOnEvent(mediaElement.audioTracks, "addtrack", "Unexpected addtrack event on mediaElement.audioTracks for second init segment");
test.failOnEvent(mediaElement.videoTracks, "addtrack", "Unexpected addtrack event on mediaElement.videoTracks for second init segment");
test.expectEvent(sourceBuffer, "updateend", "InitSegment append ended.");
var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init);
sourceBuffer.appendBuffer(initSegment);
test.waitForExpectedEvents(function()
{
assert_equals(mediaElement.audioTracks.length, 1, "mediaElement.audioTracks.length");
assert_equals(mediaElement.videoTracks.length, 1, "mediaElement.videoTracks.length");
assert_equals(sourceBuffer.audioTracks.length, 1, "sourceBuffer.audioTracks.length");
assert_equals(sourceBuffer.videoTracks.length, 1, "sourceBuffer.videoTracks.length");
test.done();
});
}));
}, "Same init segment appended twice");
mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
{
var originalTrackDefaults = [
new TrackDefault("audio", "audio-language", "audio-label", ["main"], "2"),
new TrackDefault("video", "video-language", "video-label", ["main"], "1")
];
var trackDefaultList = new TrackDefaultList(originalTrackDefaults.slice());
sourceBuffer.trackDefaults = trackDefaultList;
var expectedAudioTrackInfo = { kind: "main", label: "audio-label", language: "audio-language" };
var expectedVideoTrackInfo = { kind: "main", label: "video-label", language: "video-language" };
loadMediaAndVerifyAddedTracks(test, mediaElement, segmentInfo, sourceBuffer, mediaData, expectedAudioTrackInfo, expectedVideoTrackInfo, test.step_func_done());
}, "Track defaults processing in the init segment algorithm (explicit bytestream ids)");
mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
{
var originalTrackDefaults = [
new TrackDefault("audio", "audio-language", "audio-label", ["main"], ""),
new TrackDefault("video", "video-language", "video-label", ["main"], "")
];
var trackDefaultList = new TrackDefaultList(originalTrackDefaults.slice());
sourceBuffer.trackDefaults = trackDefaultList;
var expectedAudioTrackInfo = { kind: "main", label: "audio-label", language: "audio-language" };
var expectedVideoTrackInfo = { kind: "main", label: "video-label", language: "video-language" };
loadMediaAndVerifyAddedTracks(test, mediaElement, segmentInfo, sourceBuffer, mediaData, expectedAudioTrackInfo, expectedVideoTrackInfo, test.step_func_done());
}, "Track defaults processing in the init segment algorithm (no bytestream ids)");
mediasource_test(function(test, mediaElement, mediaSource)
{
var subType = MediaSourceUtil.getSubType(MediaSourceUtil.AUDIO_VIDEO_TYPE);
var manifestFilenameA = subType + '/test-a-128k-44100Hz-1ch-manifest.json';
var manifestFilenameV = subType + '/test-v-128k-320x240-30fps-10kfr-manifest.json';
MediaSourceUtil.fetchManifestAndData(test, manifestFilenameA, function(typeA, dataA)
{
MediaSourceUtil.fetchManifestAndData(test, manifestFilenameV, function(typeV, dataV)
{
var sourceBufferA = mediaSource.addSourceBuffer(typeA);
var sourceBufferV = mediaSource.addSourceBuffer(typeV);
sourceBufferA.trackDefaults = new TrackDefaultList([new TrackDefault("audio", "", "audio-label-for-track-bsid1", ["main"], "1")]);
sourceBufferV.trackDefaults = new TrackDefaultList([new TrackDefault("video", "", "video-label-for-track-bsid1", ["main"], "1")]);
test.expectEvent(mediaElement.audioTracks, "addtrack", "mediaElement.audioTracks addtrack event");
test.expectEvent(mediaElement, "loadedmetadata", "loadedmetadata done.");
test.expectEvent(sourceBufferA, "updateend", "initSegment append ended.");
test.expectEvent(sourceBufferV, "updateend", "initSegment append ended.");
sourceBufferA.appendBuffer(dataA);
sourceBufferV.appendBuffer(dataV);
test.waitForExpectedEvents(function()
{
assert_equals(mediaElement.audioTracks.length, 1, "mediaElement.audioTracks.length");
assert_equals(mediaElement.videoTracks.length, 1, "mediaElement.audioTracks.length");
assert_equals(sourceBufferA.audioTracks.length, 1, "sourceBufferA.audioTracks.length");
assert_equals(sourceBufferA.videoTracks.length, 0, "sourceBufferA.videoTracks.length");
assert_equals(sourceBufferV.audioTracks.length, 0, "sourceBufferV.audioTracks.length");
assert_equals(sourceBufferV.videoTracks.length, 1, "sourceBufferV.videoTracks.length");
// Verify that audio track bytestream id == video track bytestream id == "1"
assert_equals(sourceBufferA.audioTracks[0].label, "audio-label-for-track-bsid1", "audio track bytestream id is 1");
assert_equals(sourceBufferV.videoTracks[0].label, "video-label-for-track-bsid1", "video track bytestream id is 1");
// Track ids generated for media tracks must be unique, even though the tracks have identical bytestream ids.
assert_not_equals(sourceBufferA.audioTracks[0].id, sourceBufferV.videoTracks[0].id, "track ids must be unique");
test.done();
});
});
});
}, "Two source buffers with clashing bytestream track ids");
</script>
</body>
</html>