@amazon/vinyl-transmux 1.1.0 → 1.2.0
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.
|
@@ -1,8 +1,18 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @amazon/vinyl-transmux
|
|
2
|
+
|
|
3
|
+
[](https://amazonmusic.github.io/vinyl)
|
|
4
|
+
[](https://www.npmjs.com/package/@amazon/vinyl-transmux)
|
|
5
|
+
[](https://bundlejs.com/?q=@amazon/vinyl-transmux)
|
|
2
6
|
|
|
3
7
|
Converts MPEG-TS and raw ADTS segments into fragmented MP4 (fMP4) for playback
|
|
4
8
|
via Media Source Extensions. Zero external dependencies.
|
|
5
9
|
|
|
10
|
+
## Install
|
|
11
|
+
|
|
12
|
+
```shell
|
|
13
|
+
npm install @amazon/vinyl-transmux
|
|
14
|
+
```
|
|
15
|
+
|
|
6
16
|
## Architecture
|
|
7
17
|
|
|
8
18
|
The package is split into three layers:
|
|
@@ -59,10 +69,10 @@ calls.
|
|
|
59
69
|
|
|
60
70
|
| Input | Output | Status |
|
|
61
71
|
| ------------------ | ------------------------------- | ------ |
|
|
62
|
-
| ADTS AAC | fMP4 audio (`mp4a`) |
|
|
63
|
-
| MPEG-TS with AAC | fMP4 audio (`mp4a`) |
|
|
64
|
-
| MPEG-TS with H.264 | fMP4 video (`avc1`) |
|
|
65
|
-
| MPEG-TS muxed | fMP4 video + audio (multi-trak) |
|
|
72
|
+
| ADTS AAC | fMP4 audio (`mp4a`) | yes |
|
|
73
|
+
| MPEG-TS with AAC | fMP4 audio (`mp4a`) | yes |
|
|
74
|
+
| MPEG-TS with H.264 | fMP4 video (`avc1`) | yes |
|
|
75
|
+
| MPEG-TS muxed | fMP4 video + audio (multi-trak) | yes |
|
|
66
76
|
|
|
67
77
|
## MP4 Box Writer
|
|
68
78
|
|
|
@@ -82,13 +92,11 @@ import {
|
|
|
82
92
|
patchDataOffset,
|
|
83
93
|
} from '@amazon/vinyl-transmux'
|
|
84
94
|
|
|
85
|
-
// Custom ftyp
|
|
86
95
|
const ftypBox = ftyp({
|
|
87
96
|
majorBrand: 'dash',
|
|
88
97
|
compatibleBrands: ['iso6', 'mp41'],
|
|
89
98
|
})
|
|
90
99
|
|
|
91
|
-
// Build a moov with custom tracks
|
|
92
100
|
const moovBox = moov(
|
|
93
101
|
audioTrak({
|
|
94
102
|
trackId: 1,
|
|
@@ -104,7 +112,6 @@ const moovBox = moov(
|
|
|
104
112
|
})
|
|
105
113
|
)
|
|
106
114
|
|
|
107
|
-
// Build a media fragment
|
|
108
115
|
const moofBox = moof({
|
|
109
116
|
sequenceNumber: 1,
|
|
110
117
|
trackId: 1,
|
|
@@ -129,3 +136,7 @@ The transmuxer includes a minimal H.264 SPS parser that extracts resolution and
|
|
|
129
136
|
profile information from Sequence Parameter Set NAL units. It supports Baseline,
|
|
130
137
|
Main, and High profiles including the chroma format and scaling matrix
|
|
131
138
|
extensions.
|
|
139
|
+
|
|
140
|
+
## License
|
|
141
|
+
|
|
142
|
+
Apache-2.0
|
package/dist/index.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts", "../src/aac/adts.ts", "../src/transmux/sampleEntry.ts", "../src/mp4/mp4.ts", "../src/mpegts/mpegts.ts", "../src/transmux/transmux.ts"],
|
|
4
|
-
"sourcesContent": ["/** Auto-generated from build scripts */\nexport * from './transmux/transmux'\nexport * from './transmux/sampleEntry'\nexport * from './mpegts/mpegts'\nexport * from './mp4/mp4'\nexport * from './aac/adts'\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * ADTS (Audio Data Transport Stream) frame parser for AAC.\n *\n * ADTS is the framing format used to carry AAC audio in MPEG-TS and raw .aac\n * files. Each frame starts with a 7-byte (or 9-byte with CRC) sync header\n * containing the audio object type, sample rate, and channel configuration\n * needed to construct the MP4 AudioSpecificConfig.\n *\n * @module\n */\n\nexport interface AdtsFrame {\n /** Offset of this frame within the source buffer. */\n readonly offset: number\n /** Total frame size including header. */\n readonly frameLength: number\n /** Size of the ADTS header (7 or 9 bytes). */\n readonly headerSize: number\n /** AAC audio object type (1 = AAC-LC, 2 = HE-AAC, etc.). */\n readonly audioObjectType: number\n /** Sampling frequency index (0-12). */\n readonly samplingFrequencyIndex: number\n /** Channel configuration (1 = mono, 2 = stereo, etc.). */\n readonly channelConfiguration: number\n}\n\nconst ADTS_SAMPLING_RATES = [\n 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025,\n 8000, 7350,\n]\n\n/**\n * Returns the sample rate in Hz for a given sampling frequency index.\n */\nexport function adtsSampleRate(index: number): number {\n return ADTS_SAMPLING_RATES[index] ?? 0\n}\n\n/**\n * Parses all ADTS frames from a buffer of raw AAC data.\n */\nexport function parseAdtsFrames(data: Uint8Array): AdtsFrame[] {\n const frames: AdtsFrame[] = []\n let offset = 0\n\n while (offset + 7 <= data.length) {\n // ADTS sync word: 0xFFF\n if (data[offset] !== 0xff || (data[offset + 1] & 0xf0) !== 0xf0) {\n offset++\n continue\n }\n\n const hasCrc = (data[offset + 1] & 0x01) === 0\n const headerSize = hasCrc ? 9 : 7\n\n const audioObjectType = ((data[offset + 2] >> 6) & 0x03) + 1\n const samplingFrequencyIndex = (data[offset + 2] >> 2) & 0x0f\n const channelConfiguration =\n ((data[offset + 2] & 0x01) << 2) | ((data[offset + 3] >> 6) & 0x03)\n\n const frameLength =\n ((data[offset + 3] & 0x03) << 11) |\n (data[offset + 4] << 3) |\n ((data[offset + 5] >> 5) & 0x07)\n\n if (frameLength < headerSize || offset + frameLength > data.length) {\n break\n }\n\n frames.push({\n offset,\n frameLength,\n headerSize,\n audioObjectType,\n samplingFrequencyIndex,\n channelConfiguration,\n })\n\n offset += frameLength\n }\n\n return frames\n}\n\n/**\n * Builds the AudioSpecificConfig (2 bytes) for an AAC-LC stream.\n * This is required in the MP4 esds box.\n */\nexport function buildAudioSpecificConfig(frame: AdtsFrame): Uint8Array {\n const config = new Uint8Array(2)\n config[0] =\n (frame.audioObjectType << 3) |\n ((frame.samplingFrequencyIndex & 0x0e) >> 1)\n config[1] =\n ((frame.samplingFrequencyIndex & 0x01) << 7) |\n (frame.channelConfiguration << 3)\n return config\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Codec-specific MP4 sample entry builders for AAC and H.264.\n *\n * These produce the sample entry boxes (mp4a, avc1) that are placed inside\n * the generic stsd box built by the mp4 layer.\n *\n * @module\n */\n\nimport { BufferWriter } from '@amazon/vinyl-util'\nimport { box, fullBox } from '@/mp4/mp4'\n\n/** 72 dpi in 16.16 fixed point. */\nconst RESOLUTION_72_DPI = 0x00480000\n\n/** ESDS object type indication for AAC (ISO 14496-3). */\nconst OBJECT_TYPE_AAC = 0x40\n\n/** ESDS stream type for audio: (0x05 << 2) | 0x01. */\nconst STREAM_TYPE_AUDIO = 0x15\n\nexport interface AudioTrackConfig {\n readonly audioObjectType: number\n readonly samplingFrequencyIndex: number\n readonly channelConfiguration: number\n readonly sampleRate: number\n readonly audioSpecificConfig: Uint8Array\n}\n\nexport interface VideoTrackConfig {\n readonly width: number\n readonly height: number\n readonly sps: Uint8Array\n readonly pps: Uint8Array\n readonly profileIdc: number\n readonly profileCompatibility: number\n readonly levelIdc: number\n}\n\n/**\n * Builds an mp4a sample entry box for AAC audio.\n */\nexport function mp4aSampleEntry(config: AudioTrackConfig): Uint8Array {\n const writer = new BufferWriter(28)\n // 6 bytes reserved\n for (let i = 0; i < 6; i++) writer.writeUint8(0)\n writer.writeUint16(1) // data_reference_index\n // 8 bytes reserved\n for (let i = 0; i < 8; i++) writer.writeUint8(0)\n writer.writeUint16(config.channelConfiguration)\n writer.writeUint16(16) // sample_size\n writer.writeUint16(0) // pre_defined\n writer.writeUint16(0) // reserved\n writer.writeUint32(config.sampleRate << 16) // sample_rate (16.16)\n return box('mp4a', writer.toUint8Array(), esds(config))\n}\n\n/**\n * Builds an avc1 sample entry box for H.264 video.\n */\nexport function avc1SampleEntry(config: VideoTrackConfig): Uint8Array {\n const writer = new BufferWriter(78)\n // 6 bytes reserved\n for (let i = 0; i < 6; i++) writer.writeUint8(0)\n writer.writeUint16(1) // data_reference_index\n // 16 bytes pre_defined + reserved\n for (let i = 0; i < 16; i++) writer.writeUint8(0)\n writer.writeUint16(config.width)\n writer.writeUint16(config.height)\n writer.writeUint32(RESOLUTION_72_DPI)\n writer.writeUint32(RESOLUTION_72_DPI)\n writer.writeUint32(0) // reserved\n writer.writeUint16(1) // frame_count\n // 32 bytes compressorname\n for (let i = 0; i < 32; i++) writer.writeUint8(0)\n writer.writeUint16(0x0018) // depth = 24\n writer.writeInt16(-1) // pre_defined\n return box('avc1', writer.toUint8Array(), avcC(config))\n}\n\nfunction esds(config: AudioTrackConfig): Uint8Array {\n const asc = config.audioSpecificConfig\n\n // DecoderSpecificInfo (tag 0x05)\n const dsi = new BufferWriter(2 + asc.byteLength)\n dsi.writeUint8(0x05)\n dsi.writeUint8(asc.byteLength)\n dsi.writeBytes(asc)\n\n // DecoderConfigDescriptor (tag 0x04)\n const dcd = new BufferWriter(2 + 13 + dsi.position)\n dcd.writeUint8(0x04)\n dcd.writeUint8(13 + dsi.position)\n dcd.writeUint8(OBJECT_TYPE_AAC)\n dcd.writeUint8(STREAM_TYPE_AUDIO)\n dcd.writeUint8(0) // bufferSizeDB (3 bytes)\n dcd.writeUint8(0)\n dcd.writeUint8(0)\n dcd.writeUint32(0) // maxBitrate\n dcd.writeUint32(0) // avgBitrate\n dcd.writeBytes(dsi.toUint8Array())\n\n // SLConfigDescriptor (tag 0x06)\n const slc = new BufferWriter(3)\n slc.writeUint8(0x06)\n slc.writeUint8(1)\n slc.writeUint8(0x02) // predefined = 2\n\n // ES_Descriptor (tag 0x03)\n const esPayloadSize = 3 + dcd.position + slc.position\n const es = new BufferWriter(2 + esPayloadSize)\n es.writeUint8(0x03)\n es.writeUint8(esPayloadSize)\n es.writeUint16(1) // ES_ID\n es.writeUint8(0) // flags\n es.writeBytes(dcd.toUint8Array())\n es.writeBytes(slc.toUint8Array())\n\n return fullBox('esds', 0, 0, es.toUint8Array())\n}\n\nfunction avcC(config: VideoTrackConfig): Uint8Array {\n const writer = new BufferWriter(\n 11 + config.sps.byteLength + config.pps.byteLength\n )\n writer.writeUint8(1) // configurationVersion\n writer.writeUint8(config.profileIdc)\n writer.writeUint8(config.profileCompatibility)\n writer.writeUint8(config.levelIdc)\n writer.writeUint8(3) // lengthSizeMinusOne = 3 (4 bytes)\n writer.writeUint8(0xe1) // numOfSequenceParameterSets = 1\n writer.writeUint16(config.sps.byteLength)\n writer.writeBytes(config.sps)\n writer.writeUint8(1) // numOfPictureParameterSets\n writer.writeUint16(config.pps.byteLength)\n writer.writeBytes(config.pps)\n return box('avcC', writer.toUint8Array())\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * ISO BMFF (MP4) box writing utilities.\n *\n * Provides functions to construct the fMP4 boxes required by MSE:\n * - `ftyp`: file type\n * - `moov` / `mvhd` / `trak` / `mdia` / `minf` / `stbl`: track metadata\n * - `moof` / `mdat`: media fragments\n *\n * @module\n */\n\nimport { BufferWriter } from '@amazon/vinyl-util'\n\n/** ISO 14496-12 identity matrix in 16.16 / 2.30 fixed point. */\nconst UNITY_MATRIX = [\n 0x00010000, 0, 0, 0, 0x00010000, 0, 0, 0, 0x40000000,\n] as const\n\n/** 90 kHz timescale from ISO 13818-1 (MPEG system clock). */\nexport const MPEG_TIMESCALE = 90000\n\n/** ISO 639-2/T packed language code for 'und' (undetermined). */\nconst LANGUAGE_UNDETERMINED = 0x55c4\n\n/**\n * Writes a generic MP4 box (atom). The size field is automatically computed.\n */\nexport function box(type: string, ...payloads: Uint8Array[]): Uint8Array {\n let size = 8\n for (const p of payloads) size += p.byteLength\n const writer = new BufferWriter(size)\n writer.writeUint32(size)\n writer.writeString(type)\n for (const p of payloads) writer.writeBytes(p)\n return writer.toUint8Array()\n}\n\n/**\n * Writes a full box with version and flags.\n */\nexport function fullBox(\n type: string,\n version: number,\n flags: number,\n payload: Uint8Array\n): Uint8Array {\n const size = 12 + payload.byteLength\n const writer = new BufferWriter(size)\n writer.writeUint32(size)\n writer.writeString(type)\n writer.writeUint8(version)\n // 24-bit flags\n writer.writeUint8((flags >> 16) & 0xff)\n writer.writeUint8((flags >> 8) & 0xff)\n writer.writeUint8(flags & 0xff)\n writer.writeBytes(payload)\n return writer.toUint8Array()\n}\n\nexport interface FtypOptions {\n readonly majorBrand?: string\n readonly minorVersion?: number\n readonly compatibleBrands?: readonly string[]\n}\n\nconst DEFAULT_FTYP: Required<FtypOptions> = {\n majorBrand: 'isom',\n minorVersion: 0x200,\n compatibleBrands: ['isom', 'iso6', 'mp41'],\n}\n\n/**\n * Generates the ftyp box.\n */\nexport function ftyp(options?: FtypOptions): Uint8Array {\n const { majorBrand, minorVersion, compatibleBrands } = {\n ...DEFAULT_FTYP,\n ...options,\n }\n const writer = new BufferWriter(8 + compatibleBrands.length * 4)\n writer.writeString(majorBrand)\n writer.writeUint32(minorVersion)\n for (const brand of compatibleBrands) writer.writeString(brand)\n return box('ftyp', writer.toUint8Array())\n}\n\n/**\n * Generates a moov box from pre-built track boxes.\n */\nexport function moov(...traks: Uint8Array[]): Uint8Array {\n const trakAndMvex: Uint8Array[] = []\n for (let i = 0; i < traks.length; i++) {\n trakAndMvex.push(traks[i], mvex(i + 1))\n }\n return box('moov', mvhd(), ...trakAndMvex)\n}\n\nexport interface MvhdOptions {\n readonly timescale?: number\n readonly duration?: number\n readonly rate?: number\n readonly volume?: number\n}\n\nconst DEFAULT_MVHD: Required<MvhdOptions> = {\n timescale: MPEG_TIMESCALE,\n duration: 0,\n rate: 1.0,\n volume: 1.0,\n}\n\nfunction mvhd(options?: MvhdOptions): Uint8Array {\n const { timescale, duration, rate, volume } = {\n ...DEFAULT_MVHD,\n ...options,\n }\n const writer = new BufferWriter(96)\n writer.writeUint32(0) // creation_time\n writer.writeUint32(0) // modification_time\n writer.writeUint32(timescale)\n writer.writeUint32(duration)\n writer.writeUint32(rate * 0x10000) // 16.16 fixed point\n writer.writeUint16(volume * 0x100) // 8.8 fixed point\n // 10 bytes reserved\n for (let i = 0; i < 10; i++) writer.writeUint8(0)\n for (const v of UNITY_MATRIX) writer.writeUint32(v)\n // 6 x uint32 pre_defined\n for (let i = 0; i < 6; i++) writer.writeUint32(0)\n writer.writeUint32(0xffffffff) // next_track_ID\n return fullBox('mvhd', 0, 0, writer.toUint8Array())\n}\n\nexport interface AudioTrackOptions {\n readonly trackId: number\n readonly sampleRate: number\n readonly channelCount: number\n readonly sampleEntry: Uint8Array\n}\n\nexport interface VideoTrackOptions {\n readonly trackId: number\n readonly width: number\n readonly height: number\n readonly timescale?: number\n readonly sampleEntry: Uint8Array\n}\n\nexport function audioTrak(options: AudioTrackOptions): Uint8Array {\n return box(\n 'trak',\n tkhd(options.trackId, 0, 0, options.channelCount > 0 ? 1.0 : 0),\n box(\n 'mdia',\n mdhd(options.sampleRate),\n hdlr('soun', 'SoundHandler'),\n box('minf', smhd(), dinf(), audioStbl(options.sampleEntry))\n )\n )\n}\n\nexport function videoTrak(options: VideoTrackOptions): Uint8Array {\n return box(\n 'trak',\n tkhd(options.trackId, options.width, options.height, 0),\n box(\n 'mdia',\n mdhd(options.timescale ?? MPEG_TIMESCALE),\n hdlr('vide', 'VideoHandler'),\n box('minf', vmhd(), dinf(), videoStbl(options.sampleEntry))\n )\n )\n}\n\nfunction tkhd(\n trackId: number,\n width: number,\n height: number,\n volume: number\n): Uint8Array {\n const writer = new BufferWriter(80)\n writer.writeUint32(0) // creation_time\n writer.writeUint32(0) // modification_time\n writer.writeUint32(trackId)\n writer.writeUint32(0) // reserved\n writer.writeUint32(0) // duration\n writer.writeUint32(0) // reserved\n writer.writeUint32(0) // reserved\n writer.writeUint16(0) // layer\n writer.writeUint16(0) // alternate_group\n writer.writeUint16(volume * 0x100) // volume (8.8 fixed point)\n writer.writeUint16(0) // reserved\n // unity matrix\n for (const v of UNITY_MATRIX) writer.writeUint32(v)\n\n writer.writeUint32(width * 0x10000) // width (16.16 fixed point)\n writer.writeUint32(height * 0x10000) // height (16.16 fixed point)\n return fullBox('tkhd', 0, 0x000003, writer.toUint8Array())\n}\n\nfunction mdhd(timescale: number): Uint8Array {\n const writer = new BufferWriter(20)\n writer.writeUint32(0) // creation_time\n writer.writeUint32(0) // modification_time\n writer.writeUint32(timescale)\n writer.writeUint32(0) // duration\n writer.writeUint16(LANGUAGE_UNDETERMINED)\n writer.writeUint16(0) // pre_defined\n return fullBox('mdhd', 0, 0, writer.toUint8Array())\n}\n\nfunction hdlr(handlerType: string, name: string): Uint8Array {\n const writer = new BufferWriter(21 + name.length)\n writer.writeUint32(0) // pre_defined\n writer.writeString(handlerType)\n writer.writeUint32(0) // reserved\n writer.writeUint32(0) // reserved\n writer.writeUint32(0) // reserved\n writer.writeString(name)\n writer.writeUint8(0) // null terminator\n return fullBox('hdlr', 0, 0, writer.toUint8Array())\n}\n\nfunction smhd(): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint16(0) // balance\n writer.writeUint16(0) // reserved\n return fullBox('smhd', 0, 0, writer.toUint8Array())\n}\n\nfunction vmhd(): Uint8Array {\n const writer = new BufferWriter(8)\n writer.writeUint16(0) // graphicsmode\n writer.writeUint16(0) // opcolor\n writer.writeUint16(0)\n writer.writeUint16(0)\n return fullBox('vmhd', 0, 0x000001, writer.toUint8Array())\n}\n\nfunction dinf(): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(1) // entry_count\n const urlBox = fullBox('url ', 0, 0x000001, new Uint8Array(0))\n return box(\n 'dinf',\n fullBox('dref', 0, 0, concatUint8(writer.toUint8Array(), urlBox))\n )\n}\n\nfunction audioStbl(sampleEntry: Uint8Array): Uint8Array {\n return box('stbl', stsd(sampleEntry), stts(), stsc(), stsz(), stco())\n}\n\nfunction videoStbl(sampleEntry: Uint8Array): Uint8Array {\n return box('stbl', stsd(sampleEntry), stts(), stsc(), stsz(), stco())\n}\n\nfunction stsd(sampleEntry: Uint8Array): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(1) // entry_count\n return fullBox(\n 'stsd',\n 0,\n 0,\n concatUint8(writer.toUint8Array(), sampleEntry)\n )\n}\n\nfunction stts(): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(0) // entry_count\n return fullBox('stts', 0, 0, writer.toUint8Array())\n}\n\nfunction stsc(): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(0) // entry_count\n return fullBox('stsc', 0, 0, writer.toUint8Array())\n}\n\nfunction stsz(): Uint8Array {\n const writer = new BufferWriter(8)\n writer.writeUint32(0) // sample_size\n writer.writeUint32(0) // sample_count\n return fullBox('stsz', 0, 0, writer.toUint8Array())\n}\n\nfunction stco(): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(0) // entry_count\n return fullBox('stco', 0, 0, writer.toUint8Array())\n}\n\nfunction mvex(trackId: number): Uint8Array {\n return box('mvex', trex(trackId))\n}\n\nfunction trex(trackId: number): Uint8Array {\n const writer = new BufferWriter(20)\n writer.writeUint32(trackId)\n writer.writeUint32(1) // default_sample_description_index\n writer.writeUint32(0) // default_sample_duration\n writer.writeUint32(0) // default_sample_size\n writer.writeUint32(0) // default_sample_flags\n return fullBox('trex', 0, 0, writer.toUint8Array())\n}\n\nexport interface MoofOptions {\n readonly sequenceNumber: number\n readonly trackId: number\n readonly baseDecodeTime: number\n readonly samples: readonly SampleEntry[]\n}\n\nexport interface SampleEntry {\n readonly duration: number\n readonly size: number\n readonly flags?: number\n readonly compositionTimeOffset?: number\n}\n\n/**\n * Generates a moof (movie fragment) box.\n */\nexport function moof(options: MoofOptions): Uint8Array {\n return box('moof', mfhd(options.sequenceNumber), traf(options))\n}\n\nfunction mfhd(sequenceNumber: number): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(sequenceNumber)\n return fullBox('mfhd', 0, 0, writer.toUint8Array())\n}\n\nfunction traf(options: MoofOptions): Uint8Array {\n return box(\n 'traf',\n tfhd(options.trackId),\n tfdt(options.baseDecodeTime),\n trun(options.samples)\n )\n}\n\nfunction tfhd(trackId: number): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(trackId)\n // flags: default-base-is-moof (0x020000)\n return fullBox('tfhd', 0, 0x020000, writer.toUint8Array())\n}\n\nfunction tfdt(baseDecodeTime: number): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(baseDecodeTime)\n return fullBox('tfdt', 0, 0, writer.toUint8Array())\n}\n\nfunction trun(samples: readonly SampleEntry[]): Uint8Array {\n // flags: data-offset-present (0x01), sample-duration-present (0x100),\n // sample-size-present (0x200), sample-flags-present (0x400)\n const hasFlags = samples.some((s) => s.flags != null)\n const hasCto = samples.some((s) => s.compositionTimeOffset != null)\n let flags = 0x000001 | 0x000100 | 0x000200\n if (hasFlags) flags |= 0x000400\n if (hasCto) flags |= 0x000800\n\n let entrySize = 8 // duration + size\n if (hasFlags) entrySize += 4\n if (hasCto) entrySize += 4\n\n const writer = new BufferWriter(8 + samples.length * entrySize)\n writer.writeUint32(samples.length) // sample_count\n writer.writeUint32(0) // data_offset (placeholder, patched later)\n\n for (const sample of samples) {\n writer.writeUint32(sample.duration)\n writer.writeUint32(sample.size)\n if (hasFlags) writer.writeUint32(sample.flags ?? 0)\n if (hasCto) writer.writeInt32(sample.compositionTimeOffset ?? 0)\n }\n\n const result = fullBox('trun', hasCto ? 1 : 0, flags, writer.toUint8Array())\n return result\n}\n\n/**\n * Generates an mdat box wrapping raw media data.\n */\nexport function mdat(data: Uint8Array): Uint8Array {\n return box('mdat', data)\n}\n\n/**\n * Patches the trun data_offset field. The data_offset is the byte offset from\n * the start of the moof to the first byte of the mdat payload.\n */\nexport function patchDataOffset(moofData: Uint8Array, moofSize: number): void {\n // data_offset = moofSize + 8 (mdat header)\n const dataOffset = moofSize + 8\n // Find trun box and patch the data_offset field.\n // trun is inside moof > traf. Walk the box tree.\n let pos = 8 // skip moof header\n while (pos < moofData.length) {\n const boxSize =\n ((moofData[pos] << 24) |\n (moofData[pos + 1] << 16) |\n (moofData[pos + 2] << 8) |\n moofData[pos + 3]) >>>\n 0\n const boxType = String.fromCharCode(\n moofData[pos + 4],\n moofData[pos + 5],\n moofData[pos + 6],\n moofData[pos + 7]\n )\n if (boxType === 'traf') {\n // Recurse into traf\n let trafPos = pos + 8\n while (trafPos < pos + boxSize) {\n const innerSize =\n ((moofData[trafPos] << 24) |\n (moofData[trafPos + 1] << 16) |\n (moofData[trafPos + 2] << 8) |\n moofData[trafPos + 3]) >>>\n 0\n const innerType = String.fromCharCode(\n moofData[trafPos + 4],\n moofData[trafPos + 5],\n moofData[trafPos + 6],\n moofData[trafPos + 7]\n )\n if (innerType === 'trun') {\n // data_offset is at offset 12+4 = 16 from box start\n // (8 box header + 4 version/flags + 4 sample_count)\n const offsetPos = trafPos + 16\n moofData[offsetPos] = (dataOffset >> 24) & 0xff\n moofData[offsetPos + 1] = (dataOffset >> 16) & 0xff\n moofData[offsetPos + 2] = (dataOffset >> 8) & 0xff\n moofData[offsetPos + 3] = dataOffset & 0xff\n return\n }\n trafPos += innerSize\n }\n }\n pos += boxSize\n }\n}\n\nfunction concatUint8(...arrays: Uint8Array[]): Uint8Array {\n let total = 0\n for (const a of arrays) total += a.byteLength\n const result = new Uint8Array(total)\n let offset = 0\n for (const a of arrays) {\n result.set(a, offset)\n offset += a.byteLength\n }\n return result\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * MPEG-TS constants and packet-level parsing.\n *\n * An MPEG Transport Stream consists of fixed 188-byte packets. Each packet\n * starts with a sync byte (0x47) and carries a 13-bit PID identifying the\n * elementary stream. The PAT (PID 0) maps program numbers to PMT PIDs, and\n * the PMT lists the elementary stream PIDs with their stream types.\n *\n * @module\n */\n\nexport const TS_PACKET_SIZE = 188\nexport const TS_SYNC_BYTE = 0x47\n\n/** Well-known stream type identifiers from ISO/IEC 13818-1. */\nexport const STREAM_TYPE_AAC = 0x0f\nexport const STREAM_TYPE_H264 = 0x1b\nexport const STREAM_TYPE_H265 = 0x24\nexport const STREAM_TYPE_ID3 = 0x15\n\nexport interface TsPacketHeader {\n readonly pid: number\n readonly payloadUnitStartIndicator: boolean\n readonly adaptationFieldControl: number\n readonly continuityCounter: number\n}\n\nexport interface PmtEntry {\n readonly pid: number\n readonly streamType: number\n}\n\n/**\n * Parses a single 188-byte TS packet header.\n */\nexport function parseTsPacketHeader(\n data: Uint8Array,\n offset: number\n): TsPacketHeader {\n const byte1 = data[offset + 1]\n const byte2 = data[offset + 2]\n const byte3 = data[offset + 3]\n return {\n pid: ((byte1 & 0x1f) << 8) | byte2,\n payloadUnitStartIndicator: (byte1 & 0x40) !== 0,\n adaptationFieldControl: (byte3 >> 4) & 0x03,\n continuityCounter: byte3 & 0x0f,\n }\n}\n\n/**\n * Returns the offset of the payload within a TS packet.\n */\nexport function getPayloadOffset(\n data: Uint8Array,\n offset: number,\n adaptationFieldControl: number\n): number {\n let payloadOffset = offset + 4\n if (adaptationFieldControl >= 2) {\n // Adaptation field present\n payloadOffset += 1 + data[offset + 4]\n }\n return payloadOffset\n}\n\n/**\n * Parses the PAT (Program Association Table) to find the PMT PID.\n */\nexport function parsePat(data: Uint8Array, offset: number): number {\n // Skip pointer field\n const pointerField = data[offset]\n let pos = offset + 1 + pointerField\n // Skip table_id(1), section_syntax_indicator+length(2), transport_stream_id(2),\n // version/current(1), section_number(1), last_section_number(1)\n pos += 8\n // First program entry: program_number(2) + PMT_PID(2)\n // Skip program_number\n pos += 2\n return ((data[pos] & 0x1f) << 8) | data[pos + 1]\n}\n\n/**\n * Parses the PMT (Program Map Table) to extract elementary stream entries.\n */\nexport function parsePmt(data: Uint8Array, offset: number): PmtEntry[] {\n const pointerField = data[offset]\n let pos = offset + 1 + pointerField\n\n // table_id(1)\n pos += 1\n const sectionLength = ((data[pos] & 0x0f) << 8) | data[pos + 1]\n pos += 2\n const sectionEnd = pos + sectionLength\n // transport_stream_id(2), version/current(1), section_number(1), last_section_number(1)\n pos += 5\n // PCR_PID(2)\n pos += 2\n // program_info_length\n const programInfoLength = ((data[pos] & 0x0f) << 8) | data[pos + 1]\n pos += 2 + programInfoLength\n\n const entries: PmtEntry[] = []\n // -4 for CRC32\n while (pos < sectionEnd - 4) {\n const streamType = data[pos]\n pos += 1\n const pid = ((data[pos] & 0x1f) << 8) | data[pos + 1]\n pos += 2\n const esInfoLength = ((data[pos] & 0x0f) << 8) | data[pos + 1]\n pos += 2 + esInfoLength\n entries.push({ pid, streamType })\n }\n return entries\n}\n\nexport interface DemuxedStream {\n readonly streamType: number\n readonly pid: number\n readonly data: Uint8Array[]\n}\n\n/**\n * Demuxes a complete MPEG-TS segment into elementary streams.\n * Reassembles PES packets from TS packets for each PID.\n */\nexport function demuxTsSegment(segment: Uint8Array): DemuxedStream[] {\n let pmtPid = -1\n const pmtEntries: PmtEntry[] = []\n const pesBuffers = new Map<number, Uint8Array[]>()\n\n // First pass: find PAT and PMT\n for (let i = 0; i + TS_PACKET_SIZE <= segment.length; i += TS_PACKET_SIZE) {\n if (segment[i] !== TS_SYNC_BYTE) continue\n const header = parseTsPacketHeader(segment, i)\n const payloadStart = getPayloadOffset(\n segment,\n i,\n header.adaptationFieldControl\n )\n if (\n header.adaptationFieldControl === 0 ||\n header.adaptationFieldControl === 2\n )\n continue\n\n if (header.pid === 0) {\n pmtPid = parsePat(segment, payloadStart)\n } else if (header.pid === pmtPid && pmtEntries.length === 0) {\n pmtEntries.push(...parsePmt(segment, payloadStart))\n }\n }\n\n // Initialize buffers for known elementary streams\n const pidToStreamType = new Map<number, number>()\n for (const entry of pmtEntries) {\n pidToStreamType.set(entry.pid, entry.streamType)\n pesBuffers.set(entry.pid, [])\n }\n\n // Second pass: collect PES data\n for (let i = 0; i + TS_PACKET_SIZE <= segment.length; i += TS_PACKET_SIZE) {\n if (segment[i] !== TS_SYNC_BYTE) continue\n const header = parseTsPacketHeader(segment, i)\n if (\n header.adaptationFieldControl === 0 ||\n header.adaptationFieldControl === 2\n )\n continue\n\n const buffers = pesBuffers.get(header.pid)\n if (!buffers) continue\n\n const payloadStart = getPayloadOffset(\n segment,\n i,\n header.adaptationFieldControl\n )\n const payloadEnd = i + TS_PACKET_SIZE\n if (payloadStart < payloadEnd) {\n buffers.push(segment.slice(payloadStart, payloadEnd))\n }\n }\n\n const streams: DemuxedStream[] = []\n for (const [pid, buffers] of pesBuffers) {\n if (buffers.length === 0) continue\n streams.push({\n pid,\n streamType: pidToStreamType.get(pid)!,\n data: buffers,\n })\n }\n return streams\n}\n\n/**\n * Concatenates an array of Uint8Arrays into a single Uint8Array.\n */\nexport function concatBuffers(buffers: Uint8Array[]): Uint8Array {\n let totalLength = 0\n for (const buf of buffers) totalLength += buf.byteLength\n const result = new Uint8Array(totalLength)\n let offset = 0\n for (const buf of buffers) {\n result.set(buf, offset)\n offset += buf.byteLength\n }\n return result\n}\n\n/**\n * Strips the PES header from raw PES packet data, returning the elementary\n * stream payload.\n */\nexport function stripPesHeader(pesData: Uint8Array): Uint8Array {\n // PES start code: 0x00 0x00 0x01\n if (pesData[0] !== 0 || pesData[1] !== 0 || pesData[2] !== 1) {\n // No PES header, return as-is (continuation data)\n return pesData\n }\n // PES header data length is at byte 8\n const pesHeaderDataLength = pesData[8]\n return pesData.subarray(9 + pesHeaderDataLength)\n}\n\n/**\n * Extracts the PTS (Presentation Time Stamp) from a PES header.\n * Returns the PTS in 90kHz clock ticks, or -1 if not present.\n */\nexport function parsePesPts(pesData: Uint8Array): number {\n if (pesData[0] !== 0 || pesData[1] !== 0 || pesData[2] !== 1) return -1\n const flags = pesData[7]\n if ((flags & 0x80) === 0) return -1\n // PTS is encoded in 5 bytes starting at byte 9\n const byte9 = pesData[9]\n const byte10 = pesData[10]\n const byte11 = pesData[11]\n const byte12 = pesData[12]\n const byte13 = pesData[13]\n return (\n (byte9 & 0x0e) * 0x20000000 + // (byte9 & 0x0E) << 29\n ((byte10 & 0xff) << 22) +\n ((byte11 & 0xfe) << 14) +\n ((byte12 & 0xff) << 7) +\n ((byte13 & 0xfe) >>> 1)\n )\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Transmuxer that converts MPEG-TS / raw ADTS AAC segments into fMP4\n * fragments consumable by MSE SourceBuffer.\n *\n * The transmuxer produces two outputs:\n * 1. An initialization segment (ftyp + moov) \u2014 append once per track.\n * 2. Media segments (moof + mdat) \u2014 append per HLS segment.\n *\n * @module\n */\n\nimport {\n type AdtsFrame,\n adtsSampleRate,\n buildAudioSpecificConfig,\n parseAdtsFrames,\n} from '@/aac/adts'\nimport {\n type AudioTrackConfig,\n type VideoTrackConfig,\n mp4aSampleEntry,\n avc1SampleEntry,\n} from '@/transmux/sampleEntry'\nimport {\n type SampleEntry,\n audioTrak,\n ftyp,\n mdat,\n moov,\n moof,\n patchDataOffset,\n videoTrak,\n MPEG_TIMESCALE,\n} from '@/mp4/mp4'\nimport {\n STREAM_TYPE_AAC,\n STREAM_TYPE_H264,\n concatBuffers,\n demuxTsSegment,\n parsePesPts,\n} from '@/mpegts/mpegts'\n\nexport interface TransmuxResult {\n /** The initialization segment (ftyp + moov). Always present. */\n readonly initSegment: ArrayBuffer\n /** The media segment (moof + mdat). */\n readonly mediaSegment: ArrayBuffer\n /** Duration of this segment in seconds. */\n readonly duration: number\n}\n\ninterface TrackState {\n initSegment: Uint8Array | null\n sequenceNumber: number\n audioConfig: AudioTrackConfig | null\n videoConfig: VideoTrackConfig | null\n audioDecodeTime: number\n videoDecodeTime: number\n}\n\n/**\n * Creates a stateful transmuxer instance. Call `transmux()` for each HLS\n * segment in order. The init segment is always returned (cached after first\n * call).\n */\nexport function createTransmuxer() {\n const state: TrackState = {\n initSegment: null,\n sequenceNumber: 1,\n audioConfig: null,\n videoConfig: null,\n audioDecodeTime: 0,\n videoDecodeTime: 0,\n }\n\n return { transmux: (data: ArrayBuffer) => transmux(state, data) }\n}\n\n/**\n * Builds the ftyp + moov init segment and stores it in state.\n */\nfunction buildInitSegment(state: TrackState, moovBox: Uint8Array): void {\n const ftypBox = ftyp()\n const init = new Uint8Array(ftypBox.byteLength + moovBox.byteLength)\n init.set(ftypBox, 0)\n init.set(moovBox, ftypBox.byteLength)\n state.initSegment = init\n}\n\n/** Returns the cached init segment as an ArrayBuffer. */\nfunction getInitSegment(state: TrackState): ArrayBuffer {\n const init = state.initSegment!\n return init.buffer.slice(\n init.byteOffset,\n init.byteOffset + init.byteLength\n ) as ArrayBuffer\n}\n\nfunction transmux(state: TrackState, data: ArrayBuffer): TransmuxResult {\n let segment: Uint8Array = new Uint8Array(data)\n\n // Skip ID3 tags that may precede the audio/video data.\n // ID3 tags are common in HLS for carrying timestamps.\n segment = skipId3Tags(segment)\n\n // Detect format: MPEG-TS starts with 0x47, ADTS starts with 0xFFF\n const isMpegTs = segment[0] === 0x47\n const isAdts = segment[0] === 0xff && (segment[1] & 0xf0) === 0xf0\n\n if (isMpegTs) {\n return transmuxMpegTs(state, segment)\n } else if (isAdts) {\n return transmuxAdts(state, segment)\n }\n\n throw new Error('Unsupported segment format: expected MPEG-TS or ADTS')\n}\n\n/**\n * Skips any leading ID3v2 tags. Each tag has a 10-byte header where bytes\n * 6-9 encode the size as a synchsafe integer.\n */\nfunction skipId3Tags(data: Uint8Array): Uint8Array {\n let offset = 0\n while (\n offset + 10 <= data.length &&\n data[offset] === 0x49 && // 'I'\n data[offset + 1] === 0x44 && // 'D'\n data[offset + 2] === 0x33 // '3'\n ) {\n const size =\n ((data[offset + 6] & 0x7f) << 21) |\n ((data[offset + 7] & 0x7f) << 14) |\n ((data[offset + 8] & 0x7f) << 7) |\n (data[offset + 9] & 0x7f)\n offset += 10 + size\n }\n return offset > 0 ? data.subarray(offset) : data\n}\n\nfunction transmuxAdts(state: TrackState, data: Uint8Array): TransmuxResult {\n const frames = parseAdtsFrames(data)\n if (frames.length === 0) {\n throw new Error('No ADTS frames found in segment')\n }\n\n const firstFrame = frames[0]\n\n if (!state.audioConfig) {\n const sampleRate = adtsSampleRate(firstFrame.samplingFrequencyIndex)\n state.audioConfig = {\n audioObjectType: firstFrame.audioObjectType,\n samplingFrequencyIndex: firstFrame.samplingFrequencyIndex,\n channelConfiguration: firstFrame.channelConfiguration,\n sampleRate,\n audioSpecificConfig: buildAudioSpecificConfig(firstFrame),\n }\n buildInitSegment(\n state,\n moov(\n audioTrak({\n trackId: 1,\n sampleRate: state.audioConfig.sampleRate,\n channelCount: state.audioConfig.channelConfiguration,\n sampleEntry: mp4aSampleEntry(state.audioConfig),\n })\n )\n )\n }\n\n const sampleRate = state.audioConfig.sampleRate\n const samplesPerFrame = 1024 // AAC-LC always uses 1024 samples per frame\n\n // Build sample table and raw frame data\n const samples: SampleEntry[] = []\n const frameDataParts: Uint8Array[] = []\n\n for (const frame of frames) {\n const rawData = data.subarray(\n frame.offset + frame.headerSize,\n frame.offset + frame.frameLength\n )\n samples.push({\n duration: samplesPerFrame,\n size: rawData.byteLength,\n })\n frameDataParts.push(rawData)\n }\n\n const rawMediaData = concatBuffers(frameDataParts)\n const duration = (frames.length * samplesPerFrame) / sampleRate\n\n const moofBox = moof({\n sequenceNumber: state.sequenceNumber++,\n trackId: 1,\n baseDecodeTime: state.audioDecodeTime,\n samples,\n })\n state.audioDecodeTime += frames.length * samplesPerFrame\n patchDataOffset(moofBox, moofBox.byteLength)\n const mdatBox = mdat(rawMediaData)\n\n const mediaSegment = new Uint8Array(moofBox.byteLength + mdatBox.byteLength)\n mediaSegment.set(moofBox, 0)\n mediaSegment.set(mdatBox, moofBox.byteLength)\n\n return {\n initSegment: getInitSegment(state),\n mediaSegment: mediaSegment.buffer.slice(\n mediaSegment.byteOffset,\n mediaSegment.byteOffset + mediaSegment.byteLength\n ),\n duration,\n }\n}\n\nfunction transmuxMpegTs(state: TrackState, data: Uint8Array): TransmuxResult {\n const streams = demuxTsSegment(data)\n\n const audioStream = streams.find((s) => s.streamType === STREAM_TYPE_AAC)\n const videoStream = streams.find((s) => s.streamType === STREAM_TYPE_H264)\n\n // Process audio\n let audioFrames: AdtsFrame[] = []\n let audioRawData: Uint8Array | null = null\n let audioConfig = state.audioConfig\n\n if (audioStream) {\n const pesData = concatBuffers(audioStream.data)\n const esData = extractElementaryStream(pesData)\n audioFrames = parseAdtsFrames(esData)\n\n if (audioFrames.length > 0 && !audioConfig) {\n const firstFrame = audioFrames[0]\n const sampleRate = adtsSampleRate(firstFrame.samplingFrequencyIndex)\n audioConfig = {\n audioObjectType: firstFrame.audioObjectType,\n samplingFrequencyIndex: firstFrame.samplingFrequencyIndex,\n channelConfiguration: firstFrame.channelConfiguration,\n sampleRate,\n audioSpecificConfig: buildAudioSpecificConfig(firstFrame),\n }\n state.audioConfig = audioConfig\n }\n\n // Strip ADTS headers from frames\n const parts: Uint8Array[] = []\n for (const frame of audioFrames) {\n parts.push(\n esData.subarray(\n frame.offset + frame.headerSize,\n frame.offset + frame.frameLength\n )\n )\n }\n audioRawData = concatBuffers(parts)\n }\n\n // Process video\n let videoNalus: Uint8Array[] = []\n let videoConfig = state.videoConfig\n let videoFrameDuration = 3754 // default ~23.976fps at 90kHz\n const videoPtsList: number[] = []\n\n if (videoStream) {\n const pesData = concatBuffers(videoStream.data)\n\n // Extract PTS timestamps from PES headers to compute frame duration and CTOs\n let pesOff = 0\n while (pesOff + 9 < pesData.length) {\n if (\n pesData[pesOff] === 0 &&\n pesData[pesOff + 1] === 0 &&\n pesData[pesOff + 2] === 1 &&\n pesData[pesOff + 3] >= 0xbc\n ) {\n const pts = parsePesPts(pesData.subarray(pesOff))\n if (pts >= 0) videoPtsList.push(pts)\n const pLen = (pesData[pesOff + 4] << 8) | pesData[pesOff + 5]\n if (pLen > 0) {\n pesOff += 6 + pLen\n } else {\n const hdrLen = pesData[pesOff + 8]\n pesOff += 9 + hdrLen\n }\n } else {\n pesOff++\n }\n }\n if (videoPtsList.length >= 2) {\n // Compute frame duration from sorted PTS deltas\n const sorted = [...videoPtsList].sort((a, b) => a - b)\n const deltas: number[] = []\n for (let i = 1; i < sorted.length; i++)\n deltas.push(sorted[i] - sorted[i - 1])\n deltas.sort((a, b) => a - b)\n videoFrameDuration = deltas[deltas.length >> 1] || 3754\n }\n\n const esData = extractElementaryStream(pesData)\n videoNalus = extractH264Nalus(esData)\n\n if (!videoConfig) {\n const sps = videoNalus.find((n) => (n[0] & 0x1f) === 7)\n const pps = videoNalus.find((n) => (n[0] & 0x1f) === 8)\n if (sps && pps) {\n const { width, height } = parseSpsInfo(sps)\n videoConfig = {\n width,\n height,\n sps,\n pps,\n profileIdc: sps[1],\n profileCompatibility: sps[2],\n levelIdc: sps[3],\n }\n state.videoConfig = videoConfig\n }\n }\n }\n\n // Generate init segment if needed\n if (!state.initSegment && (audioConfig || videoConfig)) {\n const traks: Uint8Array[] = []\n if (videoConfig) {\n traks.push(\n videoTrak({\n trackId: traks.length + 1,\n width: videoConfig.width,\n height: videoConfig.height,\n sampleEntry: avc1SampleEntry(videoConfig),\n })\n )\n }\n if (audioConfig) {\n traks.push(\n audioTrak({\n trackId: traks.length + 1,\n sampleRate: audioConfig.sampleRate,\n channelCount: audioConfig.channelConfiguration,\n sampleEntry: mp4aSampleEntry(audioConfig),\n })\n )\n }\n buildInitSegment(state, moov(...traks))\n }\n\n // Build media segment - for now handle audio track (trackId=1 for video, 2 for audio in muxed)\n const fragments: Uint8Array[] = []\n let duration = 0\n\n if (videoConfig && videoNalus.length > 0) {\n const trackId = 1\n\n // Group NAL units into access units. Each IDR or non-IDR slice\n // starts a new access unit. SPS/PPS are prepended to the next IDR.\n const accessUnits: { nalus: Uint8Array[]; isIdr: boolean }[] = []\n let pendingParams: Uint8Array[] = []\n\n for (const nalu of videoNalus) {\n const naluType = nalu[0] & 0x1f\n if (naluType === 7 || naluType === 8) {\n // SPS or PPS - buffer for next IDR\n pendingParams.push(nalu)\n } else if (naluType === 6) {\n // SEI - attach to next slice's access unit\n pendingParams.push(nalu)\n } else if (naluType === 5) {\n // IDR slice - include SPS/PPS/SEI before it\n accessUnits.push({\n nalus: [...pendingParams, nalu],\n isIdr: true,\n })\n pendingParams = []\n } else if (naluType === 1) {\n // Non-IDR slice - include any pending SEI\n accessUnits.push({\n nalus:\n pendingParams.length > 0\n ? [...pendingParams, nalu]\n : [nalu],\n isIdr: false,\n })\n pendingParams = []\n }\n // Skip other NAL types (SEI, AUD, etc.)\n }\n\n if (accessUnits.length > 0) {\n const naluParts: Uint8Array[] = []\n const samples: SampleEntry[] = []\n const frameDuration = videoFrameDuration\n\n // Compute composition time offsets from PTS.\n // DTS increases linearly; CTO = PTS - DTS.\n const basePts =\n videoPtsList.length > 0 ? Math.min(...videoPtsList) : 0\n const baseDts = basePts // first DTS = first PTS for simplicity\n\n for (let auIdx = 0; auIdx < accessUnits.length; auIdx++) {\n const au = accessUnits[auIdx]\n // Concatenate all NAL units in this access unit with length prefixes\n let auSize = 0\n const auParts: Uint8Array[] = []\n for (const nalu of au.nalus) {\n const lengthPrefixed = new Uint8Array(4 + nalu.byteLength)\n lengthPrefixed[0] = (nalu.byteLength >> 24) & 0xff\n lengthPrefixed[1] = (nalu.byteLength >> 16) & 0xff\n lengthPrefixed[2] = (nalu.byteLength >> 8) & 0xff\n lengthPrefixed[3] = nalu.byteLength & 0xff\n lengthPrefixed.set(nalu, 4)\n auParts.push(lengthPrefixed)\n auSize += lengthPrefixed.byteLength\n }\n naluParts.push(...auParts)\n\n samples.push({\n duration: frameDuration,\n size: auSize,\n // is_leading=0, depends_on: IDR=2(no), non-IDR=1(yes),\n // is_depended_on=0, has_redundancy=0\n flags: au.isIdr ? 0x02000000 : 0x01010000,\n compositionTimeOffset:\n auIdx < videoPtsList.length\n ? videoPtsList[auIdx] -\n (baseDts + auIdx * frameDuration)\n : 0,\n })\n }\n\n const rawData = concatBuffers(naluParts)\n const moofBox = moof({\n sequenceNumber: state.sequenceNumber++,\n trackId,\n baseDecodeTime: state.videoDecodeTime,\n samples,\n })\n state.videoDecodeTime += accessUnits.length * frameDuration\n patchDataOffset(moofBox, moofBox.byteLength)\n const mdatBox = mdat(rawData)\n fragments.push(moofBox, mdatBox)\n duration = (accessUnits.length * frameDuration) / MPEG_TIMESCALE\n }\n }\n\n if (audioConfig && audioRawData && audioFrames.length > 0) {\n const trackId = videoConfig ? 2 : 1\n const samplesPerFrame = 1024\n const samples: SampleEntry[] = []\n const parts: Uint8Array[] = []\n let offset = 0\n\n for (const frame of audioFrames) {\n const size = frame.frameLength - frame.headerSize\n parts.push(audioRawData.subarray(offset, offset + size))\n samples.push({\n duration: samplesPerFrame,\n size,\n })\n offset += size\n }\n\n const rawData = concatBuffers(parts)\n const moofBox = moof({\n sequenceNumber: state.sequenceNumber++,\n trackId,\n baseDecodeTime: state.audioDecodeTime,\n samples,\n })\n state.audioDecodeTime += audioFrames.length * samplesPerFrame\n patchDataOffset(moofBox, moofBox.byteLength)\n const mdatBox = mdat(rawData)\n fragments.push(moofBox, mdatBox)\n\n const audioDuration =\n (audioFrames.length * samplesPerFrame) / audioConfig.sampleRate\n if (audioDuration > duration) duration = audioDuration\n }\n\n const mediaSegment = concatBuffers(fragments)\n\n return {\n initSegment: getInitSegment(state),\n mediaSegment: mediaSegment.buffer.slice(\n mediaSegment.byteOffset,\n mediaSegment.byteOffset + mediaSegment.byteLength\n ) as ArrayBuffer,\n duration,\n }\n}\n\n/**\n * Extracts the elementary stream from concatenated PES packet data.\n * Handles multiple PES packets within the buffer.\n */\nfunction extractElementaryStream(pesData: Uint8Array): Uint8Array {\n const parts: Uint8Array[] = []\n let offset = 0\n\n while (offset < pesData.length) {\n if (\n offset + 9 <= pesData.length &&\n pesData[offset] === 0 &&\n pesData[offset + 1] === 0 &&\n pesData[offset + 2] === 1 &&\n pesData[offset + 3] >= 0xbc // PES stream IDs start at 0xBC\n ) {\n const headerDataLength = pesData[offset + 8]\n const payloadStart = offset + 9 + headerDataLength\n const pesPacketLength =\n (pesData[offset + 4] << 8) | pesData[offset + 5]\n\n if (pesPacketLength > 0) {\n const pesEnd = Math.min(\n offset + 6 + pesPacketLength,\n pesData.length\n )\n if (payloadStart < pesEnd) {\n parts.push(pesData.subarray(payloadStart, pesEnd))\n }\n offset = pesEnd\n } else {\n // Unknown length \u2014 scan for next PES header (00 00 01 + stream_id >= 0xBC)\n let nextPes = payloadStart\n while (nextPes + 3 < pesData.length) {\n if (\n pesData[nextPes] === 0 &&\n pesData[nextPes + 1] === 0 &&\n pesData[nextPes + 2] === 1 &&\n pesData[nextPes + 3] >= 0xbc\n ) {\n break\n }\n nextPes++\n }\n if (nextPes + 3 >= pesData.length) nextPes = pesData.length\n if (payloadStart < nextPes) {\n parts.push(pesData.subarray(payloadStart, nextPes))\n }\n offset = nextPes\n }\n } else {\n offset++\n }\n }\n\n return concatBuffers(parts)\n}\n\n/**\n * Extracts H.264 NAL units from an Annex B byte stream.\n * Properly handles 3-byte and 4-byte start codes and trims trailing zeros\n * that may result from TS packet padding.\n */\nfunction extractH264Nalus(data: Uint8Array): Uint8Array[] {\n const nalus: Uint8Array[] = []\n\n // Find all start code positions\n const startPositions: { offset: number; scLen: number }[] = []\n let i = 0\n while (i < data.length - 2) {\n if (data[i] === 0 && data[i + 1] === 0) {\n if (i + 3 < data.length && data[i + 2] === 0 && data[i + 3] === 1) {\n startPositions.push({ offset: i, scLen: 4 })\n i += 4\n } else if (data[i + 2] === 1) {\n startPositions.push({ offset: i, scLen: 3 })\n i += 3\n } else {\n i++\n }\n } else {\n i++\n }\n }\n\n for (let j = 0; j < startPositions.length; j++) {\n const naluStart = startPositions[j].offset + startPositions[j].scLen\n const naluEnd =\n j + 1 < startPositions.length\n ? startPositions[j + 1].offset\n : data.length\n\n // Trim trailing zeros (TS packet padding)\n let trimmedEnd = naluEnd\n while (trimmedEnd > naluStart + 1 && data[trimmedEnd - 1] === 0) {\n trimmedEnd--\n }\n\n if (trimmedEnd > naluStart) {\n nalus.push(data.subarray(naluStart, trimmedEnd))\n }\n }\n\n return nalus\n}\n\ninterface SpsInfo {\n readonly width: number\n readonly height: number\n}\n\n/**\n * H.264 profiles that include the high-profile SPS extensions\n * (chroma format, bit depth, scaling matrices).\n */\nconst HIGH_PROFILE_IDCS = /* @__PURE__ */ new Set([\n 100, 110, 122, 244, 44, 83, 86, 118, 128, 138, 139, 134,\n])\n\n/**\n * Minimal H.264 SPS parser using exp-golomb decoding.\n * Extracts pic_width_in_mbs_minus1 and pic_height_in_map_units_minus1.\n */\nfunction parseSpsInfo(sps: Uint8Array): SpsInfo {\n // SPS NAL unit: skip NAL header byte\n let bitOffset = 8 // skip nal_unit_type byte\n\n function readBit(): number {\n const byteIndex = bitOffset >> 3\n const bitIndex = 7 - (bitOffset & 7)\n bitOffset++\n return (sps[byteIndex] >> bitIndex) & 1\n }\n\n function readBits(n: number): number {\n let val = 0\n for (let i = 0; i < n; i++) {\n val = (val << 1) | readBit()\n }\n return val\n }\n\n function readUe(): number {\n let leadingZeros = 0\n while (readBit() === 0 && leadingZeros < 32) leadingZeros++\n if (leadingZeros === 0) return 0\n return (1 << leadingZeros) - 1 + readBits(leadingZeros)\n }\n\n function readSe(): number {\n const val = readUe()\n return val & 1 ? (val + 1) >> 1 : -(val >> 1)\n }\n\n // profile_idc\n const profileIdc = readBits(8)\n // constraint_set flags + reserved\n readBits(8)\n // level_idc\n readBits(8)\n // seq_parameter_set_id\n readUe()\n\n if (HIGH_PROFILE_IDCS.has(profileIdc)) {\n const chromaFormatIdc = readUe()\n if (chromaFormatIdc === 3) readBit() // separate_colour_plane_flag\n readUe() // bit_depth_luma_minus8\n readUe() // bit_depth_chroma_minus8\n readBit() // qpprime_y_zero_transform_bypass_flag\n const seqScalingMatrixPresent = readBit()\n if (seqScalingMatrixPresent) {\n const count = chromaFormatIdc !== 3 ? 8 : 12\n for (let i = 0; i < count; i++) {\n if (readBit()) {\n // 8x8 scaling lists (i >= 6) require a real H.264 encoder\n // to produce a valid SPS bitstream that survives the full\n // exp-golomb parser to this point.\n const size = i < 6 ? 16 : /* c8 ignore next */ 64\n let lastScale = 8\n let nextScale = 8\n for (let j = 0; j < size; j++) {\n if (nextScale !== 0) {\n const delta = readSe()\n nextScale = (lastScale + delta + 0x100) % 0x100\n }\n lastScale = nextScale === 0 ? lastScale : nextScale\n }\n }\n }\n }\n }\n\n readUe() // log2_max_frame_num_minus4\n const picOrderCntType = readUe()\n if (picOrderCntType === 0) {\n readUe() // log2_max_pic_order_cnt_lsb_minus4\n } else if (picOrderCntType === 1) {\n readBit() // delta_pic_order_always_zero_flag\n readSe() // offset_for_non_ref_pic\n readSe() // offset_for_top_to_bottom_field\n const numRefFrames = readUe()\n for (let i = 0; i < numRefFrames; i++) readSe()\n }\n\n readUe() // max_num_ref_frames\n readBit() // gaps_in_frame_num_value_allowed_flag\n\n const picWidthInMbsMinus1 = readUe()\n const picHeightInMapUnitsMinus1 = readUe()\n const frameMbsOnlyFlag = readBit()\n\n const width = (picWidthInMbsMinus1 + 1) * 16\n const height = (2 - frameMbsOnlyFlag) * (picHeightInMapUnitsMinus1 + 1) * 16\n\n return { width, height }\n}\n"],
|
|
4
|
+
"sourcesContent": ["/** Auto-generated from build scripts */\nexport * from './transmux/transmux'\nexport * from './transmux/sampleEntry'\nexport * from './mpegts/mpegts'\nexport * from './mp4/mp4'\nexport * from './aac/adts'\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * ADTS (Audio Data Transport Stream) frame parser for AAC.\n *\n * ADTS is the framing format used to carry AAC audio in MPEG-TS and raw .aac\n * files. Each frame starts with a 7-byte (or 9-byte with CRC) sync header\n * containing the audio object type, sample rate, and channel configuration\n * needed to construct the MP4 AudioSpecificConfig.\n *\n * @module\n */\n\nexport interface AdtsFrame {\n /** Offset of this frame within the source buffer. */\n readonly offset: number\n /** Total frame size including header. */\n readonly frameLength: number\n /** Size of the ADTS header (7 or 9 bytes). */\n readonly headerSize: number\n /** AAC audio object type (1 = AAC-LC, 2 = HE-AAC, etc.). */\n readonly audioObjectType: number\n /** Sampling frequency index (0-12). */\n readonly samplingFrequencyIndex: number\n /** Channel configuration (1 = mono, 2 = stereo, etc.). */\n readonly channelConfiguration: number\n}\n\nconst ADTS_SAMPLING_RATES = [\n 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025,\n 8000, 7350,\n]\n\n/**\n * Returns the sample rate in Hz for a given sampling frequency index.\n */\nexport function adtsSampleRate(index: number): number {\n return ADTS_SAMPLING_RATES[index] ?? 0\n}\n\n/**\n * Parses all ADTS frames from a buffer of raw AAC data.\n */\nexport function parseAdtsFrames(data: Uint8Array): AdtsFrame[] {\n const frames: AdtsFrame[] = []\n let offset = 0\n\n while (offset + 7 <= data.length) {\n // ADTS sync word: 0xFFF\n if (data[offset] !== 0xff || (data[offset + 1] & 0xf0) !== 0xf0) {\n offset++\n continue\n }\n\n const hasCrc = (data[offset + 1] & 0x01) === 0\n const headerSize = hasCrc ? 9 : 7\n\n const audioObjectType = ((data[offset + 2] >> 6) & 0x03) + 1\n const samplingFrequencyIndex = (data[offset + 2] >> 2) & 0x0f\n const channelConfiguration =\n ((data[offset + 2] & 0x01) << 2) | ((data[offset + 3] >> 6) & 0x03)\n\n const frameLength =\n ((data[offset + 3] & 0x03) << 11) |\n (data[offset + 4] << 3) |\n ((data[offset + 5] >> 5) & 0x07)\n\n if (frameLength < headerSize || offset + frameLength > data.length) {\n break\n }\n\n frames.push({\n offset,\n frameLength,\n headerSize,\n audioObjectType,\n samplingFrequencyIndex,\n channelConfiguration,\n })\n\n offset += frameLength\n }\n\n return frames\n}\n\n/**\n * Builds the AudioSpecificConfig (2 bytes) for an AAC-LC stream.\n * This is required in the MP4 esds box.\n */\nexport function buildAudioSpecificConfig(frame: AdtsFrame): Uint8Array {\n const config = new Uint8Array(2)\n config[0] =\n (frame.audioObjectType << 3) |\n ((frame.samplingFrequencyIndex & 0x0e) >> 1)\n config[1] =\n ((frame.samplingFrequencyIndex & 0x01) << 7) |\n (frame.channelConfiguration << 3)\n return config\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Codec-specific MP4 sample entry builders for AAC and H.264.\n *\n * These produce the sample entry boxes (mp4a, avc1) that are placed inside\n * the generic stsd box built by the mp4 layer.\n *\n * @module\n */\n\nimport { BufferWriter } from '@amazon/vinyl-util'\nimport { box, fullBox } from '../mp4/mp4'\n\n/** 72 dpi in 16.16 fixed point. */\nconst RESOLUTION_72_DPI = 0x00480000\n\n/** ESDS object type indication for AAC (ISO 14496-3). */\nconst OBJECT_TYPE_AAC = 0x40\n\n/** ESDS stream type for audio: (0x05 << 2) | 0x01. */\nconst STREAM_TYPE_AUDIO = 0x15\n\nexport interface AudioTrackConfig {\n readonly audioObjectType: number\n readonly samplingFrequencyIndex: number\n readonly channelConfiguration: number\n readonly sampleRate: number\n readonly audioSpecificConfig: Uint8Array\n}\n\nexport interface VideoTrackConfig {\n readonly width: number\n readonly height: number\n readonly sps: Uint8Array\n readonly pps: Uint8Array\n readonly profileIdc: number\n readonly profileCompatibility: number\n readonly levelIdc: number\n}\n\n/**\n * Builds an mp4a sample entry box for AAC audio.\n */\nexport function mp4aSampleEntry(config: AudioTrackConfig): Uint8Array {\n const writer = new BufferWriter(28)\n // 6 bytes reserved\n for (let i = 0; i < 6; i++) writer.writeUint8(0)\n writer.writeUint16(1) // data_reference_index\n // 8 bytes reserved\n for (let i = 0; i < 8; i++) writer.writeUint8(0)\n writer.writeUint16(config.channelConfiguration)\n writer.writeUint16(16) // sample_size\n writer.writeUint16(0) // pre_defined\n writer.writeUint16(0) // reserved\n writer.writeUint32(config.sampleRate << 16) // sample_rate (16.16)\n return box('mp4a', writer.toUint8Array(), esds(config))\n}\n\n/**\n * Builds an avc1 sample entry box for H.264 video.\n */\nexport function avc1SampleEntry(config: VideoTrackConfig): Uint8Array {\n const writer = new BufferWriter(78)\n // 6 bytes reserved\n for (let i = 0; i < 6; i++) writer.writeUint8(0)\n writer.writeUint16(1) // data_reference_index\n // 16 bytes pre_defined + reserved\n for (let i = 0; i < 16; i++) writer.writeUint8(0)\n writer.writeUint16(config.width)\n writer.writeUint16(config.height)\n writer.writeUint32(RESOLUTION_72_DPI)\n writer.writeUint32(RESOLUTION_72_DPI)\n writer.writeUint32(0) // reserved\n writer.writeUint16(1) // frame_count\n // 32 bytes compressorname\n for (let i = 0; i < 32; i++) writer.writeUint8(0)\n writer.writeUint16(0x0018) // depth = 24\n writer.writeInt16(-1) // pre_defined\n return box('avc1', writer.toUint8Array(), avcC(config))\n}\n\nfunction esds(config: AudioTrackConfig): Uint8Array {\n const asc = config.audioSpecificConfig\n\n // DecoderSpecificInfo (tag 0x05)\n const dsi = new BufferWriter(2 + asc.byteLength)\n dsi.writeUint8(0x05)\n dsi.writeUint8(asc.byteLength)\n dsi.writeBytes(asc)\n\n // DecoderConfigDescriptor (tag 0x04)\n const dcd = new BufferWriter(2 + 13 + dsi.position)\n dcd.writeUint8(0x04)\n dcd.writeUint8(13 + dsi.position)\n dcd.writeUint8(OBJECT_TYPE_AAC)\n dcd.writeUint8(STREAM_TYPE_AUDIO)\n dcd.writeUint8(0) // bufferSizeDB (3 bytes)\n dcd.writeUint8(0)\n dcd.writeUint8(0)\n dcd.writeUint32(0) // maxBitrate\n dcd.writeUint32(0) // avgBitrate\n dcd.writeBytes(dsi.toUint8Array())\n\n // SLConfigDescriptor (tag 0x06)\n const slc = new BufferWriter(3)\n slc.writeUint8(0x06)\n slc.writeUint8(1)\n slc.writeUint8(0x02) // predefined = 2\n\n // ES_Descriptor (tag 0x03)\n const esPayloadSize = 3 + dcd.position + slc.position\n const es = new BufferWriter(2 + esPayloadSize)\n es.writeUint8(0x03)\n es.writeUint8(esPayloadSize)\n es.writeUint16(1) // ES_ID\n es.writeUint8(0) // flags\n es.writeBytes(dcd.toUint8Array())\n es.writeBytes(slc.toUint8Array())\n\n return fullBox('esds', 0, 0, es.toUint8Array())\n}\n\nfunction avcC(config: VideoTrackConfig): Uint8Array {\n const writer = new BufferWriter(\n 11 + config.sps.byteLength + config.pps.byteLength\n )\n writer.writeUint8(1) // configurationVersion\n writer.writeUint8(config.profileIdc)\n writer.writeUint8(config.profileCompatibility)\n writer.writeUint8(config.levelIdc)\n writer.writeUint8(3) // lengthSizeMinusOne = 3 (4 bytes)\n writer.writeUint8(0xe1) // numOfSequenceParameterSets = 1\n writer.writeUint16(config.sps.byteLength)\n writer.writeBytes(config.sps)\n writer.writeUint8(1) // numOfPictureParameterSets\n writer.writeUint16(config.pps.byteLength)\n writer.writeBytes(config.pps)\n return box('avcC', writer.toUint8Array())\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * ISO BMFF (MP4) box writing utilities.\n *\n * Provides functions to construct the fMP4 boxes required by MSE:\n * - `ftyp`: file type\n * - `moov` / `mvhd` / `trak` / `mdia` / `minf` / `stbl`: track metadata\n * - `moof` / `mdat`: media fragments\n *\n * @module\n */\n\nimport { BufferWriter } from '@amazon/vinyl-util'\n\n/** ISO 14496-12 identity matrix in 16.16 / 2.30 fixed point. */\nconst UNITY_MATRIX = [\n 0x00010000, 0, 0, 0, 0x00010000, 0, 0, 0, 0x40000000,\n] as const\n\n/** 90 kHz timescale from ISO 13818-1 (MPEG system clock). */\nexport const MPEG_TIMESCALE = 90000\n\n/** ISO 639-2/T packed language code for 'und' (undetermined). */\nconst LANGUAGE_UNDETERMINED = 0x55c4\n\n/**\n * Writes a generic MP4 box (atom). The size field is automatically computed.\n */\nexport function box(type: string, ...payloads: Uint8Array[]): Uint8Array {\n let size = 8\n for (const p of payloads) size += p.byteLength\n const writer = new BufferWriter(size)\n writer.writeUint32(size)\n writer.writeString(type)\n for (const p of payloads) writer.writeBytes(p)\n return writer.toUint8Array()\n}\n\n/**\n * Writes a full box with version and flags.\n */\nexport function fullBox(\n type: string,\n version: number,\n flags: number,\n payload: Uint8Array\n): Uint8Array {\n const size = 12 + payload.byteLength\n const writer = new BufferWriter(size)\n writer.writeUint32(size)\n writer.writeString(type)\n writer.writeUint8(version)\n // 24-bit flags\n writer.writeUint8((flags >> 16) & 0xff)\n writer.writeUint8((flags >> 8) & 0xff)\n writer.writeUint8(flags & 0xff)\n writer.writeBytes(payload)\n return writer.toUint8Array()\n}\n\nexport interface FtypOptions {\n readonly majorBrand?: string\n readonly minorVersion?: number\n readonly compatibleBrands?: readonly string[]\n}\n\nconst DEFAULT_FTYP: Required<FtypOptions> = {\n majorBrand: 'isom',\n minorVersion: 0x200,\n compatibleBrands: ['isom', 'iso6', 'mp41'],\n}\n\n/**\n * Generates the ftyp box.\n */\nexport function ftyp(options?: FtypOptions): Uint8Array {\n const { majorBrand, minorVersion, compatibleBrands } = {\n ...DEFAULT_FTYP,\n ...options,\n }\n const writer = new BufferWriter(8 + compatibleBrands.length * 4)\n writer.writeString(majorBrand)\n writer.writeUint32(minorVersion)\n for (const brand of compatibleBrands) writer.writeString(brand)\n return box('ftyp', writer.toUint8Array())\n}\n\n/**\n * Generates a moov box from pre-built track boxes.\n */\nexport function moov(...traks: Uint8Array[]): Uint8Array {\n const trakAndMvex: Uint8Array[] = []\n for (let i = 0; i < traks.length; i++) {\n trakAndMvex.push(traks[i], mvex(i + 1))\n }\n return box('moov', mvhd(), ...trakAndMvex)\n}\n\nexport interface MvhdOptions {\n readonly timescale?: number\n readonly duration?: number\n readonly rate?: number\n readonly volume?: number\n}\n\nconst DEFAULT_MVHD: Required<MvhdOptions> = {\n timescale: MPEG_TIMESCALE,\n duration: 0,\n rate: 1.0,\n volume: 1.0,\n}\n\nfunction mvhd(options?: MvhdOptions): Uint8Array {\n const { timescale, duration, rate, volume } = {\n ...DEFAULT_MVHD,\n ...options,\n }\n const writer = new BufferWriter(96)\n writer.writeUint32(0) // creation_time\n writer.writeUint32(0) // modification_time\n writer.writeUint32(timescale)\n writer.writeUint32(duration)\n writer.writeUint32(rate * 0x10000) // 16.16 fixed point\n writer.writeUint16(volume * 0x100) // 8.8 fixed point\n // 10 bytes reserved\n for (let i = 0; i < 10; i++) writer.writeUint8(0)\n for (const v of UNITY_MATRIX) writer.writeUint32(v)\n // 6 x uint32 pre_defined\n for (let i = 0; i < 6; i++) writer.writeUint32(0)\n writer.writeUint32(0xffffffff) // next_track_ID\n return fullBox('mvhd', 0, 0, writer.toUint8Array())\n}\n\nexport interface AudioTrackOptions {\n readonly trackId: number\n readonly sampleRate: number\n readonly channelCount: number\n readonly sampleEntry: Uint8Array\n}\n\nexport interface VideoTrackOptions {\n readonly trackId: number\n readonly width: number\n readonly height: number\n readonly timescale?: number\n readonly sampleEntry: Uint8Array\n}\n\nexport function audioTrak(options: AudioTrackOptions): Uint8Array {\n return box(\n 'trak',\n tkhd(options.trackId, 0, 0, options.channelCount > 0 ? 1.0 : 0),\n box(\n 'mdia',\n mdhd(options.sampleRate),\n hdlr('soun', 'SoundHandler'),\n box('minf', smhd(), dinf(), audioStbl(options.sampleEntry))\n )\n )\n}\n\nexport function videoTrak(options: VideoTrackOptions): Uint8Array {\n return box(\n 'trak',\n tkhd(options.trackId, options.width, options.height, 0),\n box(\n 'mdia',\n mdhd(options.timescale ?? MPEG_TIMESCALE),\n hdlr('vide', 'VideoHandler'),\n box('minf', vmhd(), dinf(), videoStbl(options.sampleEntry))\n )\n )\n}\n\nfunction tkhd(\n trackId: number,\n width: number,\n height: number,\n volume: number\n): Uint8Array {\n const writer = new BufferWriter(80)\n writer.writeUint32(0) // creation_time\n writer.writeUint32(0) // modification_time\n writer.writeUint32(trackId)\n writer.writeUint32(0) // reserved\n writer.writeUint32(0) // duration\n writer.writeUint32(0) // reserved\n writer.writeUint32(0) // reserved\n writer.writeUint16(0) // layer\n writer.writeUint16(0) // alternate_group\n writer.writeUint16(volume * 0x100) // volume (8.8 fixed point)\n writer.writeUint16(0) // reserved\n // unity matrix\n for (const v of UNITY_MATRIX) writer.writeUint32(v)\n\n writer.writeUint32(width * 0x10000) // width (16.16 fixed point)\n writer.writeUint32(height * 0x10000) // height (16.16 fixed point)\n return fullBox('tkhd', 0, 0x000003, writer.toUint8Array())\n}\n\nfunction mdhd(timescale: number): Uint8Array {\n const writer = new BufferWriter(20)\n writer.writeUint32(0) // creation_time\n writer.writeUint32(0) // modification_time\n writer.writeUint32(timescale)\n writer.writeUint32(0) // duration\n writer.writeUint16(LANGUAGE_UNDETERMINED)\n writer.writeUint16(0) // pre_defined\n return fullBox('mdhd', 0, 0, writer.toUint8Array())\n}\n\nfunction hdlr(handlerType: string, name: string): Uint8Array {\n const writer = new BufferWriter(21 + name.length)\n writer.writeUint32(0) // pre_defined\n writer.writeString(handlerType)\n writer.writeUint32(0) // reserved\n writer.writeUint32(0) // reserved\n writer.writeUint32(0) // reserved\n writer.writeString(name)\n writer.writeUint8(0) // null terminator\n return fullBox('hdlr', 0, 0, writer.toUint8Array())\n}\n\nfunction smhd(): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint16(0) // balance\n writer.writeUint16(0) // reserved\n return fullBox('smhd', 0, 0, writer.toUint8Array())\n}\n\nfunction vmhd(): Uint8Array {\n const writer = new BufferWriter(8)\n writer.writeUint16(0) // graphicsmode\n writer.writeUint16(0) // opcolor\n writer.writeUint16(0)\n writer.writeUint16(0)\n return fullBox('vmhd', 0, 0x000001, writer.toUint8Array())\n}\n\nfunction dinf(): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(1) // entry_count\n const urlBox = fullBox('url ', 0, 0x000001, new Uint8Array(0))\n return box(\n 'dinf',\n fullBox('dref', 0, 0, concatUint8(writer.toUint8Array(), urlBox))\n )\n}\n\nfunction audioStbl(sampleEntry: Uint8Array): Uint8Array {\n return box('stbl', stsd(sampleEntry), stts(), stsc(), stsz(), stco())\n}\n\nfunction videoStbl(sampleEntry: Uint8Array): Uint8Array {\n return box('stbl', stsd(sampleEntry), stts(), stsc(), stsz(), stco())\n}\n\nfunction stsd(sampleEntry: Uint8Array): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(1) // entry_count\n return fullBox(\n 'stsd',\n 0,\n 0,\n concatUint8(writer.toUint8Array(), sampleEntry)\n )\n}\n\nfunction stts(): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(0) // entry_count\n return fullBox('stts', 0, 0, writer.toUint8Array())\n}\n\nfunction stsc(): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(0) // entry_count\n return fullBox('stsc', 0, 0, writer.toUint8Array())\n}\n\nfunction stsz(): Uint8Array {\n const writer = new BufferWriter(8)\n writer.writeUint32(0) // sample_size\n writer.writeUint32(0) // sample_count\n return fullBox('stsz', 0, 0, writer.toUint8Array())\n}\n\nfunction stco(): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(0) // entry_count\n return fullBox('stco', 0, 0, writer.toUint8Array())\n}\n\nfunction mvex(trackId: number): Uint8Array {\n return box('mvex', trex(trackId))\n}\n\nfunction trex(trackId: number): Uint8Array {\n const writer = new BufferWriter(20)\n writer.writeUint32(trackId)\n writer.writeUint32(1) // default_sample_description_index\n writer.writeUint32(0) // default_sample_duration\n writer.writeUint32(0) // default_sample_size\n writer.writeUint32(0) // default_sample_flags\n return fullBox('trex', 0, 0, writer.toUint8Array())\n}\n\nexport interface MoofOptions {\n readonly sequenceNumber: number\n readonly trackId: number\n readonly baseDecodeTime: number\n readonly samples: readonly SampleEntry[]\n}\n\nexport interface SampleEntry {\n readonly duration: number\n readonly size: number\n readonly flags?: number\n readonly compositionTimeOffset?: number\n}\n\n/**\n * Generates a moof (movie fragment) box.\n */\nexport function moof(options: MoofOptions): Uint8Array {\n return box('moof', mfhd(options.sequenceNumber), traf(options))\n}\n\nfunction mfhd(sequenceNumber: number): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(sequenceNumber)\n return fullBox('mfhd', 0, 0, writer.toUint8Array())\n}\n\nfunction traf(options: MoofOptions): Uint8Array {\n return box(\n 'traf',\n tfhd(options.trackId),\n tfdt(options.baseDecodeTime),\n trun(options.samples)\n )\n}\n\nfunction tfhd(trackId: number): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(trackId)\n // flags: default-base-is-moof (0x020000)\n return fullBox('tfhd', 0, 0x020000, writer.toUint8Array())\n}\n\nfunction tfdt(baseDecodeTime: number): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(baseDecodeTime)\n return fullBox('tfdt', 0, 0, writer.toUint8Array())\n}\n\nfunction trun(samples: readonly SampleEntry[]): Uint8Array {\n // flags: data-offset-present (0x01), sample-duration-present (0x100),\n // sample-size-present (0x200), sample-flags-present (0x400)\n const hasFlags = samples.some((s) => s.flags != null)\n const hasCto = samples.some((s) => s.compositionTimeOffset != null)\n let flags = 0x000001 | 0x000100 | 0x000200\n if (hasFlags) flags |= 0x000400\n if (hasCto) flags |= 0x000800\n\n let entrySize = 8 // duration + size\n if (hasFlags) entrySize += 4\n if (hasCto) entrySize += 4\n\n const writer = new BufferWriter(8 + samples.length * entrySize)\n writer.writeUint32(samples.length) // sample_count\n writer.writeUint32(0) // data_offset (placeholder, patched later)\n\n for (const sample of samples) {\n writer.writeUint32(sample.duration)\n writer.writeUint32(sample.size)\n if (hasFlags) writer.writeUint32(sample.flags ?? 0)\n if (hasCto) writer.writeInt32(sample.compositionTimeOffset ?? 0)\n }\n\n const result = fullBox('trun', hasCto ? 1 : 0, flags, writer.toUint8Array())\n return result\n}\n\n/**\n * Generates an mdat box wrapping raw media data.\n */\nexport function mdat(data: Uint8Array): Uint8Array {\n return box('mdat', data)\n}\n\n/**\n * Patches the trun data_offset field. The data_offset is the byte offset from\n * the start of the moof to the first byte of the mdat payload.\n */\nexport function patchDataOffset(moofData: Uint8Array, moofSize: number): void {\n // data_offset = moofSize + 8 (mdat header)\n const dataOffset = moofSize + 8\n // Find trun box and patch the data_offset field.\n // trun is inside moof > traf. Walk the box tree.\n let pos = 8 // skip moof header\n while (pos < moofData.length) {\n const boxSize =\n ((moofData[pos] << 24) |\n (moofData[pos + 1] << 16) |\n (moofData[pos + 2] << 8) |\n moofData[pos + 3]) >>>\n 0\n const boxType = String.fromCharCode(\n moofData[pos + 4],\n moofData[pos + 5],\n moofData[pos + 6],\n moofData[pos + 7]\n )\n if (boxType === 'traf') {\n // Recurse into traf\n let trafPos = pos + 8\n while (trafPos < pos + boxSize) {\n const innerSize =\n ((moofData[trafPos] << 24) |\n (moofData[trafPos + 1] << 16) |\n (moofData[trafPos + 2] << 8) |\n moofData[trafPos + 3]) >>>\n 0\n const innerType = String.fromCharCode(\n moofData[trafPos + 4],\n moofData[trafPos + 5],\n moofData[trafPos + 6],\n moofData[trafPos + 7]\n )\n if (innerType === 'trun') {\n // data_offset is at offset 12+4 = 16 from box start\n // (8 box header + 4 version/flags + 4 sample_count)\n const offsetPos = trafPos + 16\n moofData[offsetPos] = (dataOffset >> 24) & 0xff\n moofData[offsetPos + 1] = (dataOffset >> 16) & 0xff\n moofData[offsetPos + 2] = (dataOffset >> 8) & 0xff\n moofData[offsetPos + 3] = dataOffset & 0xff\n return\n }\n trafPos += innerSize\n }\n }\n pos += boxSize\n }\n}\n\nfunction concatUint8(...arrays: Uint8Array[]): Uint8Array {\n let total = 0\n for (const a of arrays) total += a.byteLength\n const result = new Uint8Array(total)\n let offset = 0\n for (const a of arrays) {\n result.set(a, offset)\n offset += a.byteLength\n }\n return result\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * MPEG-TS constants and packet-level parsing.\n *\n * An MPEG Transport Stream consists of fixed 188-byte packets. Each packet\n * starts with a sync byte (0x47) and carries a 13-bit PID identifying the\n * elementary stream. The PAT (PID 0) maps program numbers to PMT PIDs, and\n * the PMT lists the elementary stream PIDs with their stream types.\n *\n * @module\n */\n\nexport const TS_PACKET_SIZE = 188\nexport const TS_SYNC_BYTE = 0x47\n\n/** Well-known stream type identifiers from ISO/IEC 13818-1. */\nexport const STREAM_TYPE_AAC = 0x0f\nexport const STREAM_TYPE_H264 = 0x1b\nexport const STREAM_TYPE_H265 = 0x24\nexport const STREAM_TYPE_ID3 = 0x15\n\nexport interface TsPacketHeader {\n readonly pid: number\n readonly payloadUnitStartIndicator: boolean\n readonly adaptationFieldControl: number\n readonly continuityCounter: number\n}\n\nexport interface PmtEntry {\n readonly pid: number\n readonly streamType: number\n}\n\n/**\n * Parses a single 188-byte TS packet header.\n */\nexport function parseTsPacketHeader(\n data: Uint8Array,\n offset: number\n): TsPacketHeader {\n const byte1 = data[offset + 1]\n const byte2 = data[offset + 2]\n const byte3 = data[offset + 3]\n return {\n pid: ((byte1 & 0x1f) << 8) | byte2,\n payloadUnitStartIndicator: (byte1 & 0x40) !== 0,\n adaptationFieldControl: (byte3 >> 4) & 0x03,\n continuityCounter: byte3 & 0x0f,\n }\n}\n\n/**\n * Returns the offset of the payload within a TS packet.\n */\nexport function getPayloadOffset(\n data: Uint8Array,\n offset: number,\n adaptationFieldControl: number\n): number {\n let payloadOffset = offset + 4\n if (adaptationFieldControl >= 2) {\n // Adaptation field present\n payloadOffset += 1 + data[offset + 4]\n }\n return payloadOffset\n}\n\n/**\n * Parses the PAT (Program Association Table) to find the PMT PID.\n */\nexport function parsePat(data: Uint8Array, offset: number): number {\n // Skip pointer field\n const pointerField = data[offset]\n let pos = offset + 1 + pointerField\n // Skip table_id(1), section_syntax_indicator+length(2), transport_stream_id(2),\n // version/current(1), section_number(1), last_section_number(1)\n pos += 8\n // First program entry: program_number(2) + PMT_PID(2)\n // Skip program_number\n pos += 2\n return ((data[pos] & 0x1f) << 8) | data[pos + 1]\n}\n\n/**\n * Parses the PMT (Program Map Table) to extract elementary stream entries.\n */\nexport function parsePmt(data: Uint8Array, offset: number): PmtEntry[] {\n const pointerField = data[offset]\n let pos = offset + 1 + pointerField\n\n // table_id(1)\n pos += 1\n const sectionLength = ((data[pos] & 0x0f) << 8) | data[pos + 1]\n pos += 2\n const sectionEnd = pos + sectionLength\n // transport_stream_id(2), version/current(1), section_number(1), last_section_number(1)\n pos += 5\n // PCR_PID(2)\n pos += 2\n // program_info_length\n const programInfoLength = ((data[pos] & 0x0f) << 8) | data[pos + 1]\n pos += 2 + programInfoLength\n\n const entries: PmtEntry[] = []\n // -4 for CRC32\n while (pos < sectionEnd - 4) {\n const streamType = data[pos]\n pos += 1\n const pid = ((data[pos] & 0x1f) << 8) | data[pos + 1]\n pos += 2\n const esInfoLength = ((data[pos] & 0x0f) << 8) | data[pos + 1]\n pos += 2 + esInfoLength\n entries.push({ pid, streamType })\n }\n return entries\n}\n\nexport interface DemuxedStream {\n readonly streamType: number\n readonly pid: number\n readonly data: Uint8Array[]\n}\n\n/**\n * Demuxes a complete MPEG-TS segment into elementary streams.\n * Reassembles PES packets from TS packets for each PID.\n */\nexport function demuxTsSegment(segment: Uint8Array): DemuxedStream[] {\n let pmtPid = -1\n const pmtEntries: PmtEntry[] = []\n const pesBuffers = new Map<number, Uint8Array[]>()\n\n // First pass: find PAT and PMT\n for (let i = 0; i + TS_PACKET_SIZE <= segment.length; i += TS_PACKET_SIZE) {\n if (segment[i] !== TS_SYNC_BYTE) continue\n const header = parseTsPacketHeader(segment, i)\n const payloadStart = getPayloadOffset(\n segment,\n i,\n header.adaptationFieldControl\n )\n if (\n header.adaptationFieldControl === 0 ||\n header.adaptationFieldControl === 2\n )\n continue\n\n if (header.pid === 0) {\n pmtPid = parsePat(segment, payloadStart)\n } else if (header.pid === pmtPid && pmtEntries.length === 0) {\n pmtEntries.push(...parsePmt(segment, payloadStart))\n }\n }\n\n // Initialize buffers for known elementary streams\n const pidToStreamType = new Map<number, number>()\n for (const entry of pmtEntries) {\n pidToStreamType.set(entry.pid, entry.streamType)\n pesBuffers.set(entry.pid, [])\n }\n\n // Second pass: collect PES data\n for (let i = 0; i + TS_PACKET_SIZE <= segment.length; i += TS_PACKET_SIZE) {\n if (segment[i] !== TS_SYNC_BYTE) continue\n const header = parseTsPacketHeader(segment, i)\n if (\n header.adaptationFieldControl === 0 ||\n header.adaptationFieldControl === 2\n )\n continue\n\n const buffers = pesBuffers.get(header.pid)\n if (!buffers) continue\n\n const payloadStart = getPayloadOffset(\n segment,\n i,\n header.adaptationFieldControl\n )\n const payloadEnd = i + TS_PACKET_SIZE\n if (payloadStart < payloadEnd) {\n buffers.push(segment.slice(payloadStart, payloadEnd))\n }\n }\n\n const streams: DemuxedStream[] = []\n for (const [pid, buffers] of pesBuffers) {\n if (buffers.length === 0) continue\n streams.push({\n pid,\n streamType: pidToStreamType.get(pid)!,\n data: buffers,\n })\n }\n return streams\n}\n\n/**\n * Concatenates an array of Uint8Arrays into a single Uint8Array.\n */\nexport function concatBuffers(buffers: Uint8Array[]): Uint8Array {\n let totalLength = 0\n for (const buf of buffers) totalLength += buf.byteLength\n const result = new Uint8Array(totalLength)\n let offset = 0\n for (const buf of buffers) {\n result.set(buf, offset)\n offset += buf.byteLength\n }\n return result\n}\n\n/**\n * Strips the PES header from raw PES packet data, returning the elementary\n * stream payload.\n */\nexport function stripPesHeader(pesData: Uint8Array): Uint8Array {\n // PES start code: 0x00 0x00 0x01\n if (pesData[0] !== 0 || pesData[1] !== 0 || pesData[2] !== 1) {\n // No PES header, return as-is (continuation data)\n return pesData\n }\n // PES header data length is at byte 8\n const pesHeaderDataLength = pesData[8]\n return pesData.subarray(9 + pesHeaderDataLength)\n}\n\n/**\n * Extracts the PTS (Presentation Time Stamp) from a PES header.\n * Returns the PTS in 90kHz clock ticks, or -1 if not present.\n */\nexport function parsePesPts(pesData: Uint8Array): number {\n if (pesData[0] !== 0 || pesData[1] !== 0 || pesData[2] !== 1) return -1\n const flags = pesData[7]\n if ((flags & 0x80) === 0) return -1\n // PTS is encoded in 5 bytes starting at byte 9\n const byte9 = pesData[9]\n const byte10 = pesData[10]\n const byte11 = pesData[11]\n const byte12 = pesData[12]\n const byte13 = pesData[13]\n return (\n (byte9 & 0x0e) * 0x20000000 + // (byte9 & 0x0E) << 29\n ((byte10 & 0xff) << 22) +\n ((byte11 & 0xfe) << 14) +\n ((byte12 & 0xff) << 7) +\n ((byte13 & 0xfe) >>> 1)\n )\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Transmuxer that converts MPEG-TS / raw ADTS AAC segments into fMP4\n * fragments consumable by MSE SourceBuffer.\n *\n * The transmuxer produces two outputs:\n * 1. An initialization segment (ftyp + moov) \u2014 append once per track.\n * 2. Media segments (moof + mdat) \u2014 append per HLS segment.\n *\n * @module\n */\n\nimport {\n type AdtsFrame,\n adtsSampleRate,\n buildAudioSpecificConfig,\n parseAdtsFrames,\n} from '../aac/adts'\nimport {\n type AudioTrackConfig,\n type VideoTrackConfig,\n mp4aSampleEntry,\n avc1SampleEntry,\n} from './sampleEntry'\nimport {\n type SampleEntry,\n audioTrak,\n ftyp,\n mdat,\n moov,\n moof,\n patchDataOffset,\n videoTrak,\n MPEG_TIMESCALE,\n} from '../mp4/mp4'\nimport {\n STREAM_TYPE_AAC,\n STREAM_TYPE_H264,\n concatBuffers,\n demuxTsSegment,\n parsePesPts,\n} from '../mpegts/mpegts'\n\nexport interface TransmuxResult {\n /** The initialization segment (ftyp + moov). Always present. */\n readonly initSegment: ArrayBuffer\n /** The media segment (moof + mdat). */\n readonly mediaSegment: ArrayBuffer\n /** Duration of this segment in seconds. */\n readonly duration: number\n}\n\ninterface TrackState {\n initSegment: Uint8Array | null\n sequenceNumber: number\n audioConfig: AudioTrackConfig | null\n videoConfig: VideoTrackConfig | null\n audioDecodeTime: number\n videoDecodeTime: number\n}\n\n/**\n * Creates a stateful transmuxer instance. Call `transmux()` for each HLS\n * segment in order. The init segment is always returned (cached after first\n * call).\n */\nexport function createTransmuxer() {\n const state: TrackState = {\n initSegment: null,\n sequenceNumber: 1,\n audioConfig: null,\n videoConfig: null,\n audioDecodeTime: 0,\n videoDecodeTime: 0,\n }\n\n return { transmux: (data: ArrayBuffer) => transmux(state, data) }\n}\n\n/**\n * Builds the ftyp + moov init segment and stores it in state.\n */\nfunction buildInitSegment(state: TrackState, moovBox: Uint8Array): void {\n const ftypBox = ftyp()\n const init = new Uint8Array(ftypBox.byteLength + moovBox.byteLength)\n init.set(ftypBox, 0)\n init.set(moovBox, ftypBox.byteLength)\n state.initSegment = init\n}\n\n/** Returns the cached init segment as an ArrayBuffer. */\nfunction getInitSegment(state: TrackState): ArrayBuffer {\n const init = state.initSegment!\n return init.buffer.slice(\n init.byteOffset,\n init.byteOffset + init.byteLength\n ) as ArrayBuffer\n}\n\nfunction transmux(state: TrackState, data: ArrayBuffer): TransmuxResult {\n let segment: Uint8Array = new Uint8Array(data)\n\n // Skip ID3 tags that may precede the audio/video data.\n // ID3 tags are common in HLS for carrying timestamps.\n segment = skipId3Tags(segment)\n\n // Detect format: MPEG-TS starts with 0x47, ADTS starts with 0xFFF\n const isMpegTs = segment[0] === 0x47\n const isAdts = segment[0] === 0xff && (segment[1] & 0xf0) === 0xf0\n\n if (isMpegTs) {\n return transmuxMpegTs(state, segment)\n } else if (isAdts) {\n return transmuxAdts(state, segment)\n }\n\n throw new Error('Unsupported segment format: expected MPEG-TS or ADTS')\n}\n\n/**\n * Skips any leading ID3v2 tags. Each tag has a 10-byte header where bytes\n * 6-9 encode the size as a synchsafe integer.\n */\nfunction skipId3Tags(data: Uint8Array): Uint8Array {\n let offset = 0\n while (\n offset + 10 <= data.length &&\n data[offset] === 0x49 && // 'I'\n data[offset + 1] === 0x44 && // 'D'\n data[offset + 2] === 0x33 // '3'\n ) {\n const size =\n ((data[offset + 6] & 0x7f) << 21) |\n ((data[offset + 7] & 0x7f) << 14) |\n ((data[offset + 8] & 0x7f) << 7) |\n (data[offset + 9] & 0x7f)\n offset += 10 + size\n }\n return offset > 0 ? data.subarray(offset) : data\n}\n\nfunction transmuxAdts(state: TrackState, data: Uint8Array): TransmuxResult {\n const frames = parseAdtsFrames(data)\n if (frames.length === 0) {\n throw new Error('No ADTS frames found in segment')\n }\n\n const firstFrame = frames[0]\n\n if (!state.audioConfig) {\n const sampleRate = adtsSampleRate(firstFrame.samplingFrequencyIndex)\n state.audioConfig = {\n audioObjectType: firstFrame.audioObjectType,\n samplingFrequencyIndex: firstFrame.samplingFrequencyIndex,\n channelConfiguration: firstFrame.channelConfiguration,\n sampleRate,\n audioSpecificConfig: buildAudioSpecificConfig(firstFrame),\n }\n buildInitSegment(\n state,\n moov(\n audioTrak({\n trackId: 1,\n sampleRate: state.audioConfig.sampleRate,\n channelCount: state.audioConfig.channelConfiguration,\n sampleEntry: mp4aSampleEntry(state.audioConfig),\n })\n )\n )\n }\n\n const sampleRate = state.audioConfig.sampleRate\n const samplesPerFrame = 1024 // AAC-LC always uses 1024 samples per frame\n\n // Build sample table and raw frame data\n const samples: SampleEntry[] = []\n const frameDataParts: Uint8Array[] = []\n\n for (const frame of frames) {\n const rawData = data.subarray(\n frame.offset + frame.headerSize,\n frame.offset + frame.frameLength\n )\n samples.push({\n duration: samplesPerFrame,\n size: rawData.byteLength,\n })\n frameDataParts.push(rawData)\n }\n\n const rawMediaData = concatBuffers(frameDataParts)\n const duration = (frames.length * samplesPerFrame) / sampleRate\n\n const moofBox = moof({\n sequenceNumber: state.sequenceNumber++,\n trackId: 1,\n baseDecodeTime: state.audioDecodeTime,\n samples,\n })\n state.audioDecodeTime += frames.length * samplesPerFrame\n patchDataOffset(moofBox, moofBox.byteLength)\n const mdatBox = mdat(rawMediaData)\n\n const mediaSegment = new Uint8Array(moofBox.byteLength + mdatBox.byteLength)\n mediaSegment.set(moofBox, 0)\n mediaSegment.set(mdatBox, moofBox.byteLength)\n\n return {\n initSegment: getInitSegment(state),\n mediaSegment: mediaSegment.buffer.slice(\n mediaSegment.byteOffset,\n mediaSegment.byteOffset + mediaSegment.byteLength\n ),\n duration,\n }\n}\n\nfunction transmuxMpegTs(state: TrackState, data: Uint8Array): TransmuxResult {\n const streams = demuxTsSegment(data)\n\n const audioStream = streams.find((s) => s.streamType === STREAM_TYPE_AAC)\n const videoStream = streams.find((s) => s.streamType === STREAM_TYPE_H264)\n\n // Process audio\n let audioFrames: AdtsFrame[] = []\n let audioRawData: Uint8Array | null = null\n let audioConfig = state.audioConfig\n\n if (audioStream) {\n const pesData = concatBuffers(audioStream.data)\n const esData = extractElementaryStream(pesData)\n audioFrames = parseAdtsFrames(esData)\n\n if (audioFrames.length > 0 && !audioConfig) {\n const firstFrame = audioFrames[0]\n const sampleRate = adtsSampleRate(firstFrame.samplingFrequencyIndex)\n audioConfig = {\n audioObjectType: firstFrame.audioObjectType,\n samplingFrequencyIndex: firstFrame.samplingFrequencyIndex,\n channelConfiguration: firstFrame.channelConfiguration,\n sampleRate,\n audioSpecificConfig: buildAudioSpecificConfig(firstFrame),\n }\n state.audioConfig = audioConfig\n }\n\n // Strip ADTS headers from frames\n const parts: Uint8Array[] = []\n for (const frame of audioFrames) {\n parts.push(\n esData.subarray(\n frame.offset + frame.headerSize,\n frame.offset + frame.frameLength\n )\n )\n }\n audioRawData = concatBuffers(parts)\n }\n\n // Process video\n let videoNalus: Uint8Array[] = []\n let videoConfig = state.videoConfig\n let videoFrameDuration = 3754 // default ~23.976fps at 90kHz\n const videoPtsList: number[] = []\n\n if (videoStream) {\n const pesData = concatBuffers(videoStream.data)\n\n // Extract PTS timestamps from PES headers to compute frame duration and CTOs\n let pesOff = 0\n while (pesOff + 9 < pesData.length) {\n if (\n pesData[pesOff] === 0 &&\n pesData[pesOff + 1] === 0 &&\n pesData[pesOff + 2] === 1 &&\n pesData[pesOff + 3] >= 0xbc\n ) {\n const pts = parsePesPts(pesData.subarray(pesOff))\n if (pts >= 0) videoPtsList.push(pts)\n const pLen = (pesData[pesOff + 4] << 8) | pesData[pesOff + 5]\n if (pLen > 0) {\n pesOff += 6 + pLen\n } else {\n const hdrLen = pesData[pesOff + 8]\n pesOff += 9 + hdrLen\n }\n } else {\n pesOff++\n }\n }\n if (videoPtsList.length >= 2) {\n // Compute frame duration from sorted PTS deltas\n const sorted = [...videoPtsList].sort((a, b) => a - b)\n const deltas: number[] = []\n for (let i = 1; i < sorted.length; i++)\n deltas.push(sorted[i] - sorted[i - 1])\n deltas.sort((a, b) => a - b)\n videoFrameDuration = deltas[deltas.length >> 1] || 3754\n }\n\n const esData = extractElementaryStream(pesData)\n videoNalus = extractH264Nalus(esData)\n\n if (!videoConfig) {\n const sps = videoNalus.find((n) => (n[0] & 0x1f) === 7)\n const pps = videoNalus.find((n) => (n[0] & 0x1f) === 8)\n if (sps && pps) {\n const { width, height } = parseSpsInfo(sps)\n videoConfig = {\n width,\n height,\n sps,\n pps,\n profileIdc: sps[1],\n profileCompatibility: sps[2],\n levelIdc: sps[3],\n }\n state.videoConfig = videoConfig\n }\n }\n }\n\n // Generate init segment if needed\n if (!state.initSegment && (audioConfig || videoConfig)) {\n const traks: Uint8Array[] = []\n if (videoConfig) {\n traks.push(\n videoTrak({\n trackId: traks.length + 1,\n width: videoConfig.width,\n height: videoConfig.height,\n sampleEntry: avc1SampleEntry(videoConfig),\n })\n )\n }\n if (audioConfig) {\n traks.push(\n audioTrak({\n trackId: traks.length + 1,\n sampleRate: audioConfig.sampleRate,\n channelCount: audioConfig.channelConfiguration,\n sampleEntry: mp4aSampleEntry(audioConfig),\n })\n )\n }\n buildInitSegment(state, moov(...traks))\n }\n\n // Build media segment - for now handle audio track (trackId=1 for video, 2 for audio in muxed)\n const fragments: Uint8Array[] = []\n let duration = 0\n\n if (videoConfig && videoNalus.length > 0) {\n const trackId = 1\n\n // Group NAL units into access units. Each IDR or non-IDR slice\n // starts a new access unit. SPS/PPS are prepended to the next IDR.\n const accessUnits: { nalus: Uint8Array[]; isIdr: boolean }[] = []\n let pendingParams: Uint8Array[] = []\n\n for (const nalu of videoNalus) {\n const naluType = nalu[0] & 0x1f\n if (naluType === 7 || naluType === 8) {\n // SPS or PPS - buffer for next IDR\n pendingParams.push(nalu)\n } else if (naluType === 6) {\n // SEI - attach to next slice's access unit\n pendingParams.push(nalu)\n } else if (naluType === 5) {\n // IDR slice - include SPS/PPS/SEI before it\n accessUnits.push({\n nalus: [...pendingParams, nalu],\n isIdr: true,\n })\n pendingParams = []\n } else if (naluType === 1) {\n // Non-IDR slice - include any pending SEI\n accessUnits.push({\n nalus:\n pendingParams.length > 0\n ? [...pendingParams, nalu]\n : [nalu],\n isIdr: false,\n })\n pendingParams = []\n }\n // Skip other NAL types (SEI, AUD, etc.)\n }\n\n if (accessUnits.length > 0) {\n const naluParts: Uint8Array[] = []\n const samples: SampleEntry[] = []\n const frameDuration = videoFrameDuration\n\n // Compute composition time offsets from PTS.\n // DTS increases linearly; CTO = PTS - DTS.\n const basePts =\n videoPtsList.length > 0 ? Math.min(...videoPtsList) : 0\n const baseDts = basePts // first DTS = first PTS for simplicity\n\n for (let auIdx = 0; auIdx < accessUnits.length; auIdx++) {\n const au = accessUnits[auIdx]\n // Concatenate all NAL units in this access unit with length prefixes\n let auSize = 0\n const auParts: Uint8Array[] = []\n for (const nalu of au.nalus) {\n const lengthPrefixed = new Uint8Array(4 + nalu.byteLength)\n lengthPrefixed[0] = (nalu.byteLength >> 24) & 0xff\n lengthPrefixed[1] = (nalu.byteLength >> 16) & 0xff\n lengthPrefixed[2] = (nalu.byteLength >> 8) & 0xff\n lengthPrefixed[3] = nalu.byteLength & 0xff\n lengthPrefixed.set(nalu, 4)\n auParts.push(lengthPrefixed)\n auSize += lengthPrefixed.byteLength\n }\n naluParts.push(...auParts)\n\n samples.push({\n duration: frameDuration,\n size: auSize,\n // is_leading=0, depends_on: IDR=2(no), non-IDR=1(yes),\n // is_depended_on=0, has_redundancy=0\n flags: au.isIdr ? 0x02000000 : 0x01010000,\n compositionTimeOffset:\n auIdx < videoPtsList.length\n ? videoPtsList[auIdx] -\n (baseDts + auIdx * frameDuration)\n : 0,\n })\n }\n\n const rawData = concatBuffers(naluParts)\n const moofBox = moof({\n sequenceNumber: state.sequenceNumber++,\n trackId,\n baseDecodeTime: state.videoDecodeTime,\n samples,\n })\n state.videoDecodeTime += accessUnits.length * frameDuration\n patchDataOffset(moofBox, moofBox.byteLength)\n const mdatBox = mdat(rawData)\n fragments.push(moofBox, mdatBox)\n duration = (accessUnits.length * frameDuration) / MPEG_TIMESCALE\n }\n }\n\n if (audioConfig && audioRawData && audioFrames.length > 0) {\n const trackId = videoConfig ? 2 : 1\n const samplesPerFrame = 1024\n const samples: SampleEntry[] = []\n const parts: Uint8Array[] = []\n let offset = 0\n\n for (const frame of audioFrames) {\n const size = frame.frameLength - frame.headerSize\n parts.push(audioRawData.subarray(offset, offset + size))\n samples.push({\n duration: samplesPerFrame,\n size,\n })\n offset += size\n }\n\n const rawData = concatBuffers(parts)\n const moofBox = moof({\n sequenceNumber: state.sequenceNumber++,\n trackId,\n baseDecodeTime: state.audioDecodeTime,\n samples,\n })\n state.audioDecodeTime += audioFrames.length * samplesPerFrame\n patchDataOffset(moofBox, moofBox.byteLength)\n const mdatBox = mdat(rawData)\n fragments.push(moofBox, mdatBox)\n\n const audioDuration =\n (audioFrames.length * samplesPerFrame) / audioConfig.sampleRate\n if (audioDuration > duration) duration = audioDuration\n }\n\n const mediaSegment = concatBuffers(fragments)\n\n return {\n initSegment: getInitSegment(state),\n mediaSegment: mediaSegment.buffer.slice(\n mediaSegment.byteOffset,\n mediaSegment.byteOffset + mediaSegment.byteLength\n ) as ArrayBuffer,\n duration,\n }\n}\n\n/**\n * Extracts the elementary stream from concatenated PES packet data.\n * Handles multiple PES packets within the buffer.\n */\nfunction extractElementaryStream(pesData: Uint8Array): Uint8Array {\n const parts: Uint8Array[] = []\n let offset = 0\n\n while (offset < pesData.length) {\n if (\n offset + 9 <= pesData.length &&\n pesData[offset] === 0 &&\n pesData[offset + 1] === 0 &&\n pesData[offset + 2] === 1 &&\n pesData[offset + 3] >= 0xbc // PES stream IDs start at 0xBC\n ) {\n const headerDataLength = pesData[offset + 8]\n const payloadStart = offset + 9 + headerDataLength\n const pesPacketLength =\n (pesData[offset + 4] << 8) | pesData[offset + 5]\n\n if (pesPacketLength > 0) {\n const pesEnd = Math.min(\n offset + 6 + pesPacketLength,\n pesData.length\n )\n if (payloadStart < pesEnd) {\n parts.push(pesData.subarray(payloadStart, pesEnd))\n }\n offset = pesEnd\n } else {\n // Unknown length \u2014 scan for next PES header (00 00 01 + stream_id >= 0xBC)\n let nextPes = payloadStart\n while (nextPes + 3 < pesData.length) {\n if (\n pesData[nextPes] === 0 &&\n pesData[nextPes + 1] === 0 &&\n pesData[nextPes + 2] === 1 &&\n pesData[nextPes + 3] >= 0xbc\n ) {\n break\n }\n nextPes++\n }\n if (nextPes + 3 >= pesData.length) nextPes = pesData.length\n if (payloadStart < nextPes) {\n parts.push(pesData.subarray(payloadStart, nextPes))\n }\n offset = nextPes\n }\n } else {\n offset++\n }\n }\n\n return concatBuffers(parts)\n}\n\n/**\n * Extracts H.264 NAL units from an Annex B byte stream.\n * Properly handles 3-byte and 4-byte start codes and trims trailing zeros\n * that may result from TS packet padding.\n */\nfunction extractH264Nalus(data: Uint8Array): Uint8Array[] {\n const nalus: Uint8Array[] = []\n\n // Find all start code positions\n const startPositions: { offset: number; scLen: number }[] = []\n let i = 0\n while (i < data.length - 2) {\n if (data[i] === 0 && data[i + 1] === 0) {\n if (i + 3 < data.length && data[i + 2] === 0 && data[i + 3] === 1) {\n startPositions.push({ offset: i, scLen: 4 })\n i += 4\n } else if (data[i + 2] === 1) {\n startPositions.push({ offset: i, scLen: 3 })\n i += 3\n } else {\n i++\n }\n } else {\n i++\n }\n }\n\n for (let j = 0; j < startPositions.length; j++) {\n const naluStart = startPositions[j].offset + startPositions[j].scLen\n const naluEnd =\n j + 1 < startPositions.length\n ? startPositions[j + 1].offset\n : data.length\n\n // Trim trailing zeros (TS packet padding)\n let trimmedEnd = naluEnd\n while (trimmedEnd > naluStart + 1 && data[trimmedEnd - 1] === 0) {\n trimmedEnd--\n }\n\n if (trimmedEnd > naluStart) {\n nalus.push(data.subarray(naluStart, trimmedEnd))\n }\n }\n\n return nalus\n}\n\ninterface SpsInfo {\n readonly width: number\n readonly height: number\n}\n\n/**\n * H.264 profiles that include the high-profile SPS extensions\n * (chroma format, bit depth, scaling matrices).\n */\nconst HIGH_PROFILE_IDCS = /* @__PURE__ */ new Set([\n 100, 110, 122, 244, 44, 83, 86, 118, 128, 138, 139, 134,\n])\n\n/**\n * Minimal H.264 SPS parser using exp-golomb decoding.\n * Extracts pic_width_in_mbs_minus1 and pic_height_in_map_units_minus1.\n */\nfunction parseSpsInfo(sps: Uint8Array): SpsInfo {\n // SPS NAL unit: skip NAL header byte\n let bitOffset = 8 // skip nal_unit_type byte\n\n function readBit(): number {\n const byteIndex = bitOffset >> 3\n const bitIndex = 7 - (bitOffset & 7)\n bitOffset++\n return (sps[byteIndex] >> bitIndex) & 1\n }\n\n function readBits(n: number): number {\n let val = 0\n for (let i = 0; i < n; i++) {\n val = (val << 1) | readBit()\n }\n return val\n }\n\n function readUe(): number {\n let leadingZeros = 0\n while (readBit() === 0 && leadingZeros < 32) leadingZeros++\n if (leadingZeros === 0) return 0\n return (1 << leadingZeros) - 1 + readBits(leadingZeros)\n }\n\n function readSe(): number {\n const val = readUe()\n return val & 1 ? (val + 1) >> 1 : -(val >> 1)\n }\n\n // profile_idc\n const profileIdc = readBits(8)\n // constraint_set flags + reserved\n readBits(8)\n // level_idc\n readBits(8)\n // seq_parameter_set_id\n readUe()\n\n if (HIGH_PROFILE_IDCS.has(profileIdc)) {\n const chromaFormatIdc = readUe()\n if (chromaFormatIdc === 3) readBit() // separate_colour_plane_flag\n readUe() // bit_depth_luma_minus8\n readUe() // bit_depth_chroma_minus8\n readBit() // qpprime_y_zero_transform_bypass_flag\n const seqScalingMatrixPresent = readBit()\n if (seqScalingMatrixPresent) {\n const count = chromaFormatIdc !== 3 ? 8 : 12\n for (let i = 0; i < count; i++) {\n if (readBit()) {\n // 8x8 scaling lists (i >= 6) require a real H.264 encoder\n // to produce a valid SPS bitstream that survives the full\n // exp-golomb parser to this point.\n const size = i < 6 ? 16 : /* c8 ignore next */ 64\n let lastScale = 8\n let nextScale = 8\n for (let j = 0; j < size; j++) {\n if (nextScale !== 0) {\n const delta = readSe()\n nextScale = (lastScale + delta + 0x100) % 0x100\n }\n lastScale = nextScale === 0 ? lastScale : nextScale\n }\n }\n }\n }\n }\n\n readUe() // log2_max_frame_num_minus4\n const picOrderCntType = readUe()\n if (picOrderCntType === 0) {\n readUe() // log2_max_pic_order_cnt_lsb_minus4\n } else if (picOrderCntType === 1) {\n readBit() // delta_pic_order_always_zero_flag\n readSe() // offset_for_non_ref_pic\n readSe() // offset_for_top_to_bottom_field\n const numRefFrames = readUe()\n for (let i = 0; i < numRefFrames; i++) readSe()\n }\n\n readUe() // max_num_ref_frames\n readBit() // gaps_in_frame_num_value_allowed_flag\n\n const picWidthInMbsMinus1 = readUe()\n const picHeightInMapUnitsMinus1 = readUe()\n const frameMbsOnlyFlag = readBit()\n\n const width = (picWidthInMbsMinus1 + 1) * 16\n const height = (2 - frameMbsOnlyFlag) * (picHeightInMapUnitsMinus1 + 1) * 16\n\n return { width, height }\n}\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": ["import_vinyl_util", "sampleRate"]
|
|
7
7
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/aac/adts.ts", "../src/transmux/sampleEntry.ts", "../src/mp4/mp4.ts", "../src/mpegts/mpegts.ts", "../src/transmux/transmux.ts"],
|
|
4
|
-
"sourcesContent": ["/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * ADTS (Audio Data Transport Stream) frame parser for AAC.\n *\n * ADTS is the framing format used to carry AAC audio in MPEG-TS and raw .aac\n * files. Each frame starts with a 7-byte (or 9-byte with CRC) sync header\n * containing the audio object type, sample rate, and channel configuration\n * needed to construct the MP4 AudioSpecificConfig.\n *\n * @module\n */\n\nexport interface AdtsFrame {\n /** Offset of this frame within the source buffer. */\n readonly offset: number\n /** Total frame size including header. */\n readonly frameLength: number\n /** Size of the ADTS header (7 or 9 bytes). */\n readonly headerSize: number\n /** AAC audio object type (1 = AAC-LC, 2 = HE-AAC, etc.). */\n readonly audioObjectType: number\n /** Sampling frequency index (0-12). */\n readonly samplingFrequencyIndex: number\n /** Channel configuration (1 = mono, 2 = stereo, etc.). */\n readonly channelConfiguration: number\n}\n\nconst ADTS_SAMPLING_RATES = [\n 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025,\n 8000, 7350,\n]\n\n/**\n * Returns the sample rate in Hz for a given sampling frequency index.\n */\nexport function adtsSampleRate(index: number): number {\n return ADTS_SAMPLING_RATES[index] ?? 0\n}\n\n/**\n * Parses all ADTS frames from a buffer of raw AAC data.\n */\nexport function parseAdtsFrames(data: Uint8Array): AdtsFrame[] {\n const frames: AdtsFrame[] = []\n let offset = 0\n\n while (offset + 7 <= data.length) {\n // ADTS sync word: 0xFFF\n if (data[offset] !== 0xff || (data[offset + 1] & 0xf0) !== 0xf0) {\n offset++\n continue\n }\n\n const hasCrc = (data[offset + 1] & 0x01) === 0\n const headerSize = hasCrc ? 9 : 7\n\n const audioObjectType = ((data[offset + 2] >> 6) & 0x03) + 1\n const samplingFrequencyIndex = (data[offset + 2] >> 2) & 0x0f\n const channelConfiguration =\n ((data[offset + 2] & 0x01) << 2) | ((data[offset + 3] >> 6) & 0x03)\n\n const frameLength =\n ((data[offset + 3] & 0x03) << 11) |\n (data[offset + 4] << 3) |\n ((data[offset + 5] >> 5) & 0x07)\n\n if (frameLength < headerSize || offset + frameLength > data.length) {\n break\n }\n\n frames.push({\n offset,\n frameLength,\n headerSize,\n audioObjectType,\n samplingFrequencyIndex,\n channelConfiguration,\n })\n\n offset += frameLength\n }\n\n return frames\n}\n\n/**\n * Builds the AudioSpecificConfig (2 bytes) for an AAC-LC stream.\n * This is required in the MP4 esds box.\n */\nexport function buildAudioSpecificConfig(frame: AdtsFrame): Uint8Array {\n const config = new Uint8Array(2)\n config[0] =\n (frame.audioObjectType << 3) |\n ((frame.samplingFrequencyIndex & 0x0e) >> 1)\n config[1] =\n ((frame.samplingFrequencyIndex & 0x01) << 7) |\n (frame.channelConfiguration << 3)\n return config\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Codec-specific MP4 sample entry builders for AAC and H.264.\n *\n * These produce the sample entry boxes (mp4a, avc1) that are placed inside\n * the generic stsd box built by the mp4 layer.\n *\n * @module\n */\n\nimport { BufferWriter } from '@amazon/vinyl-util'\nimport { box, fullBox } from '@/mp4/mp4'\n\n/** 72 dpi in 16.16 fixed point. */\nconst RESOLUTION_72_DPI = 0x00480000\n\n/** ESDS object type indication for AAC (ISO 14496-3). */\nconst OBJECT_TYPE_AAC = 0x40\n\n/** ESDS stream type for audio: (0x05 << 2) | 0x01. */\nconst STREAM_TYPE_AUDIO = 0x15\n\nexport interface AudioTrackConfig {\n readonly audioObjectType: number\n readonly samplingFrequencyIndex: number\n readonly channelConfiguration: number\n readonly sampleRate: number\n readonly audioSpecificConfig: Uint8Array\n}\n\nexport interface VideoTrackConfig {\n readonly width: number\n readonly height: number\n readonly sps: Uint8Array\n readonly pps: Uint8Array\n readonly profileIdc: number\n readonly profileCompatibility: number\n readonly levelIdc: number\n}\n\n/**\n * Builds an mp4a sample entry box for AAC audio.\n */\nexport function mp4aSampleEntry(config: AudioTrackConfig): Uint8Array {\n const writer = new BufferWriter(28)\n // 6 bytes reserved\n for (let i = 0; i < 6; i++) writer.writeUint8(0)\n writer.writeUint16(1) // data_reference_index\n // 8 bytes reserved\n for (let i = 0; i < 8; i++) writer.writeUint8(0)\n writer.writeUint16(config.channelConfiguration)\n writer.writeUint16(16) // sample_size\n writer.writeUint16(0) // pre_defined\n writer.writeUint16(0) // reserved\n writer.writeUint32(config.sampleRate << 16) // sample_rate (16.16)\n return box('mp4a', writer.toUint8Array(), esds(config))\n}\n\n/**\n * Builds an avc1 sample entry box for H.264 video.\n */\nexport function avc1SampleEntry(config: VideoTrackConfig): Uint8Array {\n const writer = new BufferWriter(78)\n // 6 bytes reserved\n for (let i = 0; i < 6; i++) writer.writeUint8(0)\n writer.writeUint16(1) // data_reference_index\n // 16 bytes pre_defined + reserved\n for (let i = 0; i < 16; i++) writer.writeUint8(0)\n writer.writeUint16(config.width)\n writer.writeUint16(config.height)\n writer.writeUint32(RESOLUTION_72_DPI)\n writer.writeUint32(RESOLUTION_72_DPI)\n writer.writeUint32(0) // reserved\n writer.writeUint16(1) // frame_count\n // 32 bytes compressorname\n for (let i = 0; i < 32; i++) writer.writeUint8(0)\n writer.writeUint16(0x0018) // depth = 24\n writer.writeInt16(-1) // pre_defined\n return box('avc1', writer.toUint8Array(), avcC(config))\n}\n\nfunction esds(config: AudioTrackConfig): Uint8Array {\n const asc = config.audioSpecificConfig\n\n // DecoderSpecificInfo (tag 0x05)\n const dsi = new BufferWriter(2 + asc.byteLength)\n dsi.writeUint8(0x05)\n dsi.writeUint8(asc.byteLength)\n dsi.writeBytes(asc)\n\n // DecoderConfigDescriptor (tag 0x04)\n const dcd = new BufferWriter(2 + 13 + dsi.position)\n dcd.writeUint8(0x04)\n dcd.writeUint8(13 + dsi.position)\n dcd.writeUint8(OBJECT_TYPE_AAC)\n dcd.writeUint8(STREAM_TYPE_AUDIO)\n dcd.writeUint8(0) // bufferSizeDB (3 bytes)\n dcd.writeUint8(0)\n dcd.writeUint8(0)\n dcd.writeUint32(0) // maxBitrate\n dcd.writeUint32(0) // avgBitrate\n dcd.writeBytes(dsi.toUint8Array())\n\n // SLConfigDescriptor (tag 0x06)\n const slc = new BufferWriter(3)\n slc.writeUint8(0x06)\n slc.writeUint8(1)\n slc.writeUint8(0x02) // predefined = 2\n\n // ES_Descriptor (tag 0x03)\n const esPayloadSize = 3 + dcd.position + slc.position\n const es = new BufferWriter(2 + esPayloadSize)\n es.writeUint8(0x03)\n es.writeUint8(esPayloadSize)\n es.writeUint16(1) // ES_ID\n es.writeUint8(0) // flags\n es.writeBytes(dcd.toUint8Array())\n es.writeBytes(slc.toUint8Array())\n\n return fullBox('esds', 0, 0, es.toUint8Array())\n}\n\nfunction avcC(config: VideoTrackConfig): Uint8Array {\n const writer = new BufferWriter(\n 11 + config.sps.byteLength + config.pps.byteLength\n )\n writer.writeUint8(1) // configurationVersion\n writer.writeUint8(config.profileIdc)\n writer.writeUint8(config.profileCompatibility)\n writer.writeUint8(config.levelIdc)\n writer.writeUint8(3) // lengthSizeMinusOne = 3 (4 bytes)\n writer.writeUint8(0xe1) // numOfSequenceParameterSets = 1\n writer.writeUint16(config.sps.byteLength)\n writer.writeBytes(config.sps)\n writer.writeUint8(1) // numOfPictureParameterSets\n writer.writeUint16(config.pps.byteLength)\n writer.writeBytes(config.pps)\n return box('avcC', writer.toUint8Array())\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * ISO BMFF (MP4) box writing utilities.\n *\n * Provides functions to construct the fMP4 boxes required by MSE:\n * - `ftyp`: file type\n * - `moov` / `mvhd` / `trak` / `mdia` / `minf` / `stbl`: track metadata\n * - `moof` / `mdat`: media fragments\n *\n * @module\n */\n\nimport { BufferWriter } from '@amazon/vinyl-util'\n\n/** ISO 14496-12 identity matrix in 16.16 / 2.30 fixed point. */\nconst UNITY_MATRIX = [\n 0x00010000, 0, 0, 0, 0x00010000, 0, 0, 0, 0x40000000,\n] as const\n\n/** 90 kHz timescale from ISO 13818-1 (MPEG system clock). */\nexport const MPEG_TIMESCALE = 90000\n\n/** ISO 639-2/T packed language code for 'und' (undetermined). */\nconst LANGUAGE_UNDETERMINED = 0x55c4\n\n/**\n * Writes a generic MP4 box (atom). The size field is automatically computed.\n */\nexport function box(type: string, ...payloads: Uint8Array[]): Uint8Array {\n let size = 8\n for (const p of payloads) size += p.byteLength\n const writer = new BufferWriter(size)\n writer.writeUint32(size)\n writer.writeString(type)\n for (const p of payloads) writer.writeBytes(p)\n return writer.toUint8Array()\n}\n\n/**\n * Writes a full box with version and flags.\n */\nexport function fullBox(\n type: string,\n version: number,\n flags: number,\n payload: Uint8Array\n): Uint8Array {\n const size = 12 + payload.byteLength\n const writer = new BufferWriter(size)\n writer.writeUint32(size)\n writer.writeString(type)\n writer.writeUint8(version)\n // 24-bit flags\n writer.writeUint8((flags >> 16) & 0xff)\n writer.writeUint8((flags >> 8) & 0xff)\n writer.writeUint8(flags & 0xff)\n writer.writeBytes(payload)\n return writer.toUint8Array()\n}\n\nexport interface FtypOptions {\n readonly majorBrand?: string\n readonly minorVersion?: number\n readonly compatibleBrands?: readonly string[]\n}\n\nconst DEFAULT_FTYP: Required<FtypOptions> = {\n majorBrand: 'isom',\n minorVersion: 0x200,\n compatibleBrands: ['isom', 'iso6', 'mp41'],\n}\n\n/**\n * Generates the ftyp box.\n */\nexport function ftyp(options?: FtypOptions): Uint8Array {\n const { majorBrand, minorVersion, compatibleBrands } = {\n ...DEFAULT_FTYP,\n ...options,\n }\n const writer = new BufferWriter(8 + compatibleBrands.length * 4)\n writer.writeString(majorBrand)\n writer.writeUint32(minorVersion)\n for (const brand of compatibleBrands) writer.writeString(brand)\n return box('ftyp', writer.toUint8Array())\n}\n\n/**\n * Generates a moov box from pre-built track boxes.\n */\nexport function moov(...traks: Uint8Array[]): Uint8Array {\n const trakAndMvex: Uint8Array[] = []\n for (let i = 0; i < traks.length; i++) {\n trakAndMvex.push(traks[i], mvex(i + 1))\n }\n return box('moov', mvhd(), ...trakAndMvex)\n}\n\nexport interface MvhdOptions {\n readonly timescale?: number\n readonly duration?: number\n readonly rate?: number\n readonly volume?: number\n}\n\nconst DEFAULT_MVHD: Required<MvhdOptions> = {\n timescale: MPEG_TIMESCALE,\n duration: 0,\n rate: 1.0,\n volume: 1.0,\n}\n\nfunction mvhd(options?: MvhdOptions): Uint8Array {\n const { timescale, duration, rate, volume } = {\n ...DEFAULT_MVHD,\n ...options,\n }\n const writer = new BufferWriter(96)\n writer.writeUint32(0) // creation_time\n writer.writeUint32(0) // modification_time\n writer.writeUint32(timescale)\n writer.writeUint32(duration)\n writer.writeUint32(rate * 0x10000) // 16.16 fixed point\n writer.writeUint16(volume * 0x100) // 8.8 fixed point\n // 10 bytes reserved\n for (let i = 0; i < 10; i++) writer.writeUint8(0)\n for (const v of UNITY_MATRIX) writer.writeUint32(v)\n // 6 x uint32 pre_defined\n for (let i = 0; i < 6; i++) writer.writeUint32(0)\n writer.writeUint32(0xffffffff) // next_track_ID\n return fullBox('mvhd', 0, 0, writer.toUint8Array())\n}\n\nexport interface AudioTrackOptions {\n readonly trackId: number\n readonly sampleRate: number\n readonly channelCount: number\n readonly sampleEntry: Uint8Array\n}\n\nexport interface VideoTrackOptions {\n readonly trackId: number\n readonly width: number\n readonly height: number\n readonly timescale?: number\n readonly sampleEntry: Uint8Array\n}\n\nexport function audioTrak(options: AudioTrackOptions): Uint8Array {\n return box(\n 'trak',\n tkhd(options.trackId, 0, 0, options.channelCount > 0 ? 1.0 : 0),\n box(\n 'mdia',\n mdhd(options.sampleRate),\n hdlr('soun', 'SoundHandler'),\n box('minf', smhd(), dinf(), audioStbl(options.sampleEntry))\n )\n )\n}\n\nexport function videoTrak(options: VideoTrackOptions): Uint8Array {\n return box(\n 'trak',\n tkhd(options.trackId, options.width, options.height, 0),\n box(\n 'mdia',\n mdhd(options.timescale ?? MPEG_TIMESCALE),\n hdlr('vide', 'VideoHandler'),\n box('minf', vmhd(), dinf(), videoStbl(options.sampleEntry))\n )\n )\n}\n\nfunction tkhd(\n trackId: number,\n width: number,\n height: number,\n volume: number\n): Uint8Array {\n const writer = new BufferWriter(80)\n writer.writeUint32(0) // creation_time\n writer.writeUint32(0) // modification_time\n writer.writeUint32(trackId)\n writer.writeUint32(0) // reserved\n writer.writeUint32(0) // duration\n writer.writeUint32(0) // reserved\n writer.writeUint32(0) // reserved\n writer.writeUint16(0) // layer\n writer.writeUint16(0) // alternate_group\n writer.writeUint16(volume * 0x100) // volume (8.8 fixed point)\n writer.writeUint16(0) // reserved\n // unity matrix\n for (const v of UNITY_MATRIX) writer.writeUint32(v)\n\n writer.writeUint32(width * 0x10000) // width (16.16 fixed point)\n writer.writeUint32(height * 0x10000) // height (16.16 fixed point)\n return fullBox('tkhd', 0, 0x000003, writer.toUint8Array())\n}\n\nfunction mdhd(timescale: number): Uint8Array {\n const writer = new BufferWriter(20)\n writer.writeUint32(0) // creation_time\n writer.writeUint32(0) // modification_time\n writer.writeUint32(timescale)\n writer.writeUint32(0) // duration\n writer.writeUint16(LANGUAGE_UNDETERMINED)\n writer.writeUint16(0) // pre_defined\n return fullBox('mdhd', 0, 0, writer.toUint8Array())\n}\n\nfunction hdlr(handlerType: string, name: string): Uint8Array {\n const writer = new BufferWriter(21 + name.length)\n writer.writeUint32(0) // pre_defined\n writer.writeString(handlerType)\n writer.writeUint32(0) // reserved\n writer.writeUint32(0) // reserved\n writer.writeUint32(0) // reserved\n writer.writeString(name)\n writer.writeUint8(0) // null terminator\n return fullBox('hdlr', 0, 0, writer.toUint8Array())\n}\n\nfunction smhd(): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint16(0) // balance\n writer.writeUint16(0) // reserved\n return fullBox('smhd', 0, 0, writer.toUint8Array())\n}\n\nfunction vmhd(): Uint8Array {\n const writer = new BufferWriter(8)\n writer.writeUint16(0) // graphicsmode\n writer.writeUint16(0) // opcolor\n writer.writeUint16(0)\n writer.writeUint16(0)\n return fullBox('vmhd', 0, 0x000001, writer.toUint8Array())\n}\n\nfunction dinf(): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(1) // entry_count\n const urlBox = fullBox('url ', 0, 0x000001, new Uint8Array(0))\n return box(\n 'dinf',\n fullBox('dref', 0, 0, concatUint8(writer.toUint8Array(), urlBox))\n )\n}\n\nfunction audioStbl(sampleEntry: Uint8Array): Uint8Array {\n return box('stbl', stsd(sampleEntry), stts(), stsc(), stsz(), stco())\n}\n\nfunction videoStbl(sampleEntry: Uint8Array): Uint8Array {\n return box('stbl', stsd(sampleEntry), stts(), stsc(), stsz(), stco())\n}\n\nfunction stsd(sampleEntry: Uint8Array): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(1) // entry_count\n return fullBox(\n 'stsd',\n 0,\n 0,\n concatUint8(writer.toUint8Array(), sampleEntry)\n )\n}\n\nfunction stts(): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(0) // entry_count\n return fullBox('stts', 0, 0, writer.toUint8Array())\n}\n\nfunction stsc(): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(0) // entry_count\n return fullBox('stsc', 0, 0, writer.toUint8Array())\n}\n\nfunction stsz(): Uint8Array {\n const writer = new BufferWriter(8)\n writer.writeUint32(0) // sample_size\n writer.writeUint32(0) // sample_count\n return fullBox('stsz', 0, 0, writer.toUint8Array())\n}\n\nfunction stco(): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(0) // entry_count\n return fullBox('stco', 0, 0, writer.toUint8Array())\n}\n\nfunction mvex(trackId: number): Uint8Array {\n return box('mvex', trex(trackId))\n}\n\nfunction trex(trackId: number): Uint8Array {\n const writer = new BufferWriter(20)\n writer.writeUint32(trackId)\n writer.writeUint32(1) // default_sample_description_index\n writer.writeUint32(0) // default_sample_duration\n writer.writeUint32(0) // default_sample_size\n writer.writeUint32(0) // default_sample_flags\n return fullBox('trex', 0, 0, writer.toUint8Array())\n}\n\nexport interface MoofOptions {\n readonly sequenceNumber: number\n readonly trackId: number\n readonly baseDecodeTime: number\n readonly samples: readonly SampleEntry[]\n}\n\nexport interface SampleEntry {\n readonly duration: number\n readonly size: number\n readonly flags?: number\n readonly compositionTimeOffset?: number\n}\n\n/**\n * Generates a moof (movie fragment) box.\n */\nexport function moof(options: MoofOptions): Uint8Array {\n return box('moof', mfhd(options.sequenceNumber), traf(options))\n}\n\nfunction mfhd(sequenceNumber: number): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(sequenceNumber)\n return fullBox('mfhd', 0, 0, writer.toUint8Array())\n}\n\nfunction traf(options: MoofOptions): Uint8Array {\n return box(\n 'traf',\n tfhd(options.trackId),\n tfdt(options.baseDecodeTime),\n trun(options.samples)\n )\n}\n\nfunction tfhd(trackId: number): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(trackId)\n // flags: default-base-is-moof (0x020000)\n return fullBox('tfhd', 0, 0x020000, writer.toUint8Array())\n}\n\nfunction tfdt(baseDecodeTime: number): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(baseDecodeTime)\n return fullBox('tfdt', 0, 0, writer.toUint8Array())\n}\n\nfunction trun(samples: readonly SampleEntry[]): Uint8Array {\n // flags: data-offset-present (0x01), sample-duration-present (0x100),\n // sample-size-present (0x200), sample-flags-present (0x400)\n const hasFlags = samples.some((s) => s.flags != null)\n const hasCto = samples.some((s) => s.compositionTimeOffset != null)\n let flags = 0x000001 | 0x000100 | 0x000200\n if (hasFlags) flags |= 0x000400\n if (hasCto) flags |= 0x000800\n\n let entrySize = 8 // duration + size\n if (hasFlags) entrySize += 4\n if (hasCto) entrySize += 4\n\n const writer = new BufferWriter(8 + samples.length * entrySize)\n writer.writeUint32(samples.length) // sample_count\n writer.writeUint32(0) // data_offset (placeholder, patched later)\n\n for (const sample of samples) {\n writer.writeUint32(sample.duration)\n writer.writeUint32(sample.size)\n if (hasFlags) writer.writeUint32(sample.flags ?? 0)\n if (hasCto) writer.writeInt32(sample.compositionTimeOffset ?? 0)\n }\n\n const result = fullBox('trun', hasCto ? 1 : 0, flags, writer.toUint8Array())\n return result\n}\n\n/**\n * Generates an mdat box wrapping raw media data.\n */\nexport function mdat(data: Uint8Array): Uint8Array {\n return box('mdat', data)\n}\n\n/**\n * Patches the trun data_offset field. The data_offset is the byte offset from\n * the start of the moof to the first byte of the mdat payload.\n */\nexport function patchDataOffset(moofData: Uint8Array, moofSize: number): void {\n // data_offset = moofSize + 8 (mdat header)\n const dataOffset = moofSize + 8\n // Find trun box and patch the data_offset field.\n // trun is inside moof > traf. Walk the box tree.\n let pos = 8 // skip moof header\n while (pos < moofData.length) {\n const boxSize =\n ((moofData[pos] << 24) |\n (moofData[pos + 1] << 16) |\n (moofData[pos + 2] << 8) |\n moofData[pos + 3]) >>>\n 0\n const boxType = String.fromCharCode(\n moofData[pos + 4],\n moofData[pos + 5],\n moofData[pos + 6],\n moofData[pos + 7]\n )\n if (boxType === 'traf') {\n // Recurse into traf\n let trafPos = pos + 8\n while (trafPos < pos + boxSize) {\n const innerSize =\n ((moofData[trafPos] << 24) |\n (moofData[trafPos + 1] << 16) |\n (moofData[trafPos + 2] << 8) |\n moofData[trafPos + 3]) >>>\n 0\n const innerType = String.fromCharCode(\n moofData[trafPos + 4],\n moofData[trafPos + 5],\n moofData[trafPos + 6],\n moofData[trafPos + 7]\n )\n if (innerType === 'trun') {\n // data_offset is at offset 12+4 = 16 from box start\n // (8 box header + 4 version/flags + 4 sample_count)\n const offsetPos = trafPos + 16\n moofData[offsetPos] = (dataOffset >> 24) & 0xff\n moofData[offsetPos + 1] = (dataOffset >> 16) & 0xff\n moofData[offsetPos + 2] = (dataOffset >> 8) & 0xff\n moofData[offsetPos + 3] = dataOffset & 0xff\n return\n }\n trafPos += innerSize\n }\n }\n pos += boxSize\n }\n}\n\nfunction concatUint8(...arrays: Uint8Array[]): Uint8Array {\n let total = 0\n for (const a of arrays) total += a.byteLength\n const result = new Uint8Array(total)\n let offset = 0\n for (const a of arrays) {\n result.set(a, offset)\n offset += a.byteLength\n }\n return result\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * MPEG-TS constants and packet-level parsing.\n *\n * An MPEG Transport Stream consists of fixed 188-byte packets. Each packet\n * starts with a sync byte (0x47) and carries a 13-bit PID identifying the\n * elementary stream. The PAT (PID 0) maps program numbers to PMT PIDs, and\n * the PMT lists the elementary stream PIDs with their stream types.\n *\n * @module\n */\n\nexport const TS_PACKET_SIZE = 188\nexport const TS_SYNC_BYTE = 0x47\n\n/** Well-known stream type identifiers from ISO/IEC 13818-1. */\nexport const STREAM_TYPE_AAC = 0x0f\nexport const STREAM_TYPE_H264 = 0x1b\nexport const STREAM_TYPE_H265 = 0x24\nexport const STREAM_TYPE_ID3 = 0x15\n\nexport interface TsPacketHeader {\n readonly pid: number\n readonly payloadUnitStartIndicator: boolean\n readonly adaptationFieldControl: number\n readonly continuityCounter: number\n}\n\nexport interface PmtEntry {\n readonly pid: number\n readonly streamType: number\n}\n\n/**\n * Parses a single 188-byte TS packet header.\n */\nexport function parseTsPacketHeader(\n data: Uint8Array,\n offset: number\n): TsPacketHeader {\n const byte1 = data[offset + 1]\n const byte2 = data[offset + 2]\n const byte3 = data[offset + 3]\n return {\n pid: ((byte1 & 0x1f) << 8) | byte2,\n payloadUnitStartIndicator: (byte1 & 0x40) !== 0,\n adaptationFieldControl: (byte3 >> 4) & 0x03,\n continuityCounter: byte3 & 0x0f,\n }\n}\n\n/**\n * Returns the offset of the payload within a TS packet.\n */\nexport function getPayloadOffset(\n data: Uint8Array,\n offset: number,\n adaptationFieldControl: number\n): number {\n let payloadOffset = offset + 4\n if (adaptationFieldControl >= 2) {\n // Adaptation field present\n payloadOffset += 1 + data[offset + 4]\n }\n return payloadOffset\n}\n\n/**\n * Parses the PAT (Program Association Table) to find the PMT PID.\n */\nexport function parsePat(data: Uint8Array, offset: number): number {\n // Skip pointer field\n const pointerField = data[offset]\n let pos = offset + 1 + pointerField\n // Skip table_id(1), section_syntax_indicator+length(2), transport_stream_id(2),\n // version/current(1), section_number(1), last_section_number(1)\n pos += 8\n // First program entry: program_number(2) + PMT_PID(2)\n // Skip program_number\n pos += 2\n return ((data[pos] & 0x1f) << 8) | data[pos + 1]\n}\n\n/**\n * Parses the PMT (Program Map Table) to extract elementary stream entries.\n */\nexport function parsePmt(data: Uint8Array, offset: number): PmtEntry[] {\n const pointerField = data[offset]\n let pos = offset + 1 + pointerField\n\n // table_id(1)\n pos += 1\n const sectionLength = ((data[pos] & 0x0f) << 8) | data[pos + 1]\n pos += 2\n const sectionEnd = pos + sectionLength\n // transport_stream_id(2), version/current(1), section_number(1), last_section_number(1)\n pos += 5\n // PCR_PID(2)\n pos += 2\n // program_info_length\n const programInfoLength = ((data[pos] & 0x0f) << 8) | data[pos + 1]\n pos += 2 + programInfoLength\n\n const entries: PmtEntry[] = []\n // -4 for CRC32\n while (pos < sectionEnd - 4) {\n const streamType = data[pos]\n pos += 1\n const pid = ((data[pos] & 0x1f) << 8) | data[pos + 1]\n pos += 2\n const esInfoLength = ((data[pos] & 0x0f) << 8) | data[pos + 1]\n pos += 2 + esInfoLength\n entries.push({ pid, streamType })\n }\n return entries\n}\n\nexport interface DemuxedStream {\n readonly streamType: number\n readonly pid: number\n readonly data: Uint8Array[]\n}\n\n/**\n * Demuxes a complete MPEG-TS segment into elementary streams.\n * Reassembles PES packets from TS packets for each PID.\n */\nexport function demuxTsSegment(segment: Uint8Array): DemuxedStream[] {\n let pmtPid = -1\n const pmtEntries: PmtEntry[] = []\n const pesBuffers = new Map<number, Uint8Array[]>()\n\n // First pass: find PAT and PMT\n for (let i = 0; i + TS_PACKET_SIZE <= segment.length; i += TS_PACKET_SIZE) {\n if (segment[i] !== TS_SYNC_BYTE) continue\n const header = parseTsPacketHeader(segment, i)\n const payloadStart = getPayloadOffset(\n segment,\n i,\n header.adaptationFieldControl\n )\n if (\n header.adaptationFieldControl === 0 ||\n header.adaptationFieldControl === 2\n )\n continue\n\n if (header.pid === 0) {\n pmtPid = parsePat(segment, payloadStart)\n } else if (header.pid === pmtPid && pmtEntries.length === 0) {\n pmtEntries.push(...parsePmt(segment, payloadStart))\n }\n }\n\n // Initialize buffers for known elementary streams\n const pidToStreamType = new Map<number, number>()\n for (const entry of pmtEntries) {\n pidToStreamType.set(entry.pid, entry.streamType)\n pesBuffers.set(entry.pid, [])\n }\n\n // Second pass: collect PES data\n for (let i = 0; i + TS_PACKET_SIZE <= segment.length; i += TS_PACKET_SIZE) {\n if (segment[i] !== TS_SYNC_BYTE) continue\n const header = parseTsPacketHeader(segment, i)\n if (\n header.adaptationFieldControl === 0 ||\n header.adaptationFieldControl === 2\n )\n continue\n\n const buffers = pesBuffers.get(header.pid)\n if (!buffers) continue\n\n const payloadStart = getPayloadOffset(\n segment,\n i,\n header.adaptationFieldControl\n )\n const payloadEnd = i + TS_PACKET_SIZE\n if (payloadStart < payloadEnd) {\n buffers.push(segment.slice(payloadStart, payloadEnd))\n }\n }\n\n const streams: DemuxedStream[] = []\n for (const [pid, buffers] of pesBuffers) {\n if (buffers.length === 0) continue\n streams.push({\n pid,\n streamType: pidToStreamType.get(pid)!,\n data: buffers,\n })\n }\n return streams\n}\n\n/**\n * Concatenates an array of Uint8Arrays into a single Uint8Array.\n */\nexport function concatBuffers(buffers: Uint8Array[]): Uint8Array {\n let totalLength = 0\n for (const buf of buffers) totalLength += buf.byteLength\n const result = new Uint8Array(totalLength)\n let offset = 0\n for (const buf of buffers) {\n result.set(buf, offset)\n offset += buf.byteLength\n }\n return result\n}\n\n/**\n * Strips the PES header from raw PES packet data, returning the elementary\n * stream payload.\n */\nexport function stripPesHeader(pesData: Uint8Array): Uint8Array {\n // PES start code: 0x00 0x00 0x01\n if (pesData[0] !== 0 || pesData[1] !== 0 || pesData[2] !== 1) {\n // No PES header, return as-is (continuation data)\n return pesData\n }\n // PES header data length is at byte 8\n const pesHeaderDataLength = pesData[8]\n return pesData.subarray(9 + pesHeaderDataLength)\n}\n\n/**\n * Extracts the PTS (Presentation Time Stamp) from a PES header.\n * Returns the PTS in 90kHz clock ticks, or -1 if not present.\n */\nexport function parsePesPts(pesData: Uint8Array): number {\n if (pesData[0] !== 0 || pesData[1] !== 0 || pesData[2] !== 1) return -1\n const flags = pesData[7]\n if ((flags & 0x80) === 0) return -1\n // PTS is encoded in 5 bytes starting at byte 9\n const byte9 = pesData[9]\n const byte10 = pesData[10]\n const byte11 = pesData[11]\n const byte12 = pesData[12]\n const byte13 = pesData[13]\n return (\n (byte9 & 0x0e) * 0x20000000 + // (byte9 & 0x0E) << 29\n ((byte10 & 0xff) << 22) +\n ((byte11 & 0xfe) << 14) +\n ((byte12 & 0xff) << 7) +\n ((byte13 & 0xfe) >>> 1)\n )\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Transmuxer that converts MPEG-TS / raw ADTS AAC segments into fMP4\n * fragments consumable by MSE SourceBuffer.\n *\n * The transmuxer produces two outputs:\n * 1. An initialization segment (ftyp + moov) \u2014 append once per track.\n * 2. Media segments (moof + mdat) \u2014 append per HLS segment.\n *\n * @module\n */\n\nimport {\n type AdtsFrame,\n adtsSampleRate,\n buildAudioSpecificConfig,\n parseAdtsFrames,\n} from '@/aac/adts'\nimport {\n type AudioTrackConfig,\n type VideoTrackConfig,\n mp4aSampleEntry,\n avc1SampleEntry,\n} from '@/transmux/sampleEntry'\nimport {\n type SampleEntry,\n audioTrak,\n ftyp,\n mdat,\n moov,\n moof,\n patchDataOffset,\n videoTrak,\n MPEG_TIMESCALE,\n} from '@/mp4/mp4'\nimport {\n STREAM_TYPE_AAC,\n STREAM_TYPE_H264,\n concatBuffers,\n demuxTsSegment,\n parsePesPts,\n} from '@/mpegts/mpegts'\n\nexport interface TransmuxResult {\n /** The initialization segment (ftyp + moov). Always present. */\n readonly initSegment: ArrayBuffer\n /** The media segment (moof + mdat). */\n readonly mediaSegment: ArrayBuffer\n /** Duration of this segment in seconds. */\n readonly duration: number\n}\n\ninterface TrackState {\n initSegment: Uint8Array | null\n sequenceNumber: number\n audioConfig: AudioTrackConfig | null\n videoConfig: VideoTrackConfig | null\n audioDecodeTime: number\n videoDecodeTime: number\n}\n\n/**\n * Creates a stateful transmuxer instance. Call `transmux()` for each HLS\n * segment in order. The init segment is always returned (cached after first\n * call).\n */\nexport function createTransmuxer() {\n const state: TrackState = {\n initSegment: null,\n sequenceNumber: 1,\n audioConfig: null,\n videoConfig: null,\n audioDecodeTime: 0,\n videoDecodeTime: 0,\n }\n\n return { transmux: (data: ArrayBuffer) => transmux(state, data) }\n}\n\n/**\n * Builds the ftyp + moov init segment and stores it in state.\n */\nfunction buildInitSegment(state: TrackState, moovBox: Uint8Array): void {\n const ftypBox = ftyp()\n const init = new Uint8Array(ftypBox.byteLength + moovBox.byteLength)\n init.set(ftypBox, 0)\n init.set(moovBox, ftypBox.byteLength)\n state.initSegment = init\n}\n\n/** Returns the cached init segment as an ArrayBuffer. */\nfunction getInitSegment(state: TrackState): ArrayBuffer {\n const init = state.initSegment!\n return init.buffer.slice(\n init.byteOffset,\n init.byteOffset + init.byteLength\n ) as ArrayBuffer\n}\n\nfunction transmux(state: TrackState, data: ArrayBuffer): TransmuxResult {\n let segment: Uint8Array = new Uint8Array(data)\n\n // Skip ID3 tags that may precede the audio/video data.\n // ID3 tags are common in HLS for carrying timestamps.\n segment = skipId3Tags(segment)\n\n // Detect format: MPEG-TS starts with 0x47, ADTS starts with 0xFFF\n const isMpegTs = segment[0] === 0x47\n const isAdts = segment[0] === 0xff && (segment[1] & 0xf0) === 0xf0\n\n if (isMpegTs) {\n return transmuxMpegTs(state, segment)\n } else if (isAdts) {\n return transmuxAdts(state, segment)\n }\n\n throw new Error('Unsupported segment format: expected MPEG-TS or ADTS')\n}\n\n/**\n * Skips any leading ID3v2 tags. Each tag has a 10-byte header where bytes\n * 6-9 encode the size as a synchsafe integer.\n */\nfunction skipId3Tags(data: Uint8Array): Uint8Array {\n let offset = 0\n while (\n offset + 10 <= data.length &&\n data[offset] === 0x49 && // 'I'\n data[offset + 1] === 0x44 && // 'D'\n data[offset + 2] === 0x33 // '3'\n ) {\n const size =\n ((data[offset + 6] & 0x7f) << 21) |\n ((data[offset + 7] & 0x7f) << 14) |\n ((data[offset + 8] & 0x7f) << 7) |\n (data[offset + 9] & 0x7f)\n offset += 10 + size\n }\n return offset > 0 ? data.subarray(offset) : data\n}\n\nfunction transmuxAdts(state: TrackState, data: Uint8Array): TransmuxResult {\n const frames = parseAdtsFrames(data)\n if (frames.length === 0) {\n throw new Error('No ADTS frames found in segment')\n }\n\n const firstFrame = frames[0]\n\n if (!state.audioConfig) {\n const sampleRate = adtsSampleRate(firstFrame.samplingFrequencyIndex)\n state.audioConfig = {\n audioObjectType: firstFrame.audioObjectType,\n samplingFrequencyIndex: firstFrame.samplingFrequencyIndex,\n channelConfiguration: firstFrame.channelConfiguration,\n sampleRate,\n audioSpecificConfig: buildAudioSpecificConfig(firstFrame),\n }\n buildInitSegment(\n state,\n moov(\n audioTrak({\n trackId: 1,\n sampleRate: state.audioConfig.sampleRate,\n channelCount: state.audioConfig.channelConfiguration,\n sampleEntry: mp4aSampleEntry(state.audioConfig),\n })\n )\n )\n }\n\n const sampleRate = state.audioConfig.sampleRate\n const samplesPerFrame = 1024 // AAC-LC always uses 1024 samples per frame\n\n // Build sample table and raw frame data\n const samples: SampleEntry[] = []\n const frameDataParts: Uint8Array[] = []\n\n for (const frame of frames) {\n const rawData = data.subarray(\n frame.offset + frame.headerSize,\n frame.offset + frame.frameLength\n )\n samples.push({\n duration: samplesPerFrame,\n size: rawData.byteLength,\n })\n frameDataParts.push(rawData)\n }\n\n const rawMediaData = concatBuffers(frameDataParts)\n const duration = (frames.length * samplesPerFrame) / sampleRate\n\n const moofBox = moof({\n sequenceNumber: state.sequenceNumber++,\n trackId: 1,\n baseDecodeTime: state.audioDecodeTime,\n samples,\n })\n state.audioDecodeTime += frames.length * samplesPerFrame\n patchDataOffset(moofBox, moofBox.byteLength)\n const mdatBox = mdat(rawMediaData)\n\n const mediaSegment = new Uint8Array(moofBox.byteLength + mdatBox.byteLength)\n mediaSegment.set(moofBox, 0)\n mediaSegment.set(mdatBox, moofBox.byteLength)\n\n return {\n initSegment: getInitSegment(state),\n mediaSegment: mediaSegment.buffer.slice(\n mediaSegment.byteOffset,\n mediaSegment.byteOffset + mediaSegment.byteLength\n ),\n duration,\n }\n}\n\nfunction transmuxMpegTs(state: TrackState, data: Uint8Array): TransmuxResult {\n const streams = demuxTsSegment(data)\n\n const audioStream = streams.find((s) => s.streamType === STREAM_TYPE_AAC)\n const videoStream = streams.find((s) => s.streamType === STREAM_TYPE_H264)\n\n // Process audio\n let audioFrames: AdtsFrame[] = []\n let audioRawData: Uint8Array | null = null\n let audioConfig = state.audioConfig\n\n if (audioStream) {\n const pesData = concatBuffers(audioStream.data)\n const esData = extractElementaryStream(pesData)\n audioFrames = parseAdtsFrames(esData)\n\n if (audioFrames.length > 0 && !audioConfig) {\n const firstFrame = audioFrames[0]\n const sampleRate = adtsSampleRate(firstFrame.samplingFrequencyIndex)\n audioConfig = {\n audioObjectType: firstFrame.audioObjectType,\n samplingFrequencyIndex: firstFrame.samplingFrequencyIndex,\n channelConfiguration: firstFrame.channelConfiguration,\n sampleRate,\n audioSpecificConfig: buildAudioSpecificConfig(firstFrame),\n }\n state.audioConfig = audioConfig\n }\n\n // Strip ADTS headers from frames\n const parts: Uint8Array[] = []\n for (const frame of audioFrames) {\n parts.push(\n esData.subarray(\n frame.offset + frame.headerSize,\n frame.offset + frame.frameLength\n )\n )\n }\n audioRawData = concatBuffers(parts)\n }\n\n // Process video\n let videoNalus: Uint8Array[] = []\n let videoConfig = state.videoConfig\n let videoFrameDuration = 3754 // default ~23.976fps at 90kHz\n const videoPtsList: number[] = []\n\n if (videoStream) {\n const pesData = concatBuffers(videoStream.data)\n\n // Extract PTS timestamps from PES headers to compute frame duration and CTOs\n let pesOff = 0\n while (pesOff + 9 < pesData.length) {\n if (\n pesData[pesOff] === 0 &&\n pesData[pesOff + 1] === 0 &&\n pesData[pesOff + 2] === 1 &&\n pesData[pesOff + 3] >= 0xbc\n ) {\n const pts = parsePesPts(pesData.subarray(pesOff))\n if (pts >= 0) videoPtsList.push(pts)\n const pLen = (pesData[pesOff + 4] << 8) | pesData[pesOff + 5]\n if (pLen > 0) {\n pesOff += 6 + pLen\n } else {\n const hdrLen = pesData[pesOff + 8]\n pesOff += 9 + hdrLen\n }\n } else {\n pesOff++\n }\n }\n if (videoPtsList.length >= 2) {\n // Compute frame duration from sorted PTS deltas\n const sorted = [...videoPtsList].sort((a, b) => a - b)\n const deltas: number[] = []\n for (let i = 1; i < sorted.length; i++)\n deltas.push(sorted[i] - sorted[i - 1])\n deltas.sort((a, b) => a - b)\n videoFrameDuration = deltas[deltas.length >> 1] || 3754\n }\n\n const esData = extractElementaryStream(pesData)\n videoNalus = extractH264Nalus(esData)\n\n if (!videoConfig) {\n const sps = videoNalus.find((n) => (n[0] & 0x1f) === 7)\n const pps = videoNalus.find((n) => (n[0] & 0x1f) === 8)\n if (sps && pps) {\n const { width, height } = parseSpsInfo(sps)\n videoConfig = {\n width,\n height,\n sps,\n pps,\n profileIdc: sps[1],\n profileCompatibility: sps[2],\n levelIdc: sps[3],\n }\n state.videoConfig = videoConfig\n }\n }\n }\n\n // Generate init segment if needed\n if (!state.initSegment && (audioConfig || videoConfig)) {\n const traks: Uint8Array[] = []\n if (videoConfig) {\n traks.push(\n videoTrak({\n trackId: traks.length + 1,\n width: videoConfig.width,\n height: videoConfig.height,\n sampleEntry: avc1SampleEntry(videoConfig),\n })\n )\n }\n if (audioConfig) {\n traks.push(\n audioTrak({\n trackId: traks.length + 1,\n sampleRate: audioConfig.sampleRate,\n channelCount: audioConfig.channelConfiguration,\n sampleEntry: mp4aSampleEntry(audioConfig),\n })\n )\n }\n buildInitSegment(state, moov(...traks))\n }\n\n // Build media segment - for now handle audio track (trackId=1 for video, 2 for audio in muxed)\n const fragments: Uint8Array[] = []\n let duration = 0\n\n if (videoConfig && videoNalus.length > 0) {\n const trackId = 1\n\n // Group NAL units into access units. Each IDR or non-IDR slice\n // starts a new access unit. SPS/PPS are prepended to the next IDR.\n const accessUnits: { nalus: Uint8Array[]; isIdr: boolean }[] = []\n let pendingParams: Uint8Array[] = []\n\n for (const nalu of videoNalus) {\n const naluType = nalu[0] & 0x1f\n if (naluType === 7 || naluType === 8) {\n // SPS or PPS - buffer for next IDR\n pendingParams.push(nalu)\n } else if (naluType === 6) {\n // SEI - attach to next slice's access unit\n pendingParams.push(nalu)\n } else if (naluType === 5) {\n // IDR slice - include SPS/PPS/SEI before it\n accessUnits.push({\n nalus: [...pendingParams, nalu],\n isIdr: true,\n })\n pendingParams = []\n } else if (naluType === 1) {\n // Non-IDR slice - include any pending SEI\n accessUnits.push({\n nalus:\n pendingParams.length > 0\n ? [...pendingParams, nalu]\n : [nalu],\n isIdr: false,\n })\n pendingParams = []\n }\n // Skip other NAL types (SEI, AUD, etc.)\n }\n\n if (accessUnits.length > 0) {\n const naluParts: Uint8Array[] = []\n const samples: SampleEntry[] = []\n const frameDuration = videoFrameDuration\n\n // Compute composition time offsets from PTS.\n // DTS increases linearly; CTO = PTS - DTS.\n const basePts =\n videoPtsList.length > 0 ? Math.min(...videoPtsList) : 0\n const baseDts = basePts // first DTS = first PTS for simplicity\n\n for (let auIdx = 0; auIdx < accessUnits.length; auIdx++) {\n const au = accessUnits[auIdx]\n // Concatenate all NAL units in this access unit with length prefixes\n let auSize = 0\n const auParts: Uint8Array[] = []\n for (const nalu of au.nalus) {\n const lengthPrefixed = new Uint8Array(4 + nalu.byteLength)\n lengthPrefixed[0] = (nalu.byteLength >> 24) & 0xff\n lengthPrefixed[1] = (nalu.byteLength >> 16) & 0xff\n lengthPrefixed[2] = (nalu.byteLength >> 8) & 0xff\n lengthPrefixed[3] = nalu.byteLength & 0xff\n lengthPrefixed.set(nalu, 4)\n auParts.push(lengthPrefixed)\n auSize += lengthPrefixed.byteLength\n }\n naluParts.push(...auParts)\n\n samples.push({\n duration: frameDuration,\n size: auSize,\n // is_leading=0, depends_on: IDR=2(no), non-IDR=1(yes),\n // is_depended_on=0, has_redundancy=0\n flags: au.isIdr ? 0x02000000 : 0x01010000,\n compositionTimeOffset:\n auIdx < videoPtsList.length\n ? videoPtsList[auIdx] -\n (baseDts + auIdx * frameDuration)\n : 0,\n })\n }\n\n const rawData = concatBuffers(naluParts)\n const moofBox = moof({\n sequenceNumber: state.sequenceNumber++,\n trackId,\n baseDecodeTime: state.videoDecodeTime,\n samples,\n })\n state.videoDecodeTime += accessUnits.length * frameDuration\n patchDataOffset(moofBox, moofBox.byteLength)\n const mdatBox = mdat(rawData)\n fragments.push(moofBox, mdatBox)\n duration = (accessUnits.length * frameDuration) / MPEG_TIMESCALE\n }\n }\n\n if (audioConfig && audioRawData && audioFrames.length > 0) {\n const trackId = videoConfig ? 2 : 1\n const samplesPerFrame = 1024\n const samples: SampleEntry[] = []\n const parts: Uint8Array[] = []\n let offset = 0\n\n for (const frame of audioFrames) {\n const size = frame.frameLength - frame.headerSize\n parts.push(audioRawData.subarray(offset, offset + size))\n samples.push({\n duration: samplesPerFrame,\n size,\n })\n offset += size\n }\n\n const rawData = concatBuffers(parts)\n const moofBox = moof({\n sequenceNumber: state.sequenceNumber++,\n trackId,\n baseDecodeTime: state.audioDecodeTime,\n samples,\n })\n state.audioDecodeTime += audioFrames.length * samplesPerFrame\n patchDataOffset(moofBox, moofBox.byteLength)\n const mdatBox = mdat(rawData)\n fragments.push(moofBox, mdatBox)\n\n const audioDuration =\n (audioFrames.length * samplesPerFrame) / audioConfig.sampleRate\n if (audioDuration > duration) duration = audioDuration\n }\n\n const mediaSegment = concatBuffers(fragments)\n\n return {\n initSegment: getInitSegment(state),\n mediaSegment: mediaSegment.buffer.slice(\n mediaSegment.byteOffset,\n mediaSegment.byteOffset + mediaSegment.byteLength\n ) as ArrayBuffer,\n duration,\n }\n}\n\n/**\n * Extracts the elementary stream from concatenated PES packet data.\n * Handles multiple PES packets within the buffer.\n */\nfunction extractElementaryStream(pesData: Uint8Array): Uint8Array {\n const parts: Uint8Array[] = []\n let offset = 0\n\n while (offset < pesData.length) {\n if (\n offset + 9 <= pesData.length &&\n pesData[offset] === 0 &&\n pesData[offset + 1] === 0 &&\n pesData[offset + 2] === 1 &&\n pesData[offset + 3] >= 0xbc // PES stream IDs start at 0xBC\n ) {\n const headerDataLength = pesData[offset + 8]\n const payloadStart = offset + 9 + headerDataLength\n const pesPacketLength =\n (pesData[offset + 4] << 8) | pesData[offset + 5]\n\n if (pesPacketLength > 0) {\n const pesEnd = Math.min(\n offset + 6 + pesPacketLength,\n pesData.length\n )\n if (payloadStart < pesEnd) {\n parts.push(pesData.subarray(payloadStart, pesEnd))\n }\n offset = pesEnd\n } else {\n // Unknown length \u2014 scan for next PES header (00 00 01 + stream_id >= 0xBC)\n let nextPes = payloadStart\n while (nextPes + 3 < pesData.length) {\n if (\n pesData[nextPes] === 0 &&\n pesData[nextPes + 1] === 0 &&\n pesData[nextPes + 2] === 1 &&\n pesData[nextPes + 3] >= 0xbc\n ) {\n break\n }\n nextPes++\n }\n if (nextPes + 3 >= pesData.length) nextPes = pesData.length\n if (payloadStart < nextPes) {\n parts.push(pesData.subarray(payloadStart, nextPes))\n }\n offset = nextPes\n }\n } else {\n offset++\n }\n }\n\n return concatBuffers(parts)\n}\n\n/**\n * Extracts H.264 NAL units from an Annex B byte stream.\n * Properly handles 3-byte and 4-byte start codes and trims trailing zeros\n * that may result from TS packet padding.\n */\nfunction extractH264Nalus(data: Uint8Array): Uint8Array[] {\n const nalus: Uint8Array[] = []\n\n // Find all start code positions\n const startPositions: { offset: number; scLen: number }[] = []\n let i = 0\n while (i < data.length - 2) {\n if (data[i] === 0 && data[i + 1] === 0) {\n if (i + 3 < data.length && data[i + 2] === 0 && data[i + 3] === 1) {\n startPositions.push({ offset: i, scLen: 4 })\n i += 4\n } else if (data[i + 2] === 1) {\n startPositions.push({ offset: i, scLen: 3 })\n i += 3\n } else {\n i++\n }\n } else {\n i++\n }\n }\n\n for (let j = 0; j < startPositions.length; j++) {\n const naluStart = startPositions[j].offset + startPositions[j].scLen\n const naluEnd =\n j + 1 < startPositions.length\n ? startPositions[j + 1].offset\n : data.length\n\n // Trim trailing zeros (TS packet padding)\n let trimmedEnd = naluEnd\n while (trimmedEnd > naluStart + 1 && data[trimmedEnd - 1] === 0) {\n trimmedEnd--\n }\n\n if (trimmedEnd > naluStart) {\n nalus.push(data.subarray(naluStart, trimmedEnd))\n }\n }\n\n return nalus\n}\n\ninterface SpsInfo {\n readonly width: number\n readonly height: number\n}\n\n/**\n * H.264 profiles that include the high-profile SPS extensions\n * (chroma format, bit depth, scaling matrices).\n */\nconst HIGH_PROFILE_IDCS = /* @__PURE__ */ new Set([\n 100, 110, 122, 244, 44, 83, 86, 118, 128, 138, 139, 134,\n])\n\n/**\n * Minimal H.264 SPS parser using exp-golomb decoding.\n * Extracts pic_width_in_mbs_minus1 and pic_height_in_map_units_minus1.\n */\nfunction parseSpsInfo(sps: Uint8Array): SpsInfo {\n // SPS NAL unit: skip NAL header byte\n let bitOffset = 8 // skip nal_unit_type byte\n\n function readBit(): number {\n const byteIndex = bitOffset >> 3\n const bitIndex = 7 - (bitOffset & 7)\n bitOffset++\n return (sps[byteIndex] >> bitIndex) & 1\n }\n\n function readBits(n: number): number {\n let val = 0\n for (let i = 0; i < n; i++) {\n val = (val << 1) | readBit()\n }\n return val\n }\n\n function readUe(): number {\n let leadingZeros = 0\n while (readBit() === 0 && leadingZeros < 32) leadingZeros++\n if (leadingZeros === 0) return 0\n return (1 << leadingZeros) - 1 + readBits(leadingZeros)\n }\n\n function readSe(): number {\n const val = readUe()\n return val & 1 ? (val + 1) >> 1 : -(val >> 1)\n }\n\n // profile_idc\n const profileIdc = readBits(8)\n // constraint_set flags + reserved\n readBits(8)\n // level_idc\n readBits(8)\n // seq_parameter_set_id\n readUe()\n\n if (HIGH_PROFILE_IDCS.has(profileIdc)) {\n const chromaFormatIdc = readUe()\n if (chromaFormatIdc === 3) readBit() // separate_colour_plane_flag\n readUe() // bit_depth_luma_minus8\n readUe() // bit_depth_chroma_minus8\n readBit() // qpprime_y_zero_transform_bypass_flag\n const seqScalingMatrixPresent = readBit()\n if (seqScalingMatrixPresent) {\n const count = chromaFormatIdc !== 3 ? 8 : 12\n for (let i = 0; i < count; i++) {\n if (readBit()) {\n // 8x8 scaling lists (i >= 6) require a real H.264 encoder\n // to produce a valid SPS bitstream that survives the full\n // exp-golomb parser to this point.\n const size = i < 6 ? 16 : /* c8 ignore next */ 64\n let lastScale = 8\n let nextScale = 8\n for (let j = 0; j < size; j++) {\n if (nextScale !== 0) {\n const delta = readSe()\n nextScale = (lastScale + delta + 0x100) % 0x100\n }\n lastScale = nextScale === 0 ? lastScale : nextScale\n }\n }\n }\n }\n }\n\n readUe() // log2_max_frame_num_minus4\n const picOrderCntType = readUe()\n if (picOrderCntType === 0) {\n readUe() // log2_max_pic_order_cnt_lsb_minus4\n } else if (picOrderCntType === 1) {\n readBit() // delta_pic_order_always_zero_flag\n readSe() // offset_for_non_ref_pic\n readSe() // offset_for_top_to_bottom_field\n const numRefFrames = readUe()\n for (let i = 0; i < numRefFrames; i++) readSe()\n }\n\n readUe() // max_num_ref_frames\n readBit() // gaps_in_frame_num_value_allowed_flag\n\n const picWidthInMbsMinus1 = readUe()\n const picHeightInMapUnitsMinus1 = readUe()\n const frameMbsOnlyFlag = readBit()\n\n const width = (picWidthInMbsMinus1 + 1) * 16\n const height = (2 - frameMbsOnlyFlag) * (picHeightInMapUnitsMinus1 + 1) * 16\n\n return { width, height }\n}\n"],
|
|
4
|
+
"sourcesContent": ["/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * ADTS (Audio Data Transport Stream) frame parser for AAC.\n *\n * ADTS is the framing format used to carry AAC audio in MPEG-TS and raw .aac\n * files. Each frame starts with a 7-byte (or 9-byte with CRC) sync header\n * containing the audio object type, sample rate, and channel configuration\n * needed to construct the MP4 AudioSpecificConfig.\n *\n * @module\n */\n\nexport interface AdtsFrame {\n /** Offset of this frame within the source buffer. */\n readonly offset: number\n /** Total frame size including header. */\n readonly frameLength: number\n /** Size of the ADTS header (7 or 9 bytes). */\n readonly headerSize: number\n /** AAC audio object type (1 = AAC-LC, 2 = HE-AAC, etc.). */\n readonly audioObjectType: number\n /** Sampling frequency index (0-12). */\n readonly samplingFrequencyIndex: number\n /** Channel configuration (1 = mono, 2 = stereo, etc.). */\n readonly channelConfiguration: number\n}\n\nconst ADTS_SAMPLING_RATES = [\n 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025,\n 8000, 7350,\n]\n\n/**\n * Returns the sample rate in Hz for a given sampling frequency index.\n */\nexport function adtsSampleRate(index: number): number {\n return ADTS_SAMPLING_RATES[index] ?? 0\n}\n\n/**\n * Parses all ADTS frames from a buffer of raw AAC data.\n */\nexport function parseAdtsFrames(data: Uint8Array): AdtsFrame[] {\n const frames: AdtsFrame[] = []\n let offset = 0\n\n while (offset + 7 <= data.length) {\n // ADTS sync word: 0xFFF\n if (data[offset] !== 0xff || (data[offset + 1] & 0xf0) !== 0xf0) {\n offset++\n continue\n }\n\n const hasCrc = (data[offset + 1] & 0x01) === 0\n const headerSize = hasCrc ? 9 : 7\n\n const audioObjectType = ((data[offset + 2] >> 6) & 0x03) + 1\n const samplingFrequencyIndex = (data[offset + 2] >> 2) & 0x0f\n const channelConfiguration =\n ((data[offset + 2] & 0x01) << 2) | ((data[offset + 3] >> 6) & 0x03)\n\n const frameLength =\n ((data[offset + 3] & 0x03) << 11) |\n (data[offset + 4] << 3) |\n ((data[offset + 5] >> 5) & 0x07)\n\n if (frameLength < headerSize || offset + frameLength > data.length) {\n break\n }\n\n frames.push({\n offset,\n frameLength,\n headerSize,\n audioObjectType,\n samplingFrequencyIndex,\n channelConfiguration,\n })\n\n offset += frameLength\n }\n\n return frames\n}\n\n/**\n * Builds the AudioSpecificConfig (2 bytes) for an AAC-LC stream.\n * This is required in the MP4 esds box.\n */\nexport function buildAudioSpecificConfig(frame: AdtsFrame): Uint8Array {\n const config = new Uint8Array(2)\n config[0] =\n (frame.audioObjectType << 3) |\n ((frame.samplingFrequencyIndex & 0x0e) >> 1)\n config[1] =\n ((frame.samplingFrequencyIndex & 0x01) << 7) |\n (frame.channelConfiguration << 3)\n return config\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Codec-specific MP4 sample entry builders for AAC and H.264.\n *\n * These produce the sample entry boxes (mp4a, avc1) that are placed inside\n * the generic stsd box built by the mp4 layer.\n *\n * @module\n */\n\nimport { BufferWriter } from '@amazon/vinyl-util'\nimport { box, fullBox } from '../mp4/mp4'\n\n/** 72 dpi in 16.16 fixed point. */\nconst RESOLUTION_72_DPI = 0x00480000\n\n/** ESDS object type indication for AAC (ISO 14496-3). */\nconst OBJECT_TYPE_AAC = 0x40\n\n/** ESDS stream type for audio: (0x05 << 2) | 0x01. */\nconst STREAM_TYPE_AUDIO = 0x15\n\nexport interface AudioTrackConfig {\n readonly audioObjectType: number\n readonly samplingFrequencyIndex: number\n readonly channelConfiguration: number\n readonly sampleRate: number\n readonly audioSpecificConfig: Uint8Array\n}\n\nexport interface VideoTrackConfig {\n readonly width: number\n readonly height: number\n readonly sps: Uint8Array\n readonly pps: Uint8Array\n readonly profileIdc: number\n readonly profileCompatibility: number\n readonly levelIdc: number\n}\n\n/**\n * Builds an mp4a sample entry box for AAC audio.\n */\nexport function mp4aSampleEntry(config: AudioTrackConfig): Uint8Array {\n const writer = new BufferWriter(28)\n // 6 bytes reserved\n for (let i = 0; i < 6; i++) writer.writeUint8(0)\n writer.writeUint16(1) // data_reference_index\n // 8 bytes reserved\n for (let i = 0; i < 8; i++) writer.writeUint8(0)\n writer.writeUint16(config.channelConfiguration)\n writer.writeUint16(16) // sample_size\n writer.writeUint16(0) // pre_defined\n writer.writeUint16(0) // reserved\n writer.writeUint32(config.sampleRate << 16) // sample_rate (16.16)\n return box('mp4a', writer.toUint8Array(), esds(config))\n}\n\n/**\n * Builds an avc1 sample entry box for H.264 video.\n */\nexport function avc1SampleEntry(config: VideoTrackConfig): Uint8Array {\n const writer = new BufferWriter(78)\n // 6 bytes reserved\n for (let i = 0; i < 6; i++) writer.writeUint8(0)\n writer.writeUint16(1) // data_reference_index\n // 16 bytes pre_defined + reserved\n for (let i = 0; i < 16; i++) writer.writeUint8(0)\n writer.writeUint16(config.width)\n writer.writeUint16(config.height)\n writer.writeUint32(RESOLUTION_72_DPI)\n writer.writeUint32(RESOLUTION_72_DPI)\n writer.writeUint32(0) // reserved\n writer.writeUint16(1) // frame_count\n // 32 bytes compressorname\n for (let i = 0; i < 32; i++) writer.writeUint8(0)\n writer.writeUint16(0x0018) // depth = 24\n writer.writeInt16(-1) // pre_defined\n return box('avc1', writer.toUint8Array(), avcC(config))\n}\n\nfunction esds(config: AudioTrackConfig): Uint8Array {\n const asc = config.audioSpecificConfig\n\n // DecoderSpecificInfo (tag 0x05)\n const dsi = new BufferWriter(2 + asc.byteLength)\n dsi.writeUint8(0x05)\n dsi.writeUint8(asc.byteLength)\n dsi.writeBytes(asc)\n\n // DecoderConfigDescriptor (tag 0x04)\n const dcd = new BufferWriter(2 + 13 + dsi.position)\n dcd.writeUint8(0x04)\n dcd.writeUint8(13 + dsi.position)\n dcd.writeUint8(OBJECT_TYPE_AAC)\n dcd.writeUint8(STREAM_TYPE_AUDIO)\n dcd.writeUint8(0) // bufferSizeDB (3 bytes)\n dcd.writeUint8(0)\n dcd.writeUint8(0)\n dcd.writeUint32(0) // maxBitrate\n dcd.writeUint32(0) // avgBitrate\n dcd.writeBytes(dsi.toUint8Array())\n\n // SLConfigDescriptor (tag 0x06)\n const slc = new BufferWriter(3)\n slc.writeUint8(0x06)\n slc.writeUint8(1)\n slc.writeUint8(0x02) // predefined = 2\n\n // ES_Descriptor (tag 0x03)\n const esPayloadSize = 3 + dcd.position + slc.position\n const es = new BufferWriter(2 + esPayloadSize)\n es.writeUint8(0x03)\n es.writeUint8(esPayloadSize)\n es.writeUint16(1) // ES_ID\n es.writeUint8(0) // flags\n es.writeBytes(dcd.toUint8Array())\n es.writeBytes(slc.toUint8Array())\n\n return fullBox('esds', 0, 0, es.toUint8Array())\n}\n\nfunction avcC(config: VideoTrackConfig): Uint8Array {\n const writer = new BufferWriter(\n 11 + config.sps.byteLength + config.pps.byteLength\n )\n writer.writeUint8(1) // configurationVersion\n writer.writeUint8(config.profileIdc)\n writer.writeUint8(config.profileCompatibility)\n writer.writeUint8(config.levelIdc)\n writer.writeUint8(3) // lengthSizeMinusOne = 3 (4 bytes)\n writer.writeUint8(0xe1) // numOfSequenceParameterSets = 1\n writer.writeUint16(config.sps.byteLength)\n writer.writeBytes(config.sps)\n writer.writeUint8(1) // numOfPictureParameterSets\n writer.writeUint16(config.pps.byteLength)\n writer.writeBytes(config.pps)\n return box('avcC', writer.toUint8Array())\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * ISO BMFF (MP4) box writing utilities.\n *\n * Provides functions to construct the fMP4 boxes required by MSE:\n * - `ftyp`: file type\n * - `moov` / `mvhd` / `trak` / `mdia` / `minf` / `stbl`: track metadata\n * - `moof` / `mdat`: media fragments\n *\n * @module\n */\n\nimport { BufferWriter } from '@amazon/vinyl-util'\n\n/** ISO 14496-12 identity matrix in 16.16 / 2.30 fixed point. */\nconst UNITY_MATRIX = [\n 0x00010000, 0, 0, 0, 0x00010000, 0, 0, 0, 0x40000000,\n] as const\n\n/** 90 kHz timescale from ISO 13818-1 (MPEG system clock). */\nexport const MPEG_TIMESCALE = 90000\n\n/** ISO 639-2/T packed language code for 'und' (undetermined). */\nconst LANGUAGE_UNDETERMINED = 0x55c4\n\n/**\n * Writes a generic MP4 box (atom). The size field is automatically computed.\n */\nexport function box(type: string, ...payloads: Uint8Array[]): Uint8Array {\n let size = 8\n for (const p of payloads) size += p.byteLength\n const writer = new BufferWriter(size)\n writer.writeUint32(size)\n writer.writeString(type)\n for (const p of payloads) writer.writeBytes(p)\n return writer.toUint8Array()\n}\n\n/**\n * Writes a full box with version and flags.\n */\nexport function fullBox(\n type: string,\n version: number,\n flags: number,\n payload: Uint8Array\n): Uint8Array {\n const size = 12 + payload.byteLength\n const writer = new BufferWriter(size)\n writer.writeUint32(size)\n writer.writeString(type)\n writer.writeUint8(version)\n // 24-bit flags\n writer.writeUint8((flags >> 16) & 0xff)\n writer.writeUint8((flags >> 8) & 0xff)\n writer.writeUint8(flags & 0xff)\n writer.writeBytes(payload)\n return writer.toUint8Array()\n}\n\nexport interface FtypOptions {\n readonly majorBrand?: string\n readonly minorVersion?: number\n readonly compatibleBrands?: readonly string[]\n}\n\nconst DEFAULT_FTYP: Required<FtypOptions> = {\n majorBrand: 'isom',\n minorVersion: 0x200,\n compatibleBrands: ['isom', 'iso6', 'mp41'],\n}\n\n/**\n * Generates the ftyp box.\n */\nexport function ftyp(options?: FtypOptions): Uint8Array {\n const { majorBrand, minorVersion, compatibleBrands } = {\n ...DEFAULT_FTYP,\n ...options,\n }\n const writer = new BufferWriter(8 + compatibleBrands.length * 4)\n writer.writeString(majorBrand)\n writer.writeUint32(minorVersion)\n for (const brand of compatibleBrands) writer.writeString(brand)\n return box('ftyp', writer.toUint8Array())\n}\n\n/**\n * Generates a moov box from pre-built track boxes.\n */\nexport function moov(...traks: Uint8Array[]): Uint8Array {\n const trakAndMvex: Uint8Array[] = []\n for (let i = 0; i < traks.length; i++) {\n trakAndMvex.push(traks[i], mvex(i + 1))\n }\n return box('moov', mvhd(), ...trakAndMvex)\n}\n\nexport interface MvhdOptions {\n readonly timescale?: number\n readonly duration?: number\n readonly rate?: number\n readonly volume?: number\n}\n\nconst DEFAULT_MVHD: Required<MvhdOptions> = {\n timescale: MPEG_TIMESCALE,\n duration: 0,\n rate: 1.0,\n volume: 1.0,\n}\n\nfunction mvhd(options?: MvhdOptions): Uint8Array {\n const { timescale, duration, rate, volume } = {\n ...DEFAULT_MVHD,\n ...options,\n }\n const writer = new BufferWriter(96)\n writer.writeUint32(0) // creation_time\n writer.writeUint32(0) // modification_time\n writer.writeUint32(timescale)\n writer.writeUint32(duration)\n writer.writeUint32(rate * 0x10000) // 16.16 fixed point\n writer.writeUint16(volume * 0x100) // 8.8 fixed point\n // 10 bytes reserved\n for (let i = 0; i < 10; i++) writer.writeUint8(0)\n for (const v of UNITY_MATRIX) writer.writeUint32(v)\n // 6 x uint32 pre_defined\n for (let i = 0; i < 6; i++) writer.writeUint32(0)\n writer.writeUint32(0xffffffff) // next_track_ID\n return fullBox('mvhd', 0, 0, writer.toUint8Array())\n}\n\nexport interface AudioTrackOptions {\n readonly trackId: number\n readonly sampleRate: number\n readonly channelCount: number\n readonly sampleEntry: Uint8Array\n}\n\nexport interface VideoTrackOptions {\n readonly trackId: number\n readonly width: number\n readonly height: number\n readonly timescale?: number\n readonly sampleEntry: Uint8Array\n}\n\nexport function audioTrak(options: AudioTrackOptions): Uint8Array {\n return box(\n 'trak',\n tkhd(options.trackId, 0, 0, options.channelCount > 0 ? 1.0 : 0),\n box(\n 'mdia',\n mdhd(options.sampleRate),\n hdlr('soun', 'SoundHandler'),\n box('minf', smhd(), dinf(), audioStbl(options.sampleEntry))\n )\n )\n}\n\nexport function videoTrak(options: VideoTrackOptions): Uint8Array {\n return box(\n 'trak',\n tkhd(options.trackId, options.width, options.height, 0),\n box(\n 'mdia',\n mdhd(options.timescale ?? MPEG_TIMESCALE),\n hdlr('vide', 'VideoHandler'),\n box('minf', vmhd(), dinf(), videoStbl(options.sampleEntry))\n )\n )\n}\n\nfunction tkhd(\n trackId: number,\n width: number,\n height: number,\n volume: number\n): Uint8Array {\n const writer = new BufferWriter(80)\n writer.writeUint32(0) // creation_time\n writer.writeUint32(0) // modification_time\n writer.writeUint32(trackId)\n writer.writeUint32(0) // reserved\n writer.writeUint32(0) // duration\n writer.writeUint32(0) // reserved\n writer.writeUint32(0) // reserved\n writer.writeUint16(0) // layer\n writer.writeUint16(0) // alternate_group\n writer.writeUint16(volume * 0x100) // volume (8.8 fixed point)\n writer.writeUint16(0) // reserved\n // unity matrix\n for (const v of UNITY_MATRIX) writer.writeUint32(v)\n\n writer.writeUint32(width * 0x10000) // width (16.16 fixed point)\n writer.writeUint32(height * 0x10000) // height (16.16 fixed point)\n return fullBox('tkhd', 0, 0x000003, writer.toUint8Array())\n}\n\nfunction mdhd(timescale: number): Uint8Array {\n const writer = new BufferWriter(20)\n writer.writeUint32(0) // creation_time\n writer.writeUint32(0) // modification_time\n writer.writeUint32(timescale)\n writer.writeUint32(0) // duration\n writer.writeUint16(LANGUAGE_UNDETERMINED)\n writer.writeUint16(0) // pre_defined\n return fullBox('mdhd', 0, 0, writer.toUint8Array())\n}\n\nfunction hdlr(handlerType: string, name: string): Uint8Array {\n const writer = new BufferWriter(21 + name.length)\n writer.writeUint32(0) // pre_defined\n writer.writeString(handlerType)\n writer.writeUint32(0) // reserved\n writer.writeUint32(0) // reserved\n writer.writeUint32(0) // reserved\n writer.writeString(name)\n writer.writeUint8(0) // null terminator\n return fullBox('hdlr', 0, 0, writer.toUint8Array())\n}\n\nfunction smhd(): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint16(0) // balance\n writer.writeUint16(0) // reserved\n return fullBox('smhd', 0, 0, writer.toUint8Array())\n}\n\nfunction vmhd(): Uint8Array {\n const writer = new BufferWriter(8)\n writer.writeUint16(0) // graphicsmode\n writer.writeUint16(0) // opcolor\n writer.writeUint16(0)\n writer.writeUint16(0)\n return fullBox('vmhd', 0, 0x000001, writer.toUint8Array())\n}\n\nfunction dinf(): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(1) // entry_count\n const urlBox = fullBox('url ', 0, 0x000001, new Uint8Array(0))\n return box(\n 'dinf',\n fullBox('dref', 0, 0, concatUint8(writer.toUint8Array(), urlBox))\n )\n}\n\nfunction audioStbl(sampleEntry: Uint8Array): Uint8Array {\n return box('stbl', stsd(sampleEntry), stts(), stsc(), stsz(), stco())\n}\n\nfunction videoStbl(sampleEntry: Uint8Array): Uint8Array {\n return box('stbl', stsd(sampleEntry), stts(), stsc(), stsz(), stco())\n}\n\nfunction stsd(sampleEntry: Uint8Array): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(1) // entry_count\n return fullBox(\n 'stsd',\n 0,\n 0,\n concatUint8(writer.toUint8Array(), sampleEntry)\n )\n}\n\nfunction stts(): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(0) // entry_count\n return fullBox('stts', 0, 0, writer.toUint8Array())\n}\n\nfunction stsc(): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(0) // entry_count\n return fullBox('stsc', 0, 0, writer.toUint8Array())\n}\n\nfunction stsz(): Uint8Array {\n const writer = new BufferWriter(8)\n writer.writeUint32(0) // sample_size\n writer.writeUint32(0) // sample_count\n return fullBox('stsz', 0, 0, writer.toUint8Array())\n}\n\nfunction stco(): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(0) // entry_count\n return fullBox('stco', 0, 0, writer.toUint8Array())\n}\n\nfunction mvex(trackId: number): Uint8Array {\n return box('mvex', trex(trackId))\n}\n\nfunction trex(trackId: number): Uint8Array {\n const writer = new BufferWriter(20)\n writer.writeUint32(trackId)\n writer.writeUint32(1) // default_sample_description_index\n writer.writeUint32(0) // default_sample_duration\n writer.writeUint32(0) // default_sample_size\n writer.writeUint32(0) // default_sample_flags\n return fullBox('trex', 0, 0, writer.toUint8Array())\n}\n\nexport interface MoofOptions {\n readonly sequenceNumber: number\n readonly trackId: number\n readonly baseDecodeTime: number\n readonly samples: readonly SampleEntry[]\n}\n\nexport interface SampleEntry {\n readonly duration: number\n readonly size: number\n readonly flags?: number\n readonly compositionTimeOffset?: number\n}\n\n/**\n * Generates a moof (movie fragment) box.\n */\nexport function moof(options: MoofOptions): Uint8Array {\n return box('moof', mfhd(options.sequenceNumber), traf(options))\n}\n\nfunction mfhd(sequenceNumber: number): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(sequenceNumber)\n return fullBox('mfhd', 0, 0, writer.toUint8Array())\n}\n\nfunction traf(options: MoofOptions): Uint8Array {\n return box(\n 'traf',\n tfhd(options.trackId),\n tfdt(options.baseDecodeTime),\n trun(options.samples)\n )\n}\n\nfunction tfhd(trackId: number): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(trackId)\n // flags: default-base-is-moof (0x020000)\n return fullBox('tfhd', 0, 0x020000, writer.toUint8Array())\n}\n\nfunction tfdt(baseDecodeTime: number): Uint8Array {\n const writer = new BufferWriter(4)\n writer.writeUint32(baseDecodeTime)\n return fullBox('tfdt', 0, 0, writer.toUint8Array())\n}\n\nfunction trun(samples: readonly SampleEntry[]): Uint8Array {\n // flags: data-offset-present (0x01), sample-duration-present (0x100),\n // sample-size-present (0x200), sample-flags-present (0x400)\n const hasFlags = samples.some((s) => s.flags != null)\n const hasCto = samples.some((s) => s.compositionTimeOffset != null)\n let flags = 0x000001 | 0x000100 | 0x000200\n if (hasFlags) flags |= 0x000400\n if (hasCto) flags |= 0x000800\n\n let entrySize = 8 // duration + size\n if (hasFlags) entrySize += 4\n if (hasCto) entrySize += 4\n\n const writer = new BufferWriter(8 + samples.length * entrySize)\n writer.writeUint32(samples.length) // sample_count\n writer.writeUint32(0) // data_offset (placeholder, patched later)\n\n for (const sample of samples) {\n writer.writeUint32(sample.duration)\n writer.writeUint32(sample.size)\n if (hasFlags) writer.writeUint32(sample.flags ?? 0)\n if (hasCto) writer.writeInt32(sample.compositionTimeOffset ?? 0)\n }\n\n const result = fullBox('trun', hasCto ? 1 : 0, flags, writer.toUint8Array())\n return result\n}\n\n/**\n * Generates an mdat box wrapping raw media data.\n */\nexport function mdat(data: Uint8Array): Uint8Array {\n return box('mdat', data)\n}\n\n/**\n * Patches the trun data_offset field. The data_offset is the byte offset from\n * the start of the moof to the first byte of the mdat payload.\n */\nexport function patchDataOffset(moofData: Uint8Array, moofSize: number): void {\n // data_offset = moofSize + 8 (mdat header)\n const dataOffset = moofSize + 8\n // Find trun box and patch the data_offset field.\n // trun is inside moof > traf. Walk the box tree.\n let pos = 8 // skip moof header\n while (pos < moofData.length) {\n const boxSize =\n ((moofData[pos] << 24) |\n (moofData[pos + 1] << 16) |\n (moofData[pos + 2] << 8) |\n moofData[pos + 3]) >>>\n 0\n const boxType = String.fromCharCode(\n moofData[pos + 4],\n moofData[pos + 5],\n moofData[pos + 6],\n moofData[pos + 7]\n )\n if (boxType === 'traf') {\n // Recurse into traf\n let trafPos = pos + 8\n while (trafPos < pos + boxSize) {\n const innerSize =\n ((moofData[trafPos] << 24) |\n (moofData[trafPos + 1] << 16) |\n (moofData[trafPos + 2] << 8) |\n moofData[trafPos + 3]) >>>\n 0\n const innerType = String.fromCharCode(\n moofData[trafPos + 4],\n moofData[trafPos + 5],\n moofData[trafPos + 6],\n moofData[trafPos + 7]\n )\n if (innerType === 'trun') {\n // data_offset is at offset 12+4 = 16 from box start\n // (8 box header + 4 version/flags + 4 sample_count)\n const offsetPos = trafPos + 16\n moofData[offsetPos] = (dataOffset >> 24) & 0xff\n moofData[offsetPos + 1] = (dataOffset >> 16) & 0xff\n moofData[offsetPos + 2] = (dataOffset >> 8) & 0xff\n moofData[offsetPos + 3] = dataOffset & 0xff\n return\n }\n trafPos += innerSize\n }\n }\n pos += boxSize\n }\n}\n\nfunction concatUint8(...arrays: Uint8Array[]): Uint8Array {\n let total = 0\n for (const a of arrays) total += a.byteLength\n const result = new Uint8Array(total)\n let offset = 0\n for (const a of arrays) {\n result.set(a, offset)\n offset += a.byteLength\n }\n return result\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * MPEG-TS constants and packet-level parsing.\n *\n * An MPEG Transport Stream consists of fixed 188-byte packets. Each packet\n * starts with a sync byte (0x47) and carries a 13-bit PID identifying the\n * elementary stream. The PAT (PID 0) maps program numbers to PMT PIDs, and\n * the PMT lists the elementary stream PIDs with their stream types.\n *\n * @module\n */\n\nexport const TS_PACKET_SIZE = 188\nexport const TS_SYNC_BYTE = 0x47\n\n/** Well-known stream type identifiers from ISO/IEC 13818-1. */\nexport const STREAM_TYPE_AAC = 0x0f\nexport const STREAM_TYPE_H264 = 0x1b\nexport const STREAM_TYPE_H265 = 0x24\nexport const STREAM_TYPE_ID3 = 0x15\n\nexport interface TsPacketHeader {\n readonly pid: number\n readonly payloadUnitStartIndicator: boolean\n readonly adaptationFieldControl: number\n readonly continuityCounter: number\n}\n\nexport interface PmtEntry {\n readonly pid: number\n readonly streamType: number\n}\n\n/**\n * Parses a single 188-byte TS packet header.\n */\nexport function parseTsPacketHeader(\n data: Uint8Array,\n offset: number\n): TsPacketHeader {\n const byte1 = data[offset + 1]\n const byte2 = data[offset + 2]\n const byte3 = data[offset + 3]\n return {\n pid: ((byte1 & 0x1f) << 8) | byte2,\n payloadUnitStartIndicator: (byte1 & 0x40) !== 0,\n adaptationFieldControl: (byte3 >> 4) & 0x03,\n continuityCounter: byte3 & 0x0f,\n }\n}\n\n/**\n * Returns the offset of the payload within a TS packet.\n */\nexport function getPayloadOffset(\n data: Uint8Array,\n offset: number,\n adaptationFieldControl: number\n): number {\n let payloadOffset = offset + 4\n if (adaptationFieldControl >= 2) {\n // Adaptation field present\n payloadOffset += 1 + data[offset + 4]\n }\n return payloadOffset\n}\n\n/**\n * Parses the PAT (Program Association Table) to find the PMT PID.\n */\nexport function parsePat(data: Uint8Array, offset: number): number {\n // Skip pointer field\n const pointerField = data[offset]\n let pos = offset + 1 + pointerField\n // Skip table_id(1), section_syntax_indicator+length(2), transport_stream_id(2),\n // version/current(1), section_number(1), last_section_number(1)\n pos += 8\n // First program entry: program_number(2) + PMT_PID(2)\n // Skip program_number\n pos += 2\n return ((data[pos] & 0x1f) << 8) | data[pos + 1]\n}\n\n/**\n * Parses the PMT (Program Map Table) to extract elementary stream entries.\n */\nexport function parsePmt(data: Uint8Array, offset: number): PmtEntry[] {\n const pointerField = data[offset]\n let pos = offset + 1 + pointerField\n\n // table_id(1)\n pos += 1\n const sectionLength = ((data[pos] & 0x0f) << 8) | data[pos + 1]\n pos += 2\n const sectionEnd = pos + sectionLength\n // transport_stream_id(2), version/current(1), section_number(1), last_section_number(1)\n pos += 5\n // PCR_PID(2)\n pos += 2\n // program_info_length\n const programInfoLength = ((data[pos] & 0x0f) << 8) | data[pos + 1]\n pos += 2 + programInfoLength\n\n const entries: PmtEntry[] = []\n // -4 for CRC32\n while (pos < sectionEnd - 4) {\n const streamType = data[pos]\n pos += 1\n const pid = ((data[pos] & 0x1f) << 8) | data[pos + 1]\n pos += 2\n const esInfoLength = ((data[pos] & 0x0f) << 8) | data[pos + 1]\n pos += 2 + esInfoLength\n entries.push({ pid, streamType })\n }\n return entries\n}\n\nexport interface DemuxedStream {\n readonly streamType: number\n readonly pid: number\n readonly data: Uint8Array[]\n}\n\n/**\n * Demuxes a complete MPEG-TS segment into elementary streams.\n * Reassembles PES packets from TS packets for each PID.\n */\nexport function demuxTsSegment(segment: Uint8Array): DemuxedStream[] {\n let pmtPid = -1\n const pmtEntries: PmtEntry[] = []\n const pesBuffers = new Map<number, Uint8Array[]>()\n\n // First pass: find PAT and PMT\n for (let i = 0; i + TS_PACKET_SIZE <= segment.length; i += TS_PACKET_SIZE) {\n if (segment[i] !== TS_SYNC_BYTE) continue\n const header = parseTsPacketHeader(segment, i)\n const payloadStart = getPayloadOffset(\n segment,\n i,\n header.adaptationFieldControl\n )\n if (\n header.adaptationFieldControl === 0 ||\n header.adaptationFieldControl === 2\n )\n continue\n\n if (header.pid === 0) {\n pmtPid = parsePat(segment, payloadStart)\n } else if (header.pid === pmtPid && pmtEntries.length === 0) {\n pmtEntries.push(...parsePmt(segment, payloadStart))\n }\n }\n\n // Initialize buffers for known elementary streams\n const pidToStreamType = new Map<number, number>()\n for (const entry of pmtEntries) {\n pidToStreamType.set(entry.pid, entry.streamType)\n pesBuffers.set(entry.pid, [])\n }\n\n // Second pass: collect PES data\n for (let i = 0; i + TS_PACKET_SIZE <= segment.length; i += TS_PACKET_SIZE) {\n if (segment[i] !== TS_SYNC_BYTE) continue\n const header = parseTsPacketHeader(segment, i)\n if (\n header.adaptationFieldControl === 0 ||\n header.adaptationFieldControl === 2\n )\n continue\n\n const buffers = pesBuffers.get(header.pid)\n if (!buffers) continue\n\n const payloadStart = getPayloadOffset(\n segment,\n i,\n header.adaptationFieldControl\n )\n const payloadEnd = i + TS_PACKET_SIZE\n if (payloadStart < payloadEnd) {\n buffers.push(segment.slice(payloadStart, payloadEnd))\n }\n }\n\n const streams: DemuxedStream[] = []\n for (const [pid, buffers] of pesBuffers) {\n if (buffers.length === 0) continue\n streams.push({\n pid,\n streamType: pidToStreamType.get(pid)!,\n data: buffers,\n })\n }\n return streams\n}\n\n/**\n * Concatenates an array of Uint8Arrays into a single Uint8Array.\n */\nexport function concatBuffers(buffers: Uint8Array[]): Uint8Array {\n let totalLength = 0\n for (const buf of buffers) totalLength += buf.byteLength\n const result = new Uint8Array(totalLength)\n let offset = 0\n for (const buf of buffers) {\n result.set(buf, offset)\n offset += buf.byteLength\n }\n return result\n}\n\n/**\n * Strips the PES header from raw PES packet data, returning the elementary\n * stream payload.\n */\nexport function stripPesHeader(pesData: Uint8Array): Uint8Array {\n // PES start code: 0x00 0x00 0x01\n if (pesData[0] !== 0 || pesData[1] !== 0 || pesData[2] !== 1) {\n // No PES header, return as-is (continuation data)\n return pesData\n }\n // PES header data length is at byte 8\n const pesHeaderDataLength = pesData[8]\n return pesData.subarray(9 + pesHeaderDataLength)\n}\n\n/**\n * Extracts the PTS (Presentation Time Stamp) from a PES header.\n * Returns the PTS in 90kHz clock ticks, or -1 if not present.\n */\nexport function parsePesPts(pesData: Uint8Array): number {\n if (pesData[0] !== 0 || pesData[1] !== 0 || pesData[2] !== 1) return -1\n const flags = pesData[7]\n if ((flags & 0x80) === 0) return -1\n // PTS is encoded in 5 bytes starting at byte 9\n const byte9 = pesData[9]\n const byte10 = pesData[10]\n const byte11 = pesData[11]\n const byte12 = pesData[12]\n const byte13 = pesData[13]\n return (\n (byte9 & 0x0e) * 0x20000000 + // (byte9 & 0x0E) << 29\n ((byte10 & 0xff) << 22) +\n ((byte11 & 0xfe) << 14) +\n ((byte12 & 0xff) << 7) +\n ((byte13 & 0xfe) >>> 1)\n )\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Transmuxer that converts MPEG-TS / raw ADTS AAC segments into fMP4\n * fragments consumable by MSE SourceBuffer.\n *\n * The transmuxer produces two outputs:\n * 1. An initialization segment (ftyp + moov) \u2014 append once per track.\n * 2. Media segments (moof + mdat) \u2014 append per HLS segment.\n *\n * @module\n */\n\nimport {\n type AdtsFrame,\n adtsSampleRate,\n buildAudioSpecificConfig,\n parseAdtsFrames,\n} from '../aac/adts'\nimport {\n type AudioTrackConfig,\n type VideoTrackConfig,\n mp4aSampleEntry,\n avc1SampleEntry,\n} from './sampleEntry'\nimport {\n type SampleEntry,\n audioTrak,\n ftyp,\n mdat,\n moov,\n moof,\n patchDataOffset,\n videoTrak,\n MPEG_TIMESCALE,\n} from '../mp4/mp4'\nimport {\n STREAM_TYPE_AAC,\n STREAM_TYPE_H264,\n concatBuffers,\n demuxTsSegment,\n parsePesPts,\n} from '../mpegts/mpegts'\n\nexport interface TransmuxResult {\n /** The initialization segment (ftyp + moov). Always present. */\n readonly initSegment: ArrayBuffer\n /** The media segment (moof + mdat). */\n readonly mediaSegment: ArrayBuffer\n /** Duration of this segment in seconds. */\n readonly duration: number\n}\n\ninterface TrackState {\n initSegment: Uint8Array | null\n sequenceNumber: number\n audioConfig: AudioTrackConfig | null\n videoConfig: VideoTrackConfig | null\n audioDecodeTime: number\n videoDecodeTime: number\n}\n\n/**\n * Creates a stateful transmuxer instance. Call `transmux()` for each HLS\n * segment in order. The init segment is always returned (cached after first\n * call).\n */\nexport function createTransmuxer() {\n const state: TrackState = {\n initSegment: null,\n sequenceNumber: 1,\n audioConfig: null,\n videoConfig: null,\n audioDecodeTime: 0,\n videoDecodeTime: 0,\n }\n\n return { transmux: (data: ArrayBuffer) => transmux(state, data) }\n}\n\n/**\n * Builds the ftyp + moov init segment and stores it in state.\n */\nfunction buildInitSegment(state: TrackState, moovBox: Uint8Array): void {\n const ftypBox = ftyp()\n const init = new Uint8Array(ftypBox.byteLength + moovBox.byteLength)\n init.set(ftypBox, 0)\n init.set(moovBox, ftypBox.byteLength)\n state.initSegment = init\n}\n\n/** Returns the cached init segment as an ArrayBuffer. */\nfunction getInitSegment(state: TrackState): ArrayBuffer {\n const init = state.initSegment!\n return init.buffer.slice(\n init.byteOffset,\n init.byteOffset + init.byteLength\n ) as ArrayBuffer\n}\n\nfunction transmux(state: TrackState, data: ArrayBuffer): TransmuxResult {\n let segment: Uint8Array = new Uint8Array(data)\n\n // Skip ID3 tags that may precede the audio/video data.\n // ID3 tags are common in HLS for carrying timestamps.\n segment = skipId3Tags(segment)\n\n // Detect format: MPEG-TS starts with 0x47, ADTS starts with 0xFFF\n const isMpegTs = segment[0] === 0x47\n const isAdts = segment[0] === 0xff && (segment[1] & 0xf0) === 0xf0\n\n if (isMpegTs) {\n return transmuxMpegTs(state, segment)\n } else if (isAdts) {\n return transmuxAdts(state, segment)\n }\n\n throw new Error('Unsupported segment format: expected MPEG-TS or ADTS')\n}\n\n/**\n * Skips any leading ID3v2 tags. Each tag has a 10-byte header where bytes\n * 6-9 encode the size as a synchsafe integer.\n */\nfunction skipId3Tags(data: Uint8Array): Uint8Array {\n let offset = 0\n while (\n offset + 10 <= data.length &&\n data[offset] === 0x49 && // 'I'\n data[offset + 1] === 0x44 && // 'D'\n data[offset + 2] === 0x33 // '3'\n ) {\n const size =\n ((data[offset + 6] & 0x7f) << 21) |\n ((data[offset + 7] & 0x7f) << 14) |\n ((data[offset + 8] & 0x7f) << 7) |\n (data[offset + 9] & 0x7f)\n offset += 10 + size\n }\n return offset > 0 ? data.subarray(offset) : data\n}\n\nfunction transmuxAdts(state: TrackState, data: Uint8Array): TransmuxResult {\n const frames = parseAdtsFrames(data)\n if (frames.length === 0) {\n throw new Error('No ADTS frames found in segment')\n }\n\n const firstFrame = frames[0]\n\n if (!state.audioConfig) {\n const sampleRate = adtsSampleRate(firstFrame.samplingFrequencyIndex)\n state.audioConfig = {\n audioObjectType: firstFrame.audioObjectType,\n samplingFrequencyIndex: firstFrame.samplingFrequencyIndex,\n channelConfiguration: firstFrame.channelConfiguration,\n sampleRate,\n audioSpecificConfig: buildAudioSpecificConfig(firstFrame),\n }\n buildInitSegment(\n state,\n moov(\n audioTrak({\n trackId: 1,\n sampleRate: state.audioConfig.sampleRate,\n channelCount: state.audioConfig.channelConfiguration,\n sampleEntry: mp4aSampleEntry(state.audioConfig),\n })\n )\n )\n }\n\n const sampleRate = state.audioConfig.sampleRate\n const samplesPerFrame = 1024 // AAC-LC always uses 1024 samples per frame\n\n // Build sample table and raw frame data\n const samples: SampleEntry[] = []\n const frameDataParts: Uint8Array[] = []\n\n for (const frame of frames) {\n const rawData = data.subarray(\n frame.offset + frame.headerSize,\n frame.offset + frame.frameLength\n )\n samples.push({\n duration: samplesPerFrame,\n size: rawData.byteLength,\n })\n frameDataParts.push(rawData)\n }\n\n const rawMediaData = concatBuffers(frameDataParts)\n const duration = (frames.length * samplesPerFrame) / sampleRate\n\n const moofBox = moof({\n sequenceNumber: state.sequenceNumber++,\n trackId: 1,\n baseDecodeTime: state.audioDecodeTime,\n samples,\n })\n state.audioDecodeTime += frames.length * samplesPerFrame\n patchDataOffset(moofBox, moofBox.byteLength)\n const mdatBox = mdat(rawMediaData)\n\n const mediaSegment = new Uint8Array(moofBox.byteLength + mdatBox.byteLength)\n mediaSegment.set(moofBox, 0)\n mediaSegment.set(mdatBox, moofBox.byteLength)\n\n return {\n initSegment: getInitSegment(state),\n mediaSegment: mediaSegment.buffer.slice(\n mediaSegment.byteOffset,\n mediaSegment.byteOffset + mediaSegment.byteLength\n ),\n duration,\n }\n}\n\nfunction transmuxMpegTs(state: TrackState, data: Uint8Array): TransmuxResult {\n const streams = demuxTsSegment(data)\n\n const audioStream = streams.find((s) => s.streamType === STREAM_TYPE_AAC)\n const videoStream = streams.find((s) => s.streamType === STREAM_TYPE_H264)\n\n // Process audio\n let audioFrames: AdtsFrame[] = []\n let audioRawData: Uint8Array | null = null\n let audioConfig = state.audioConfig\n\n if (audioStream) {\n const pesData = concatBuffers(audioStream.data)\n const esData = extractElementaryStream(pesData)\n audioFrames = parseAdtsFrames(esData)\n\n if (audioFrames.length > 0 && !audioConfig) {\n const firstFrame = audioFrames[0]\n const sampleRate = adtsSampleRate(firstFrame.samplingFrequencyIndex)\n audioConfig = {\n audioObjectType: firstFrame.audioObjectType,\n samplingFrequencyIndex: firstFrame.samplingFrequencyIndex,\n channelConfiguration: firstFrame.channelConfiguration,\n sampleRate,\n audioSpecificConfig: buildAudioSpecificConfig(firstFrame),\n }\n state.audioConfig = audioConfig\n }\n\n // Strip ADTS headers from frames\n const parts: Uint8Array[] = []\n for (const frame of audioFrames) {\n parts.push(\n esData.subarray(\n frame.offset + frame.headerSize,\n frame.offset + frame.frameLength\n )\n )\n }\n audioRawData = concatBuffers(parts)\n }\n\n // Process video\n let videoNalus: Uint8Array[] = []\n let videoConfig = state.videoConfig\n let videoFrameDuration = 3754 // default ~23.976fps at 90kHz\n const videoPtsList: number[] = []\n\n if (videoStream) {\n const pesData = concatBuffers(videoStream.data)\n\n // Extract PTS timestamps from PES headers to compute frame duration and CTOs\n let pesOff = 0\n while (pesOff + 9 < pesData.length) {\n if (\n pesData[pesOff] === 0 &&\n pesData[pesOff + 1] === 0 &&\n pesData[pesOff + 2] === 1 &&\n pesData[pesOff + 3] >= 0xbc\n ) {\n const pts = parsePesPts(pesData.subarray(pesOff))\n if (pts >= 0) videoPtsList.push(pts)\n const pLen = (pesData[pesOff + 4] << 8) | pesData[pesOff + 5]\n if (pLen > 0) {\n pesOff += 6 + pLen\n } else {\n const hdrLen = pesData[pesOff + 8]\n pesOff += 9 + hdrLen\n }\n } else {\n pesOff++\n }\n }\n if (videoPtsList.length >= 2) {\n // Compute frame duration from sorted PTS deltas\n const sorted = [...videoPtsList].sort((a, b) => a - b)\n const deltas: number[] = []\n for (let i = 1; i < sorted.length; i++)\n deltas.push(sorted[i] - sorted[i - 1])\n deltas.sort((a, b) => a - b)\n videoFrameDuration = deltas[deltas.length >> 1] || 3754\n }\n\n const esData = extractElementaryStream(pesData)\n videoNalus = extractH264Nalus(esData)\n\n if (!videoConfig) {\n const sps = videoNalus.find((n) => (n[0] & 0x1f) === 7)\n const pps = videoNalus.find((n) => (n[0] & 0x1f) === 8)\n if (sps && pps) {\n const { width, height } = parseSpsInfo(sps)\n videoConfig = {\n width,\n height,\n sps,\n pps,\n profileIdc: sps[1],\n profileCompatibility: sps[2],\n levelIdc: sps[3],\n }\n state.videoConfig = videoConfig\n }\n }\n }\n\n // Generate init segment if needed\n if (!state.initSegment && (audioConfig || videoConfig)) {\n const traks: Uint8Array[] = []\n if (videoConfig) {\n traks.push(\n videoTrak({\n trackId: traks.length + 1,\n width: videoConfig.width,\n height: videoConfig.height,\n sampleEntry: avc1SampleEntry(videoConfig),\n })\n )\n }\n if (audioConfig) {\n traks.push(\n audioTrak({\n trackId: traks.length + 1,\n sampleRate: audioConfig.sampleRate,\n channelCount: audioConfig.channelConfiguration,\n sampleEntry: mp4aSampleEntry(audioConfig),\n })\n )\n }\n buildInitSegment(state, moov(...traks))\n }\n\n // Build media segment - for now handle audio track (trackId=1 for video, 2 for audio in muxed)\n const fragments: Uint8Array[] = []\n let duration = 0\n\n if (videoConfig && videoNalus.length > 0) {\n const trackId = 1\n\n // Group NAL units into access units. Each IDR or non-IDR slice\n // starts a new access unit. SPS/PPS are prepended to the next IDR.\n const accessUnits: { nalus: Uint8Array[]; isIdr: boolean }[] = []\n let pendingParams: Uint8Array[] = []\n\n for (const nalu of videoNalus) {\n const naluType = nalu[0] & 0x1f\n if (naluType === 7 || naluType === 8) {\n // SPS or PPS - buffer for next IDR\n pendingParams.push(nalu)\n } else if (naluType === 6) {\n // SEI - attach to next slice's access unit\n pendingParams.push(nalu)\n } else if (naluType === 5) {\n // IDR slice - include SPS/PPS/SEI before it\n accessUnits.push({\n nalus: [...pendingParams, nalu],\n isIdr: true,\n })\n pendingParams = []\n } else if (naluType === 1) {\n // Non-IDR slice - include any pending SEI\n accessUnits.push({\n nalus:\n pendingParams.length > 0\n ? [...pendingParams, nalu]\n : [nalu],\n isIdr: false,\n })\n pendingParams = []\n }\n // Skip other NAL types (SEI, AUD, etc.)\n }\n\n if (accessUnits.length > 0) {\n const naluParts: Uint8Array[] = []\n const samples: SampleEntry[] = []\n const frameDuration = videoFrameDuration\n\n // Compute composition time offsets from PTS.\n // DTS increases linearly; CTO = PTS - DTS.\n const basePts =\n videoPtsList.length > 0 ? Math.min(...videoPtsList) : 0\n const baseDts = basePts // first DTS = first PTS for simplicity\n\n for (let auIdx = 0; auIdx < accessUnits.length; auIdx++) {\n const au = accessUnits[auIdx]\n // Concatenate all NAL units in this access unit with length prefixes\n let auSize = 0\n const auParts: Uint8Array[] = []\n for (const nalu of au.nalus) {\n const lengthPrefixed = new Uint8Array(4 + nalu.byteLength)\n lengthPrefixed[0] = (nalu.byteLength >> 24) & 0xff\n lengthPrefixed[1] = (nalu.byteLength >> 16) & 0xff\n lengthPrefixed[2] = (nalu.byteLength >> 8) & 0xff\n lengthPrefixed[3] = nalu.byteLength & 0xff\n lengthPrefixed.set(nalu, 4)\n auParts.push(lengthPrefixed)\n auSize += lengthPrefixed.byteLength\n }\n naluParts.push(...auParts)\n\n samples.push({\n duration: frameDuration,\n size: auSize,\n // is_leading=0, depends_on: IDR=2(no), non-IDR=1(yes),\n // is_depended_on=0, has_redundancy=0\n flags: au.isIdr ? 0x02000000 : 0x01010000,\n compositionTimeOffset:\n auIdx < videoPtsList.length\n ? videoPtsList[auIdx] -\n (baseDts + auIdx * frameDuration)\n : 0,\n })\n }\n\n const rawData = concatBuffers(naluParts)\n const moofBox = moof({\n sequenceNumber: state.sequenceNumber++,\n trackId,\n baseDecodeTime: state.videoDecodeTime,\n samples,\n })\n state.videoDecodeTime += accessUnits.length * frameDuration\n patchDataOffset(moofBox, moofBox.byteLength)\n const mdatBox = mdat(rawData)\n fragments.push(moofBox, mdatBox)\n duration = (accessUnits.length * frameDuration) / MPEG_TIMESCALE\n }\n }\n\n if (audioConfig && audioRawData && audioFrames.length > 0) {\n const trackId = videoConfig ? 2 : 1\n const samplesPerFrame = 1024\n const samples: SampleEntry[] = []\n const parts: Uint8Array[] = []\n let offset = 0\n\n for (const frame of audioFrames) {\n const size = frame.frameLength - frame.headerSize\n parts.push(audioRawData.subarray(offset, offset + size))\n samples.push({\n duration: samplesPerFrame,\n size,\n })\n offset += size\n }\n\n const rawData = concatBuffers(parts)\n const moofBox = moof({\n sequenceNumber: state.sequenceNumber++,\n trackId,\n baseDecodeTime: state.audioDecodeTime,\n samples,\n })\n state.audioDecodeTime += audioFrames.length * samplesPerFrame\n patchDataOffset(moofBox, moofBox.byteLength)\n const mdatBox = mdat(rawData)\n fragments.push(moofBox, mdatBox)\n\n const audioDuration =\n (audioFrames.length * samplesPerFrame) / audioConfig.sampleRate\n if (audioDuration > duration) duration = audioDuration\n }\n\n const mediaSegment = concatBuffers(fragments)\n\n return {\n initSegment: getInitSegment(state),\n mediaSegment: mediaSegment.buffer.slice(\n mediaSegment.byteOffset,\n mediaSegment.byteOffset + mediaSegment.byteLength\n ) as ArrayBuffer,\n duration,\n }\n}\n\n/**\n * Extracts the elementary stream from concatenated PES packet data.\n * Handles multiple PES packets within the buffer.\n */\nfunction extractElementaryStream(pesData: Uint8Array): Uint8Array {\n const parts: Uint8Array[] = []\n let offset = 0\n\n while (offset < pesData.length) {\n if (\n offset + 9 <= pesData.length &&\n pesData[offset] === 0 &&\n pesData[offset + 1] === 0 &&\n pesData[offset + 2] === 1 &&\n pesData[offset + 3] >= 0xbc // PES stream IDs start at 0xBC\n ) {\n const headerDataLength = pesData[offset + 8]\n const payloadStart = offset + 9 + headerDataLength\n const pesPacketLength =\n (pesData[offset + 4] << 8) | pesData[offset + 5]\n\n if (pesPacketLength > 0) {\n const pesEnd = Math.min(\n offset + 6 + pesPacketLength,\n pesData.length\n )\n if (payloadStart < pesEnd) {\n parts.push(pesData.subarray(payloadStart, pesEnd))\n }\n offset = pesEnd\n } else {\n // Unknown length \u2014 scan for next PES header (00 00 01 + stream_id >= 0xBC)\n let nextPes = payloadStart\n while (nextPes + 3 < pesData.length) {\n if (\n pesData[nextPes] === 0 &&\n pesData[nextPes + 1] === 0 &&\n pesData[nextPes + 2] === 1 &&\n pesData[nextPes + 3] >= 0xbc\n ) {\n break\n }\n nextPes++\n }\n if (nextPes + 3 >= pesData.length) nextPes = pesData.length\n if (payloadStart < nextPes) {\n parts.push(pesData.subarray(payloadStart, nextPes))\n }\n offset = nextPes\n }\n } else {\n offset++\n }\n }\n\n return concatBuffers(parts)\n}\n\n/**\n * Extracts H.264 NAL units from an Annex B byte stream.\n * Properly handles 3-byte and 4-byte start codes and trims trailing zeros\n * that may result from TS packet padding.\n */\nfunction extractH264Nalus(data: Uint8Array): Uint8Array[] {\n const nalus: Uint8Array[] = []\n\n // Find all start code positions\n const startPositions: { offset: number; scLen: number }[] = []\n let i = 0\n while (i < data.length - 2) {\n if (data[i] === 0 && data[i + 1] === 0) {\n if (i + 3 < data.length && data[i + 2] === 0 && data[i + 3] === 1) {\n startPositions.push({ offset: i, scLen: 4 })\n i += 4\n } else if (data[i + 2] === 1) {\n startPositions.push({ offset: i, scLen: 3 })\n i += 3\n } else {\n i++\n }\n } else {\n i++\n }\n }\n\n for (let j = 0; j < startPositions.length; j++) {\n const naluStart = startPositions[j].offset + startPositions[j].scLen\n const naluEnd =\n j + 1 < startPositions.length\n ? startPositions[j + 1].offset\n : data.length\n\n // Trim trailing zeros (TS packet padding)\n let trimmedEnd = naluEnd\n while (trimmedEnd > naluStart + 1 && data[trimmedEnd - 1] === 0) {\n trimmedEnd--\n }\n\n if (trimmedEnd > naluStart) {\n nalus.push(data.subarray(naluStart, trimmedEnd))\n }\n }\n\n return nalus\n}\n\ninterface SpsInfo {\n readonly width: number\n readonly height: number\n}\n\n/**\n * H.264 profiles that include the high-profile SPS extensions\n * (chroma format, bit depth, scaling matrices).\n */\nconst HIGH_PROFILE_IDCS = /* @__PURE__ */ new Set([\n 100, 110, 122, 244, 44, 83, 86, 118, 128, 138, 139, 134,\n])\n\n/**\n * Minimal H.264 SPS parser using exp-golomb decoding.\n * Extracts pic_width_in_mbs_minus1 and pic_height_in_map_units_minus1.\n */\nfunction parseSpsInfo(sps: Uint8Array): SpsInfo {\n // SPS NAL unit: skip NAL header byte\n let bitOffset = 8 // skip nal_unit_type byte\n\n function readBit(): number {\n const byteIndex = bitOffset >> 3\n const bitIndex = 7 - (bitOffset & 7)\n bitOffset++\n return (sps[byteIndex] >> bitIndex) & 1\n }\n\n function readBits(n: number): number {\n let val = 0\n for (let i = 0; i < n; i++) {\n val = (val << 1) | readBit()\n }\n return val\n }\n\n function readUe(): number {\n let leadingZeros = 0\n while (readBit() === 0 && leadingZeros < 32) leadingZeros++\n if (leadingZeros === 0) return 0\n return (1 << leadingZeros) - 1 + readBits(leadingZeros)\n }\n\n function readSe(): number {\n const val = readUe()\n return val & 1 ? (val + 1) >> 1 : -(val >> 1)\n }\n\n // profile_idc\n const profileIdc = readBits(8)\n // constraint_set flags + reserved\n readBits(8)\n // level_idc\n readBits(8)\n // seq_parameter_set_id\n readUe()\n\n if (HIGH_PROFILE_IDCS.has(profileIdc)) {\n const chromaFormatIdc = readUe()\n if (chromaFormatIdc === 3) readBit() // separate_colour_plane_flag\n readUe() // bit_depth_luma_minus8\n readUe() // bit_depth_chroma_minus8\n readBit() // qpprime_y_zero_transform_bypass_flag\n const seqScalingMatrixPresent = readBit()\n if (seqScalingMatrixPresent) {\n const count = chromaFormatIdc !== 3 ? 8 : 12\n for (let i = 0; i < count; i++) {\n if (readBit()) {\n // 8x8 scaling lists (i >= 6) require a real H.264 encoder\n // to produce a valid SPS bitstream that survives the full\n // exp-golomb parser to this point.\n const size = i < 6 ? 16 : /* c8 ignore next */ 64\n let lastScale = 8\n let nextScale = 8\n for (let j = 0; j < size; j++) {\n if (nextScale !== 0) {\n const delta = readSe()\n nextScale = (lastScale + delta + 0x100) % 0x100\n }\n lastScale = nextScale === 0 ? lastScale : nextScale\n }\n }\n }\n }\n }\n\n readUe() // log2_max_frame_num_minus4\n const picOrderCntType = readUe()\n if (picOrderCntType === 0) {\n readUe() // log2_max_pic_order_cnt_lsb_minus4\n } else if (picOrderCntType === 1) {\n readBit() // delta_pic_order_always_zero_flag\n readSe() // offset_for_non_ref_pic\n readSe() // offset_for_top_to_bottom_field\n const numRefFrames = readUe()\n for (let i = 0; i < numRefFrames; i++) readSe()\n }\n\n readUe() // max_num_ref_frames\n readBit() // gaps_in_frame_num_value_allowed_flag\n\n const picWidthInMbsMinus1 = readUe()\n const picHeightInMapUnitsMinus1 = readUe()\n const frameMbsOnlyFlag = readBit()\n\n const width = (picWidthInMbsMinus1 + 1) * 16\n const height = (2 - frameMbsOnlyFlag) * (picHeightInMapUnitsMinus1 + 1) * 16\n\n return { width, height }\n}\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": ["BufferWriter", "BufferWriter", "sampleRate"]
|
|
7
7
|
}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* @module
|
|
14
14
|
*/
|
|
15
15
|
import { adtsSampleRate, buildAudioSpecificConfig, parseAdtsFrames, } from '../aac/adts';
|
|
16
|
-
import { mp4aSampleEntry, avc1SampleEntry, } from '
|
|
16
|
+
import { mp4aSampleEntry, avc1SampleEntry, } from './sampleEntry';
|
|
17
17
|
import { audioTrak, ftyp, mdat, moov, moof, patchDataOffset, videoTrak, MPEG_TIMESCALE, } from '../mp4/mp4';
|
|
18
18
|
import { STREAM_TYPE_AAC, STREAM_TYPE_H264, concatBuffers, demuxTsSegment, parsePesPts, } from '../mpegts/mpegts';
|
|
19
19
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"fileNames":["../../../../../node_modules/typescript/lib/lib.es5.d.ts","../../../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../../../node_modules/typescript/lib/lib.dom.d.ts","../../../../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../src/aac/adts.ts","../../../../vinyl-util/dist/types/current/util/type.d.ts","../../../../vinyl-util/dist/types/current/util/url/resolveUrl.d.ts","../../../../vinyl-util/dist/types/current/util/string/uid.d.ts","../../../../vinyl-util/dist/types/current/util/object/readonlyType.d.ts","../../../../vinyl-util/dist/types/current/util/string/string.d.ts","../../../../vinyl-util/dist/types/current/util/serialization/json.d.ts","../../../../vinyl-util/dist/types/current/error/ReportableError.d.ts","../../../../vinyl-util/dist/types/current/util/serialization/ParseError.d.ts","../../../../vinyl-util/dist/types/current/util/string/StringReader.d.ts","../../../../vinyl-util/dist/types/current/util/set/set.d.ts","../../../../vinyl-util/dist/types/current/util/serialization/stringifyForPrint.d.ts","../../../../vinyl-util/dist/types/current/util/serialization/primitives.d.ts","../../../../vinyl-util/dist/types/current/util/range/Ranges.d.ts","../../../../vinyl-util/dist/types/current/util/range/timeRanges.d.ts","../../../../vinyl-util/dist/types/current/util/range/UnionRanges.d.ts","../../../../vinyl-util/dist/types/current/util/range/IntersectionRanges.d.ts","../../../../vinyl-util/dist/types/current/util/object/object.d.ts","../../../../vinyl-util/dist/types/current/util/object/mutableType.d.ts","../../../../vinyl-util/dist/types/current/util/collection/typedArray.d.ts","../../../../vinyl-util/dist/types/current/core/cloneable.d.ts","../../../../vinyl-util/dist/types/current/util/object/mergeDeep.d.ts","../../../../vinyl-util/dist/types/current/util/object/merge.d.ts","../../../../vinyl-util/dist/types/current/error/IllegalStateError.d.ts","../../../../vinyl-util/dist/types/current/core/Unsubscribe.d.ts","../../../../vinyl-util/dist/types/current/core/disposable.d.ts","../../../../vinyl-util/dist/types/current/util/object/lazy.d.ts","../../../../vinyl-util/dist/types/current/util/object/equalDeep.d.ts","../../../../vinyl-util/dist/types/current/util/object/clone.d.ts","../../../../vinyl-util/dist/types/current/util/network/request.d.ts","../../../../vinyl-util/dist/types/current/util/mpeg/parseSidxBox.d.ts","../../../../vinyl-util/dist/types/current/util/math/math.d.ts","../../../../vinyl-util/dist/types/current/util/map/map.d.ts","../../../../vinyl-util/dist/types/current/util/iteration/iterable.d.ts","../../../../vinyl-util/dist/types/current/util/fun/throttle.d.ts","../../../../vinyl-util/dist/types/current/util/fun/memoize.d.ts","../../../../vinyl-util/dist/types/current/util/fun/function.d.ts","../../../../vinyl-util/dist/types/current/util/fun/flow.d.ts","../../../../vinyl-util/dist/types/current/util/fun/debounce.d.ts","../../../../vinyl-util/dist/types/current/util/comparison/compare.d.ts","../../../../vinyl-util/dist/types/current/util/error/stack.d.ts","../../../../vinyl-util/dist/types/current/util/date/date.d.ts","../../../../vinyl-util/dist/types/current/util/config/ValueProvider.d.ts","../../../../vinyl-util/dist/types/current/util/collection/array.d.ts","../../../../vinyl-util/dist/types/current/util/collection/CacheMap.d.ts","../../../../vinyl-util/dist/types/current/util/collection/LruCache.d.ts","../../../../vinyl-util/dist/types/current/util/collection/LinkedList.d.ts","../../../../vinyl-util/dist/types/current/util/buffer/buffer.d.ts","../../../../vinyl-util/dist/types/current/util/buffer/BufferWriter.d.ts","../../../../vinyl-util/dist/types/current/util/buffer/BufferReader.d.ts","../../../../vinyl-util/dist/types/current/util/buffer/BufferError.d.ts","../../../../vinyl-util/dist/types/current/util/browser/searchParams.d.ts","../../../../vinyl-util/dist/types/current/event/Signal.d.ts","../../../../vinyl-util/dist/types/current/logging/LogTarget.d.ts","../../../../vinyl-util/dist/types/current/event/EventHost.d.ts","../../../../vinyl-util/dist/types/current/util/async/Abort.d.ts","../../../../vinyl-util/dist/types/current/util/async/timeout.d.ts","../../../../vinyl-util/dist/types/current/util/async/sleep.d.ts","../../../../vinyl-util/dist/types/current/util/async/promise.d.ts","../../../../vinyl-util/dist/types/current/util/async/never.d.ts","../../../../vinyl-util/dist/types/current/util/async/abortUtils.d.ts","../../../../vinyl-util/dist/types/current/util/async/TimeoutSlot.d.ts","../../../../vinyl-util/dist/types/current/util/async/TimeoutController.d.ts","../../../../vinyl-util/dist/types/current/util/async/TaskQueue.d.ts","../../../../vinyl-util/dist/types/current/util/async/Deferred.d.ts","../../../../vinyl-util/dist/types/current/persistence/KeyValuePersistence.d.ts","../../../../vinyl-util/dist/types/current/global/globalRegistry.d.ts","../../../../vinyl-util/dist/types/current/persistence/persistenceRef.d.ts","../../../../vinyl-util/dist/types/current/persistence/StoragePersistence.d.ts","../../../../vinyl-util/dist/types/current/persistence/PersistentItem.d.ts","../../../../vinyl-util/dist/types/current/patch/patchTarget.d.ts","../../../../vinyl-util/dist/types/current/network/Requester.d.ts","../../../../vinyl-util/dist/types/current/patch/network/fetch.d.ts","../../../../vinyl-util/dist/types/current/network/RequesterImplEventMap.d.ts","../../../../vinyl-util/dist/types/current/network/RequestError.d.ts","../../../../vinyl-util/dist/types/current/network/responseUtil.d.ts","../../../../vinyl-util/dist/types/current/network/requesterUtil.d.ts","../../../../vinyl-util/dist/types/current/network/requesterGlobal.d.ts","../../../../vinyl-util/dist/types/current/event/DomEventHost.d.ts","../../../../vinyl-util/dist/types/current/network/network.d.ts","../../../../vinyl-util/dist/types/current/network/metrics/networkMetricsModel.d.ts","../../../../vinyl-util/dist/types/current/network/metrics/NetworkMetricsController.d.ts","../../../../vinyl-util/dist/types/current/network/RequesterImpl.d.ts","../../../../vinyl-util/dist/types/current/network/createRequester.d.ts","../../../../vinyl-util/dist/types/current/network/RequestInterceptor.d.ts","../../../../vinyl-util/dist/types/current/network/metrics/networkMetricsGlobal.d.ts","../../../../vinyl-util/dist/types/current/network/browser/NetworkInformation.d.ts","../../../../vinyl-util/dist/types/current/network/metrics/NetworkMetricsControllerImpl.d.ts","../../../../vinyl-util/dist/types/current/network/logging/networkLoggingHandler.d.ts","../../../../vinyl-util/dist/types/current/logging/logTimer.d.ts","../../../../vinyl-util/dist/types/current/logging/Logger.d.ts","../../../../vinyl-util/dist/types/current/logging/getLogLevelFromSearch.d.ts","../../../../vinyl-util/dist/types/current/logging/ConsoleLogHandler.d.ts","../../../../vinyl-util/dist/types/current/logging/HistoryLogHandler.d.ts","../../../../vinyl-util/dist/types/current/logging/VinylLogging.d.ts","../../../../vinyl-util/dist/types/current/global/globalTarget.d.ts","../../../../vinyl-util/dist/types/current/global/environment.d.ts","../../../../vinyl-util/dist/types/current/event/redispatchEvents.d.ts","../../../../vinyl-util/dist/types/current/event/onAny.d.ts","../../../../vinyl-util/dist/types/current/event/nextEventAsPromise.d.ts","../../../../vinyl-util/dist/types/current/error/ValidationError.d.ts","../../../../vinyl-util/dist/types/current/error/UnreachableCodeError.d.ts","../../../../vinyl-util/dist/types/current/error/TimeoutError.d.ts","../../../../vinyl-util/dist/types/current/error/StackOverflowError.d.ts","../../../../vinyl-util/dist/types/current/error/ServiceResponseError.d.ts","../../../../vinyl-util/dist/types/current/error/MediaUnsupportedError.d.ts","../../../../vinyl-util/dist/types/current/error/IllegalArgumentError.d.ts","../../../../vinyl-util/dist/types/current/error/ErrorOrigin.d.ts","../../../../vinyl-util/dist/types/current/error/AbortError.d.ts","../../../../vinyl-util/dist/types/current/core/clearable.d.ts","../../../../vinyl-util/dist/types/current/client/Version.d.ts","../../../../vinyl-util/dist/types/current/client/userAgent/UserAgentInfo.d.ts","../../../../vinyl-util/dist/types/current/client/userAgent/tokenizeUserAgent.d.ts","../../../../vinyl-util/dist/types/current/client/userAgent/userAgentRuleHelpers.d.ts","../../../../vinyl-util/dist/types/current/client/userAgent/parseUserAgent.d.ts","../../../../vinyl-util/dist/types/current/client/userAgent/defaultUserAgentRules.d.ts","../../../../vinyl-util/dist/types/current/client/userAgent/hasBrowser.d.ts","../../../../vinyl-util/dist/types/current/index.d.ts","../../../src/mp4/mp4.ts","../../../src/transmux/sampleEntry.ts","../../../src/mpegts/mpegts.ts","../../../src/transmux/transmux.ts","../../../src/index.ts","../../../../../node_modules/@types/node/compatibility/disposable.d.ts","../../../../../node_modules/@types/node/compatibility/indexable.d.ts","../../../../../node_modules/@types/node/compatibility/iterators.d.ts","../../../../../node_modules/@types/node/compatibility/index.d.ts","../../../../../node_modules/@types/node/globals.typedarray.d.ts","../../../../../node_modules/@types/node/buffer.buffer.d.ts","../../../../../node_modules/@types/node/globals.d.ts","../../../../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../../../../node_modules/@types/node/web-globals/domexception.d.ts","../../../../../node_modules/@types/node/web-globals/events.d.ts","../../../../../node_modules/buffer/index.d.ts","../../../../../node_modules/undici-types/header.d.ts","../../../../../node_modules/undici-types/readable.d.ts","../../../../../node_modules/undici-types/file.d.ts","../../../../../node_modules/undici-types/fetch.d.ts","../../../../../node_modules/undici-types/formdata.d.ts","../../../../../node_modules/undici-types/connector.d.ts","../../../../../node_modules/undici-types/client.d.ts","../../../../../node_modules/undici-types/errors.d.ts","../../../../../node_modules/undici-types/dispatcher.d.ts","../../../../../node_modules/undici-types/global-dispatcher.d.ts","../../../../../node_modules/undici-types/global-origin.d.ts","../../../../../node_modules/undici-types/pool-stats.d.ts","../../../../../node_modules/undici-types/pool.d.ts","../../../../../node_modules/undici-types/handlers.d.ts","../../../../../node_modules/undici-types/balanced-pool.d.ts","../../../../../node_modules/undici-types/agent.d.ts","../../../../../node_modules/undici-types/mock-interceptor.d.ts","../../../../../node_modules/undici-types/mock-agent.d.ts","../../../../../node_modules/undici-types/mock-client.d.ts","../../../../../node_modules/undici-types/mock-pool.d.ts","../../../../../node_modules/undici-types/mock-errors.d.ts","../../../../../node_modules/undici-types/proxy-agent.d.ts","../../../../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../../../../node_modules/undici-types/retry-handler.d.ts","../../../../../node_modules/undici-types/retry-agent.d.ts","../../../../../node_modules/undici-types/api.d.ts","../../../../../node_modules/undici-types/interceptors.d.ts","../../../../../node_modules/undici-types/util.d.ts","../../../../../node_modules/undici-types/cookies.d.ts","../../../../../node_modules/undici-types/patch.d.ts","../../../../../node_modules/undici-types/websocket.d.ts","../../../../../node_modules/undici-types/eventsource.d.ts","../../../../../node_modules/undici-types/filereader.d.ts","../../../../../node_modules/undici-types/diagnostics-channel.d.ts","../../../../../node_modules/undici-types/content-type.d.ts","../../../../../node_modules/undici-types/cache.d.ts","../../../../../node_modules/undici-types/index.d.ts","../../../../../node_modules/@types/node/web-globals/fetch.d.ts","../../../../../node_modules/@types/node/assert.d.ts","../../../../../node_modules/@types/node/assert/strict.d.ts","../../../../../node_modules/@types/node/async_hooks.d.ts","../../../../../node_modules/@types/node/buffer.d.ts","../../../../../node_modules/@types/node/child_process.d.ts","../../../../../node_modules/@types/node/cluster.d.ts","../../../../../node_modules/@types/node/console.d.ts","../../../../../node_modules/@types/node/constants.d.ts","../../../../../node_modules/@types/node/crypto.d.ts","../../../../../node_modules/@types/node/dgram.d.ts","../../../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../../../node_modules/@types/node/dns.d.ts","../../../../../node_modules/@types/node/dns/promises.d.ts","../../../../../node_modules/@types/node/domain.d.ts","../../../../../node_modules/@types/node/events.d.ts","../../../../../node_modules/@types/node/fs.d.ts","../../../../../node_modules/@types/node/fs/promises.d.ts","../../../../../node_modules/@types/node/http.d.ts","../../../../../node_modules/@types/node/http2.d.ts","../../../../../node_modules/@types/node/https.d.ts","../../../../../node_modules/@types/node/inspector.generated.d.ts","../../../../../node_modules/@types/node/module.d.ts","../../../../../node_modules/@types/node/net.d.ts","../../../../../node_modules/@types/node/os.d.ts","../../../../../node_modules/@types/node/path.d.ts","../../../../../node_modules/@types/node/perf_hooks.d.ts","../../../../../node_modules/@types/node/process.d.ts","../../../../../node_modules/@types/node/punycode.d.ts","../../../../../node_modules/@types/node/querystring.d.ts","../../../../../node_modules/@types/node/readline.d.ts","../../../../../node_modules/@types/node/readline/promises.d.ts","../../../../../node_modules/@types/node/repl.d.ts","../../../../../node_modules/@types/node/sea.d.ts","../../../../../node_modules/@types/node/stream.d.ts","../../../../../node_modules/@types/node/stream/promises.d.ts","../../../../../node_modules/@types/node/stream/consumers.d.ts","../../../../../node_modules/@types/node/stream/web.d.ts","../../../../../node_modules/@types/node/string_decoder.d.ts","../../../../../node_modules/@types/node/test.d.ts","../../../../../node_modules/@types/node/timers.d.ts","../../../../../node_modules/@types/node/timers/promises.d.ts","../../../../../node_modules/@types/node/tls.d.ts","../../../../../node_modules/@types/node/trace_events.d.ts","../../../../../node_modules/@types/node/tty.d.ts","../../../../../node_modules/@types/node/url.d.ts","../../../../../node_modules/@types/node/util.d.ts","../../../../../node_modules/@types/node/v8.d.ts","../../../../../node_modules/@types/node/vm.d.ts","../../../../../node_modules/@types/node/wasi.d.ts","../../../../../node_modules/@types/node/worker_threads.d.ts","../../../../../node_modules/@types/node/zlib.d.ts","../../../../../node_modules/@types/node/index.d.ts"],"fileIdsList":[[176,220,223],[176,222,223],[223],[176,223,228,256],[176,223,224,229,234,242,253,264],[176,223,224,225,234,242],[176,223],[171,172,173,176,223],[176,223,226,265],[176,223,227,228,235,243],[176,223,228,253,261],[176,223,229,231,234,242],[176,222,223,230],[176,223,231,232],[176,223,233,234],[176,222,223,234],[176,223,234,235,236,253,264],[176,223,234,235,236,249,253,256],[176,223,231,234,237,242,253,264],[176,223,234,235,237,238,242,253,261,264],[176,223,237,239,253,261,264],[174,175,176,177,178,179,180,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270],[176,223,234,240],[176,223,241,264,269],[176,223,231,234,242,253],[176,223,243],[176,223,244],[176,222,223,245],[176,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270],[176,223,247],[176,223,248],[176,223,234,249,250],[176,223,249,251,265,267],[176,223,234,253,254,256],[176,223,255,256],[176,223,253,254],[176,223,256],[176,223,257],[176,220,223,253,258],[176,223,234,259,260],[176,223,259,260],[176,223,228,242,253,261],[176,223,262],[176,223,242,263],[176,223,237,248,264],[176,223,228,265],[176,223,253,266],[176,223,241,267],[176,223,268],[176,218,223],[176,218,223,234,236,245,253,256,264,267,269],[176,223,253,270],[176,190,194,223,264],[176,190,223,253,264],[176,185,223],[176,187,190,223,261,264],[176,223,242,261],[176,223,271],[176,185,223,271],[176,187,190,223,242,264],[176,182,183,186,189,223,234,253,264],[176,190,197,223],[176,182,188,223],[176,190,211,212,223],[176,186,190,223,256,264,271],[176,211,223,271],[176,184,185,223,271],[176,190,223],[176,184,185,186,187,188,189,190,191,192,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,212,213,214,215,216,217,223],[176,190,205,223],[176,190,197,198,223],[176,188,190,198,199,223],[176,189,223],[176,182,185,190,223],[176,190,194,198,199,223],[176,194,223],[176,188,190,193,223,264],[176,182,187,190,197,223],[176,223,253],[176,185,190,211,223,269,271],[48,166,167,168,169,176,223],[165,176,223],[165,166,176,223],[48,166,167,168,176,223],[49,87,176,223],[158,176,223],[160,176,223],[49,159,163,176,223],[49,114,159,160,176,223],[49,158,159,176,223],[49,160,176,223],[49,71,72,176,223],[55,176,223],[54,55,176,223],[54,176,223],[49,72,73,100,102,176,223],[49,72,73,100,101,176,223],[72,73,176,223],[49,102,103,176,223],[72,100,102,176,223],[72,102,176,223],[101,176,223],[49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,176,223],[73,102,138,176,223],[52,73,102,138,176,223],[101,102,114,176,223],[114,140,141,176,223],[138,176,223],[54,55,121,176,223],[49,103,176,223],[49,102,114,119,121,129,176,223],[89,119,176,223],[49,119,130,176,223],[73,101,102,121,176,223],[49,102,128,176,223],[49,52,89,102,128,129,134,176,223],[114,128,129,176,223],[49,52,89,176,223],[49,102,103,114,126,176,223],[49,114,119,176,223],[49,89,121,176,223],[121,122,176,223],[119,176,223],[49,101,113,176,223],[49,113,176,223],[113,114,176,223],[49,87,103,176,223],[49,73,103,176,223],[73,176,223],[49,72,73,103,176,223],[103,176,223],[55,103,176,223],[83,176,223],[49,176,223],[92,176,223],[52,176,223],[49,74,87,176,223],[66,69,176,223],[67,176,223],[55,67,68,176,223],[49,52,176,223],[49,61,176,223],[61,176,223],[54,55,56,176,223]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"3cd3f141f6e02afaa43dffa93d320d5c233c36c7892c766272ea9157824a6913","signature":"c84dd12dae163a85fbd8a743174c3bfd64abdd8764dbb92f629bf58cc1de33cc"},"3883612e983b1ac8848b0d51d33f55c072c8a22a462b00aec48c40cebb7a5a15","94f70edc19254aec0f2ae820dbd8471f7f608b12bfafcc1d07446288c23581b8","8fadf421c7b678613fa6de2b4481310eb164497a2edf5860a59aba4a0f2d2185","3af9786b2e9ecf735773eb5b9bcc5843ade56fe5f0f214a8138361341c0f8d5f","5522c6b330b412fde5a3ff11611fdcea33f8a4302e752bf4a6f6a8e54214bc2a","4df9ee0e142dc2195011aad2686bd0e574d81d0e2488a3e1b2640bbabdc979b8","241099b91a92851a743f9d63d60eada4caf005fca5f4ba8df760be096593a090","007bf2f85f4f6165d07b8e8ba8f83b39b76247a30c7a66b39ba067a1031ccd3f","ead3ad66f2cfa815199460614d7a1b50ae0b84ea0bb0c21f0fa7223aa10139e9","e4addb08d84ea420cbc709d8b1af1db02a4e8d2a58fa56c797370871a2df42c2","29a526123d517edb4a5de3d8cd1e660ec97c9b967a11389972bfa29b6960faaf","04dfb0ad2934418fd7bff6011febdb231f2558d65c0a6dad48635e8875ae90d0","b9d28b90f521adfc849d4f9b7483d0289316c195da9dc4dcb2d7059ff4c02a68","af57273f31194850625ffce39dcb99d1a6564d8907f3bb84daa772ef12cf0fff","242e0d6dc84190304f6614238e1eb931c558d04fa403a2d6b5bd9d90a02855bb","e94777367183913ee132f092650a2cd7ce74f09a892ae2a9f789d99a185e808e","702c14f8654799f9b54fe232a54239a6be34e450c342364366e1489609c20dc3","5f08f941ca373c66e7a947aa1a9d97ebc4b3efca2cedec70f87af132576479b4","4fab8a1b625779d0e35e0deb5625ab9f0e07fc25086e30ba56eb59f95628a26b","7cd32707d24344557e23ea4dc8f6d704b20ef838cbd64b8f1588a8095cb55a4a","0f5ab3c44399e5a0456b490b6bbad5e036da74a5faea3c1ae0f7b5d25f064026","62f1070fddcefebdc0da2fbfa18564bf1f363afc3c7a1ed03467f668c236d751","c1660310b02520f3187cdaf2e7a4e6f2c4c2ac1cd07923fe4a63e16ce38de313","61f712fd2f6af15886187afb6535e9dab3184306d79fd093baef354fceb25db1","b8f327f9d2450de36d56db8af5e8ed5caccb2657236577ae5aa7d998297b85aa","253a3ab3619c937991b5250adad2f149e85a11799998e8e83718fbb00cf984c6","6b2e288a7b0a32c1c33792d3abb9cf0bcba8ed4561524aeb133c1e0290bf5de1","8840279388c4c9463c224ae9b6c56998e12b34ed916239f0d2aa35f0f6f97545","15806a570cc48f543f52915c9753f1fe3524620a1b6e917509e8ccb91cbb6df9","086c31a6d1ac11504aed923c431658b37a140e343ec3821e58f7c75ff39c486c","7062699bece11d50b8950860598472cc04ef8dd5c40b6f1e2bd60484c935cb0a","96e9eda58abdfd7e92cd2f86b6fa0a8fb3d8f7d9a98539f6d96a3daada5d25e6","6881fe06e71d54c140b538c74a50a5d7abe761af378d704d57a55c006918cce0","48dde985842acabfd922a502e18184332f6614a46e7048d6d22ab3fcb4eb7d1a","b2d98e7aab04cb64a58aeaa3f0a24dd92798694c2aa7251f2057d3ff6f259234","bf59af1f09193279476e548848bc8ca9778326ca2c7d9b238d9dea413cea0968","e52a28b741aa6591440b876ed3f2f24fa71b430ed59e7053dd3b2411df5ef7ca","ac4fd89951a8a6bca9ad3259e1349d8cd36f450707ded667ffafcdeaa9f54b44","c98a76e9bc67050bcc006cbe77b12b33abee94954beee04f28b0a680be0dbf28","09f637a412eb4422a3d418607563ffea1e6861963c5209182f04d0ab0ffc9a50","5748b1ca8a4ca72b9c5aead580075a46dff3797cdcf25541e0054d06410f908d","fa732f1f9c3ade6a7761ab58eb286d028f8f48d2c06cbbc1b6020682483d5cd0","91726a7d6845d3aae0f75360276793770a13ece4a780c3b25910d539ab3006f0","13f312824e278b623a168cfcc6140390fc6875f16df9bcbf77b659556e343717","f59333527d9898690642b4ff96c844d5fbbbdf15f6d7e2ccfdd9b1c71d9bc64f","6d4cb0190f783a935e82c0840dbe894a206989c40c5adbc7bc75a53cb5bd2f1d","1e059acb88a0d7058f6476185e329c344ebf1a0a931a0bdade57abba28e1fca9","8fbadfe7c3bd658447c31a2f807975eb78e50f8cb2f844029530bc7b7dc5429c","258df9f5910b57175433c3980ce6aaa1b0febe500bcc61b5c9d8db3abdb045eb","4630e0b5f24aa79945cf967e7e9d0e60306e227b975e363cc1962f531243ced9","5873949a3a4b9766b8c35d3d4c3329b77da7055d3069df8d4ba75770480fbe30","284c54098674804e8610ced0739063ce233956c140c0b110288f42c02a8b4f69","1a869e3676a80cc1de3914517df641019151f4c2886890f6fee19b6435739a08","ce8d82a24629f463e2cbee755342ff42045b61edaf250f8613a3fb7bac4df280","1bbf9ead2b5d91cbe25f8ccb6a8896ab4d422bd5daeec9828f9eaf39fb7032ba","1c0f4e30552515904af24e7edb54056d2d77cfa2ab630da107264af65bdc669c","584e5b1a6477d765cace8c7448f73cbaa38e94145904c17cbe5d07b8be57f83f","777c3121360ea51189d186280ac7e46173040e6d502b4ee43f25f797883eb1ea","2313b87fead0c9b17b371ac0f9bf901dbcc02723b10dba190e9962c17a0bb93e","1f0ed8aa47f6da8b67beea1d96824b6640db628a3042984d03e60e26b05e706d","7dd841f9d6dff1bc1edabbaae51fccd28c52760db1102f22c5e80caa7a7442a0","e6afc61ba0c1973da35ae8c98f646bead94593ce46b4963e5f176b007b68d5aa","bb5c3e4392909f613b531f1003dd7fb87c6d535df6133404bc8d4c083142b086","278f29fe9bc5e798aac0bb545a67eb1d3fc87b53410ec73d7ba4e0cd7bb68fb1","f539248bb6bf047825d411f19ad7a85366b691fcbdd57c02e8437087c111a89f","3112a620e7a2fde5c3a7ff4908c598c463f1d8670c6eaed7502eecbc9e81b3c5","13ed7ed0e63040dbe65367ddd4ecb532433332799da50d0f43fc5bbe1dc60f0c","cf173c1ab4859e9bde6c12b14d2a008889e26de5c3b74718c001622314bfbee1","6f4ce23262f94618362d46a6aef6e99dfdd6e1aa79d98dd37c38c39aa9da9660","729b9d1071b4c3fbc583e7b6b4789183e0e786f6546c7e55e91ef1659e3a9e82","062120bb0128ecb8367b97a8b1f940f69c09ed9bbf9853a491b28671544c59cb","aa460de1fb508a228be6aec159d83c5d5ac42d163d73a97e89e94742007d92b7","9744aa658d64143772a3a3a2743b042790bcd208fc725169c21efd96a7701953","a336c9d0e7b22c78f479f5ad14e7e9ad44b8a6c4aace580e98657df1259b21c9","4b5cb6be28bdfad69853bc69cee08c0b44b3634b7d33ee1c904ed9759481e0ee","ea1cfe0cb5c8b10d500def7ca6d889fad4ad31a6a3f781ef790e52388ef89431","efa1d022af579bf2d953cea6fb0cb9c1a188643aa61012ed060306ec39b1a8d2","496b3289b6b79760f26af52e80201e38a796f48eda6cfde05f668578196911e5","ddd7821f1d119328acfca1030349b848d0e27c276672cd983ce7b64e67fb8977","1bb0bb8f06f7a2457246d84d1ba48522170a5e753dd82bd5499a1130c93572ab","cf7902e2e1c961f0f4d23cf82342e1463f284a617ef7eb4c45fc887d4bb27bd8","1622d218da3ab21743d9963ca2c13ba980734cdf978e865468c7f4f682515b99","ecaeb85ebaadab07adac888968a4695a2d196126de3692f0cea950f24b084e1f","65d45f62c37371c18720fd0e48c7ba1e13e5d3db18379df50ad11161124eac08","f5883afa69a75e225574890b5b102970a012b43cdfc9b30d0550abc73eb3977c","d6da78690ab4de436ee36996d416f7267689f2e81bc6797d146bc7b6163da546","fd6dd10c64e7509fead7ea5cfcd056cb9a29f9a9c466d172e2706e8297796bee","bf3f748fb472599692476c2caa368f344d2cd89a9a3ac2267cae821a67d93f21","96d45755009fa0cf55a14e0a3d4b80076b70a81b19e61ee4b1dc7f1e40eaeedc","476d292c67608e88dcc3c128e4b49a264d7f37ea84318f0d416f2d3134b4ce94","d1f66ed744acfe060e66b2879ea2c0890bf4cd22d8a49589cecb0e25c0256a15","0a252356615a37ca60f2c35df1d0b13ce5006075b70fa2dbc9f4e8e8e7ca99be","9675187baabbf8529440b2d914d9897e03ba39e00d9ea97eadd73496f34836f6","def8f8deb010cb839e568c05f85e5479072cdb379bc51cd4a800cbd469c4bdeb","dc41d46d51c55ccbec534de919fadb79f5d4c74e23a9483578ddb9586a4e8fe4","a71fa0cb6409dbd5dd3ad0819f2aa3102ad7e23b324724a85dce1f8e2dbd6aa2","9d237656738d440ec3570bb762b527a603f6d917cd1918af827927352ca9ed59","570d6cf58320056ff52a5386c6c8545487b6fe8a2ddd280336ba732508290043","8487886fb8c052413f341b1503d99e2d6f487036babfd2800eb7dcc0d021cbec","f5fcbbf9b87d3cc23a7b36836ee8ab9c2369e9e074d682452c4c91f8392d35d3","0cded3744204c1048a1cff51364a889d1c66e879601e631c4a34b6a47372f92a","fa69573d22a14f16cabad8790b4d79ffed4f7eb0d2c80e8003e0f8dcd4f7f59b","de43b1fa7b23f04642a6343baa123b061fb9e2a99bcfdd36e8b6eb6de6e8b1fd","9d3c460c38697c07327bf477a7c0e79a2010800a8cf9a507b6dd148cc5a1bb1a","88e64d9529fcd6a50cc670106cecdc79e8f68fe5f2636e7d4846afa454884ee9","43e40faf955b38f070de188a9dfe7e3e36b759963b6003a4050b97a2236ca104","d93defc47bd6beffd510f629546fc89abe2db62731b1282000cd2951c513e29d","db5909452d6d626c59a7d2456495c41c3add56e08cade839f030e71aa28da0c6","1029fb366046c3533ee894f9412586975849b0ebd059ef77442e34bd4b0bb895","8331ca6b5890aada460a787a2ca1012d2eda798a32a2fcb3120a4122e9636bb0","8032230c88507809a3d439fd6f03b31062fad2668944e3f2744c445b6ee647fd","e98f7509ef113df3035707635200fa4d593163edfb51d0990cba7897e3b4a71d","275da1d17e6ca9ca3db0b8f92192880818d968819ccdef8260a19a3bfe7ca12d","db73ce6470dbaecf4bfe84b72c03ed4bd4a68220141fbb103aa9fafedf87ffb2","9a2201e559019df7862b7cc34cc5951595ba4cc6e682c5b9b44e98a3c4198dac","a9460a1ab303aef75bd7b6ee6f1aeb49e67d043a828637b804f48129fbd4be25","8b4a423e8e442910a1ca27061270e259be1e1e49143043684e4f854ae1991254",{"version":"40429b833fd288f66cf6807a70c8de56213e999ea8061458e5aa8a3c7600f6c8","signature":"5d921cd39fc3f7557577d7289c4f5c209b1b1d4f5d7204075faf2a6556309271"},{"version":"29b48bc03e8d836c497b42bef9cbdbd30132aa980745bd64b0b294d25733bb7f","signature":"7b3e732595c9c8740431aa0597654bbf29177eca4f880c565f23117678dd0a37"},{"version":"6a4ca1e648ee858a9ac23f3a1ded9c468a50bee877a07d8098eb03628b6f0d10","signature":"4ae93e86e6b9f1e6bb10c2334b47e372c9ba694e7272349d0026c3c20ab87076"},{"version":"e837dbc94ecdbd6e839b73f9480cb180e0b86cbfc1c1bfc304aeb4d02b926469","signature":"35c4874a186d192bd4a0eb20bb84314ac3a1ed4d49f5910ac67e11b6dcc475d7"},{"version":"3f1828b05b5f89f4f9c06efb5c5d82d5cf8f56b573486ad68881fb90502439be","signature":"9aec742088a849af2125107fa03f67b18cd3bdd08a18a90f947c78c0ae22f561"},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"ba481bca06f37d3f2c137ce343c7d5937029b2468f8e26111f3c9d9963d6568d","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d9ef24f9a22a88e3e9b3b3d8c40ab1ddb0853f1bfbd5c843c37800138437b61","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"e2677634fe27e87348825bb041651e22d50a613e2fdf6a4a3ade971d71bac37e","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"8c0bcd6c6b67b4b503c11e91a1fb91522ed585900eab2ab1f61bba7d7caa9d6f","impliedFormat":1},{"version":"8cd19276b6590b3ebbeeb030ac271871b9ed0afc3074ac88a94ed2449174b776","affectsGlobalScope":true,"impliedFormat":1},{"version":"696eb8d28f5949b87d894b26dc97318ef944c794a9a4e4f62360cd1d1958014b","impliedFormat":1},{"version":"3f8fa3061bd7402970b399300880d55257953ee6d3cd408722cb9ac20126460c","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"68bd56c92c2bd7d2339457eb84d63e7de3bd56a69b25f3576e1568d21a162398","affectsGlobalScope":true,"impliedFormat":1},{"version":"3e93b123f7c2944969d291b35fed2af79a6e9e27fdd5faa99748a51c07c02d28","impliedFormat":1},{"version":"9d19808c8c291a9010a6c788e8532a2da70f811adb431c97520803e0ec649991","impliedFormat":1},{"version":"87aad3dd9752067dc875cfaa466fc44246451c0c560b820796bdd528e29bef40","impliedFormat":1},{"version":"4aacb0dd020eeaef65426153686cc639a78ec2885dc72ad220be1d25f1a439df","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"8db0ae9cb14d9955b14c214f34dae1b9ef2baee2fe4ce794a4cd3ac2531e3255","affectsGlobalScope":true,"impliedFormat":1},{"version":"15fc6f7512c86810273af28f224251a5a879e4261b4d4c7e532abfbfc3983134","impliedFormat":1},{"version":"58adba1a8ab2d10b54dc1dced4e41f4e7c9772cbbac40939c0dc8ce2cdb1d442","impliedFormat":1},{"version":"641942a78f9063caa5d6b777c99304b7d1dc7328076038c6d94d8a0b81fc95c1","impliedFormat":1},{"version":"2de7636e6fbb9e54a61a38bcb7505b94ec5be61197fe9e840cff629ca920c4bc","impliedFormat":1},{"version":"855cd5f7eb396f5f1ab1bc0f8580339bff77b68a770f84c6b254e319bbfd1ac7","impliedFormat":1},{"version":"5650cf3dace09e7c25d384e3e6b818b938f68f4e8de96f52d9c5a1b3db068e86","impliedFormat":1},{"version":"1354ca5c38bd3fd3836a68e0f7c9f91f172582ba30ab15bb8c075891b91502b7","affectsGlobalScope":true,"impliedFormat":1},{"version":"7e20d899c28ca26a2a7afc98beaa69e63ff7fba0a8bc47b4e3bf3ede5e09e424","impliedFormat":1},{"version":"2d2fcaab481b31a5882065c7951255703ddbe1c0e507af56ea42d79ac3911201","impliedFormat":1},{"version":"a192fe8ec33f75edbc8d8f3ed79f768dfae11ff5735e7fe52bfa69956e46d78d","impliedFormat":1},{"version":"ca867399f7db82df981d6915bcbb2d81131d7d1ef683bc782b59f71dda59bc85","affectsGlobalScope":true,"impliedFormat":1},{"version":"372413016d17d804e1d139418aca0c68e47a83fb6669490857f4b318de8cccb3","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"b4f70ec656a11d570e1a9edce07d118cd58d9760239e2ece99306ee9dfe61d02","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"6e70e9570e98aae2b825b533aa6292b6abd542e8d9f6e9475e88e1d7ba17c866","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"085f552d005479e2e6a7311cdbbe5d8c55c497b4d19274285df161ee9684cd9c","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"007faacc9268357caa21d24169f3f3f2497af3e9241308df2d89f6e6d9bb3f2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"74cf591a0f63db318651e0e04cb55f8791385f86e987a67fd4d2eaab8191f730","impliedFormat":1},{"version":"5eab9b3dc9b34f185417342436ec3f106898da5f4801992d8ff38ab3aff346b5","impliedFormat":1},{"version":"12ed4559eba17cd977aa0db658d25c4047067444b51acfdcbf38470630642b23","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3ffabc95802521e1e4bcba4c88d8615176dc6e09111d920c7a213bdda6e1d65","impliedFormat":1},{"version":"809821b8a065e3234a55b3a9d7846231ed18d66dd749f2494c66288d890daf7f","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"c3b41e74b9a84b88b1dca61ec39eee25c0dbc8e7d519ba11bb070918cfacf656","affectsGlobalScope":true,"impliedFormat":1},{"version":"4737a9dc24d0e68b734e6cfbcea0c15a2cfafeb493485e27905f7856988c6b29","affectsGlobalScope":true,"impliedFormat":1},{"version":"36d8d3e7506b631c9582c251a2c0b8a28855af3f76719b12b534c6edf952748d","impliedFormat":1},{"version":"1ca69210cc42729e7ca97d3a9ad48f2e9cb0042bada4075b588ae5387debd318","impliedFormat":1},{"version":"f5ebe66baaf7c552cfa59d75f2bfba679f329204847db3cec385acda245e574e","impliedFormat":1},{"version":"ed59add13139f84da271cafd32e2171876b0a0af2f798d0c663e8eeb867732cf","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7c5e2ea4a9749097c347454805e933844ed207b6eefec6b7cfd418b5f5f7b28","impliedFormat":1},{"version":"b1810689b76fd473bd12cc9ee219f8e62f54a7d08019a235d07424afbf074d25","impliedFormat":1}],"root":[48,[166,170]],"options":{"alwaysStrict":true,"composite":true,"declaration":true,"declarationMap":true,"esModuleInterop":true,"exactOptionalPropertyTypes":true,"module":99,"noImplicitAny":true,"noImplicitThis":true,"outDir":"./","skipLibCheck":true,"strict":true,"strictBindCallApply":true,"strictFunctionTypes":true,"strictNullChecks":true,"strictPropertyInitialization":true,"target":99,"useUnknownInCatchVariables":true},"referencedMap":[[220,1],[221,1],[222,2],[176,3],[223,4],[224,5],[225,6],[171,7],[174,8],[172,7],[173,7],[226,9],[227,10],[228,11],[229,12],[230,13],[231,14],[232,14],[233,15],[234,16],[235,17],[236,18],[177,7],[175,7],[237,19],[238,20],[239,21],[271,22],[240,23],[241,24],[242,25],[243,26],[244,27],[245,28],[246,29],[247,30],[248,31],[249,32],[250,32],[251,33],[252,7],[253,34],[255,35],[254,36],[256,37],[257,38],[258,39],[259,40],[260,41],[261,42],[262,43],[263,44],[264,45],[265,46],[266,47],[267,48],[268,49],[178,7],[179,7],[180,7],[219,50],[269,51],[270,52],[181,7],[46,7],[47,7],[8,7],[9,7],[11,7],[10,7],[2,7],[12,7],[13,7],[14,7],[15,7],[16,7],[17,7],[18,7],[19,7],[3,7],[20,7],[21,7],[4,7],[22,7],[26,7],[23,7],[24,7],[25,7],[27,7],[28,7],[29,7],[5,7],[30,7],[31,7],[32,7],[33,7],[6,7],[37,7],[34,7],[35,7],[36,7],[38,7],[7,7],[39,7],[44,7],[45,7],[40,7],[41,7],[42,7],[43,7],[1,7],[197,53],[207,54],[196,53],[217,55],[188,56],[187,57],[216,58],[210,59],[215,60],[190,61],[204,62],[189,63],[213,64],[185,65],[184,58],[214,66],[186,67],[191,68],[192,7],[195,68],[182,7],[218,69],[208,70],[199,71],[200,72],[202,73],[198,74],[201,75],[211,58],[193,76],[194,77],[203,78],[183,79],[206,70],[205,68],[209,7],[212,80],[48,7],[170,81],[166,82],[168,7],[167,83],[169,84],[158,85],[159,86],[163,87],[164,88],[162,89],[160,90],[161,91],[72,7],[157,7],[68,7],[73,92],[156,93],[155,7],[154,93],[71,93],[153,94],[55,95],[152,94],[151,93],[150,93],[149,93],[148,94],[126,96],[102,97],[100,98],[147,99],[146,100],[145,101],[144,7],[114,7],[143,102],[165,103],[140,104],[141,105],[101,7],[138,106],[142,107],[139,108],[137,102],[122,109],[132,7],[119,110],[130,111],[121,112],[134,7],[131,113],[136,114],[129,115],[135,116],[133,117],[128,118],[127,119],[125,120],[124,121],[123,122],[120,123],[118,97],[113,7],[117,124],[116,125],[115,126],[103,101],[112,7],[111,127],[110,128],[109,129],[108,110],[107,7],[106,130],[105,131],[104,132],[99,133],[98,93],[97,7],[96,7],[95,134],[92,7],[94,7],[93,135],[91,85],[67,7],[87,134],[90,134],[89,136],[88,137],[86,129],[85,134],[84,7],[83,134],[82,129],[81,7],[80,7],[79,7],[78,7],[77,134],[76,138],[75,139],[74,129],[70,7],[69,140],[66,141],[65,7],[52,134],[64,142],[61,7],[63,142],[62,143],[56,7],[54,134],[60,134],[59,7],[58,7],[57,144],[53,141],[51,7],[49,7],[50,7]],"latestChangedDtsFile":"./index.d.ts","version":"5.9.3"}
|
|
1
|
+
{"fileNames":["../../../../../node_modules/typescript/lib/lib.es5.d.ts","../../../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../../../node_modules/typescript/lib/lib.dom.d.ts","../../../../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../../../../node_modules/typescript/lib/lib.esnext.float16.d.ts","../../../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../src/aac/adts.ts","../../../../vinyl-util/src/util/type.ts","../../../../vinyl-util/src/util/url/resolveUrl.ts","../../../../vinyl-util/src/util/string/uid.ts","../../../../vinyl-util/src/error/ErrorOrigin.ts","../../../../vinyl-util/src/util/object/object.ts","../../../../vinyl-util/src/util/serialization/json.ts","../../../../vinyl-util/src/error/ReportableError.ts","../../../../vinyl-util/src/error/IllegalArgumentError.ts","../../../../vinyl-util/src/util/map/map.ts","../../../../vinyl-util/src/util/object/readonlyType.ts","../../../../vinyl-util/src/util/string/string.ts","../../../../vinyl-util/src/util/math/math.ts","../../../../vinyl-util/src/util/serialization/ParseError.ts","../../../../vinyl-util/src/util/string/StringReader.ts","../../../../vinyl-util/src/util/set/set.ts","../../../../vinyl-util/src/util/serialization/stringifyForPrint.ts","../../../../vinyl-util/src/util/serialization/primitives.ts","../../../../vinyl-util/src/util/comparison/compare.ts","../../../../vinyl-util/src/util/collection/LinkedList.ts","../../../../vinyl-util/src/error/AbortError.ts","../../../../vinyl-util/src/error/IllegalStateError.ts","../../../../vinyl-util/src/core/Unsubscribe.ts","../../../../vinyl-util/src/core/disposable.ts","../../../../vinyl-util/src/event/Signal.ts","../../../../vinyl-util/src/logging/LogTarget.ts","../../../../vinyl-util/src/event/EventHost.ts","../../../../vinyl-util/src/util/fun/function.ts","../../../../vinyl-util/src/util/async/Abort.ts","../../../../vinyl-util/src/util/async/abortUtils.ts","../../../../vinyl-util/src/util/async/TaskQueue.ts","../../../../vinyl-util/src/util/collection/array.ts","../../../../vinyl-util/src/util/range/Ranges.ts","../../../../vinyl-util/src/util/range/timeRanges.ts","../../../../vinyl-util/src/util/range/UnionRanges.ts","../../../../vinyl-util/src/util/range/IntersectionRanges.ts","../../../../vinyl-util/src/util/object/mutableType.ts","../../../../vinyl-util/src/util/collection/typedArray.ts","../../../../vinyl-util/src/core/cloneable.ts","../../../../vinyl-util/src/util/object/mergeDeep.ts","../../../../vinyl-util/src/util/object/merge.ts","../../../../vinyl-util/src/util/object/lazy.ts","../../../../vinyl-util/src/util/object/equalDeep.ts","../../../../vinyl-util/src/util/object/clone.ts","../../../../vinyl-util/src/util/network/request.ts","../../../../vinyl-util/src/util/buffer/buffer.ts","../../../../vinyl-util/src/util/buffer/BufferError.ts","../../../../vinyl-util/src/util/buffer/BufferReader.ts","../../../../vinyl-util/src/error/ValidationError.ts","../../../../vinyl-util/src/error/MediaUnsupportedError.ts","../../../../vinyl-util/src/util/mpeg/parseSidxBox.ts","../../../../vinyl-util/src/util/iteration/iterable.ts","../../../../vinyl-util/src/global/environment.ts","../../../../vinyl-util/src/util/async/TimeoutSlot.ts","../../../../vinyl-util/src/util/fun/throttle.ts","../../../../vinyl-util/src/util/collection/CacheMap.ts","../../../../vinyl-util/src/util/collection/LruCache.ts","../../../../vinyl-util/src/util/fun/memoize.ts","../../../../vinyl-util/src/util/fun/flow.ts","../../../../vinyl-util/src/util/fun/debounce.ts","../../../../vinyl-util/src/util/error/stack.ts","../../../../vinyl-util/src/util/date/date.ts","../../../../vinyl-util/src/util/config/ValueProvider.ts","../../../../vinyl-util/src/util/buffer/BufferWriter.ts","../../../../vinyl-util/src/util/browser/searchParams.ts","../../../../vinyl-util/src/error/TimeoutError.ts","../../../../vinyl-util/src/util/async/Deferred.ts","../../../../vinyl-util/src/util/async/promise.ts","../../../../vinyl-util/src/util/async/sleep.ts","../../../../vinyl-util/src/util/async/timeout.ts","../../../../vinyl-util/src/util/async/never.ts","../../../../vinyl-util/src/util/async/TimeoutController.ts","../../../../vinyl-util/src/global/globalRegistry.ts","../../../../vinyl-util/src/persistence/KeyValuePersistence.ts","../../../../vinyl-util/src/persistence/StoragePersistence.ts","../../../../vinyl-util/src/persistence/persistenceRef.ts","../../../../vinyl-util/src/logging/getLogLevelFromSearch.ts","../../../../vinyl-util/src/logging/Logger.ts","../../../../vinyl-util/src/persistence/PersistentItem.ts","../../../../vinyl-util/src/patch/patchTarget.ts","../../../../vinyl-util/src/network/Requester.ts","../../../../vinyl-util/src/client/Version.ts","../../../../vinyl-util/src/client/userAgent/UserAgentInfo.ts","../../../../vinyl-util/src/client/userAgent/tokenizeUserAgent.ts","../../../../vinyl-util/src/client/userAgent/userAgentRuleHelpers.ts","../../../../vinyl-util/src/client/userAgent/defaultUserAgentRules.ts","../../../../vinyl-util/src/client/userAgent/parseUserAgent.ts","../../../../vinyl-util/src/client/userAgent/hasBrowser.ts","../../../../vinyl-util/src/patch/network/fetch.ts","../../../../vinyl-util/src/network/RequesterImplEventMap.ts","../../../../vinyl-util/src/network/RequestError.ts","../../../../vinyl-util/src/network/responseUtil.ts","../../../../vinyl-util/src/global/globalTarget.ts","../../../../vinyl-util/src/network/requesterUtil.ts","../../../../vinyl-util/src/network/logging/networkLoggingHandler.ts","../../../../vinyl-util/src/network/browser/NetworkInformation.ts","../../../../vinyl-util/src/network/metrics/networkMetricsModel.ts","../../../../vinyl-util/src/network/metrics/NetworkMetricsController.ts","../../../../vinyl-util/src/network/metrics/NetworkMetricsControllerImpl.ts","../../../../vinyl-util/src/network/metrics/networkMetricsGlobal.ts","../../../../vinyl-util/src/network/RequesterImpl.ts","../../../../vinyl-util/src/network/createRequester.ts","../../../../vinyl-util/src/network/requesterGlobal.ts","../../../../vinyl-util/src/event/DomEventHost.ts","../../../../vinyl-util/src/event/nextEventAsPromise.ts","../../../../vinyl-util/src/network/network.ts","../../../../vinyl-util/src/network/RequestInterceptor.ts","../../../../vinyl-util/src/logging/logTimer.ts","../../../../vinyl-util/src/logging/ConsoleLogHandler.ts","../../../../vinyl-util/src/logging/HistoryLogHandler.ts","../../../../vinyl-util/src/logging/VinylLogging.ts","../../../../vinyl-util/src/event/redispatchEvents.ts","../../../../vinyl-util/src/event/onAny.ts","../../../../vinyl-util/src/error/UnreachableCodeError.ts","../../../../vinyl-util/src/error/StackOverflowError.ts","../../../../vinyl-util/src/error/ServiceResponseError.ts","../../../../vinyl-util/src/core/clearable.ts","../../../../vinyl-util/src/index.ts","../../../src/mp4/mp4.ts","../../../src/transmux/sampleEntry.ts","../../../src/mpegts/mpegts.ts","../../../src/transmux/transmux.ts","../../../src/index.ts","../../../../../node_modules/@types/node/compatibility/iterators.d.ts","../../../../../node_modules/@types/node/globals.typedarray.d.ts","../../../../../node_modules/@types/node/buffer.buffer.d.ts","../../../../../node_modules/@types/node/globals.d.ts","../../../../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../../../../node_modules/@types/node/web-globals/crypto.d.ts","../../../../../node_modules/@types/node/web-globals/domexception.d.ts","../../../../../node_modules/@types/node/web-globals/events.d.ts","../../../../../node_modules/buffer/index.d.ts","../../../../../node_modules/undici-types/utility.d.ts","../../../../../node_modules/undici-types/header.d.ts","../../../../../node_modules/undici-types/readable.d.ts","../../../../../node_modules/undici-types/fetch.d.ts","../../../../../node_modules/undici-types/formdata.d.ts","../../../../../node_modules/undici-types/connector.d.ts","../../../../../node_modules/undici-types/client-stats.d.ts","../../../../../node_modules/undici-types/client.d.ts","../../../../../node_modules/undici-types/errors.d.ts","../../../../../node_modules/undici-types/dispatcher.d.ts","../../../../../node_modules/undici-types/global-dispatcher.d.ts","../../../../../node_modules/undici-types/global-origin.d.ts","../../../../../node_modules/undici-types/pool-stats.d.ts","../../../../../node_modules/undici-types/pool.d.ts","../../../../../node_modules/undici-types/handlers.d.ts","../../../../../node_modules/undici-types/balanced-pool.d.ts","../../../../../node_modules/undici-types/h2c-client.d.ts","../../../../../node_modules/undici-types/agent.d.ts","../../../../../node_modules/undici-types/mock-interceptor.d.ts","../../../../../node_modules/undici-types/mock-call-history.d.ts","../../../../../node_modules/undici-types/mock-agent.d.ts","../../../../../node_modules/undici-types/mock-client.d.ts","../../../../../node_modules/undici-types/mock-pool.d.ts","../../../../../node_modules/undici-types/snapshot-agent.d.ts","../../../../../node_modules/undici-types/mock-errors.d.ts","../../../../../node_modules/undici-types/proxy-agent.d.ts","../../../../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../../../../node_modules/undici-types/retry-handler.d.ts","../../../../../node_modules/undici-types/retry-agent.d.ts","../../../../../node_modules/undici-types/api.d.ts","../../../../../node_modules/undici-types/cache-interceptor.d.ts","../../../../../node_modules/undici-types/interceptors.d.ts","../../../../../node_modules/undici-types/util.d.ts","../../../../../node_modules/undici-types/cookies.d.ts","../../../../../node_modules/undici-types/patch.d.ts","../../../../../node_modules/undici-types/websocket.d.ts","../../../../../node_modules/undici-types/eventsource.d.ts","../../../../../node_modules/undici-types/diagnostics-channel.d.ts","../../../../../node_modules/undici-types/content-type.d.ts","../../../../../node_modules/undici-types/cache.d.ts","../../../../../node_modules/undici-types/index.d.ts","../../../../../node_modules/@types/node/web-globals/fetch.d.ts","../../../../../node_modules/@types/node/web-globals/navigator.d.ts","../../../../../node_modules/@types/node/web-globals/storage.d.ts","../../../../../node_modules/@types/node/web-globals/streams.d.ts","../../../../../node_modules/@types/node/assert.d.ts","../../../../../node_modules/@types/node/assert/strict.d.ts","../../../../../node_modules/@types/node/async_hooks.d.ts","../../../../../node_modules/@types/node/buffer.d.ts","../../../../../node_modules/@types/node/child_process.d.ts","../../../../../node_modules/@types/node/cluster.d.ts","../../../../../node_modules/@types/node/console.d.ts","../../../../../node_modules/@types/node/constants.d.ts","../../../../../node_modules/@types/node/crypto.d.ts","../../../../../node_modules/@types/node/dgram.d.ts","../../../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../../../node_modules/@types/node/dns.d.ts","../../../../../node_modules/@types/node/dns/promises.d.ts","../../../../../node_modules/@types/node/domain.d.ts","../../../../../node_modules/@types/node/events.d.ts","../../../../../node_modules/@types/node/fs.d.ts","../../../../../node_modules/@types/node/fs/promises.d.ts","../../../../../node_modules/@types/node/http.d.ts","../../../../../node_modules/@types/node/http2.d.ts","../../../../../node_modules/@types/node/https.d.ts","../../../../../node_modules/@types/node/inspector.d.ts","../../../../../node_modules/@types/node/inspector.generated.d.ts","../../../../../node_modules/@types/node/module.d.ts","../../../../../node_modules/@types/node/net.d.ts","../../../../../node_modules/@types/node/os.d.ts","../../../../../node_modules/@types/node/path.d.ts","../../../../../node_modules/@types/node/perf_hooks.d.ts","../../../../../node_modules/@types/node/process.d.ts","../../../../../node_modules/@types/node/punycode.d.ts","../../../../../node_modules/@types/node/querystring.d.ts","../../../../../node_modules/@types/node/readline.d.ts","../../../../../node_modules/@types/node/readline/promises.d.ts","../../../../../node_modules/@types/node/repl.d.ts","../../../../../node_modules/@types/node/sea.d.ts","../../../../../node_modules/@types/node/sqlite.d.ts","../../../../../node_modules/@types/node/stream.d.ts","../../../../../node_modules/@types/node/stream/promises.d.ts","../../../../../node_modules/@types/node/stream/consumers.d.ts","../../../../../node_modules/@types/node/stream/web.d.ts","../../../../../node_modules/@types/node/string_decoder.d.ts","../../../../../node_modules/@types/node/test.d.ts","../../../../../node_modules/@types/node/timers.d.ts","../../../../../node_modules/@types/node/timers/promises.d.ts","../../../../../node_modules/@types/node/tls.d.ts","../../../../../node_modules/@types/node/trace_events.d.ts","../../../../../node_modules/@types/node/tty.d.ts","../../../../../node_modules/@types/node/url.d.ts","../../../../../node_modules/@types/node/util.d.ts","../../../../../node_modules/@types/node/v8.d.ts","../../../../../node_modules/@types/node/vm.d.ts","../../../../../node_modules/@types/node/wasi.d.ts","../../../../../node_modules/@types/node/worker_threads.d.ts","../../../../../node_modules/@types/node/zlib.d.ts","../../../../../node_modules/@types/node/index.d.ts"],"fileIdsList":[[175,227,228,230,247,248],[175,229,230,247,248],[230,247,248],[175,230,235,247,248,265],[175,230,231,236,241,247,248,250,262,273],[175,230,231,232,241,247,248,250],[175,230,247,248],[175,230,233,247,248,274],[175,230,234,235,242,247,248,251],[175,230,235,247,248,262,270],[175,230,236,238,241,247,248,250],[175,229,230,237,247,248],[175,230,238,239,247,248],[175,230,240,241,247,248],[175,229,230,241,247,248],[175,230,241,242,243,247,248,262,273],[175,230,241,242,243,247,248,257,262,265],[175,222,230,238,241,244,247,248,250,262,273],[175,230,241,242,244,245,247,248,250,262,270,273],[175,230,244,246,247,248,262,270,273],[173,174,175,176,177,178,179,180,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279],[175,230,241,247,248],[175,230,247,248,249,273],[175,230,238,241,247,248,250,262],[175,230,247,248,251],[175,230,247,248,252],[175,229,230,247,248,253],[175,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279],[175,230,247,248,255],[175,230,247,248,256],[175,230,241,247,248,257,258],[175,230,247,248,257,259,274,276],[175,230,242,247,248],[175,230,241,247,248,262,263,265],[175,230,247,248,264,265],[175,230,247,248,262,263],[175,230,247,248,265],[175,230,247,248,266],[175,227,230,247,248,262,267,273],[175,230,241,247,248,268,269],[175,230,247,248,268,269],[175,230,235,247,248,250,262,270],[175,230,247,248,271],[175,230,247,248,250,272],[175,230,244,247,248,256,273],[175,230,235,247,248,274],[175,230,247,248,262,275],[175,230,247,248,249,276],[175,230,247,248,277],[175,230,235,247,248],[175,222,230,247,248],[175,230,247,248,278],[175,222,230,241,243,247,248,253,262,265,273,275,276,278],[175,230,247,248,262,279],[175,188,191,194,195,230,247,248,273],[175,191,230,247,248,262,273],[175,191,195,230,247,248,273],[175,230,247,248,262],[175,185,230,247,248],[175,189,230,247,248],[175,187,188,191,230,247,248,273],[175,230,247,248,250,270],[175,230,247,248,280],[175,185,230,247,248,280],[175,187,191,230,247,248,250,273],[175,182,183,184,186,190,230,241,247,248,262,273],[175,191,199,207,230,247,248],[175,183,189,230,247,248],[175,191,216,217,230,247,248],[175,183,186,191,230,247,248,265,273,280],[175,191,230,247,248],[175,187,191,230,247,248,273],[175,182,230,247,248],[175,185,186,187,189,190,191,192,193,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,217,218,219,220,221,230,247,248],[175,191,209,212,230,238,247,248],[175,191,199,200,201,230,247,248],[175,189,191,200,202,230,247,248],[175,190,230,247,248],[175,183,185,191,230,247,248],[175,191,195,200,202,230,247,248],[175,195,230,247,248],[175,189,191,194,230,247,248,273],[175,183,187,191,199,230,247,248],[175,191,209,230,247,248],[175,202,230,247,248],[175,185,191,216,230,247,248,265,278,280],[50,168,169,170,171,175,230,247,248],[167,175,230,247,248],[167,168,175,230,247,248],[50,168,169,170,175,230,247,248],[51,67,68,175,230,247,248],[131,175,230,247,248],[132,133,134,175,230,247,248],[51,131,132,135,136,175,230,247,248],[51,122,132,133,135,175,230,247,248],[51,61,81,107,131,132,175,230,247,248],[51,132,133,175,230,247,248],[51,71,72,175,230,247,248],[54,57,175,230,247,248],[57,175,230,247,248],[54,56,57,175,230,247,248],[54,56,175,230,247,248],[51,72,73,74,76,81,175,230,247,248],[51,59,72,73,74,75,175,230,247,248],[69,72,73,175,230,247,248],[51,76,78,117,119,175,230,247,248],[72,73,74,76,175,230,247,248],[72,73,76,175,230,247,248],[51,71,73,81,175,230,247,248],[75,175,230,247,248],[51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,175,230,247,248],[72,73,76,127,175,230,247,248],[60,72,73,76,127,175,230,247,248],[56,75,76,122,126,175,230,247,248],[122,126,127,158,159,175,230,247,248],[114,127,175,230,247,248],[75,127,175,230,247,248],[54,56,57,61,139,175,230,247,248],[51,78,175,230,247,248],[51,53,58,61,76,79,89,121,122,130,138,139,140,143,147,175,230,247,248],[111,130,175,230,247,248],[51,90,130,144,149,150,175,230,247,248],[61,73,75,76,127,139,175,230,247,248],[51,76,146,175,230,247,248],[51,55,60,62,73,76,82,84,86,93,104,111,127,145,146,147,175,230,247,248],[122,145,146,147,148,175,230,247,248],[51,60,111,175,230,247,248],[51,76,78,122,153,154,175,230,247,248],[51,122,130,150,151,175,230,247,248],[51,67,111,127,139,142,175,230,247,248],[139,140,175,230,247,248],[53,94,130,135,137,175,230,247,248],[51,58,72,73,74,75,76,127,175,230,247,248],[51,75,91,123,125,127,175,230,247,248],[51,123,175,230,247,248],[122,123,124,175,230,247,248],[70,72,76,77,175,230,247,248],[51,68,69,70,78,79,175,230,247,248],[51,61,73,78,102,111,115,118,175,230,247,248],[73,102,175,230,247,248],[51,72,73,78,79,116,175,230,247,248],[78,117,175,230,247,248],[54,57,61,78,115,118,175,230,247,248],[102,107,175,230,247,248],[95,96,175,230,247,248],[51,175,230,247,248],[69,71,101,105,175,230,247,248],[51,58,68,80,175,230,247,248],[54,60,61,98,175,230,247,248],[51,68,91,175,230,247,248],[73,103,175,230,247,248],[51,59,106,175,230,247,248],[58,73,103,175,230,247,248],[58,175,230,247,248],[54,97,98,99,175,230,247,248],[51,58,175,230,247,248],[86,89,175,230,247,248],[55,87,175,230,247,248],[71,73,175,230,247,248],[55,57,58,61,65,87,88,175,230,247,248],[51,60,175,230,247,248],[51,82,175,230,247,248],[81,175,230,247,248],[82,175,230,247,248],[62,175,230,247,248],[51,55,175,230,247,248],[56,61,175,230,247,248],[54,56,57,61,63,175,230,247,248],[51,58,59,60,175,230,247,248]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"3cd3f141f6e02afaa43dffa93d320d5c233c36c7892c766272ea9157824a6913","signature":"c84dd12dae163a85fbd8a743174c3bfd64abdd8764dbb92f629bf58cc1de33cc"},"ceceb04029d0bd1b33cf763537804df8e5be50208df3580dcb7c6c6b20b361e9","6e45f01f2d27d92f1f0ad5e681b0ef7bf1db0f325f42a3e02cf17ff368af3725","c0e7a4dd2fe97f41165348adfe5339ad76194f764669346ec2926ded05c8b72b","6a84500292f77d524c5b029be984af4f017744c1a73dda191c831a3cce4f2cda","803bc52b26fac9623c0ae8e2a47e1dac9e08c4cc82529411a367cf28ee92de08","667ee0a75c51e19af26959157a95a7716add887acbf2bf0d434766879799e86e","205dafd964592796c9fd28a96593a31cb5b80054f5160077dc920066ef2f7896","8d2450f12f2beb46bad2f38f748dc36f0f261fac74b218e93f608f28d8e31c03","0b1ba786b2a8c07b37c84141cddfa628e6ece6338dab30841dac6865d338e041","2f068fd4736485d06e3a662047ffad608f8aa405a1d92d1ef65f195bdf761a4a","8cdbb77817f1bfaca34334fa6d69d188e344b50aafa12c6e52e58de8d257c172","a9a2450b1dd8077008ba7d4839f44b7e37fc5df20c66befb2068e26e35fcc4d5","97af8a3197b153f4d1ab5c54d1e50361aa9c87566ce627ad8ff18fb63c743199","d2759f6b0462eeee6cc100c978ad0d8945241b1bba3de781742b5a1f90624a95","55f1aba9f5eda5f609068e7b80324fdd55120a8610d1e942b623972751f05759","2c9aac1d096efde3473201cdf20185686ab69f1194663a181405e380118da714","d0fe59fa0ddf1f10a10f668992de21258c4c7ee663150757ea8d084de2af86ee","459b4e95acf8549fdb08e724cd0c96312928d29dfecf122d210759ee945c79ed","c5b6fcb8bf6c57a96246e662fc93832ef3c008ce5594bd791c8320f1c3783801","7d4454f4dbb657e88ba52b954252b4bb31e60b8a600f20c543a919dd01844240","02427c560a9eea2b4dd99965f9f4953ae4e60e375545c9266a0a7e712b6a84b8","2454170c91bb00e7f4a00e9d3c9633a94276c6be320026e34c9e335dd33d01c2","151923fcfe7502d91bad042601720401193ecf550708c1654183412ddfeccb8c","f99b9af336f41015ae0e3f96e1b831af3df49be8e60c1642c9f97002082564fb","baf71ada3ad1a3ffdc4901b23769d8536b2a5fae70718fbb34d1ac007412801f","11f934dde84ab6b92f0ca498c6d982ed3bf3a30ecd3bbe78c1207f26457928b9","9cc135bf42ee4a5486a4540da33f10fdf320f93bf90c8ca7c2ef344a5e55a86d","e3c47f4cd1ac59a20d0fcc2f6282480f09f2ccc2a94b9c5d9db538ced705ff3e","bf1478b16f86bd052bdfbb0f50d1b4ef028dfb2391444d00637c04f1cd6609a9","e854aec354a8d85854c9f88c4ffa7d1b0b9f69b7eabdc3aa5cc9d44c19d029f8","618a30a4c8492def0faa7ee0d48c262879a2ff8a0fe380689605af66677f1809","63f4323d886b5a3ae66f490e772ea917b79178e09da52b84fc6643149d2a10d4","715eb2e690a619bdb49ed30615d42bf795df61125cd074d462ec763dd30732f7","e029335eac51354f64b3fc203da877a4faaf461d69205267faaf3a7f1a2d3eed","2ceda84623bbb29aaa4e4f28ae68f9e834c54faabc4a3649431d8e244e245e8f","6771c5770560772c6f599e3def28be44ee6064c1ff47e33375c7f505e59c3d4d","8e7dc280e2b54034387ecb422e59029e7585f77625ece64d4b97118e468cca67","4528198219c64f5ff1cb9447af408dbf6e43c92a8c4730b9db7ef1752f4fd3e7","baa84afdff201ce01e4cc27b9d840bf76fa343286e656a6f1e03fe87504618de","55f5f5790ad04a6de4d7387c7faee96138c26935f85c6bad5bca1f5d6eb60fd5","b88cd0bc27ae1d8f6c50b01ce609e9e1badf8d26f8630450f7d42cae12cfba70","df175d584fb21d2eaa5e77c94b776af64c5ee8e43663c2c8ed8fd7af76557417","050d3aada50e7746d9448387f476f84d15651521911b79fd0fb9e24c24783be1","bce3ae86d6d5741568512a1430dabf316c380507275a0d4b125e545a18060c86","052af01715a9c813a52a31446d94a1f05a0889fcfb753a815ad289f67b01e7d3","b9dcc65b9bc17c04c6e81d107980d715c097f874f29ff573aa7479f1e285a8f5","6b2b726d257fae174424fd52fec51c2c5ed5f4a9a3770b8624f54e7cc17ce55a","2832a68f83764c2adfde4b1c855e746a36caf3e175481b79c1fa7160fd6639ec","56ecb833d6d001718745076d1bc4dc7703065de47640ae07e81aaeba598f9148","4137537cbcff7a33a0a7cac90124ae5b759ded4e8448cafa2077c6157c42730b","aafa3a2ed74036b53a4e3f9b5f529f33c6f949126430006a40c1f448cb75ada6","49015f0202f54e3afc7f2b37f37ecc96fce8a45cb3609b013120a7a379caae07","08801339d9792ccb7d3b1453d481ed8f146b3fc6f91c427d2d9cec12377da54c","79a6a5972e984bd269bf4f2193421bed90424f5e123ec73c9297b04b06a7e224","ba9a777fd398330bf3cddc2f4d187a993c02360cbb88aec1e76e1bc3711d3951","751bd415b9b8fa37716d22ae9248d73ff5ffabef5231643c0bc02002686cf4ab","dcc8801145e0d64330cf68a1003a6f70f95db3348df53151c42a7bd21a8327a1","e740eccf4cc3cf653a17568456f221c9f3e50a1ba38873663f0a9f55fa703f23","403556d997405680c34e69431176b316adbde356c99bc9ea0ac02884de5c904c","23cddf5a271cea5cc3bf760d016debb7a32c884350014099be569b93045e5e1e","450a511ce4c90b083b360a82eabd3522fc59779e7e35776731ac657c9b5b5f18","a46f2ee7a7e8b9e298bcd31ecd1c0b13b9210ae3e342a688d541011d585eaa11","dd5de20f84007dfadb70359fa587905a1b0a7b99e034c43b33891cdedc1dcca5","05118889f169e88cf3a5c17b0dd4fc8c2c01d963f54f0e7b43f61c9fa7fbdabe","25388c0b42d3a708bac5011cc264be639ee223f0136c13544e2d9fa42cd778e8","dde61a660df22867d14dfc083a06816c55ca9fc8ac8f9cbfcb600533b3e40b30","dc6cf5321e3fa0dfc47b4ace79952a0d6f72b09069ba2df872db3c4b4ae6fb5a","b168a4a7c84cd98b5a95a149b7c41baea714c7c8ef795197cb8495b3575c8019","6299c6a521ee10f3ed8d599fab5e262447df0163573e979e62a79db61a99d273","d33e8b4ea2d041cee109f11189b52b544274cca5cd50cd8de28e53b765386d5a","83727591c67fbcf33a7354a7873e4a4daf2017ba0e44acf1bbbed8b79547feff","d470f93c69f3357fc080caf568d84f29b49735b44815f5e49582814de24b878f","4beae6170f21aee69586c8757922cc94334959c7cbc40beba30ff6eac7f429cb","1d48ba8168f9ddac4cb0dfcb87492b59caa40f3c925ccf91ade2be7df9cbe33c","6e7be5080f1aad879101a57ddcf268399856a8f1e81cb0a1b5fd0e50133082ad","b449c4da2fe920018b460d81f5d80ce8aec41a8ee51e9d80b64754666fcc9adf","bad7f28d7cb9d369cbd5162e4d52ec2577f082f035f85226d2a8a369fe805ccc","92d5af34e6a22d5fa96226063b3ee8c9537e2d20cc1ff67bc857643c6bc44d8c","923263b16680129e91efabb73fc0c35b9da3edeebc681332d2890e66438e0959","19379efe946ef7f6fcb58e05629b860dc629264151b38c70cd498350c84fa9c9","54b98bfd7878c09958b4dd5f29877bbed09c1d6772b730ff222d1cd5d4bb5188","43d98b54afbbbc51562d3d2783a25e8b1fc78ed5da25cee66805a73543505ec1","2823e5cb43340fa966b7e09f02d5356e8406efc06d7348692485d29c00ba9a5d","ec08de9d6b4b39f896bbad993d5ba49b00bfdf9d250e61b376eb6f827bf05ce5","751391ada0eb32e199d87ae6c77ed9489acc2a1cad63817ee2af3565ed6d0377","e83fe3f591b4a1e0e712fb028297f97eeddc450c83968c42cc4beab2da5595ce","1addd7ef0c89293c4e3f8b4e991bca116146d55dac11af7d566410f5981ae765","99b7e5609f61625e716fa4caa24e152536d0a2fab989de44ab5ac734626992b2","2ee0d837d4ac7de1d697944e878e8dc1c3803ba756881145d9b34e12c0570b54","f0a4986019d1ce6ecb80b9ffae2e0d2357dfbaa894196dda2390070297f97f58","e4af258b28164b81b0c918207b824d2345de3034d5516da511d372c524a2ef0e","95451eb039ab7e405fdd41396f7780bbee58b41e52145c4d5d9657d0153a68a3","5efdfbed3373a85a6e5407472c1cd3ae934a72920634cb97fa487648585b69f7","fc26150a83050a2babe2f68d6e4e1864da3ebd4d1a6b0a0671bcd4d69ab468bc","5b3aa295c2c2d6de0ddb9f9814e7c1b7a1ee0d30a292fa3198fb2b5420160973","6fc83144264e4e29408b0759541a723bc885698bf4094b80a427c3799659941f","aae0d19e1b553314c7dd135c7a95c9353949a6403a1674f5669ed97c53297d8e","a3990a56922e9b8059cb0d758f0edb3f9032e24fc810094cb285b16ae1d78f6c","e1336d3aa073bacbcaee5c9a41753ef8001ba888fc9a4bf96cc0c818317350eb","27342f4d309825bc3b19c4943979b28f21644912058f60d06f271b00d64e9565","70c64165a29098b318e88a3754159063739391acb13ca13c1a8cc959017a5354","0b162a8ed0516fd78bdd3e4b1beb7bb6f7727ce8fbf18fc48e98124e300e6453","6fe83f930905eb1572f74ffde95c6fb2e9d0fcf87a4b4ceb3b1fbf9e87bf8bc4","f2823b26e0c64ab101bdb59122f6311b596bf474cfdb2bc474d2cb7dc18262be","4ec35527b1365c77bd204b3d2cbfff606792ec1116db4d2db54b00042ff989f8","da25e2054a8f8eb7e53e04366209d37aa8d7c439ac87de4954775db0f1043d72","f1ea5400735f17b9d4e2cb8764921696bf85643a242e036421af4437814d04b0","d3ad37e4082bc8709aaa6019d7de990349467a01fcbbd7b56a5c3e1513e9cd20","43fd65279a5bf00fcfa8e53ec95750525f7e29a69de08289353c5b4b4b38a849","242b84091641c30ff14bd5b63e269509f75bea4ceb7f17e482f91bd8214d1c49","f40df6748047b1b0e15bcce08f102c75c0eec10796e63813cb515ddc04dd404c","13a269fea7922890001a8f36c75b96146a1c8a665ff1e780c0e299f0ab12342e","fc6def1af71369bd0616576decef7f32d451526da769e8fff505d4a21706ec22","64fdb78b1882acd969696f6082dfbea9fadf4f8039ddd58734226abe7672d851","72a31d1f6e606d0390c50c1cc110cecede5e906bc38d05894ab5b9ac62a859d2","e95f61e69e3d19e809a83e0189d6295fc548a889acdda32a417fa0ba06217ddd","e343be2d87d43a884b475271c85896cd27281e970be8e343c6ac62ec3ef9699e",{"version":"40429b833fd288f66cf6807a70c8de56213e999ea8061458e5aa8a3c7600f6c8","signature":"5d921cd39fc3f7557577d7289c4f5c209b1b1d4f5d7204075faf2a6556309271"},{"version":"bc0d5a739f1dd1d50b4fa298cf7ef4119733f3ede63f89ac7188c334e914cd46","signature":"7b3e732595c9c8740431aa0597654bbf29177eca4f880c565f23117678dd0a37"},{"version":"6a4ca1e648ee858a9ac23f3a1ded9c468a50bee877a07d8098eb03628b6f0d10","signature":"4ae93e86e6b9f1e6bb10c2334b47e372c9ba694e7272349d0026c3c20ab87076"},{"version":"598f0938fde3815292850e71fc77f268ad02cf89975ad9a0611ffa2c043f569b","signature":"35c4874a186d192bd4a0eb20bb84314ac3a1ed4d49f5910ac67e11b6dcc475d7"},{"version":"3f1828b05b5f89f4f9c06efb5c5d82d5cf8f56b573486ad68881fb90502439be","signature":"9aec742088a849af2125107fa03f67b18cd3bdd08a18a90f947c78c0ae22f561"},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"378281aa35786c27d5811af7e6bcaa492eebd0c7013d48137c35bbc69a2b9751","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"1b2dd1cbeb0cc6ae20795958ba5950395ebb2849b7c8326853dd15530c77ab0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"387a023d363f755eb63450a66c28b14cdd7bc30a104565e2dbf0a8988bb4a56c","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"3a80bc85f38526ca3b08007ee80712e7bb0601df178b23fbf0bf87036fce40ce","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"2931540c47ee0ff8a62860e61782eb17b155615db61e36986e54645ec67f67c2","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"f6faf5f74e4c4cc309a6c6a6c4da02dbb840be5d3e92905a23dcd7b2b0bd1986","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"33e981bf6376e939f99bd7f89abec757c64897d33c005036b9a10d9587d80187","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"3bacf516d686d08682751a3bd2519ea3b8041a164bfb4f1d35728993e70a2426","impliedFormat":1},{"version":"7fb266686238369442bd1719bc0d7edd0199da4fb8540354e1ff7f16669b4323","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"c183b931b68ad184bc8e8372bf663f3d33304772fb482f29fb91b3c391031f3e","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"48cc3ec153b50985fb95153258a710782b25975b10dd4ac8a4f3920632d10790","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"e1528ca65ac90f6fa0e4a247eb656b4263c470bb22d9033e466463e13395e599","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"866078923a56d026e39243b4392e282c1c63159723996fa89243140e1388a98d","impliedFormat":1},{"version":"f724236417941ea77ec8d38c6b7021f5fb7f8521c7f8c1538e87661f2c6a0774","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ea15fd99b2e34cb25fe8346c955000bb70c8b423ae4377a972ef46bfb37f595","impliedFormat":1},{"version":"7cf69dd5502c41644c9e5106210b5da7144800670cbe861f66726fa209e231c4","impliedFormat":1},{"version":"72c1f5e0a28e473026074817561d1bc9647909cf253c8d56c41d1df8d95b85f7","impliedFormat":1},{"version":"f9b4137a0d285bd77dba2e6e895530112264310ae47e07bf311feae428fb8b61","affectsGlobalScope":true,"impliedFormat":1},{"version":"c06b2652ffeb89afd0f1c52c165ced77032f9cd09bc481153fbd6b5504c69494","impliedFormat":1},{"version":"51aecd2df90a3cffea1eb4696b33b2d78594ea2aa2138e6b9471ec4841c6c2ee","impliedFormat":1},{"version":"9d8f9e63e29a3396285620908e7f14d874d066caea747dc4b2c378f0599166b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"612422d5ba6b4a5c4537f423e9199645468ad80a689801da63ab7edb43f7b835","impliedFormat":1},{"version":"db9ada976f9e52e13f7ae8b9a320f4b67b87685938c5879187d8864b2fbe97f3","impliedFormat":1},{"version":"9f39e70a354d0fba29ac3cdf6eca00b7f9e96f64b2b2780c432e8ea27f133743","impliedFormat":1},{"version":"0dace96cc0f7bc6d0ee2044921bdf19fe42d16284dbcc8ae200800d1c9579335","impliedFormat":1},{"version":"a2e2bbde231b65c53c764c12313897ffdfb6c49183dd31823ee2405f2f7b5378","impliedFormat":1},{"version":"ad1cc0ed328f3f708771272021be61ab146b32ecf2b78f3224959ff1e2cd2a5c","impliedFormat":1},{"version":"c64e1888baaa3253ca4405b455e4bf44f76357868a1bd0a52998ade9a092ad78","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc8c6f5322961b56d9906601b20798725df60baeab45ec014fba9f795d5596fd","impliedFormat":1},{"version":"0904660ae854e6d41f6ff25356db1d654436c6305b0f0aa89d1532df0253486e","impliedFormat":1},{"version":"060d305fe4494d8cb2b99d620928d369d1ee55c1645f5e729a2aca07d0f108cb","impliedFormat":1},{"version":"a016b2a26863dd6acb1f18c4ff37363c2b51e27ca7b3374dc6342aff1ddead2d","impliedFormat":1},{"version":"0c50296ee73dae94efc3f0da4936b1146ca6ce2217acfabb44c19c9a33fa30e5","impliedFormat":1},{"version":"bbf42f98a5819f4f06e18c8b669a994afe9a17fe520ae3454a195e6eabf7700d","impliedFormat":1},{"version":"0e5974dfff7a97181c7c376545f126b20acf2f1341db7d3fccea4977bf3ce19c","impliedFormat":1},{"version":"c7f977ea78a1b060a30554c1c4ec0e2269c6e305a349ca2ada14931ac27ecc0b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3806cdd6b48ba01a9198134e62a384ec217a98f316d4baef74dd46d62c947a63","impliedFormat":1},{"version":"ff65b8a8bd380c6d129becc35de02f7c29ad7ce03300331ca91311fb4044d1a9","impliedFormat":1},{"version":"04bf1aa481d1adfb16d93d76e44ce71c51c8ef68039d849926551199489637f6","impliedFormat":1},{"version":"2c9adcc85574b002c9a6311ff2141055769e0071856ec979d92ff989042b1f1b","affectsGlobalScope":true,"impliedFormat":1},{"version":"b8bf3fe89ec8baa335f6370b9fa36308e1bc7a72e2eb2dad1e94f31e27fa28b5","affectsGlobalScope":true,"impliedFormat":1},{"version":"a58a15da4c5ba3df60c910a043281256fa52d36a0fcdef9b9100c646282e88dd","impliedFormat":1},{"version":"b36beffbf8acdc3ebc58c8bb4b75574b31a2169869c70fc03f82895b93950a12","impliedFormat":1},{"version":"de263f0089aefbfd73c89562fb7254a7468b1f33b61839aafc3f035d60766cb4","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"8c81fd4a110490c43d7c578e8c6f69b3af01717189196899a6a44f93daa57a3a","impliedFormat":1},{"version":"5fb39858b2459864b139950a09adae4f38dad87c25bf572ce414f10e4bd7baab","impliedFormat":1},{"version":"35390d6fa94bdb432c5d0bcb6547bdd11406c2692a6b90b9e47be2105ea19bd6","impliedFormat":1},{"version":"3910dab597c40e173bf0e0d419d3ce9682c54ebf6ae84849f9b829b1451a17ec","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"486c074a5c0f2254345c0d1c9540380f5463999e42d7e1a159305ea823d3c4b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"c119835edf36415081dfd9ed15fc0cd37aaa28d232be029ad073f15f3d88c323","impliedFormat":1},{"version":"8e7c3bed5f19ade8f911677ddc83052e2283e25b0a8654cd89db9079d4b323c7","impliedFormat":1},{"version":"9705cd157ffbb91c5cab48bdd2de5a437a372e63f870f8a8472e72ff634d47c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae86f30d5d10e4f75ce8dcb6e1bd3a12ecec3d071a21e8f462c5c85c678efb41","impliedFormat":1},{"version":"ccf3afaeebbeee4ca9092101e99fd6abd681116b6e5ec23e381bbb1e1f32262c","impliedFormat":1},{"version":"e03460fe72b259f6d25ad029f085e4bedc3f90477da4401d8fbc1efa9793230e","impliedFormat":1},{"version":"4286a3a6619514fca656089aee160bb6f2e77f4dd53dc5a96b26a0b4fc778055","impliedFormat":1},{"version":"ab7818a9d57a9297b90e456fc68b77f84d74395a9210a3cfa9d87db33aff8b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb08062718a5470cd864c1fae0eb5b3a3adc5bcd05dcf87608d6f60b65eca3f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"3a815b7d1aebc0646b91548eab2fc19dada09ff255d04c71ced00bbd3058c8eb","impliedFormat":1},{"version":"255d948f87f24ffd57bcb2fdf95792fd418a2e1f712a98cf2cce88744d75085c","impliedFormat":1},{"version":"0d5b085f36e6dc55bc6332ecb9c733be3a534958c238fb8d8d18d4a2b6f2a15a","impliedFormat":1},{"version":"836b36913830645ac3b28fe33731aac3fdb3524ee8adbb4cdab9a5c189f41943","affectsGlobalScope":true,"impliedFormat":1},{"version":"bfd3b3c21a56104693183942e221c1896ee23bcb8f8d91ab0b941f7b32985411","impliedFormat":1},{"version":"d7e9ab1b0996639047c61c1e62f85c620e4382206b3abb430d9a21fb7bc23c77","impliedFormat":1}],"root":[50,[168,172]],"options":{"alwaysStrict":true,"composite":true,"declaration":true,"declarationMap":true,"esModuleInterop":true,"exactOptionalPropertyTypes":true,"module":99,"noImplicitAny":true,"noImplicitThis":true,"outDir":"./","skipLibCheck":true,"strict":true,"strictBindCallApply":true,"strictFunctionTypes":true,"strictNullChecks":true,"strictPropertyInitialization":true,"target":99,"useUnknownInCatchVariables":true},"referencedMap":[[227,1],[228,1],[229,2],[175,3],[230,4],[231,5],[232,6],[173,7],[233,8],[234,9],[235,10],[236,11],[237,12],[238,13],[239,13],[240,14],[241,15],[242,16],[243,17],[176,7],[174,7],[244,18],[245,19],[246,20],[280,21],[247,22],[248,7],[249,23],[250,24],[251,25],[252,26],[253,27],[254,28],[255,29],[256,30],[257,31],[258,31],[259,32],[260,7],[261,33],[262,34],[264,35],[263,36],[265,37],[266,38],[267,39],[268,40],[269,41],[270,42],[271,43],[272,44],[273,45],[274,46],[275,47],[276,48],[277,49],[177,7],[178,50],[179,7],[180,7],[223,51],[224,52],[225,7],[226,37],[278,53],[279,54],[181,7],[48,7],[49,7],[8,7],[9,7],[11,7],[10,7],[2,7],[12,7],[13,7],[14,7],[15,7],[16,7],[17,7],[18,7],[19,7],[3,7],[20,7],[21,7],[4,7],[22,7],[26,7],[23,7],[24,7],[25,7],[27,7],[28,7],[29,7],[5,7],[30,7],[31,7],[32,7],[33,7],[6,7],[37,7],[34,7],[35,7],[36,7],[38,7],[7,7],[39,7],[44,7],[45,7],[40,7],[41,7],[42,7],[43,7],[1,7],[46,7],[47,7],[199,55],[211,56],[197,57],[212,58],[221,59],[188,60],[189,61],[187,62],[220,63],[215,64],[219,65],[191,66],[208,67],[190,68],[218,69],[185,70],[186,64],[192,71],[193,7],[198,72],[196,71],[183,73],[222,74],[213,75],[202,76],[201,71],[203,77],[206,78],[200,79],[204,80],[216,63],[194,81],[195,82],[207,83],[184,58],[210,84],[209,71],[205,85],[214,7],[182,7],[217,86],[50,7],[172,87],[168,88],[170,7],[169,89],[171,90],[131,91],[132,92],[135,93],[137,94],[136,95],[133,96],[134,97],[72,7],[166,7],[88,7],[73,98],[70,99],[54,7],[58,99],[71,100],[99,101],[57,102],[165,101],[164,100],[115,99],[163,100],[98,101],[153,103],[76,104],[74,105],[154,106],[162,107],[161,108],[102,7],[122,109],[142,110],[167,111],[158,112],[159,113],[75,7],[127,114],[160,115],[126,116],[157,117],[140,118],[156,7],[130,119],[150,120],[139,121],[145,7],[151,122],[144,123],[147,124],[148,125],[149,126],[146,127],[155,128],[152,129],[143,130],[141,131],[138,132],[129,133],[123,7],[128,134],[124,135],[125,136],[78,137],[116,7],[80,138],[121,139],[103,140],[79,119],[120,7],[117,141],[118,142],[119,143],[114,144],[96,99],[97,145],[113,7],[95,146],[105,7],[69,7],[106,147],[81,148],[87,7],[68,146],[112,146],[111,149],[110,150],[109,151],[108,146],[77,7],[107,152],[104,153],[101,154],[59,7],[62,7],[100,155],[94,156],[93,157],[92,158],[91,159],[90,7],[89,160],[86,161],[55,7],[60,146],[85,162],[82,163],[84,162],[83,164],[63,165],[56,166],[67,146],[66,167],[65,7],[64,168],[61,169],[53,7],[51,7],[52,7]],"latestChangedDtsFile":"./index.d.ts","version":"5.9.3"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@amazon/vinyl-transmux",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "MPEG-TS to fMP4 transmuxer for browser and Node.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
},
|
|
44
44
|
"exports": {
|
|
45
45
|
".": {
|
|
46
|
+
"development": "./src/index.ts",
|
|
46
47
|
"types@>=5.4": "./dist/types/current/index.d.ts",
|
|
47
48
|
"types@>=4.7": "./dist/types/ts4.7/index.d.ts",
|
|
48
49
|
"require": "./dist/index.cjs",
|
|
@@ -63,21 +64,17 @@
|
|
|
63
64
|
"eslint:write": "eslint . --cache --fix",
|
|
64
65
|
"lint": "npm run indexFiles:check && npm run eslint:check && npm run prettier:check",
|
|
65
66
|
"lint:write": "npm run indexFiles:write && npm run eslint:write && npm run prettier:write",
|
|
66
|
-
"
|
|
67
|
-
"test": "tsx --tsconfig ../../tsconfig.flat.json ../../node_modules/jasmine/bin/jasmine --config=test/unit/jasmine.config.json",
|
|
67
|
+
"test": "tsx ../../node_modules/jasmine/bin/jasmine --config=test/unit/jasmine.config.json",
|
|
68
68
|
"test:coverage": "c8 npm run test",
|
|
69
69
|
"watch": "tsx buildSrc/build.ts --watch",
|
|
70
70
|
"watch:release": "tsx buildSrc/build.ts --watch --release"
|
|
71
71
|
},
|
|
72
72
|
"devDependencies": {
|
|
73
|
-
"@amazon/vinyl-build-utils": "^1.
|
|
74
|
-
"@amazon/vinyl-jasmine-wrapper": "^1.
|
|
73
|
+
"@amazon/vinyl-build-utils": "^1.2.0",
|
|
74
|
+
"@amazon/vinyl-jasmine-wrapper": "^1.2.0"
|
|
75
75
|
},
|
|
76
76
|
"dependencies": {
|
|
77
|
-
"@amazon/vinyl-util": "^1.
|
|
77
|
+
"@amazon/vinyl-util": "^1.2.0"
|
|
78
78
|
},
|
|
79
|
-
"
|
|
80
|
-
"defaults, chrome 52, firefox 54, edge 15, safari 8"
|
|
81
|
-
],
|
|
82
|
-
"gitHead": "ea13070fb52c1903723f08f31c356465d2f3279e"
|
|
79
|
+
"gitHead": "fbb8f1c60c5ada4a11f13954bb6bcb52f3cb0c5a"
|
|
83
80
|
}
|