mirror of
https://github.com/shaka-project/shaka-player.git
synced 2026-06-26 17:46:26 +03:00
8c7c74e950
This adds a polyfill for a Safari 9 MediaSource bug where calling abort() on SourceBuffer causes the decoder to fail. The reason we call abort() at all is to reset the decoder and smooth segment transitions on Chrome, Firefox, and Opera. Safari does not seem to have this problem in the first place, so it is fine to completely stub out abort(). Issue #446 Change-Id: Icbaaa3e9ce5372efdee937ddc4cf94a27dce6a47
79 lines
2.6 KiB
JavaScript
79 lines
2.6 KiB
JavaScript
/**
|
|
* @license
|
|
* Copyright 2016 Google Inc.
|
|
*
|
|
* 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.
|
|
*/
|
|
|
|
goog.provide('shaka.polyfill.MediaSource');
|
|
|
|
goog.require('shaka.log');
|
|
goog.require('shaka.polyfill.register');
|
|
|
|
|
|
/**
|
|
* @namespace shaka.polyfill.MediaSource
|
|
*
|
|
* @summary A polyfill to patch MSE bugs.
|
|
*/
|
|
|
|
|
|
/**
|
|
* Install the polyfill if needed.
|
|
*/
|
|
shaka.polyfill.MediaSource.install = function() {
|
|
shaka.log.debug('MediaSource.install');
|
|
|
|
if (!window.MediaSource) {
|
|
shaka.log.info('No MSE implementation available.');
|
|
return;
|
|
}
|
|
|
|
// Detection is complicated by the fact that Safari does not expose
|
|
// SourceBuffer on window. So we can't detect missing features by accessing
|
|
// SourceBuffer.prototype. That is why we use navigator to detect Safari and
|
|
// particular versions of it.
|
|
var vendor = navigator.vendor;
|
|
var version = navigator.appVersion;
|
|
if (!vendor || !version || vendor.indexOf('Apple') < 0) {
|
|
shaka.log.info('Using native MSE as-is.');
|
|
return;
|
|
}
|
|
|
|
if (version.indexOf('Version/8') >= 0) {
|
|
// Safari 8 does not implement appendWindowEnd. If we ignore the
|
|
// incomplete MSE implementation, some content (especially multi-period)
|
|
// will fail to play correctly. The best we can do is blacklist Safari 8
|
|
// by making MediaSourceEngine.isBrowserSupported() fail later.
|
|
shaka.log.info('Blacklisting Safari 8 MSE.');
|
|
window['MediaSource'] = null;
|
|
} else {
|
|
// Safari 9 does not correctly implement abort() on SourceBuffer. Calling
|
|
// abort() causes the decoder to completely fail, rather than resetting
|
|
// the decode timestamp as called for by the spec.
|
|
// Bug filed: http://goo.gl/UZ2rPp
|
|
// TODO: update for Safari 10 when that becomes available
|
|
shaka.log.info('Patching Safari MSE bugs.');
|
|
|
|
var addSourceBuffer = MediaSource.prototype.addSourceBuffer;
|
|
MediaSource.prototype.addSourceBuffer = function() {
|
|
var sourceBuffer = addSourceBuffer.apply(this, arguments);
|
|
sourceBuffer.abort = function() {}; // Stub out to avoid decoder errors.
|
|
return sourceBuffer;
|
|
};
|
|
}
|
|
};
|
|
|
|
|
|
shaka.polyfill.register(shaka.polyfill.MediaSource.install);
|