tor-browser

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

mediasource-sequencemode-append-buffer.html (8906B)


      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.mode == "sequence" 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          function mediasource_sequencemode_test(testFunction, description, options)
     14          {
     15              return mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
     16              {
     17                  assert_greater_than(segmentInfo.media.length, 3, "at least 3 media segments for supported type");
     18                  mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
     19                  sourceBuffer.mode = "sequence";
     20                  assert_equals(sourceBuffer.mode, "sequence", "mode after setting it to \"sequence\"");
     21 
     22                  var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init);
     23                  test.expectEvent(sourceBuffer, "updatestart", "initSegment append started.");
     24                  test.expectEvent(sourceBuffer, "update", "initSegment append success.");
     25                  test.expectEvent(sourceBuffer, "updateend", "initSegment append ended.");
     26                  sourceBuffer.appendBuffer(initSegment);
     27                  test.waitForExpectedEvents(function()
     28                  {
     29                      assert_equals(sourceBuffer.timestampOffset, 0, "timestampOffset initially 0");
     30                      testFunction(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData);
     31                  });
     32              }, description, options);
     33          }
     34 
     35          function append_segment(test, sourceBuffer, mediaData, info, callback)
     36          {
     37              var mediaSegment = MediaSourceUtil.extractSegmentData(mediaData, info);
     38              test.expectEvent(sourceBuffer, "updatestart", "media segment append started.");
     39              test.expectEvent(sourceBuffer, "update", "media segment append success.");
     40              test.expectEvent(sourceBuffer, "updateend", "media segment append ended.");
     41              sourceBuffer.appendBuffer(mediaSegment);
     42              test.waitForExpectedEvents(callback);
     43          }
     44 
     45          // Verifies expected times to 3 decimal places before and after mediaSource.endOfStream(),
     46          // and calls |callback| on success.
     47          function verify_offset_and_buffered(test, mediaSource, sourceBuffer,
     48                                              expectedTimestampOffset, expectedBufferedRangeStartTime,
     49                                              expectedBufferedRangeMaxEndTimeBeforeEOS,
     50                                              expectedBufferedRangeEndTimeAfterEOS,
     51                                              callback) {
     52              assert_approx_equals(sourceBuffer.timestampOffset,
     53                                   expectedTimestampOffset,
     54                                   0.001,
     55                                   "expectedTimestampOffset");
     56 
     57              // Prior to EOS, the buffered range end time may not have fully reached the next media
     58              // segment's timecode (adjusted by any timestampOffset). It should not exceed it though.
     59              // Therefore, an exact assertBufferedEquals() will not work here.
     60              assert_greater_than(sourceBuffer.buffered.length, 0, "sourceBuffer.buffered has at least 1 range before EOS");
     61              assert_approx_equals(sourceBuffer.buffered.start(0),
     62                                   expectedBufferedRangeStartTime,
     63                                   0.001,
     64                                   "sourceBuffer.buffered range begins where expected before EOS");
     65              assert_less_than_equal(sourceBuffer.buffered.end(0),
     66                                     expectedBufferedRangeMaxEndTimeBeforeEOS + 0.001,
     67                                     "sourceBuffer.buffered range ends at or before expected upper bound before EOS");
     68 
     69              test.expectEvent(mediaSource, "sourceended", "mediaSource endOfStream");
     70              mediaSource.endOfStream();
     71              test.waitForExpectedEvents(function()
     72              {
     73                  assertBufferedEquals(sourceBuffer,
     74                                       "{ [" + expectedBufferedRangeStartTime.toFixed(3) + ", " + expectedBufferedRangeEndTimeAfterEOS.toFixed(3) + ") }",
     75                                       "sourceBuffer.buffered after EOS");
     76                  callback();
     77              });
     78          }
     79 
     80          mediasource_sequencemode_test(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
     81          {
     82              var offset = Math.min(segmentInfo.media[0].timev, segmentInfo.media[0].timea);
     83              var expectedStart = Math.max(segmentInfo.media[0].timev, segmentInfo.media[0].timea) - offset;
     84              var expectedEnd = Math.min(segmentInfo.media[0].endtimev, segmentInfo.media[0].endtimea) - offset;
     85              var expectedEndEOS = Math.max(segmentInfo.media[0].endtimev, segmentInfo.media[0].endtimea) - offset;
     86              append_segment(test, sourceBuffer, mediaData, segmentInfo.media[0], function()
     87              {
     88                  verify_offset_and_buffered(test, mediaSource, sourceBuffer,
     89                                             -offset, expectedStart,
     90                                             expectedEnd, expectedEndEOS,
     91                                             test.done);
     92              });
     93          }, "Test sequence AppendMode appendBuffer(first media segment)");
     94 
     95          mediasource_sequencemode_test(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
     96          {
     97              var offset = Math.min(segmentInfo.media[1].timev, segmentInfo.media[1].timea);
     98              var expectedStart = Math.max(segmentInfo.media[1].timev, segmentInfo.media[1].timea) - offset;
     99              var expectedEnd = Math.min(segmentInfo.media[1].endtimev, segmentInfo.media[1].endtimea) - offset;
    100              var expectedEndEOS = Math.max(segmentInfo.media[1].endtimev, segmentInfo.media[1].endtimea) - offset;
    101              assert_greater_than(Math.min(segmentInfo.media[1].timev, segmentInfo.media[1].timea), 0,
    102                                  "segment starts after time 0");
    103              append_segment(test, sourceBuffer, mediaData, segmentInfo.media[1], function()
    104              {
    105                  verify_offset_and_buffered(test, mediaSource, sourceBuffer,
    106                                             -offset, expectedStart,
    107                                             expectedEnd, expectedEndEOS,
    108                                             test.done);
    109              });
    110          }, "Test sequence AppendMode appendBuffer(second media segment)");
    111 
    112          mediasource_sequencemode_test(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
    113          {
    114              assert_greater_than(Math.min(segmentInfo.media[1].timev, segmentInfo.media[1].timea), 0,
    115                                  "segment starts after time 0");
    116              append_segment(test, sourceBuffer, mediaData, segmentInfo.media[1], function()
    117              {
    118                  append_segment(test, sourceBuffer, mediaData, segmentInfo.media[0], function()
    119                  {
    120                      var firstOffset = Math.min(segmentInfo.media[1].timev, segmentInfo.media[1].timea);
    121                      var secondOffset = Math.max(segmentInfo.media[1].endtimev, segmentInfo.media[1].endtimea) - firstOffset;
    122                      var expectedStart = Math.max(segmentInfo.media[1].timev, segmentInfo.media[1].timea) - firstOffset;
    123                      var expectedEnd = Math.min(segmentInfo.media[0].endtimev, segmentInfo.media[0].endtimea) + secondOffset;
    124                      var expectedEndEOS = Math.max(segmentInfo.media[0].endtimev, segmentInfo.media[0].endtimea) + secondOffset;
    125                      // Current timestampOffset should reflect offset required to put media[0]
    126                      // immediately after media[1]'s highest frame end timestamp (as was adjusted
    127                      // by an earlier timestampOffset).
    128                      verify_offset_and_buffered(test, mediaSource, sourceBuffer,
    129                                                 secondOffset, expectedStart,
    130                                                 expectedEnd, expectedEndEOS,
    131                                                 test.done);
    132                  })
    133              });
    134          }, "Test sequence AppendMode appendBuffer(second media segment, then first media segment)");
    135        </script>
    136    </body>
    137 </html>