mpegts-stream
Version:
Multiplex AAC audio samples and H264/AVC video samples into an MPEG2TS stream ready for transport.
1,521 lines (1,515 loc) • 143 kB
JavaScript
import { Transform } from 'stream';
// src/muxer.js
// src/simple-buffer.js
var SimpleBuffer = class _SimpleBuffer {
/**
* @type {number[]}
*/
#data;
/**
* @type {number}
*/
#pos;
/**
* @type {TMaxSize|undefined}
*/
#maxSize;
/**
*
* @param {TMaxSize} size
*/
constructor(size = (
/** @type {any}*/
void 0
)) {
this.#maxSize = size;
this.#data = [];
this.#pos = 0;
}
/**
* @overload
* @param {SimpleBuffer<1>} sb1
* Simple buffer that stores 1 byte.
* @returns {void}
*/
/**
* @overload
* @param {uint8} uint32
* Integer treated as if it is an unsigned 32-bit integer.
* @returns {void}
*/
/**
* @param {uint8|SimpleBuffer<1>} uint8
* @returns {void}
*/
write1Byte(uint8) {
this.#check(1);
if (uint8 instanceof _SimpleBuffer) {
return this.writeBuffer(uint8, true);
}
this.#data.push(uint8 & 255);
}
/**
* @overload
* @param {SimpleBuffer<2>} sb2
* Simple buffer that stores 2 bytes.
* @returns {void}
*/
/**
* @overload
* @param {uint16} uint16
* Integer treated as if it is an unsigned 32-bit integer.
* @returns {void}
*/
/**
* @param {uint16|SimpleBuffer<2>} uint16
* @returns {void}
*/
write2Bytes(uint16) {
this.#check(2);
if (uint16 instanceof _SimpleBuffer) {
return this.writeBuffer(uint16, true);
}
this.#data.push(uint16 >>> 8 & 255);
this.#data.push(uint16 & 255);
}
/**
* @overload
* @param {SimpleBuffer<4>} sb4
* Simple buffer that stores 4 bytes.
* @returns {void}
*/
/**
* @overload
* @param {uint32} uint32
* Integer treated as if it is an unsigned 32-bit integer.
* @returns {void}
*/
/**
* @param {uint32|SimpleBuffer<4>} uint32
* @returns {void}
*/
write3Bytes(uint32) {
this.#check(4);
if (uint32 instanceof _SimpleBuffer) {
return this.writeBuffer(uint32, true);
}
this.#data.push(uint32 >>> 16 & 255);
this.#data.push(uint32 >>> 8 & 255);
this.#data.push(uint32 & 255);
}
/**
* @overload
* @param {SimpleBuffer<4>} sb4
* Simple buffer that stores 4 bytes.
* @returns {void}
*/
/**
* @overload
* @param {uint32} uint32
* Integer treated as if it is an unsigned 32-bit integer.
* @returns {void}
*/
/**
* @param {uint32|SimpleBuffer<4>} uint32
* @returns {void}
*/
write4Bytes(uint32) {
this.#check(4);
if (uint32 instanceof _SimpleBuffer) {
return this.writeBuffer(uint32, true);
}
this.#data.push(uint32 >>> 24 & 255);
this.#data.push(uint32 >>> 16 & 255);
this.#data.push(uint32 >>> 8 & 255);
this.#data.push(uint32 & 255);
}
/**
* @overload
* @param {SimpleBuffer<8>} sb8
* Simple buffer that stores 8 bytes.
* @returns {void}
*/
/**
* @overload
* @param {uint64} uint64
* Integer treated as if it is an unsigned 64-bit integer.
* @returns {void}
*/
/**
* Write out 8 bytes to the simple buffer given a 64-bit `bigint` integer or a SimpleBuffer that stores 8 bytes.
* (If you wish to only store whatever bytes are in the `SimpleBuffer` passed as an argument, use {@link writeBuffer} instead.)
* @param {uint64|SimpleBuffer<8>} uint64
* @returns {void}
*/
write8Bytes(uint64) {
this.#check(8);
if (uint64 instanceof _SimpleBuffer) {
return this.writeBuffer(uint64, true);
}
const upper = Number(BigInt(uint64 >> 32n)) >>> 0;
const lower = Number(BigInt(uint64 & 0xFFFFFFFFn)) >>> 0;
this.#data.push(Number(upper >> 24 & 255));
this.#data.push(Number(upper >> 16 & 255));
this.#data.push(Number(upper >> 8 & 255));
this.#data.push(Number(upper & 255));
this.#data.push(Number(lower >> 24 & 255));
this.#data.push(Number(lower >> 16 & 255));
this.#data.push(Number(lower >> 8 & 255));
this.#data.push(Number(lower & 255));
}
/**
*
* @param {string} str
*/
writeString(str) {
for (let i = 0; i < str.length; ++i) {
this.#data.push(str.charCodeAt(i));
}
}
/**
* Write an existing SimpleBuffer to this SimpleBuffer.
* @param {SimpleBuffer<number>} sb
* @param {boolean} writeAllBytes
* If true is specified, then all bytes from the simple buffer up to the maximum size the buffer can hold will be written to this buffer.
*/
writeBuffer(sb, writeAllBytes = false) {
if (sb == this) {
return;
}
const data = sb.data();
if (!data) {
return;
}
if (writeAllBytes && sb.#maxSize !== void 0) {
this.#check(sb.#maxSize);
for (let i = 0; i < sb.#maxSize; ++i) {
this.#data.push(data[i]);
}
} else {
this.#check(data.length);
for (let i = 0; i < sb.#data.length; ++i) {
this.#data.push(data[i]);
}
}
}
/**
* @param {Uint8Array} bytes
*/
append(bytes) {
this.#check(bytes.length);
this.#data.push(...bytes);
}
/**
*
* @param {Uint8Array} bytes
*/
prepend(bytes) {
this.#check(bytes.length);
this.#data = [...bytes, ...this.#data];
}
/**
* @returns {uint8}
*/
read1Byte() {
const b1 = this.#data[this.#pos++];
return b1;
}
/**
* @returns {uint16}
*/
read2Bytes() {
const b1 = this.#data[this.#pos++];
const b2 = this.#data[this.#pos++];
return b1 << 8 | b2;
}
/**
* @returns {uint32}
*/
read3Bytes() {
const b1 = this.#data[this.#pos++];
const b2 = this.#data[this.#pos++];
const b3 = this.#data[this.#pos++];
return b1 << 16 | b2 << 8 | b3;
}
/**
* @returns {uint32}
*/
read4Bytes() {
const b1 = this.#data[this.#pos++];
const b2 = this.#data[this.#pos++];
const b3 = this.#data[this.#pos++];
const b4 = this.#data[this.#pos++];
return (b1 << 24 | b2 << 16 | b3 << 8 | b4) >>> 0;
}
/**
* @returns {uint64}
*/
read8Bytes() {
const w1 = this.read4Bytes();
const w2 = this.read4Bytes();
return BigInt(w1) << 32n | BigInt(w2);
}
/**
*
* @param {number} strLen
* Size of the string expected to be read from the buffer.
*/
readString(strLen) {
const data = this.#data.slice(this.#pos, strLen);
return data.map((b) => String.fromCharCode(b)).join("");
}
/**
*
* @param {number} numBytes
*/
skip(numBytes) {
this.#pos += numBytes;
}
/**
*
* @param {number} requiredSize
*/
require(requiredSize) {
return requiredSize <= this.#data.length;
}
/**
*/
empty() {
if (this.#maxSize === void 0) {
return false;
}
return this.#pos >= this.#maxSize;
}
size() {
return this.#data.length;
}
pos() {
return this.#pos;
}
data() {
if (this.empty()) {
return null;
}
return new Uint8Array(this.#data);
}
currentData() {
if (this.empty()) {
return null;
}
return new Uint8Array(this.#data.slice(this.#pos));
}
dataLeft() {
if (this.#maxSize === void 0) {
return Infinity;
}
return this.#maxSize - this.#pos;
}
clear() {
this.#pos = 0;
this.#data = [];
}
/**
*
* @param {number} pos
* Position (in bytes) of where to set the data in the buffer.
* @param {Uint8Array} data
* Data to place in the buffer at the position, `pos`, specified.
*/
setData(pos, data, size = data.length) {
this.#check(size);
this.#data = [
...this.#data.slice(0, pos),
...data,
...this.#data.slice(pos + size)
];
}
/**
*
* @param {number} pos
*/
get(pos) {
return this.#data[pos];
}
/**
*
* @param {number} pos
* @param {number} value
*/
set(pos, value) {
this.#data[pos] = value;
}
/**
*
* @param {number|undefined} size
*/
#check(size) {
if (size === void 0 || this.#maxSize === void 0) {
return;
}
const newSize = this.#data.length + size;
if (newSize > this.#maxSize) {
throw new Error(`Buffer is larger than the specified max size of ${this.#maxSize} bytes. (given: ${newSize})`);
}
}
};
// src/ts.js
var TsHeader = class {
mSyncByte;
mTransportErrorIndicator;
mPayloadUnitStartIndicator;
mTransportPriority;
mPid;
mTransportScramblingControl;
mAdaptationFieldControl;
mContinuityCounter;
constructor() {
}
/**
*
*/
encode() {
const sb = new SimpleBuffer(4);
sb.write1Byte(this.mSyncByte);
let lB1b2 = this.mPid & 8191;
lB1b2 |= (this.mTransportPriority << 13 & 8192) >>> 0;
lB1b2 |= (this.mPayloadUnitStartIndicator << 14 & 16384) >>> 0;
lB1b2 |= (this.mTransportErrorIndicator << 15 & 32768) >>> 0;
sb.write2Bytes(lB1b2);
let lB3 = this.mContinuityCounter & 15;
lB3 |= this.mAdaptationFieldControl << 4 & 48;
lB3 |= this.mTransportScramblingControl << 6 & 192;
sb.write1Byte(lB3);
return sb;
}
};
var AdaptationFieldHeader = class {
/** @type {uint8} */
mAdaptationFieldLength = 0;
/** @type {uint8} */
mAdaptationFieldExtensionFlag = 0;
/** @type {uint8} */
mTransportPrivateDataFlag = 0;
/** @type {uint8} */
mSplicingPointFlag = 0;
/** @type {uint8} */
mOpcrFlag = 0;
/** @type {uint8} */
mPcrFlag = 0;
/** @type {uint8} */
mElementaryStreamPriorityIndicator = 0;
/** @type {uint8} */
mRandomAccessIndicator = 0;
/** @type {uint8} */
mDiscontinuityIndicator = 0;
constructor() {
}
encode() {
const sb = new SimpleBuffer(2);
sb.write1Byte(this.mAdaptationFieldLength);
if (this.mAdaptationFieldLength != 0) {
let lVal = (this.mAdaptationFieldExtensionFlag & 1) >>> 0;
lVal |= (this.mTransportPrivateDataFlag << 1 & 2) >>> 0;
lVal |= (this.mSplicingPointFlag << 2 & 4) >>> 0;
lVal |= (this.mOpcrFlag << 3 & 8) >>> 0;
lVal |= (this.mPcrFlag << 4 & 16) >>> 0;
lVal |= (this.mElementaryStreamPriorityIndicator << 5 & 32) >>> 0;
lVal |= (this.mRandomAccessIndicator << 6 & 64) >>> 0;
lVal |= (this.mDiscontinuityIndicator << 7 & 128) >>> 0;
sb.write1Byte(lVal);
}
return sb;
}
};
var EsFrame = class {
/** @type {SimpleBuffer[]} */
mData = [];
/** @type {uint64} */
mPts = 0n;
/** @type {uint64} */
mDts = 0n;
/** @type {uint64} */
mPcr = 0n;
/** @type {uint8} */
mRandomAccess = 0;
/** @type {uint8} */
mStreamType = 0;
/** @type {uint8} */
mStreamId = 0;
/** @type {uint16} */
mPid = 0;
/** @type {uint16} */
mExpectedPesPacketLength = 0;
/** @type {uint16} */
mExpectedPlayloadLength = 0;
/** @type {boolean} */
mCompleted;
/** @type {boolean} */
mBroken;
/**
* @overload
* @param {number=} streamType
* @param {number=} pid
*/
/**
* @overload
*/
/**
* @param {number} streamType
* @param {number} pid
*/
constructor(streamType = 0, pid = 0) {
this.mStreamType = streamType, this.mPid = pid;
}
empty() {
return this.mData.length <= 0;
}
reset() {
this.mPts = 0n;
this.mDts = 0n;
this.mPcr = 0n;
this.mRandomAccess = 0;
this.mExpectedPesPacketLength = 0;
this.mExpectedPlayloadLength = 0;
this.mCompleted = false;
this.mBroken = false;
this.mData = [];
}
mDataSize() {
return this.mData.reduce((acc, sb) => acc + sb.size(), 0);
}
mDataPos() {
return 0;
}
};
var PatHeader = class {
/** @type {uint8} */
mTableId = 0;
/** @type {uint8} */
mSectionSyntaxIndicator = 0;
/** @type {uint8} */
mB0 = 0;
/** @type {uint8} */
mReserved0 = 0;
/** @type {uint16} */
mSectionLength = 0;
/** @type {uint16} */
mTransportStreamId = 0;
/** @type {uint8} */
mReserved1 = 0;
/** @type {uint8} */
mVersionNumber = 0;
/** @type {uint8} */
mCurrentNextIndicator = 0;
/** @type {uint8} */
mSectionNumber = 0;
/** @type {uint8} */
mLastSectionNumber = 0;
encode() {
const sb = new SimpleBuffer(8);
sb.write1Byte(this.mTableId);
let lB1b2 = this.mSectionLength & 4095;
lB1b2 |= (this.mReserved0 << 12 & 12288) >>> 0;
lB1b2 |= (this.mB0 << 14 & 16384) >>> 0;
lB1b2 |= (this.mSectionSyntaxIndicator << 15 & 32768) >>> 0;
sb.write2Bytes(lB1b2);
sb.write2Bytes(this.mTransportStreamId);
let lB5 = this.mCurrentNextIndicator & 1;
lB5 |= this.mVersionNumber << 1 & 62;
lB5 |= this.mReserved1 << 6 & 192;
sb.write1Byte(lB5);
sb.write1Byte(this.mSectionNumber);
sb.write1Byte(this.mLastSectionNumber);
return sb;
}
};
var PesHeader = class {
/** @type {uint32} */
mPacketStartCode = 1;
/** @type {uint8} */
mStreamId = 0;
/** @type {uint16} */
mPesPacketLength = 0;
/** @type {uint8} */
mOriginalOrCopy = 0;
/** @type {uint8} */
mCopyright = 0;
/** @type {uint8} */
mDataAlignmentIndicator = 0;
/** @type {uint8} */
mPesPriority = 0;
/** @type {uint8} */
mPesScramblingControl = 0;
/** @type {uint8} */
mMarkerBits = 0;
/** @type {uint8} */
mPesExtFlag = 0;
/** @type {uint8} */
mPesCrcFlag = 0;
/** @type {uint8} */
mAddCopyInfoFlag = 0;
/** @type {uint8} */
mDsmTrickModeFlag = 0;
/** @type {uint8} */
mEsRateFlag = 0;
/** @type {uint8} */
mEscrFlag = 0;
/** @type {uint8} */
mPtsDtsFlags = 0;
/** @type {uint8} */
mHeaderDataLength = 0;
encode() {
const sb = new SimpleBuffer(21);
const lB0b1b2b3 = this.mPacketStartCode << 8 & 4294967040;
sb.write4Bytes(lB0b1b2b3);
sb.write2Bytes(this.mPesPacketLength);
let lB6 = this.mOriginalOrCopy & 1;
lB6 |= (this.mCopyright << 1 & 2) >>> 0;
lB6 |= (this.mDataAlignmentIndicator << 2 & 4) >>> 0;
lB6 |= (this.mPesPriority << 3 & 8) >>> 0;
lB6 |= (this.mPesScramblingControl << 4 & 48) >>> 0;
lB6 |= (this.mMarkerBits << 6 & 192) >>> 0;
sb.write1Byte(lB6);
let lB7 = this.mPesExtFlag & 1;
lB7 |= (this.mPesCrcFlag << 1 & 2) >>> 0;
lB7 |= (this.mAddCopyInfoFlag << 2 & 4) >>> 0;
lB7 |= (this.mDsmTrickModeFlag << 3 & 8) >>> 0;
lB7 |= (this.mEsRateFlag << 4 & 16) >>> 0;
lB7 |= (this.mEscrFlag << 5 & 32) >>> 0;
lB7 |= (this.mPtsDtsFlags << 6 & 192) >>> 0;
sb.write1Byte(lB7);
sb.write1Byte(this.mHeaderDataLength);
return sb;
}
};
var PmtElementInfo = class {
/** @type {uint8} */
mStreamType = 0;
/** @type {uint8} */
mReserved0 = 7;
/** @type {uint16} */
mElementaryPid = 0;
/** @type {uint8} */
mReserved1 = 15;
/** @type {uint16} */
mEsInfoLength = 0;
/** @type {string} */
mEsInfo;
/**
*
* @param {uint8} lSt
* @param {uint16} lPid
*/
constructor(lSt, lPid) {
this.mStreamType = lSt;
this.mElementaryPid = lPid;
}
encode() {
let size = 5;
if (this.mEsInfoLength > 0) {
size += this.mEsInfoLength;
}
const sb = new SimpleBuffer(size);
sb.write1Byte(this.mStreamType);
let lB1b2 = this.mElementaryPid & 8191;
lB1b2 |= (this.mReserved0 << 13 & 57344) >>> 0;
sb.write2Bytes(lB1b2);
let lB3b4 = this.mEsInfoLength & 4095;
lB3b4 |= (this.mReserved1 << 12 & 61440) >>> 0;
sb.write2Bytes(lB3b4);
if (this.mEsInfoLength > 0) {
sb.writeString(this.mEsInfo);
}
return sb;
}
size() {
return 7 + this.mEsInfo.length;
}
};
var PmtHeader = class {
/** @type {PmtElementInfo[]} */
mInfos;
/** @type {uint8} */
mTableId = 2;
/** @type {uint8} */
mSectionSyntaxIndicator = 0;
/** @type {uint8} */
mB0 = 0;
/** @type {uint8} */
mReserved0 = 0;
/** @type {uint16} */
mSectionLength = 0;
/** @type {uint16} */
mProgramNumber = 0;
/** @type {uint8} */
mReserved1 = 0;
/** @type {uint8} */
mVersionNumber = 0;
/** @type {uint8} */
mCurrentNextIndicator = 0;
/** @type {uint8} */
mSectionNumber = 0;
/** @type {uint8} */
mLastSectionNumber = 0;
/** @type {uint8} */
mReserved2 = 0;
/** @type {uint16} */
mPcrPid = 0;
/** @type {uint8} */
mReserved3 = 0;
/** @type {uint16} */
mProgramInfoLength = 0;
constructor() {
}
encode() {
const lInfosSize = this.mInfos.reduce((acc, inf) => acc + inf.size(), 0);
const sb = new SimpleBuffer(12 + lInfosSize);
let lB1b2 = this.mSectionLength & 65535;
lB1b2 |= (this.mReserved0 << 12 & 12288) >>> 0;
lB1b2 |= (this.mB0 << 14 & 16384) >>> 0;
lB1b2 |= (this.mSectionSyntaxIndicator << 15 & 32768) >>> 0;
sb.write2Bytes(lB1b2);
sb.write2Bytes(this.mProgramNumber);
let lB5 = this.mCurrentNextIndicator & 1;
lB5 |= (this.mVersionNumber << 1 & 62) >>> 0;
lB5 |= (this.mReserved1 << 6 & 192) >>> 0;
sb.write1Byte(lB5);
sb.write1Byte(this.mSectionNumber);
sb.write1Byte(this.mLastSectionNumber);
let lB8b9 = this.mPcrPid & 8191;
lB8b9 |= (this.mReserved2 << 13 & 57344) >>> 0;
sb.write2Bytes(lB8b9);
let lB10b11 = this.mProgramInfoLength & 4095;
lB10b11 |= (this.mReserved3 << 12 & 61440) >>> 0;
sb.write2Bytes(lB10b11);
for (let lInfo of this.mInfos) {
sb.writeBuffer(lInfo.encode());
}
return sb;
}
size() {
return 19 + this.mInfos.reduce((acc, inf) => acc + inf.size(), 0);
}
};
// src/crc32.js
var crcTable = [
0,
79764919,
159529838,
222504665,
319059676,
398814059,
445009330,
507990021,
638119352,
583659535,
797628118,
726387553,
890018660,
835552979,
1015980042,
944750013,
1276238704,
1221641927,
1167319070,
1095957929,
1595256236,
1540665371,
1452775106,
1381403509,
1780037320,
1859660671,
1671105958,
1733955601,
2031960084,
2111593891,
1889500026,
1952343757,
2552477408,
2632100695,
2443283854,
2506133561,
2334638140,
2414271883,
2191915858,
2254759653,
3190512472,
3135915759,
3081330742,
3009969537,
2905550212,
2850959411,
2762807018,
2691435357,
3560074640,
3505614887,
3719321342,
3648080713,
3342211916,
3287746299,
3467911202,
3396681109,
4063920168,
4143685023,
4223187782,
4286162673,
3779000052,
3858754371,
3904687514,
3967668269,
881225847,
809987520,
1023691545,
969234094,
662832811,
591600412,
771767749,
717299826,
311336399,
374308984,
453813921,
533576470,
25881363,
88864420,
134795389,
214552010,
2023205639,
2086057648,
1897238633,
1976864222,
1804852699,
1867694188,
1645340341,
1724971778,
1587496639,
1516133128,
1461550545,
1406951526,
1302016099,
1230646740,
1142491917,
1087903418,
2896545431,
2825181984,
2770861561,
2716262478,
3215044683,
3143675388,
3055782693,
3001194130,
2326604591,
2389456536,
2200899649,
2280525302,
2578013683,
2640855108,
2418763421,
2498394922,
3769900519,
3832873040,
3912640137,
3992402750,
4088425275,
4151408268,
4197601365,
4277358050,
3334271071,
3263032808,
3476998961,
3422541446,
3585640067,
3514407732,
3694837229,
3640369242,
1762451694,
1842216281,
1619975040,
1682949687,
2047383090,
2127137669,
1938468188,
2001449195,
1325665622,
1271206113,
1183200824,
1111960463,
1543535498,
1489069629,
1434599652,
1363369299,
622672798,
568075817,
748617968,
677256519,
907627842,
853037301,
1067152940,
995781531,
51762726,
131386257,
177728840,
240578815,
269590778,
349224269,
429104020,
491947555,
4046411278,
4126034873,
4172115296,
4234965207,
3794477266,
3874110821,
3953728444,
4016571915,
3609705398,
3555108353,
3735388376,
3664026991,
3290680682,
3236090077,
3449943556,
3378572211,
3174993278,
3120533705,
3032266256,
2961025959,
2923101090,
2868635157,
2813903052,
2742672763,
2604032198,
2683796849,
2461293480,
2524268063,
2284983834,
2364738477,
2175806836,
2238787779,
1569362073,
1498123566,
1409854455,
1355396672,
1317987909,
1246755826,
1192025387,
1137557660,
2072149281,
2135122070,
1912620623,
1992383480,
1753615357,
1816598090,
1627664531,
1707420964,
295390185,
358241886,
404320391,
483945776,
43990325,
106832002,
186451547,
266083308,
932423249,
861060070,
1041341759,
986742920,
613929101,
542559546,
756411363,
701822548,
3316196985,
3244833742,
3425377559,
3370778784,
3601682597,
3530312978,
3744426955,
3689838204,
3819031489,
3881883254,
3928223919,
4007849240,
4037393693,
4100235434,
4180117107,
4259748804,
2310601993,
2373574846,
2151335527,
2231098320,
2596047829,
2659030626,
2470359227,
2550115596,
2947551409,
2876312838,
2788305887,
2733848168,
3165939309,
3094707162,
3040238851,
2985771188
];
function crc32(data, len) {
let crc = 4294967295;
for (let i = 0; i < len; ++i) {
crc = crc << 8 ^ crcTable[(crc >> 24 ^ data[i]) & 255];
}
return new Uint8Array([
crc << 24 & 255,
crc << 16 & 255,
crc << 8 & 255,
crc & 255
]);
}
// src/muxer.js
var MuxType = {
unknown: 0,
segmentType: 1,
//Generate a PAT + PMT when lRandomAccess is set to true in the encode() method
h222Type: 2,
//Not implemented correct
dvbType: 3
};
var MpegTsAdaptationFieldType = {
mPayloadOnly: 1,
mAdaptationOnly: 2,
mPayloadAdaptationBoth: 3
};
var MPEGTS_NULL_PACKET_PID = 8191;
var MPEGTS_PAT_INTERVAL = 20;
var MPEGTS_PAT_PID = 0;
var MpegTsMuxer = class extends Transform {
/** @type {uint16} */
#mPmtPid;
/** @type {uint16} */
#mPcrPid;
/** @type {uint32} */
#mCurrentIndex;
/** @type {Record<number, number>} */
#mPidCcMap;
/** @type {Record<uint8, number>} */
#mStreamPidMap;
/** @type {MuxType} */
#mMuxType;
/**
*
* @param {Record<uint8, number>} lStreamPidMap
* @param {uint16} lPmtPid
* @param {uint16} lPcrPid
* @param {MuxType} lMuxType
*/
constructor(lStreamPidMap, lPmtPid, lPcrPid, lMuxType) {
super({
objectMode: true,
/**
* @param {MediaPacket} rPacket
*/
transform: (rPacket, enc, callback) => {
try {
const rPacketSb = new SimpleBuffer(rPacket.data.length);
rPacketSb.setData(0, rPacket.data);
const esFrame = new EsFrame();
esFrame.mData.push(rPacketSb);
esFrame.mPts = rPacket.pts;
esFrame.mDts = rPacket.pts;
esFrame.mPcr = 0n;
esFrame.mStreamType = rPacket.type === "audio" ? 15 : 27;
esFrame.mStreamId = 192;
esFrame.mExpectedPesPacketLength = 0;
esFrame.mCompleted = true;
this.encode(esFrame, 0, true);
callback();
} catch (err) {
callback(err);
}
}
});
this.#mPidCcMap = {};
this.#mStreamPidMap = lStreamPidMap;
this.#mPmtPid = lPmtPid;
this.#mPcrPid = lPcrPid;
this.#mMuxType = lMuxType;
}
/** overload: `createPat(lPmtPid: number, lCc: number): SimpleBuffer<188>`
* @overload
* @param {number} lPmtPid
* @param {number} lCc
* @returns {SimpleBuffer<188>}
* A new `SimpleBuffer` representing a TS Packet.
*/
/** overload: `createPat(lPmtPid: number, lCc: number, rSb: SimpleBuffer<number>): SimpleBuffer<number>`
* @overload
* @param {number} lPmtPid
* @param {number} lCc
* @param {SimpleBuffer<number>} rSb
* Pass a `SimpleBuffer` by reference and append the result of this function onto that reference.
* @returns {SimpleBuffer<number>}
* Same `SimpleBuffer` passed into the argument, `rSb`.
*/
/**
* @param {number} lPmtPid
* @param {number} lCc
* @param {SimpleBuffer<number>=} rSb
* @returns {SimpleBuffer<188>|SimpleBuffer<number>}
*/
createPat(lPmtPid, lCc, rSb = void 0) {
if (rSb) {
const lPatSbForRef = this.createPat(lPmtPid, lCc);
const data2 = lPatSbForRef.data();
if (!data2) {
throw new Error(`.data() for "${nameof(() => lPatSbForRef)}" has returned null!`);
}
rSb.append(data2);
return rSb;
}
const lPatSb = new SimpleBuffer(188);
const lTsHeader = new TsHeader();
lTsHeader.mSyncByte = 71;
lTsHeader.mTransportErrorIndicator = 0;
lTsHeader.mPayloadUnitStartIndicator = 1;
lTsHeader.mTransportPriority = 0;
lTsHeader.mPid = MPEGTS_PAT_PID;
lTsHeader.mTransportScramblingControl = 0;
lTsHeader.mAdaptationFieldControl = MpegTsAdaptationFieldType.mPayloadOnly;
lTsHeader.mContinuityCounter = lCc;
const lAdaptField = new AdaptationFieldHeader();
const lPatHeader = new PatHeader();
lPatHeader.mTableId = 0;
lPatHeader.mSectionSyntaxIndicator = 1;
lPatHeader.mB0 = 0;
lPatHeader.mReserved0 = 3;
lPatHeader.mTransportStreamId = 0;
lPatHeader.mReserved1 = 3;
lPatHeader.mVersionNumber = 0;
lPatHeader.mCurrentNextIndicator = 1;
lPatHeader.mSectionNumber = 0;
lPatHeader.mLastSectionNumber = 0;
let lProgramNumber = 1;
let lProgramMapPid = (57344 | lPmtPid & 8191) >>> 0;
let lSectionLength = 4 + 4 + 5;
lPatHeader.mSectionLength = (lSectionLength & 16383) >>> 0;
lPatSb.write4Bytes(lTsHeader.encode());
lPatSb.write2Bytes(lAdaptField.encode());
lPatSb.write8Bytes(lPatHeader.encode());
lPatSb.write2Bytes(lProgramNumber);
lPatSb.write2Bytes(lProgramMapPid);
const data = lPatSb.data();
if (!data) {
throw new Error(`.data() for "${nameof(() => lPatSb)}" has returned null!`);
}
const lCrc32 = crc32(data.subarray(5), lPatSb.size() - 5);
lPatSb.write1Byte(lCrc32[0]);
lPatSb.write1Byte(lCrc32[1]);
lPatSb.write1Byte(lCrc32[2]);
lPatSb.write1Byte(lCrc32[3]);
const lStuff = filling(188 - lPatSb.size());
lPatSb.append(lStuff);
return lPatSb;
}
/** overload: `createPnt(lStreamPidMap: Record<string,number>, lPmtPid: number, lCc: number): SimpleBuffer<188>`
* @overload
* @param {Record<number,number>} lStreamPidMap
* @param {number} lPmtPid
* @param {number} lCc
* @returns {SimpleBuffer<188>}
* A new `SimpleBuffer` representing a TS Packet.
*/
/** overload: `createPnt(lStreamPidMap: Record<string,number>, lPmtPid: number, lCc: number, rSb: SimpleBuffer<number>): SimpleBuffer<number>`
* @overload
* @param {Record<number,number>} lStreamPidMap
* @param {number} lPmtPid
* @param {number} lCc
* @param {SimpleBuffer<number>} rSb
* Pass a `SimpleBuffer` by reference and append the result of this function onto that reference.
* @returns {SimpleBuffer<number>}
* Same `SimpleBuffer` passed into the argument, `rSb`.
*/
/**
*
* @param {Record<number,number>} lStreamPidMap
* @param {uint16} lPmtPid
* @param {uint8} lCc
* @param {SimpleBuffer<number>=} rSb
* @returns {SimpleBuffer<188>|SimpleBuffer<number>}
*/
createPmt(lStreamPidMap, lPmtPid, lCc, rSb = void 0) {
if (rSb) {
const lPmtSbForRef = this.createPmt(lStreamPidMap, lPmtPid, lCc);
const data2 = lPmtSbForRef.data();
if (!data2) {
throw new Error(`.data() for "${nameof(() => lPmtSbForRef)}" has returned null!`);
}
rSb.append(data2);
return rSb;
}
const lPmtSb = new SimpleBuffer(188);
const lTsHeader = new TsHeader();
lTsHeader.mSyncByte = 71;
lTsHeader.mTransportErrorIndicator = 0;
lTsHeader.mPayloadUnitStartIndicator = 1;
lTsHeader.mTransportPriority = 0;
lTsHeader.mPid = lPmtPid;
lTsHeader.mTransportScramblingControl = 0;
lTsHeader.mAdaptationFieldControl = MpegTsAdaptationFieldType.mPayloadOnly;
lTsHeader.mContinuityCounter = lCc;
const lPmtHeader = new PmtHeader();
lPmtHeader.mTableId = 2;
lPmtHeader.mSectionSyntaxIndicator = 1;
lPmtHeader.mB0 = 0;
lPmtHeader.mReserved0 = 3;
lPmtHeader.mSectionLength = 0;
lPmtHeader.mProgramNumber = 1;
lPmtHeader.mReserved1 = 3;
lPmtHeader.mVersionNumber = 0;
lPmtHeader.mCurrentNextIndicator = 1;
lPmtHeader.mSectionNumber = 0;
lPmtHeader.mLastSectionNumber = 0;
lPmtHeader.mReserved2 = 7;
lPmtHeader.mReserved3 = 15;
lPmtHeader.mProgramInfoLength = 0;
lPmtHeader.mPcrPid = this.#mPcrPid;
for (const key in lStreamPidMap) {
if (typeof key !== "number") {
throw new Error(`Key, ${key}, in argument, "${nameof(() => lStreamPidMap)}" is not a number!`);
}
lPmtHeader.mInfos.push(new PmtElementInfo(key, lStreamPidMap[key]));
}
const lAdaptField = new AdaptationFieldHeader();
lPmtHeader.mSectionLength = lPmtHeader.size() - 3 + 4;
lPmtSb.write4Bytes(lTsHeader.encode());
lPmtSb.write2Bytes(lAdaptField.encode());
lPmtSb.writeBuffer(lPmtHeader.encode());
const data = lPmtSb.data();
if (!data) {
throw new Error(`.data() for "${nameof(() => lPmtSb)}" has returned null!`);
}
const lCrc32 = crc32(data.subarray(5), lPmtSb.size() - 5);
lPmtSb.write1Byte(lCrc32[0]);
lPmtSb.write1Byte(lCrc32[1]);
lPmtSb.write1Byte(lCrc32[2]);
lPmtSb.write1Byte(lCrc32[3]);
const lStuff = filling(188 - lPmtSb.size());
lPmtSb.append(lStuff);
return lPmtSb;
}
/**
*
* @param {EsFrame} rFrame
* @param {SimpleBuffer=} rSb
*/
createPes(rFrame, rSb = void 0) {
if (rSb) {
const rPesDataForRef = this.createPes(rFrame);
const data = rPesDataForRef.data();
if (!data) {
throw new Error(`.data() for "${nameof(() => rPesDataForRef)}" has returned null!`);
}
rSb.append(data);
return rSb;
}
rSb = new SimpleBuffer(188 * rFrame.mDataSize());
let lFirst = true;
for (let pos = 0; pos < rFrame.mData.length; ++pos) {
const lPacket = new SimpleBuffer();
const lTsHeader = new TsHeader();
lTsHeader.mPid = rFrame.mPid;
lTsHeader.mAdaptationFieldControl = MpegTsAdaptationFieldType.mPayloadOnly;
lTsHeader.mContinuityCounter = this.#getCc(rFrame.mStreamType);
if (lFirst) {
lTsHeader.mAdaptationFieldControl = 1;
if (rFrame.mPid == this.#mPcrPid) {
lTsHeader.mAdaptationFieldControl |= 2;
const lAdaptFieldHeader = new AdaptationFieldHeader();
lAdaptFieldHeader.mAdaptationFieldLength = 7;
lAdaptFieldHeader.mRandomAccessIndicator = rFrame.mRandomAccess;
lAdaptFieldHeader.mPcrFlag = 1;
lPacket.writeBuffer(lTsHeader.encode());
lPacket.writeBuffer(lAdaptFieldHeader.encode());
writePcr(lPacket, rFrame.mPcr);
} else if (rFrame.mRandomAccess) {
lTsHeader.mAdaptationFieldControl |= 2;
const lAdaptFieldHeader = new AdaptationFieldHeader();
lAdaptFieldHeader.mAdaptationFieldLength = 1;
lAdaptFieldHeader.mRandomAccessIndicator = rFrame.mRandomAccess;
lPacket.writeBuffer(lTsHeader.encode());
lPacket.writeBuffer(lAdaptFieldHeader.encode());
} else {
lPacket.writeBuffer(lTsHeader.encode());
}
const lPesHeader = new PesHeader();
lPesHeader.mPacketStartCode = 1;
lPesHeader.mStreamId = rFrame.mStreamId;
lPesHeader.mMarkerBits = 2;
lPesHeader.mOriginalOrCopy = 1;
if (rFrame.mPts != rFrame.mDts) {
lPesHeader.mPtsDtsFlags = 3;
lPesHeader.mHeaderDataLength = 10;
} else {
lPesHeader.mPtsDtsFlags = 2;
lPesHeader.mHeaderDataLength = 5;
}
const lPesSize = lPesHeader.mHeaderDataLength + rFrame.mDataSize() + 3;
lPesHeader.mPesPacketLength = lPesSize > 65535 ? 0 : lPesSize;
lPacket.writeBuffer(lPesHeader.encode());
if (lPesHeader.mPtsDtsFlags == 3) {
writePts(lPacket, 3, rFrame.mPts);
writePts(lPacket, 1, rFrame.mDts);
} else {
writePts(lPacket, 2, rFrame.mPts);
}
} else {
lPacket.writeBuffer(lTsHeader.encode());
}
const lPos = lPacket.size();
const lBodySize = 188 - lPos;
const lFiller = filling(lBodySize, 0);
lPacket.append(lFiller);
lPacket.skip(lPos);
const lInSize = rFrame.mDataSize() - pos;
if (lBodySize <= lInSize) {
const lData = rFrame.mData[pos].data();
if (!lData) {
throw new Error(`${nameof(() => rFrame.mData[pos].data())} returned null data.`);
}
lPacket.setData(lPos, lData);
} else {
let lStuffSize = lBodySize - lInSize;
if (lTsHeader.mAdaptationFieldControl === MpegTsAdaptationFieldType.mAdaptationOnly || lTsHeader.mAdaptationFieldControl === MpegTsAdaptationFieldType.mPayloadAdaptationBoth) {
const data3 = lPacket.data();
if (!data3) {
throw new Error(`${nameof(() => lPacket.data())} returned null data.`);
}
const lpBase = 5 + data3[4];
if (lFirst) {
const pesHeaderSize = lPos - lpBase;
const pesHeader = data3.slice(lpBase, lpBase + pesHeaderSize);
lPacket.clear();
lPacket.append(data3.slice(0, lpBase));
lPacket.append(filling(lStuffSize));
lPacket.append(pesHeader);
} else {
const _pos = lpBase + lStuffSize;
const _data = data3.slice(lpBase);
const _size = lPacket.pos() - lpBase;
console.log({ _pos, _data, _size });
lPacket.setData(_pos, _data, _size);
}
lPacket.setData(lpBase, filling(lStuffSize));
lPacket.skip(lStuffSize);
lPacket.set(4, lPacket.get(4) + lStuffSize);
} else {
lPacket.set(3, lPacket.get(3) | 32);
if (lFirst) {
const data3 = lPacket.data();
if (!data3) {
throw new Error(`${nameof(() => lPacket.data())} returned null data.`);
}
const lpBase = lPacket.pos() + 4;
const pesHeaderSize = lPos - 4;
const pesHeader = data3.slice(lpBase, lpBase + pesHeaderSize);
lPacket.clear();
lPacket.append(data3.slice(0, lpBase));
lPacket.append(filling(lStuffSize));
lPacket.append(pesHeader);
lPacket.set(4, lStuffSize - 1);
if (lStuffSize >= 2) {
lPacket.set(5, 0);
lPacket.setData(6, filling(lStuffSize - 2));
}
lPacket.skip(lStuffSize);
} else {
const data3 = lPacket.data();
if (!data3) {
throw new Error(`${nameof(() => lPacket.data())} returned null data.`);
}
const lDestPosition = 188 - 4 - lStuffSize;
const lSrcPosition = 4;
const lLength = lPacket.pos() - 4;
lPacket.setData(lDestPosition, data3.slice(lSrcPosition, lSrcPosition + lLength), lLength);
lPacket.skip(lStuffSize);
lPacket.set(4, lStuffSize - 1);
if (lStuffSize >= 2) {
lPacket.set(5, 0);
lPacket.setData(6, filling(lStuffSize - 2));
}
}
}
const data2 = rFrame.mData[pos].data();
if (!data2) {
throw new Error(`${nameof(() => rFrame.mData[pos].data())} returned null data.`);
}
lPacket.setData(lPacket.pos(), data2, lInSize);
rFrame.mData[pos].skip(lInSize);
}
const data = lPacket.data();
if (!data) {
throw new Error(`${nameof(() => lPacket.data())} returned null data.`);
}
rSb.append(data);
lFirst = false;
}
return rSb;
}
#mutex = Promise.resolve();
/**
* @param {uint64} lPcr
* @param {uint8} lTag
*/
createPcr(lPcr, lTag) {
this.#mutex = this.#mutex.then(() => {
const lTsHeader = new TsHeader();
lTsHeader.mSyncByte = 71;
lTsHeader.mTransportErrorIndicator = 0;
lTsHeader.mPayloadUnitStartIndicator = 0;
lTsHeader.mTransportPriority = 0;
lTsHeader.mPid = this.#mPcrPid;
lTsHeader.mTransportScramblingControl = 0;
lTsHeader.mAdaptationFieldControl = MpegTsAdaptationFieldType.mAdaptionOnly;
lTsHeader.mContinuityCounter = 0;
const lAdaptField = new AdaptationFieldHeader();
lAdaptField.mAdaptationFieldLength = 188 - 4 - 1;
lAdaptField.mDiscontinuityIndicator = 0;
lAdaptField.mRandomAccessIndicator = 0;
lAdaptField.mElementaryStreamPriorityIndicator = 0;
lAdaptField.mPcrFlag = 1;
lAdaptField.mOpcrFlag = 0;
lAdaptField.mSplicingPointFlag = 0;
lAdaptField.mTransportPrivateDataFlag = 0;
lAdaptField.mAdaptationFieldExtensionFlag = 0;
const lSb = new SimpleBuffer(188);
lSb.writeBuffer(lTsHeader.encode());
lSb.writeBuffer(lAdaptField.encode());
writePcr(lSb, lPcr);
const lStuff = filling(188 - lSb.size());
lSb.append(lStuff);
this.push(lSb.data());
});
}
/**
*
* @param {uint8} lTag
*/
createNull(lTag) {
this.#mutex = this.#mutex.then(() => {
const lTsHeader = new TsHeader();
lTsHeader.mSyncByte = 71;
lTsHeader.mTransportErrorIndicator = 0;
lTsHeader.mPayloadUnitStartIndicator = 0;
lTsHeader.mTransportPriority = 0;
lTsHeader.mPid = MPEGTS_NULL_PACKET_PID;
lTsHeader.mTransportScramblingControl = 0;
lTsHeader.mAdaptationFieldControl = MpegTsAdaptationFieldType.mPayloadOnly;
lTsHeader.mContinuityCounter = 0;
const lSb = new SimpleBuffer(188);
lSb.writeBuffer(lTsHeader.encode());
this.push(lSb.data());
});
}
/**
*
* @param {EsFrame} rFrame
* @param {uint8} lTag
* @param {boolean} lRandomAccess
*/
encode(rFrame, lTag, lRandomAccess) {
this.#mutex = this.#mutex.then(() => {
const lSb = new SimpleBuffer();
if (this.#mMuxType === MuxType.segmentType && lRandomAccess) {
const lPatPmtCc = this.#getCc(0);
const lPatSb = this.createPat(this.#mPmtPid, lPatPmtCc);
const lPmtSb = this.createPmt(this.#mStreamPidMap, this.#mPmtPid, lPatPmtCc);
lSb.writeBuffer(lPatSb);
lSb.writeBuffer(lPmtSb);
} else if (this.#mMuxType === MuxType.h222Type && this.#shouldCreatePat()) {
const lPatPmtCc = this.#getCc(0);
const lPatSb = this.createPat(this.#mPmtPid, lPatPmtCc);
const lPmtSb = this.createPmt(this.#mStreamPidMap, this.#mPmtPid, lPatPmtCc);
lSb.writeBuffer(lPatSb);
lSb.writeBuffer(lPmtSb);
}
const lPesSb = this.createPes(rFrame);
lSb.writeBuffer(lPesSb);
this.push(lSb.data());
});
}
/**
* @param {number} lWithPid
* @returns
*/
#getCc(lWithPid) {
if (lWithPid in this.#mPidCcMap) {
this.#mPidCcMap[lWithPid] = this.#mPidCcMap[lWithPid] + 1 & 15;
return this.#mPidCcMap[lWithPid];
}
this.#mPidCcMap[lWithPid] = 0;
return 0;
}
#shouldCreatePat() {
let lRet = false;
if (this.#mCurrentIndex % MPEGTS_PAT_INTERVAL === 0) {
if (this.#mCurrentIndex > 0) {
this.#mCurrentIndex = 0;
}
lRet = true;
}
this.#mCurrentIndex++;
return lRet;
}
};
function nameof(f) {
return f.toString().replace(/[ |\(\)=>]/g, "");
}
function filling(numStuffingBytes, value = 255) {
return new Uint8Array(numStuffingBytes).fill(value);
}
function writePcr(rSb, lPcr) {
rSb.write1Byte(Number(lPcr >> 25n));
rSb.write1Byte(Number(lPcr >> 17n));
rSb.write1Byte(Number(lPcr >> 9n));
rSb.write1Byte(Number(lPcr >> 1n));
rSb.write1Byte(Number(lPcr >> 7n | 0x7en));
rSb.write1Byte(0);
}
function writePts(rSb, lFb, lPts) {
let lVal;
lVal = (lFb << 4 | (Number(lPts >> 30n) & 7) << 1 | 1) >>> 0;
rSb.write1Byte(lVal);
lVal = ((Number(lPts >> 15n) & 32767) << 1 | 1) >>> 0;
rSb.write2Bytes(lVal);
lVal = ((Number(lPts) & 32767) << 1 | 1) >>> 0;
rSb.write2Bytes(lVal);
}
var TfAudioPacket = class extends Transform {
constructor() {
super({
objectMode: true,
transform(chunk, enc, callback) {
this.push({
type: "audio",
pts: 0n,
data: chunk
});
callback();
}
});
}
};
var TfVideoPacket = class extends Transform {
constructor() {
super({
objectMode: true,
transform(chunk, enc, callback) {
this.push({
type: "video",
pts: 0n,
data: chunk
});
callback();
}
});
}
};
export { MpegTsMuxer, MuxType, TfAudioPacket, TfVideoPacket };
//# sourceMappingURL=out.js.map
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tdXhlci5qcyIsIi4uL3NyYy9zaW1wbGUtYnVmZmVyLmpzIiwiLi4vc3JjL3RzLmpzIiwiLi4vc3JjL2NyYzMyLmpzIiwiLi4vc3JjL3RyYW5zZm9ybXMuanMiXSwibmFtZXMiOlsiZGF0YSIsIlRyYW5zZm9ybSJdLCJtYXBwaW5ncyI6IjtBQUVBLFNBQVMsaUJBQWlCOzs7QUNRbkIsSUFBTSxlQUFOLE1BQU0sY0FBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSXRCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsWUFBWTtBQUFBO0FBQUEsSUFBeUI7QUFBQSxLQUFZO0FBQzdDLFNBQUssV0FBVztBQUNoQixTQUFLLFFBQVEsQ0FBQztBQUNkLFNBQUssT0FBTztBQUFBLEVBQ2hCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWtCQSxXQUFXLE9BQU87QUFDZCxTQUFLLE9BQU8sQ0FBQztBQUNiLFFBQUcsaUJBQWlCLGVBQWM7QUFDOUIsYUFBTyxLQUFLLFlBQVksT0FBTyxJQUFJO0FBQUEsSUFDdkM7QUFDQSxTQUFLLE1BQU0sS0FBSyxRQUFRLEdBQUk7QUFBQSxFQUNoQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFrQkEsWUFBWSxRQUFRO0FBQ2hCLFNBQUssT0FBTyxDQUFDO0FBQ2IsUUFBRyxrQkFBa0IsZUFBYztBQUMvQixhQUFPLEtBQUssWUFBWSxRQUFRLElBQUk7QUFBQSxJQUN4QztBQUNBLFNBQUssTUFBTSxLQUFNLFdBQVcsSUFBSyxHQUFJO0FBQ3JDLFNBQUssTUFBTSxLQUFLLFNBQVMsR0FBSTtBQUFBLEVBQ2pD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