File: mediasource-sequencemode-append-buffer.html

package info (click to toggle)
iceweasel 38.8.0esr-1~deb7u1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 1,578,008 kB
  • sloc: cpp: 4,134,345; ansic: 1,765,754; python: 324,651; java: 233,700; asm: 138,937; xml: 98,298; sh: 82,895; makefile: 21,621; perl: 17,235; objc: 4,014; yacc: 1,968; lex: 1,179; exp: 499; pascal: 479; lisp: 228; awk: 152; ruby: 82; sed: 43; csh: 31; ada: 16; php: 1
file content (129 lines) | stat: -rw-r--r-- 7,859 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<!DOCTYPE html>
<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");
                  test.failOnEvent(mediaElement, "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_equals(sourceBuffer.buffered.length, 1, "sourceBuffer.buffered has 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)
          {
              assert_equals(segmentInfo.media[0].timecode, 0, "segment starts at time 0");
              append_segment(test, sourceBuffer, mediaData, segmentInfo.media[0], function()
              {
                  verify_offset_and_buffered(test, mediaSource, sourceBuffer,
                                             0, 0,
                                             segmentInfo.media[1].timecode + sourceBuffer.timestampOffset,
                                             segmentInfo.media[0].highest_end_time + sourceBuffer.timestampOffset,
                                             test.done);
              });
          }, "Test sequence AppendMode appendBuffer(first media segment)");

          mediasource_sequencemode_test(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
          {
              assert_greater_than(segmentInfo.media[1].timecode, 0, "segment starts after time 0");
              append_segment(test, sourceBuffer, mediaData, segmentInfo.media[1], function()
              {
                  verify_offset_and_buffered(test, mediaSource, sourceBuffer,
                                             -segmentInfo.media[1].timecode, 0,
                                             segmentInfo.media[2].timecode + sourceBuffer.timestampOffset,
                                             segmentInfo.media[1].highest_end_time + sourceBuffer.timestampOffset,
                                             test.done);
              });
          }, "Test sequence AppendMode appendBuffer(second media segment)");

          mediasource_sequencemode_test(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
          {
              assert_greater_than(segmentInfo.media[1].timecode, 0, "segment starts after time 0");
              append_segment(test, sourceBuffer, mediaData, segmentInfo.media[1], function()
              {
                  assert_equals(segmentInfo.media[0].timecode, 0, "segment starts at time 0");
                  append_segment(test, sourceBuffer, mediaData, segmentInfo.media[0], function()
                  {
                      // 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,
                                                 segmentInfo.media[1].highest_end_time - segmentInfo.media[1].timecode, 0,
                                                 segmentInfo.media[1].timecode + sourceBuffer.timestampOffset,
                                                 segmentInfo.media[0].highest_end_time + sourceBuffer.timestampOffset,
                                                 test.done);
                  })
              });
          }, "Test sequence AppendMode appendBuffer(second media segment, then first media segment)");
        </script>
    </body>
</html>