@ahmedrowaihi/mediabunny 1.65.2-beta.415 → 1.65.2-beta.418

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.
@@ -58413,6 +58413,57 @@ ${baseUrl}${p.getFileName()}`;
58413
58413
  enca: 28
58414
58414
  };
58415
58415
  var readU323 = (bytes2, offset) => (bytes2[offset] << 24 | bytes2[offset + 1] << 16 | bytes2[offset + 2] << 8 | bytes2[offset + 3]) >>> 0;
58416
+ var writeU32 = (bytes2, offset, value) => {
58417
+ bytes2[offset] = value >>> 24 & 255;
58418
+ bytes2[offset + 1] = value >>> 16 & 255;
58419
+ bytes2[offset + 2] = value >>> 8 & 255;
58420
+ bytes2[offset + 3] = value & 255;
58421
+ };
58422
+ var u32Bytes = (value) => [
58423
+ value >>> 24 & 255,
58424
+ value >>> 16 & 255,
58425
+ value >>> 8 & 255,
58426
+ value & 255
58427
+ ];
58428
+ var u64Bytes = (value) => {
58429
+ const big = BigInt(value);
58430
+ return Array.from({ length: 8 }, (_, i) => Number(big >> BigInt(56 - i * 8) & 0xffn));
58431
+ };
58432
+ var boxFlags = (data) => data[1] << 16 | data[2] << 8 | data[3];
58433
+ var TFHD_BASE_DATA_OFFSET_PRESENT = 1;
58434
+ var TFHD_DEFAULT_BASE_IS_MOOF = 131072;
58435
+ var TRUN_DATA_OFFSET_POSITION = 4 + 4;
58436
+ var TRUN_DATA_OFFSET_PRESENT = 1;
58437
+ var trafsOf = (moof2) => (moof2.children ?? []).filter((box2) => box2.type === "traf");
58438
+ var trunsOf = (traf2) => (traf2.children ?? []).filter((box2) => box2.type === "trun");
58439
+ var tfhdOf = (traf2) => (traf2.children ?? []).find((box2) => box2.type === "tfhd");
58440
+ var offsetsFollowMoof = (traf2, indexInMoof) => {
58441
+ const tfhd2 = tfhdOf(traf2);
58442
+ if (tfhd2?.data === void 0) {
58443
+ return indexInMoof === 0;
58444
+ }
58445
+ const flags = boxFlags(tfhd2.data);
58446
+ if (flags & TFHD_BASE_DATA_OFFSET_PRESENT) {
58447
+ return false;
58448
+ }
58449
+ return (flags & TFHD_DEFAULT_BASE_IS_MOOF) !== 0 || indexInMoof === 0;
58450
+ };
58451
+ var shiftTrunDataOffsets = (moof2, delta) => {
58452
+ for (const [index, traf2] of trafsOf(moof2).entries()) {
58453
+ if (!offsetsFollowMoof(traf2, index)) {
58454
+ continue;
58455
+ }
58456
+ for (const trun2 of trunsOf(traf2)) {
58457
+ if (trun2.data !== void 0 && boxFlags(trun2.data) & TRUN_DATA_OFFSET_PRESENT) {
58458
+ writeU32(
58459
+ trun2.data,
58460
+ TRUN_DATA_OFFSET_POSITION,
58461
+ readU323(trun2.data, TRUN_DATA_OFFSET_POSITION) + delta
58462
+ );
58463
+ }
58464
+ }
58465
+ }
58466
+ };
58416
58467
  var boxType = (bytes2, offset) => String.fromCharCode(bytes2[offset], bytes2[offset + 1], bytes2[offset + 2], bytes2[offset + 3]);
58417
58468
  var parseBoxes = (bytes2, start, end) => {
58418
58469
  const boxes = [];
@@ -58491,6 +58542,13 @@ ${baseUrl}${p.getFileName()}`;
58491
58542
  }
58492
58543
  return out;
58493
58544
  };
