rx-player
Version:
Canal+ HTML5 Video Player
119 lines (118 loc) • 4.97 kB
JavaScript
;
/**
* Copyright 2015 CANAL+ Group
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var __values = (this && this.__values) || function(o) {
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
if (m) return m.call(o);
if (o && typeof o.length === "number") return {
next: function () {
if (o && i >= o.length) o = void 0;
return { value: o && o[i++], done: !o };
}
};
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = triggerEndOfStream;
exports.maintainEndOfStream = maintainEndOfStream;
var event_listeners_1 = require("../../compat/event_listeners");
var log_1 = require("../../log");
var task_canceller_1 = require("../../utils/task_canceller");
/**
* Get "updating" SourceBuffers from a SourceBufferList.
* @param {SourceBufferList} sourceBuffers
* @returns {Array.<SourceBuffer>}
*/
function getUpdatingSourceBuffers(sourceBuffers) {
var updatingSourceBuffers = [];
for (var i = 0; i < sourceBuffers.length; i++) {
var SourceBuffer_1 = sourceBuffers[i];
if (SourceBuffer_1.updating) {
updatingSourceBuffers.push(SourceBuffer_1);
}
}
return updatingSourceBuffers;
}
/**
* Trigger the `endOfStream` method of a MediaSource.
*
* If the MediaSource is ended/closed, do not call this method.
* If SourceBuffers are updating, wait for them to be updated before closing
* it.
* @param {MediaSource} mediaSource
* @param {Object} cancelSignal
*/
function triggerEndOfStream(mediaSource, cancelSignal) {
var e_1, _a;
log_1.default.debug("mse", "Trying to call endOfStream");
if (mediaSource.readyState !== "open") {
log_1.default.debug("mse", "MediaSource not open, cancel endOfStream");
return;
}
var sourceBuffers = mediaSource.sourceBuffers;
var updatingSourceBuffers = getUpdatingSourceBuffers(sourceBuffers);
if (updatingSourceBuffers.length === 0) {
log_1.default.info("mse", "Triggering end of stream");
try {
mediaSource.endOfStream();
}
catch (err) {
log_1.default.error("mse", "Unable to call endOfStream", err instanceof Error ? err : new Error("Unknown error"));
}
return;
}
log_1.default.debug("mse", "Waiting SourceBuffers to be updated before calling endOfStream.");
var innerCanceller = new task_canceller_1.default();
innerCanceller.linkToSignal(cancelSignal);
try {
for (var updatingSourceBuffers_1 = __values(updatingSourceBuffers), updatingSourceBuffers_1_1 = updatingSourceBuffers_1.next(); !updatingSourceBuffers_1_1.done; updatingSourceBuffers_1_1 = updatingSourceBuffers_1.next()) {
var sourceBuffer = updatingSourceBuffers_1_1.value;
(0, event_listeners_1.onSourceBufferUpdate)(sourceBuffer, function () {
innerCanceller.cancel();
triggerEndOfStream(mediaSource, cancelSignal);
}, innerCanceller.signal);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (updatingSourceBuffers_1_1 && !updatingSourceBuffers_1_1.done && (_a = updatingSourceBuffers_1.return)) _a.call(updatingSourceBuffers_1);
}
finally { if (e_1) throw e_1.error; }
}
(0, event_listeners_1.onRemoveSourceBuffers)(sourceBuffers, function () {
innerCanceller.cancel();
triggerEndOfStream(mediaSource, cancelSignal);
}, innerCanceller.signal);
}
/**
* Trigger the `endOfStream` method of a MediaSource each times it opens.
* @see triggerEndOfStream
* @param {MediaSource} mediaSource
* @param {Object} cancelSignal
*/
function maintainEndOfStream(mediaSource, cancelSignal) {
var endOfStreamCanceller = new task_canceller_1.default();
endOfStreamCanceller.linkToSignal(cancelSignal);
(0, event_listeners_1.onSourceOpen)(mediaSource, function () {
log_1.default.debug("mse", "MediaSource re-opened while end-of-stream is active");
endOfStreamCanceller.cancel();
endOfStreamCanceller = new task_canceller_1.default();
endOfStreamCanceller.linkToSignal(cancelSignal);
triggerEndOfStream(mediaSource, endOfStreamCanceller.signal);
}, cancelSignal);
triggerEndOfStream(mediaSource, endOfStreamCanceller.signal);
}