@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,250 @@
|
|
|
1
|
+
export type SCTE35Data = {
|
|
2
|
+
splice_command_type: SCTE35CommandType.kSpliceInsert;
|
|
3
|
+
pts?: number;
|
|
4
|
+
nearest_pts?: number;
|
|
5
|
+
auto_return?: boolean;
|
|
6
|
+
duraiton?: number;
|
|
7
|
+
detail: SCTE35Detail;
|
|
8
|
+
data: Uint8Array;
|
|
9
|
+
} | {
|
|
10
|
+
splice_command_type: SCTE35CommandType.kTimeSignal;
|
|
11
|
+
pts?: number;
|
|
12
|
+
nearest_pts?: number;
|
|
13
|
+
detail: SCTE35Detail;
|
|
14
|
+
data: Uint8Array;
|
|
15
|
+
} | {
|
|
16
|
+
splice_command_type: SCTE35CommandType.kSpliceNull | SCTE35CommandType.kBandwidthReservation | SCTE35CommandType.kSpliceSchedule | SCTE35CommandType.kPrivateCommand;
|
|
17
|
+
pts: undefined;
|
|
18
|
+
nearest_pts?: number;
|
|
19
|
+
detail: SCTE35Detail;
|
|
20
|
+
data: Uint8Array;
|
|
21
|
+
};
|
|
22
|
+
type SCTE35Detail = {
|
|
23
|
+
table_id: number;
|
|
24
|
+
section_syntax_indicator: boolean;
|
|
25
|
+
private_indicator: boolean;
|
|
26
|
+
section_length: number;
|
|
27
|
+
protocol_version: number;
|
|
28
|
+
encrypted_packet: boolean;
|
|
29
|
+
encryption_algorithm: number;
|
|
30
|
+
pts_adjustment: number;
|
|
31
|
+
cw_index: number;
|
|
32
|
+
tier: number;
|
|
33
|
+
splice_command_length: number;
|
|
34
|
+
splice_command_type: SCTE35CommandType.kSpliceNull;
|
|
35
|
+
splice_command: SpliceNull;
|
|
36
|
+
descriptor_loop_length: number;
|
|
37
|
+
splice_descriptors: SpliceDescriptor[];
|
|
38
|
+
E_CRC32?: number;
|
|
39
|
+
CRC32: number;
|
|
40
|
+
} | {
|
|
41
|
+
table_id: number;
|
|
42
|
+
section_syntax_indicator: boolean;
|
|
43
|
+
private_indicator: boolean;
|
|
44
|
+
section_length: number;
|
|
45
|
+
protocol_version: number;
|
|
46
|
+
encrypted_packet: boolean;
|
|
47
|
+
encryption_algorithm: number;
|
|
48
|
+
pts_adjustment: number;
|
|
49
|
+
cw_index: number;
|
|
50
|
+
tier: number;
|
|
51
|
+
splice_command_length: number;
|
|
52
|
+
splice_command_type: SCTE35CommandType.kSpliceSchedule;
|
|
53
|
+
splice_command: SpliceSchedule;
|
|
54
|
+
descriptor_loop_length: number;
|
|
55
|
+
splice_descriptors: SpliceDescriptor[];
|
|
56
|
+
E_CRC32?: number;
|
|
57
|
+
CRC32: number;
|
|
58
|
+
} | {
|
|
59
|
+
table_id: number;
|
|
60
|
+
section_syntax_indicator: boolean;
|
|
61
|
+
private_indicator: boolean;
|
|
62
|
+
section_length: number;
|
|
63
|
+
protocol_version: number;
|
|
64
|
+
encrypted_packet: boolean;
|
|
65
|
+
encryption_algorithm: number;
|
|
66
|
+
pts_adjustment: number;
|
|
67
|
+
cw_index: number;
|
|
68
|
+
tier: number;
|
|
69
|
+
splice_command_length: number;
|
|
70
|
+
splice_command_type: SCTE35CommandType.kSpliceInsert;
|
|
71
|
+
splice_command: SpliceInsert;
|
|
72
|
+
descriptor_loop_length: number;
|
|
73
|
+
splice_descriptors: SpliceDescriptor[];
|
|
74
|
+
E_CRC32?: number;
|
|
75
|
+
CRC32: number;
|
|
76
|
+
} | {
|
|
77
|
+
table_id: number;
|
|
78
|
+
section_syntax_indicator: boolean;
|
|
79
|
+
private_indicator: boolean;
|
|
80
|
+
section_length: number;
|
|
81
|
+
protocol_version: number;
|
|
82
|
+
encrypted_packet: boolean;
|
|
83
|
+
encryption_algorithm: number;
|
|
84
|
+
pts_adjustment: number;
|
|
85
|
+
cw_index: number;
|
|
86
|
+
tier: number;
|
|
87
|
+
splice_command_length: number;
|
|
88
|
+
splice_command_type: SCTE35CommandType.kTimeSignal;
|
|
89
|
+
splice_command: TimeSignal;
|
|
90
|
+
descriptor_loop_length: number;
|
|
91
|
+
splice_descriptors: SpliceDescriptor[];
|
|
92
|
+
E_CRC32?: number;
|
|
93
|
+
CRC32: number;
|
|
94
|
+
} | {
|
|
95
|
+
table_id: number;
|
|
96
|
+
section_syntax_indicator: boolean;
|
|
97
|
+
private_indicator: boolean;
|
|
98
|
+
section_length: number;
|
|
99
|
+
protocol_version: number;
|
|
100
|
+
encrypted_packet: boolean;
|
|
101
|
+
encryption_algorithm: number;
|
|
102
|
+
pts_adjustment: number;
|
|
103
|
+
cw_index: number;
|
|
104
|
+
tier: number;
|
|
105
|
+
splice_command_length: number;
|
|
106
|
+
splice_command_type: SCTE35CommandType.kBandwidthReservation;
|
|
107
|
+
splice_command: BandwidthReservation;
|
|
108
|
+
descriptor_loop_length: number;
|
|
109
|
+
splice_descriptors: SpliceDescriptor[];
|
|
110
|
+
E_CRC32?: number;
|
|
111
|
+
CRC32: number;
|
|
112
|
+
} | {
|
|
113
|
+
table_id: number;
|
|
114
|
+
section_syntax_indicator: boolean;
|
|
115
|
+
private_indicator: boolean;
|
|
116
|
+
section_length: number;
|
|
117
|
+
protocol_version: number;
|
|
118
|
+
encrypted_packet: boolean;
|
|
119
|
+
encryption_algorithm: number;
|
|
120
|
+
pts_adjustment: number;
|
|
121
|
+
cw_index: number;
|
|
122
|
+
tier: number;
|
|
123
|
+
splice_command_length: number;
|
|
124
|
+
splice_command_type: SCTE35CommandType.kPrivateCommand;
|
|
125
|
+
splice_command: PrivateCommand;
|
|
126
|
+
descriptor_loop_length: number;
|
|
127
|
+
splice_descriptors: SpliceDescriptor[];
|
|
128
|
+
E_CRC32?: number;
|
|
129
|
+
CRC32: number;
|
|
130
|
+
};
|
|
131
|
+
export declare enum SCTE35CommandType {
|
|
132
|
+
kSpliceNull = 0,
|
|
133
|
+
kSpliceSchedule = 4,
|
|
134
|
+
kSpliceInsert = 5,
|
|
135
|
+
kTimeSignal = 6,
|
|
136
|
+
kBandwidthReservation = 7,
|
|
137
|
+
kPrivateCommand = 255
|
|
138
|
+
}
|
|
139
|
+
type SpliceTime = {
|
|
140
|
+
time_specified_flag: boolean;
|
|
141
|
+
pts_time?: number;
|
|
142
|
+
};
|
|
143
|
+
type BreakDuration = {
|
|
144
|
+
auto_return: boolean;
|
|
145
|
+
duration: number;
|
|
146
|
+
};
|
|
147
|
+
type SpliceInsertComponent = {
|
|
148
|
+
component_tag: number;
|
|
149
|
+
splice_time?: SpliceTime;
|
|
150
|
+
};
|
|
151
|
+
type SpliceScheduleEventComponent = {
|
|
152
|
+
component_tag: number;
|
|
153
|
+
utc_splice_time: number;
|
|
154
|
+
};
|
|
155
|
+
type SpliceScheduleEvent = {
|
|
156
|
+
splice_event_id: number;
|
|
157
|
+
splice_event_cancel_indicator: boolean;
|
|
158
|
+
out_of_network_indicator?: boolean;
|
|
159
|
+
program_splice_flag?: boolean;
|
|
160
|
+
duration_flag?: boolean;
|
|
161
|
+
utc_splice_time?: number;
|
|
162
|
+
component_count?: number;
|
|
163
|
+
components?: SpliceScheduleEventComponent[];
|
|
164
|
+
break_duration?: BreakDuration;
|
|
165
|
+
unique_program_id?: number;
|
|
166
|
+
avail_num?: number;
|
|
167
|
+
avails_expected?: number;
|
|
168
|
+
};
|
|
169
|
+
type SpliceNull = {};
|
|
170
|
+
type SpliceSchedule = {
|
|
171
|
+
splice_count: number;
|
|
172
|
+
events: SpliceScheduleEvent[];
|
|
173
|
+
};
|
|
174
|
+
type SpliceInsert = {
|
|
175
|
+
splice_event_id: number;
|
|
176
|
+
splice_event_cancel_indicator: boolean;
|
|
177
|
+
out_of_network_indicator?: boolean;
|
|
178
|
+
program_splice_flag?: boolean;
|
|
179
|
+
duration_flag?: boolean;
|
|
180
|
+
splice_immediate_flag?: boolean;
|
|
181
|
+
splice_time?: SpliceTime;
|
|
182
|
+
component_count?: number;
|
|
183
|
+
components?: SpliceInsertComponent[];
|
|
184
|
+
break_duration?: BreakDuration;
|
|
185
|
+
unique_program_id?: number;
|
|
186
|
+
avail_num?: number;
|
|
187
|
+
avails_expected?: number;
|
|
188
|
+
};
|
|
189
|
+
type TimeSignal = {
|
|
190
|
+
splice_time: SpliceTime;
|
|
191
|
+
};
|
|
192
|
+
type BandwidthReservation = {};
|
|
193
|
+
type PrivateCommand = {
|
|
194
|
+
identifier: string;
|
|
195
|
+
private_data: ArrayBuffer;
|
|
196
|
+
};
|
|
197
|
+
type Descriptor = {
|
|
198
|
+
descriptor_tag: number;
|
|
199
|
+
descriptor_length: number;
|
|
200
|
+
identifier: string;
|
|
201
|
+
};
|
|
202
|
+
type AvailDescriptor = Descriptor & {
|
|
203
|
+
provider_avail_id: number;
|
|
204
|
+
};
|
|
205
|
+
type DTMFDescriptor = Descriptor & {
|
|
206
|
+
preroll: number;
|
|
207
|
+
dtmf_count: number;
|
|
208
|
+
DTMF_char: string;
|
|
209
|
+
};
|
|
210
|
+
type SegmentationDescriptor = Descriptor & {
|
|
211
|
+
segmentation_event_id: number;
|
|
212
|
+
segmentation_event_cancel_indicator: boolean;
|
|
213
|
+
program_segmentation_flag?: boolean;
|
|
214
|
+
segmentation_duration_flag?: boolean;
|
|
215
|
+
delivery_not_restricted_flag?: boolean;
|
|
216
|
+
web_delivery_allowed_flag?: boolean;
|
|
217
|
+
no_regional_blackout_flag?: boolean;
|
|
218
|
+
archive_allowed_flag?: boolean;
|
|
219
|
+
device_restrictions?: number;
|
|
220
|
+
component_count?: number;
|
|
221
|
+
components?: any[];
|
|
222
|
+
segmentation_duration?: number;
|
|
223
|
+
segmentation_upid_type?: number;
|
|
224
|
+
segmentation_upid_length?: number;
|
|
225
|
+
segmentation_upid?: ArrayBuffer;
|
|
226
|
+
segmentation_type_id?: number;
|
|
227
|
+
segment_num?: number;
|
|
228
|
+
segments_expected?: number;
|
|
229
|
+
sub_segment_num?: number;
|
|
230
|
+
sub_segments_expected?: number;
|
|
231
|
+
};
|
|
232
|
+
type TimeDescriptor = Descriptor & {
|
|
233
|
+
TAI_seconds: number;
|
|
234
|
+
TAI_ns: number;
|
|
235
|
+
UTC_offset: number;
|
|
236
|
+
};
|
|
237
|
+
type AudioDescriptorComponent = {
|
|
238
|
+
component_tag: number;
|
|
239
|
+
ISO_code: string;
|
|
240
|
+
Bit_Stream_Mode: number;
|
|
241
|
+
Num_Channels: number;
|
|
242
|
+
Full_Srvc_Audio: boolean;
|
|
243
|
+
};
|
|
244
|
+
type AudioDescriptor = Descriptor & {
|
|
245
|
+
audio_count: number;
|
|
246
|
+
components: AudioDescriptorComponent[];
|
|
247
|
+
};
|
|
248
|
+
type SpliceDescriptor = AvailDescriptor | DTMFDescriptor | SegmentationDescriptor | TimeDescriptor | AudioDescriptor;
|
|
249
|
+
export declare const readSCTE35: (data: Uint8Array) => SCTE35Data;
|
|
250
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export declare class SMPTE2038Data {
|
|
2
|
+
pid: number;
|
|
3
|
+
stream_id: number;
|
|
4
|
+
pts?: number;
|
|
5
|
+
dts?: number;
|
|
6
|
+
nearest_pts?: number;
|
|
7
|
+
ancillaries: AncillaryData[];
|
|
8
|
+
data: Uint8Array;
|
|
9
|
+
len: number;
|
|
10
|
+
}
|
|
11
|
+
type AncillaryData = {
|
|
12
|
+
yc_indicator: boolean;
|
|
13
|
+
line_number: number;
|
|
14
|
+
horizontal_offset: number;
|
|
15
|
+
did: number;
|
|
16
|
+
sdid: number;
|
|
17
|
+
user_data: Uint8Array;
|
|
18
|
+
description: string;
|
|
19
|
+
information: any;
|
|
20
|
+
};
|
|
21
|
+
export declare const smpte2038parse: (data: Uint8Array) => AncillaryData[];
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import BaseDemuxer from './base-demuxer';
|
|
2
|
+
declare class TSDemuxer extends BaseDemuxer {
|
|
3
|
+
private readonly TAG;
|
|
4
|
+
private config_;
|
|
5
|
+
private ts_packet_size_;
|
|
6
|
+
private sync_offset_;
|
|
7
|
+
private first_parse_;
|
|
8
|
+
private media_info_;
|
|
9
|
+
private timescale_;
|
|
10
|
+
private duration_;
|
|
11
|
+
private pat_;
|
|
12
|
+
private current_program_;
|
|
13
|
+
private current_pmt_pid_;
|
|
14
|
+
private pmt_;
|
|
15
|
+
private program_pmt_map_;
|
|
16
|
+
private pes_slice_queues_;
|
|
17
|
+
private section_slice_queues_;
|
|
18
|
+
private video_metadata_;
|
|
19
|
+
private audio_metadata_;
|
|
20
|
+
private last_pcr_;
|
|
21
|
+
private last_pcr_base_;
|
|
22
|
+
private timestamp_offset_;
|
|
23
|
+
private audio_last_sample_pts_;
|
|
24
|
+
private aac_last_incomplete_data_;
|
|
25
|
+
private has_video_;
|
|
26
|
+
private has_audio_;
|
|
27
|
+
private video_init_segment_dispatched_;
|
|
28
|
+
private audio_init_segment_dispatched_;
|
|
29
|
+
private video_metadata_changed_;
|
|
30
|
+
private audio_metadata_changed_;
|
|
31
|
+
private video_keyframe_seen_after_init_;
|
|
32
|
+
private stashed_audio_before_video_init_;
|
|
33
|
+
private _last_dispatch_block_reason_;
|
|
34
|
+
private video_init_dispatch_time_;
|
|
35
|
+
private active_audio_pid_;
|
|
36
|
+
private loas_previous_frame;
|
|
37
|
+
private video_track_;
|
|
38
|
+
private audio_track_;
|
|
39
|
+
constructor(probe_data: any, config: any);
|
|
40
|
+
destroy(): void;
|
|
41
|
+
static probe(buffer: ArrayBuffer): {
|
|
42
|
+
needMoreData: boolean;
|
|
43
|
+
match?: undefined;
|
|
44
|
+
consumed?: undefined;
|
|
45
|
+
ts_packet_size?: undefined;
|
|
46
|
+
sync_offset?: undefined;
|
|
47
|
+
} | {
|
|
48
|
+
match: boolean;
|
|
49
|
+
needMoreData?: undefined;
|
|
50
|
+
consumed?: undefined;
|
|
51
|
+
ts_packet_size?: undefined;
|
|
52
|
+
sync_offset?: undefined;
|
|
53
|
+
} | {
|
|
54
|
+
match: boolean;
|
|
55
|
+
consumed: number;
|
|
56
|
+
ts_packet_size: number;
|
|
57
|
+
sync_offset: number;
|
|
58
|
+
needMoreData?: undefined;
|
|
59
|
+
};
|
|
60
|
+
bindDataSource(loader: any): this;
|
|
61
|
+
resetMediaInfo(): void;
|
|
62
|
+
/**
|
|
63
|
+
* Switch to a different audio PID discovered in the PMT.
|
|
64
|
+
* Call with a pid from onTracksUpdated audioTracks, or 0 to revert to default.
|
|
65
|
+
* Resets audio init state so the new stream is initialised cleanly.
|
|
66
|
+
*/
|
|
67
|
+
selectAudioPid(pid: number): void;
|
|
68
|
+
/** Store a PID preference before PMT arrives — applied by auto-fallback on first parse. */
|
|
69
|
+
setPreferredAudioPid(pid: number): void;
|
|
70
|
+
/** Returns the current PMT track lists (same data as onTracksUpdated). */
|
|
71
|
+
getAvailableTracks(): {
|
|
72
|
+
audioTracks: {
|
|
73
|
+
pid: number;
|
|
74
|
+
codec: string;
|
|
75
|
+
lang?: string;
|
|
76
|
+
}[];
|
|
77
|
+
subtitleTracks: {
|
|
78
|
+
pid: number;
|
|
79
|
+
type: string;
|
|
80
|
+
lang?: string;
|
|
81
|
+
}[];
|
|
82
|
+
};
|
|
83
|
+
parseChunks(chunk: ArrayBuffer, byte_start: number): number;
|
|
84
|
+
private handleSectionSlice;
|
|
85
|
+
private handlePESSlice;
|
|
86
|
+
private emitSectionSlices;
|
|
87
|
+
private emitPESSlices;
|
|
88
|
+
private clearSlices;
|
|
89
|
+
private parseSection;
|
|
90
|
+
private parsePES;
|
|
91
|
+
private parsePAT;
|
|
92
|
+
private parsePMT;
|
|
93
|
+
private parseSCTE35;
|
|
94
|
+
private parseAV1Payload;
|
|
95
|
+
private parseH264Payload;
|
|
96
|
+
private parseH265Payload;
|
|
97
|
+
private detectVideoMetadataChange;
|
|
98
|
+
private isInitSegmentDispatched;
|
|
99
|
+
private dispatchVideoInitSegment;
|
|
100
|
+
private dispatchVideoMediaSegment;
|
|
101
|
+
private dispatchAudioMediaSegment;
|
|
102
|
+
private stashAudioBeforeVideoInit;
|
|
103
|
+
private dispatchAudioVideoMediaSegment;
|
|
104
|
+
private parseADTSAACPayload;
|
|
105
|
+
private parseLOASAACPayload;
|
|
106
|
+
private parseAC3Payload;
|
|
107
|
+
private parseEAC3Payload;
|
|
108
|
+
private parseOpusPayload;
|
|
109
|
+
private parseMP3Payload;
|
|
110
|
+
private detectAudioMetadataChange;
|
|
111
|
+
private dispatchAudioInitSegment;
|
|
112
|
+
private dispatchPESPrivateDataDescriptor;
|
|
113
|
+
private parsePESPrivateDataPayload;
|
|
114
|
+
private parseTimedID3MetadataPayload;
|
|
115
|
+
private parsePGSPayload;
|
|
116
|
+
private parseSynchronousKLVMetadataPayload;
|
|
117
|
+
private parseAsynchronousKLVMetadataPayload;
|
|
118
|
+
private parseSMPTE2038MetadataPayload;
|
|
119
|
+
private parseSEIPayload;
|
|
120
|
+
private getNearestTimestampMilliseconds;
|
|
121
|
+
private getPcrBase;
|
|
122
|
+
private getTimestamp;
|
|
123
|
+
}
|
|
124
|
+
export default TSDemuxer;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
declare class LiveLatencyChaser {
|
|
2
|
+
private _config;
|
|
3
|
+
private _media_element;
|
|
4
|
+
private _on_direct_seek;
|
|
5
|
+
constructor(config: any, media_element: HTMLMediaElement, on_direct_seek: (target: number) => void);
|
|
6
|
+
destroy(): void;
|
|
7
|
+
notifyBufferedRangeUpdate(): void;
|
|
8
|
+
private _chaseLiveLatency;
|
|
9
|
+
}
|
|
10
|
+
export default LiveLatencyChaser;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
declare class LiveLatencySynchronizer {
|
|
2
|
+
private _config;
|
|
3
|
+
private _media_element;
|
|
4
|
+
private e?;
|
|
5
|
+
constructor(config: any, media_element: HTMLMediaElement);
|
|
6
|
+
destroy(): void;
|
|
7
|
+
private _onMediaTimeUpdate;
|
|
8
|
+
private _getCurrentLatency;
|
|
9
|
+
}
|
|
10
|
+
export default LiveLatencySynchronizer;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
declare class LoadingController {
|
|
2
|
+
private readonly TAG;
|
|
3
|
+
private _config;
|
|
4
|
+
private _media_element;
|
|
5
|
+
private _on_pause_transmuxer;
|
|
6
|
+
private _on_resume_transmuxer;
|
|
7
|
+
private _paused;
|
|
8
|
+
private e?;
|
|
9
|
+
constructor(config: any, media_element: HTMLMediaElement, on_pause_transmuxer: () => void, on_resume_transmuxer: () => void);
|
|
10
|
+
destroy(): void;
|
|
11
|
+
notifyBufferedPositionChanged(buffered_position?: number): void;
|
|
12
|
+
private _onMediaTimeUpdate;
|
|
13
|
+
private _suspendTransmuxerIfNeeded;
|
|
14
|
+
private _suspendTransmuxerIfBufferedPositionExceeded;
|
|
15
|
+
suspendTransmuxer(): void;
|
|
16
|
+
private _resumeTransmuxerIfNeeded;
|
|
17
|
+
resumeTransmuxer(): void;
|
|
18
|
+
}
|
|
19
|
+
export default LoadingController;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import MediaInfo from '../core/media-info';
|
|
2
|
+
declare class MSEPlayer {
|
|
3
|
+
private readonly TAG;
|
|
4
|
+
private _type;
|
|
5
|
+
private _media_element;
|
|
6
|
+
private _player_engine;
|
|
7
|
+
constructor(mediaDataSource: any, config?: any);
|
|
8
|
+
destroy(): void;
|
|
9
|
+
on(event: string, listener: (...args: any[]) => void): void;
|
|
10
|
+
off(event: string, listener: (...args: any[]) => void): void;
|
|
11
|
+
attachMediaElement(mediaElement: HTMLMediaElement): void;
|
|
12
|
+
detachMediaElement(): void;
|
|
13
|
+
load(): void;
|
|
14
|
+
unload(): void;
|
|
15
|
+
play(): Promise<void>;
|
|
16
|
+
pause(): void;
|
|
17
|
+
get type(): string;
|
|
18
|
+
get buffered(): TimeRanges;
|
|
19
|
+
get duration(): number;
|
|
20
|
+
get volume(): number;
|
|
21
|
+
set volume(value: number);
|
|
22
|
+
get muted(): boolean;
|
|
23
|
+
set muted(muted: boolean);
|
|
24
|
+
get currentTime(): number;
|
|
25
|
+
set currentTime(seconds: number);
|
|
26
|
+
get mediaInfo(): MediaInfo;
|
|
27
|
+
get statisticsInfo(): any;
|
|
28
|
+
switchAudioPid(pid: number): void;
|
|
29
|
+
}
|
|
30
|
+
export default MSEPlayer;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type PlayerEngine from './player-engine';
|
|
2
|
+
import MediaInfo from '../core/media-info';
|
|
3
|
+
declare class PlayerEngineDedicatedThread implements PlayerEngine {
|
|
4
|
+
private readonly TAG;
|
|
5
|
+
private _emitter;
|
|
6
|
+
private _media_data_source;
|
|
7
|
+
private _config;
|
|
8
|
+
private _media_element?;
|
|
9
|
+
private _worker;
|
|
10
|
+
private _worker_destroying;
|
|
11
|
+
private _seeking_handler?;
|
|
12
|
+
private _loading_controller?;
|
|
13
|
+
private _startup_stall_jumper?;
|
|
14
|
+
private _live_latency_chaser?;
|
|
15
|
+
private _live_latency_synchronizer?;
|
|
16
|
+
private _pending_seek_time?;
|
|
17
|
+
private _media_info?;
|
|
18
|
+
private _statistics_info?;
|
|
19
|
+
private e?;
|
|
20
|
+
static isSupported(): boolean;
|
|
21
|
+
constructor(mediaDataSource: any, config: any);
|
|
22
|
+
destroy(): void;
|
|
23
|
+
on(event: string, listener: (...args: any[]) => void): void;
|
|
24
|
+
off(event: string, listener: (...args: any[]) => void): void;
|
|
25
|
+
attachMediaElement(mediaElement: HTMLMediaElement): void;
|
|
26
|
+
detachMediaElement(): void;
|
|
27
|
+
load(): void;
|
|
28
|
+
unload(): void;
|
|
29
|
+
play(): Promise<void>;
|
|
30
|
+
pause(): void;
|
|
31
|
+
seek(seconds: number): void;
|
|
32
|
+
get mediaInfo(): MediaInfo;
|
|
33
|
+
get statisticsInfo(): any;
|
|
34
|
+
_onLoggingConfigChanged(config: any): void;
|
|
35
|
+
private _onMSEUpdateEnd;
|
|
36
|
+
private _onMSEBufferFull;
|
|
37
|
+
private _onMediaLoadedMetadata;
|
|
38
|
+
private _onRequestDirectSeek;
|
|
39
|
+
private _onRequiredUnbufferedSeek;
|
|
40
|
+
private _onRequestPauseTransmuxer;
|
|
41
|
+
private _onRequestResumeTransmuxer;
|
|
42
|
+
private _onMediaTimeUpdate;
|
|
43
|
+
private _onMediaReadyStateChange;
|
|
44
|
+
private _onWorkerMessage;
|
|
45
|
+
private _fillStatisticsInfo;
|
|
46
|
+
switchAudioPid(pid: number): void;
|
|
47
|
+
}
|
|
48
|
+
export default PlayerEngineDedicatedThread;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type PlayerEngine from './player-engine';
|
|
2
|
+
import MediaInfo from '../core/media-info';
|
|
3
|
+
declare class PlayerEngineMainThread implements PlayerEngine {
|
|
4
|
+
private readonly TAG;
|
|
5
|
+
private _emitter;
|
|
6
|
+
private _media_data_source;
|
|
7
|
+
private _config;
|
|
8
|
+
private _media_element?;
|
|
9
|
+
private _mse_controller?;
|
|
10
|
+
private _transmuxer?;
|
|
11
|
+
private _pending_seek_time?;
|
|
12
|
+
private _seeking_handler?;
|
|
13
|
+
private _loading_controller?;
|
|
14
|
+
private _startup_stall_jumper?;
|
|
15
|
+
private _live_latency_chaser?;
|
|
16
|
+
private _live_latency_synchronizer?;
|
|
17
|
+
private _mse_source_opened;
|
|
18
|
+
private _has_pending_load;
|
|
19
|
+
private _loaded_metadata_received;
|
|
20
|
+
private _media_info?;
|
|
21
|
+
private _statistics_info?;
|
|
22
|
+
private e?;
|
|
23
|
+
constructor(mediaDataSource: any, config: any);
|
|
24
|
+
destroy(): void;
|
|
25
|
+
on(event: string, listener: (...args: any[]) => void): void;
|
|
26
|
+
off(event: string, listener: (...args: any[]) => void): void;
|
|
27
|
+
attachMediaElement(mediaElement: HTMLMediaElement): void;
|
|
28
|
+
detachMediaElement(): void;
|
|
29
|
+
load(): void;
|
|
30
|
+
unload(): void;
|
|
31
|
+
play(): Promise<void>;
|
|
32
|
+
pause(): void;
|
|
33
|
+
seek(seconds: number): void;
|
|
34
|
+
get mediaInfo(): MediaInfo;
|
|
35
|
+
get statisticsInfo(): any;
|
|
36
|
+
private _onMSESourceOpen;
|
|
37
|
+
private _onMSEUpdateEnd;
|
|
38
|
+
private _onMSEBufferFull;
|
|
39
|
+
private _onMSEError;
|
|
40
|
+
private _onMSEStartStreaming;
|
|
41
|
+
private _onMSEEndStreaming;
|
|
42
|
+
private _onMediaLoadedMetadata;
|
|
43
|
+
private _onRequestDirectSeek;
|
|
44
|
+
private _onRequiredUnbufferedSeek;
|
|
45
|
+
private _onRequestPauseTransmuxer;
|
|
46
|
+
private _onRequestResumeTransmuxer;
|
|
47
|
+
private _fillStatisticsInfo;
|
|
48
|
+
switchAudioPid(pid: number): void;
|
|
49
|
+
}
|
|
50
|
+
export default PlayerEngineMainThread;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type WorkerCommandOp = 'logging_config' | 'init' | 'destroy' | 'initialize_mse' | 'shutdown_mse' | 'load' | 'unload' | 'unbuffered_seek' | 'timeupdate' | 'readystatechange' | 'pause_transmuxer' | 'resume_transmuxer' | 'switch_audio_pid';
|
|
2
|
+
export type WorkerCommandPacket = {
|
|
3
|
+
cmd: WorkerCommandOp;
|
|
4
|
+
};
|
|
5
|
+
export type WorkerCommandPacketInit = WorkerCommandPacket & {
|
|
6
|
+
cmd: 'init';
|
|
7
|
+
media_data_source: any;
|
|
8
|
+
config: any;
|
|
9
|
+
};
|
|
10
|
+
export type WorkerCommandPacketLoggingConfig = WorkerCommandPacket & {
|
|
11
|
+
cmd: 'logging_config';
|
|
12
|
+
logging_config: any;
|
|
13
|
+
};
|
|
14
|
+
export type WorkerCommandPacketUnbufferedSeek = WorkerCommandPacket & {
|
|
15
|
+
cmd: 'unbuffered_seek';
|
|
16
|
+
milliseconds: number;
|
|
17
|
+
};
|
|
18
|
+
export type WorkerCommandPacketTimeUpdate = WorkerCommandPacket & {
|
|
19
|
+
cmd: 'timeupdate';
|
|
20
|
+
current_time: number;
|
|
21
|
+
};
|
|
22
|
+
export type WorkerCommandPacketReadyStateChange = WorkerCommandPacket & {
|
|
23
|
+
cmd: 'readystatechange';
|
|
24
|
+
ready_state: number;
|
|
25
|
+
};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import MSEEvents from '../core/mse-events';
|
|
2
|
+
import PlayerEvents from './player-events';
|
|
3
|
+
import TransmuxingEvents from '../core/transmuxing-events';
|
|
4
|
+
export type WorkerMessageType = 'destroyed' | 'mse_init' | 'mse_event' | 'player_event' | 'transmuxing_event' | 'buffered_position_changed' | 'logcat_callback';
|
|
5
|
+
export type WorkerMessagePacket = {
|
|
6
|
+
msg: WorkerMessageType;
|
|
7
|
+
};
|
|
8
|
+
export type WorkerMessagePacketMSEInit = WorkerMessagePacket & {
|
|
9
|
+
msg: 'mse_init';
|
|
10
|
+
handle: any;
|
|
11
|
+
};
|
|
12
|
+
export type WorkerMessagePacketMSEEvent = WorkerMessagePacket & {
|
|
13
|
+
msg: 'mse_event';
|
|
14
|
+
event: MSEEvents;
|
|
15
|
+
};
|
|
16
|
+
export type WorkerMessagePacketPlayerEvent = WorkerMessagePacket & {
|
|
17
|
+
msg: 'player_event';
|
|
18
|
+
event: PlayerEvents;
|
|
19
|
+
};
|
|
20
|
+
export type WorkerMessagePacketPlayerEventError = WorkerMessagePacketPlayerEvent & {
|
|
21
|
+
msg: 'player_event';
|
|
22
|
+
event: PlayerEvents.ERROR;
|
|
23
|
+
error_type: string;
|
|
24
|
+
error_detail: string;
|
|
25
|
+
info: any;
|
|
26
|
+
};
|
|
27
|
+
export type WorkerMessagePacketPlayerEventExtraData = WorkerMessagePacketPlayerEvent & {
|
|
28
|
+
msg: 'player_event';
|
|
29
|
+
event: PlayerEvents.METADATA_ARRIVED | PlayerEvents.SCRIPTDATA_ARRIVED | PlayerEvents.TIMED_ID3_METADATA_ARRIVED | PlayerEvents.PGS_SUBTITLE_ARRIVED | PlayerEvents.SYNCHRONOUS_KLV_METADATA_ARRIVED | PlayerEvents.ASYNCHRONOUS_KLV_METADATA_ARRIVED | PlayerEvents.SMPTE2038_METADATA_ARRIVED | PlayerEvents.SEI_ARRIVED | PlayerEvents.SCTE35_METADATA_ARRIVED | PlayerEvents.PES_PRIVATE_DATA_DESCRIPTOR | PlayerEvents.PES_PRIVATE_DATA_ARRIVED;
|
|
30
|
+
extraData: any;
|
|
31
|
+
};
|
|
32
|
+
export type WorkerMessagePacketTransmuxingEvent = WorkerMessagePacket & {
|
|
33
|
+
msg: 'transmuxing_event';
|
|
34
|
+
event: TransmuxingEvents;
|
|
35
|
+
};
|
|
36
|
+
export type WorkerMessagePacketTransmuxingEventInfo = WorkerMessagePacketTransmuxingEvent & {
|
|
37
|
+
msg: 'transmuxing_event';
|
|
38
|
+
event: TransmuxingEvents.MEDIA_INFO | TransmuxingEvents.STATISTICS_INFO;
|
|
39
|
+
info: any;
|
|
40
|
+
};
|
|
41
|
+
export type WorkerMessagePacketTransmuxingEventRecommendSeekpoint = WorkerMessagePacketTransmuxingEvent & {
|
|
42
|
+
msg: 'transmuxing_event';
|
|
43
|
+
event: TransmuxingEvents.RECOMMEND_SEEKPOINT;
|
|
44
|
+
milliseconds: number;
|
|
45
|
+
};
|
|
46
|
+
export type WorkerMessagePacketBufferedPositionChanged = WorkerMessagePacket & {
|
|
47
|
+
msg: 'buffered_position_changed';
|
|
48
|
+
buffered_position_milliseconds: number;
|
|
49
|
+
};
|
|
50
|
+
export type WorkerMessagePacketLogcatCallback = WorkerMessagePacket & {
|
|
51
|
+
msg: 'logcat_callback';
|
|
52
|
+
type: string;
|
|
53
|
+
logcat: string;
|
|
54
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type MediaInfo from "../core/media-info";
|
|
2
|
+
export default interface PlayerEngine {
|
|
3
|
+
destroy(): void;
|
|
4
|
+
on(event: string, listener: (...args: any[]) => void): void;
|
|
5
|
+
off(event: string, listener: (...args: any[]) => void): void;
|
|
6
|
+
attachMediaElement(mediaElement: HTMLMediaElement): void;
|
|
7
|
+
detachMediaElement(): void;
|
|
8
|
+
load(): void;
|
|
9
|
+
unload(): void;
|
|
10
|
+
play(): Promise<void>;
|
|
11
|
+
pause(): void;
|
|
12
|
+
seek(seconds: number): void;
|
|
13
|
+
readonly mediaInfo: MediaInfo | undefined;
|
|
14
|
+
readonly statisticsInfo: any | undefined;
|
|
15
|
+
switchAudioPid(pid: number): void;
|
|
16
|
+
}
|