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-sequencemode-append-buffer.html
<!DOCTYPE html>
<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
<html>
    <head>
        <title>SourceBuffer.mode == "sequence" 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>
          function mediasource_sequencemode_test(testFunction, description, options)
          {
              return mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
              {
                  assert_greater_than(segmentInfo.media.length, 3, "at least 3 media segments for supported type");
                  mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
                  sourceBuffer.mode = "sequence";
                  assert_equals(sourceBuffer.mode, "sequence", "mode after setting it to \"sequence\"");

                  var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init);
                  test.expectEvent(sourceBuffer, "updatestart", "initSegment append started.");
                  test.expectEvent(sourceBuffer, "update", "initSegment append success.");
                  test.expectEvent(sourceBuffer, "updateend", "initSegment append ended.");
                  sourceBuffer.appendBuffer(initSegment);
                  test.waitForExpectedEvents(function()
                  {
                      assert_equals(sourceBuffer.timestampOffset, 0, "timestampOffset initially 0");
                      testFunction(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData);
                  });
              }, description, options);
          }

          function append_segment(test, sourceBuffer, mediaData, info, callback)
          {
              var mediaSegment = MediaSourceUtil.extractSegmentData(mediaData, info);
              test.expectEvent(sourceBuffer, "updatestart", "media segment append started.");
              test.expectEvent(sourceBuffer, "update", "media segment append success.");
              test.expectEvent(sourceBuffer, "updateend", "media segment append ended.");
              sourceBuffer.appendBuffer(mediaSegment);
              test.waitForExpectedEvents(callback);
          }

          function threeDecimalPlaces(number)
          {
              return Number(number.toFixed(3));
          }

          // Verifies expected times to 3 decimal places before and after mediaSource.endOfStream(),
          // and calls |callback| on success.
          function verify_offset_and_buffered(test, mediaSource, sourceBuffer,
                                              expectedTimestampOffset, expectedBufferedRangeStartTime,
                                              expectedBufferedRangeMaxEndTimeBeforeEOS,
                                              expectedBufferedRangeEndTimeAfterEOS,
                                              callback) {
              assert_equals(threeDecimalPlaces(sourceBuffer.timestampOffset),
                            threeDecimalPlaces(expectedTimestampOffset),
                            "expectedTimestampOffset");

              // Prior to EOS, the buffered range end time may not have fully reached the next media
              // segment's timecode (adjusted by any timestampOffset). It should not exceed it though.
              // Therefore, an exact assertBufferedEquals() will not work here.
              assert_greater_than(sourceBuffer.buffered.length, 0, "sourceBuffer.buffered has at least 1 range before EOS");
              assert_equals(threeDecimalPlaces(sourceBuffer.buffered.start(0)),
                            threeDecimalPlaces(expectedBufferedRangeStartTime),
                            "sourceBuffer.buffered range begins where expected before EOS");
              assert_less_than_equal(threeDecimalPlaces(sourceBuffer.buffered.end(0)),
                                     threeDecimalPlaces(expectedBufferedRangeMaxEndTimeBeforeEOS),
                                     "sourceBuffer.buffered range ends at or before expected upper bound before EOS");

              test.expectEvent(mediaSource, "sourceended", "mediaSource endOfStream");
              mediaSource.endOfStream();
              test.waitForExpectedEvents(function()
              {
                  assertBufferedEquals(sourceBuffer,
                                       "{ [" + expectedBufferedRangeStartTime.toFixed(3) + ", " + expectedBufferedRangeEndTimeAfterEOS.toFixed(3) + ") }",
                                       "sourceBuffer.buffered after EOS");
                  callback();
              });
          }

          mediasource_sequencemode_test(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
          {
              var offset = Math.min(segmentInfo.media[0].timev, segmentInfo.media[0].timea);
              var expectedStart = Math.max(segmentInfo.media[0].timev, segmentInfo.media[0].timea) - offset;
              var expectedEnd = Math.min(segmentInfo.media[0].endtimev, segmentInfo.media[0].endtimea) - offset;
              var expectedEndEOS = Math.max(segmentInfo.media[0].endtimev, segmentInfo.media[0].endtimea) - offset;
              append_segment(test, sourceBuffer, mediaData, segmentInfo.media[0], function()
              {
                  verify_offset_and_buffered(test, mediaSource, sourceBuffer,
                                             -offset, expectedStart,
                                             expectedEnd, expectedEndEOS,
                                             test.done);
              });
          }, "Test sequence AppendMode appendBuffer(first media segment)");

          mediasource_sequencemode_test(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
          {
              var offset = Math.min(segmentInfo.media[1].timev, segmentInfo.media[1].timea);
              var expectedStart = Math.max(segmentInfo.media[1].timev, segmentInfo.media[1].timea) - offset;
              var expectedEnd = Math.min(segmentInfo.media[1].endtimev, segmentInfo.media[1].endtimea) - offset;
              var expectedEndEOS = Math.max(segmentInfo.media[1].endtimev, segmentInfo.media[1].endtimea) - offset;
              assert_greater_than(Math.min(segmentInfo.media[1].timev, segmentInfo.media[1].timea), 0,
                                  "segment starts after time 0");
              append_segment(test, sourceBuffer, mediaData, segmentInfo.media[1], function()
              {
                  verify_offset_and_buffered(test, mediaSource, sourceBuffer,
                                             -offset, expectedStart,
                                             expectedEnd, expectedEndEOS,
                                             test.done);
              });
          }, "Test sequence AppendMode appendBuffer(second media segment)");

          mediasource_sequencemode_test(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
          {
              assert_greater_than(Math.min(segmentInfo.media[1].timev, segmentInfo.media[1].timea), 0,
                                  "segment starts after time 0");
              append_segment(test, sourceBuffer, mediaData, segmentInfo.media[1], function()
              {
                  append_segment(test, sourceBuffer, mediaData, segmentInfo.media[0], function()
                  {
                      var firstOffset = Math.min(segmentInfo.media[1].timev, segmentInfo.media[1].timea);
                      var secondOffset = Math.max(segmentInfo.media[1].endtimev, segmentInfo.media[1].endtimea) - firstOffset;
                      var expectedStart = Math.max(segmentInfo.media[1].timev, segmentInfo.media[1].timea) - firstOffset;
                      var expectedEnd = Math.min(segmentInfo.media[0].endtimev, segmentInfo.media[0].endtimea) + secondOffset;
                      var expectedEndEOS = Math.max(segmentInfo.media[0].endtimev, segmentInfo.media[0].endtimea) + secondOffset;
                      // Current timestampOffset should reflect offset required to put media[0]
                      // immediately after media[1]'s highest frame end timestamp (as was adjusted
                      // by an earlier timestampOffset).
                      verify_offset_and_buffered(test, mediaSource, sourceBuffer,
                                                 secondOffset, expectedStart,
                                                 expectedEnd, expectedEndEOS,
                                                 test.done);
                  })
              });
          }, "Test sequence AppendMode appendBuffer(second media segment, then first media segment)");
        </script>
    </body>
</html>
back to top