@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.
Files changed (121) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +158 -0
  3. package/README_ja.md +153 -0
  4. package/README_zh.md +157 -0
  5. package/d.ts/mpegts.d.ts +524 -0
  6. package/d.ts/src/core/mse-events.d.ts +9 -0
  7. package/d.ts/src/core/transmuxing-events.d.ts +24 -0
  8. package/d.ts/src/demux/aac.d.ts +44 -0
  9. package/d.ts/src/demux/ac3.d.ts +70 -0
  10. package/d.ts/src/demux/av1-parser.d.ts +77 -0
  11. package/d.ts/src/demux/av1.d.ts +11 -0
  12. package/d.ts/src/demux/base-demuxer.d.ts +55 -0
  13. package/d.ts/src/demux/h264.d.ts +40 -0
  14. package/d.ts/src/demux/h265.d.ts +65 -0
  15. package/d.ts/src/demux/klv.d.ts +17 -0
  16. package/d.ts/src/demux/mp3.d.ts +6 -0
  17. package/d.ts/src/demux/mpeg4-audio.d.ts +28 -0
  18. package/d.ts/src/demux/pat-pmt-pes.d.ts +106 -0
  19. package/d.ts/src/demux/patpmt.d.ts +40 -0
  20. package/d.ts/src/demux/pes-private-data.d.ts +14 -0
  21. package/d.ts/src/demux/pgs-data.d.ts +9 -0
  22. package/d.ts/src/demux/scte35.d.ts +250 -0
  23. package/d.ts/src/demux/sei.d.ts +8 -0
  24. package/d.ts/src/demux/smpte2038.d.ts +22 -0
  25. package/d.ts/src/demux/ts-demuxer.d.ts +124 -0
  26. package/d.ts/src/player/live-latency-chaser.d.ts +10 -0
  27. package/d.ts/src/player/live-latency-synchronizer.d.ts +10 -0
  28. package/d.ts/src/player/loading-controller.d.ts +19 -0
  29. package/d.ts/src/player/mse-player.d.ts +30 -0
  30. package/d.ts/src/player/player-engine-dedicated-thread-worker.d.ts +2 -0
  31. package/d.ts/src/player/player-engine-dedicated-thread.d.ts +48 -0
  32. package/d.ts/src/player/player-engine-main-thread.d.ts +50 -0
  33. package/d.ts/src/player/player-engine-worker-cmd-def.d.ts +25 -0
  34. package/d.ts/src/player/player-engine-worker-msg-def.d.ts +54 -0
  35. package/d.ts/src/player/player-engine-worker.d.ts +2 -0
  36. package/d.ts/src/player/player-engine.d.ts +16 -0
  37. package/d.ts/src/player/player-events.d.ts +21 -0
  38. package/d.ts/src/player/seeking-handler.d.ts +22 -0
  39. package/d.ts/src/player/startup-stall-jumper.d.ts +14 -0
  40. package/d.ts/src/utils/typedarray-equality.d.ts +2 -0
  41. package/dist/mpegts.js +3 -0
  42. package/dist/mpegts.js.LICENSE.txt +7 -0
  43. package/dist/mpegts.js.map +1 -0
  44. package/package.json +53 -0
  45. package/src/config.js +67 -0
  46. package/src/core/features.js +88 -0
  47. package/src/core/media-info.js +127 -0
  48. package/src/core/media-segment-info.js +230 -0
  49. package/src/core/mse-controller.js +599 -0
  50. package/src/core/mse-events.ts +28 -0
  51. package/src/core/transmuxer.js +346 -0
  52. package/src/core/transmuxing-controller.js +628 -0
  53. package/src/core/transmuxing-events.ts +43 -0
  54. package/src/core/transmuxing-worker.js +286 -0
  55. package/src/demux/aac.ts +397 -0
  56. package/src/demux/ac3.ts +335 -0
  57. package/src/demux/amf-parser.js +243 -0
  58. package/src/demux/av1-parser.ts +629 -0
  59. package/src/demux/av1.ts +103 -0
  60. package/src/demux/base-demuxer.ts +69 -0
  61. package/src/demux/demux-errors.js +26 -0
  62. package/src/demux/exp-golomb.js +116 -0
  63. package/src/demux/flv-demuxer.js +1854 -0
  64. package/src/demux/h264.ts +187 -0
  65. package/src/demux/h265-parser.js +501 -0
  66. package/src/demux/h265.ts +214 -0
  67. package/src/demux/klv.ts +40 -0
  68. package/src/demux/mp3.ts +7 -0
  69. package/src/demux/mpeg4-audio.ts +45 -0
  70. package/src/demux/pat-pmt-pes.ts +132 -0
  71. package/src/demux/pes-private-data.ts +16 -0
  72. package/src/demux/pgs-data.ts +11 -0
  73. package/src/demux/scte35.ts +723 -0
  74. package/src/demux/sei.ts +99 -0
  75. package/src/demux/smpte2038.ts +89 -0
  76. package/src/demux/sps-parser.js +298 -0
  77. package/src/demux/ts-demuxer.ts +2405 -0
  78. package/src/index.js +4 -0
  79. package/src/io/fetch-stream-loader.js +266 -0
  80. package/src/io/io-controller.js +647 -0
  81. package/src/io/loader.js +134 -0
  82. package/src/io/param-seek-handler.js +85 -0
  83. package/src/io/range-seek-handler.js +52 -0
  84. package/src/io/speed-sampler.js +93 -0
  85. package/src/io/websocket-loader.js +151 -0
  86. package/src/io/xhr-moz-chunked-loader.js +211 -0
  87. package/src/io/xhr-msstream-loader.js +307 -0
  88. package/src/io/xhr-range-loader.js +366 -0
  89. package/src/mpegts.js +95 -0
  90. package/src/player/live-latency-chaser.ts +66 -0
  91. package/src/player/live-latency-synchronizer.ts +79 -0
  92. package/src/player/loading-controller.ts +142 -0
  93. package/src/player/mse-player.ts +150 -0
  94. package/src/player/native-player.js +262 -0
  95. package/src/player/player-engine-dedicated-thread.ts +479 -0
  96. package/src/player/player-engine-main-thread.ts +463 -0
  97. package/src/player/player-engine-worker-cmd-def.ts +62 -0
  98. package/src/player/player-engine-worker-msg-def.ts +102 -0
  99. package/src/player/player-engine-worker.ts +370 -0
  100. package/src/player/player-engine.ts +35 -0
  101. package/src/player/player-errors.js +39 -0
  102. package/src/player/player-events.ts +40 -0
  103. package/src/player/seeking-handler.ts +205 -0
  104. package/src/player/startup-stall-jumper.ts +86 -0
  105. package/src/remux/aac-silent.js +56 -0
  106. package/src/remux/mp4-generator.js +866 -0
  107. package/src/remux/mp4-remuxer.js +778 -0
  108. package/src/utils/browser.js +128 -0
  109. package/src/utils/exception.js +73 -0
  110. package/src/utils/logger.js +140 -0
  111. package/src/utils/logging-control.js +165 -0
  112. package/src/utils/polyfill.js +68 -0
  113. package/src/utils/typedarray-equality.ts +69 -0
  114. package/src/utils/utf8-conv.js +84 -0
  115. package/src/utils/webworkify-webpack.js +202 -0
  116. package/tsconfig.json +16 -0
  117. package/tslint.json +1 -0
  118. package/types/index.d.ts +3 -0
  119. package/types/test-flv.ts +8 -0
  120. package/types/tsconfig.json +24 -0
  121. package/webpack.config.js +55 -0
@@ -0,0 +1,629 @@
1
+ /*
2
+ * Copyright (C) 2022 もにょてっく. All Rights Reserved.
3
+ *
4
+ * @author もにょ〜ん <monyone.teihen@gmail.com>
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */
18
+
19
+ import ExpGolomb from './exp-golomb.js';
20
+
21
+ type OperatingPoint = {
22
+ operating_point_idc: number,
23
+ level: number,
24
+ tier: number,
25
+ decoder_model_present_for_this_op?: boolean
26
+ };
27
+
28
+ type SequenceHeaderDetails = {
29
+ frame_id_numbers_present_flag: boolean,
30
+ additional_frame_id_length_minus_1?: number;
31
+ delta_frame_id_length_minus_2?: number;
32
+ reduced_still_picture_header: boolean;
33
+ decoder_model_info_present_flag: boolean;
34
+ operating_points_cnt_minus_1?: number;
35
+ operating_points: OperatingPoint[];
36
+ buffer_removal_time_length_minus_1: number;
37
+ equal_picture_interval: boolean;
38
+ seq_force_screen_content_tools: number;
39
+ seq_force_integer_mv: number;
40
+ enable_order_hint: boolean;
41
+ order_hint_bits: number;
42
+ enable_superres: boolean;
43
+ frame_width_bit: number;
44
+ frame_height_bit: number;
45
+ max_frame_width: number;
46
+ max_frame_height: number;
47
+ }
48
+
49
+ type FrameResolutions = {
50
+ UpscaledWidth: number;
51
+ FrameWidth: number;
52
+ FrameHeight: number;
53
+ RenderWidth: number;
54
+ RenderHeight: number;
55
+ }
56
+
57
+ type AV1Metadata = {
58
+ codec_mimetype: string,
59
+ level: number,
60
+ level_string: string,
61
+ tier: number,
62
+ profile_idc: number,
63
+ profile_string: string,
64
+ bit_depth: number,
65
+ ref_frames: number;
66
+ chroma_format: number;
67
+ chroma_format_string: string;
68
+
69
+ sequence_header: SequenceHeaderDetails;
70
+ sequence_header_data: Uint8Array;
71
+ keyframe?: boolean;
72
+
73
+ frame_rate: {
74
+ fixed: boolean
75
+ fps: number;
76
+ fps_den: number;
77
+ fps_num: number;
78
+ },
79
+
80
+ sar_ratio?: {
81
+ width: number;
82
+ height: number;
83
+ },
84
+
85
+ codec_size?: {
86
+ width: number,
87
+ height: number;
88
+ },
89
+
90
+ present_size?: {
91
+ width: number,
92
+ height: number,
93
+ }
94
+ }
95
+
96
+ class AV1OBUParser {
97
+
98
+ static parseOBUs(uint8array: Uint8Array, meta?: AV1Metadata | null) {
99
+ for (let i = 0; i < uint8array.byteLength; ) {
100
+ let first = i;
101
+ let forbidden_bit = (uint8array[i] & 0x80) >> 7;
102
+ let type = (uint8array[i] & 0x78) >> 3;
103
+ let extension_flag = (uint8array[i] & 0x04) !== 0;
104
+ let has_size_field = (uint8array[i] & 0x02) !== 0;
105
+ let reserved_1bit = (uint8array[i] & 0x01) !== 0;
106
+
107
+ i += 1;
108
+ let temporal_id = 0, spatial_id = 0;
109
+ if (extension_flag) { i += 1; }
110
+
111
+ let size = Number.POSITIVE_INFINITY;
112
+ if (has_size_field) {
113
+ size = 0;
114
+ for (let j = 0; ; j++) {
115
+ let value = uint8array[i++]
116
+ size |= (value & 0x7F) << (j * 7);
117
+ if ((value & 0x80) === 0) { break; }
118
+ }
119
+ }
120
+ console.log(type);
121
+
122
+ if (type === 1) { // OBU_SEQUENCE_HEADER
123
+ meta = {
124
+ ... AV1OBUParser.parseSeuqneceHeader(uint8array.subarray(i, i + size)),
125
+ sequence_header_data: uint8array.subarray(first, i + size),
126
+ }
127
+ } else if (type == 3 && meta) { // OBU_FRAME_HEADER
128
+ meta = AV1OBUParser.parseOBUFrameHeader(uint8array.subarray(i, i + size), temporal_id, spatial_id, meta);
129
+ } else if (type == 6 && meta) { // OBU_FRAME
130
+ meta = AV1OBUParser.parseOBUFrameHeader(uint8array.subarray(i, i + size), temporal_id, spatial_id, meta);
131
+ }
132
+
133
+ i += size;
134
+ }
135
+
136
+ return meta;
137
+ }
138
+
139
+ static parseSeuqneceHeader(uint8array: Uint8Array): Omit<AV1Metadata, 'sequence_header_data'> {
140
+ let gb = new ExpGolomb(uint8array);
141
+
142
+ let seq_profile = gb.readBits(3);
143
+ let still_picture = gb.readBool();
144
+ let reduced_still_picture_header = gb.readBool();
145
+
146
+ let fps = 0, fps_fixed = true, fps_num = 0, fps_den = 1;
147
+ let decoder_model_info_present_flag = false;
148
+ let decoder_model_present_for_this_op = false;
149
+ let buffer_delay_length_minus_1: number | undefined = undefined;
150
+ let buffer_removal_time_length_minus_1: number | undefined = undefined;
151
+ let operating_points: OperatingPoint[] = [];
152
+ if (reduced_still_picture_header) {
153
+ operating_points.push({
154
+ operating_point_idc: 0,
155
+ level: gb.readBits(5),
156
+ tier: 0,
157
+ });
158
+ } else {
159
+ let timing_info_present_flag = gb.readBool();
160
+ if (timing_info_present_flag) {
161
+ // timing_info
162
+ let num_units_in_display_tick = gb.readBits(32);
163
+ let time_scale = gb.readBits(32);
164
+ let equal_picture_interval = gb.readBool();
165
+ let num_ticks_per_picture_minus_1 = 0;
166
+ if (equal_picture_interval) {
167
+ let leading = 0;
168
+ while (true) {
169
+ let value = gb.readBits(1);
170
+ if (value !== 0) { break; }
171
+ leading += 1;
172
+ }
173
+ if (leading >= 32) {
174
+ num_ticks_per_picture_minus_1 = 0xFFFFFFFF;
175
+ } else {
176
+ num_ticks_per_picture_minus_1 = ((1 << leading) - 1) + gb.readBits(leading);
177
+ }
178
+ }
179
+ fps_den = num_units_in_display_tick;
180
+ fps_num = time_scale;
181
+ fps = fps_num / fps_den;
182
+ fps_fixed = equal_picture_interval;
183
+
184
+ let decoder_model_info_present_flag = gb.readBool();
185
+ if (decoder_model_info_present_flag) {
186
+ // decoder_model_info
187
+ buffer_delay_length_minus_1 = gb.readBits(5);
188
+ let num_units_in_decoding_tick = gb.readBits(32);
189
+ buffer_removal_time_length_minus_1 = gb.readBits(5);
190
+ let frame_presentation_time_length_minus_1 = gb.readBits(5);
191
+ }
192
+ }
193
+
194
+ let initial_display_delay_present_flag = gb.readBool();
195
+ let operating_points_cnt_minus_1 = gb.readBits(5);
196
+ for (let i = 0; i <= operating_points_cnt_minus_1; i++) {
197
+ let operating_point_idc = gb.readBits(12);
198
+ let level = gb.readBits(5);
199
+ let tier = level > 7 ? gb.readBits(1) : 0;
200
+
201
+ operating_points.push({
202
+ operating_point_idc,
203
+ level,
204
+ tier
205
+ });
206
+
207
+ if (decoder_model_info_present_flag) {
208
+ let decoder_model_present_for_this_op = gb.readBool();
209
+ operating_points[operating_points.length - 1].decoder_model_present_for_this_op = decoder_model_present_for_this_op;
210
+ if (decoder_model_present_for_this_op) {
211
+ // operating_parameters_info
212
+ let decoder_buffer_delay = gb.readBits(buffer_delay_length_minus_1 + 1);
213
+ let encoder_buffer_delay = gb.readBits(buffer_delay_length_minus_1 + 1);
214
+ let low_delay_mode_flag = gb.readBool();
215
+ }
216
+ }
217
+
218
+ if (initial_display_delay_present_flag) {
219
+ let initial_display_delay_present_for_this_op = gb.readBool();
220
+ if (initial_display_delay_present_for_this_op) {
221
+ let initial_display_delay_minus_1 = gb.readBits(4);
222
+ }
223
+ }
224
+ }
225
+ }
226
+
227
+ let operating_point = 0;
228
+ let { level, tier } = operating_points[operating_point];
229
+
230
+ let frame_width_bits_minus_1 = gb.readBits(4);
231
+ let frame_height_bits_minus_1 = gb.readBits(4);
232
+
233
+ let max_frame_width = gb.readBits(frame_width_bits_minus_1 + 1) + 1;
234
+ let max_frame_height = gb.readBits(frame_height_bits_minus_1 + 1) + 1;
235
+
236
+ let frame_id_numbers_present_flag = false;
237
+ if (!reduced_still_picture_header) {
238
+ frame_id_numbers_present_flag = gb.readBool();
239
+ }
240
+ let delta_frame_id_length_minus_2: number | undefined = undefined;
241
+ let additional_frame_id_length_minus_1: number | undefined = undefined;
242
+ if (frame_id_numbers_present_flag) {
243
+ let delta_frame_id_length_minus_2 = gb.readBits(4);
244
+ let additional_frame_id_length_minus_1 = gb.readBits(4);
245
+ }
246
+
247
+ let SELECT_SCREEN_CONTENT_TOOLS = 2;
248
+ let SELECT_INTEGER_MV = 2;
249
+
250
+ let use_128x128_superblock = gb.readBool();
251
+ let enable_filter_intra = gb.readBool();
252
+ let enable_intra_edge_filter = gb.readBool();
253
+ let enable_interintra_compound = false;
254
+ let enable_masked_compound = false;
255
+ let enable_warped_motion = false;
256
+ let enable_dual_filter = false;
257
+ let enable_order_hint = false;
258
+ let enable_jnt_comp = false;
259
+ let enable_ref_frame_mvs = false;
260
+ let seq_force_screen_content_tools = SELECT_SCREEN_CONTENT_TOOLS;
261
+ let seq_force_integer_mv = SELECT_INTEGER_MV;
262
+ let OrderHintBits = 0;
263
+ if (!reduced_still_picture_header) {
264
+ enable_interintra_compound = gb.readBool();
265
+ enable_masked_compound = gb.readBool();
266
+ enable_warped_motion = gb.readBool();
267
+ enable_dual_filter = gb.readBool();
268
+ enable_order_hint = gb.readBool();
269
+ if (enable_order_hint) {
270
+ let enable_jnt_comp = gb.readBool();
271
+ let enable_ref_frame_mvs = gb.readBool();
272
+ }
273
+ let seq_choose_screen_content_tools = gb.readBool();
274
+ if (seq_choose_screen_content_tools) {
275
+ seq_force_screen_content_tools = SELECT_SCREEN_CONTENT_TOOLS;
276
+ } else {
277
+ seq_force_screen_content_tools = gb.readBits(1);
278
+ }
279
+ if (seq_force_screen_content_tools) {
280
+ let seq_choose_integer_mv = gb.readBool();
281
+ if (seq_choose_integer_mv) {
282
+ seq_force_integer_mv = SELECT_INTEGER_MV;
283
+ } else {
284
+ seq_force_integer_mv = gb.readBits(1);
285
+ }
286
+ } else {
287
+ seq_force_integer_mv = SELECT_INTEGER_MV;
288
+ }
289
+ if (enable_order_hint) {
290
+ let order_hint_bits_minus_1 = gb.readBits(3);
291
+ OrderHintBits = order_hint_bits_minus_1 + 1;
292
+ } else {
293
+ OrderHintBits = 0;
294
+ }
295
+ }
296
+
297
+ let enable_superres = gb.readBool();
298
+ let enable_cdef = gb.readBool();
299
+ let enable_restoration = gb.readBool();
300
+ // color_config
301
+ let high_bitdepth = gb.readBool();
302
+ let bitDepth = 8;
303
+ if (seq_profile === 2 && high_bitdepth) {
304
+ let twelve_bit = gb.readBool();
305
+ bitDepth = twelve_bit ? 12 : 10;
306
+ } else {
307
+ bitDepth = high_bitdepth ? 10 : 8;
308
+ }
309
+ let mono_chrome = false;
310
+ if (seq_profile !== 1) {
311
+ mono_chrome = gb.readBool();
312
+ }
313
+ let numPlanes = mono_chrome ? 1 : 3;
314
+ let color_description_present_flag = gb.readBool();
315
+ let CP_BT_709 = 1, CP_UNSPECIFIED = 2;
316
+ let TC_UNSPECIFIED = 2, TC_SRGB = 13;
317
+ let MC_UNSPECIFIED = 2, MC_IDENTITY = 0;
318
+ let color_primaries = CP_UNSPECIFIED;
319
+ let transfer_characteristics = TC_UNSPECIFIED;
320
+ let matrix_coefficients = MC_UNSPECIFIED;
321
+ if (color_description_present_flag) {
322
+ let color_primaries = gb.readBits(8);
323
+ let transfer_characteristics = gb.readBits(8);
324
+ let matrix_coefficients = gb.readBits(8);
325
+ }
326
+ let color_range = 1;
327
+ let subsampling_x = 1
328
+ let subsampling_y = 1;
329
+ if (mono_chrome) {
330
+ color_range = gb.readBits(1);
331
+ subsampling_x = 1
332
+ subsampling_y = 1;
333
+ let chroma_sample_position = 0; /* CSP_UNKNOWN */
334
+ let separate_uv_delta_q = 0
335
+ } else {
336
+ let color_range = 1;
337
+ if (color_primaries === CP_BT_709 && transfer_characteristics === TC_SRGB && matrix_coefficients === MC_IDENTITY) {
338
+ color_range = 1;
339
+ subsampling_x = 1
340
+ subsampling_y = 1
341
+ } else {
342
+ color_range = gb.readBits(1);
343
+ if (seq_profile == 0) {
344
+ subsampling_x = 1
345
+ subsampling_y = 1
346
+ } else if (seq_profile == 1) {
347
+ subsampling_x = 0
348
+ subsampling_y = 0
349
+ } else {
350
+ if (bitDepth == 12) {
351
+ let subsampling_x = gb.readBits(1);
352
+ if (subsampling_x) {
353
+ let subsampling_y = gb.readBits(1);
354
+ } else {
355
+ let subsampling_y = 0;
356
+ }
357
+ } else {
358
+ subsampling_x = 1
359
+ subsampling_y = 0
360
+ }
361
+ }
362
+ if (subsampling_x && subsampling_y) {
363
+ let chroma_sample_position = gb.readBits(2)
364
+ }
365
+ let separate_uv_delta_q = gb.readBits(1);
366
+ }
367
+ }
368
+ //
369
+ let film_grain_params_present = gb.readBool();
370
+
371
+ gb.destroy();
372
+ gb = null;
373
+
374
+ let codec_mimetype = `av01.${seq_profile}.${AV1OBUParser.getLevelString(level, tier)}.${bitDepth.toString(10).padStart(2, '0')}`;
375
+ let sar_width = 1, sar_height = 1, sar_scale = 1;
376
+
377
+ return {
378
+ codec_mimetype,
379
+ level: level,
380
+ tier: tier,
381
+ level_string: AV1OBUParser.getLevelString(level, tier),
382
+ profile_idc: seq_profile,
383
+ profile_string: `${seq_profile}`,
384
+ bit_depth: bitDepth,
385
+ ref_frames: 1, // FIXME!!!
386
+ chroma_format: AV1OBUParser.getChromaFormat(mono_chrome, subsampling_x, subsampling_y),
387
+ chroma_format_string: AV1OBUParser.getChromaFormatString(mono_chrome, subsampling_x, subsampling_y),
388
+
389
+ sequence_header: {
390
+ frame_id_numbers_present_flag,
391
+ additional_frame_id_length_minus_1,
392
+ delta_frame_id_length_minus_2,
393
+ reduced_still_picture_header,
394
+ decoder_model_info_present_flag,
395
+ operating_points,
396
+ buffer_removal_time_length_minus_1,
397
+ equal_picture_interval: fps_fixed,
398
+ seq_force_screen_content_tools,
399
+ seq_force_integer_mv,
400
+ enable_order_hint,
401
+ order_hint_bits: OrderHintBits,
402
+ enable_superres,
403
+ frame_width_bit: frame_width_bits_minus_1 + 1,
404
+ frame_height_bit: frame_height_bits_minus_1 + 1,
405
+ max_frame_width,
406
+ max_frame_height,
407
+ },
408
+
409
+ keyframe: undefined,
410
+
411
+ frame_rate: {
412
+ fixed: fps_fixed,
413
+ fps: fps_num / fps_den,
414
+ fps_den: fps_den,
415
+ fps_num: fps_num,
416
+ },
417
+ };
418
+ }
419
+
420
+ static parseOBUFrameHeader(uint8array: Uint8Array, temporal_id: number, spatial_id: number, meta: AV1Metadata) {
421
+ let { sequence_header } = meta;
422
+
423
+ let gb = new ExpGolomb(uint8array);
424
+ // obu_type is OBU_FRAME_HEADER, SeenFrameHeader = 0, OBU_REDUNDANT_FRAME_HEADER 1
425
+ let NUM_REF_FRAMES = 8;
426
+ let KEY_FRAME = 0;
427
+ let INTER_FRAME = 1;
428
+ let INTRA_ONLY_FRAME = 2;
429
+ let SWITCH_FRAME = 3;
430
+ let SELECT_SCREEN_CONTENT_TOOLS = 2;
431
+ let SELECT_INTEGER_MV = 2;
432
+ let PRIMARY_REF_NONE = 7;
433
+
434
+ let FrameWidth = sequence_header.max_frame_width;
435
+ let FrameHeight = sequence_header.max_frame_height;
436
+ let RenderWidth = FrameWidth; // Stub
437
+ let RenderHeight = FrameHeight; // Stub
438
+
439
+ let idLen = 0;
440
+ if (sequence_header.frame_id_numbers_present_flag) {
441
+ idLen = sequence_header.additional_frame_id_length_minus_1! + sequence_header.delta_frame_id_length_minus_2! + 3;
442
+ }
443
+ let allFrames = (1 << NUM_REF_FRAMES) - 1;
444
+
445
+ let show_existing_frame = false;
446
+ let frame_type = 0;
447
+ let keyframe = true;
448
+ let show_frame = true;
449
+ let showable_frame = false;
450
+ let error_resilient_mode = false;
451
+ if (!sequence_header.reduced_still_picture_header) {
452
+ show_existing_frame = gb.readBool();
453
+ if (show_existing_frame) {
454
+ // it does not contain frame data. ignored
455
+ return meta;
456
+ }
457
+
458
+ frame_type = gb.readBits(2);
459
+ keyframe = frame_type === INTRA_ONLY_FRAME || frame_type === KEY_FRAME;
460
+ show_frame = gb.readBool();
461
+ if (show_frame && sequence_header.decoder_model_info_present_flag && !sequence_header.equal_picture_interval) {
462
+ // decoder model info
463
+ }
464
+ if (!show_frame) {
465
+ showable_frame = frame_type !== KEY_FRAME;
466
+ } else {
467
+ showable_frame = gb.readBool();
468
+ }
469
+ if (frame_type === SWITCH_FRAME || (frame_type === KEY_FRAME && show_frame)) {
470
+ error_resilient_mode = true;
471
+ } else {
472
+ error_resilient_mode = gb.readBool();
473
+ }
474
+ }
475
+ meta.keyframe = keyframe;
476
+
477
+ let disable_cdf_update = gb.readBool();
478
+ let allow_screen_content_tools = sequence_header.seq_force_screen_content_tools;
479
+ if (sequence_header.seq_force_screen_content_tools === SELECT_SCREEN_CONTENT_TOOLS) {
480
+ allow_screen_content_tools = gb.readBits(1);
481
+ }
482
+ let force_integer_mv = keyframe ? 1 : 0;
483
+ if (allow_screen_content_tools) {
484
+ force_integer_mv = sequence_header.seq_force_integer_mv;
485
+ if (sequence_header.seq_force_integer_mv == SELECT_INTEGER_MV) {
486
+ force_integer_mv = gb.readBits(1);
487
+ }
488
+ }
489
+ let current_frame_id = 0;
490
+ if (sequence_header.frame_id_numbers_present_flag) {
491
+ current_frame_id = gb.readBits(idLen);
492
+ }
493
+ let frame_size_override_flag = false;
494
+ if (frame_type == SWITCH_FRAME) {
495
+ frame_size_override_flag = true;
496
+ } else if (sequence_header.reduced_still_picture_header) {
497
+ frame_size_override_flag = false;
498
+ } else {
499
+ frame_size_override_flag = gb.readBool();
500
+ }
501
+ let order_hint = gb.readBits(sequence_header.order_hint_bits);
502
+ let primary_ref_frame = PRIMARY_REF_NONE;
503
+ if (!(keyframe || error_resilient_mode)) {
504
+ primary_ref_frame = gb.readBits(3);
505
+ }
506
+ if (sequence_header.decoder_model_info_present_flag) {
507
+ let buffer_removal_time_present_flag = gb.readBool();
508
+ if (buffer_removal_time_present_flag) {
509
+ for (let opNum = 0; opNum <= sequence_header.operating_points_cnt_minus_1; opNum++) {
510
+ if (sequence_header.operating_points[opNum].decoder_model_present_for_this_op[opNum]) {
511
+ let opPtIdc = sequence_header.operating_points[opNum].operating_point_idc;
512
+ let inTemporalLayer = (opPtIdc >> temporal_id ) & 1
513
+ let inSpatialLayer = (opPtIdc >> (spatial_id + 8)) & 1
514
+ if (opPtIdc === 0 || (inTemporalLayer && inSpatialLayer)) {
515
+ gb.readBits(sequence_header.buffer_removal_time_length_minus_1 + 1);
516
+ }
517
+ }
518
+ }
519
+ }
520
+ }
521
+ let allow_high_precision_mv = 0;
522
+ let use_ref_frame_mvs = 0;
523
+ let allow_intrabc = 0;
524
+ let refresh_frame_flags = allFrames;
525
+ if (!(frame_type === SWITCH_FRAME || (frame_type == KEY_FRAME && show_frame))) {
526
+ refresh_frame_flags = gb.readBits(8);
527
+ }
528
+ if (keyframe || refresh_frame_flags !== allFrames) {
529
+ if (error_resilient_mode && sequence_header.enable_order_hint) {
530
+ for (let i = 0; i < NUM_REF_FRAMES; i++) {
531
+ gb.readBits(sequence_header.order_hint_bits);
532
+ }
533
+ }
534
+ }
535
+ if (keyframe){
536
+ const resolution = AV1OBUParser.frameSizeAndRenderSize(gb, frame_size_override_flag, sequence_header);
537
+ meta.codec_size = {
538
+ width: resolution.FrameWidth,
539
+ height: resolution.FrameHeight,
540
+ }
541
+ meta.present_size = {
542
+ width: resolution.RenderWidth,
543
+ height: resolution.RenderHeight,
544
+ }
545
+ meta.sar_ratio = {
546
+ width: resolution.RenderWidth / resolution.FrameWidth,
547
+ height: resolution.RenderHeight / resolution.FrameHeight,
548
+ }
549
+ }
550
+ // fmp4 can't support reference frame resolution change, so ignored
551
+
552
+ gb.destroy();
553
+ gb = null;
554
+ return meta;
555
+ }
556
+
557
+ static frameSizeAndRenderSize(gb: ExpGolomb, frame_size_override_flag: boolean, sequence_header: SequenceHeaderDetails): FrameResolutions {
558
+ let FrameWidth = sequence_header.max_frame_width;
559
+ let FrameHeight = sequence_header.max_frame_height;
560
+ if (frame_size_override_flag) {
561
+ FrameWidth = gb.readBits(sequence_header.frame_width_bit) + 1;
562
+ FrameHeight = gb.readBits(sequence_header.frame_height_bit) + 1;
563
+ }
564
+
565
+ let use_superress = false;
566
+ if (sequence_header.enable_superres) {
567
+ use_superress = gb.readBool();
568
+ }
569
+ let SuperresDenom = 8 /* SUPERRES_NUM */;
570
+ if (use_superress) {
571
+ let coded_denom = gb.readBits(3 /* SUPERRES_DENOM_BITS */);
572
+ SuperresDenom = coded_denom + 9; /* SUPERRES_DENOM_MIN */
573
+ }
574
+ let UpscaledWidth = FrameWidth;
575
+ FrameWidth = Math.floor((UpscaledWidth * 8 /* SUPERRES_NUM */ + (SuperresDenom / 2)) / SuperresDenom)
576
+
577
+ let render_and_frame_size_different = gb.readBool();
578
+ let RenderWidth = UpscaledWidth;
579
+ let RenderHeight = FrameHeight;
580
+ if (render_and_frame_size_different) {
581
+ let render_width_bits = gb.readBits(16) + 1;
582
+ let render_height_bits = gb.readBits(16) + 1;
583
+ RenderWidth = gb.readBits(render_width_bits) + 1;
584
+ RenderHeight = gb.readBits(render_height_bits) + 1;
585
+ }
586
+
587
+ return {
588
+ UpscaledWidth,
589
+ FrameWidth,
590
+ FrameHeight,
591
+ RenderWidth,
592
+ RenderHeight
593
+ };
594
+ }
595
+
596
+ static getLevelString(level: number, tier: number): string {
597
+ return `${level.toString(10).padStart(2, '0')}${tier === 0 ? 'M' : 'H'}`;
598
+ }
599
+
600
+ static getChromaFormat(mono_chrome: boolean, subsampling_x: number, subsampling_y: number): number {
601
+ if (mono_chrome) {
602
+ return 0;
603
+ } else if (subsampling_x === 0 && subsampling_y === 0) {
604
+ return 3;
605
+ } else if (subsampling_x === 1 && subsampling_y === 0) {
606
+ return 2;
607
+ } else if (subsampling_x === 1 && subsampling_y === 1) {
608
+ return 1;
609
+ } else {
610
+ return Number.NaN;
611
+ }
612
+ }
613
+
614
+ static getChromaFormatString(mono_chrome: boolean, subsampling_x: number, subsampling_y: number): string {
615
+ if (mono_chrome) {
616
+ return '4:0:0';
617
+ } else if (subsampling_x === 0 && subsampling_y === 0) {
618
+ return '4:4:4';
619
+ } else if (subsampling_x === 1 && subsampling_y === 0) {
620
+ return '4:2:2';
621
+ } else if (subsampling_x === 1 && subsampling_y === 1) {
622
+ return '4:2:0';
623
+ } else {
624
+ return 'Unknown';
625
+ }
626
+ }
627
+ }
628
+
629
+ export default AV1OBUParser;