Skip to content

Commit d1f9abb

Browse files
authored
Merge pull request #27 from wix/fix/desktop-safari-live
Use hls adapter instead of native hls in desktop safari
2 parents 9499e9e + a5e8192 commit d1f9abb

File tree

16 files changed

+140
-136
lines changed

16 files changed

+140
-136
lines changed

src/constants/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { MEDIA_STREAM_TYPES, MEDIA_STREAM_DELIVERY_TYPE } from './media-stream';
1+
import { MediaStreamTypes, MediaStreamDeliveryPriority } from './media-stream';
22
import UI_EVENTS from './events/ui';
33
import VIDEO_EVENTS from './events/video';
44
import ERRORS from './errors';
@@ -7,8 +7,8 @@ import STATES from './engine-states';
77
import LiveState from './live-state';
88

99
export {
10-
MEDIA_STREAM_TYPES,
11-
MEDIA_STREAM_DELIVERY_TYPE,
10+
MediaStreamTypes,
11+
MediaStreamDeliveryPriority,
1212
TEXT_LABELS,
1313
UI_EVENTS,
1414
VIDEO_EVENTS,

src/constants/media-stream.ts

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,15 @@
1-
const MEDIA_STREAM_TYPES = {
2-
MP4: 'MP4',
3-
WEBM: 'WEBM',
4-
HLS: 'HLS',
5-
DASH: 'DASH',
6-
};
1+
enum MediaStreamTypes {
2+
MP4 = 'MP4',
3+
WEBM = 'WEBM',
4+
HLS = 'HLS',
5+
DASH = 'DASH',
6+
}
77

8-
const MEDIA_STREAM_DELIVERY_TYPE: any = {};
8+
enum MediaStreamDeliveryPriority {
9+
NATIVE_PROGRESSIVE,
10+
ADAPTIVE_VIA_MSE,
11+
NATIVE_ADAPTIVE,
12+
FORCED,
13+
}
914

10-
MEDIA_STREAM_DELIVERY_TYPE[
11-
(MEDIA_STREAM_DELIVERY_TYPE.NATIVE_PROGRESSIVE = 0)
12-
] =
13-
'NATIVE_PROGRESSIVE';
14-
MEDIA_STREAM_DELIVERY_TYPE[(MEDIA_STREAM_DELIVERY_TYPE.ADAPTIVE_VIA_MSE = 1)] =
15-
'ADAPTIVE_VIA_MSE';
16-
MEDIA_STREAM_DELIVERY_TYPE[(MEDIA_STREAM_DELIVERY_TYPE.NATIVE_ADAPTIVE = 2)] =
17-
'NATIVE_ADAPTIVE';
18-
19-
export { MEDIA_STREAM_TYPES, MEDIA_STREAM_DELIVERY_TYPE };
15+
export { MediaStreamTypes, MediaStreamDeliveryPriority };

src/core/config.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { isIPhone, isIPod, isIPad, isAndroid } from '../utils/device-detection';
1+
import { isIOS, isAndroid } from '../utils/device-detection';
22

33
import { ITitleConfig } from '../default-modules/ui/title/title';
44
import { IFullScreenConfig } from '../default-modules/full-screen-manager/full-screen-manager';
@@ -64,9 +64,11 @@ const convertUIConfigForAndroid = params => ({
6464
});
6565

6666
const convertToDeviceRelatedConfig = params => {
67-
if (isIPhone() || isIPod() || isIPad()) {
67+
if (isIOS()) {
6868
return convertUIConfigForIOS(params);
69-
} else if (isAndroid()) {
69+
}
70+
71+
if (isAndroid()) {
7072
return convertUIConfigForAndroid(params);
7173
}
7274

src/default-modules/full-screen-manager/full-screen-manager.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { isIPhone, isIPod, isIPad } from '../../utils/device-detection';
1+
import { isIOS } from '../../utils/device-detection';
22
import playerAPI from '../../utils/player-api-decorator';
33
import DesktopFullScreen from './desktop';
44
import IOSFullScreen from './ios';
@@ -54,7 +54,7 @@ export default class FullScreenManager {
5454
}
5555
this._onChange = this._onChange.bind(this);
5656

57-
if (isIPhone() || isIPod() || isIPad()) {
57+
if (isIOS()) {
5858
this._helper = new IOSFullScreen(this._engine.getNode(), this._onChange);
5959
} else {
6060
this._helper = new DesktopFullScreen(rootContainer.node, this._onChange);

src/default-modules/playback-engine/adapters-strategy.spec.ts

Lines changed: 30 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@ import { EventEmitter } from 'eventemitter3';
66

77
import getNativeAdapterCreator from './adapters/native';
88
import AdapterStrategy from './adapters-strategy';
9-
import {
10-
MEDIA_STREAM_TYPES,
11-
MEDIA_STREAM_DELIVERY_TYPE,
12-
} from '../../constants/index';
9+
import { MediaStreamTypes, MediaStreamDeliveryPriority } from '../../constants';
1310

1411
describe('AdapterStrategy', () => {
1512
const video = {
@@ -32,12 +29,12 @@ describe('AdapterStrategy', () => {
3229

3330
it('should generate list of available stream creator in env on construction', () => {
3431
const availableStream = getNativeAdapterCreator(
35-
MEDIA_STREAM_TYPES.HLS,
36-
MEDIA_STREAM_DELIVERY_TYPE.NATIVE_ADAPTIVE,
32+
MediaStreamTypes.HLS,
33+
MediaStreamDeliveryPriority.NATIVE_ADAPTIVE,
3734
);
3835
const unavailableStream = getNativeAdapterCreator(
39-
MEDIA_STREAM_TYPES.DASH,
40-
MEDIA_STREAM_DELIVERY_TYPE.NATIVE_ADAPTIVE,
36+
MediaStreamTypes.DASH,
37+
MediaStreamDeliveryPriority.NATIVE_ADAPTIVE,
4138
);
4239
availableStream.isSupported = () => true;
4340
unavailableStream.isSupported = () => false;
@@ -55,16 +52,16 @@ describe('AdapterStrategy', () => {
5552
it('should choose proper media stream for proper format', () => {
5653
playbackAdapters = [
5754
getNativeAdapterCreator(
58-
MEDIA_STREAM_TYPES.HLS,
59-
MEDIA_STREAM_DELIVERY_TYPE.NATIVE_ADAPTIVE,
55+
MediaStreamTypes.HLS,
56+
MediaStreamDeliveryPriority.NATIVE_ADAPTIVE,
6057
),
6158
getNativeAdapterCreator(
62-
MEDIA_STREAM_TYPES.DASH,
63-
MEDIA_STREAM_DELIVERY_TYPE.NATIVE_ADAPTIVE,
59+
MediaStreamTypes.DASH,
60+
MediaStreamDeliveryPriority.NATIVE_ADAPTIVE,
6461
),
6562
getNativeAdapterCreator(
66-
MEDIA_STREAM_TYPES.MP4,
67-
MEDIA_STREAM_DELIVERY_TYPE.NATIVE_ADAPTIVE,
63+
MediaStreamTypes.MP4,
64+
MediaStreamDeliveryPriority.NATIVE_ADAPTIVE,
6865
),
6966
];
7067

@@ -74,29 +71,29 @@ describe('AdapterStrategy', () => {
7471

7572
strategy.connectAdapter('http://www.dash.com/dash.mpd');
7673
expect(strategy.attachedAdapter.mediaStreamType).to.be.equal(
77-
MEDIA_STREAM_TYPES.DASH,
74+
MediaStreamTypes.DASH,
7875
);
7976

8077
strategy.connectAdapter('http://www.hls.com/hls.m3u8');
8178
expect(strategy.attachedAdapter.mediaStreamType).to.be.equal(
82-
MEDIA_STREAM_TYPES.HLS,
79+
MediaStreamTypes.HLS,
8380
);
8481

8582
strategy.connectAdapter({
8683
url: 'http://www.mp4.com/mp4.mp4',
87-
type: MEDIA_STREAM_TYPES.MP4,
84+
type: MediaStreamTypes.MP4,
8885
});
8986
});
9087

9188
it('should choose proper media stream based on priority', () => {
9289
playbackAdapters = [
9390
getNativeAdapterCreator(
94-
MEDIA_STREAM_TYPES.DASH,
95-
MEDIA_STREAM_DELIVERY_TYPE.NATIVE_PROGRESSIVE,
91+
MediaStreamTypes.DASH,
92+
MediaStreamDeliveryPriority.NATIVE_PROGRESSIVE,
9693
),
9794
getNativeAdapterCreator(
98-
MEDIA_STREAM_TYPES.DASH,
99-
MEDIA_STREAM_DELIVERY_TYPE.NATIVE_ADAPTIVE,
95+
MediaStreamTypes.DASH,
96+
MediaStreamDeliveryPriority.NATIVE_ADAPTIVE,
10097
),
10198
];
10299

@@ -105,18 +102,18 @@ describe('AdapterStrategy', () => {
105102
);
106103

107104
strategy.connectAdapter('http://www.dash.com/dash.mpd');
108-
expect(strategy.attachedAdapter.mediaStreamDeliveryType).to.be.equal(
109-
MEDIA_STREAM_DELIVERY_TYPE.NATIVE_ADAPTIVE,
105+
expect(strategy.attachedAdapter.mediaStreamDeliveryPriority).to.be.equal(
106+
MediaStreamDeliveryPriority.NATIVE_ADAPTIVE,
110107
);
111108

112109
playbackAdapters = [
113110
getNativeAdapterCreator(
114-
MEDIA_STREAM_TYPES.HLS,
115-
MEDIA_STREAM_DELIVERY_TYPE.NATIVE_ADAPTIVE,
111+
MediaStreamTypes.HLS,
112+
MediaStreamDeliveryPriority.NATIVE_ADAPTIVE,
116113
),
117114
getNativeAdapterCreator(
118-
MEDIA_STREAM_TYPES.HLS,
119-
MEDIA_STREAM_DELIVERY_TYPE.NATIVE_PROGRESSIVE,
115+
MediaStreamTypes.HLS,
116+
MediaStreamDeliveryPriority.NATIVE_PROGRESSIVE,
120117
),
121118
];
122119

@@ -125,16 +122,16 @@ describe('AdapterStrategy', () => {
125122
);
126123

127124
strategy.connectAdapter('http://www.hls.com/hls.m3u8');
128-
expect(strategy.attachedAdapter.mediaStreamDeliveryType).to.be.equal(
129-
MEDIA_STREAM_DELIVERY_TYPE.NATIVE_ADAPTIVE,
125+
expect(strategy.attachedAdapter.mediaStreamDeliveryPriority).to.be.equal(
126+
MediaStreamDeliveryPriority.NATIVE_ADAPTIVE,
130127
);
131128
});
132129

133130
it('should detach current stream on changing of stream and destroy', () => {
134131
playbackAdapters = [
135132
getNativeAdapterCreator(
136-
MEDIA_STREAM_TYPES.DASH,
137-
MEDIA_STREAM_DELIVERY_TYPE.NATIVE_ADAPTIVE,
133+
MediaStreamTypes.DASH,
134+
MediaStreamDeliveryPriority.NATIVE_ADAPTIVE,
138135
),
139136
];
140137

@@ -153,8 +150,8 @@ describe('AdapterStrategy', () => {
153150
it('should detach current stream on destroy', () => {
154151
playbackAdapters = [
155152
getNativeAdapterCreator(
156-
MEDIA_STREAM_TYPES.DASH,
157-
MEDIA_STREAM_DELIVERY_TYPE.NATIVE_ADAPTIVE,
153+
MediaStreamTypes.DASH,
154+
MediaStreamDeliveryPriority.NATIVE_ADAPTIVE,
158155
),
159156
];
160157

src/default-modules/playback-engine/adapters/dash.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import { MediaPlayer } from 'dashjs/build/es5/index_mediaplayerOnly';
22

33
import {
44
ERRORS,
5-
MEDIA_STREAM_TYPES,
6-
MEDIA_STREAM_DELIVERY_TYPE,
5+
MediaStreamTypes,
6+
MediaStreamDeliveryPriority,
77
VIDEO_EVENTS,
8-
} from '../../../constants/index';
8+
} from '../../../constants';
99
import { getNearestBufferSegmentInfo } from '../../../utils/video-data';
1010
import { NativeEnvironmentSupport } from '../../../utils/environment-detection';
1111

@@ -36,11 +36,11 @@ export default class DashAdapter implements IPlaybackAdapter {
3636
}
3737

3838
canPlay(mediaType) {
39-
return mediaType === MEDIA_STREAM_TYPES.DASH;
39+
return mediaType === MediaStreamTypes.DASH;
4040
}
4141

42-
get mediaStreamDeliveryType() {
43-
return MEDIA_STREAM_DELIVERY_TYPE.ADAPTIVE_VIA_MSE;
42+
get mediaStreamDeliveryPriority() {
43+
return MediaStreamDeliveryPriority.ADAPTIVE_VIA_MSE;
4444
}
4545

4646
get currentUrl() {
@@ -91,7 +91,7 @@ export default class DashAdapter implements IPlaybackAdapter {
9191

9292
return {
9393
...this.mediaStream,
94-
deliveryType: this.mediaStreamDeliveryType,
94+
deliveryPriority: this.mediaStreamDeliveryPriority,
9595
bitrates,
9696
currentBitrate,
9797
overallBufferLength,
@@ -119,7 +119,7 @@ export default class DashAdapter implements IPlaybackAdapter {
119119
logError(error, errorEvent) {
120120
this.eventEmitter.emit(VIDEO_EVENTS.ERROR, {
121121
errorType: error,
122-
streamType: MEDIA_STREAM_TYPES.DASH,
122+
streamType: MediaStreamTypes.DASH,
123123
streamProvider: 'dash.js',
124124
errorInstance: errorEvent,
125125
});

src/default-modules/playback-engine/adapters/default-set.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
11
import getNativeAdapterCreator from './native';
22

33
import {
4-
MEDIA_STREAM_TYPES,
5-
MEDIA_STREAM_DELIVERY_TYPE,
6-
} from '../../../constants/index';
4+
MediaStreamTypes,
5+
MediaStreamDeliveryPriority,
6+
} from '../../../constants';
77

88
const defaultPlaybackAdapters = [
99
getNativeAdapterCreator(
10-
MEDIA_STREAM_TYPES.DASH,
11-
MEDIA_STREAM_DELIVERY_TYPE.NATIVE_ADAPTIVE,
10+
MediaStreamTypes.DASH,
11+
MediaStreamDeliveryPriority.NATIVE_ADAPTIVE,
1212
),
1313
getNativeAdapterCreator(
14-
MEDIA_STREAM_TYPES.HLS,
15-
MEDIA_STREAM_DELIVERY_TYPE.NATIVE_ADAPTIVE,
14+
MediaStreamTypes.HLS,
15+
MediaStreamDeliveryPriority.NATIVE_ADAPTIVE,
1616
),
1717
getNativeAdapterCreator(
18-
MEDIA_STREAM_TYPES.MP4,
19-
MEDIA_STREAM_DELIVERY_TYPE.NATIVE_PROGRESSIVE,
18+
MediaStreamTypes.MP4,
19+
MediaStreamDeliveryPriority.NATIVE_PROGRESSIVE,
2020
),
2121
getNativeAdapterCreator(
22-
MEDIA_STREAM_TYPES.WEBM,
23-
MEDIA_STREAM_DELIVERY_TYPE.NATIVE_PROGRESSIVE,
22+
MediaStreamTypes.WEBM,
23+
MediaStreamDeliveryPriority.NATIVE_PROGRESSIVE,
2424
), // Native WebM (Chrome, Firefox)
2525
];
2626

src/default-modules/playback-engine/adapters/hls.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@ import HlsJs from 'hls.js/dist/hls.light';
22

33
import {
44
ERRORS,
5-
MEDIA_STREAM_TYPES,
6-
MEDIA_STREAM_DELIVERY_TYPE,
5+
MediaStreamTypes,
6+
MediaStreamDeliveryPriority,
77
VIDEO_EVENTS,
8-
} from '../../../constants/index';
8+
} from '../../../constants';
99
import {
1010
geOverallBufferLength,
1111
getNearestBufferSegmentInfo,
1212
} from '../../../utils/video-data';
1313
import { NativeEnvironmentSupport } from '../../../utils/environment-detection';
14+
import { isDesktopSafari } from '../../../utils/device-detection';
1415
import { IPlaybackAdapter } from './types';
1516

1617
const LIVE_SYNC_DURATION = 4;
@@ -99,8 +100,10 @@ export default class HlsAdapter implements IPlaybackAdapter {
99100
return true;
100101
}
101102

102-
get mediaStreamDeliveryType() {
103-
return MEDIA_STREAM_DELIVERY_TYPE.ADAPTIVE_VIA_MSE;
103+
get mediaStreamDeliveryPriority() {
104+
return isDesktopSafari()
105+
? MediaStreamDeliveryPriority.FORCED
106+
: MediaStreamDeliveryPriority.ADAPTIVE_VIA_MSE;
104107
}
105108

106109
get debugInfo() {
@@ -131,7 +134,7 @@ export default class HlsAdapter implements IPlaybackAdapter {
131134

132135
return {
133136
...this.mediaStream,
134-
deliveryType: this.mediaStreamDeliveryType,
137+
deliveryPriority: this.mediaStreamDeliveryPriority,
135138
bitrates,
136139
currentBitrate,
137140
overallBufferLength,
@@ -140,15 +143,15 @@ export default class HlsAdapter implements IPlaybackAdapter {
140143
}
141144

142145
canPlay(mediaType) {
143-
return mediaType === MEDIA_STREAM_TYPES.HLS;
146+
return mediaType === MediaStreamTypes.HLS;
144147
}
145148

146149
setMediaStreams(mediaStreams) {
147150
if (mediaStreams.length === 1) {
148151
this.mediaStream = mediaStreams[0];
149152
} else {
150153
throw new Error(
151-
`Can only handle a single DASH stream. Received ${
154+
`Can only handle a single HLS stream. Received ${
152155
mediaStreams.length
153156
} streams.`,
154157
);
@@ -158,7 +161,7 @@ export default class HlsAdapter implements IPlaybackAdapter {
158161
logError(error, errorEvent) {
159162
this.eventEmitter.emit(VIDEO_EVENTS.ERROR, {
160163
errorType: error,
161-
streamType: MEDIA_STREAM_TYPES.HLS,
164+
streamType: MediaStreamTypes.HLS,
162165
streamProvider: 'hls.js',
163166
errorInstance: errorEvent,
164167
});

0 commit comments

Comments
 (0)