UNPKG

6.89 kBJavaScriptView Raw
1import SourceUpdater from '../src/source-updater';
2import QUnit from 'qunit';
3import videojs from 'video.js';
4import { useFakeMediaSource } from './test-helpers';
5
6QUnit.module('Source Updater', {
7 beforeEach() {
8 this.mse = useFakeMediaSource();
9 this.mediaSource = new videojs.MediaSource();
10 },
11 afterEach() {
12 this.mse.restore();
13 }
14});
15
16QUnit.test('waits for sourceopen to create a source buffer', function(assert) {
17 new SourceUpdater(this.mediaSource, 'video/mp2t'); // eslint-disable-line no-new
18
19 assert.equal(this.mediaSource.sourceBuffers.length, 0,
20 'waited to create the source buffer');
21
22 this.mediaSource.trigger('sourceopen');
23
24 assert.equal(this.mediaSource.sourceBuffers.length, 1, 'created one source buffer');
25 assert.equal(this.mediaSource.sourceBuffers[0].mimeType_, 'video/mp2t',
26 'assigned the correct MIME type');
27});
28
29QUnit.test('runs a callback when the source buffer is created', function(assert) {
30 let updater = new SourceUpdater(this.mediaSource, 'video/mp2t');
31 let sourceBuffer;
32
33 updater.appendBuffer(new Uint8Array([0, 1, 2]));
34
35 this.mediaSource.trigger('sourceopen');
36 sourceBuffer = this.mediaSource.sourceBuffers[0];
37 assert.equal(sourceBuffer.updates_.length, 1, 'called the source buffer once');
38 assert.deepEqual(sourceBuffer.updates_[0].append, new Uint8Array([0, 1, 2]),
39 'appended the bytes');
40});
41
42QUnit.test('runs the completion callback when updateend fires', function(assert) {
43 let updater = new SourceUpdater(this.mediaSource, 'video/mp2t');
44 let updateends = 0;
45 let sourceBuffer;
46
47 this.mediaSource.trigger('sourceopen');
48 sourceBuffer = this.mediaSource.sourceBuffers[0];
49 updater.appendBuffer(new Uint8Array([0, 1, 2]), function() {
50 updateends++;
51 });
52 updater.appendBuffer(new Uint8Array([2, 3, 4]), function() {
53 throw new Error('Wrong completion callback invoked!');
54 });
55
56 assert.equal(updateends, 0, 'no completions yet');
57 sourceBuffer.trigger('updateend');
58 assert.equal(updateends, 1, 'ran the completion callback');
59});
60
61QUnit.test('runs the next callback after updateend fires', function(assert) {
62 let updater = new SourceUpdater(this.mediaSource, 'video/mp2t');
63 let sourceBuffer;
64
65 updater.appendBuffer(new Uint8Array([0, 1, 2]));
66 this.mediaSource.trigger('sourceopen');
67 sourceBuffer = this.mediaSource.sourceBuffers[0];
68
69 updater.appendBuffer(new Uint8Array([2, 3, 4]));
70 assert.equal(sourceBuffer.updates_.length, 1, 'delayed the update');
71
72 sourceBuffer.trigger('updateend');
73 assert.equal(sourceBuffer.updates_.length, 2, 'updated twice');
74 assert.deepEqual(sourceBuffer.updates_[1].append, new Uint8Array([2, 3, 4]),
75 'appended the bytes');
76});
77
78QUnit.test('runs only one callback at a time', function(assert) {
79 let updater = new SourceUpdater(this.mediaSource, 'video/mp2t');
80 let sourceBuffer;
81
82 updater.appendBuffer(new Uint8Array([0]));
83 updater.appendBuffer(new Uint8Array([1]));
84 this.mediaSource.trigger('sourceopen');
85 sourceBuffer = this.mediaSource.sourceBuffers[0];
86
87 updater.appendBuffer(new Uint8Array([2]));
88 assert.equal(sourceBuffer.updates_.length, 1, 'queued some updates');
89 assert.deepEqual(sourceBuffer.updates_[0].append, new Uint8Array([0]),
90 'ran the first update');
91
92 sourceBuffer.trigger('updateend');
93 assert.equal(sourceBuffer.updates_.length, 2, 'queued some updates');
94 assert.deepEqual(sourceBuffer.updates_[1].append, new Uint8Array([1]),
95 'ran the second update');
96
97 updater.appendBuffer(new Uint8Array([3]));
98 sourceBuffer.trigger('updateend');
99 assert.equal(sourceBuffer.updates_.length, 3, 'queued the updates');
100 assert.deepEqual(sourceBuffer.updates_[2].append, new Uint8Array([2]),
101 'ran the third update');
102
103 sourceBuffer.trigger('updateend');
104 assert.equal(sourceBuffer.updates_.length, 4, 'finished the updates');
105 assert.deepEqual(sourceBuffer.updates_[3].append, new Uint8Array([3]),
106 'ran the fourth update');
107});
108
109QUnit.test('runs updates immediately if possible', function(assert) {
110 let updater = new SourceUpdater(this.mediaSource, 'video/mp2t');
111 let sourceBuffer;
112
113 this.mediaSource.trigger('sourceopen');
114 sourceBuffer = this.mediaSource.sourceBuffers[0];
115 updater.appendBuffer(new Uint8Array([0]));
116 assert.equal(sourceBuffer.updates_.length, 1, 'ran an update');
117 assert.deepEqual(sourceBuffer.updates_[0].append, new Uint8Array([0]),
118 'appended the bytes');
119});
120
121QUnit.test('supports abort', function(assert) {
122 let updater = new SourceUpdater(this.mediaSource, 'video/mp2t');
123 let sourceBuffer;
124
125 updater.abort();
126 this.mediaSource.trigger('sourceopen');
127 assert.equal(updater.callbacks_.length,
128 0,
129 'abort not queued before source buffers are appended to');
130
131 updater.appendBuffer(new Uint8Array([0]));
132
133 updater.abort();
134
135 sourceBuffer = this.mediaSource.sourceBuffers[0];
136 sourceBuffer.trigger('updateend');
137 assert.ok(sourceBuffer.updates_[1].abort, 'aborted the source buffer');
138});
139
140QUnit.test('supports buffered', function(assert) {
141 let updater = new SourceUpdater(this.mediaSource, 'video/mp2t');
142
143 assert.equal(updater.buffered().length, 0, 'buffered is empty');
144
145 this.mediaSource.trigger('sourceopen');
146 assert.ok(updater.buffered(), 'buffered is defined');
147});
148
149QUnit.test('supports removeBuffer', function(assert) {
150 let updater = new SourceUpdater(this.mediaSource, 'video/mp2t');
151 let sourceBuffer;
152
153 this.mediaSource.trigger('sourceopen');
154 sourceBuffer = this.mediaSource.sourceBuffers[0];
155
156 updater.remove(1, 14);
157
158 assert.equal(sourceBuffer.updates_.length,
159 0,
160 'remove not queued before sourceBuffers are appended to');
161
162 updater.appendBuffer(new Uint8Array([0]));
163
164 updater.remove(1, 14);
165
166 sourceBuffer.trigger('updateend');
167 assert.equal(sourceBuffer.updates_.length, 2, 'ran an update');
168 assert.deepEqual(sourceBuffer.updates_[1].remove, [1, 14], 'removed the time range');
169});
170
171QUnit.test('supports timestampOffset', function(assert) {
172 let updater = new SourceUpdater(this.mediaSource, 'video/mp2t');
173 let sourceBuffer;
174
175 this.mediaSource.trigger('sourceopen');
176 sourceBuffer = this.mediaSource.sourceBuffers[0];
177
178 assert.equal(updater.timestampOffset(), 0, 'intialized to zero');
179 updater.timestampOffset(21);
180 assert.equal(updater.timestampOffset(), 21, 'reflects changes immediately');
181 assert.equal(sourceBuffer.timestampOffset, 21, 'applied the update');
182
183 updater.appendBuffer(new Uint8Array(2));
184 updater.timestampOffset(14);
185 assert.equal(updater.timestampOffset(), 14, 'reflects changes immediately');
186 assert.equal(sourceBuffer.timestampOffset, 21, 'queues application after updates');
187
188 sourceBuffer.trigger('updateend');
189 assert.equal(sourceBuffer.timestampOffset, 14, 'applied the update');
190});