hls.js 1.5.14 → 1.5.16

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/hls.js CHANGED
@@ -552,7 +552,7 @@
552
552
  // Some browsers don't allow to use bind on console object anyway
553
553
  // fallback to default if needed
554
554
  try {
555
- exportedLogger.log("Debug logs enabled for \"" + id + "\" in hls.js version " + "1.5.14");
555
+ exportedLogger.log("Debug logs enabled for \"" + id + "\" in hls.js version " + "1.5.16");
556
556
  } catch (e) {
557
557
  exportedLogger = fakeLogger;
558
558
  }
@@ -1288,15 +1288,19 @@
1288
1288
 
1289
1289
  // System IDs for which we can extract a key ID from "encrypted" event PSSH
1290
1290
  var KeySystemIds = {
1291
+ CENC: "1077efecc0b24d02ace33c1e52e2fb4b",
1292
+ CLEARKEY: "e2719d58a985b3c9781ab030af78d30e",
1293
+ FAIRPLAY: "94ce86fb07ff4f43adb893d2fa968ca2",
1294
+ PLAYREADY: "9a04f07998404286ab92e65be0885f95",
1291
1295
  WIDEVINE: "edef8ba979d64acea3c827dcd51d21ed"
1292
1296
  };
1293
1297
  function keySystemIdToKeySystemDomain(systemId) {
1294
1298
  if (systemId === KeySystemIds.WIDEVINE) {
1295
1299
  return KeySystems.WIDEVINE;
1296
- // } else if (systemId === KeySystemIds.PLAYREADY) {
1297
- // return KeySystems.PLAYREADY;
1298
- // } else if (systemId === KeySystemIds.CENC || systemId === KeySystemIds.CLEARKEY) {
1299
- // return KeySystems.CLEARKEY;
1300
+ } else if (systemId === KeySystemIds.PLAYREADY) {
1301
+ return KeySystems.PLAYREADY;
1302
+ } else if (systemId === KeySystemIds.CENC || systemId === KeySystemIds.CLEARKEY) {
1303
+ return KeySystems.CLEARKEY;
1300
1304
  }
1301
1305
  }
1302
1306
  function keySystemDomainToKeySystemFormat(keySystem) {
@@ -2178,7 +2182,6 @@
2178
2182
  return findBox(sinf, ['schi', 'tenc'])[0];
2179
2183
  }
2180
2184
  }
2181
- logger.error("[eme] missing 'schm' box");
2182
2185
  return null;
2183
2186
  }
2184
2187
 
@@ -2858,43 +2861,77 @@
2858
2861
  // 16 bytes
2859
2862
  kidCount, kids, dataSize, data || new Uint8Array());
2860
2863
  }
