@bendyline/squisq-video-react 2.4.23 → 2.4.25

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.
@@ -2885,13 +2885,13 @@ var getWriteFunction = (format) => {
2885
2885
  switch (format) {
2886
2886
  case "u8":
2887
2887
  case "u8-planar":
2888
- return (view2, offset, value) => view2.setUint8(offset, clamp((value + 1) * 127.5, 0, 255));
2888
+ return (view2, offset, value) => view2.setUint8(offset, clamp(Math.round(value * 128) + 128, 0, 255));
2889
2889
  case "s16":
2890
2890
  case "s16-planar":
2891
- return (view2, offset, value) => view2.setInt16(offset, clamp(Math.round(value * 32767), -32768, 32767), true);
2891
+ return (view2, offset, value) => view2.setInt16(offset, clamp(Math.round(value * 32768), -32768, 32767), true);
2892
2892
  case "s32":
2893
2893
  case "s32-planar":
2894
- return (view2, offset, value) => view2.setInt32(offset, clamp(Math.round(value * 2147483647), -2147483648, 2147483647), true);
2894
+ return (view2, offset, value) => view2.setInt32(offset, clamp(Math.round(value * 2147483648), -2147483648, 2147483647), true);
2895
2895
  case "f32":
2896
2896
  case "f32-planar":
2897
2897
  return (view2, offset, value) => view2.setFloat32(offset, value, true);
@@ -3222,6 +3222,10 @@ var findAacFrequencyIndex = (sampleRate) => {
3222
3222
  var AC3_SAMPLE_RATES = [48e3, 44100, 32e3];
3223
3223
  var EAC3_REDUCED_SAMPLE_RATES = [24e3, 22050, 16e3];
3224
3224
 
3225
+ // ../../node_modules/mediabunny/dist/modules/src/version.js
3226
+ var VERSION = "1.61.0";
3227
+ var VERSIONED_NAME = `Mediabunny v${VERSION}`;
3228
+
3225
3229
  // ../../node_modules/mediabunny/dist/modules/src/codec-data.js
3226
3230
  var AvcNalUnitType;
3227
3231
  (function(AvcNalUnitType2) {
@@ -5256,6 +5260,15 @@ var readVorbisComments = (bytes2, metadataTags) => {
5256
5260
  }
5257
5261
  ;
5258
5262
  break;
5263
+ case "BPM":
5264
+ {
5265
+ const bpm = Number.parseInt(value, 10);
5266
+ if (Number.isInteger(bpm) && bpm > 0) {
5267
+ metadataTags.beatsPerMinute ?? (metadataTags.beatsPerMinute = bpm);
5268
+ }
5269
+ }
5270
+ ;
5271
+ break;
5259
5272
  case "GENRE":
5260
5273
  {
5261
5274
  metadataTags.genre ?? (metadataTags.genre = value);
@@ -6434,7 +6447,7 @@ var inferCodecFromCodecString = (codecString) => {
6434
6447
  return "mp3";
6435
6448
  } else if (codecString.startsWith("mp4a.40.") || codecString === "mp4a.67") {
6436
6449
  return "aac";
6437
- } else if (codecString === "opus") {
6450
+ } else if (codecString === "opus" || codecString === "Opus") {
6438
6451
  return "opus";
6439
6452
  } else if (codecString === "vorbis") {
6440
6453
  return "vorbis";
@@ -7204,7 +7217,7 @@ var formatSubtitleTimestamp = (timestamp) => {
7204
7217
  var toUlaw = (s16) => {
7205
7218
  const MULAW_MAX = 8191;
7206
7219
  const MULAW_BIAS = 33;
7207
- let number = s16;
7220
+ let number = s16 >> 2;
7208
7221
  let mask = 4096;
7209
7222
  let sign = 0;
7210
7223
  let position = 12;
@@ -7235,7 +7248,7 @@ var fromUlaw = (u82) => {
7235
7248
  }
7236
7249
  position = ((number & 240) >> 4) + 5;
7237
7250
  const decoded = (1 << position | (number & 15) << position - 4 | 1 << position - 5) - MULAW_BIAS;
7238
- return sign === 0 ? decoded : -decoded;
7251
+ return (sign === 0 ? decoded : -decoded) << 2;
7239
7252
  };
7240
7253
  var toAlaw = (s16) => {
7241
7254
  const ALAW_MAX = 4095;
@@ -7243,9 +7256,10 @@ var toAlaw = (s16) => {
7243
7256
  let sign = 0;
7244
7257
  let position = 11;
7245
7258
  let lsb = 0;
7246
- let number = s16;
7259
+ let number = s16 >> 3;
7247
7260
  if (number < 0) {
7248
- number = -number;
7261
+ number = -number - 1;
7262
+ } else {
7249
7263
  sign = 128;
7250
7264
  }
7251
7265
  if (number > ALAW_MAX) {
@@ -7273,7 +7287,7 @@ var fromAlaw = (u82) => {
7273
7287
  } else {
7274
7288
  decoded = number << 1 | 1;
7275
7289
  }
7276
- return sign === 0 ? decoded : -decoded;
7290
+ return (sign === 0 ? -decoded : decoded) << 3;
7277
7291
  };
7278
7292
 
7279
7293
  // ../../node_modules/mediabunny/dist/modules/src/packet.js
@@ -7450,7 +7464,6 @@ var AudioResampler = class {
7450
7464
  this.onSample = options.onSample;
7451
7465
  this.bufferSizeInFrames = Math.floor(this.targetSampleRate * 5);
7452
7466
  this.bufferSizeInSamples = this.bufferSizeInFrames * this.targetNumberOfChannels;
7453
- this.outputBuffer = new Float32Array(this.bufferSizeInSamples);
7454
7467
  }
7455
7468
  /**
7456
7469
  * Sets up the channel mixer to handle up/downmixing in the case where input and output channel counts don't match.
@@ -7543,6 +7556,9 @@ var AudioResampler = class {
7543
7556
  this.sourceSampleRate = audioSample.sampleRate;
7544
7557
  this.sourceNumberOfChannels = audioSample.numberOfChannels;
7545
7558
  this.startTime = audioSample.timestamp;
7559
+ const overflowFrames = Math.ceil(this.targetSampleRate / this.sourceSampleRate);
7560
+ this.bufferCapacityInFrames = this.bufferSizeInFrames + overflowFrames;
7561
+ this.outputBuffer = new Float32Array(this.bufferCapacityInFrames * this.targetNumberOfChannels);
7546
7562
  this.tempSourceBuffer = new Float32Array(this.sourceSampleRate * this.sourceNumberOfChannels);
7547
7563
  this.doChannelMixerSetup();
7548
7564
  }
@@ -7560,12 +7576,12 @@ var AudioResampler = class {
7560
7576
  if (outputFrame < this.bufferStartFrame) {
7561
7577
  continue;
7562
7578
  }
7563
- while (outputFrame >= this.bufferStartFrame + this.bufferSizeInFrames) {
7579
+ while (outputFrame >= this.bufferStartFrame + this.bufferCapacityInFrames) {
7564
7580
  await this.finalizeCurrentBuffer();
7565
7581
  this.bufferStartFrame += this.bufferSizeInFrames;
7566
7582
  }
7567
7583
  const bufferFrameIndex = outputFrame - this.bufferStartFrame;
7568
- assert(bufferFrameIndex < this.bufferSizeInFrames);
7584
+ assert(bufferFrameIndex < this.bufferCapacityInFrames);
7569
7585
  const outputTime = outputFrame / this.targetSampleRate;
7570
7586
  const inputTime = outputTime - inputStartTime;
7571
7587
  const sourcePosition = inputTime * this.sourceSampleRate;
@@ -7597,7 +7613,7 @@ var AudioResampler = class {
7597
7613
  return;
7598
7614
  }
7599
7615
  assert(this.startTime !== null);
7600
- const samplesWritten = (this.maxWrittenFrame + 1) * this.targetNumberOfChannels;
7616
+ const samplesWritten = Math.min(this.maxWrittenFrame + 1, this.bufferSizeInFrames) * this.targetNumberOfChannels;
7601
7617
  const outputData = new Float32Array(samplesWritten);
7602
7618
  outputData.set(this.outputBuffer.subarray(0, samplesWritten));
7603
7619
  const audioSample = new AudioSample({
@@ -7608,11 +7624,15 @@ var AudioResampler = class {
7608
7624
  data: outputData
7609
7625
  });
7610
7626
  await this.onSample(audioSample);
7611
- this.outputBuffer.fill(0);
7612
- this.maxWrittenFrame = null;
7627
+ this.outputBuffer.copyWithin(0, this.bufferSizeInSamples);
7628
+ this.outputBuffer.fill(0, this.outputBuffer.length - this.bufferSizeInSamples);
7629
+ this.maxWrittenFrame = this.maxWrittenFrame >= this.bufferSizeInFrames ? this.maxWrittenFrame - this.bufferSizeInFrames : null;
7613
7630
  }
7614
- finalize() {
7615
- return this.finalizeCurrentBuffer();
7631
+ async finalize() {
7632
+ while (this.maxWrittenFrame !== null) {
7633
+ await this.finalizeCurrentBuffer();
7634
+ this.bufferStartFrame += this.bufferSizeInFrames;
7635
+ }
7616
7636
  }
7617
7637
  };
7618
7638
 
@@ -7686,7 +7706,6 @@ var VideoSource = class extends MediaSource {
7686
7706
  /** Internal constructor. */
7687
7707
  constructor(codec) {
7688
7708
  super();
7689
- this._connectedTrack = null;
7690
7709
  if (!VIDEO_CODECS.includes(codec)) {
7691
7710
  throw new TypeError(`Invalid video codec '${codec}'. Must be one of: ${VIDEO_CODECS.join(", ")}.`);
7692
7711
  }
@@ -7697,7 +7716,6 @@ var AudioSource = class extends MediaSource {
7697
7716
  /** Internal constructor. */
7698
7717
  constructor(codec) {
7699
7718
  super();
7700
- this._connectedTrack = null;
7701
7719
  if (!AUDIO_CODECS.includes(codec)) {
7702
7720
  throw new TypeError(`Invalid audio codec '${codec}'. Must be one of: ${AUDIO_CODECS.join(", ")}.`);
7703
7721
  }
@@ -7901,14 +7919,17 @@ var AudioEncoderWrapper = class {
7901
7919
  const outputView = new DataView(outputBuffer);
7902
7920
  outputs.push({ frameCount, view: outputView });
7903
7921
  }
7904
- const allocationSize = audioSample.allocationSize({ planeIndex: 0, format: "f32-planar" });
7905
- const floats = new Float32Array(allocationSize / Float32Array.BYTES_PER_ELEMENT);
7922
+ const isS32 = audioSample.format === "s32" || audioSample.format === "s32-planar";
7923
+ const readFormat = isS32 ? "s32-planar" : "f32-planar";
7924
+ const scale = isS32 ? 1 / 2147483648 : 1;
7925
+ const allocationSize = audioSample.allocationSize({ planeIndex: 0, format: readFormat });
7926
+ const values = isS32 ? new Int32Array(allocationSize / 4) : new Float32Array(allocationSize / 4);
7906
7927
  for (let i = 0; i < numberOfChannels; i++) {
7907
- audioSample.copyTo(floats, { planeIndex: i, format: "f32-planar" });
7928
+ audioSample.copyTo(values, { planeIndex: i, format: readFormat });
7908
7929
  for (let j = 0; j < outputs.length; j++) {
7909
7930
  const { frameCount, view: view2 } = outputs[j];
7910
7931
  for (let k = 0; k < frameCount; k++) {
7911
- this.writeOutputValue(view2, (k * numberOfChannels + i) * this.outputSampleSize, floats[j * CHUNK_SIZE + k]);
7932
+ this.writeOutputValue(view2, (k * numberOfChannels + i) * this.outputSampleSize, values[j * CHUNK_SIZE + k] * scale);
7912
7933
  }
7913
7934
  }
7914
7935
  }
@@ -8031,19 +8052,19 @@ var AudioEncoderWrapper = class {
8031
8052
  case 1:
8032
8053
  {
8033
8054
  if (dataType === "unsigned") {
8034
- this.writeOutputValue = (view2, byteOffset, value) => view2.setUint8(byteOffset, clamp((value + 1) * 127.5, 0, 255));
8055
+ this.writeOutputValue = (view2, byteOffset, value) => view2.setUint8(byteOffset, clamp(Math.round(value * 128) + 128, 0, 255));
8035
8056
  } else if (dataType === "signed") {
8036
8057
  this.writeOutputValue = (view2, byteOffset, value) => {
8037
8058
  view2.setInt8(byteOffset, clamp(Math.round(value * 128), -128, 127));
8038
8059
  };
8039
8060
  } else if (dataType === "ulaw") {
8040
8061
  this.writeOutputValue = (view2, byteOffset, value) => {
8041
- const int16 = clamp(Math.floor(value * 32767), -32768, 32767);
8062
+ const int16 = clamp(Math.round(value * 32768), -32768, 32767);
8042
8063
  view2.setUint8(byteOffset, toUlaw(int16));
8043
8064
  };
8044
8065
  } else if (dataType === "alaw") {
8045
8066
  this.writeOutputValue = (view2, byteOffset, value) => {
8046
- const int16 = clamp(Math.floor(value * 32767), -32768, 32767);
8067
+ const int16 = clamp(Math.round(value * 32768), -32768, 32767);
8047
8068
  view2.setUint8(byteOffset, toAlaw(int16));
8048
8069
  };
8049
8070
  } else {
@@ -8055,9 +8076,9 @@ var AudioEncoderWrapper = class {
8055
8076
  case 2:
8056
8077
  {
8057
8078
  if (dataType === "unsigned") {
8058
- this.writeOutputValue = (view2, byteOffset, value) => view2.setUint16(byteOffset, clamp((value + 1) * 32767.5, 0, 65535), littleEndian);
8079
+ this.writeOutputValue = (view2, byteOffset, value) => view2.setUint16(byteOffset, clamp(Math.round(value * 32768) + 32768, 0, 65535), littleEndian);
8059
8080
  } else if (dataType === "signed") {
8060
- this.writeOutputValue = (view2, byteOffset, value) => view2.setInt16(byteOffset, clamp(Math.round(value * 32767), -32768, 32767), littleEndian);
8081
+ this.writeOutputValue = (view2, byteOffset, value) => view2.setInt16(byteOffset, clamp(Math.round(value * 32768), -32768, 32767), littleEndian);
8061
8082
  } else {
8062
8083
  assert(false);
8063
8084
  }
@@ -8067,9 +8088,9 @@ var AudioEncoderWrapper = class {
8067
8088
  case 3:
8068
8089
  {
8069
8090
  if (dataType === "unsigned") {
8070
- this.writeOutputValue = (view2, byteOffset, value) => setUint24(view2, byteOffset, clamp((value + 1) * 83886075e-1, 0, 16777215), littleEndian);
8091
+ this.writeOutputValue = (view2, byteOffset, value) => setUint24(view2, byteOffset, clamp(Math.round(value * 8388608) + 8388608, 0, 16777215), littleEndian);
8071
8092
  } else if (dataType === "signed") {
8072
- this.writeOutputValue = (view2, byteOffset, value) => setInt24(view2, byteOffset, clamp(Math.round(value * 8388607), -8388608, 8388607), littleEndian);
8093
+ this.writeOutputValue = (view2, byteOffset, value) => setInt24(view2, byteOffset, clamp(Math.round(value * 8388608), -8388608, 8388607), littleEndian);
8073
8094
  } else {
8074
8095
  assert(false);
8075
8096
  }
@@ -8079,9 +8100,9 @@ var AudioEncoderWrapper = class {
8079
8100
  case 4:
8080
8101
  {
8081
8102
  if (dataType === "unsigned") {
8082
- this.writeOutputValue = (view2, byteOffset, value) => view2.setUint32(byteOffset, clamp((value + 1) * 21474836475e-1, 0, 4294967295), littleEndian);
8103
+ this.writeOutputValue = (view2, byteOffset, value) => view2.setUint32(byteOffset, clamp(Math.round(value * 2147483648) + 2147483648, 0, 4294967295), littleEndian);
8083
8104
  } else if (dataType === "signed") {
8084
- this.writeOutputValue = (view2, byteOffset, value) => view2.setInt32(byteOffset, clamp(Math.round(value * 2147483647), -2147483648, 2147483647), littleEndian);
8105
+ this.writeOutputValue = (view2, byteOffset, value) => view2.setInt32(byteOffset, clamp(Math.round(value * 2147483648), -2147483648, 2147483647), littleEndian);
8085
8106
  } else if (dataType === "float") {
8086
8107
  this.writeOutputValue = (view2, byteOffset, value) => view2.setFloat32(byteOffset, value, littleEndian);
8087
8108
  } else {
@@ -8183,7 +8204,6 @@ var SubtitleSource = class extends MediaSource {
8183
8204
  /** Internal constructor. */
8184
8205
  constructor(codec) {
8185
8206
  super();
8186
- this._connectedTrack = null;
8187
8207
  if (!SUBTITLE_CODECS.includes(codec)) {
8188
8208
  throw new TypeError(`Invalid subtitle codec '${codec}'. Must be one of: ${SUBTITLE_CODECS.join(", ")}.`);
8189
8209
  }
@@ -8591,6 +8611,9 @@ var validateMetadataTags = (tags) => {
8591
8611
  if (tags.date !== void 0 && (!(tags.date instanceof Date) || Number.isNaN(tags.date.getTime()))) {
8592
8612
  throw new TypeError("tags.date, when provided, must be a valid Date.");
8593
8613
  }
8614
+ if (tags.beatsPerMinute !== void 0 && (!Number.isInteger(tags.beatsPerMinute) || tags.beatsPerMinute <= 0)) {
8615
+ throw new TypeError("tags.beatsPerMinute, when provided, must be a positive integer.");
8616
+ }
8594
8617
  if (tags.lyrics !== void 0 && typeof tags.lyrics !== "string") {
8595
8618
  throw new TypeError("tags.lyrics, when provided, must be a string.");
8596
8619
  }
@@ -8628,7 +8651,7 @@ var validateMetadataTags = (tags) => {
8628
8651
  }
8629
8652
  };
8630
8653
  var metadataTagsAreEmpty = (tags) => {
8631
- return tags.title === void 0 && tags.description === void 0 && tags.artist === void 0 && tags.album === void 0 && tags.albumArtist === void 0 && tags.trackNumber === void 0 && tags.tracksTotal === void 0 && tags.discNumber === void 0 && tags.discsTotal === void 0 && tags.genre === void 0 && tags.date === void 0 && tags.lyrics === void 0 && (!tags.images || tags.images.length === 0) && tags.comment === void 0 && (tags.raw === void 0 || Object.keys(tags.raw).length === 0);
8654
+ return tags.title === void 0 && tags.description === void 0 && tags.artist === void 0 && tags.album === void 0 && tags.albumArtist === void 0 && tags.trackNumber === void 0 && tags.tracksTotal === void 0 && tags.discNumber === void 0 && tags.discsTotal === void 0 && tags.genre === void 0 && tags.beatsPerMinute === void 0 && tags.date === void 0 && tags.lyrics === void 0 && (!tags.images || tags.images.length === 0) && tags.comment === void 0 && (tags.raw === void 0 || Object.keys(tags.raw).length === 0);
8632
8655
  };
8633
8656
  var DEFAULT_TRACK_DISPOSITION = {
8634
8657
  default: true,
@@ -9206,7 +9229,7 @@ var IsobmffDemuxer = class _IsobmffDemuxer extends Demuxer {
9206
9229
  }
9207
9230
  }
9208
9231
  traverseBox(slice) {
9209
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E, _F, _G;
9232
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E, _F, _G, _H;
9210
9233
  const startPos = slice.filePos;
9211
9234
  const boxInfo = readBoxHeader(slice);
9212
9235
  if (!boxInfo) {
@@ -10960,18 +10983,29 @@ var IsobmffDemuxer = class _IsobmffDemuxer extends Demuxer {
10960
10983
  }
10961
10984
  ;
10962
10985
  break;
10986
+ case "tmpo":
10987
+ {
10988
+ if (data instanceof Uint8Array && data.length >= 2) {
10989
+ const bpm = toDataView(data).getInt16(0, false);
10990
+ if (bpm > 0) {
10991
+ (_z = this.metadataTags).beatsPerMinute ?? (_z.beatsPerMinute = bpm);
10992
+ }
10993
+ }
10994
+ }
10995
+ ;
10996
+ break;
10963
10997
  case "covr":
10964
10998
  case "com.apple.quicktime.artwork":
10965
10999
  {
10966
11000
  if (data instanceof RichImageData) {
10967
- (_z = this.metadataTags).images ?? (_z.images = []);
11001
+ (_A = this.metadataTags).images ?? (_A.images = []);
10968
11002
  this.metadataTags.images.push({
10969
11003
  data: data.data,
10970
11004
  kind: "coverFront",
10971
11005
  mimeType: data.mimeType
10972
11006
  });
10973
11007
  } else if (data instanceof Uint8Array) {
10974
- (_A = this.metadataTags).images ?? (_A.images = []);
11008
+ (_B = this.metadataTags).images ?? (_B.images = []);
10975
11009
  this.metadataTags.images.push({
10976
11010
  data,
10977
11011
  kind: "coverFront",
@@ -10988,10 +11022,10 @@ var IsobmffDemuxer = class _IsobmffDemuxer extends Demuxer {
10988
11022
  const trackNum = Number.parseInt(parts[0], 10);
10989
11023
  const tracksTotal = parts[1] && Number.parseInt(parts[1], 10);
10990
11024
  if (Number.isInteger(trackNum) && trackNum > 0) {
10991
- (_B = this.metadataTags).trackNumber ?? (_B.trackNumber = trackNum);
11025
+ (_C = this.metadataTags).trackNumber ?? (_C.trackNumber = trackNum);
10992
11026
  }
10993
11027
  if (tracksTotal && Number.isInteger(tracksTotal) && tracksTotal > 0) {
10994
- (_C = this.metadataTags).tracksTotal ?? (_C.tracksTotal = tracksTotal);
11028
+ (_D = this.metadataTags).tracksTotal ?? (_D.tracksTotal = tracksTotal);
10995
11029
  }
10996
11030
  }
10997
11031
  }
@@ -11004,10 +11038,10 @@ var IsobmffDemuxer = class _IsobmffDemuxer extends Demuxer {
11004
11038
  const trackNumber = view2.getUint16(2, false);
11005
11039
  const tracksTotal = view2.getUint16(4, false);
11006
11040
  if (trackNumber > 0) {
11007
- (_D = this.metadataTags).trackNumber ?? (_D.trackNumber = trackNumber);
11041
+ (_E = this.metadataTags).trackNumber ?? (_E.trackNumber = trackNumber);
11008
11042
  }
11009
11043
  if (tracksTotal > 0) {
11010
- (_E = this.metadataTags).tracksTotal ?? (_E.tracksTotal = tracksTotal);
11044
+ (_F = this.metadataTags).tracksTotal ?? (_F.tracksTotal = tracksTotal);
11011
11045
  }
11012
11046
  }
11013
11047
  }
@@ -11021,10 +11055,10 @@ var IsobmffDemuxer = class _IsobmffDemuxer extends Demuxer {
11021
11055
  const discNumber = view2.getUint16(2, false);
11022
11056
  const discNumberMax = view2.getUint16(4, false);
11023
11057
  if (discNumber > 0) {
11024
- (_F = this.metadataTags).discNumber ?? (_F.discNumber = discNumber);
11058
+ (_G = this.metadataTags).discNumber ?? (_G.discNumber = discNumber);
11025
11059
  }
11026
11060
  if (discNumberMax > 0) {
11027
- (_G = this.metadataTags).discsTotal ?? (_G.discsTotal = discNumberMax);
11061
+ (_H = this.metadataTags).discsTotal ?? (_H.discsTotal = discNumberMax);
11028
11062
  }
11029
11063
  }
11030
11064
  }
@@ -11412,7 +11446,6 @@ var IsobmffVideoTrackBacking = class extends IsobmffTrackBacking {
11412
11446
  constructor(internalTrack) {
11413
11447
  super(internalTrack);
11414
11448
  this.decoderConfigPromise = null;
11415
- this.internalTrack = internalTrack;
11416
11449
  }
11417
11450
  getType() {
11418
11451
  return "video";
@@ -11510,7 +11543,6 @@ var IsobmffAudioTrackBacking = class extends IsobmffTrackBacking {
11510
11543
  constructor(internalTrack) {
11511
11544
  super(internalTrack);
11512
11545
  this.decoderConfigPromise = null;
11513
- this.internalTrack = internalTrack;
11514
11546
  }
11515
11547
  getType() {
11516
11548
  return "audio";
@@ -12657,6 +12689,7 @@ var MatroskaDemuxer = class extends Demuxer {
12657
12689
  };
12658
12690
  this.segments.push(this.currentSegment);
12659
12691
  let currentPos = segmentDataStart;
12692
+ const visitedSeekHeadPositions = /* @__PURE__ */ new Set();
12660
12693
  while (this.currentSegment.elementEndPos === null || currentPos < this.currentSegment.elementEndPos) {
12661
12694
  let slice = this.reader.requestSliceRange(currentPos, MIN_HEADER_SIZE, MAX_HEADER_SIZE);
12662
12695
  if (isThenable(slice))
@@ -12680,6 +12713,9 @@ var MatroskaDemuxer = class extends Demuxer {
12680
12713
  if (metadataElementIndex !== -1) {
12681
12714
  const field = METADATA_ELEMENTS[metadataElementIndex].flag;
12682
12715
  this.currentSegment[field] = true;
12716
+ if (id === EBMLId.SeekHead) {
12717
+ visitedSeekHeadPositions.add(elementStartPos - segmentDataStart);
12718
+ }
12683
12719
  assertDefinedSize(size);
12684
12720
  let slice2 = this.reader.requestSlice(dataStartPos, size);
12685
12721
  if (isThenable(slice2))
@@ -12710,6 +12746,31 @@ var MatroskaDemuxer = class extends Demuxer {
12710
12746
  currentPos = dataStartPos + size;
12711
12747
  }
12712
12748
  }
12749
+ if (this.reader.fileSize !== null) {
12750
+ while (true) {
12751
+ const seekEntry = this.currentSegment.seekEntries.find((x) => x.id === EBMLId.SeekHead && !visitedSeekHeadPositions.has(x.segmentPosition));
12752
+ if (!seekEntry) {
12753
+ break;
12754
+ }
12755
+ visitedSeekHeadPositions.add(seekEntry.segmentPosition);
12756
+ let slice = this.reader.requestSliceRange(segmentDataStart + seekEntry.segmentPosition, MIN_HEADER_SIZE, MAX_HEADER_SIZE);
12757
+ if (isThenable(slice))
12758
+ slice = await slice;
12759
+ if (!slice)
12760
+ continue;
12761
+ const header = readElementHeader(slice);
12762
+ if (!header || header.id !== EBMLId.SeekHead)
12763
+ continue;
12764
+ const { size } = header;
12765
+ assertDefinedSize(size);
12766
+ let dataSlice = this.reader.requestSlice(slice.filePos, size);
12767
+ if (isThenable(dataSlice))
12768
+ dataSlice = await dataSlice;
12769
+ if (!dataSlice)
12770
+ continue;
12771
+ this.readContiguousElements(dataSlice);
12772
+ }
12773
+ }
12713
12774
  this.currentSegment.seekEntries.sort((a, b) => a.segmentPosition - b.segmentPosition);
12714
12775
  if (this.reader.fileSize !== null) {
12715
12776
  for (const seekEntry of this.currentSegment.seekEntries) {
@@ -14076,6 +14137,15 @@ var MatroskaDemuxer = class extends Demuxer {
14076
14137
  }
14077
14138
  ;
14078
14139
  break;
14140
+ case "bpm":
14141
+ {
14142
+ const bpm = Number.parseInt(value, 10);
14143
+ if (Number.isInteger(bpm) && bpm > 0) {
14144
+ metadataTags.beatsPerMinute ?? (metadataTags.beatsPerMinute = bpm);
14145
+ }
14146
+ }
14147
+ ;
14148
+ break;
14079
14149
  case "comment":
14080
14150
  {
14081
14151
  metadataTags.comment ?? (metadataTags.comment = value);
@@ -14130,21 +14200,11 @@ var MatroskaDemuxer = class extends Demuxer {
14130
14200
  }
14131
14201
  }
14132
14202
  }
14133
- async getDurationFromMetadata(segment) {
14203
+ getDurationFromMetadata(segment) {
14134
14204
  if (segment.duration <= 0) {
14135
14205
  return null;
14136
14206
  }
14137
- let minTimestamp = null;
14138
- for (const track of segment.tracks) {
14139
- assert(track.trackBacking);
14140
- const firstPacket = await track.trackBacking.getFirstPacket({ metadataOnly: true });
14141
- if (firstPacket) {
14142
- minTimestamp = Math.min(minTimestamp ?? Infinity, firstPacket.timestamp);
14143
- }
14144
- }
14145
- let endTimestamp = segment.duration / segment.timestampFactor;
14146
- endTimestamp += minTimestamp ?? 0;
14147
- return endTimestamp;
14207
+ return segment.duration / segment.timestampFactor;
14148
14208
  }
14149
14209
  };
14150
14210
  var MatroskaTrackBacking = class {
@@ -14485,7 +14545,6 @@ var MatroskaVideoTrackBacking = class extends MatroskaTrackBacking {
14485
14545
  constructor(internalTrack) {
14486
14546
  super(internalTrack);
14487
14547
  this.decoderConfigPromise = null;
14488
- this.internalTrack = internalTrack;
14489
14548
  }
14490
14549
  getType() {
14491
14550
  return "video";
@@ -14577,7 +14636,6 @@ var MatroskaAudioTrackBacking = class extends MatroskaTrackBacking {
14577
14636
  constructor(internalTrack) {
14578
14637
  super(internalTrack);
14579
14638
  this.decoderConfigPromise = null;
14580
- this.internalTrack = internalTrack;
14581
14639
  }
14582
14640
  getType() {
14583
14641
  return "audio";
@@ -15327,6 +15385,7 @@ var OggAudioTrackBacking = class {
15327
15385
  this.encodedPacketToMetadata = /* @__PURE__ */ new WeakMap();
15328
15386
  this.sequentialScanCache = [];
15329
15387
  this.sequentialScanMutex = new AsyncMutex();
15388
+ this.firstTimestampInSamplesPromise = null;
15330
15389
  this.internalSampleRate = bitstream.codecInfo.codec === "opus" ? OPUS_SAMPLE_RATE : bitstream.sampleRate;
15331
15390
  }
15332
15391
  getType() {
@@ -15408,8 +15467,17 @@ var OggAudioTrackBacking = class {
15408
15467
  if (!packet) {
15409
15468
  return null;
15410
15469
  }
15411
- const { durationInSamples, vorbisBlockSize } = extractSampleMetadata(packet.data, this.bitstream.codecInfo, additional.vorbisLastBlocksize);
15412
- const encodedPacket = new EncodedPacket(options.metadataOnly ? PLACEHOLDER_DATA : packet.data, "key", Math.max(0, additional.timestampInSamples) / this.internalSampleRate, durationInSamples / this.internalSampleRate, packet.endPage.headerStartPos + packet.endSegmentIndex, packet.data.byteLength);
15470
+ const sampleMetadata = extractSampleMetadata(packet.data, this.bitstream.codecInfo, additional.vorbisLastBlocksize);
15471
+ const { vorbisBlockSize } = sampleMetadata;
15472
+ let { durationInSamples } = sampleMetadata;
15473
+ const isEos = !!(packet.endPage.headerType & 4);
15474
+ if (isEos && packet.endSegmentIndex === packet.endPage.lacingValues.length - 1) {
15475
+ const endTimestampInSamples2 = this.granulePositionToTimestampInSamples(packet.endPage.granulePosition);
15476
+ durationInSamples = clamp(endTimestampInSamples2 - additional.timestampInSamples, 0, durationInSamples);
15477
+ }
15478
+ const startTimestampInSamples = Math.max(additional.timestampInSamples, 0);
15479
+ const endTimestampInSamples = Math.max(additional.timestampInSamples + durationInSamples, 0);
15480
+ const encodedPacket = new EncodedPacket(options.metadataOnly ? PLACEHOLDER_DATA : packet.data, "key", startTimestampInSamples / this.internalSampleRate, (endTimestampInSamples - startTimestampInSamples) / this.internalSampleRate, packet.endPage.headerStartPos + packet.endSegmentIndex, packet.data.byteLength);
15413
15481
  this.encodedPacketToMetadata.set(encodedPacket, {
15414
15482
  packet,
15415
15483
  timestampInSamples: additional.timestampInSamples,
@@ -15419,17 +15487,44 @@ var OggAudioTrackBacking = class {
15419
15487
  });
15420
15488
  return encodedPacket;
15421
15489
  }
15490
+ getFirstTimestampInSamples() {
15491
+ return this.firstTimestampInSamplesPromise ?? (this.firstTimestampInSamplesPromise = (async () => {
15492
+ const defaultTimestampInSamples = this.granulePositionToTimestampInSamples(0);
15493
+ assert(this.bitstream.lastMetadataPacket);
15494
+ let position = await this.demuxer.findNextPacketStart(this.bitstream.lastMetadataPacket);
15495
+ if (!position) {
15496
+ return defaultTimestampInSamples;
15497
+ }
15498
+ let firstEndPage = null;
15499
+ let totalDurationInSamples = 0;
15500
+ let vorbisLastBlocksize = null;
15501
+ while (position) {
15502
+ const packet = await this.demuxer.readPacket(position.startPage, position.startSegmentIndex);
15503
+ if (!packet) {
15504
+ break;
15505
+ }
15506
+ firstEndPage ?? (firstEndPage = packet.endPage);
15507
+ if (packet.endPage.headerStartPos !== firstEndPage.headerStartPos) {
15508
+ break;
15509
+ }
15510
+ const { durationInSamples, vorbisBlockSize } = extractSampleMetadata(packet.data, this.bitstream.codecInfo, vorbisLastBlocksize);
15511
+ totalDurationInSamples += durationInSamples;
15512
+ vorbisLastBlocksize = vorbisBlockSize;
15513
+ position = await this.demuxer.findNextPacketStart(packet);
15514
+ }
15515
+ if (!firstEndPage) {
15516
+ return defaultTimestampInSamples;
15517
+ }
15518
+ return defaultTimestampInSamples + Math.max(firstEndPage.granulePosition - totalDurationInSamples, 0);
15519
+ })());
15520
+ }
15422
15521
  async getFirstPacket(options) {
15423
15522
  assert(this.bitstream.lastMetadataPacket);
15424
15523
  const packetPosition = await this.demuxer.findNextPacketStart(this.bitstream.lastMetadataPacket);
15425
15524
  if (!packetPosition) {
15426
15525
  return null;
15427
15526
  }
15428
- let timestampInSamples = 0;
15429
- if (this.bitstream.codecInfo.codec === "opus") {
15430
- assert(this.bitstream.codecInfo.opusInfo);
15431
- timestampInSamples -= this.bitstream.codecInfo.opusInfo.preSkip;
15432
- }
15527
+ const timestampInSamples = await this.getFirstTimestampInSamples();
15433
15528
  const packet = await this.demuxer.readPacket(packetPosition.startPage, packetPosition.startSegmentIndex);
15434
15529
  return this.createEncodedPacketFromOggPacket(packet, {
15435
15530
  timestampInSamples,
@@ -15457,10 +15552,11 @@ var OggAudioTrackBacking = class {
15457
15552
  return this.getPacketSequential(timestamp, options);
15458
15553
  }
15459
15554
  const timestampInSamples = roundIfAlmostInteger(timestamp * this.internalSampleRate);
15460
- if (timestampInSamples === 0) {
15555
+ const firstTimestampInSamples = await this.getFirstTimestampInSamples();
15556
+ if (timestampInSamples === Math.max(firstTimestampInSamples, 0)) {
15461
15557
  return this.getFirstPacket(options);
15462
15558
  }
15463
- if (timestampInSamples < 0) {
15559
+ if (timestampInSamples < Math.max(firstTimestampInSamples, 0)) {
15464
15560
  return null;
15465
15561
  }
15466
15562
  assert(this.bitstream.lastMetadataPacket);
@@ -15483,6 +15579,9 @@ var OggAudioTrackBacking = class {
15483
15579
  assert(searchSlice);
15484
15580
  const found = findNextPageHeader(searchSlice, until);
15485
15581
  if (!found) {
15582
+ if (high <= mid + MIN_PAGE_HEADER_SIZE) {
15583
+ break outer;
15584
+ }
15486
15585
  high = mid + MIN_PAGE_HEADER_SIZE;
15487
15586
  continue outer;
15488
15587
  }
@@ -15560,7 +15659,7 @@ var OggAudioTrackBacking = class {
15560
15659
  let endPage = currentPage;
15561
15660
  let endSegmentIndex = 0;
15562
15661
  if (currentPage.headerStartPos === startPosition.startPage.headerStartPos) {
15563
- currentTimestampInSamples = this.granulePositionToTimestampInSamples(0);
15662
+ currentTimestampInSamples = firstTimestampInSamples;
15564
15663
  currentTimestampIsCorrect = true;
15565
15664
  currentSegmentIndex = 0;
15566
15665
  } else {
@@ -15673,6 +15772,9 @@ var OggAudioTrackBacking = class {
15673
15772
  }, options);
15674
15773
  } else {
15675
15774
  currentPacket = await this.getFirstPacket(options);
15775
+ if (currentPacket && currentPacket.timestamp > timestamp) {
15776
+ return null;
15777
+ }
15676
15778
  }
15677
15779
  let i = 0;
15678
15780
  while (currentPacket && currentPacket.timestamp < timestamp) {
@@ -17374,7 +17476,8 @@ var BlobSource = class extends Source {
17374
17476
  }
17375
17477
  this._orchestrator.signalWorkerStoppedRunning(worker);
17376
17478
  if (worker.aborted) {
17377
- await reader?.cancel();
17479
+ await reader?.cancel().catch(() => {
17480
+ });
17378
17481
  }
17379
17482
  }
17380
17483
  /** @internal */
@@ -20281,7 +20384,6 @@ var InputVideoTrack = class extends InputTrack {
20281
20384
  constructor(input, backing) {
20282
20385
  super(input, backing);
20283
20386
  this._pixelAspectRatioCache = null;
20284
- this._backing = backing;
20285
20387
  }
20286
20388
  get type() {
20287
20389
  return "video";
@@ -20614,7 +20716,6 @@ var InputAudioTrack = class extends InputTrack {
20614
20716
  /** @internal */
20615
20717
  constructor(input, backing) {
20616
20718
  super(input, backing);
20617
- this._backing = backing;
20618
20719
  }
20619
20720
  get type() {
20620
20721
  return "audio";
@@ -20682,7 +20783,7 @@ var InputAudioTrack = class extends InputTrack {
20682
20783
  if (customAudioDecoders.some((x) => x.supports(codec, decoderConfig))) {
20683
20784
  return true;
20684
20785
  }
20685
- if (decoderConfig.codec.startsWith("pcm-")) {
20786
+ if (PCM_AUDIO_CODECS.includes(decoderConfig.codec)) {
20686
20787
  return true;
20687
20788
  } else {
20688
20789
  if (typeof AudioDecoder === "undefined") {
@@ -22053,6 +22154,17 @@ var parseId3V2Tag = (slice, header, tags) => {
22053
22154
  }
22054
22155
  ;
22055
22156
  break;
22157
+ case "TBPM":
22158
+ case "TBP":
22159
+ {
22160
+ const bpmText = reader.readId3V2EncodingAndText(frameEndPos);
22161
+ const bpm = Number.parseInt(bpmText, 10);
22162
+ if (Number.isInteger(bpm)) {
22163
+ tags.beatsPerMinute ?? (tags.beatsPerMinute = bpm);
22164
+ }
22165
+ }
22166
+ ;
22167
+ break;
22056
22168
  case "USLT":
22057
22169
  case "ULT":
22058
22170
  {
@@ -22374,6 +22486,13 @@ var Id3V2Writer = class {
22374
22486
  }
22375
22487
  ;
22376
22488
  break;
22489
+ case "beatsPerMinute":
22490
+ {
22491
+ this.writeId3V2TextFrame("TBPM", `${value}`);
22492
+ writtenTags.add("TBPM");
22493
+ }
22494
+ ;
22495
+ break;
22377
22496
  case "lyrics":
22378
22497
  {
22379
22498
  this.writeId3V2LyricsFrame(value);
@@ -23172,10 +23291,10 @@ var videoSampleDescription = (compressionType, trackData) => box(compressionType
23172
23291
  u16(1),
23173
23292
  // Frame count
23174
23293
  // Compressor name
23175
- u8("Mediabunny".length),
23294
+ u8(VERSIONED_NAME.length),
23176
23295
  // Weird Pascal-style string
23177
- ascii("Mediabunny"),
23178
- Array(31 - "Mediabunny".length).fill(0),
23296
+ ascii(VERSIONED_NAME),
23297
+ Array(31 - VERSIONED_NAME.length).fill(0),
23179
23298
  u16(trackData.info.hasAlphaChannel ? 32 : 24),
23180
23299
  // Depth
23181
23300
  i16(65535)
@@ -23943,6 +24062,7 @@ var addQuickTimeMetadataTagBoxes = (boxes, tags) => {
23943
24062
  case "discsTotal":
23944
24063
  case "trackNumber":
23945
24064
  case "tracksTotal":
24065
+ case "beatsPerMinute":
23946
24066
  case "images":
23947
24067
  {
23948
24068
  }
@@ -24025,6 +24145,20 @@ var generateMetadataPairs = (tags, isMdta) => {
24025
24145
  }
24026
24146
  ;
24027
24147
  break;
24148
+ case "beatsPerMinute":
24149
+ {
24150
+ if (!isMdta) {
24151
+ pairs.push({ key: "tmpo", value: box("data", [
24152
+ u32(21),
24153
+ // Type indicator
24154
+ u32(0),
24155
+ // Locale indicator
24156
+ u16(value)
24157
+ ]) });
24158
+ }
24159
+ }
24160
+ ;
24161
+ break;
24028
24162
  case "lyrics":
24029
24163
  {
24030
24164
  pairs.push({ key: isMdta ? "lyrics" : "\xA9lyr", value: dataStringBoxLong(value) });
@@ -25544,7 +25678,6 @@ var IsobmffMuxer = class extends Muxer {
25544
25678
  // ../../node_modules/mediabunny/dist/modules/src/matroska/matroska-muxer.js
25545
25679
  var MIN_CLUSTER_TIMESTAMP_MS = -(2 ** 15);
25546
25680
  var MAX_CLUSTER_TIMESTAMP_MS = 2 ** 15 - 1;
25547
- var APP_NAME = "Mediabunny";
25548
25681
  var SEGMENT_SIZE_BYTES = 6;
25549
25682
  var CLUSTER_SIZE_BYTES = 5;
25550
25683
  var TRACK_TYPE_MAP = {
@@ -25601,7 +25734,7 @@ var MatroskaMuxer = class extends Muxer {
25601
25734
  { id: EBMLId.EBMLMaxIDLength, data: 4 },
25602
25735
  { id: EBMLId.EBMLMaxSizeLength, data: 8 },
25603
25736
  { id: EBMLId.DocType, data: this.format instanceof WebMOutputFormat ? "webm" : "matroska" },
25604
- { id: EBMLId.DocTypeVersion, data: 2 },
25737
+ { id: EBMLId.DocTypeVersion, data: 4 },
25605
25738
  { id: EBMLId.DocTypeReadVersion, data: 2 }
25606
25739
  ] };
25607
25740
  this.ebmlWriter.writeEBML(ebmlHeader);
@@ -25624,14 +25757,6 @@ var MatroskaMuxer = class extends Muxer {
25624
25757
  const kaxAttachments = new Uint8Array([25, 65, 164, 105]);
25625
25758
  const kaxTags = new Uint8Array([18, 84, 195, 103]);
25626
25759
  const seekHead = { id: EBMLId.SeekHead, data: [
25627
- { id: EBMLId.Seek, data: [
25628
- { id: EBMLId.SeekID, data: kaxCues },
25629
- {
25630
- id: EBMLId.SeekPosition,
25631
- size: 5,
25632
- data: writeOffsets ? this.ebmlWriter.offsets.get(this.cues) - this.segmentDataOffset : 0
25633
- }
25634
- ] },
25635
25760
  { id: EBMLId.Seek, data: [
25636
25761
  { id: EBMLId.SeekID, data: kaxInfo },
25637
25762
  {
@@ -25663,7 +25788,15 @@ var MatroskaMuxer = class extends Muxer {
25663
25788
  size: 5,
25664
25789
  data: writeOffsets ? this.ebmlWriter.offsets.get(this.tagsElement) - this.segmentDataOffset : 0
25665
25790
  }
25666
- ] } : null
25791
+ ] } : null,
25792
+ { id: EBMLId.Seek, data: [
25793
+ { id: EBMLId.SeekID, data: kaxCues },
25794
+ {
25795
+ id: EBMLId.SeekPosition,
25796
+ size: 5,
25797
+ data: writeOffsets ? this.ebmlWriter.offsets.get(this.cues) - this.segmentDataOffset : 0
25798
+ }
25799
+ ] }
25667
25800
  ] };
25668
25801
  this.seekHead = seekHead;
25669
25802
  }
@@ -25672,8 +25805,8 @@ var MatroskaMuxer = class extends Muxer {
25672
25805
  this.segmentDuration = segmentDuration;
25673
25806
  const segmentInfo = { id: EBMLId.Info, data: [
25674
25807
  { id: EBMLId.TimestampScale, data: 1e6 },
25675
- { id: EBMLId.MuxingApp, data: APP_NAME },
25676
- { id: EBMLId.WritingApp, data: APP_NAME },
25808
+ { id: EBMLId.MuxingApp, data: VERSIONED_NAME },
25809
+ { id: EBMLId.WritingApp, data: VERSIONED_NAME },
25677
25810
  !this.format._options.appendOnly ? segmentDuration : null
25678
25811
  ] };
25679
25812
  this.segmentInfo = segmentInfo;
@@ -25715,8 +25848,7 @@ var MatroskaMuxer = class extends Muxer {
25715
25848
  { id: EBMLId.Language, data: trackData.track.metadata.languageCode ?? UNDETERMINED_LANGUAGE },
25716
25849
  { id: EBMLId.CodecID, data: codecId },
25717
25850
  trackData.codecPrivate ? { id: EBMLId.CodecPrivate, data: toUint8Array(trackData.codecPrivate) } : null,
25718
- { id: EBMLId.CodecDelay, data: 0 },
25719
- { id: EBMLId.SeekPreRoll, data: seekPreRollNs },
25851
+ seekPreRollNs > 0 ? { id: EBMLId.SeekPreRoll, data: seekPreRollNs } : null,
25720
25852
  trackData.track.metadata.name !== void 0 ? { id: EBMLId.Name, data: new EBMLUnicodeString(trackData.track.metadata.name) } : null,
25721
25853
  trackData.type === "video" ? this.videoSpecificTrackInfo(trackData) : null,
25722
25854
  trackData.type === "audio" ? this.audioSpecificTrackInfo(trackData) : null,
@@ -25879,6 +26011,13 @@ var MatroskaMuxer = class extends Muxer {
25879
26011
  }
25880
26012
  ;
25881
26013
  break;
26014
+ case "beatsPerMinute":
26015
+ {
26016
+ addSimpleTag("BPM", value.toString());
26017
+ writtenTags.add("BPM");
26018
+ }
26019
+ ;
26020
+ break;
25882
26021
  case "comment":
25883
26022
  {
25884
26023
  addSimpleTag("COMMENT", value);
@@ -26107,7 +26246,7 @@ var MatroskaMuxer = class extends Muxer {
26107
26246
  height: meta.decoderConfig.codedHeight,
26108
26247
  aspectRatio,
26109
26248
  decoderConfig: meta.decoderConfig,
26110
- alphaMode: packet ? !!packet.sideData.alpha : null
26249
+ alphaMode: track.metadata.canBeTransparent || (packet ? !!packet.sideData.alpha : null)
26111
26250
  },
26112
26251
  chunkQueue: [],
26113
26252
  lastWrittenMsTimestamp: null,
@@ -26528,7 +26667,7 @@ ${cue.notes ?? ""}`;
26528
26667
  const segmentSize = this.writer.getPos() - this.segmentDataOffset;
26529
26668
  this.writer.seek(this.ebmlWriter.offsets.get(this.segment) + 4);
26530
26669
  this.ebmlWriter.writeVarInt(segmentSize, SEGMENT_SIZE_BYTES);
26531
- const duration = this.startTimestamp === Infinity ? 0 : this.endTimestamp - this.startTimestamp;
26670
+ const duration = this.startTimestamp === Infinity ? 0 : this.endTimestamp;
26532
26671
  this.segmentDuration.data = new EBMLFloat64(duration);
26533
26672
  this.writer.seek(this.ebmlWriter.offsets.get(this.segmentDuration));
26534
26673
  this.ebmlWriter.writeEBML(this.segmentDuration);
@@ -26776,6 +26915,7 @@ var WaveMuxer = class extends Muxer {
26776
26915
  case "discNumber":
26777
26916
  case "tracksTotal":
26778
26917
  case "discsTotal":
26918
+ case "beatsPerMinute":
26779
26919
  case "description":
26780
26920
  case "lyrics":
26781
26921
  case "images":
@@ -27145,6 +27285,12 @@ var Output = class extends EventEmitter {
27145
27285
  if (metadata.frameRate !== void 0 && (!Number.isFinite(metadata.frameRate) || metadata.frameRate <= 0)) {
27146
27286
  throw new TypeError(`Invalid video frame rate: ${metadata.frameRate}. Must be a positive number.`);
27147
27287
  }
27288
+ if (metadata.hasOnlyKeyPackets !== void 0 && typeof metadata.hasOnlyKeyPackets !== "boolean") {
27289
+ throw new TypeError("metadata.hasOnlyKeyPackets, when provided, must be a boolean.");
27290
+ }
27291
+ if (metadata.canBeTransparent !== void 0 && typeof metadata.canBeTransparent !== "boolean") {
27292
+ throw new TypeError("metadata.canBeTransparent, when provided, must be a boolean.");
27293
+ }
27148
27294
  if (metadata.decoderConfig !== void 0) {
27149
27295
  validateVideoChunkMetadata({ decoderConfig: metadata.decoderConfig }, source._codec);
27150
27296
  }
@@ -27768,6 +27914,7 @@ mediabunny/dist/modules/src/sample.js:
27768
27914
  mediabunny/dist/modules/shared/bitstream.js:
27769
27915
  mediabunny/dist/modules/shared/aac-misc.js:
27770
27916
  mediabunny/dist/modules/shared/ac3-misc.js:
27917
+ mediabunny/dist/modules/src/version.js:
27771
27918
  mediabunny/dist/modules/src/codec-data.js:
27772
27919
  mediabunny/dist/modules/src/codec.js:
27773
27920
  mediabunny/dist/modules/src/custom-coder.js: