rx-player 3.28.1-dev.2022083000 → 3.29.0-dev.2022090500
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -1
- package/VERSION +1 -1
- package/dist/_esm5.processed/compat/event_listeners.d.ts +18 -2
- package/dist/_esm5.processed/compat/event_listeners.js +64 -2
- package/dist/_esm5.processed/compat/on_height_width_change.d.ts +5 -4
- package/dist/_esm5.processed/compat/on_height_width_change.js +43 -34
- package/dist/_esm5.processed/core/api/playback_observer.d.ts +12 -2
- package/dist/_esm5.processed/core/api/playback_observer.js +27 -12
- package/dist/_esm5.processed/core/api/public_api.js +14 -14
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.d.ts +7 -0
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +10 -2
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +8 -1
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +10 -4
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.d.ts +7 -0
- package/dist/_esm5.processed/core/init/initialize_directfile.js +1 -1
- package/dist/_esm5.processed/core/init/load_on_media_source.js +1 -1
- package/dist/_esm5.processed/core/init/stall_avoider.d.ts +4 -2
- package/dist/_esm5.processed/core/init/stall_avoider.js +32 -26
- package/dist/_esm5.processed/core/segment_buffers/garbage_collector.d.ts +12 -6
- package/dist/_esm5.processed/core/segment_buffers/garbage_collector.js +142 -78
- package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.d.ts +18 -16
- package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +53 -41
- package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.d.ts +6 -5
- package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.js +37 -39
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.d.ts +23 -22
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +84 -72
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +6 -12
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +33 -43
- package/dist/_esm5.processed/core/segment_buffers/implementations/types.d.ts +12 -9
- package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.d.ts +7 -6
- package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +17 -10
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +20 -9
- package/dist/_esm5.processed/core/stream/period/period_stream.js +25 -14
- package/dist/_esm5.processed/core/stream/representation/append_segment_to_buffer.d.ts +4 -7
- package/dist/_esm5.processed/core/stream/representation/append_segment_to_buffer.js +80 -23
- package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.d.ts +5 -4
- package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +78 -26
- package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +7 -3
- package/dist/_esm5.processed/core/stream/representation/push_init_segment.js +7 -1
- package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +7 -1
- package/dist/_esm5.processed/core/stream/representation/representation_stream.js +15 -8
- package/dist/_esm5.processed/default_config.js +1 -1
- package/dist/_esm5.processed/errors/custom_loader_error.d.ts +3 -2
- package/dist/_esm5.processed/errors/custom_loader_error.js +3 -2
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/get_initialized_source_buffer.js +5 -2
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.js +5 -2
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/remove_buffer_around_time.js +9 -2
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +3 -1
- package/dist/_esm5.processed/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +4 -3
- package/dist/_esm5.processed/public_types.d.ts +22 -3
- package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +2 -2
- package/dist/_esm5.processed/transports/dash/image_pipelines.d.ts +3 -2
- package/dist/_esm5.processed/transports/dash/image_pipelines.js +3 -1
- package/dist/_esm5.processed/transports/dash/init_segment_loader.d.ts +3 -2
- package/dist/_esm5.processed/transports/dash/init_segment_loader.js +12 -6
- package/dist/_esm5.processed/transports/dash/low_latency_segment_loader.d.ts +3 -2
- package/dist/_esm5.processed/transports/dash/low_latency_segment_loader.js +3 -2
- package/dist/_esm5.processed/transports/dash/manifest_parser.js +6 -2
- package/dist/_esm5.processed/transports/dash/segment_loader.d.ts +3 -2
- package/dist/_esm5.processed/transports/dash/segment_loader.js +12 -9
- package/dist/_esm5.processed/transports/dash/text_loader.js +6 -3
- package/dist/_esm5.processed/transports/local/pipelines.d.ts +2 -2
- package/dist/_esm5.processed/transports/local/pipelines.js +6 -6
- package/dist/_esm5.processed/transports/local/segment_loader.d.ts +3 -2
- package/dist/_esm5.processed/transports/local/segment_loader.js +4 -3
- package/dist/_esm5.processed/transports/metaplaylist/manifest_loader.d.ts +2 -2
- package/dist/_esm5.processed/transports/metaplaylist/manifest_loader.js +5 -2
- package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +15 -10
- package/dist/_esm5.processed/transports/smooth/pipelines.d.ts +1 -1
- package/dist/_esm5.processed/transports/smooth/pipelines.js +18 -14
- package/dist/_esm5.processed/transports/smooth/segment_loader.d.ts +2 -2
- package/dist/_esm5.processed/transports/smooth/segment_loader.js +8 -6
- package/dist/_esm5.processed/transports/types.d.ts +25 -2
- package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.d.ts +2 -2
- package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +3 -3
- package/dist/_esm5.processed/transports/utils/generate_manifest_loader.d.ts +2 -2
- package/dist/_esm5.processed/transports/utils/generate_manifest_loader.js +9 -6
- package/dist/_esm5.processed/utils/request/fetch.js +7 -8
- package/dist/_esm5.processed/utils/request/xhr.d.ts +1 -1
- package/dist/_esm5.processed/utils/request/xhr.js +28 -14
- package/dist/_esm5.processed/utils/task_canceller.d.ts +1 -2
- package/dist/_esm5.processed/utils/task_canceller.js +1 -2
- package/dist/mpd-parser.wasm +0 -0
- package/dist/rx-player.js +1116 -695
- package/dist/rx-player.min.js +1 -1
- package/package.json +7 -7
- package/sonar-project.properties +1 -1
- package/src/compat/event_listeners.ts +86 -1
- package/src/compat/on_height_width_change.ts +48 -49
- package/src/core/api/playback_observer.ts +34 -14
- package/src/core/api/public_api.ts +23 -18
- package/src/core/fetchers/manifest/manifest_fetcher.ts +20 -2
- package/src/core/fetchers/segment/segment_fetcher.ts +23 -3
- package/src/core/fetchers/segment/segment_fetcher_creator.ts +7 -0
- package/src/core/init/initialize_directfile.ts +1 -1
- package/src/core/init/load_on_media_source.ts +1 -0
- package/src/core/init/stall_avoider.ts +40 -26
- package/src/core/segment_buffers/garbage_collector.ts +55 -47
- package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +92 -70
- package/src/core/segment_buffers/implementations/image/image_segment_buffer.ts +37 -42
- package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +103 -105
- package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +35 -46
- package/src/core/segment_buffers/implementations/types.ts +22 -9
- package/src/core/segment_buffers/segment_buffers_store.ts +23 -14
- package/src/core/stream/orchestrator/stream_orchestrator.ts +31 -12
- package/src/core/stream/period/period_stream.ts +31 -18
- package/src/core/stream/representation/append_segment_to_buffer.ts +27 -42
- package/src/core/stream/representation/force_garbage_collection.ts +28 -32
- package/src/core/stream/representation/get_buffer_status.ts +7 -3
- package/src/core/stream/representation/push_init_segment.ts +12 -6
- package/src/core/stream/representation/push_media_segment.ts +12 -6
- package/src/core/stream/representation/representation_stream.ts +11 -5
- package/src/default_config.ts +17 -17
- package/src/errors/custom_loader_error.ts +3 -2
- package/src/experimental/tools/VideoThumbnailLoader/get_initialized_source_buffer.ts +7 -2
- package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +6 -2
- package/src/experimental/tools/VideoThumbnailLoader/remove_buffer_around_time.ts +10 -2
- package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +3 -1
- package/src/experimental/tools/createMetaplaylist/get_duration_from_manifest.ts +4 -3
- package/src/public_types.ts +28 -4
- package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +2 -2
- package/src/transports/dash/image_pipelines.ts +4 -0
- package/src/transports/dash/init_segment_loader.ts +8 -0
- package/src/transports/dash/low_latency_segment_loader.ts +4 -0
- package/src/transports/dash/manifest_parser.ts +4 -0
- package/src/transports/dash/segment_loader.ts +21 -5
- package/src/transports/dash/text_loader.ts +7 -2
- package/src/transports/local/pipelines.ts +7 -5
- package/src/transports/local/segment_loader.ts +4 -2
- package/src/transports/metaplaylist/manifest_loader.ts +9 -2
- package/src/transports/metaplaylist/pipelines.ts +16 -6
- package/src/transports/smooth/pipelines.ts +17 -9
- package/src/transports/smooth/segment_loader.ts +8 -0
- package/src/transports/types.ts +27 -0
- package/src/transports/utils/call_custom_manifest_loader.ts +8 -2
- package/src/transports/utils/generate_manifest_loader.ts +18 -5
- package/src/utils/request/fetch.ts +7 -8
- package/src/utils/request/xhr.ts +31 -15
- package/src/utils/task_canceller.ts +1 -2
|
@@ -28,31 +28,16 @@ var __extends = (this && this.__extends) || (function () {
|
|
|
28
28
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
29
29
|
};
|
|
30
30
|
})();
|
|
31
|
-
import { concat as observableConcat, defer as observableDefer, interval as observableInterval, map, merge as observableMerge, of as observableOf, startWith, Subject, switchMap, takeUntil, } from "rxjs";
|
|
32
31
|
import { events, onHeightWidthChange, } from "../../../../../compat";
|
|
33
32
|
import config from "../../../../../config";
|
|
34
33
|
import log from "../../../../../log";
|
|
34
|
+
import TaskCanceller from "../../../../../utils/task_canceller";
|
|
35
35
|
import { SegmentBuffer, } from "../../types";
|
|
36
36
|
import ManualTimeRanges from "../../utils/manual_time_ranges";
|
|
37
37
|
import parseTextTrackToElements from "./parsers";
|
|
38
38
|
import TextTrackCuesStore from "./text_track_cues_store";
|
|
39
39
|
import updateProportionalElements from "./update_proportional_elements";
|
|
40
|
-
var onEnded
|
|
41
|
-
/**
|
|
42
|
-
* Generate the interval at which TextTrack HTML Cues should be refreshed.
|
|
43
|
-
* @param {HTMLMediaElement} videoElement
|
|
44
|
-
* @returns {Observable}
|
|
45
|
-
*/
|
|
46
|
-
function generateRefreshInterval(videoElement) {
|
|
47
|
-
var seeking$ = onSeeking$(videoElement);
|
|
48
|
-
var seeked$ = onSeeked$(videoElement);
|
|
49
|
-
var ended$ = onEnded$(videoElement);
|
|
50
|
-
var MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL = config.getCurrent().MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL;
|
|
51
|
-
var manualRefresh$ = observableMerge(seeked$, ended$);
|
|
52
|
-
var autoRefresh$ = observableInterval(MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL)
|
|
53
|
-
.pipe(startWith(null));
|
|
54
|
-
return manualRefresh$.pipe(startWith(null), switchMap(function () { return observableConcat(autoRefresh$.pipe(map(function () { return true; }), takeUntil(seeking$)), observableOf(false)); }));
|
|
55
|
-
}
|
|
40
|
+
var onEnded = events.onEnded, onSeeked = events.onSeeked, onSeeking = events.onSeeking;
|
|
56
41
|
/**
|
|
57
42
|
* @param {Element} element
|
|
58
43
|
* @param {Element} child
|
|
@@ -101,72 +86,44 @@ var HTMLTextSegmentBuffer = /** @class */ (function (_super) {
|
|
|
101
86
|
_this._buffered = new ManualTimeRanges();
|
|
102
87
|
_this._videoElement = videoElement;
|
|
103
88
|
_this._textTrackElement = textTrackElement;
|
|
104
|
-
_this.
|
|
105
|
-
_this.
|
|
89
|
+
_this._sizeUpdateCanceller = new TaskCanceller();
|
|
90
|
+
_this._canceller = new TaskCanceller();
|
|
106
91
|
_this._buffer = new TextTrackCuesStore();
|
|
107
92
|
_this._currentCues = [];
|
|
108
|
-
|
|
109
|
-
generateRefreshInterval(_this._videoElement)
|
|
110
|
-
.pipe(takeUntil(_this._destroy$))
|
|
111
|
-
.subscribe(function (shouldDisplay) {
|
|
112
|
-
if (!shouldDisplay) {
|
|
113
|
-
_this._disableCurrentCues();
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
var MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL = config.getCurrent().MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL;
|
|
117
|
-
// to spread the time error, we divide the regular chosen interval.
|
|
118
|
-
var time = Math.max(_this._videoElement.currentTime +
|
|
119
|
-
(MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL / 1000) / 2, 0);
|
|
120
|
-
var cues = _this._buffer.get(time);
|
|
121
|
-
if (cues.length === 0) {
|
|
122
|
-
_this._disableCurrentCues();
|
|
123
|
-
}
|
|
124
|
-
else {
|
|
125
|
-
_this._displayCues(cues);
|
|
126
|
-
}
|
|
127
|
-
});
|
|
93
|
+
_this.autoRefreshSubtitles(_this._canceller.signal);
|
|
128
94
|
return _this;
|
|
129
95
|
}
|
|
130
96
|
/**
|
|
131
97
|
* Push segment on Subscription.
|
|
132
98
|
* @param {Object} infos
|
|
133
|
-
* @returns {
|
|
99
|
+
* @returns {Promise}
|
|
134
100
|
*/
|
|
135
101
|
HTMLTextSegmentBuffer.prototype.pushChunk = function (infos) {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
102
|
+
try {
|
|
103
|
+
this.pushChunkSync(infos);
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
return Promise.reject(err);
|
|
107
|
+
}
|
|
108
|
+
return Promise.resolve();
|
|
141
109
|
};
|
|
142
110
|
/**
|
|
143
111
|
* Remove buffered data.
|
|
144
112
|
* @param {number} start - start position, in seconds
|
|
145
113
|
* @param {number} end - end position, in seconds
|
|
146
|
-
* @returns {
|
|
114
|
+
* @returns {Promise}
|
|
147
115
|
*/
|
|
148
116
|
HTMLTextSegmentBuffer.prototype.removeBuffer = function (start, end) {
|
|
149
|
-
|
|
150
|
-
return
|
|
151
|
-
_this.removeBufferSync(start, end);
|
|
152
|
-
return observableOf(undefined);
|
|
153
|
-
});
|
|
117
|
+
this.removeBufferSync(start, end);
|
|
118
|
+
return Promise.resolve();
|
|
154
119
|
};
|
|
155
120
|
/**
|
|
156
|
-
* Indicate that every chunks from a Segment has been given to pushChunk so
|
|
157
|
-
* far.
|
|
158
|
-
* This will update our internal Segment inventory accordingly.
|
|
159
|
-
* The returned Observable will emit and complete successively once the whole
|
|
160
|
-
* segment has been pushed and this indication is acknowledged.
|
|
161
121
|
* @param {Object} infos
|
|
162
|
-
* @returns {
|
|
122
|
+
* @returns {Promise}
|
|
163
123
|
*/
|
|
164
|
-
HTMLTextSegmentBuffer.prototype.endOfSegment = function (
|
|
165
|
-
|
|
166
|
-
return
|
|
167
|
-
_this._segmentInventory.completeSegment(_infos, _this._buffered);
|
|
168
|
-
return observableOf(undefined);
|
|
169
|
-
});
|
|
124
|
+
HTMLTextSegmentBuffer.prototype.endOfSegment = function (infos) {
|
|
125
|
+
this._segmentInventory.completeSegment(infos, this._buffered);
|
|
126
|
+
return Promise.resolve();
|
|
170
127
|
};
|
|
171
128
|
/**
|
|
172
129
|
* Returns the currently buffered data, in a TimeRanges object.
|
|
@@ -180,8 +137,7 @@ var HTMLTextSegmentBuffer = /** @class */ (function (_super) {
|
|
|
180
137
|
this._disableCurrentCues();
|
|
181
138
|
this._buffer.remove(0, Infinity);
|
|
182
139
|
this._buffered.remove(0, Infinity);
|
|
183
|
-
this.
|
|
184
|
-
this._destroy$.complete();
|
|
140
|
+
this._canceller.cancel();
|
|
185
141
|
};
|
|
186
142
|
/**
|
|
187
143
|
* Push the text track contained in `data` to the HTMLTextSegmentBuffer
|
|
@@ -195,7 +151,7 @@ var HTMLTextSegmentBuffer = /** @class */ (function (_super) {
|
|
|
195
151
|
*
|
|
196
152
|
* /!\ This method won't add any data to the linked inventory.
|
|
197
153
|
* Please use the `pushChunk` method for most use-cases.
|
|
198
|
-
* @param {Object}
|
|
154
|
+
* @param {Object} infos
|
|
199
155
|
* @returns {boolean}
|
|
200
156
|
*/
|
|
201
157
|
HTMLTextSegmentBuffer.prototype.pushChunkSync = function (infos) {
|
|
@@ -282,7 +238,7 @@ var HTMLTextSegmentBuffer = /** @class */ (function (_super) {
|
|
|
282
238
|
* Remove the current cue from being displayed.
|
|
283
239
|
*/
|
|
284
240
|
HTMLTextSegmentBuffer.prototype._disableCurrentCues = function () {
|
|
285
|
-
this.
|
|
241
|
+
this._sizeUpdateCanceller.cancel();
|
|
286
242
|
if (this._currentCues.length > 0) {
|
|
287
243
|
for (var i = 0; i < this._currentCues.length; i++) {
|
|
288
244
|
safelyRemoveChild(this._textTrackElement, this._currentCues[i].element);
|
|
@@ -292,7 +248,7 @@ var HTMLTextSegmentBuffer = /** @class */ (function (_super) {
|
|
|
292
248
|
};
|
|
293
249
|
/**
|
|
294
250
|
* Display a new Cue. If one was already present, it will be replaced.
|
|
295
|
-
* @param {HTMLElement}
|
|
251
|
+
* @param {HTMLElement} elements
|
|
296
252
|
*/
|
|
297
253
|
HTMLTextSegmentBuffer.prototype._displayCues = function (elements) {
|
|
298
254
|
var nothingChanged = this._currentCues.length === elements.length &&
|
|
@@ -302,7 +258,7 @@ var HTMLTextSegmentBuffer = /** @class */ (function (_super) {
|
|
|
302
258
|
}
|
|
303
259
|
// Remove and re-display everything
|
|
304
260
|
// TODO More intelligent handling
|
|
305
|
-
this.
|
|
261
|
+
this._sizeUpdateCanceller.cancel();
|
|
306
262
|
for (var i = 0; i < this._currentCues.length; i++) {
|
|
307
263
|
safelyRemoveChild(this._textTrackElement, this._currentCues[i].element);
|
|
308
264
|
}
|
|
@@ -316,17 +272,73 @@ var HTMLTextSegmentBuffer = /** @class */ (function (_super) {
|
|
|
316
272
|
var proportionalCues = this._currentCues
|
|
317
273
|
.filter(function (cue) { return cue.resolution !== null; });
|
|
318
274
|
if (proportionalCues.length > 0) {
|
|
275
|
+
this._sizeUpdateCanceller = new TaskCanceller({ cancelOn: this._canceller.signal });
|
|
319
276
|
var TEXT_TRACK_SIZE_CHECKS_INTERVAL = config.getCurrent().TEXT_TRACK_SIZE_CHECKS_INTERVAL;
|
|
320
277
|
// update propertionally-sized elements periodically
|
|
321
|
-
onHeightWidthChange(this._textTrackElement, TEXT_TRACK_SIZE_CHECKS_INTERVAL)
|
|
322
|
-
|
|
323
|
-
.subscribe(function (_a) {
|
|
278
|
+
var heightWidthRef = onHeightWidthChange(this._textTrackElement, TEXT_TRACK_SIZE_CHECKS_INTERVAL, this._sizeUpdateCanceller.signal);
|
|
279
|
+
heightWidthRef.onUpdate(function (_a) {
|
|
324
280
|
var height = _a.height, width = _a.width;
|
|
325
281
|
for (var i = 0; i < proportionalCues.length; i++) {
|
|
326
282
|
var _b = proportionalCues[i], resolution = _b.resolution, element = _b.element;
|
|
327
283
|
updateProportionalElements(height, width, resolution, element);
|
|
328
284
|
}
|
|
285
|
+
}, { clearSignal: this._sizeUpdateCanceller.signal,
|
|
286
|
+
emitCurrentValue: true });
|
|
287
|
+
}
|
|
288
|
+
};
|
|
289
|
+
/**
|
|
290
|
+
* Auto-refresh the display of subtitles according to the media element's
|
|
291
|
+
* position and events.
|
|
292
|
+
* @param {Object} cancellationSignal
|
|
293
|
+
*/
|
|
294
|
+
HTMLTextSegmentBuffer.prototype.autoRefreshSubtitles = function (cancellationSignal) {
|
|
295
|
+
var _this = this;
|
|
296
|
+
var autoRefreshCanceller = null;
|
|
297
|
+
var MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL = config.getCurrent().MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL;
|
|
298
|
+
var startAutoRefresh = function () {
|
|
299
|
+
stopAutoRefresh();
|
|
300
|
+
autoRefreshCanceller = new TaskCanceller({ cancelOn: cancellationSignal });
|
|
301
|
+
var intervalId = setInterval(function () { return _this.refreshSubtitles(); }, MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL);
|
|
302
|
+
autoRefreshCanceller.signal.register(function () {
|
|
303
|
+
clearInterval(intervalId);
|
|
329
304
|
});
|
|
305
|
+
_this.refreshSubtitles();
|
|
306
|
+
};
|
|
307
|
+
onSeeking(this._videoElement, function () {
|
|
308
|
+
stopAutoRefresh();
|
|
309
|
+
_this._disableCurrentCues();
|
|
310
|
+
}, cancellationSignal);
|
|
311
|
+
onSeeked(this._videoElement, startAutoRefresh, cancellationSignal);
|
|
312
|
+
onEnded(this._videoElement, startAutoRefresh, cancellationSignal);
|
|
313
|
+
function stopAutoRefresh() {
|
|
314
|
+
if (autoRefreshCanceller !== null) {
|
|
315
|
+
autoRefreshCanceller.cancel();
|
|
316
|
+
autoRefreshCanceller = null;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
};
|
|
320
|
+
/**
|
|
321
|
+
* Refresh current subtitles according to the current media element's
|
|
322
|
+
* position.
|
|
323
|
+
*/
|
|
324
|
+
HTMLTextSegmentBuffer.prototype.refreshSubtitles = function () {
|
|
325
|
+
var videoElt = this._videoElement;
|
|
326
|
+
var MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL = config.getCurrent().MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL;
|
|
327
|
+
var time;
|
|
328
|
+
if (videoElt.paused || videoElt.playbackRate <= 0) {
|
|
329
|
+
time = videoElt.currentTime;
|
|
330
|
+
}
|
|
331
|
+
else {
|
|
332
|
+
// to spread the time error, we divide the regular chosen interval.
|
|
333
|
+
time = Math.max(this._videoElement.currentTime +
|
|
334
|
+
(MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL / 1000) / 2, 0);
|
|
335
|
+
}
|
|
336
|
+
var cues = this._buffer.get(time);
|
|
337
|
+
if (cues.length === 0) {
|
|
338
|
+
this._disableCurrentCues();
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
this._displayCues(cues);
|
|
330
342
|
}
|
|
331
343
|
};
|
|
332
344
|
return HTMLTextSegmentBuffer;
|
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import { Observable } from "rxjs";
|
|
17
16
|
import { IEndOfSegmentInfos, IPushChunkInfos, SegmentBuffer } from "../../types";
|
|
18
17
|
import ManualTimeRanges from "../../utils/manual_time_ranges";
|
|
19
18
|
/**
|
|
@@ -35,26 +34,21 @@ export default class NativeTextSegmentBuffer extends SegmentBuffer {
|
|
|
35
34
|
constructor(videoElement: HTMLMediaElement, hideNativeSubtitle: boolean);
|
|
36
35
|
/**
|
|
37
36
|
* @param {Object} infos
|
|
38
|
-
* @returns {
|
|
37
|
+
* @returns {Promise}
|
|
39
38
|
*/
|
|
40
|
-
pushChunk(infos: IPushChunkInfos<unknown>):
|
|
39
|
+
pushChunk(infos: IPushChunkInfos<unknown>): Promise<void>;
|
|
41
40
|
/**
|
|
42
41
|
* Remove buffered data.
|
|
43
42
|
* @param {number} start - start position, in seconds
|
|
44
43
|
* @param {number} end - end position, in seconds
|
|
45
|
-
* @returns {
|
|
44
|
+
* @returns {Promise}
|
|
46
45
|
*/
|
|
47
|
-
removeBuffer(start: number, end: number):
|
|
46
|
+
removeBuffer(start: number, end: number): Promise<void>;
|
|
48
47
|
/**
|
|
49
|
-
* Indicate that every chunks from a Segment has been given to pushChunk so
|
|
50
|
-
* far.
|
|
51
|
-
* This will update our internal Segment inventory accordingly.
|
|
52
|
-
* The returned Observable will emit and complete successively once the whole
|
|
53
|
-
* segment has been pushed and this indication is acknowledged.
|
|
54
48
|
* @param {Object} infos
|
|
55
|
-
* @returns {
|
|
49
|
+
* @returns {Promise}
|
|
56
50
|
*/
|
|
57
|
-
endOfSegment(_infos: IEndOfSegmentInfos):
|
|
51
|
+
endOfSegment(_infos: IEndOfSegmentInfos): Promise<void>;
|
|
58
52
|
/**
|
|
59
53
|
* Returns the currently buffered data, in a TimeRanges object.
|
|
60
54
|
* @returns {TimeRanges}
|
|
@@ -28,7 +28,6 @@ var __extends = (this && this.__extends) || (function () {
|
|
|
28
28
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
29
29
|
};
|
|
30
30
|
})();
|
|
31
|
-
import { defer as observableDefer, of as observableOf, } from "rxjs";
|
|
32
31
|
import { addTextTrack, } from "../../../../../compat";
|
|
33
32
|
import removeCue from "../../../../../compat/remove_cue";
|
|
34
33
|
import log from "../../../../../log";
|
|
@@ -61,21 +60,20 @@ var NativeTextSegmentBuffer = /** @class */ (function (_super) {
|
|
|
61
60
|
}
|
|
62
61
|
/**
|
|
63
62
|
* @param {Object} infos
|
|
64
|
-
* @returns {
|
|
63
|
+
* @returns {Promise}
|
|
65
64
|
*/
|
|
66
65
|
NativeTextSegmentBuffer.prototype.pushChunk = function (infos) {
|
|
67
|
-
var
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
var appendWindowEnd = (_b = appendWindow[1]) !== null && _b !== void 0 ? _b : Infinity;
|
|
66
|
+
var _a, _b;
|
|
67
|
+
log.debug("NTSB: Appending new native text tracks");
|
|
68
|
+
if (infos.data.chunk === null) {
|
|
69
|
+
return Promise.resolve();
|
|
70
|
+
}
|
|
71
|
+
var _c = infos.data, timestampOffset = _c.timestampOffset, appendWindow = _c.appendWindow, chunk = _c.chunk;
|
|
72
|
+
assertChunkIsTextTrackSegmentData(chunk);
|
|
73
|
+
var startTime = chunk.start, endTime = chunk.end, dataString = chunk.data, type = chunk.type, language = chunk.language;
|
|
74
|
+
var appendWindowStart = (_a = appendWindow[0]) !== null && _a !== void 0 ? _a : 0;
|
|
75
|
+
var appendWindowEnd = (_b = appendWindow[1]) !== null && _b !== void 0 ? _b : Infinity;
|
|
76
|
+
try {
|
|
79
77
|
var cues = parseTextTrackToCues(type, dataString, timestampOffset, language);
|
|
80
78
|
if (appendWindowStart !== 0 && appendWindowEnd !== Infinity) {
|
|
81
79
|
// Removing before window start
|
|
@@ -101,33 +99,33 @@ var NativeTextSegmentBuffer = /** @class */ (function (_super) {
|
|
|
101
99
|
i--;
|
|
102
100
|
}
|
|
103
101
|
}
|
|
104
|
-
var start;
|
|
102
|
+
var start = void 0;
|
|
105
103
|
if (startTime !== undefined) {
|
|
106
104
|
start = Math.max(appendWindowStart, startTime);
|
|
107
105
|
}
|
|
108
106
|
else {
|
|
109
107
|
if (cues.length <= 0) {
|
|
110
108
|
log.warn("NTSB: Current text tracks have no cues nor start time. Aborting");
|
|
111
|
-
return
|
|
109
|
+
return Promise.resolve();
|
|
112
110
|
}
|
|
113
111
|
log.warn("NTSB: No start time given. Guessing from cues.");
|
|
114
112
|
start = cues[0].startTime;
|
|
115
113
|
}
|
|
116
|
-
var end;
|
|
114
|
+
var end = void 0;
|
|
117
115
|
if (endTime !== undefined) {
|
|
118
116
|
end = Math.min(appendWindowEnd, endTime);
|
|
119
117
|
}
|
|
120
118
|
else {
|
|
121
119
|
if (cues.length <= 0) {
|
|
122
120
|
log.warn("NTSB: Current text tracks have no cues nor end time. Aborting");
|
|
123
|
-
return
|
|
121
|
+
return Promise.resolve();
|
|
124
122
|
}
|
|
125
123
|
log.warn("NTSB: No end time given. Guessing from cues.");
|
|
126
124
|
end = cues[cues.length - 1].endTime;
|
|
127
125
|
}
|
|
128
126
|
if (end <= start) {
|
|
129
127
|
log.warn("NTSB: Invalid text track appended: ", "the start time is inferior or equal to the end time.");
|
|
130
|
-
return
|
|
128
|
+
return Promise.resolve();
|
|
131
129
|
}
|
|
132
130
|
if (cues.length > 0) {
|
|
133
131
|
var firstCue = cues[0];
|
|
@@ -135,51 +133,43 @@ var NativeTextSegmentBuffer = /** @class */ (function (_super) {
|
|
|
135
133
|
// ones are in the past. this is supposed to fix an issue on
|
|
136
134
|
// IE/Edge.
|
|
137
135
|
// TODO Move to compat
|
|
138
|
-
var currentCues =
|
|
136
|
+
var currentCues = this._track.cues;
|
|
139
137
|
if (currentCues !== null && currentCues.length > 0) {
|
|
140
138
|
if (firstCue.startTime < currentCues[currentCues.length - 1].startTime) {
|
|
141
|
-
|
|
139
|
+
this._removeData(firstCue.startTime, +Infinity);
|
|
142
140
|
}
|
|
143
141
|
}
|
|
144
142
|
for (var i = 0; i < cues.length; i++) {
|
|
145
|
-
|
|
143
|
+
this._track.addCue(cues[i]);
|
|
146
144
|
}
|
|
147
145
|
}
|
|
148
|
-
|
|
146
|
+
this._buffered.insert(start, end);
|
|
149
147
|
if (infos.inventoryInfos !== null) {
|
|
150
|
-
|
|
148
|
+
this._segmentInventory.insertChunk(infos.inventoryInfos);
|
|
151
149
|
}
|
|
152
|
-
|
|
153
|
-
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
return Promise.reject(err);
|
|
153
|
+
}
|
|
154
|
+
return Promise.resolve();
|
|
154
155
|
};
|
|
155
156
|
/**
|
|
156
157
|
* Remove buffered data.
|
|
157
158
|
* @param {number} start - start position, in seconds
|
|
158
159
|
* @param {number} end - end position, in seconds
|
|
159
|
-
* @returns {
|
|
160
|
+
* @returns {Promise}
|
|
160
161
|
*/
|
|
161
162
|
NativeTextSegmentBuffer.prototype.removeBuffer = function (start, end) {
|
|
162
|
-
|
|
163
|
-
return
|
|
164
|
-
_this._removeData(start, end);
|
|
165
|
-
return observableOf(undefined);
|
|
166
|
-
});
|
|
163
|
+
this._removeData(start, end);
|
|
164
|
+
return Promise.resolve();
|
|
167
165
|
};
|
|
168
166
|
/**
|
|
169
|
-
* Indicate that every chunks from a Segment has been given to pushChunk so
|
|
170
|
-
* far.
|
|
171
|
-
* This will update our internal Segment inventory accordingly.
|
|
172
|
-
* The returned Observable will emit and complete successively once the whole
|
|
173
|
-
* segment has been pushed and this indication is acknowledged.
|
|
174
167
|
* @param {Object} infos
|
|
175
|
-
* @returns {
|
|
168
|
+
* @returns {Promise}
|
|
176
169
|
*/
|
|
177
170
|
NativeTextSegmentBuffer.prototype.endOfSegment = function (_infos) {
|
|
178
|
-
|
|
179
|
-
return
|
|
180
|
-
_this._segmentInventory.completeSegment(_infos, _this._buffered);
|
|
181
|
-
return observableOf(undefined);
|
|
182
|
-
});
|
|
171
|
+
this._segmentInventory.completeSegment(_infos, this._buffered);
|
|
172
|
+
return Promise.resolve();
|
|
183
173
|
};
|
|
184
174
|
/**
|
|
185
175
|
* Returns the currently buffered data, in a TimeRanges object.
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import { Observable } from "rxjs";
|
|
17
16
|
import { Adaptation, ISegment, Period, Representation } from "../../../manifest";
|
|
17
|
+
import { CancellationSignal } from "../../../utils/task_canceller";
|
|
18
18
|
import SegmentInventory, { IBufferedChunk, IBufferedHistoryEntry, IChunkContext, IInsertedChunkInfos } from "../inventory";
|
|
19
19
|
/**
|
|
20
20
|
* Class allowing to push segments and remove data to a buffer to be able
|
|
@@ -93,26 +93,29 @@ export declare abstract class SegmentBuffer {
|
|
|
93
93
|
* `data.chunk` argument to null.
|
|
94
94
|
*
|
|
95
95
|
* @param {Object} infos
|
|
96
|
-
* @
|
|
96
|
+
* @param {Object} cancellationSignal
|
|
97
|
+
* @returns {Promise}
|
|
97
98
|
*/
|
|
98
|
-
abstract pushChunk(infos: IPushChunkInfos<unknown
|
|
99
|
+
abstract pushChunk(infos: IPushChunkInfos<unknown>, cancellationSignal: CancellationSignal): Promise<void>;
|
|
99
100
|
/**
|
|
100
101
|
* Remove buffered data (added to the same FIFO queue than `pushChunk`).
|
|
101
102
|
* @param {number} start - start position, in seconds
|
|
102
103
|
* @param {number} end - end position, in seconds
|
|
103
|
-
* @
|
|
104
|
+
* @param {Object} cancellationSignal
|
|
105
|
+
* @returns {Promise}
|
|
104
106
|
*/
|
|
105
|
-
abstract removeBuffer(start: number, end: number):
|
|
107
|
+
abstract removeBuffer(start: number, end: number, cancellationSignal: CancellationSignal): Promise<void>;
|
|
106
108
|
/**
|
|
107
109
|
* Indicate that every chunks from a Segment has been given to pushChunk so
|
|
108
110
|
* far.
|
|
109
111
|
* This will update our internal Segment inventory accordingly.
|
|
110
|
-
* The returned
|
|
111
|
-
*
|
|
112
|
+
* The returned Promise will resolve once the whole segment has been pushed
|
|
113
|
+
* and this indication is acknowledged.
|
|
112
114
|
* @param {Object} infos
|
|
113
|
-
* @
|
|
115
|
+
* @param {Object} cancellationSignal
|
|
116
|
+
* @returns {Promise}
|
|
114
117
|
*/
|
|
115
|
-
abstract endOfSegment(infos: IEndOfSegmentInfos):
|
|
118
|
+
abstract endOfSegment(infos: IEndOfSegmentInfos, cancellationSignal: CancellationSignal): Promise<void>;
|
|
116
119
|
/**
|
|
117
120
|
* Returns the currently buffered data, in a TimeRanges object.
|
|
118
121
|
* @returns {TimeRanges}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import {
|
|
16
|
+
import { CancellationSignal } from "../../utils/task_canceller";
|
|
17
17
|
import { IBufferType, SegmentBuffer } from "./implementations";
|
|
18
18
|
/** Options available for a "text" SegmentBuffer */
|
|
19
19
|
export declare type ITextTrackSegmentBufferOptions = {
|
|
@@ -43,7 +43,7 @@ declare type INativeMediaBufferType = "audio" | "video";
|
|
|
43
43
|
* To be able to use a SegmentBuffer linked to a native media buffer, you
|
|
44
44
|
* will first need to create it, but also wait until the other one is either
|
|
45
45
|
* created or explicitely disabled through the `disableSegmentBuffer` method.
|
|
46
|
-
* The
|
|
46
|
+
* The Promise returned by `waitForUsableBuffers` will emit when
|
|
47
47
|
* that is the case.
|
|
48
48
|
*
|
|
49
49
|
* @class SegmentBuffersStore
|
|
@@ -73,7 +73,7 @@ export default class SegmentBuffersStore {
|
|
|
73
73
|
/**
|
|
74
74
|
* Callbacks called after a SourceBuffer is either created or disabled.
|
|
75
75
|
* Used for example to trigger the `this.waitForUsableBuffers`
|
|
76
|
-
*
|
|
76
|
+
* Promise.
|
|
77
77
|
*/
|
|
78
78
|
private _onNativeBufferAddedOrDisabled;
|
|
79
79
|
/**
|
|
@@ -129,7 +129,7 @@ export default class SegmentBuffersStore {
|
|
|
129
129
|
* content need to all be created (by creating SegmentBuffers linked to them)
|
|
130
130
|
* before any one can be used.
|
|
131
131
|
*
|
|
132
|
-
* This function will return
|
|
132
|
+
* This function will return a Promise resolving when any and all native
|
|
133
133
|
* SourceBuffers can be used.
|
|
134
134
|
*
|
|
135
135
|
* From https://w3c.github.io/media-source/#methods
|
|
@@ -137,9 +137,10 @@ export default class SegmentBuffersStore {
|
|
|
137
137
|
* exception if the media element has reached the HAVE_METADATA
|
|
138
138
|
* readyState. This can occur if the user agent's media engine
|
|
139
139
|
* does not support adding more tracks during playback.
|
|
140
|
-
* @
|
|
140
|
+
* @param {Object} cancelWaitSignal
|
|
141
|
+
* @return {Promise}
|
|
141
142
|
*/
|
|
142
|
-
waitForUsableBuffers():
|
|
143
|
+
waitForUsableBuffers(cancelWaitSignal: CancellationSignal): Promise<void>;
|
|
143
144
|
/**
|
|
144
145
|
* Explicitely disable the SegmentBuffer for a given buffer type.
|
|
145
146
|
* A call to this function is needed at least for unused native buffer types
|
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import { Observable, of as observableOf, } from "rxjs";
|
|
17
16
|
import { MediaError } from "../../errors";
|
|
18
17
|
import features from "../../features";
|
|
19
18
|
import log from "../../log";
|
|
@@ -38,7 +37,7 @@ var POSSIBLE_BUFFER_TYPES = ["audio",
|
|
|
38
37
|
* To be able to use a SegmentBuffer linked to a native media buffer, you
|
|
39
38
|
* will first need to create it, but also wait until the other one is either
|
|
40
39
|
* created or explicitely disabled through the `disableSegmentBuffer` method.
|
|
41
|
-
* The
|
|
40
|
+
* The Promise returned by `waitForUsableBuffers` will emit when
|
|
42
41
|
* that is the case.
|
|
43
42
|
*
|
|
44
43
|
* @class SegmentBuffersStore
|
|
@@ -126,7 +125,7 @@ var SegmentBuffersStore = /** @class */ (function () {
|
|
|
126
125
|
* content need to all be created (by creating SegmentBuffers linked to them)
|
|
127
126
|
* before any one can be used.
|
|
128
127
|
*
|
|
129
|
-
* This function will return
|
|
128
|
+
* This function will return a Promise resolving when any and all native
|
|
130
129
|
* SourceBuffers can be used.
|
|
131
130
|
*
|
|
132
131
|
* From https://w3c.github.io/media-source/#methods
|
|
@@ -134,19 +133,27 @@ var SegmentBuffersStore = /** @class */ (function () {
|
|
|
134
133
|
* exception if the media element has reached the HAVE_METADATA
|
|
135
134
|
* readyState. This can occur if the user agent's media engine
|
|
136
135
|
* does not support adding more tracks during playback.
|
|
137
|
-
* @
|
|
136
|
+
* @param {Object} cancelWaitSignal
|
|
137
|
+
* @return {Promise}
|
|
138
138
|
*/
|
|
139
|
-
SegmentBuffersStore.prototype.waitForUsableBuffers = function () {
|
|
139
|
+
SegmentBuffersStore.prototype.waitForUsableBuffers = function (cancelWaitSignal) {
|
|
140
140
|
var _this = this;
|
|
141
141
|
if (this._areNativeBuffersUsable()) {
|
|
142
|
-
return
|
|
142
|
+
return Promise.resolve();
|
|
143
143
|
}
|
|
144
|
-
return new
|
|
145
|
-
|
|
144
|
+
return new Promise(function (res, rej) {
|
|
145
|
+
var onAddedOrDisabled = function () {
|
|
146
146
|
if (_this._areNativeBuffersUsable()) {
|
|
147
|
-
|
|
148
|
-
obs.complete();
|
|
147
|
+
res();
|
|
149
148
|
}
|
|
149
|
+
};
|
|
150
|
+
_this._onNativeBufferAddedOrDisabled.push(onAddedOrDisabled);
|
|
151
|
+
cancelWaitSignal.register(function (error) {
|
|
152
|
+
var indexOf = _this._onNativeBufferAddedOrDisabled.indexOf(onAddedOrDisabled);
|
|
153
|
+
if (indexOf >= 0) {
|
|
154
|
+
_this._onNativeBufferAddedOrDisabled.splice(indexOf, 1);
|
|
155
|
+
}
|
|
156
|
+
rej(error);
|
|
150
157
|
});
|
|
151
158
|
});
|
|
152
159
|
};
|
|
@@ -22,15 +22,18 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
|
22
22
|
}
|
|
23
23
|
return to.concat(ar || Array.prototype.slice.call(from));
|
|
24
24
|
};
|
|
25
|
-
import { combineLatest, concat as observableConcat, defer as observableDefer, distinctUntilChanged, EMPTY, exhaustMap, filter, ignoreElements, map, merge as observableMerge, mergeMap, of as observableOf, share, startWith, Subject, take, takeUntil, tap, } from "rxjs";
|
|
25
|
+
import { combineLatest, concat as observableConcat, defer as observableDefer, distinctUntilChanged, EMPTY, exhaustMap, filter, ignoreElements, map, merge as observableMerge, mergeMap, Observable, of as observableOf, share, startWith, Subject, take, takeUntil, tap, } from "rxjs";
|
|
26
26
|
import config from "../../../config";
|
|
27
27
|
import { MediaError } from "../../../errors";
|
|
28
28
|
import log from "../../../log";
|
|
29
29
|
import deferSubscriptions from "../../../utils/defer_subscriptions";
|
|
30
30
|
import { fromEvent } from "../../../utils/event_emitter";
|
|
31
31
|
import filterMap from "../../../utils/filter_map";
|
|
32
|
+
import { createMappedReference, } from "../../../utils/reference";
|
|
33
|
+
import fromCancellablePromise from "../../../utils/rx-from_cancellable_promise";
|
|
32
34
|
import nextTickObs from "../../../utils/rx-next-tick";
|
|
33
35
|
import SortedList from "../../../utils/sorted_list";
|
|
36
|
+
import TaskCanceller from "../../../utils/task_canceller";
|
|
34
37
|
import WeakMapMemory from "../../../utils/weak_map_memory";
|
|
35
38
|
import { BufferGarbageCollector, } from "../../segment_buffers";
|
|
36
39
|
import EVENTS from "../events_generators";
|
|
@@ -77,12 +80,15 @@ export default function StreamOrchestrator(content, playbackObserver, representa
|
|
|
77
80
|
var defaultMaxAhead = MAXIMUM_MAX_BUFFER_AHEAD[bufferType] != null ?
|
|
78
81
|
MAXIMUM_MAX_BUFFER_AHEAD[bufferType] :
|
|
79
82
|
Infinity;
|
|
80
|
-
return
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
83
|
+
return new Observable(function () {
|
|
84
|
+
var canceller = new TaskCanceller();
|
|
85
|
+
BufferGarbageCollector({ segmentBuffer: segmentBuffer, playbackObserver: playbackObserver, maxBufferBehind: createMappedReference(maxBufferBehind, function (val) {
|
|
86
|
+
return Math.min(val, defaultMaxBehind);
|
|
87
|
+
}, canceller.signal),
|
|
88
|
+
maxBufferAhead: createMappedReference(maxBufferAhead, function (val) {
|
|
89
|
+
return Math.min(val, defaultMaxAhead);
|
|
90
|
+
}, canceller.signal) }, canceller.signal);
|
|
91
|
+
return function () { canceller.cancel(); };
|
|
86
92
|
});
|
|
87
93
|
});
|
|
88
94
|
// Every PeriodStreams for every possible types
|
|
@@ -222,8 +228,13 @@ export default function StreamOrchestrator(content, playbackObserver, representa
|
|
|
222
228
|
destroyStreams$.next();
|
|
223
229
|
return observableConcat.apply(void 0, __spreadArray(__spreadArray([], rangesToClean.map(function (_a) {
|
|
224
230
|
var start = _a.start, end = _a.end;
|
|
225
|
-
|
|
226
|
-
|
|
231
|
+
if (start >= end) {
|
|
232
|
+
return EMPTY;
|
|
233
|
+
}
|
|
234
|
+
var canceller = new TaskCanceller();
|
|
235
|
+
return fromCancellablePromise(canceller, function () {
|
|
236
|
+
return segmentBuffer.removeBuffer(start, end, canceller.signal);
|
|
237
|
+
}).pipe(ignoreElements());
|
|
227
238
|
}), false), [
|
|
228
239
|
// Schedule micro task before checking the last playback observation
|
|
229
240
|
// to reduce the risk of race conditions where the next observation
|