<!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>