@gcorevideo/player 2.6.0 → 2.6.2
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/dist/index.js +38 -211
- package/lib/plugins/dash-playback/DashPlayback.d.ts +0 -4
- package/lib/plugins/dash-playback/DashPlayback.d.ts.map +1 -1
- package/lib/plugins/dash-playback/DashPlayback.js +38 -211
- package/package.json +1 -1
- package/src/plugins/dash-playback/DashPlayback.ts +40 -243
- package/tsconfig.tsbuildinfo +1 -1
package/dist/index.js
CHANGED
|
@@ -12222,24 +12222,38 @@ const T$2 = 'DashPlayback';
|
|
|
12222
12222
|
class DashPlayback extends HTML5Video {
|
|
12223
12223
|
_levels = null;
|
|
12224
12224
|
_currentLevel = null;
|
|
12225
|
+
// true when the actual duration is longer than hlsjs's live sync point
|
|
12226
|
+
// when this is false playableRegionDuration will be the actual duration
|
|
12227
|
+
// when this is true playableRegionDuration will exclude the time after the sync point
|
|
12225
12228
|
_durationExcludesAfterLiveSyncPoint = false;
|
|
12226
12229
|
_isReadyState = false;
|
|
12230
|
+
// if content is removed from the beginning then this empty area should
|
|
12231
|
+
// be ignored. "playableRegionDuration" excludes the empty area
|
|
12227
12232
|
_playableRegionDuration = 0;
|
|
12233
|
+
// for hls streams which have dvr with a sliding window,
|
|
12234
|
+
// the content at the start of the playlist is removed as new
|
|
12235
|
+
// content is appended at the end.
|
|
12236
|
+
// this means the actual playable start time will increase as the
|
|
12237
|
+
// start content is deleted
|
|
12238
|
+
// For streams with dvr where the entire recording is kept from the
|
|
12239
|
+
// beginning this should stay as 0
|
|
12228
12240
|
_playableRegionStartTime = 0;
|
|
12229
12241
|
_playbackType = Playback.VOD;
|
|
12242
|
+
// #EXT-X-PLAYLIST-TYPE
|
|
12230
12243
|
_playlistType = null;
|
|
12231
12244
|
// #EXT-X-PROGRAM-DATE-TIME
|
|
12232
12245
|
_programDateTime = 0;
|
|
12233
12246
|
_dash = null;
|
|
12234
12247
|
_extrapolatedWindowDuration = 0;
|
|
12235
|
-
_extrapolatedWindowNumSegments = 0
|
|
12248
|
+
// _extrapolatedWindowNumSegments: number = 0
|
|
12236
12249
|
_lastDuration = null;
|
|
12237
12250
|
_lastTimeUpdate = { current: 0, total: 0 };
|
|
12251
|
+
// {local, remote} remote is the time in the video element that should represent 0
|
|
12252
|
+
// local is the system time when the 'remote' measurment took place
|
|
12238
12253
|
_localStartTimeCorrelation = null;
|
|
12254
|
+
// {local, remote} remote is the time in the video element that should represents the end
|
|
12255
|
+
// local is the system time when the 'remote' measurment took place
|
|
12239
12256
|
_localEndTimeCorrelation = null;
|
|
12240
|
-
_recoverAttemptsRemaining = 0;
|
|
12241
|
-
_recoveredAudioCodecError = false;
|
|
12242
|
-
_recoveredDecodingError = false;
|
|
12243
12257
|
startChangeQuality = false;
|
|
12244
12258
|
manifestInfo = null;
|
|
12245
12259
|
// #EXT-X-TARGETDURATION
|
|
@@ -12264,19 +12278,14 @@ class DashPlayback extends HTML5Video {
|
|
|
12264
12278
|
set currentLevel(id) {
|
|
12265
12279
|
this._currentLevel = id;
|
|
12266
12280
|
this.trigger(Events$1.PLAYBACK_LEVEL_SWITCH_START);
|
|
12267
|
-
const
|
|
12268
|
-
|
|
12269
|
-
|
|
12270
|
-
|
|
12271
|
-
|
|
12272
|
-
},
|
|
12273
|
-
ABRStrategy: 'abrL2A',
|
|
12274
|
-
},
|
|
12275
|
-
},
|
|
12276
|
-
};
|
|
12281
|
+
const settings = this.options.dash ? structuredClone(this.options.dash) : {};
|
|
12282
|
+
settings.streaming = settings.streaming || {};
|
|
12283
|
+
settings.streaming.abr = settings.streaming.abr || {};
|
|
12284
|
+
settings.streaming.abr.autoSwitchBitrate = settings.streaming.abr.autoSwitchBitrate || {};
|
|
12285
|
+
settings.streaming.abr.autoSwitchBitrate.video = id === -1;
|
|
12277
12286
|
assert.ok(this._dash, 'An instance of dashjs MediaPlayer is required to switch levels');
|
|
12278
12287
|
const dash = this._dash;
|
|
12279
|
-
|
|
12288
|
+
dash.updateSettings(settings);
|
|
12280
12289
|
if (id !== -1) {
|
|
12281
12290
|
this._dash.setQualityFor('video', id);
|
|
12282
12291
|
}
|
|
@@ -12333,59 +12342,26 @@ class DashPlayback extends HTML5Video {
|
|
|
12333
12342
|
}
|
|
12334
12343
|
constructor(options, i18n, playerError) {
|
|
12335
12344
|
super(options, i18n, playerError);
|
|
12336
|
-
// backwards compatibility (TODO: remove on 0.3.0)
|
|
12337
|
-
// this.options.playback || (this.options.playback = this.options);
|
|
12338
|
-
// The size of the start time extrapolation window measured as a multiple of segments.
|
|
12339
|
-
// Should be 2 or higher, or 0 to disable. Should only need to be increased above 2 if more than one segment is
|
|
12340
|
-
// removed from the start of the playlist at a time. E.g if the playlist is cached for 10 seconds and new chunks are
|
|
12341
|
-
// added/removed every 5.
|
|
12342
|
-
this._extrapolatedWindowNumSegments =
|
|
12343
|
-
this.options.playback?.extrapolatedWindowNumSegments ?? 2;
|
|
12344
12345
|
if (this.options.playbackType) {
|
|
12345
12346
|
this._playbackType = this.options.playbackType;
|
|
12346
12347
|
}
|
|
12347
|
-
// this._lastTimeUpdate = { current: 0, total: 0 };
|
|
12348
|
-
// this._lastDuration = null;
|
|
12349
|
-
// for hls streams which have dvr with a sliding window,
|
|
12350
|
-
// the content at the start of the playlist is removed as new
|
|
12351
|
-
// content is appended at the end.
|
|
12352
|
-
// this means the actual playable start time will increase as the
|
|
12353
|
-
// start content is deleted
|
|
12354
|
-
// For streams with dvr where the entire recording is kept from the
|
|
12355
|
-
// beginning this should stay as 0
|
|
12356
|
-
// this._playableRegionStartTime = 0;
|
|
12357
|
-
// {local, remote} remote is the time in the video element that should represent 0
|
|
12358
|
-
// local is the system time when the 'remote' measurment took place
|
|
12359
|
-
// this._localStartTimeCorrelation = null;
|
|
12360
|
-
// {local, remote} remote is the time in the video element that should represents the end
|
|
12361
|
-
// local is the system time when the 'remote' measurment took place
|
|
12362
|
-
// this._localEndTimeCorrelation = null;
|
|
12363
|
-
// if content is removed from the beginning then this empty area should
|
|
12364
|
-
// be ignored. "playableRegionDuration" excludes the empty area
|
|
12365
|
-
// this._playableRegionDuration = 0;
|
|
12366
|
-
// #EXT-X-PROGRAM-DATE-TIME
|
|
12367
|
-
// this._programDateTime = 0;
|
|
12368
|
-
// this.manifestInfo = null;
|
|
12369
|
-
// true when the actual duration is longer than hlsjs's live sync point
|
|
12370
|
-
// when this is false playableRegionDuration will be the actual duration
|
|
12371
|
-
// when this is true playableRegionDuration will exclude the time after the sync point
|
|
12372
|
-
// this._durationExcludesAfterLiveSyncPoint = false;
|
|
12373
|
-
// // #EXT-X-TARGETDURATION
|
|
12374
|
-
// this._segmentTargetDuration = null;
|
|
12375
|
-
// #EXT-X-PLAYLIST-TYPE
|
|
12376
|
-
// this._playlistType = null;
|
|
12377
|
-
if (this.options.hlsRecoverAttempts) {
|
|
12378
|
-
this._recoverAttemptsRemaining = this.options.hlsRecoverAttempts;
|
|
12379
|
-
}
|
|
12380
12348
|
}
|
|
12381
12349
|
_setup() {
|
|
12382
12350
|
const dash = DASHJS.MediaPlayer().create();
|
|
12383
12351
|
this._dash = dash;
|
|
12384
12352
|
this._dash.initialize();
|
|
12385
|
-
|
|
12386
|
-
|
|
12387
|
-
|
|
12388
|
-
|
|
12353
|
+
if (this.options.dash) {
|
|
12354
|
+
const settings = structuredClone(this.options.dash);
|
|
12355
|
+
if (!settings.streaming) {
|
|
12356
|
+
settings.streaming = {};
|
|
12357
|
+
}
|
|
12358
|
+
if (!settings.streaming.text) {
|
|
12359
|
+
settings.streaming.text = {
|
|
12360
|
+
defaultEnabled: false,
|
|
12361
|
+
};
|
|
12362
|
+
}
|
|
12363
|
+
this._dash.updateSettings(this.options.dash);
|
|
12364
|
+
}
|
|
12389
12365
|
this._dash.attachView(this.el);
|
|
12390
12366
|
this._dash.setAutoPlay(false);
|
|
12391
12367
|
this._dash.attachSource(this.options.src);
|
|
@@ -12427,28 +12403,6 @@ class DashPlayback extends HTML5Video {
|
|
|
12427
12403
|
this._isReadyState = true;
|
|
12428
12404
|
this.trigger(Events$1.PLAYBACK_READY, this.name);
|
|
12429
12405
|
}
|
|
12430
|
-
// TODO
|
|
12431
|
-
// _recover(evt, data, error) {
|
|
12432
|
-
// console.warn('recover', evt, data, error);
|
|
12433
|
-
// assert.ok(this._dash, 'An instance of dashjs MediaPlayer is required to recover');
|
|
12434
|
-
// // TODO figure out what's going on here
|
|
12435
|
-
// const dash = this._dash;
|
|
12436
|
-
// if (!this._recoveredDecodingError) {
|
|
12437
|
-
// this._recoveredDecodingError = true;
|
|
12438
|
-
// // dash.recoverMediaError();
|
|
12439
|
-
// } else if (!this._recoveredAudioCodecError) {
|
|
12440
|
-
// this._recoveredAudioCodecError = true;
|
|
12441
|
-
// // dash.swapAudioCodec();
|
|
12442
|
-
// // dash.recoverMediaError();
|
|
12443
|
-
// } else {
|
|
12444
|
-
// // TODO what does it have to do with hlsjs?
|
|
12445
|
-
// Log.error('hlsjs: failed to recover', { evt, data });
|
|
12446
|
-
// error.level = PlayerError.Levels.FATAL;
|
|
12447
|
-
// const formattedError = this.createError(error);
|
|
12448
|
-
// this.trigger(Events.PLAYBACK_ERROR, formattedError);
|
|
12449
|
-
// this.stop();
|
|
12450
|
-
// }
|
|
12451
|
-
// }
|
|
12452
12406
|
// override
|
|
12453
12407
|
_setupSrc() {
|
|
12454
12408
|
// this playback manages the src on the video element itself
|
|
@@ -12516,7 +12470,6 @@ class DashPlayback extends HTML5Video {
|
|
|
12516
12470
|
_updateSettings() {
|
|
12517
12471
|
if (this._playbackType === Playback.VOD) {
|
|
12518
12472
|
this.settings.left = ['playpause', 'position', 'duration'];
|
|
12519
|
-
// this.settings.left.push('playstop');
|
|
12520
12473
|
}
|
|
12521
12474
|
else if (this.dvrEnabled) {
|
|
12522
12475
|
this.settings.left = ['playpause'];
|
|
@@ -12712,131 +12665,6 @@ class DashPlayback extends HTML5Video {
|
|
|
12712
12665
|
});
|
|
12713
12666
|
this.trigger(Events$1.PLAYBACK_LEVELS_AVAILABLE, this._levels);
|
|
12714
12667
|
}
|
|
12715
|
-
// _onLevelUpdated(_: any, data) {
|
|
12716
|
-
// this._segmentTargetDuration = data.details.targetduration;
|
|
12717
|
-
// this._playlistType = data.details.type || null;
|
|
12718
|
-
// let startTimeChanged = false;
|
|
12719
|
-
// let durationChanged = false;
|
|
12720
|
-
// const fragments = data.details.fragments;
|
|
12721
|
-
// const previousPlayableRegionStartTime = this._playableRegionStartTime;
|
|
12722
|
-
// const previousPlayableRegionDuration = this._playableRegionDuration;
|
|
12723
|
-
// if (fragments.length === 0) {
|
|
12724
|
-
// return;
|
|
12725
|
-
// }
|
|
12726
|
-
// // #EXT-X-PROGRAM-DATE-TIME
|
|
12727
|
-
// if (fragments[0].rawProgramDateTime) {
|
|
12728
|
-
// this._programDateTime = fragments[0].rawProgramDateTime;
|
|
12729
|
-
// }
|
|
12730
|
-
// if (this._playableRegionStartTime !== fragments[0].start) {
|
|
12731
|
-
// startTimeChanged = true;
|
|
12732
|
-
// this._playableRegionStartTime = fragments[0].start;
|
|
12733
|
-
// }
|
|
12734
|
-
// if (startTimeChanged) {
|
|
12735
|
-
// if (!this._localStartTimeCorrelation) {
|
|
12736
|
-
// // set the correlation to map to middle of the extrapolation window
|
|
12737
|
-
// this._localStartTimeCorrelation = {
|
|
12738
|
-
// local: this._now,
|
|
12739
|
-
// remote: (fragments[0].start + (this._extrapolatedWindowDuration / 2)) * 1000
|
|
12740
|
-
// };
|
|
12741
|
-
// } else {
|
|
12742
|
-
// // check if the correlation still works
|
|
12743
|
-
// const corr = this._localStartTimeCorrelation;
|
|
12744
|
-
// const timePassed = this._now - corr.local;
|
|
12745
|
-
// // this should point to a time within the extrapolation window
|
|
12746
|
-
// const startTime = (corr.remote + timePassed) / 1000;
|
|
12747
|
-
// if (startTime < fragments[0].start) {
|
|
12748
|
-
// // our start time is now earlier than the first chunk
|
|
12749
|
-
// // (maybe the chunk was removed early)
|
|
12750
|
-
// // reset correlation so that it sits at the beginning of the first available chunk
|
|
12751
|
-
// this._localStartTimeCorrelation = {
|
|
12752
|
-
// local: this._now,
|
|
12753
|
-
// remote: fragments[0].start * 1000
|
|
12754
|
-
// };
|
|
12755
|
-
// } else if (startTime > previousPlayableRegionStartTime + this._extrapolatedWindowDuration) {
|
|
12756
|
-
// // start time was past the end of the old extrapolation window (so would have been capped)
|
|
12757
|
-
// // see if now that time would be inside the window, and if it would be set the correlation
|
|
12758
|
-
// // so that it resumes from the time it was at at the end of the old window
|
|
12759
|
-
// // update the correlation so that the time starts counting again from the value it's on now
|
|
12760
|
-
// this._localStartTimeCorrelation = {
|
|
12761
|
-
// local: this._now,
|
|
12762
|
-
// remote: Math.max(
|
|
12763
|
-
// fragments[0].start,
|
|
12764
|
-
// previousPlayableRegionStartTime + this._extrapolatedWindowDuration
|
|
12765
|
-
// ) * 1000
|
|
12766
|
-
// };
|
|
12767
|
-
// }
|
|
12768
|
-
// }
|
|
12769
|
-
// }
|
|
12770
|
-
// let newDuration = data.details.totalduration;
|
|
12771
|
-
// // if it's a live stream then shorten the duration to remove access
|
|
12772
|
-
// // to the area after hlsjs's live sync point
|
|
12773
|
-
// // seeks to areas after this point sometimes have issues
|
|
12774
|
-
// if (this._playbackType === Playback.LIVE) {
|
|
12775
|
-
// const fragmentTargetDuration = data.details.targetduration;
|
|
12776
|
-
// const hlsjsConfig = this.options.playback.hlsjsConfig || {};
|
|
12777
|
-
// // eslint-disable-next-line no-undef
|
|
12778
|
-
// const liveSyncDurationCount = hlsjsConfig.liveSyncDurationCount || HLSJS.DefaultConfig.liveSyncDurationCount;
|
|
12779
|
-
// const hiddenAreaDuration = fragmentTargetDuration * liveSyncDurationCount;
|
|
12780
|
-
// if (hiddenAreaDuration <= newDuration) {
|
|
12781
|
-
// newDuration -= hiddenAreaDuration;
|
|
12782
|
-
// this._durationExcludesAfterLiveSyncPoint = true;
|
|
12783
|
-
// } else {
|
|
12784
|
-
// this._durationExcludesAfterLiveSyncPoint = false;
|
|
12785
|
-
// }
|
|
12786
|
-
// }
|
|
12787
|
-
// if (newDuration !== this._playableRegionDuration) {
|
|
12788
|
-
// durationChanged = true;
|
|
12789
|
-
// this._playableRegionDuration = newDuration;
|
|
12790
|
-
// }
|
|
12791
|
-
// // Note the end time is not the playableRegionDuration
|
|
12792
|
-
// // The end time will always increase even if content is removed from the beginning
|
|
12793
|
-
// const endTime = fragments[0].start + newDuration;
|
|
12794
|
-
// const previousEndTime = previousPlayableRegionStartTime + previousPlayableRegionDuration;
|
|
12795
|
-
// const endTimeChanged = endTime !== previousEndTime;
|
|
12796
|
-
// if (endTimeChanged) {
|
|
12797
|
-
// if (!this._localEndTimeCorrelation) {
|
|
12798
|
-
// // set the correlation to map to the end
|
|
12799
|
-
// this._localEndTimeCorrelation = {
|
|
12800
|
-
// local: this._now,
|
|
12801
|
-
// remote: endTime * 1000
|
|
12802
|
-
// };
|
|
12803
|
-
// } else {
|
|
12804
|
-
// // check if the correlation still works
|
|
12805
|
-
// const corr = this._localEndTimeCorrelation;
|
|
12806
|
-
// const timePassed = this._now - corr.local;
|
|
12807
|
-
// // this should point to a time within the extrapolation window from the end
|
|
12808
|
-
// const extrapolatedEndTime = (corr.remote + timePassed) / 1000;
|
|
12809
|
-
// if (extrapolatedEndTime > endTime) {
|
|
12810
|
-
// this._localEndTimeCorrelation = {
|
|
12811
|
-
// local: this._now,
|
|
12812
|
-
// remote: endTime * 1000
|
|
12813
|
-
// };
|
|
12814
|
-
// } else if (extrapolatedEndTime < endTime - this._extrapolatedWindowDuration) {
|
|
12815
|
-
// // our extrapolated end time is now earlier than the extrapolation window from the actual end time
|
|
12816
|
-
// // (maybe a chunk became available early)
|
|
12817
|
-
// // reset correlation so that it sits at the beginning of the extrapolation window from the end time
|
|
12818
|
-
// this._localEndTimeCorrelation = {
|
|
12819
|
-
// local: this._now,
|
|
12820
|
-
// remote: (endTime - this._extrapolatedWindowDuration) * 1000
|
|
12821
|
-
// };
|
|
12822
|
-
// } else if (extrapolatedEndTime > previousEndTime) {
|
|
12823
|
-
// // end time was past the old end time (so would have been capped)
|
|
12824
|
-
// // set the correlation so that it resumes from the time it was at at the end of the old window
|
|
12825
|
-
// this._localEndTimeCorrelation = {
|
|
12826
|
-
// local: this._now,
|
|
12827
|
-
// remote: previousEndTime * 1000
|
|
12828
|
-
// };
|
|
12829
|
-
// }
|
|
12830
|
-
// }
|
|
12831
|
-
// }
|
|
12832
|
-
// // now that the values have been updated call any methods that use on them so they get the updated values
|
|
12833
|
-
// // immediately
|
|
12834
|
-
// durationChanged && this._onDurationChange();
|
|
12835
|
-
// startTimeChanged && this._onProgress();
|
|
12836
|
-
// }
|
|
12837
|
-
// _onFragmentLoaded(evt, data) {
|
|
12838
|
-
// this.trigger(Events.PLAYBACK_FRAGMENT_LOADED, data);
|
|
12839
|
-
// }
|
|
12840
12668
|
onLevelSwitch(currentLevel) {
|
|
12841
12669
|
this.trigger(Events$1.PLAYBACK_BITRATE, {
|
|
12842
12670
|
height: currentLevel.height,
|
|
@@ -12857,7 +12685,6 @@ DashPlayback.canPlay = function (resource, mimeType) {
|
|
|
12857
12685
|
const isDash = (resourceParts.length > 1 && resourceParts[1].toLowerCase() === 'mpd') ||
|
|
12858
12686
|
mimeType === 'application/dash+xml' ||
|
|
12859
12687
|
mimeType === 'video/mp4';
|
|
12860
|
-
// TODO check
|
|
12861
12688
|
const ms = window.MediaSource;
|
|
12862
12689
|
const mms = 'ManagedMediaSource' in window ? window.ManagedMediaSource : undefined;
|
|
12863
12690
|
const wms = 'WebKitMediaSource' in window ? window.WebKitMediaSource : undefined;
|
|
@@ -42738,12 +42565,12 @@ class SentryTracer {
|
|
|
42738
42565
|
}
|
|
42739
42566
|
}
|
|
42740
42567
|
|
|
42741
|
-
var version$1 = "2.6.
|
|
42568
|
+
var version$1 = "2.6.2";
|
|
42742
42569
|
|
|
42743
42570
|
var packages = {
|
|
42744
42571
|
"": {
|
|
42745
42572
|
name: "@gcorevideo/player",
|
|
42746
|
-
version: "2.6.
|
|
42573
|
+
version: "2.6.2",
|
|
42747
42574
|
license: "Apache-2.0",
|
|
42748
42575
|
dependencies: {
|
|
42749
42576
|
"@clappr/core": "^0.11.3",
|
|
@@ -23,14 +23,10 @@ export default class DashPlayback extends HTML5Video {
|
|
|
23
23
|
_programDateTime: TimeValue;
|
|
24
24
|
_dash: DASHJS.MediaPlayerClass | null;
|
|
25
25
|
_extrapolatedWindowDuration: number;
|
|
26
|
-
_extrapolatedWindowNumSegments: number;
|
|
27
26
|
_lastDuration: TimeValue | null;
|
|
28
27
|
_lastTimeUpdate: TimePosition;
|
|
29
28
|
_localStartTimeCorrelation: LocalTimeCorrelation | null;
|
|
30
29
|
_localEndTimeCorrelation: LocalTimeCorrelation | null;
|
|
31
|
-
_recoverAttemptsRemaining: number;
|
|
32
|
-
_recoveredAudioCodecError: boolean;
|
|
33
|
-
_recoveredDecodingError: boolean;
|
|
34
30
|
startChangeQuality: boolean;
|
|
35
31
|
manifestInfo: IManifestInfo | null;
|
|
36
32
|
_segmentTargetDuration: TimeValue | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashPlayback.d.ts","sourceRoot":"","sources":["../../../src/plugins/dash-playback/DashPlayback.ts"],"names":[],"mappings":"AAIA,OAAO,
|
|
1
|
+
{"version":3,"file":"DashPlayback.d.ts","sourceRoot":"","sources":["../../../src/plugins/dash-playback/DashPlayback.ts"],"names":[],"mappings":"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"}
|