2861
- function parsePssh(initData) {
2862
- if (!(initData instanceof ArrayBuffer) || initData.byteLength < 32) {
2863
- return null;
2864
+ function parseMultiPssh(initData) {
2865
+ var results = [];
2866
+ if (initData instanceof ArrayBuffer) {
2867
+ var length = initData.byteLength;
2868
+ var offset = 0;
2869
+ while (offset + 32 < length) {
2870
+ var view = new DataView(initData, offset);
2871
+ var pssh = parsePssh(view);
2872
+ results.push(pssh);
2873
+ offset += pssh.size;
2874
+ }
2864
2875
  }
2865
- var result = {
2866
- version: 0,
2867
- systemId: '',
2868
- kids: null,
2869
- data: null
2870
- };
2871
- var view = new DataView(initData);
2872
- var boxSize = view.getUint32(0);
2873
- if (initData.byteLength !== boxSize && boxSize > 44) {
2874
- return null;
2876
+ return results;
2877
+ }
2878
+ function parsePssh(view) {
2879
+ var size = view.getUint32(0);
2880
+ var offset = view.byteOffset;
2881
+ var length = view.byteLength;
2882
+ if (length < size) {
2883
+ return {
2884
+ offset: offset,
2885
+ size: length
2886
+ };
2875
2887
  }
2876
2888
  var type = view.getUint32(4);
2877
2889
  if (type !== 0x70737368) {
2878
- return null;
2890
+ return {
2891
+ offset: offset,
2892
+ size: size
2893
+ };
2879
2894
  }
2880
- result.version = view.getUint32(8) >>> 24;
2881
- if (result.version > 1) {
2882
- return null;
2895
+ var version = view.getUint32(8) >>> 24;
2896
+ if (version !== 0 && version !== 1) {
2897
+ return {
2898
+ offset: offset,
2899
+ size: size
2900
+ };
2883
2901
  }
2884
- result.systemId = Hex.hexDump(new Uint8Array(initData, 12, 16));
2902
+ var buffer = view.buffer;
2903
+ var systemId = Hex.hexDump(new Uint8Array(buffer, offset + 12, 16));
2885
2904
  var dataSizeOrKidCount = view.getUint32(28);
2886
- if (result.version === 0) {
2887
- if (boxSize - 32 < dataSizeOrKidCount) {
2888
- return null;
2905
+ var kids = null;
2906
+ var data = null;
2907
+ if (version === 0) {
2908
+ if (size - 32 < dataSizeOrKidCount || dataSizeOrKidCount < 22) {
2909
+ return {
2910
+ offset: offset,
2911
+ size: size
2912
+ };
2913
+ }
2914
+ data = new Uint8Array(buffer, offset + 32, dataSizeOrKidCount);
2915
+ } else if (version === 1) {
2916
+ if (!dataSizeOrKidCount || length < offset + 32 + dataSizeOrKidCount * 16 + 16) {
2917
+ return {
2918
+ offset: offset,
2919
+ size: size
2920
+ };
2889
2921
  }
2890
- result.data = new Uint8Array(initData, 32, dataSizeOrKidCount);
2891
- } else if (result.version === 1) {
2892
- result.kids = [];
2922
+ kids = [];
2893
2923
  for (var i = 0; i < dataSizeOrKidCount; i++) {
2894
- result.kids.push(new Uint8Array(initData, 32 + i * 16, 16));
2924
+ kids.push(new Uint8Array(buffer, offset + 32 + i * 16, 16));
2895
2925
  }
2896
2926
  }
2897
- return result;
2927
+ return {
2928
+ version: version,
2929
+ systemId: systemId,
2930
+ kids: kids,
2931
+ data: data,
2932
+ offset: offset,
2933
+ size: size
2934
+ };
2898
2935
  }
2899
2936
 
2900
2937
  var keyUriToKeyIdMap = {};
@@ -22856,7 +22893,8 @@
22856
22893
  var _this5 = this;
22857
22894
  var initDataType = event.initDataType,
22858
22895
  initData = event.initData;
22859
- this.debug("\"" + event.type + "\" event: init data type: \"" + initDataType + "\"");
22896
+ var logMessage = "\"" + event.type + "\" event: init data type: \"" + initDataType + "\"";
22897
+ this.debug(logMessage);
22860
22898
 
22861
22899
  // Ignore event when initData is null
22862
22900
  if (initData === null) {
@@ -22871,24 +22909,37 @@
22871
22909
  var sinf = base64Decode(JSON.parse(json).sinf);
22872
22910
  var tenc = parseSinf(new Uint8Array(sinf));
22873
22911
  if (!tenc) {
22874
- return;
22912
+ throw new Error("'schm' box missing or not cbcs/cenc with schi > tenc");
22875
22913
  }
22876
22914
  keyId = tenc.subarray(8, 24);
22877
22915
  keySystemDomain = KeySystems.FAIRPLAY;
22878
22916
  } catch (error) {
22879
- this.warn('Failed to parse sinf "encrypted" event message initData');
22917
+ this.warn(logMessage + " Failed to parse sinf: " + error);
22880
22918
  return;
22881
22919
  }
22882
22920
  } else {
22883
- // Support clear-lead key-session creation (otherwise depend on playlist keys)
22884
- var psshInfo = parsePssh(initData);
22885
- if (psshInfo === null) {
22921
+ // Support Widevine clear-lead key-session creation (otherwise depend on playlist keys)
22922
+ var psshResults = parseMultiPssh(initData);
22923
+ var psshInfo = psshResults.filter(function (pssh) {
22924
+ return pssh.systemId === KeySystemIds.WIDEVINE;
22925
+ })[0];
22926
+ if (!psshInfo) {
22927
+ if (psshResults.length === 0 || psshResults.some(function (pssh) {
22928
+ return !pssh.systemId;
22929
+ })) {
22930
+ this.warn(logMessage + " contains incomplete or invalid pssh data");
22931
+ } else {
22932
+ this.log("ignoring " + logMessage + " for " + psshResults.map(function (pssh) {
22933
+ return keySystemIdToKeySystemDomain(pssh.systemId);
22934
+ }).join(',') + " pssh data in favor of playlist keys");
22935
+ }
22886
22936
  return;
22887
22937
  }
22888
- if (psshInfo.version === 0 && psshInfo.systemId === KeySystemIds.WIDEVINE && psshInfo.data) {
22889
- keyId = psshInfo.data.subarray(8, 24);
22890
- }
22891
22938
  keySystemDomain = keySystemIdToKeySystemDomain(psshInfo.systemId);
22939
+ if (psshInfo.version === 0 && psshInfo.data) {
22940
+ var offset = psshInfo.data.length - 22;
22941
+ keyId = psshInfo.data.subarray(offset, offset + 16);
22942
+ }
22892
22943
  }
22893
22944
  if (!keySystemDomain || !keyId) {
22894
22945
  return;
@@ -22901,12 +22952,15 @@
22901
22952
  // Match playlist key
22902
22953
  var keyContext = mediaKeySessions[i];
22903
22954
  var decryptdata = keyContext.decryptdata;
22904
- if (decryptdata.pssh || !decryptdata.keyId) {
22955
+ if (!decryptdata.keyId) {
22905
22956
  return 0; // continue
22906
22957
  }
22907
22958
  var oldKeyIdHex = Hex.hexDump(decryptdata.keyId);
22908
22959
  if (keyIdHex === oldKeyIdHex || decryptdata.uri.replace(/-/g, '').indexOf(keyIdHex) !== -1) {
22909
22960
  keySessionContextPromise = keyIdToKeySessionPromise[oldKeyIdHex];
22961
+ if (decryptdata.pssh) {
22962
+ return 1; // break
22963
+ }
22910
22964
  delete keyIdToKeySessionPromise[oldKeyIdHex];
22911
22965
  decryptdata.pssh = new Uint8Array(initData);
22912
22966
  decryptdata.keyId = keyId;
@@ -24887,9 +24941,8 @@
24887
24941
  }
24888
24942
  if (pathwayLevels.length !== levels.length) {
24889
24943
  this.log("Found " + pathwayLevels.length + "/" + levels.length + " levels in Pathway \"" + this.pathwayId + "\"");
24890
- return pathwayLevels;
24891
24944
  }
24892
- return levels;
24945
+ return pathwayLevels;
24893
24946
  };
24894
24947
  _proto.getLevelsForPathway = function getLevelsForPathway(pathwayId) {
24895
24948
  if (this.levels === null) {
@@ -29242,7 +29295,7 @@
29242
29295
  * Get the video-dev/hls.js package version.
29243
29296
  */
29244
29297
  function get() {
29245
- return "1.5.14";
29298
+ return "1.5.16";
29246
29299
  }
29247
29300
  }, {
29248
29301
  key: "Events",