UNPKG

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
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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