tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

mediasource-buffered.html (12506B)


      1 <!DOCTYPE html>
      2 <!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
      3 <html>
      4    <head>
      5        <title>SourceBuffer.buffered test cases.</title>
      6        <script src="/resources/testharness.js"></script>
      7        <script src="/resources/testharnessreport.js"></script>
      8        <script src="mediasource-util.js"></script>
      9    </head>
     10    <body>
     11        <div id="log"></div>
     12        <script>
     13            var subType = MediaSourceUtil.getSubType(MediaSourceUtil.AUDIO_ONLY_TYPE);
     14 
     15            var manifestFilenameA = subType + "/test-a-128k-44100Hz-1ch-manifest.json";
     16            var manifestFilenameB = subType + "/test-v-128k-320x240-30fps-10kfr-manifest.json";
     17 
     18            // Audio track expectations
     19            var expectationsA = {
     20              webm: "{ [0.000, 2.023) }",
     21              mp4: "{ [0.000, 2.043) }",
     22            };
     23 
     24            // Video track expectations
     25            var expectationsB = {
     26              webm: "{ [0.000, 2.001) }",
     27              mp4: "{ [0.067, 2.067) }",
     28            };
     29 
     30            // Audio and Video intersection expectations.
     31            // https://w3c.github.io/media-source/index.html#dom-sourcebuffer-buffered
     32            // When mediaSource.readyState is "ended", then set the end time on the last range in track ranges to highest end time.
     33            var expectationsC = {
     34              webm: ["{ [0.000, 2.001) }", "{ [0.000, 2.023) }"],
     35              mp4: ["{ [0.067, 2.043) }", "{ [0.067, 2.067) }"]
     36            };
     37 
     38            function mediaSourceDemuxedTest(callback, description)
     39            {
     40                mediasource_test(function(test, mediaElement, mediaSource)
     41                {
     42                    mediaElement.pause();
     43                    mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
     44                    mediaElement.addEventListener("ended", test.step_func_done());
     45 
     46                    MediaSourceUtil.fetchManifestAndData(test, manifestFilenameA, function(typeA, dataA)
     47                    {
     48                        MediaSourceUtil.fetchManifestAndData(test, manifestFilenameB, function(typeB, dataB)
     49                        {
     50                            mediaSource.addSourceBuffer(typeA);
     51                            mediaSource.addSourceBuffer(typeB);
     52                            assert_equals(mediaSource.sourceBuffers.length, 2);
     53 
     54                            callback(test, mediaElement, mediaSource, dataA, dataB);
     55                        });
     56                    });
     57                }, description);
     58            };
     59 
     60            function appendData(test, mediaSource, dataA, dataB, callback)
     61            {
     62                var sourceBufferA = mediaSource.sourceBuffers[0];
     63                var sourceBufferB = mediaSource.sourceBuffers[1];
     64 
     65                test.expectEvent(sourceBufferA, "update");
     66                test.expectEvent(sourceBufferA, "updateend");
     67                sourceBufferA.appendBuffer(dataA);
     68 
     69                test.expectEvent(sourceBufferB, "update");
     70                test.expectEvent(sourceBufferB, "updateend");
     71                sourceBufferB.appendBuffer(dataB);
     72 
     73                test.waitForExpectedEvents(function()
     74                {
     75                     callback();
     76                });
     77            }
     78 
     79            mediaSourceDemuxedTest(function(test, mediaElement, mediaSource, dataA, dataB) {
     80                test.expectEvent(mediaElement, "loadedmetadata");
     81                appendData(test, mediaSource, dataA, dataB, function()
     82                {
     83                    var expectedBeforeEndOfStreamIntersection = expectationsC[subType][0];
     84                    var expectedAfterEndOfStreamIntersection = expectationsC[subType][1];
     85 
     86                    assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectationsA[subType], "mediaSource.activeSourceBuffers[0]");
     87                    assertBufferedEquals(mediaSource.activeSourceBuffers[1], expectationsB[subType], "mediaSource.activeSourceBuffers[1]");
     88                    assertBufferedEquals(mediaElement, expectedBeforeEndOfStreamIntersection, "mediaElement.buffered");
     89 
     90                    mediaSource.endOfStream();
     91 
     92                    assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectationsA[subType], "mediaSource.activeSourceBuffers[0]");
     93                    assertBufferedEquals(mediaSource.activeSourceBuffers[1], expectationsB[subType], "mediaSource.activeSourceBuffers[1]");
     94                    assertBufferedEquals(mediaElement, expectedAfterEndOfStreamIntersection, "mediaElement.buffered");
     95 
     96                    test.done();
     97                });
     98            }, "Demuxed content with different lengths");
     99 
    100            mediasource_test(function(test, mediaElement, mediaSource)
    101            {
    102                mediaElement.pause();
    103                mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
    104                mediaElement.addEventListener("ended", test.step_func_done());
    105 
    106                MediaSourceUtil.fetchManifestAndData(test, subType + "/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr-manifest.json", function(type, data)
    107                {
    108                    var sourceBuffer = mediaSource.addSourceBuffer(type);
    109                    test.expectEvent(sourceBuffer, "update");
    110                    test.expectEvent(sourceBuffer, "updateend");
    111                    sourceBuffer.appendBuffer(data);
    112 
    113                    test.waitForExpectedEvents(function()
    114                    {
    115                        var expectationsAV = {
    116                            webm: ["{ [0.003, 2.004) }", "{ [0.003, 2.023) }"],
    117                            mp4: ["{ [0.067, 2.043) }", "{ [0.067, 2.067) }"],
    118                        };
    119 
    120                        var expectedBeforeEndOfStream = expectationsAV[subType][0];
    121                        var expectedAfterEndOfStream = expectationsAV[subType][1];
    122 
    123                        assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectedBeforeEndOfStream, "mediaSource.activeSourceBuffers[0]");
    124                        assertBufferedEquals(mediaElement, expectedBeforeEndOfStream, "mediaElement.buffered");
    125 
    126                        mediaSource.endOfStream();
    127 
    128                        assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectedAfterEndOfStream, "mediaSource.activeSourceBuffers[0]");
    129                        assertBufferedEquals(mediaElement, expectedAfterEndOfStream, "mediaElement.buffered");
    130 
    131                        test.done();
    132                    });
    133                });
    134            }, "Muxed content with different lengths");
    135 
    136            mediaSourceDemuxedTest(function(test, mediaElement, mediaSource, dataA, dataB) {
    137                var dataBSize = {
    138                    webm: 318,
    139                    mp4: 835,
    140                };
    141                test.expectEvent(mediaElement, "loadedmetadata");
    142                appendData(test, mediaSource, dataA, dataB.subarray(0, dataBSize[subType]), function()
    143                {
    144                    assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectationsA[subType], "mediaSource.activeSourceBuffers[0]");
    145                    assertBufferedEquals(mediaSource.activeSourceBuffers[1], "{ }", "mediaSource.activeSourceBuffers[1]");
    146                    assertBufferedEquals(mediaElement, "{ }", "mediaElement.buffered");
    147 
    148                    mediaSource.endOfStream();
    149 
    150                    assertBufferedEquals(mediaSource.activeSourceBuffers[0], expectationsA[subType], "mediaSource.activeSourceBuffers[0]");
    151                    assertBufferedEquals(mediaSource.activeSourceBuffers[1], "{ }", "mediaSource.activeSourceBuffers[1]");
    152                    assertBufferedEquals(mediaElement, "{ }", "mediaElement.buffered");
    153 
    154                    test.done();
    155                });
    156            }, "Demuxed content with an empty buffered range on one SourceBuffer");
    157 
    158            mediasource_test(function(test, mediaElement, mediaSource)
    159            {
    160                mediaElement.pause();
    161                mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
    162                mediaElement.addEventListener("ended", test.step_func_done());
    163 
    164                MediaSourceUtil.fetchManifestAndData(test, subType + "/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr-manifest.json", function(type, data)
    165                {
    166                    var sourceBuffer = mediaSource.addSourceBuffer(type);
    167                    test.expectEvent(mediaElement, "loadedmetadata");
    168                    test.expectEvent(sourceBuffer, "update");
    169                    test.expectEvent(sourceBuffer, "updateend");
    170                    sourceBuffer.appendBuffer(data.subarray(0, 4052));
    171 
    172                    test.waitForExpectedEvents(function()
    173                    {
    174                        assertBufferedEquals(mediaSource.activeSourceBuffers[0], "{ }", "mediaSource.activeSourceBuffers[0]");
    175                        assertBufferedEquals(mediaElement, "{ }", "mediaElement.buffered");
    176 
    177                        mediaSource.endOfStream();
    178 
    179                        assertBufferedEquals(mediaSource.activeSourceBuffers[0], "{ }", "mediaSource.activeSourceBuffers[0]");
    180                        assertBufferedEquals(mediaElement, "{ }", "mediaElement.buffered");
    181 
    182                        test.done();
    183                    });
    184                });
    185            }, "Muxed content empty buffered ranges.");
    186 
    187            mediasource_test(function(test, mediaElement, mediaSource)
    188            {
    189                mediaElement.pause();
    190                mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
    191                mediaElement.addEventListener("ended", test.step_func_done());
    192 
    193                var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_ONLY_TYPE);
    194 
    195                assertBufferedEquals(mediaSource.sourceBuffers[0], "{ }", "mediaSource.sourceBuffers[0]");
    196                assertBufferedEquals(mediaElement, "{ }", "mediaElement.buffered");
    197                test.done();
    198 
    199            }, "Get buffered range when sourcebuffer is empty.");
    200 
    201            mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
    202            {
    203                var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init);
    204 
    205                test.expectEvent(mediaElement, "loadedmetadata");
    206                test.expectEvent(sourceBuffer, "updateend", "initSegment append ended.");
    207                sourceBuffer.appendBuffer(initSegment);
    208                test.waitForExpectedEvents(function()
    209                {
    210                    assertBufferedEquals(mediaSource.sourceBuffers[0], "{ }", "mediaSource.sourceBuffers[0]");
    211                    assertBufferedEquals(mediaSource.activeSourceBuffers[0], "{ }", "mediaSource.activeSourceBuffers[0]");
    212                    assertBufferedEquals(mediaElement, "{ }", "mediaElement.buffered");
    213                    test.done();
    214                });
    215 
    216            }, "Get buffered range when only init segment is appended.");
    217 
    218            mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
    219            {
    220                test.expectEvent(mediaSource.sourceBuffers, "removesourcebuffer", "SourceBuffer removed.");
    221                mediaSource.removeSourceBuffer(sourceBuffer);
    222 
    223                test.waitForExpectedEvents(function()
    224                {
    225                    assert_throws_dom("InvalidStateError",
    226                        function() { sourceBuffer.buffered; },
    227                        "get sourceBuffer.buffered throws an exception for InvalidStateError.");
    228                    test.done();
    229                });
    230            }, "Get buffered range after removing sourcebuffer.");
    231 
    232            mediasource_test(function(test, mediaElement, mediaSource)
    233            {
    234                mediaElement.pause();
    235                mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
    236                mediaElement.addEventListener("ended", test.step_func_done());
    237 
    238                var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_ONLY_TYPE);
    239                assert_equals(mediaSource.sourceBuffers[0].buffered , mediaSource.sourceBuffers[0].buffered);
    240                test.done();
    241            }, "buffered return the same object over multiple calls.");
    242        </script>
    243    </body>
    244 </html>