mediabunny 1.30.0 → 1.30.1

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.
@@ -1967,9 +1967,6 @@ var Mediabunny = (() => {
1967
1967
  return iterateNalUnitsInAnnexB(packetData);
1968
1968
  }
1969
1969
  };
1970
- var iterateAvcNalUnitsAnnexB = function* (packetData) {
1971
- yield* iterateNalUnitsInAnnexB(packetData);
1972
- };
1973
1970
  var extractNalUnitTypeForAvc = (byte) => {
1974
1971
  return byte & 31;
1975
1972
  };
@@ -2040,7 +2037,7 @@ var Mediabunny = (() => {
2040
2037
  const spsUnits = [];
2041
2038
  const ppsUnits = [];
2042
2039
  const spsExtUnits = [];
2043
- for (const loc of iterateAvcNalUnitsAnnexB(packetData)) {
2040
+ for (const loc of iterateNalUnitsInAnnexB(packetData)) {
2044
2041
  const nalUnit = packetData.subarray(loc.offset, loc.offset + loc.length);
2045
2042
  const type = extractNalUnitTypeForAvc(nalUnit[0]);
2046
2043
  if (type === 7 /* SPS */) {
@@ -2412,9 +2409,6 @@ var Mediabunny = (() => {
2412
2409
  return iterateNalUnitsInAnnexB(packetData);
2413
2410
  }
2414
2411
  };
2415
- var iterateHevcNalUnitsAnnexB = function* (packetData) {
2416
- yield* iterateNalUnitsInAnnexB(packetData);
2417
- };
2418
2412
  var extractNalUnitTypeForHevc = (byte) => {
2419
2413
  return byte >> 1 & 63;
2420
2414
  };
@@ -2548,7 +2542,7 @@ var Mediabunny = (() => {
2548
2542
  const spsUnits = [];
2549
2543
  const ppsUnits = [];
2550
2544
  const seiUnits = [];
2551
- for (const loc of iterateHevcNalUnitsAnnexB(packetData)) {
2545
+ for (const loc of iterateNalUnitsInAnnexB(packetData)) {
2552
2546
  const nalUnit = packetData.subarray(loc.offset, loc.offset + loc.length);
2553
2547
  const type = extractNalUnitTypeForHevc(nalUnit[0]);
2554
2548
  if (type === 32 /* VPS_NUT */) {
@@ -15883,6 +15877,14 @@ var Mediabunny = (() => {
15883
15877
  let hasProgramAssociationTable = false;
15884
15878
  let hasProgramMap = false;
15885
15879
  while (true) {
15880
+ const packetHeader = await this.readPacketHeader(currentPos);
15881
+ if (!packetHeader) {
15882
+ break;
15883
+ }
15884
+ if (packetHeader.payloadUnitStartIndicator === 0) {
15885
+ currentPos += this.packetStride;
15886
+ continue;
15887
+ }
15886
15888
  const section = await this.readSection(
15887
15889
  currentPos,
15888
15890
  true,
@@ -15983,7 +15985,8 @@ var Mediabunny = (() => {
15983
15985
  streamType,
15984
15986
  initialized: false,
15985
15987
  firstSection: null,
15986
- info
15988
+ info,
15989
+ referencePesPackets: []
15987
15990
  });
15988
15991
  }
15989
15992
  }
@@ -16082,8 +16085,13 @@ var Mediabunny = (() => {
16082
16085
  if (isDone) {
16083
16086
  break;
16084
16087
  }
16085
- assert(section.endPos !== null);
16086
- currentPos = section.endPos;
16088
+ currentPos += this.packetStride;
16089
+ }
16090
+ if (!hasProgramAssociationTable) {
16091
+ throw new Error("No Program Association Table found in the file.");
16092
+ }
16093
+ if (!hasProgramMap) {
16094
+ throw new Error("No Program Map Table found in the file.");
16087
16095
  }
16088
16096
  for (const stream of this.elementaryStreams) {
16089
16097
  if (stream.info.type === "video") {
@@ -16327,12 +16335,6 @@ var Mediabunny = (() => {
16327
16335
  var MpegTsTrackBacking = class _MpegTsTrackBacking {
16328
16336
  constructor(elementaryStream) {
16329
16337
  this.elementaryStream = elementaryStream;
16330
- /**
16331
- * Reference PES packets, spread throughout the file, to be used to speed up repeated random access. Sorted by both
16332
- * byte offset and PTS.
16333
- */
16334
- this.referencePesPackets = [];
16335
- this.endReferencePesPacketAdded = false;
16336
16338
  this.packetBuffers = /* @__PURE__ */ new WeakMap();
16337
16339
  /** Used for recreating PacketBuffers if necessary. */
16338
16340
  this.packetSectionStarts = /* @__PURE__ */ new WeakMap();
@@ -16397,40 +16399,12 @@ var Mediabunny = (() => {
16397
16399
  suppliedPacket.data.byteLength
16398
16400
  );
16399
16401
  }
16400
- maybeInsertReferencePacket(pesPacketHeader) {
16401
- const index = binarySearchLessOrEqual(
16402
- this.referencePesPackets,
16403
- pesPacketHeader.sectionStartPos,
16404
- (x) => x.sectionStartPos
16405
- );
16406
- if (index >= 0) {
16407
- const entry = this.referencePesPackets[index];
16408
- if (pesPacketHeader.pts <= entry.pts) {
16409
- return false;
16410
- }
16411
- const minByteDistance = this.elementaryStream.demuxer.minReferencePointByteDistance;
16412
- if (pesPacketHeader.sectionStartPos - entry.sectionStartPos < minByteDistance) {
16413
- return false;
16414
- }
16415
- if (index < this.referencePesPackets.length - 1) {
16416
- const nextEntry = this.referencePesPackets[index + 1];
16417
- if (nextEntry.pts < pesPacketHeader.pts) {
16418
- return false;
16419
- }
16420
- if (nextEntry.sectionStartPos - pesPacketHeader.sectionStartPos < minByteDistance) {
16421
- return false;
16422
- }
16423
- }
16424
- }
16425
- this.referencePesPackets.splice(index + 1, 0, pesPacketHeader);
16426
- return true;
16427
- }
16428
16402
  async getFirstPacket(options) {
16429
16403
  const section = this.elementaryStream.firstSection;
16430
16404
  assert(section);
16431
16405
  const pesPacket = readPesPacket(section);
16432
16406
  assert(pesPacket);
16433
- const context = new PacketReadingContext(this, pesPacket, true);
16407
+ const context = new PacketReadingContext(this.elementaryStream, pesPacket);
16434
16408
  const buffer = new PacketBuffer(this, context);
16435
16409
  const result = await buffer.readNext();
16436
16410
  if (!result) {
@@ -16463,7 +16437,7 @@ var Mediabunny = (() => {
16463
16437
  assert(section);
16464
16438
  const pesPacket = readPesPacket(section);
16465
16439
  assert(pesPacket);
16466
- const context = new PacketReadingContext(this, pesPacket, true);
16440
+ const context = new PacketReadingContext(this.elementaryStream, pesPacket);
16467
16441
  buffer = new PacketBuffer(this, context);
16468
16442
  const targetSequenceNumber = packet.sequenceNumber;
16469
16443
  while (true) {
@@ -16534,8 +16508,9 @@ var Mediabunny = (() => {
16534
16508
  return null;
16535
16509
  }
16536
16510
  let scanStartPos;
16537
- const referencePointIndex = binarySearchLessOrEqual(this.referencePesPackets, searchPts, (x) => x.pts);
16538
- const referencePoint = referencePointIndex !== -1 ? this.referencePesPackets[referencePointIndex] : null;
16511
+ const referencePesPackets = this.elementaryStream.referencePesPackets;
16512
+ const referencePointIndex = binarySearchLessOrEqual(referencePesPackets, searchPts, (x) => x.pts);
16513
+ const referencePoint = referencePointIndex !== -1 ? referencePesPackets[referencePointIndex] : null;
16539
16514
  if (referencePoint && searchPts - referencePoint.pts < TIMESCALE / 2) {
16540
16515
  scanStartPos = referencePoint.sectionStartPos;
16541
16516
  } else {
@@ -16582,7 +16557,7 @@ var Mediabunny = (() => {
16582
16557
  assert(section);
16583
16558
  const pesPacket = readPesPacket(section);
16584
16559
  assert(pesPacket);
16585
- const context = new PacketReadingContext(this, pesPacket, true);
16560
+ const context = new PacketReadingContext(this.elementaryStream, pesPacket);
16586
16561
  const buffer = new PacketBuffer(this, context);
16587
16562
  while (true) {
16588
16563
  const topPts = last(buffer.presentationOrderPackets)?.pts ?? -Infinity;
@@ -16631,7 +16606,7 @@ var Mediabunny = (() => {
16631
16606
  break outer;
16632
16607
  }
16633
16608
  currentPesHeader = nextPesHeader;
16634
- this.maybeInsertReferencePacket(nextPesHeader);
16609
+ maybeInsertReferencePacket(this.elementaryStream, nextPesHeader);
16635
16610
  break;
16636
16611
  }
16637
16612
  }
@@ -16710,7 +16685,7 @@ var Mediabunny = (() => {
16710
16685
  if (!pesHeader) {
16711
16686
  throw new Error(MISSING_PES_PACKET_ERROR);
16712
16687
  }
16713
- this.maybeInsertReferencePacket(pesHeader);
16688
+ maybeInsertReferencePacket(this.elementaryStream, pesHeader);
16714
16689
  break;
16715
16690
  }
16716
16691
  }
@@ -16812,9 +16787,73 @@ var Mediabunny = (() => {
16812
16787
  getReorderSize() {
16813
16788
  return this.elementaryStream.info.reorderSize;
16814
16789
  }
16815
- async markNextPacket(context) {
16816
- assert(!context.suppliedPacket);
16817
- const codec = this.elementaryStream.info.codec;
16790
+ };
16791
+ var MpegTsAudioTrackBacking = class extends MpegTsTrackBacking {
16792
+ constructor(elementaryStream) {
16793
+ super(elementaryStream);
16794
+ this.elementaryStream = elementaryStream;
16795
+ }
16796
+ getCodec() {
16797
+ return this.elementaryStream.info.codec;
16798
+ }
16799
+ getNumberOfChannels() {
16800
+ return this.elementaryStream.info.numberOfChannels;
16801
+ }
16802
+ getSampleRate() {
16803
+ return this.elementaryStream.info.sampleRate;
16804
+ }
16805
+ async getDecoderConfig() {
16806
+ return {
16807
+ codec: extractAudioCodecString({
16808
+ codec: this.elementaryStream.info.codec,
16809
+ codecDescription: null,
16810
+ aacCodecInfo: this.elementaryStream.info.aacCodecInfo
16811
+ }),
16812
+ numberOfChannels: this.elementaryStream.info.numberOfChannels,
16813
+ sampleRate: this.elementaryStream.info.sampleRate
16814
+ };
16815
+ }
16816
+ allPacketsAreKeyPackets() {
16817
+ return true;
16818
+ }
16819
+ getReorderSize() {
16820
+ return 1;
16821
+ }
16822
+ };
16823
+ var maybeInsertReferencePacket = (elementaryStream, pesPacketHeader) => {
16824
+ const referencePesPackets = elementaryStream.referencePesPackets;
16825
+ const index = binarySearchLessOrEqual(
16826
+ referencePesPackets,
16827
+ pesPacketHeader.sectionStartPos,
16828
+ (x) => x.sectionStartPos
16829
+ );
16830
+ if (index >= 0) {
16831
+ const entry = referencePesPackets[index];
16832
+ if (pesPacketHeader.pts <= entry.pts) {
16833
+ return false;
16834
+ }
16835
+ const minByteDistance = elementaryStream.demuxer.minReferencePointByteDistance;
16836
+ if (pesPacketHeader.sectionStartPos - entry.sectionStartPos < minByteDistance) {
16837
+ return false;
16838
+ }
16839
+ if (index < referencePesPackets.length - 1) {
16840
+ const nextEntry = referencePesPackets[index + 1];
16841
+ if (nextEntry.pts < pesPacketHeader.pts) {
16842
+ return false;
16843
+ }
16844
+ if (nextEntry.sectionStartPos - pesPacketHeader.sectionStartPos < minByteDistance) {
16845
+ return false;
16846
+ }
16847
+ }
16848
+ }
16849
+ referencePesPackets.splice(index + 1, 0, pesPacketHeader);
16850
+ return true;
16851
+ };
16852
+ var markNextPacket = async (context) => {
16853
+ assert(!context.suppliedPacket);
16854
+ const elementaryStream = context.elementaryStream;
16855
+ if (elementaryStream.info.type === "video") {
16856
+ const codec = elementaryStream.info.codec;
16818
16857
  const CHUNK_SIZE = 1024;
16819
16858
  if (codec !== "avc" && codec !== "hevc") {
16820
16859
  throw new Error("Unhandled.");
@@ -16883,42 +16922,8 @@ var Mediabunny = (() => {
16883
16922
  context.seekTo(packetStartPos);
16884
16923
  return context.supplyPacket(packetLength, 0);
16885
16924
  }
16886
- }
16887
- };
16888
- var MpegTsAudioTrackBacking = class extends MpegTsTrackBacking {
16889
- constructor(elementaryStream) {
16890
- super(elementaryStream);
16891
- this.elementaryStream = elementaryStream;
16892
- }
16893
- getCodec() {
16894
- return this.elementaryStream.info.codec;
16895
- }
16896
- getNumberOfChannels() {
16897
- return this.elementaryStream.info.numberOfChannels;
16898
- }
16899
- getSampleRate() {
16900
- return this.elementaryStream.info.sampleRate;
16901
- }
16902
- async getDecoderConfig() {
16903
- return {
16904
- codec: extractAudioCodecString({
16905
- codec: this.elementaryStream.info.codec,
16906
- codecDescription: null,
16907
- aacCodecInfo: this.elementaryStream.info.aacCodecInfo
16908
- }),
16909
- numberOfChannels: this.elementaryStream.info.numberOfChannels,
16910
- sampleRate: this.elementaryStream.info.sampleRate
16911
- };
16912
- }
16913
- allPacketsAreKeyPackets() {
16914
- return true;
16915
- }
16916
- getReorderSize() {
16917
- return 1;
16918
- }
16919
- async markNextPacket(context) {
16920
- assert(!context.suppliedPacket);
16921
- const codec = this.elementaryStream.info.codec;
16925
+ } else {
16926
+ const codec = elementaryStream.info.codec;
16922
16927
  const CHUNK_SIZE = 128;
16923
16928
  while (true) {
16924
16929
  let remaining = context.ensureBuffered(CHUNK_SIZE);
@@ -16945,7 +16950,7 @@ var Mediabunny = (() => {
16945
16950
  if (remaining3 instanceof Promise) remaining3 = await remaining3;
16946
16951
  return context.supplyPacket(
16947
16952
  remaining3,
16948
- Math.round(SAMPLES_PER_AAC_FRAME * TIMESCALE / this.elementaryStream.info.sampleRate)
16953
+ Math.round(SAMPLES_PER_AAC_FRAME * TIMESCALE / elementaryStream.info.sampleRate)
16949
16954
  );
16950
16955
  } else {
16951
16956
  context.seekTo(possibleHeaderStartPos + 1);
@@ -16968,7 +16973,7 @@ var Mediabunny = (() => {
16968
16973
  context.seekTo(possibleHeaderStartPos);
16969
16974
  let remaining3 = context.ensureBuffered(result.header.totalSize);
16970
16975
  if (remaining3 instanceof Promise) remaining3 = await remaining3;
16971
- const duration = result.header.audioSamplesInFrame * TIMESCALE / this.elementaryStream.info.sampleRate;
16976
+ const duration = result.header.audioSamplesInFrame * TIMESCALE / elementaryStream.info.sampleRate;
16972
16977
  return context.supplyPacket(remaining3, Math.round(duration));
16973
16978
  } else {
16974
16979
  context.seekTo(possibleHeaderStartPos + 1);
@@ -16984,7 +16989,7 @@ var Mediabunny = (() => {
16984
16989
  }
16985
16990
  };
16986
16991
  var PacketReadingContext = class _PacketReadingContext {
16987
- constructor(backing, startingPesPacket, uncapped) {
16992
+ constructor(elementaryStream, startingPesPacket) {
16988
16993
  this.currentPos = 0;
16989
16994
  // Relative to the data in startingPesPacket
16990
16995
  this.pesPackets = [];
@@ -16993,14 +16998,13 @@ var Mediabunny = (() => {
16993
16998
  this.endPos = 0;
16994
16999
  this.nextPts = 0;
16995
17000
  this.suppliedPacket = null;
16996
- this.backing = backing;
16997
- this.pid = backing.elementaryStream.pid;
16998
- this.demuxer = backing.elementaryStream.demuxer;
17001
+ this.elementaryStream = elementaryStream;
17002
+ this.pid = elementaryStream.pid;
17003
+ this.demuxer = elementaryStream.demuxer;
16999
17004
  this.startingPesPacket = startingPesPacket;
17000
- this.uncapped = uncapped;
17001
17005
  }
17002
17006
  clone() {
17003
- const clone = new _PacketReadingContext(this.backing, this.startingPesPacket, true);
17007
+ const clone = new _PacketReadingContext(this.elementaryStream, this.startingPesPacket);
17004
17008
  clone.currentPos = this.currentPos;
17005
17009
  clone.pesPackets = [...this.pesPackets];
17006
17010
  clone.currentPesPacketIndex = this.currentPesPacketIndex;
@@ -17128,19 +17132,15 @@ var Mediabunny = (() => {
17128
17132
  /** Supplies the context with a new encoded packet, beginning at the current position. */
17129
17133
  supplyPacket(packetLength, intrinsicDuration) {
17130
17134
  const currentPesPacket = this.getCurrentPesPacket();
17131
- if (!this.uncapped && currentPesPacket !== this.startingPesPacket) {
17132
- this.suppliedPacket = null;
17133
- return;
17134
- }
17135
- this.backing.maybeInsertReferencePacket(currentPesPacket);
17135
+ maybeInsertReferencePacket(this.elementaryStream, currentPesPacket);
17136
17136
  const pts = this.nextPts;
17137
17137
  this.nextPts += intrinsicDuration;
17138
17138
  const sectionStartPos = currentPesPacket.sectionStartPos;
17139
17139
  const sequenceNumber = sectionStartPos + (this.currentPos - this.currentPesPacketPos);
17140
17140
  const data = this.readBytes(packetLength);
17141
17141
  let randomAccessIndicator = currentPesPacket.randomAccessIndicator;
17142
- assert(this.backing.elementaryStream.firstSection);
17143
- if (currentPesPacket.sectionStartPos === this.backing.elementaryStream.firstSection.startPos) {
17142
+ assert(this.elementaryStream.firstSection);
17143
+ if (currentPesPacket.sectionStartPos === this.elementaryStream.firstSection.startPos) {
17144
17144
  randomAccessIndicator = 1;
17145
17145
  }
17146
17146
  this.suppliedPacket = {
@@ -17203,7 +17203,7 @@ var Mediabunny = (() => {
17203
17203
  if (this.context.suppliedPacket) {
17204
17204
  suppliedPacket = this.context.suppliedPacket;
17205
17205
  } else {
17206
- await this.backing.markNextPacket(this.context);
17206
+ await markNextPacket(this.context);
17207
17207
  suppliedPacket = this.context.suppliedPacket;
17208
17208
  }
17209
17209
  this.context.suppliedPacket = null;