@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.
- package/dist/bundles/mediabunny.cjs +99 -104
- package/dist/bundles/mediabunny.min.cjs +42 -42
- package/dist/bundles/mediabunny.min.mjs +41 -41
- package/dist/bundles/mediabunny.mjs +99 -104
- package/dist/bundles/mediabunny.node.cjs +99 -104
- package/dist/mediabunny.d.ts +11 -23
- package/dist/modules/src/crypto/box-tree.js +79 -1
- package/dist/modules/src/crypto/cmaf-encryptor.d.ts.map +1 -1
- package/dist/modules/src/crypto/cmaf-encryptor.js +3 -2
- package/dist/modules/src/emsg.d.ts.map +1 -1
- package/dist/modules/src/emsg.js +1 -10
- package/dist/modules/src/smooth-streaming.d.ts +16 -28
- package/dist/modules/src/smooth-streaming.d.ts.map +1 -1
- package/dist/modules/src/smooth-streaming.js +43 -112
- package/dist/modules/src/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/crypto/box-tree.ts +98 -1
- package/src/crypto/cmaf-encryptor.ts +3 -2
- package/src/emsg.ts +1 -12
- package/src/smooth-streaming.ts +74 -146
|
@@ -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
|
|
62715
|
-
var
|
|
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
|
|
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
|
|
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
|
|
63341
|
-
if (boxFlags(trun2.data) &
|
|
63342
|
-
setU32(trun2.data,
|
|
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
|
|
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
|
|
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 + (
|
|
65377
|
-
const entryCount =
|
|
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
|
-
|
|
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 =
|
|
65404
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
65425
|
-
|
|
65426
|
-
|
|
65427
|
-
|
|
65428
|
-
|
|
65429
|
-
|
|
65430
|
-
|
|
65431
|
-
|
|
65432
|
-
|
|
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 =
|
|
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
|
-
|
|
65452
|
-
|
|
65453
|
-
|
|
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
|
|
65470
|
-
if (
|
|
65471
|
-
growSidxReferencedSize(sidx2,
|
|
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
|
-
|
|
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
|
|