bigscreen-player 10.15.5 → 10.16.0

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.
@@ -1,5 +1,5 @@
1
1
  import { fromXML, generateISD, renderHTML } from 'smp-imsc';
2
- import { U as Utils, a as DebugTool, P as Plugins, D as DOMHelpers } from './main-b8ed400c.js';
2
+ import { U as Utils, a as DebugTool, P as Plugins, D as DOMHelpers } from './main-bfedf7e6.js';
3
3
  import 'tslib';
4
4
 
5
5
  function EmbeddedSubtitles(mediaPlayer, parentElement, { autoStart = false, defaultStyleOpts = {} } = {}) {
@@ -1,5 +1,5 @@
1
1
  import { fromXML, generateISD, renderHTML } from 'smp-imsc';
2
- import { f as findSegmentTemplate, L as LoadUrl, a as DebugTool, P as Plugins, U as Utils, D as DOMHelpers } from './main-b8ed400c.js';
2
+ import { f as findSegmentTemplate, L as LoadUrl, a as DebugTool, P as Plugins, U as Utils, D as DOMHelpers } from './main-bfedf7e6.js';
3
3
  import 'tslib';
4
4
 
5
5
  const SEGMENTS_BUFFER_SIZE = 3;
@@ -1,4 +1,4 @@
1
- import { D as DOMHelpers, a as DebugTool, P as Plugins, L as LoadUrl, T as TransportControlPosition } from './main-b8ed400c.js';
1
+ import { D as DOMHelpers, a as DebugTool, P as Plugins, L as LoadUrl, T as TransportControlPosition } from './main-bfedf7e6.js';
2
2
  import 'tslib';
3
3
 
4
4
  /**
@@ -5710,7 +5710,7 @@ BasicStrategy.getLiveSupport = () => LiveSupport.SEEKABLE;
5710
5710
  function StrategyPicker() {
5711
5711
  return new Promise((resolve, reject) => {
5712
5712
  if (window.bigscreenPlayer.playbackStrategy === PlaybackStrategy.MSE) {
5713
- return import('./msestrategy-65b9aef1.js')
5713
+ return import('./msestrategy-b3da415e.js')
5714
5714
  .then(({ default: MSEStrategy }) => resolve(MSEStrategy))
5715
5715
  .catch((reason) => {
5716
5716
  const error = new Error(isError(reason) ? reason.message : undefined);
@@ -6005,8 +6005,9 @@ var Plugins = {
6005
6005
  onPlayerInfoUpdated: (evt) => callOnAllPlugins("onPlayerInfoUpdated", evt),
6006
6006
  onManifestLoaded: (manifest) => callOnAllPlugins("onManifestLoaded", manifest),
6007
6007
  onManifestParseError: (evt) => callOnAllPlugins("onManifestParseError", evt),
6008
+ onDownloadQualityChange: (evt) => callOnAllPlugins("onDownloadQualityChange", evt),
6008
6009
  onQualityChangeRequested: (evt) => callOnAllPlugins("onQualityChangeRequested", evt),
6009
- onQualityChangedRendered: (evt) => callOnAllPlugins("onQualityChangedRendered", evt),
6010
+ onQualityChangeRendered: (evt) => callOnAllPlugins("onQualityChangeRendered", evt),
6010
6011
  onSubtitlesLoadError: (evt) => callOnAllPlugins("onSubtitlesLoadError", evt),
6011
6012
  onSubtitlesTimeout: (evt) => callOnAllPlugins("onSubtitlesTimeout", evt),
6012
6013
  onSubtitlesXMLError: (evt) => callOnAllPlugins("onSubtitlesXMLError", evt),
@@ -6015,6 +6016,7 @@ var Plugins = {
6015
6016
  onSubtitlesDynamicLoadError: (evt) => callOnAllPlugins("onSubtitlesDynamicLoadError", evt),
6016
6017
  onFragmentContentLengthMismatch: (evt) => callOnAllPlugins("onFragmentContentLengthMismatch", evt),
6017
6018
  onQuotaExceeded: (evt) => callOnAllPlugins("onQuotaExceeded", evt),
6019
+ onPlaybackQualityChange: (evt) => callOnAllPlugins("onPlaybackQualityChange", evt),
6018
6020
  onPlaybackRateChanged: (evt) => callOnAllPlugins("onPlaybackRateChanged", evt),
6019
6021
  onPlaybackFrozen: (evt) => callOnAllPlugins("onPlaybackFrozen", evt),
6020
6022
  },
@@ -6509,7 +6511,7 @@ const PauseTriggers = {
6509
6511
  DEVICE: 3,
6510
6512
  };
6511
6513
 
6512
- var Version = "10.15.5";
6514
+ var Version = "10.16.0";
6513
6515
 
6514
6516
  /* eslint-disable no-use-before-define */
6515
6517
 
@@ -7701,7 +7703,7 @@ function Subtitles(
7701
7703
 
7702
7704
  if (available()) {
7703
7705
  if (useLegacySubs) {
7704
- import('./legacysubtitles-df133753.js')
7706
+ import('./legacysubtitles-cd82cb3e.js')
7705
7707
  .then(({ default: LegacySubtitles }) => {
7706
7708
  subtitlesContainer = LegacySubtitles(mediaPlayer, playbackElement, mediaSources, {
7707
7709
  alwaysOnTop,
@@ -7715,7 +7717,7 @@ function Subtitles(
7715
7717
  Plugins.interface.onSubtitlesDynamicLoadError();
7716
7718
  });
7717
7719
  } else if (embeddedSubs) {
7718
- import('./embeddedsubtitles-a9a29366.js')
7720
+ import('./embeddedsubtitles-e981440e.js')
7719
7721
  .then(({ default: EmbeddedSubtitles }) => {
7720
7722
  subtitlesContainer = EmbeddedSubtitles(mediaPlayer, playbackElement, {
7721
7723
  autoStart,
@@ -7728,7 +7730,7 @@ function Subtitles(
7728
7730
  Plugins.interface.onSubtitlesDynamicLoadError();
7729
7731
  });
7730
7732
  } else {
7731
- import('./imscsubtitles-33e1c869.js')
7733
+ import('./imscsubtitles-70f433df.js')
7732
7734
  .then(({ default: IMSCSubtitles }) => {
7733
7735
  subtitlesContainer = IMSCSubtitles(mediaPlayer, playbackElement, mediaSources, {
7734
7736
  alwaysOnTop,
package/dist/esm/main.js CHANGED
@@ -1,2 +1,2 @@
1
- export { B as BigscreenPlayer, a as DebugTool, E as EntryCategory, b as LiveSupport, c as ManifestType, M as MediaKinds, d as MediaState, g as MockBigscreenPlayer, h as PauseTriggers, i as PlaybackStrategy, k as Timeline, j as TransferFormat, T as TransportControlPosition, W as WindowTypes, l as isMessage, m as isMetric, n as isTrace } from './main-b8ed400c.js';
1
+ export { B as BigscreenPlayer, a as DebugTool, E as EntryCategory, b as LiveSupport, c as ManifestType, M as MediaKinds, d as MediaState, g as MockBigscreenPlayer, h as PauseTriggers, i as PlaybackStrategy, k as Timeline, j as TransferFormat, T as TransportControlPosition, W as WindowTypes, l as isMessage, m as isMetric, n as isTrace } from './main-bfedf7e6.js';
2
2
  import 'tslib';
@@ -1,5 +1,5 @@
1
1
  import { MediaPlayer } from 'dashjs/index';
2
- import { U as Utils, M as MediaKinds, b as LiveSupport, a as DebugTool, c as ManifestType, P as Plugins, d as MediaState, e as autoResumeAtStartOfRange, D as DOMHelpers } from './main-b8ed400c.js';
2
+ import { U as Utils, M as MediaKinds, b as LiveSupport, a as DebugTool, c as ManifestType, P as Plugins, d as MediaState, e as autoResumeAtStartOfRange, D as DOMHelpers } from './main-bfedf7e6.js';
3
3
  import 'tslib';
4
4
 
5
5
  function filter(manifest, representationOptions) {
@@ -119,6 +119,31 @@ function convertTimeRangesToArray(ranges) {
119
119
  return array;
120
120
  }
121
121
 
122
+ function setPropertyPath(target, path, value) {
123
+ if (target == null || (typeof target !== "object" && typeof target !== "function")) {
124
+ throw new TypeError(`Target must be an object. (got ${target})`);
125
+ }
126
+ const keysDesc = typeof path === "string" ? path.split(".") : path;
127
+ if (keysDesc.length === 0) {
128
+ throw new TypeError("Empty path provided. (got [])");
129
+ }
130
+ const key = keysDesc.shift();
131
+ if (key == null) {
132
+ throw new TypeError(`Cannot index object with key. (got key '${key}')`);
133
+ }
134
+ if (keysDesc.length === 0) {
135
+ target[key] = value;
136
+ return;
137
+ }
138
+ let next = target[key];
139
+ if (next != null && typeof next !== "object" && typeof next !== "function") {
140
+ throw new TypeError(`Cannot assign to primitive value. (got '${next}')`);
141
+ }
142
+ next !== null && next !== void 0 ? next : (next = {});
143
+ target[key] = next;
144
+ setPropertyPath(next, keysDesc, value);
145
+ }
146
+
122
147
  const DEFAULT_SETTINGS = {
123
148
  liveDelay: 0,
124
149
  seekDurationPadding: 1.1,
@@ -193,6 +218,10 @@ function MSEStrategy(
193
218
  [MediaKinds.AUDIO]: undefined,
194
219
  [MediaKinds.VIDEO]: undefined,
195
220
  },
221
+ playbackQuality: {
222
+ [MediaKinds.AUDIO]: undefined,
223
+ [MediaKinds.VIDEO]: undefined,
224
+ },
196
225
  playbackBitrate: undefined,
197
226
  bufferLength: undefined,
198
227
  latency: undefined,
@@ -438,6 +467,8 @@ function MSEStrategy(
438
467
  mediaPlayer.setMediaDuration(Number.MAX_SAFE_INTEGER);
439
468
  }
440
469
 
470
+ DebugTool.info("Stream initialised");
471
+
441
472
  if (mediaPlayer.getActiveStream()?.getHasVideoTrack()) {
442
473
  dispatchDownloadQualityChangeForKind(MediaKinds.VIDEO);
443
474
  dispatchMaxQualityChangeForKind(MediaKinds.VIDEO);
@@ -486,6 +517,43 @@ function MSEStrategy(
486
517
  const switchToPart = ` to ${qualityIndex} (${(bitrateInBps / 1000).toFixed(0)} kbps)`;
487
518
 
488
519
  DebugTool.info(`${abrChangePart}${switchFromPart}${switchToPart}`);
520
+
521
+ Plugins.interface.onDownloadQualityChange({
522
+ type: "downloadqualitychange",
523
+ detail: {
524
+ mediaType: kind,
525
+ currentBitrateInBps: bitrateInBps,
526
+ currentQualityIndex: qualityIndex,
527
+ previousBitrateInBps: prevBitrateInBps,
528
+ previousQualityIndex: prevQualityIndex,
529
+ },
530
+ });
531
+ }
532
+
533
+ function dispatchPlaybackQualityChangeForKind(kind, { qualityIndex } = {}) {
534
+ const { qualityIndex: previousQualityIndex, bitrateInBps: previousBitrateInBps } =
535
+ playerMetadata.playbackQuality[kind] ?? {};
536
+
537
+ if (previousQualityIndex === qualityIndex) {
538
+ return
539
+ }
540
+
541
+ const bitrateInBps = playbackBitrateForRepresentationIndex(qualityIndex, kind);
542
+
543
+ playerMetadata.playbackQuality[kind] = { bitrateInBps, qualityIndex };
544
+
545
+ DebugTool.dynamicMetric(`${kind}-playback-quality`, [qualityIndex, bitrateInBps]);
546
+
547
+ Plugins.interface.onPlaybackQualityChange({
548
+ type: "playbackqualitychange",
549
+ detail: {
550
+ mediaType: kind,
551
+ previousBitrateInBps,
552
+ previousQualityIndex,
553
+ currentBitrateInBps: bitrateInBps,
554
+ currentQualityIndex: qualityIndex,
555
+ },
556
+ });
489
557
  }
490
558
 
491
559
  function dispatchMaxQualityChangeForKind(kind) {
@@ -536,23 +604,16 @@ function MSEStrategy(
536
604
  }
537
605
 
538
606
  function onQualityChangeRendered(event) {
539
- if (
540
- event.newQuality !== undefined &&
541
- (event.mediaType === MediaKinds.AUDIO || event.mediaType === MediaKinds.VIDEO)
542
- ) {
543
- const { mediaType, newQuality } = event;
544
-
545
- DebugTool.dynamicMetric(`${mediaType}-playback-quality`, [
546
- newQuality,
547
- playbackBitrateForRepresentationIndex(newQuality, mediaType),
548
- ]);
607
+ const { mediaType, newQuality } = event;
549
608
 
609
+ if (newQuality !== undefined && (mediaType === MediaKinds.AUDIO || mediaType === MediaKinds.VIDEO)) {
610
+ dispatchPlaybackQualityChangeForKind(mediaType, { qualityIndex: newQuality });
550
611
  dispatchMaxQualityChangeForKind(mediaType);
551
612
  }
552
613
 
553
614
  emitPlayerInfo();
554
615
 
555
- Plugins.interface.onQualityChangedRendered(event);
616
+ Plugins.interface.onQualityChangeRendered(event);
556
617
  }
557
618
 
558
619
  /**
@@ -1129,17 +1190,22 @@ function MSEStrategy(
1129
1190
  * Set constrained audio or video bitrate
1130
1191
  */
1131
1192
  function setBitrateConstraint(mediaKind, minBitrateKbps, maxBitrateKbps) {
1193
+ if (mediaKind !== MediaKinds.AUDIO && mediaKind !== MediaKinds.VIDEO) {
1194
+ throw new TypeError(`Bitrate constraint not supported for this media kind. (got ${mediaKind})`)
1195
+ }
1196
+
1197
+ if (mediaPlayer == null) {
1198
+ setPropertyPath(playerSettings, ["streaming", "abr", "minBitrate", mediaKind], minBitrateKbps);
1199
+ setPropertyPath(playerSettings, ["streaming", "abr", "maxBitrate", mediaKind], maxBitrateKbps);
1200
+
1201
+ return
1202
+ }
1203
+
1132
1204
  mediaPlayer.updateSettings({
1133
1205
  streaming: {
1134
1206
  abr: {
1135
- minBitrate: {
1136
- audio: mediaKind === MediaKinds.AUDIO ? minBitratKbps : -1,
1137
- video: mediaKind === MediaKinds.VIDEO ? minBitrateKbps : -1,
1138
- },
1139
- maxBitrate: {
1140
- audio: mediaKind === MediaKinds.AUDIO ? maxBitrateKbps : -1,
1141
- video: mediaKind === MediaKinds.VIDEO ? maxBitrateKbps : -1,
1142
- },
1207
+ minBitrate: { [mediaKind]: minBitrateKbps },
1208
+ maxBitrate: { [mediaKind]: maxBitrateKbps },
1143
1209
  },
1144
1210
  },
1145
1211
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bigscreen-player",
3
- "version": "10.15.5",
3
+ "version": "10.16.0",
4
4
  "type": "module",
5
5
  "description": "Simplified media playback for bigscreen devices.",
6
6
  "main": "dist/esm/main.js",