@alessmicrosystems/mpegts.js 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +158 -0
- package/README_ja.md +153 -0
- package/README_zh.md +157 -0
- package/d.ts/mpegts.d.ts +524 -0
- package/d.ts/src/core/mse-events.d.ts +9 -0
- package/d.ts/src/core/transmuxing-events.d.ts +24 -0
- package/d.ts/src/demux/aac.d.ts +44 -0
- package/d.ts/src/demux/ac3.d.ts +70 -0
- package/d.ts/src/demux/av1-parser.d.ts +77 -0
- package/d.ts/src/demux/av1.d.ts +11 -0
- package/d.ts/src/demux/base-demuxer.d.ts +55 -0
- package/d.ts/src/demux/h264.d.ts +40 -0
- package/d.ts/src/demux/h265.d.ts +65 -0
- package/d.ts/src/demux/klv.d.ts +17 -0
- package/d.ts/src/demux/mp3.d.ts +6 -0
- package/d.ts/src/demux/mpeg4-audio.d.ts +28 -0
- package/d.ts/src/demux/pat-pmt-pes.d.ts +106 -0
- package/d.ts/src/demux/patpmt.d.ts +40 -0
- package/d.ts/src/demux/pes-private-data.d.ts +14 -0
- package/d.ts/src/demux/pgs-data.d.ts +9 -0
- package/d.ts/src/demux/scte35.d.ts +250 -0
- package/d.ts/src/demux/sei.d.ts +8 -0
- package/d.ts/src/demux/smpte2038.d.ts +22 -0
- package/d.ts/src/demux/ts-demuxer.d.ts +124 -0
- package/d.ts/src/player/live-latency-chaser.d.ts +10 -0
- package/d.ts/src/player/live-latency-synchronizer.d.ts +10 -0
- package/d.ts/src/player/loading-controller.d.ts +19 -0
- package/d.ts/src/player/mse-player.d.ts +30 -0
- package/d.ts/src/player/player-engine-dedicated-thread-worker.d.ts +2 -0
- package/d.ts/src/player/player-engine-dedicated-thread.d.ts +48 -0
- package/d.ts/src/player/player-engine-main-thread.d.ts +50 -0
- package/d.ts/src/player/player-engine-worker-cmd-def.d.ts +25 -0
- package/d.ts/src/player/player-engine-worker-msg-def.d.ts +54 -0
- package/d.ts/src/player/player-engine-worker.d.ts +2 -0
- package/d.ts/src/player/player-engine.d.ts +16 -0
- package/d.ts/src/player/player-events.d.ts +21 -0
- package/d.ts/src/player/seeking-handler.d.ts +22 -0
- package/d.ts/src/player/startup-stall-jumper.d.ts +14 -0
- package/d.ts/src/utils/typedarray-equality.d.ts +2 -0
- package/dist/mpegts.js +3 -0
- package/dist/mpegts.js.LICENSE.txt +7 -0
- package/dist/mpegts.js.map +1 -0
- package/package.json +53 -0
- package/src/config.js +67 -0
- package/src/core/features.js +88 -0
- package/src/core/media-info.js +127 -0
- package/src/core/media-segment-info.js +230 -0
- package/src/core/mse-controller.js +599 -0
- package/src/core/mse-events.ts +28 -0
- package/src/core/transmuxer.js +346 -0
- package/src/core/transmuxing-controller.js +628 -0
- package/src/core/transmuxing-events.ts +43 -0
- package/src/core/transmuxing-worker.js +286 -0
- package/src/demux/aac.ts +397 -0
- package/src/demux/ac3.ts +335 -0
- package/src/demux/amf-parser.js +243 -0
- package/src/demux/av1-parser.ts +629 -0
- package/src/demux/av1.ts +103 -0
- package/src/demux/base-demuxer.ts +69 -0
- package/src/demux/demux-errors.js +26 -0
- package/src/demux/exp-golomb.js +116 -0
- package/src/demux/flv-demuxer.js +1854 -0
- package/src/demux/h264.ts +187 -0
- package/src/demux/h265-parser.js +501 -0
- package/src/demux/h265.ts +214 -0
- package/src/demux/klv.ts +40 -0
- package/src/demux/mp3.ts +7 -0
- package/src/demux/mpeg4-audio.ts +45 -0
- package/src/demux/pat-pmt-pes.ts +132 -0
- package/src/demux/pes-private-data.ts +16 -0
- package/src/demux/pgs-data.ts +11 -0
- package/src/demux/scte35.ts +723 -0
- package/src/demux/sei.ts +99 -0
- package/src/demux/smpte2038.ts +89 -0
- package/src/demux/sps-parser.js +298 -0
- package/src/demux/ts-demuxer.ts +2405 -0
- package/src/index.js +4 -0
- package/src/io/fetch-stream-loader.js +266 -0
- package/src/io/io-controller.js +647 -0
- package/src/io/loader.js +134 -0
- package/src/io/param-seek-handler.js +85 -0
- package/src/io/range-seek-handler.js +52 -0
- package/src/io/speed-sampler.js +93 -0
- package/src/io/websocket-loader.js +151 -0
- package/src/io/xhr-moz-chunked-loader.js +211 -0
- package/src/io/xhr-msstream-loader.js +307 -0
- package/src/io/xhr-range-loader.js +366 -0
- package/src/mpegts.js +95 -0
- package/src/player/live-latency-chaser.ts +66 -0
- package/src/player/live-latency-synchronizer.ts +79 -0
- package/src/player/loading-controller.ts +142 -0
- package/src/player/mse-player.ts +150 -0
- package/src/player/native-player.js +262 -0
- package/src/player/player-engine-dedicated-thread.ts +479 -0
- package/src/player/player-engine-main-thread.ts +463 -0
- package/src/player/player-engine-worker-cmd-def.ts +62 -0
- package/src/player/player-engine-worker-msg-def.ts +102 -0
- package/src/player/player-engine-worker.ts +370 -0
- package/src/player/player-engine.ts +35 -0
- package/src/player/player-errors.js +39 -0
- package/src/player/player-events.ts +40 -0
- package/src/player/seeking-handler.ts +205 -0
- package/src/player/startup-stall-jumper.ts +86 -0
- package/src/remux/aac-silent.js +56 -0
- package/src/remux/mp4-generator.js +866 -0
- package/src/remux/mp4-remuxer.js +778 -0
- package/src/utils/browser.js +128 -0
- package/src/utils/exception.js +73 -0
- package/src/utils/logger.js +140 -0
- package/src/utils/logging-control.js +165 -0
- package/src/utils/polyfill.js +68 -0
- package/src/utils/typedarray-equality.ts +69 -0
- package/src/utils/utf8-conv.js +84 -0
- package/src/utils/webworkify-webpack.js +202 -0
- package/tsconfig.json +16 -0
- package/tslint.json +1 -0
- package/types/index.d.ts +3 -0
- package/types/test-flv.ts +8 -0
- package/types/tsconfig.json +24 -0
- package/webpack.config.js +55 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import Log from "../utils/logger";
|
|
2
|
+
|
|
3
|
+
export enum H265NaluType {
|
|
4
|
+
kSliceIDR_W_RADL = 19,
|
|
5
|
+
kSliceIDR_N_LP = 20,
|
|
6
|
+
kSliceCRA_NUT = 21,
|
|
7
|
+
kSliceVPS = 32,
|
|
8
|
+
kSliceSPS = 33,
|
|
9
|
+
kSlicePPS = 34,
|
|
10
|
+
kSliceAUD = 35,
|
|
11
|
+
kSliceSEI = 39,
|
|
12
|
+
kSliceSEISuffix = 40,
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export class H265NaluPayload {
|
|
16
|
+
type: H265NaluType;
|
|
17
|
+
data: Uint8Array;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export class H265NaluHVC1 {
|
|
21
|
+
type: H265NaluType;
|
|
22
|
+
data: Uint8Array;
|
|
23
|
+
|
|
24
|
+
constructor(nalu: H265NaluPayload) {
|
|
25
|
+
let nalu_size = nalu.data.byteLength;
|
|
26
|
+
|
|
27
|
+
this.type = nalu.type;
|
|
28
|
+
this.data = new Uint8Array(4 + nalu_size); // 4 byte length-header + nalu payload
|
|
29
|
+
|
|
30
|
+
let v = new DataView(this.data.buffer);
|
|
31
|
+
// Fill 4 byte length-header
|
|
32
|
+
v.setUint32(0, nalu_size);
|
|
33
|
+
// Copy payload
|
|
34
|
+
this.data.set(nalu.data, 4);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export class H265AnnexBParser {
|
|
39
|
+
|
|
40
|
+
private readonly TAG: string = "H265AnnexBParser";
|
|
41
|
+
|
|
42
|
+
private data_: Uint8Array;
|
|
43
|
+
private current_startcode_offset_: number = 0;
|
|
44
|
+
private eof_flag_: boolean = false;
|
|
45
|
+
|
|
46
|
+
public constructor(data: Uint8Array) {
|
|
47
|
+
this.data_ = data;
|
|
48
|
+
this.current_startcode_offset_ = this.findNextStartCodeOffset(0);
|
|
49
|
+
if (this.eof_flag_) {
|
|
50
|
+
Log.e(this.TAG, "Could not find H265 startcode until payload end!");
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
private findNextStartCodeOffset(start_offset: number) {
|
|
55
|
+
let i = start_offset;
|
|
56
|
+
let data = this.data_;
|
|
57
|
+
|
|
58
|
+
while (true) {
|
|
59
|
+
if (i + 3 >= data.byteLength) {
|
|
60
|
+
this.eof_flag_ = true;
|
|
61
|
+
return data.byteLength;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// search 00 00 00 01 or 00 00 01
|
|
65
|
+
let uint32 = (data[i + 0] << 24)
|
|
66
|
+
| (data[i + 1] << 16)
|
|
67
|
+
| (data[i + 2] << 8)
|
|
68
|
+
| (data[i + 3]);
|
|
69
|
+
let uint24 = (data[i + 0] << 16)
|
|
70
|
+
| (data[i + 1] << 8)
|
|
71
|
+
| (data[i + 2]);
|
|
72
|
+
if (uint32 === 0x00000001 || uint24 === 0x000001) {
|
|
73
|
+
return i;
|
|
74
|
+
} else {
|
|
75
|
+
i++;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
public readNextNaluPayload(): H265NaluPayload | null {
|
|
81
|
+
let data = this.data_;
|
|
82
|
+
let nalu_payload: H265NaluPayload = null;
|
|
83
|
+
|
|
84
|
+
while (nalu_payload == null) {
|
|
85
|
+
if (this.eof_flag_) {
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
// offset pointed to start code
|
|
89
|
+
let startcode_offset = this.current_startcode_offset_;
|
|
90
|
+
|
|
91
|
+
// nalu payload start offset
|
|
92
|
+
let offset = startcode_offset;
|
|
93
|
+
let u32 = (data[offset] << 24) | (data[offset + 1] << 16) | (data[offset + 2] << 8) | (data[offset + 3]);
|
|
94
|
+
if (u32 === 0x00000001) {
|
|
95
|
+
offset += 4;
|
|
96
|
+
} else {
|
|
97
|
+
offset += 3;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
let nalu_type: H265NaluType = (data[offset] >> 1) & 0x3F;
|
|
101
|
+
let forbidden_bit = (data[offset] & 0x80) >>> 7;
|
|
102
|
+
|
|
103
|
+
let next_startcode_offset = this.findNextStartCodeOffset(offset);
|
|
104
|
+
this.current_startcode_offset_ = next_startcode_offset;
|
|
105
|
+
|
|
106
|
+
if (forbidden_bit !== 0) {
|
|
107
|
+
// Log.e(this.TAG, `forbidden_bit near offset ${offset} should be 0 but has value ${forbidden_bit}`);
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
let payload_data = data.subarray(offset, next_startcode_offset);
|
|
112
|
+
|
|
113
|
+
nalu_payload = new H265NaluPayload();
|
|
114
|
+
nalu_payload.type = nalu_type;
|
|
115
|
+
nalu_payload.data = payload_data;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return nalu_payload;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export type HEVCDecoderConfigurationRecordType = {
|
|
124
|
+
configurationVersion: 1;
|
|
125
|
+
} & VPSHEVCDecoderConfigurationRecordType & SPSHEVCDecoderConfigurationRecordType & PPSHEVCDecoderConfigurationRecordType;
|
|
126
|
+
|
|
127
|
+
export type VPSHEVCDecoderConfigurationRecordType = {
|
|
128
|
+
num_temporal_layers: number;
|
|
129
|
+
temporal_id_nested: boolean;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export type SPSHEVCDecoderConfigurationRecordType = {
|
|
133
|
+
general_profile_space: number;
|
|
134
|
+
general_tier_flag: number;
|
|
135
|
+
general_level_idc: number;
|
|
136
|
+
general_profile_idc: number;
|
|
137
|
+
general_profile_compatibility_flags_1: number;
|
|
138
|
+
general_profile_compatibility_flags_2: number;
|
|
139
|
+
general_profile_compatibility_flags_3: number;
|
|
140
|
+
general_profile_compatibility_flags_4: number;
|
|
141
|
+
general_constraint_indicator_flags_1: number;
|
|
142
|
+
general_constraint_indicator_flags_2: number;
|
|
143
|
+
general_constraint_indicator_flags_3: number;
|
|
144
|
+
general_constraint_indicator_flags_4: number;
|
|
145
|
+
general_constraint_indicator_flags_5: number;
|
|
146
|
+
general_constraint_indicator_flags_6: number;
|
|
147
|
+
constant_frame_rate: number;
|
|
148
|
+
min_spatial_segmentation_idc: number;
|
|
149
|
+
chroma_format_idc: number,
|
|
150
|
+
bit_depth_luma_minus8: number,
|
|
151
|
+
bit_depth_chroma_minus8: number,
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export type PPSHEVCDecoderConfigurationRecordType = {
|
|
155
|
+
parallelismType: number;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export class HEVCDecoderConfigurationRecord {
|
|
159
|
+
|
|
160
|
+
private data: Uint8Array;
|
|
161
|
+
|
|
162
|
+
// sps, pps: require Nalu without 4 byte length-header
|
|
163
|
+
public constructor(vps: Uint8Array, sps: Uint8Array, pps: Uint8Array, detail: HEVCDecoderConfigurationRecordType) {
|
|
164
|
+
let length = 23 + (3 + 2 + vps.byteLength) + (3 + 2 + sps.byteLength) + (3 + 2 + pps.byteLength);
|
|
165
|
+
let data = this.data = new Uint8Array(length);
|
|
166
|
+
|
|
167
|
+
data[0] = 0x01; // configurationVersion
|
|
168
|
+
data[1] = ((detail.general_profile_space & 0x03) << 6) | ((detail.general_tier_flag ? 1 : 0) << 5) | ((detail.general_profile_idc & 0x1F));
|
|
169
|
+
data[2] = detail.general_profile_compatibility_flags_1;
|
|
170
|
+
data[3] = detail.general_profile_compatibility_flags_2;
|
|
171
|
+
data[4] = detail.general_profile_compatibility_flags_3;
|
|
172
|
+
data[5] = detail.general_profile_compatibility_flags_4;
|
|
173
|
+
data[6] = detail.general_constraint_indicator_flags_1;
|
|
174
|
+
data[7] = detail.general_constraint_indicator_flags_2;
|
|
175
|
+
data[8] = detail.general_constraint_indicator_flags_3;
|
|
176
|
+
data[9] = detail.general_constraint_indicator_flags_4;
|
|
177
|
+
data[10] = detail.general_constraint_indicator_flags_5;
|
|
178
|
+
data[11] = detail.general_constraint_indicator_flags_6;
|
|
179
|
+
data[12] = detail.general_level_idc;
|
|
180
|
+
data[13] = 0xF0 | ((detail.min_spatial_segmentation_idc & 0x0F00) >> 8)
|
|
181
|
+
data[14] = (detail.min_spatial_segmentation_idc & 0xFF);
|
|
182
|
+
data[15] = 0xFC | (detail.parallelismType & 0x03);
|
|
183
|
+
data[16] = 0xFC | (detail.chroma_format_idc & 0x03);
|
|
184
|
+
data[17] = 0xF8 | (detail.bit_depth_luma_minus8 & 0x07);
|
|
185
|
+
data[18] = 0xF8 | (detail.bit_depth_chroma_minus8 & 0x07);
|
|
186
|
+
data[19] = 0;
|
|
187
|
+
data[20] = 0;
|
|
188
|
+
data[21] = ((detail.constant_frame_rate & 0x03) << 6) | ((detail.num_temporal_layers & 0x07) << 3) | ((detail.temporal_id_nested ? 1 : 0) << 2) | 3;
|
|
189
|
+
data[22] = 3;
|
|
190
|
+
data[23 + 0 + 0] = 0x80 | H265NaluType.kSliceVPS;
|
|
191
|
+
data[23 + 0 + 1] = 0;
|
|
192
|
+
data[23 + 0 + 2] = 1;
|
|
193
|
+
data[23 + 0 + 3] = (vps.byteLength & 0xFF00) >> 8;
|
|
194
|
+
data[23 + 0 + 4] = (vps.byteLength & 0x00FF) >> 0;
|
|
195
|
+
data.set(vps, 23 + 0 + 5);
|
|
196
|
+
data[23 + (5 + vps.byteLength) + 0] = 0x80 | H265NaluType.kSliceSPS;
|
|
197
|
+
data[23 + (5 + vps.byteLength) + 1] = 0;
|
|
198
|
+
data[23 + (5 + vps.byteLength) + 2] = 1;
|
|
199
|
+
data[23 + (5 + vps.byteLength) + 3] = (sps.byteLength & 0xFF00) >> 8;
|
|
200
|
+
data[23 + (5 + vps.byteLength) + 4] = (sps.byteLength & 0x00FF) >> 0;
|
|
201
|
+
data.set(sps, 23 + (5 + vps.byteLength) + 5);
|
|
202
|
+
data[23 + (5 + vps.byteLength + 5 + sps.byteLength) + 0] = 0x80 | H265NaluType.kSlicePPS;
|
|
203
|
+
data[23 + (5 + vps.byteLength + 5 + sps.byteLength) + 1] = 0;
|
|
204
|
+
data[23 + (5 + vps.byteLength + 5 + sps.byteLength) + 2] = 1;
|
|
205
|
+
data[23 + (5 + vps.byteLength + 5 + sps.byteLength) + 3] = (pps.byteLength & 0xFF00) >> 8;
|
|
206
|
+
data[23 + (5 + vps.byteLength + 5 + sps.byteLength) + 4] = (pps.byteLength & 0x00FF) >> 0;
|
|
207
|
+
data.set(pps, 23 + (5 + vps.byteLength + 5 + sps.byteLength) + 5);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
public getData() {
|
|
211
|
+
return this.data;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
}
|
package/src/demux/klv.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export class KLVData {
|
|
2
|
+
pid: number;
|
|
3
|
+
stream_id: number;
|
|
4
|
+
pts?: number;
|
|
5
|
+
dts?: number;
|
|
6
|
+
access_units: AccessUnit[];
|
|
7
|
+
data: Uint8Array;
|
|
8
|
+
len: number;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
type AccessUnit = {
|
|
12
|
+
service_id: number;
|
|
13
|
+
sequence_number: number;
|
|
14
|
+
flags: number;
|
|
15
|
+
data: Uint8Array;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const klv_parse = (data: Uint8Array) => {
|
|
19
|
+
let result: AccessUnit[] = [];
|
|
20
|
+
|
|
21
|
+
let offset = 0;
|
|
22
|
+
while (offset + 5 < data.byteLength) {
|
|
23
|
+
let service_id = data[offset + 0];
|
|
24
|
+
let sequence_number = data[offset + 1];
|
|
25
|
+
let flags = data[offset + 2];
|
|
26
|
+
let au_size = (data[offset + 3] << 8) | (data[offset + 4] << 0);
|
|
27
|
+
let au_data = data.slice(offset + 5, offset + 5 + au_size);
|
|
28
|
+
|
|
29
|
+
result.push({
|
|
30
|
+
service_id,
|
|
31
|
+
sequence_number,
|
|
32
|
+
flags,
|
|
33
|
+
data: au_data
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
offset += 5 + au_size;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return result;
|
|
40
|
+
}
|
package/src/demux/mp3.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export enum MPEG4AudioObjectTypes {
|
|
2
|
+
kNull = 0,
|
|
3
|
+
kAACMain,
|
|
4
|
+
kAAC_LC, // LC-AAC
|
|
5
|
+
kAAC_SSR,
|
|
6
|
+
kAAC_LTP,
|
|
7
|
+
kAAC_SBR, // HE-AAC
|
|
8
|
+
kAAC_Scalable,
|
|
9
|
+
|
|
10
|
+
kLayer1 = 32,
|
|
11
|
+
kLayer2,
|
|
12
|
+
kLayer3, // MP3
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export enum MPEG4SamplingFrequencyIndex {
|
|
16
|
+
k96000Hz = 0,
|
|
17
|
+
k88200Hz,
|
|
18
|
+
k64000Hz,
|
|
19
|
+
k48000Hz,
|
|
20
|
+
k44100Hz,
|
|
21
|
+
k32000Hz,
|
|
22
|
+
k24000Hz,
|
|
23
|
+
k22050Hz,
|
|
24
|
+
k16000Hz,
|
|
25
|
+
k12000Hz,
|
|
26
|
+
k11025Hz,
|
|
27
|
+
k8000Hz,
|
|
28
|
+
k7350Hz,
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export const MPEG4SamplingFrequencies = [
|
|
32
|
+
96000,
|
|
33
|
+
88200,
|
|
34
|
+
64000,
|
|
35
|
+
48000,
|
|
36
|
+
44100,
|
|
37
|
+
32000,
|
|
38
|
+
24000,
|
|
39
|
+
22050,
|
|
40
|
+
16000,
|
|
41
|
+
12000,
|
|
42
|
+
11025,
|
|
43
|
+
8000,
|
|
44
|
+
7350,
|
|
45
|
+
];
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
interface ProgramToPMTPIDMap {
|
|
2
|
+
[program: number]: number;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
export class PAT {
|
|
6
|
+
version_number: number;
|
|
7
|
+
network_pid: number;
|
|
8
|
+
// program_number -> pmt_pid
|
|
9
|
+
program_pmt_pid: ProgramToPMTPIDMap = {};
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export enum StreamType {
|
|
13
|
+
kMPEG1Audio = 0x03,
|
|
14
|
+
kMPEG2Audio = 0x04,
|
|
15
|
+
kPESPrivateData = 0x06,
|
|
16
|
+
kADTSAAC = 0x0F,
|
|
17
|
+
kLOASAAC = 0x11,
|
|
18
|
+
kAC3 = 0x81,
|
|
19
|
+
kEAC3 = 0x87,
|
|
20
|
+
kMetadata = 0x15,
|
|
21
|
+
kSCTE35 = 0x86,
|
|
22
|
+
kPGS = 0x90,
|
|
23
|
+
kH264 = 0x1b,
|
|
24
|
+
kH265 = 0x24
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
interface PIDToStreamTypeMap {
|
|
28
|
+
[pid: number]: StreamType;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export class PMT {
|
|
32
|
+
program_number: number;
|
|
33
|
+
version_number: number;
|
|
34
|
+
pcr_pid: number;
|
|
35
|
+
// pid -> stream_type
|
|
36
|
+
pid_stream_type: PIDToStreamTypeMap = {};
|
|
37
|
+
|
|
38
|
+
common_pids: {
|
|
39
|
+
h264: number | undefined,
|
|
40
|
+
h265: number | undefined,
|
|
41
|
+
av1: number | undefined,
|
|
42
|
+
adts_aac: number | undefined,
|
|
43
|
+
loas_aac: number | undefined,
|
|
44
|
+
opus: number | undefined,
|
|
45
|
+
ac3: number | undefined,
|
|
46
|
+
eac3: number | undefined,
|
|
47
|
+
mp3: number | undefined
|
|
48
|
+
} = {
|
|
49
|
+
h264: undefined,
|
|
50
|
+
h265: undefined,
|
|
51
|
+
av1: undefined,
|
|
52
|
+
adts_aac: undefined,
|
|
53
|
+
loas_aac: undefined,
|
|
54
|
+
opus: undefined,
|
|
55
|
+
ac3: undefined,
|
|
56
|
+
eac3: undefined,
|
|
57
|
+
mp3: undefined
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
pes_private_data_pids: {
|
|
61
|
+
[pid: number]: boolean
|
|
62
|
+
} = {};
|
|
63
|
+
|
|
64
|
+
timed_id3_pids: {
|
|
65
|
+
[pid: number]: boolean
|
|
66
|
+
} = {};
|
|
67
|
+
|
|
68
|
+
pgs_pids: {
|
|
69
|
+
[pid: number]: boolean;
|
|
70
|
+
} = {};
|
|
71
|
+
pgs_langs: {
|
|
72
|
+
[pid: number]: string;
|
|
73
|
+
} = {};
|
|
74
|
+
|
|
75
|
+
synchronous_klv_pids: {
|
|
76
|
+
[pid: number]: boolean
|
|
77
|
+
} = {};
|
|
78
|
+
|
|
79
|
+
asynchronous_klv_pids: {
|
|
80
|
+
[pid: number]: boolean
|
|
81
|
+
} = {};
|
|
82
|
+
|
|
83
|
+
scte_35_pids: {
|
|
84
|
+
[pid: number]: boolean
|
|
85
|
+
} = {};
|
|
86
|
+
|
|
87
|
+
smpte2038_pids: {
|
|
88
|
+
[oid: number]: boolean
|
|
89
|
+
} = {};
|
|
90
|
+
|
|
91
|
+
// All discovered audio streams (including secondary/alternate languages).
|
|
92
|
+
// Each entry: { pid, codec, lang? }
|
|
93
|
+
all_audio_pids: Array<{pid: number, codec: string, lang?: string}> = [];
|
|
94
|
+
|
|
95
|
+
// All subtitle/teletext streams discovered in the PMT.
|
|
96
|
+
// Each entry: { pid, type: 'pgs'|'timed_id3'|'teletext', lang? }
|
|
97
|
+
subtitle_pids: Array<{pid: number, type: string, lang?: string}> = [];
|
|
98
|
+
|
|
99
|
+
// Tracks which sections of this version have been parsed
|
|
100
|
+
parsed_sections: {[section_number: number]: boolean} = {};
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export interface ProgramToPMTMap {
|
|
104
|
+
[program: number]: PMT;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export class PESData {
|
|
108
|
+
pid: number;
|
|
109
|
+
data: Uint8Array;
|
|
110
|
+
stream_type: StreamType;
|
|
111
|
+
file_position: number;
|
|
112
|
+
random_access_indicator: number;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export class SectionData {
|
|
116
|
+
pid: number;
|
|
117
|
+
data: Uint8Array;
|
|
118
|
+
file_position: number;
|
|
119
|
+
random_access_indicator: number;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export class SliceQueue {
|
|
123
|
+
slices: Uint8Array[] = [];
|
|
124
|
+
total_length: number = 0;
|
|
125
|
+
expected_length: number = 0;
|
|
126
|
+
file_position: number = 0;
|
|
127
|
+
random_access_indicator: 0;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export interface PIDToSliceQueues {
|
|
131
|
+
[pid: number]: SliceQueue;
|
|
132
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// ISO/IEC 13818-1 PES packets containing private data (stream_type=0x06)
|
|
2
|
+
export class PESPrivateData {
|
|
3
|
+
pid: number;
|
|
4
|
+
stream_id: number;
|
|
5
|
+
pts?: number;
|
|
6
|
+
dts?: number;
|
|
7
|
+
nearest_pts?: number;
|
|
8
|
+
data: Uint8Array;
|
|
9
|
+
len: number;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export class PESPrivateDataDescriptor {
|
|
13
|
+
pid: number;
|
|
14
|
+
stream_type: number;
|
|
15
|
+
descriptor: Uint8Array;
|
|
16
|
+
}
|