diff --git a/demo/common/assets.js b/demo/common/assets.js index 11d8428d9f..c658a3850a 100644 --- a/demo/common/assets.js +++ b/demo/common/assets.js @@ -1474,9 +1474,6 @@ shakaAssets.testAssets = [ .addFeature(shakaAssets.Feature.LCEVC) .addDescription('LCEVC Enhanced eSports content selection.') .setExtraConfig({ - mediaSource: { - forceTransmux: true, - }, lcevc: { enabled: true, dynamicPerformanceScaling: true, @@ -1495,6 +1492,9 @@ shakaAssets.testAssets = [ .addFeature(shakaAssets.Feature.OFFLINE) .addFeature(shakaAssets.Feature.LCEVC) .setExtraConfig({ + streaming: { + useNativeHlsOnSafari: false, + }, lcevc: { enabled: true, dynamicPerformanceScaling: true, @@ -1513,8 +1513,8 @@ shakaAssets.testAssets = [ .addFeature(shakaAssets.Feature.OFFLINE) .addFeature(shakaAssets.Feature.LCEVC) .setExtraConfig({ - mediaSource: { - forceTransmux: true, + streaming: { + useNativeHlsOnSafari: false, }, lcevc: { enabled: true, @@ -1534,8 +1534,8 @@ shakaAssets.testAssets = [ .addFeature(shakaAssets.Feature.OFFLINE) .addFeature(shakaAssets.Feature.LCEVC) .setExtraConfig({ - mediaSource: { - forceTransmux: true, + streaming: { + useNativeHlsOnSafari: false, }, lcevc: { enabled: true, diff --git a/demo/config.js b/demo/config.js index dd0e8f6a2a..e253907104 100644 --- a/demo/config.js +++ b/demo/config.js @@ -547,6 +547,8 @@ shakaDemo.Config = class { .addBoolInput_('Ignore Text Stream Failures', 'streaming.ignoreTextStreamFailures') .addBoolInput_('Stall Detector Enabled', 'streaming.stallEnabled') + .addBoolInput_('Use native HLS on Safari (Clear)', + 'streaming.useNativeHlsOnSafari') .addBoolInput_('Use native HLS for FairPlay', 'streaming.useNativeHlsForFairPlay'); this.addRetrySection_('streaming', 'Streaming Retry Parameters'); diff --git a/externs/shaka/player.js b/externs/shaka/player.js index cf8e671d8d..59b633b1f9 100644 --- a/externs/shaka/player.js +++ b/externs/shaka/player.js @@ -1177,6 +1177,7 @@ shaka.extern.ManifestConfiguration; * stallEnabled: boolean, * stallThreshold: number, * stallSkip: number, + * useNativeHlsOnSafari: boolean, * useNativeHlsForFairPlay: boolean, * inaccurateManifestTolerance: number, * lowLatencyMode: boolean, @@ -1278,6 +1279,11 @@ shaka.extern.ManifestConfiguration; * been detected. If 0, the player will pause and immediately play instead of * seeking. A value of 0 is recommended and provided as default on TV * platforms (WebOS, Tizen, Chromecast, etc). + * @property {boolean} useNativeHlsOnSafari + * Desktop Safari has both MediaSource and their native HLS implementation. + * Depending on the application's needs, it may prefer one over the other. + * Only applies to clear streams + * Defaults to true. * @property {boolean} useNativeHlsForFairPlay * Desktop Safari has both MediaSource and their native HLS implementation. * Depending on the application's needs, it may prefer one over the other. diff --git a/lib/player.js b/lib/player.js index 6a84135102..d36b224314 100644 --- a/lib/player.js +++ b/lib/player.js @@ -2040,6 +2040,12 @@ shaka.Player = class extends shaka.util.FakeEventTarget { this.config_.drm.servers['com.apple.fps.1_0'])) { return this.config_.streaming.useNativeHlsForFairPlay; } + + // For Safari, we have an older flag which only applies to this one + // browser: + if (Platform.isApple()) { + return this.config_.streaming.useNativeHlsOnSafari; + } } // In all other cases, we prefer MediaSource. @@ -3274,6 +3280,14 @@ shaka.Player = class extends shaka.util.FakeEventTarget { delete config['streaming']['forceTransmux']; } + // Deprecate 'streaming.useNativeHlsOnSafari' configuration. + if (config['streaming'] && 'useNativeHlsOnSafari' in config['streaming']) { + shaka.Deprecate.deprecateFeature(5, + 'streaming.useNativeHlsOnSafari configuration', + 'Please Use streaming.useNativeHlsForFairPlay or ' + + 'streaming.preferNativeHls instead.'); + } + // If lowLatencyMode is enabled, and inaccurateManifestTolerance and // rebufferingGoal and segmentPrefetchLimit and baseDelay are not // specified, set inaccurateManifestTolerance to 0 and rebufferingGoal diff --git a/lib/util/player_configuration.js b/lib/util/player_configuration.js index 0a3824f165..65cc208a9c 100644 --- a/lib/util/player_configuration.js +++ b/lib/util/player_configuration.js @@ -206,6 +206,7 @@ shaka.util.PlayerConfiguration = class { stallEnabled: true, stallThreshold: 1 /* seconds */, stallSkip: 0.1 /* seconds */, + useNativeHlsOnSafari: true, useNativeHlsForFairPlay: true, // If we are within 2 seconds of the start of a live segment, fetch the // previous one. This allows for segment drift, but won't download an diff --git a/test/hls/hls_parser_integration.js b/test/hls/hls_parser_integration.js index 9663f8a250..ef277f7213 100644 --- a/test/hls/hls_parser_integration.js +++ b/test/hls/hls_parser_integration.js @@ -47,6 +47,8 @@ describe('HlsParser', () => { player = new compiledShaka.Player(); await player.attach(video); + player.configure('streaming.useNativeHlsOnSafari', false); + // Disable stall detection, which can interfere with playback tests. player.configure('streaming.stallEnabled', false); diff --git a/test/player_unit.js b/test/player_unit.js index 725ec1f6f0..83b8ee0274 100644 --- a/test/player_unit.js +++ b/test/player_unit.js @@ -689,6 +689,7 @@ describe('Player', () => { video.canPlayType.and.returnValue('maybe'); spyOn(shaka.util.Platform, 'anyMediaElement').and.returnValue(video); spyOn(shaka.util.Platform, 'supportsMediaSource').and.returnValue(true); + spyOn(shaka.util.Platform, 'isApple').and.returnValue(false); // Make sure player.load() resolves for src= spyOn(shaka.util.MediaReadyState, 'waitForReadyState').and.callFake( (mediaElement, readyState, eventManager, callback) => { @@ -698,6 +699,7 @@ describe('Player', () => { player.configure({ streaming: { preferNativeHls: true, + useNativeHlsOnSafari: false, }, }); @@ -709,10 +711,12 @@ describe('Player', () => { it('does not apply to non-HLS streams', async () => { video.canPlayType.and.returnValue('maybe'); spyOn(shaka.util.Platform, 'supportsMediaSource').and.returnValue(true); + spyOn(shaka.util.Platform, 'isApple').and.returnValue(false); player.configure({ streaming: { preferNativeHls: true, + useNativeHlsOnSafari: false, }, }); diff --git a/test/transmuxer/transmuxer_integration.js b/test/transmuxer/transmuxer_integration.js index ccce76472b..54ccc0a652 100644 --- a/test/transmuxer/transmuxer_integration.js +++ b/test/transmuxer/transmuxer_integration.js @@ -90,6 +90,7 @@ describe('Transmuxer Player', () => { await player.attach(video); player.configure('mediaSource.forceTransmux', true); + player.configure('streaming.useNativeHlsOnSafari', false); // Disable stall detection, which can interfere with playback tests. player.configure('streaming.stallEnabled', false);