@ahmedrowaihi/mediabunny 1.65.2-beta.325 → 1.65.2-beta.415
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 +236 -2
- package/dist/bundles/mediabunny.min.cjs +44 -44
- package/dist/bundles/mediabunny.min.mjs +45 -45
- package/dist/bundles/mediabunny.mjs +236 -2
- package/dist/bundles/mediabunny.node.cjs +236 -2
- package/dist/mediabunny.d.ts +79 -0
- package/dist/modules/src/crypto/h265-slice-header-parser.js +25 -3
- package/dist/modules/src/emsg.d.ts.map +1 -1
- package/dist/modules/src/emsg.js +4 -2
- package/dist/modules/src/index.d.ts +1 -0
- package/dist/modules/src/index.d.ts.map +1 -1
- package/dist/modules/src/index.js +1 -0
- package/dist/modules/src/smooth-streaming.d.ts +82 -0
- package/dist/modules/src/smooth-streaming.d.ts.map +1 -0
- package/dist/modules/src/smooth-streaming.js +258 -0
- package/dist/modules/src/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/crypto/h265-slice-header-parser.ts +26 -3
- package/src/emsg.ts +4 -2
- package/src/index.ts +7 -0
- package/src/smooth-streaming.ts +333 -0
|
@@ -312,6 +312,8 @@ var Mediabunny = (() => {
|
|
|
312
312
|
buildMdcvBox: () => buildMdcvBox,
|
|
313
313
|
buildPlayReadyObject: () => buildPlayReadyObject,
|
|
314
314
|
buildPlayReadyPssh: () => buildPlayReadyPssh,
|
|
315
|
+
buildTfrfBox: () => buildTfrfBox,
|
|
316
|
+
buildTfxdBox: () => buildTfxdBox,
|
|
315
317
|
buildWidevinePssh: () => buildWidevinePssh,
|
|
316
318
|
canDecode: () => canDecode,
|
|
317
319
|
canDecodeAudio: () => canDecodeAudio,
|
|
@@ -412,6 +414,7 @@ var Mediabunny = (() => {
|
|
|
412
414
|
hlsVariant: () => hlsVariant,
|
|
413
415
|
hlsVersionOf: () => hlsVersionOf,
|
|
414
416
|
insertBoxesBeforeMoof: () => insertBoxesBeforeMoof,
|
|
417
|
+
insertBoxesIntoTraf: () => insertBoxesIntoTraf,
|
|
415
418
|
isInitializationSegment: () => isInitializationSegment,
|
|
416
419
|
iterateIsobmffBoxes: () => iterateIsobmffBoxes,
|
|
417
420
|
keepCodecs: () => keepCodecs,
|
|
@@ -61983,6 +61986,23 @@ ${baseUrl}${p.getFileName()}`;
|
|
|
61983
61986
|
|
|
61984
61987
|
// src/crypto/h265-slice-header-parser.ts
|
|
61985
61988
|
var ceilLog2 = (n) => Math.ceil(Math.log2(n));
|
|
61989
|
+
var skipScalingListData2 = (bs) => {
|
|
61990
|
+
for (let sizeId = 0; sizeId < 4; sizeId++) {
|
|
61991
|
+
for (let matrixId = 0; matrixId < 6; matrixId += sizeId === 3 ? 3 : 1) {
|
|
61992
|
+
if (bs.readBits(1) === 0) {
|
|
61993
|
+
readExpGolomb(bs);
|
|
61994
|
+
continue;
|
|
61995
|
+
}
|
|
61996
|
+
if (sizeId > 1) {
|
|
61997
|
+
readSignedExpGolomb(bs);
|
|
61998
|
+
}
|
|
61999
|
+
const coefNum = Math.min(64, 1 << 4 + (sizeId << 1));
|
|
62000
|
+
for (let i = 0; i < coefNum; i++) {
|
|
62001
|
+
readSignedExpGolomb(bs);
|
|
62002
|
+
}
|
|
62003
|
+
}
|
|
62004
|
+
}
|
|
62005
|
+
};
|
|
61986
62006
|
var H265_BLA_W_LP = 16;
|
|
61987
62007
|
var H265_IDR_W_RADL = 19;
|
|
61988
62008
|
var H265_IDR_N_LP = 20;
|
|
@@ -62186,7 +62206,7 @@ ${baseUrl}${p.getFileName()}`;
|
|
|
62186
62206
|
readExpGolomb(bs);
|
|
62187
62207
|
if (bs.readBits(1) === 1) {
|
|
62188
62208
|
if (bs.readBits(1) === 1) {
|
|
62189
|
-
|
|
62209
|
+
skipScalingListData2(bs);
|
|
62190
62210
|
}
|
|
62191
62211
|
}
|
|
62192
62212
|
bs.skipBits(1);
|
|
@@ -62282,7 +62302,7 @@ ${baseUrl}${p.getFileName()}`;
|
|
|
62282
62302
|
}
|
|
62283
62303
|
}
|
|
62284
62304
|
if (bs.readBits(1) === 1) {
|
|
62285
|
-
|
|
62305
|
+
skipScalingListData2(bs);
|
|
62286
62306
|
}
|
|
62287
62307
|
const listsModificationPresentFlag = bs.readBits(1) === 1;
|
|
62288
62308
|
readExpGolomb(bs);
|
|
@@ -65249,6 +65269,220 @@ ${baseUrl}${p.getFileName()}`;
|
|
|
65249
65269
|
return out;
|
|
65250
65270
|
};
|
|
65251
65271
|
|
|
65272
|
+
// src/smooth-streaming.ts
|
|
65273
|
+
var UUID_TYPE = [117, 117, 105, 100];
|
|
65274
|
+
var TFXD_UUID = [
|
|
65275
|
+
109,
|
|
65276
|
+
29,
|
|
65277
|
+
155,
|
|
65278
|
+
5,
|
|
65279
|
+
66,
|
|
65280
|
+
213,
|
|
65281
|
+
68,
|
|
65282
|
+
230,
|
|
65283
|
+
128,
|
|
65284
|
+
226,
|
|
65285
|
+
20,
|
|
65286
|
+
29,
|
|
65287
|
+
175,
|
|
65288
|
+
247,
|
|
65289
|
+
87,
|
|
65290
|
+
178
|
|
65291
|
+
];
|
|
65292
|
+
var TFRF_UUID = [
|
|
65293
|
+
212,
|
|
65294
|
+
128,
|
|
65295
|
+
126,
|
|
65296
|
+
242,
|
|
65297
|
+
202,
|
|
65298
|
+
57,
|
|
65299
|
+
70,
|
|
65300
|
+
149,
|
|
65301
|
+
142,
|
|
65302
|
+
84,
|
|
65303
|
+
38,
|
|
65304
|
+
203,
|
|
65305
|
+
158,
|
|
65306
|
+
70,
|
|
65307
|
+
167,
|
|
65308
|
+
159
|
|
65309
|
+
];
|
|
65310
|
+
var uuidBox = (uuid, body) => Uint8Array.from([...u32Bytes(8 + uuid.length + body.length), ...UUID_TYPE, ...uuid, ...body]);
|
|
65311
|
+
var checkTime = (label, value) => {
|
|
65312
|
+
if (!Number.isSafeInteger(value) || value < 0) {
|
|
65313
|
+
throw new TypeError(`${label} must be a non-negative integer below 2^53.`);
|
|
65314
|
+
}
|
|
65315
|
+
};
|
|
65316
|
+
var buildTfxdBox = (timing) => {
|
|
65317
|
+
checkTime("time", timing.time);
|
|
65318
|
+
checkTime("duration", timing.duration);
|
|
65319
|
+
return uuidBox(TFXD_UUID, [1, 0, 0, 0, ...u64Bytes(timing.time), ...u64Bytes(timing.duration)]);
|
|
65320
|
+
};
|
|
65321
|
+
var buildTfrfBox = (fragments, options = {}) => {
|
|
65322
|
+
if (fragments.length === 0) {
|
|
65323
|
+
throw new InvalidUsageError("A tfrf box must announce at least one fragment.");
|
|
65324
|
+
}
|
|
65325
|
+
const countBytes = options.fragmentCountBytes ?? 1;
|
|
65326
|
+
if (countBytes !== 1 && countBytes !== 4) {
|
|
65327
|
+
throw new InvalidUsageError("fragmentCountBytes must be 1 or 4.");
|
|
65328
|
+
}
|
|
65329
|
+
if (countBytes === 1 && fragments.length > 255) {
|
|
65330
|
+
throw new InvalidUsageError("A one-byte fragment count cannot state more than 255 fragments.");
|
|
65331
|
+
}
|
|
65332
|
+
const body = [1, 0, 0, 0, ...countBytes === 1 ? [fragments.length] : u32Bytes(fragments.length)];
|
|
65333
|
+
for (const fragment of fragments) {
|
|
65334
|
+
checkTime("time", fragment.time);
|
|
65335
|
+
checkTime("duration", fragment.duration);
|
|
65336
|
+
body.push(...u64Bytes(fragment.time), ...u64Bytes(fragment.duration));
|
|
65337
|
+
}
|
|
65338
|
+
return uuidBox(TFRF_UUID, body);
|
|
65339
|
+
};
|
|
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
|
+
var shiftSaioOffsets = (traf2, added) => {
|
|
65370
|
+
for (const saio2 of childrenOf(traf2).filter((box2) => box2.type === "saio")) {
|
|
65371
|
+
const data = saio2.data;
|
|
65372
|
+
if (data === void 0) {
|
|
65373
|
+
continue;
|
|
65374
|
+
}
|
|
65375
|
+
const version = data[0];
|
|
65376
|
+
let position = 4 + (boxFlags2(data) & 1 ? 8 : 0);
|
|
65377
|
+
const entryCount = u32At(data, position);
|
|
65378
|
+
position += 4;
|
|
65379
|
+
const view2 = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
65380
|
+
for (let i = 0; i < entryCount; i++) {
|
|
65381
|
+
if (version === 0) {
|
|
65382
|
+
setU32At(data, position, u32At(data, position) + added);
|
|
65383
|
+
position += 4;
|
|
65384
|
+
} else {
|
|
65385
|
+
view2.setBigUint64(position, view2.getBigUint64(position) + BigInt(added));
|
|
65386
|
+
position += 8;
|
|
65387
|
+
}
|
|
65388
|
+
}
|
|
65389
|
+
}
|
|
65390
|
+
};
|
|
65391
|
+
var growSidxReferencedSize = (sidx2, fragmentIndex, added) => {
|
|
65392
|
+
const data = sidx2.data;
|
|
65393
|
+
if (data === void 0) {
|
|
65394
|
+
return;
|
|
65395
|
+
}
|
|
65396
|
+
const version = data[0];
|
|
65397
|
+
const position = 4 + 4 + 4 + (version === 0 ? 8 : 16) + 2;
|
|
65398
|
+
const referenceCount = data[position] << 8 | data[position + 1];
|
|
65399
|
+
if (fragmentIndex >= referenceCount) {
|
|
65400
|
+
return;
|
|
65401
|
+
}
|
|
65402
|
+
const at = position + 2 + fragmentIndex * 12;
|
|
65403
|
+
const word = u32At(data, at);
|
|
65404
|
+
setU32At(data, at, word & 2147483648 | (word & 2147483647) + added & 2147483647);
|
|
65405
|
+
};
|
|
65406
|
+
var insertBoxesIntoTraf = (segment, trackId, boxes) => {
|
|
65407
|
+
if (boxes.length === 0) {
|
|
65408
|
+
return segment;
|
|
65409
|
+
}
|
|
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
|
+
});
|
|
65417
|
+
const added = inserted.reduce((total, box2) => total + measureBox(box2), 0);
|
|
65418
|
+
const parsed = parseBoxes(segment, 0, segment.length);
|
|
65419
|
+
const sidxFirstFragment = /* @__PURE__ */ new Map();
|
|
65420
|
+
let fragmentIndex = -1;
|
|
65421
|
+
let target = null;
|
|
65422
|
+
for (const box2 of parsed) {
|
|
65423
|
+
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 };
|
|
65437
|
+
}
|
|
65438
|
+
}
|
|
65439
|
+
if (target === null) {
|
|
65440
|
+
throw new MalformedInputError(`The segment has no traf for track ${trackId}.`);
|
|
65441
|
+
}
|
|
65442
|
+
const targetFragment = parsed.filter((box2) => box2.type === "moof").indexOf(target.moof);
|
|
65443
|
+
const { moof: moof2, traf: traf2 } = target;
|
|
65444
|
+
const children = childrenOf(traf2);
|
|
65445
|
+
const lastTrun = children.map((box2) => box2.type).lastIndexOf("trun");
|
|
65446
|
+
if (lastTrun === -1) {
|
|
65447
|
+
throw new MalformedInputError(`The traf for track ${trackId} has no trun to insert after.`);
|
|
65448
|
+
}
|
|
65449
|
+
traf2.children = [...children.slice(0, lastTrun + 1), ...inserted, ...children.slice(lastTrun + 1)];
|
|
65450
|
+
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);
|
|
65467
|
+
}
|
|
65468
|
+
}
|
|
65469
|
+
for (const [sidx2, firstFragment] of sidxFirstFragment) {
|
|
65470
|
+
if (targetFragment >= firstFragment) {
|
|
65471
|
+
growSidxReferencedSize(sidx2, targetFragment - firstFragment, added);
|
|
65472
|
+
}
|
|
65473
|
+
}
|
|
65474
|
+
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);
|
|
65483
|
+
return out;
|
|
65484
|
+
};
|
|
65485
|
+
|
|
65252
65486
|
// src/mpeg-ts/scte35.ts
|
|
65253
65487
|
var SYNC_BYTE = 71;
|
|
65254
65488
|
var SPLICE_INFO_TABLE_ID = 252;
|