58545
+ var parseSingleBoxes = (boxes) => boxes.map((bytes2) => {
58546
+ const boxList = parseBoxes(bytes2, 0, bytes2.length);
58547
+ if (boxList.length !== 1) {
58548
+ throw new InvalidUsageError("Each entry must be exactly one complete top-level box.");
58549
+ }
58550
+ return boxList[0];
58551
+ });
58494
58552
  var findBox = (boxes, type) => {
58495
58553
  for (const box2 of boxes) {
58496
58554
  if (box2.type === type) {
@@ -62709,10 +62767,9 @@ ${baseUrl}${p.getFileName()}`;
62709
62767
  var toMutable = (box2) => parseBoxes(forkBoxToBytes(box2), 0, measureForkBox(box2))[0];
62710
62768
  var u324 = (data, offset) => new DataView(data.buffer, data.byteOffset, data.byteLength).getUint32(offset);
62711
62769
  var setU32 = (data, offset, value) => new DataView(data.buffer, data.byteOffset, data.byteLength).setUint32(offset, value);
62712
- var boxFlags = (data) => data[1] << 16 | data[2] << 8 | data[3];
62713
62770
  var SENC_ENTRIES_OFFSET = 8 + 4 + 4;
62714
- var TRUN_DATA_OFFSET_PRESENT = 1;
62715
- var TRUN_DATA_OFFSET_POSITION = 4 + 4;
62771
+ var TRUN_DATA_OFFSET_PRESENT2 = 1;
62772
+ var TRUN_DATA_OFFSET_POSITION2 = 4 + 4;
62716
62773
  var parseTrun = (data, defaultSampleSize, defaultSampleDuration) => {
62717
62774
  const flags = boxFlags(data);
62718
62775
  const sampleCount = u324(data, 4);
@@ -63234,7 +63291,7 @@ ${baseUrl}${p.getFileName()}`;
63234
63291
  }
63235
63292
  return flags & 16 ? u324(tfhd2.data, offset) : 0;
63236
63293
  };
63237
- var trunsOf = (traf2) => (traf2.children ?? []).filter((box2) => box2.type === "trun");
63294
+ var trunsOf2 = (traf2) => (traf2.children ?? []).filter((box2) => box2.type === "trun");
63238
63295
  var baseDataOffsetOf = (tfhd2, moofOffset) => {
63239
63296
  const data = tfhd2.data;
63240
63297
  if (!(boxFlags(data) & 1)) {
@@ -63281,7 +63338,7 @@ ${baseUrl}${p.getFileName()}`;
63281
63338
  const periodPerSample = [];
63282
63339
  let decodeTime = rotation === void 0 ? 0 : baseMediaDecodeTime2(traf2, track.trackId);
63283
63340
  let cursor = moofSizeBefore + 8 - (mdatDataStart - base);
63284
- for (const trun2 of trunsOf(traf2)) {
63341
+ for (const trun2 of trunsOf2(traf2)) {
63285
63342
  const parsed = parseTrun(trun2.data, defaultSampleSize, track.defaultSampleDuration);
63286
63343
  if (parsed.dataOffsetPos >= 0) {
63287
63344
  cursor = base + u324(trun2.data, parsed.dataOffsetPos) - mdatDataStart;
@@ -63337,9 +63394,9 @@ ${baseUrl}${p.getFileName()}`;
63337
63394
  }
63338
63395
  const delta = measureBox(moof2) - moofSizeBefore;
63339
63396
  for (const traf2 of (moof2.children ?? []).filter((b) => b.type === "traf")) {
63340
- for (const trun2 of trunsOf(traf2)) {
63341
- if (boxFlags(trun2.data) & TRUN_DATA_OFFSET_PRESENT) {
63342
- setU32(trun2.data, TRUN_DATA_OFFSET_POSITION, u324(trun2.data, TRUN_DATA_OFFSET_POSITION) + delta);
63397
+ for (const trun2 of trunsOf2(traf2)) {
63398
+ if (boxFlags(trun2.data) & TRUN_DATA_OFFSET_PRESENT2) {
63399
+ setU32(trun2.data, TRUN_DATA_OFFSET_POSITION2, u324(trun2.data, TRUN_DATA_OFFSET_POSITION2) + delta);
63343
63400
  }
63344
63401
  }
63345
63402
  }
@@ -63564,7 +63621,7 @@ ${baseUrl}${p.getFileName()}`;
63564
63621
  const base = baseDataOffsetOf(tfhd2, moofOffset);
63565
63622
  const defaultSampleSize = defaultSampleSizeOf(tfhd2);
63566
63623
  let cursor = measureBox(moof2) + 8 - (mdatDataStart - base);
63567
- for (const trun2 of trunsOf(traf2)) {
63624
+ for (const trun2 of trunsOf2(traf2)) {
63568
63625
  const parsed = parseTrun(trun2.data, defaultSampleSize, 0);
63569
63626
  if (parsed.dataOffsetPos >= 0) {
63570
63627
  cursor = base + u324(trun2.data, parsed.dataOffsetPos) - mdatDataStart;
@@ -65105,16 +65162,6 @@ ${baseUrl}${p.getFileName()}`;
65105
65162
 
65106
65163
  // src/emsg.ts
65107
65164
  var nullTerminated = (text) => [...textEncoder.encode(text), 0];
65108
- var u32Bytes = (value) => [
65109
- value >>> 24 & 255,
65110
- value >>> 16 & 255,
65111
- value >>> 8 & 255,
65112
- value & 255
65113
- ];
65114
- var u64Bytes = (value) => {
65115
- const big = BigInt(value);
65116
- return Array.from({ length: 8 }, (_, i) => Number(big >> BigInt(56 - i * 8) & 0xffn));
65117
- };
65118
65165
  var parseEmsgBody = (body) => {
65119
65166
  if (body.length < 4) {
65120
65167
  throw new MalformedInputError("emsg box is too short to hold its version and flags.");
@@ -65337,49 +65384,20 @@ ${baseUrl}${p.getFileName()}`;
65337
65384
  }
65338
65385
  return uuidBox(TFRF_UUID, body);
65339
65386
  };
65340
- var u32At = (data, offset) => (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0;
65341
- var setU32At = (data, offset, value) => {
65342
- data[offset] = value >>> 24 & 255;
65343
- data[offset + 1] = value >>> 16 & 255;
65344
- data[offset + 2] = value >>> 8 & 255;
65345
- data[offset + 3] = value & 255;
65346
- };
65347
- var boxFlags2 = (data) => data[1] << 16 | data[2] << 8 | data[3];
65348
- var TFHD_BASE_DATA_OFFSET_PRESENT = 1;
65349
- var TFHD_DEFAULT_BASE_IS_MOOF = 131072;
65350
- var TRUN_DATA_OFFSET_PRESENT2 = 1;
65351
- var TRUN_DATA_OFFSET_POSITION2 = 8;
65352
- var childrenOf = (box2) => box2.children ?? [];
65353
- var trafsOf = (moof2) => childrenOf(moof2).filter((box2) => box2.type === "traf");
65354
- var trackIdOf2 = (traf2) => {
65355
- const tfhd2 = childrenOf(traf2).find((box2) => box2.type === "tfhd");
65356
- return tfhd2?.data === void 0 ? null : u32At(tfhd2.data, 4);
65357
- };
65358
- var offsetsFollowMoof = (traf2, indexInMoof) => {
65359
- const tfhd2 = childrenOf(traf2).find((box2) => box2.type === "tfhd");
65360
- if (tfhd2?.data === void 0) {
65361
- return indexInMoof === 0;
65362
- }
65363
- const flags = boxFlags2(tfhd2.data);
65364
- if (flags & TFHD_BASE_DATA_OFFSET_PRESENT) {
65365
- return false;
65366
- }
65367
- return (flags & TFHD_DEFAULT_BASE_IS_MOOF) !== 0 || indexInMoof === 0;
65368
- };
65369
65387
  var shiftSaioOffsets = (traf2, added) => {
65370
- for (const saio2 of childrenOf(traf2).filter((box2) => box2.type === "saio")) {
65388
+ for (const saio2 of (traf2.children ?? []).filter((box2) => box2.type === "saio")) {
65371
65389
  const data = saio2.data;
65372
65390
  if (data === void 0) {
65373
65391
  continue;
65374
65392
  }
65375
65393
  const version = data[0];
65376
- let position = 4 + (boxFlags2(data) & 1 ? 8 : 0);
65377
- const entryCount = u32At(data, position);
65394
+ let position = 4 + (boxFlags(data) & 1 ? 8 : 0);
65395
+ const entryCount = readU323(data, position);
65378
65396
  position += 4;
65379
65397
  const view2 = new DataView(data.buffer, data.byteOffset, data.byteLength);
65380
65398
  for (let i = 0; i < entryCount; i++) {
65381
65399
  if (version === 0) {
65382
- setU32At(data, position, u32At(data, position) + added);
65400
+ writeU32(data, position, readU323(data, position) + added);
65383
65401
  position += 4;
65384
65402
  } else {
65385
65403
  view2.setBigUint64(position, view2.getBigUint64(position) + BigInt(added));
@@ -65400,86 +65418,63 @@ ${baseUrl}${p.getFileName()}`;
65400
65418
  return;
65401
65419
  }
65402
65420
  const at = position + 2 + fragmentIndex * 12;
65403
- const word = u32At(data, at);
65404
- setU32At(data, at, word & 2147483648 | (word & 2147483647) + added & 2147483647);
65421
+ const word = readU323(data, at);
65422
+ const grown = (word & 2147483647) + added;
65423
+ if (grown > 2147483647) {
65424
+ throw new InvalidUsageError("The grown fragment no longer fits a sidx referenced_size.");
65425
+ }
65426
+ writeU32(data, at, word & 2147483648 | grown);
65405
65427
  };
65406
65428
  var insertBoxesIntoTraf = (segment, trackId, boxes) => {
65407
65429
  if (boxes.length === 0) {
65408
65430
  return segment;
65409
65431
  }
65410
- const inserted = boxes.map((bytes2) => {
65411
- const boxList = parseBoxes(bytes2, 0, bytes2.length);
65412
- if (boxList.length !== 1) {
65413
- throw new InvalidUsageError("Each entry must be exactly one complete top-level box.");
65414
- }
65415
- return boxList[0];
65416
- });
65432
+ const inserted = parseSingleBoxes(boxes);
65417
65433
  const added = inserted.reduce((total, box2) => total + measureBox(box2), 0);
65418
65434
  const parsed = parseBoxes(segment, 0, segment.length);
65419
- const sidxFirstFragment = /* @__PURE__ */ new Map();
65435
+ const sidxes = [];
65420
65436
  let fragmentIndex = -1;
65437
+ let start = 0;
65421
65438
  let target = null;
65422
65439
  for (const box2 of parsed) {
65423
65440
  if (box2.type === "sidx") {
65424
- sidxFirstFragment.set(box2, fragmentIndex + 1);
65425
- continue;
65426
- }
65427
- if (box2.type !== "moof") {
65428
- continue;
65429
- }
65430
- fragmentIndex++;
65431
- if (target !== null) {
65432
- continue;
65433
- }
65434
- const traf3 = trafsOf(box2).find((candidate) => trackIdOf2(candidate) === trackId);
65435
- if (traf3 !== void 0) {
65436
- target = { moof: box2, traf: traf3 };
65441
+ sidxes.push({ sidx: box2, firstFragment: fragmentIndex + 1 });
65442
+ } else if (box2.type === "moof") {
65443
+ fragmentIndex++;
65444
+ const traf3 = trafsOf(box2).find((candidate) => {
65445
+ const tfhd2 = tfhdOf(candidate);
65446
+ return tfhd2?.data !== void 0 && readU323(tfhd2.data, 4) === trackId;
65447
+ });
65448
+ if (traf3 !== void 0 && target === null) {
65449
+ target = { moof: box2, traf: traf3, fragment: fragmentIndex, start };
65450
+ }
65437
65451
  }
65452
+ start += measureBox(box2);
65438
65453
  }
65439
65454
  if (target === null) {
65440
65455
  throw new MalformedInputError(`The segment has no traf for track ${trackId}.`);
65441
65456
  }
65442
- const targetFragment = parsed.filter((box2) => box2.type === "moof").indexOf(target.moof);
65443
65457
  const { moof: moof2, traf: traf2 } = target;
65444
- const children = childrenOf(traf2);
65458
+ const children = traf2.children ?? [];
65445
65459
  const lastTrun = children.map((box2) => box2.type).lastIndexOf("trun");
65446
65460
  if (lastTrun === -1) {
65447
65461
  throw new MalformedInputError(`The traf for track ${trackId} has no trun to insert after.`);
65448
65462
  }
65449
65463
  traf2.children = [...children.slice(0, lastTrun + 1), ...inserted, ...children.slice(lastTrun + 1)];
65464
+ shiftTrunDataOffsets(moof2, added);
65450
65465
  const trafs = trafsOf(moof2);
65451
- const targetIndex = trafs.indexOf(traf2);
65452
- for (const [index, other] of trafs.entries()) {
65453
- if (!offsetsFollowMoof(other, index)) {
65454
- continue;
65455
- }
65456
- for (const trun2 of childrenOf(other).filter((box2) => box2.type === "trun")) {
65457
- if (trun2.data !== void 0 && boxFlags2(trun2.data) & TRUN_DATA_OFFSET_PRESENT2) {
65458
- setU32At(
65459
- trun2.data,
65460
- TRUN_DATA_OFFSET_POSITION2,
65461
- u32At(trun2.data, TRUN_DATA_OFFSET_POSITION2) + added
65462
- );
65463
- }
65464
- }
65465
- if (index >= targetIndex) {
65466
- shiftSaioOffsets(other, added);
65466
+ for (let index = trafs.indexOf(traf2); index < trafs.length; index++) {
65467
+ if (offsetsFollowMoof(trafs[index], index)) {
65468
+ shiftSaioOffsets(trafs[index], added);
65467
65469
  }
65468
65470
  }
65469
- for (const [sidx2, firstFragment] of sidxFirstFragment) {
65470
- if (targetFragment >= firstFragment) {
65471
- growSidxReferencedSize(sidx2, targetFragment - firstFragment, added);
65471
+ for (const { sidx: sidx2, firstFragment } of sidxes) {
65472
+ if (target.fragment >= firstFragment) {
65473
+ growSidxReferencedSize(sidx2, target.fragment - firstFragment, added);
65472
65474
  }
65473
65475
  }
65474
65476
  const out = serializeBoxes(parsed);
65475
- let moofStart = 0;
65476
- for (const box2 of parsed) {
65477
- if (box2 === moof2) {
65478
- break;
65479
- }
65480
- moofStart += measureBox(box2);
65481
- }
65482
- shiftBaseDataOffsets(out.subarray(moofStart), added);
65477
+ shiftBaseDataOffsets(out.subarray(target.start), added);
65483
65478
  return out;
65484
65479
  };
65485
65480