@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 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 cfg = {
12268
- streaming: {
12269
- abr: {
12270
- autoSwitchBitrate: {
12271
- video: id === -1,
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
- this.options.dash && dash.updateSettings({ ...this.options.dash, ...cfg });
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
- const cfg = this.options.dash ?? {};
12386
- cfg.streaming = cfg.streaming || {};
12387
- cfg.streaming.text = cfg.streaming.text || { defaultEnabled: false };
12388
- this.options.dash && this._dash.updateSettings(cfg);
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.0";
42568
+ var version$1 = "2.6.2";
42742
42569
 
42743
42570
  var packages = {
42744
42571
  "": {
42745
42572
  name: "@gcorevideo/player",
42746
- version: "2.6.0",
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":"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"}
1
+ {"version":3,"file":"DashPlayback.d.ts","sourceRoot":"","sources":["../../../src/plugins/dash-playback/DashPlayback.ts"],"names":[],"mappings":"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"}