Revision d0d62244432d329aa22e9278d3e83184301c3e7f authored by Chris Nardi on 07 April 2018, 01:36:26 UTC, committed by Xidorn Quan on 07 April 2018, 02:05:46 UTC
See https://github.com/w3c/csswg-drafts/issues/2509#issuecomment-379152590 for the change to target9. Also remove the extra whitespace in target8 and target1 which causes these tests to fail in Chrome and Firefox.

Also remove testcase.propertyName from each test's name as this doesn't exist and just outputs undefined.
1 parent 6e68c44
Raw File
mediasource-buffered.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>
back to top