@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,187 @@
1
+ import Log from "../utils/logger";
2
+
3
+ export enum H264NaluType {
4
+ kUnspecified = 0,
5
+ kSliceNonIDR,
6
+ kSliceDPA,
7
+ kSliceDPB,
8
+ kSliceDPC,
9
+ kSliceIDR,
10
+ kSliceSEI,
11
+ kSliceSPS,
12
+ kSlicePPS,
13
+ kSliceAUD,
14
+ kEndOfSequence,
15
+ kEndOfStream,
16
+ kFiller,
17
+ kSPSExt,
18
+ kReserved0
19
+ }
20
+
21
+ export class H264NaluPayload {
22
+ type: H264NaluType;
23
+ data: Uint8Array;
24
+ }
25
+
26
+ export class H264NaluAVC1 {
27
+ type: H264NaluType;
28
+ data: Uint8Array;
29
+
30
+ constructor(nalu: H264NaluPayload) {
31
+ let nalu_size = nalu.data.byteLength;
32
+
33
+ this.type = nalu.type;
34
+ this.data = new Uint8Array(4 + nalu_size); // 4 byte length-header + nalu payload
35
+
36
+ let v = new DataView(this.data.buffer);
37
+ // Fill 4 byte length-header
38
+ v.setUint32(0, nalu_size);
39
+ // Copy payload
40
+ this.data.set(nalu.data, 4);
41
+ }
42
+ }
43
+
44
+ export class H264AnnexBParser {
45
+
46
+ private readonly TAG: string = "H264AnnexBParser";
47
+
48
+ private data_: Uint8Array;
49
+ private current_startcode_offset_: number = 0;
50
+ private eof_flag_: boolean = false;
51
+
52
+ public constructor(data: Uint8Array) {
53
+ this.data_ = data;
54
+ this.current_startcode_offset_ = this.findNextStartCodeOffset(0);
55
+ if (this.eof_flag_) {
56
+ Log.e(this.TAG, "Could not find H264 startcode until payload end!");
57
+ }
58
+ }
59
+
60
+ private findNextStartCodeOffset(start_offset: number) {
61
+ let i = start_offset;
62
+ let data = this.data_;
63
+
64
+ while (true) {
65
+ if (i + 3 >= data.byteLength) {
66
+ this.eof_flag_ = true;
67
+ return data.byteLength;
68
+ }
69
+
70
+ // search 00 00 00 01 or 00 00 01
71
+ let uint32 = (data[i + 0] << 24)
72
+ | (data[i + 1] << 16)
73
+ | (data[i + 2] << 8)
74
+ | (data[i + 3]);
75
+ let uint24 = (data[i + 0] << 16)
76
+ | (data[i + 1] << 8)
77
+ | (data[i + 2]);
78
+ if (uint32 === 0x00000001 || uint24 === 0x000001) {
79
+ return i;
80
+ } else {
81
+ i++;
82
+ }
83
+ }
84
+ }
85
+
86
+ public readNextNaluPayload(): H264NaluPayload | null {
87
+ let data = this.data_;
88
+ let nalu_payload: H264NaluPayload = null;
89
+
90
+ while (nalu_payload == null) {
91
+ if (this.eof_flag_) {
92
+ break;
93
+ }
94
+ // offset pointed to start code
95
+ let startcode_offset = this.current_startcode_offset_;
96
+
97
+ // nalu payload start offset
98
+ let offset = startcode_offset;
99
+ let u32 = (data[offset] << 24) | (data[offset + 1] << 16) | (data[offset + 2] << 8) | (data[offset + 3]);
100
+ if (u32 === 0x00000001) {
101
+ offset += 4;
102
+ } else {
103
+ offset += 3;
104
+ }
105
+
106
+ let nalu_type: H264NaluType = data[offset] & 0x1F;
107
+ let forbidden_bit = (data[offset] & 0x80) >>> 7;
108
+
109
+ let next_startcode_offset = this.findNextStartCodeOffset(offset);
110
+ this.current_startcode_offset_ = next_startcode_offset;
111
+
112
+ if (nalu_type >= H264NaluType.kReserved0) {
113
+ continue;
114
+ }
115
+ if (forbidden_bit !== 0) {
116
+ // Log.e(this.TAG, `forbidden_bit near offset ${offset} should be 0 but has value ${forbidden_bit}`);
117
+ continue;
118
+ }
119
+
120
+ let payload_data = data.subarray(offset, next_startcode_offset);
121
+
122
+ nalu_payload = new H264NaluPayload();
123
+ nalu_payload.type = nalu_type;
124
+ nalu_payload.data = payload_data;
125
+ }
126
+
127
+ return nalu_payload;
128
+ }
129
+
130
+ }
131
+
132
+
133
+ export class AVCDecoderConfigurationRecord {
134
+
135
+ private data: Uint8Array;
136
+
137
+ // sps, pps: require Nalu without 4 byte length-header
138
+ public constructor(sps: Uint8Array, pps: Uint8Array, sps_details: any) {
139
+ let length = 6 + 2 + sps.byteLength + 1 + 2 + pps.byteLength;
140
+ let need_extra_fields = false;
141
+
142
+ if (sps[3] !== 66 && sps[3] !== 77 && sps[3] !== 88) {
143
+ need_extra_fields = true;
144
+ length += 4;
145
+ }
146
+
147
+ let data = this.data = new Uint8Array(length);
148
+
149
+ data[0] = 0x01; // configurationVersion
150
+ data[1] = sps[1]; // AVCProfileIndication
151
+ data[2] = sps[2]; // profile_compatibility
152
+ data[3] = sps[3]; // AVCLevelIndication
153
+ data[4] = 0xFF; // 111111 + lengthSizeMinusOne(3)
154
+
155
+ data[5] = 0xE0 | 0x01 // 111 + numOfSequenceParameterSets
156
+
157
+ let sps_length = sps.byteLength;
158
+ data[6] = sps_length >>> 8; // sequenceParameterSetLength
159
+ data[7] = sps_length & 0xFF;
160
+
161
+ let offset = 8;
162
+ data.set(sps, 8);
163
+ offset += sps_length;
164
+
165
+ data[offset] = 1; // numOfPictureParameterSets
166
+
167
+ let pps_length = pps.byteLength;
168
+ data[offset + 1] = pps_length >>> 8; // pictureParameterSetLength
169
+ data[offset + 2] = pps_length & 0xFF;
170
+
171
+ data.set(pps, offset + 3);
172
+ offset += 3 + pps_length;
173
+
174
+ if (need_extra_fields) {
175
+ data[offset] = 0xFC | sps_details.chroma_format_idc;
176
+ data[offset + 1] = 0xF8 | (sps_details.bit_depth_luma - 8);
177
+ data[offset + 2] = 0xF8 | (sps_details.bit_depth_chroma - 8);
178
+ data[offset + 3] = 0x00; // number of sps ext
179
+ offset += 4;
180
+ }
181
+ }
182
+
183
+ public getData() {
184
+ return this.data;
185
+ }
186
+
187
+ }
@@ -0,0 +1,501 @@
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
+ class H265NaluParser {
22
+
23
+ static _ebsp2rbsp(uint8array) {
24
+ let src = uint8array;
25
+ let src_length = src.byteLength;
26
+ let dst = new Uint8Array(src_length);
27
+ let dst_idx = 0;
28
+
29
+ for (let i = 0; i < src_length; i++) {
30
+ if (i >= 2) {
31
+ // Unescape: Skip 0x03 after 00 00
32
+ if (src[i] === 0x03 && src[i - 1] === 0x00 && src[i - 2] === 0x00) {
33
+ continue;
34
+ }
35
+ }
36
+ dst[dst_idx] = src[i];
37
+ dst_idx++;
38
+ }
39
+
40
+ return new Uint8Array(dst.buffer, 0, dst_idx);
41
+ }
42
+
43
+ static parseVPS(uint8array) {
44
+ let rbsp = H265NaluParser._ebsp2rbsp(uint8array);
45
+ let gb = new ExpGolomb(rbsp);
46
+
47
+ /* remove NALu Header */
48
+ gb.readByte();
49
+ gb.readByte();
50
+
51
+ // VPS
52
+ let video_parameter_set_id = gb.readBits(4);
53
+ gb.readBits(2);
54
+ let max_layers_minus1 = gb.readBits(6);
55
+ let max_sub_layers_minus1 = gb.readBits(3);
56
+ let temporal_id_nesting_flag = gb.readBool();
57
+ // and more ...
58
+
59
+ return {
60
+ num_temporal_layers: max_sub_layers_minus1 + 1,
61
+ temporal_id_nested: temporal_id_nesting_flag
62
+ }
63
+ }
64
+
65
+ static parseSPS(uint8array) {
66
+ let rbsp = H265NaluParser._ebsp2rbsp(uint8array);
67
+ let gb = new ExpGolomb(rbsp);
68
+
69
+ /* remove NALu Header */
70
+ gb.readByte();
71
+ gb.readByte();
72
+
73
+ let left_offset = 0, right_offset = 0, top_offset = 0, bottom_offset = 0;
74
+
75
+ // SPS
76
+ let video_paramter_set_id = gb.readBits(4);
77
+ let max_sub_layers_minus1 = gb.readBits(3);
78
+ let temporal_id_nesting_flag = gb.readBool();
79
+
80
+ // profile_tier_level begin
81
+ let general_profile_space = gb.readBits(2);
82
+ let general_tier_flag = gb.readBool();
83
+ let general_profile_idc = gb.readBits(5);
84
+ let general_profile_compatibility_flags_1 = gb.readByte();
85
+ let general_profile_compatibility_flags_2 = gb.readByte();
86
+ let general_profile_compatibility_flags_3 = gb.readByte();
87
+ let general_profile_compatibility_flags_4 = gb.readByte();
88
+ let general_constraint_indicator_flags_1 = gb.readByte();
89
+ let general_constraint_indicator_flags_2 = gb.readByte();
90
+ let general_constraint_indicator_flags_3 = gb.readByte();
91
+ let general_constraint_indicator_flags_4 = gb.readByte();
92
+ let general_constraint_indicator_flags_5 = gb.readByte();
93
+ let general_constraint_indicator_flags_6 = gb.readByte();
94
+ let general_level_idc = gb.readByte();
95
+ let sub_layer_profile_present_flag = [];
96
+ let sub_layer_level_present_flag = [];
97
+ for (let i = 0; i < max_sub_layers_minus1; i++) {
98
+ sub_layer_profile_present_flag.push(gb.readBool());
99
+ sub_layer_level_present_flag.push(gb.readBool());
100
+ }
101
+ if (max_sub_layers_minus1 > 0) {
102
+ for (let i = max_sub_layers_minus1; i < 8; i++) { gb.readBits(2); }
103
+ }
104
+ for (let i = 0; i < max_sub_layers_minus1; i++) {
105
+ if (sub_layer_profile_present_flag[i]) {
106
+ gb.readByte(); // sub_layer_profile_space, sub_layer_tier_flag, sub_layer_profile_idc
107
+ gb.readByte(); gb.readByte(); gb.readByte(); gb.readByte(); // sub_layer_profile_compatibility_flag
108
+ gb.readByte(); gb.readByte(); gb.readByte(); gb.readByte(); gb.readByte(); gb.readByte();
109
+ }
110
+ if (sub_layer_level_present_flag[i]) {
111
+ gb.readByte();
112
+ }
113
+ }
114
+ // profile_tier_level end
115
+
116
+ let seq_parameter_set_id = gb.readUEG();
117
+ let chroma_format_idc = gb.readUEG();
118
+ if (chroma_format_idc == 3) {
119
+ gb.readBits(1); // separate_colour_plane_flag
120
+ }
121
+ let pic_width_in_luma_samples = gb.readUEG();
122
+ let pic_height_in_luma_samples = gb.readUEG();
123
+ let conformance_window_flag = gb.readBool();
124
+ if (conformance_window_flag) {
125
+ left_offset += gb.readUEG();
126
+ right_offset += gb.readUEG();
127
+ top_offset += gb.readUEG();
128
+ bottom_offset += gb.readUEG();
129
+ }
130
+ let bit_depth_luma_minus8 = gb.readUEG();
131
+ let bit_depth_chroma_minus8 = gb.readUEG();
132
+ let log2_max_pic_order_cnt_lsb_minus4 = gb.readUEG();
133
+ let sub_layer_ordering_info_present_flag = gb.readBool();
134
+ for (let i = sub_layer_ordering_info_present_flag ? 0 : max_sub_layers_minus1; i <= max_sub_layers_minus1; i++) {
135
+ gb.readUEG(); // max_dec_pic_buffering_minus1[i]
136
+ gb.readUEG(); // max_num_reorder_pics[i]
137
+ gb.readUEG(); // max_latency_increase_plus1[i]
138
+ }
139
+ let log2_min_luma_coding_block_size_minus3 = gb.readUEG();
140
+ let log2_diff_max_min_luma_coding_block_size = gb.readUEG();
141
+ let log2_min_transform_block_size_minus2 = gb.readUEG();
142
+ let log2_diff_max_min_transform_block_size = gb.readUEG();
143
+ let max_transform_hierarchy_depth_inter = gb.readUEG();
144
+ let max_transform_hierarchy_depth_intra = gb.readUEG();
145
+ let scaling_list_enabled_flag = gb.readBool();
146
+ if (scaling_list_enabled_flag) {
147
+ let sps_scaling_list_data_present_flag = gb.readBool();
148
+ if (sps_scaling_list_data_present_flag) {
149
+ for (let sizeId = 0; sizeId < 4; sizeId++) {
150
+ for(let matrixId = 0; matrixId < ((sizeId === 3) ? 2 : 6); matrixId++){
151
+ let scaling_list_pred_mode_flag = gb.readBool();
152
+ if (!scaling_list_pred_mode_flag) {
153
+ gb.readUEG(); // scaling_list_pred_matrix_id_delta
154
+ } else {
155
+ let coefNum = Math.min(64, (1 << (4 + (sizeId << 1))));
156
+ if (sizeId > 1) { gb.readSEG() }
157
+ for (let i = 0; i < coefNum; i++) { gb.readSEG(); }
158
+ }
159
+ }
160
+ }
161
+ }
162
+ }
163
+ let amp_enabled_flag = gb.readBool();
164
+ let sample_adaptive_offset_enabled_flag = gb.readBool();
165
+ let pcm_enabled_flag = gb.readBool();
166
+ if (pcm_enabled_flag) {
167
+ gb.readByte();
168
+ gb.readUEG();
169
+ gb.readUEG();
170
+ gb.readBool();
171
+ }
172
+ let num_short_term_ref_pic_sets = gb.readUEG();
173
+ let num_delta_pocs = 0;
174
+ for (let i = 0; i < num_short_term_ref_pic_sets; i++) {
175
+ let inter_ref_pic_set_prediction_flag = false;
176
+ if (i !== 0) { inter_ref_pic_set_prediction_flag = gb.readBool(); }
177
+ if (inter_ref_pic_set_prediction_flag) {
178
+ if (i === num_short_term_ref_pic_sets) { gb.readUEG(); }
179
+ gb.readBool();
180
+ gb.readUEG();
181
+ let next_num_delta_pocs = 0;
182
+ for (let j = 0; j <= num_delta_pocs; j++) {
183
+ let used_by_curr_pic_flag = gb.readBool();
184
+ let use_delta_flag = false;
185
+ if (!used_by_curr_pic_flag) {
186
+ use_delta_flag = gb.readBool();
187
+ }
188
+ if (used_by_curr_pic_flag || use_delta_flag) {
189
+ next_num_delta_pocs++;
190
+ }
191
+ }
192
+ num_delta_pocs = next_num_delta_pocs;
193
+ } else {
194
+ let num_negative_pics = gb.readUEG();
195
+ let num_positive_pics = gb.readUEG();
196
+ num_delta_pocs = num_negative_pics + num_positive_pics;
197
+ for (let j = 0; j < num_negative_pics; j++) {
198
+ gb.readUEG();
199
+ gb.readBool();
200
+ }
201
+ for (let j = 0; j < num_positive_pics; j++) {
202
+ gb.readUEG();
203
+ gb.readBool();
204
+ }
205
+ }
206
+ }
207
+ let long_term_ref_pics_present_flag = gb.readBool();
208
+ if (long_term_ref_pics_present_flag) {
209
+ let num_long_term_ref_pics_sps = gb.readUEG();
210
+ for (let i = 0; i < num_long_term_ref_pics_sps; i++) {
211
+ for (let j = 0; j < (log2_max_pic_order_cnt_lsb_minus4 + 4); j++) { gb.readBits(1); }
212
+ gb.readBits(1);
213
+ }
214
+ }
215
+ //*
216
+ let default_display_window_flag = false; // for calc offset
217
+ let min_spatial_segmentation_idc = 0; // for hvcC
218
+ let sar_width = 1, sar_height = 1;
219
+ let fps_fixed = false, fps_den = 1, fps_num = 1;
220
+ //*/
221
+ let sps_temporal_mvp_enabled_flag = gb.readBool();
222
+ let strong_intra_smoothing_enabled_flag = gb.readBool();
223
+ let vui_parameters_present_flag = gb.readBool();
224
+ if (vui_parameters_present_flag) {
225
+ let aspect_ratio_info_present_flag = gb.readBool();
226
+ if (aspect_ratio_info_present_flag) {
227
+ let aspect_ratio_idc = gb.readByte();
228
+
229
+ let sar_w_table = [1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2];
230
+ let sar_h_table = [1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1];
231
+
232
+ if (aspect_ratio_idc > 0 && aspect_ratio_idc <= 16) {
233
+ sar_width = sar_w_table[aspect_ratio_idc - 1];
234
+ sar_height = sar_h_table[aspect_ratio_idc - 1];
235
+ } else if (aspect_ratio_idc === 255) {
236
+ sar_width = gb.readBits(16);
237
+ sar_height = gb.readBits(16);
238
+ }
239
+ }
240
+ let overscan_info_present_flag = gb.readBool();
241
+ if (overscan_info_present_flag) {
242
+ gb.readBool();
243
+ }
244
+ let video_signal_type_present_flag = gb.readBool();
245
+ if (video_signal_type_present_flag) {
246
+ gb.readBits(3);
247
+ gb.readBool();
248
+ let colour_description_present_flag = gb.readBool();
249
+ if (colour_description_present_flag) {
250
+ gb.readByte();
251
+ gb.readByte();
252
+ gb.readByte();
253
+ }
254
+ }
255
+ let chroma_loc_info_present_flag = gb.readBool();
256
+ if (chroma_loc_info_present_flag) {
257
+ gb.readUEG();
258
+ gb.readUEG();
259
+ }
260
+ let neutral_chroma_indication_flag = gb.readBool();
261
+ let field_seq_flag = gb.readBool();
262
+ let frame_field_info_present_flag = gb.readBool();
263
+ default_display_window_flag = gb.readBool();
264
+ if (default_display_window_flag) {
265
+ gb.readUEG();
266
+ gb.readUEG();
267
+ gb.readUEG();
268
+ gb.readUEG();
269
+ }
270
+ let vui_timing_info_present_flag = gb.readBool();
271
+ if (vui_timing_info_present_flag) {
272
+ fps_den = gb.readBits(32);
273
+ fps_num = gb.readBits(32);
274
+ let vui_poc_proportional_to_timing_flag = gb.readBool();
275
+ if (vui_poc_proportional_to_timing_flag) {
276
+ gb.readUEG();
277
+ }
278
+ let vui_hrd_parameters_present_flag = gb.readBool();
279
+ if (vui_hrd_parameters_present_flag) {
280
+ let commonInfPresentFlag = 1;
281
+ let nal_hrd_parameters_present_flag = false;
282
+ let vcl_hrd_parameters_present_flag = false;
283
+ let sub_pic_hrd_params_present_flag = false;
284
+ if (commonInfPresentFlag) {
285
+ nal_hrd_parameters_present_flag = gb.readBool();
286
+ vcl_hrd_parameters_present_flag = gb.readBool();
287
+ if( nal_hrd_parameters_present_flag || vcl_hrd_parameters_present_flag ){
288
+ sub_pic_hrd_params_present_flag = gb.readBool();
289
+ if (sub_pic_hrd_params_present_flag) {
290
+ gb.readByte();
291
+ gb.readBits(5);
292
+ gb.readBool();
293
+ gb.readBits(5);
294
+ }
295
+ let bit_rate_scale = gb.readBits(4);
296
+ let cpb_size_scale = gb.readBits(4);
297
+ if (sub_pic_hrd_params_present_flag) {
298
+ gb.readBits(4);
299
+ }
300
+ gb.readBits(5);
301
+ gb.readBits(5);
302
+ gb.readBits(5);
303
+ }
304
+ }
305
+ for (let i = 0; i <= max_sub_layers_minus1; i++) {
306
+ let fixed_pic_rate_general_flag = gb.readBool();
307
+ fps_fixed = fixed_pic_rate_general_flag;
308
+ let fixed_pic_rate_within_cvs_flag = true;
309
+ let cpbCnt = 1;
310
+ if (!fixed_pic_rate_general_flag) {
311
+ fixed_pic_rate_within_cvs_flag = gb.readBool();
312
+ }
313
+ let low_delay_hrd_flag = false;
314
+ if (fixed_pic_rate_within_cvs_flag) {
315
+ gb.readUEG();
316
+ } else {
317
+ low_delay_hrd_flag = gb.readBool();
318
+ }
319
+ if (!low_delay_hrd_flag) {
320
+ cpbCnt = gb.readUEG() + 1;
321
+ }
322
+ if (nal_hrd_parameters_present_flag) {
323
+ for (let j = 0; j < cpbCnt; j++) {
324
+ gb.readUEG(); gb.readUEG();
325
+ if (sub_pic_hrd_params_present_flag) {
326
+ gb.readUEG(); gb.readUEG();
327
+ }
328
+ }
329
+ gb.readBool()
330
+ }
331
+ if (vcl_hrd_parameters_present_flag) {
332
+ for (let j = 0; j < cpbCnt; j++) {
333
+ gb.readUEG(); gb.readUEG();
334
+ if (sub_pic_hrd_params_present_flag) {
335
+ gb.readUEG(); gb.readUEG();
336
+ }
337
+ }
338
+ gb.readBool()
339
+ }
340
+ }
341
+ }
342
+ }
343
+ let bitstream_restriction_flag = gb.readBool();
344
+ if (bitstream_restriction_flag) {
345
+ let tiles_fixed_structure_flag = gb.readBool()
346
+ let motion_vectors_over_pic_boundaries_flag = gb.readBool()
347
+ let restricted_ref_pic_lists_flag = gb.readBool();
348
+ min_spatial_segmentation_idc = gb.readUEG();
349
+ let max_bytes_per_pic_denom = gb.readUEG();
350
+ let max_bits_per_min_cu_denom = gb.readUEG();
351
+ let log2_max_mv_length_horizontal = gb.readUEG();
352
+ let log2_max_mv_length_vertical = gb.readUEG();
353
+ }
354
+ }
355
+ let sps_extension_flag = gb.readBool(); // ignore...
356
+
357
+ // for meta data
358
+ let codec_mimetype = `hvc1.${general_profile_idc}.1.L${general_level_idc}.B0`;
359
+
360
+ let sub_wc = (chroma_format_idc === 1 || chroma_format_idc === 2) ? 2 : 1;
361
+ let sub_hc = (chroma_format_idc === 1) ? 2 : 1;
362
+ let codec_width = pic_width_in_luma_samples - (left_offset + right_offset) * sub_wc;
363
+ let codec_height = pic_height_in_luma_samples - (top_offset + bottom_offset) * sub_hc;
364
+ let sar_scale = 1;
365
+ if (sar_width !== 1 && sar_height !== 1) {
366
+ sar_scale = sar_width / sar_height;
367
+ }
368
+
369
+ gb.destroy();
370
+ gb = null;
371
+
372
+ return {
373
+ codec_mimetype,
374
+ profile_string: H265NaluParser.getProfileString(general_profile_idc),
375
+ level_string: H265NaluParser.getLevelString(general_level_idc),
376
+ profile_idc: general_profile_idc,
377
+ bit_depth: bit_depth_luma_minus8 + 8,
378
+ ref_frames: 1, // FIXME!!!
379
+ chroma_format: chroma_format_idc,
380
+ chroma_format_string: H265NaluParser.getChromaFormatString(chroma_format_idc),
381
+
382
+ general_level_idc,
383
+ general_profile_space,
384
+ general_tier_flag,
385
+ general_profile_idc,
386
+ general_profile_compatibility_flags_1,
387
+ general_profile_compatibility_flags_2,
388
+ general_profile_compatibility_flags_3,
389
+ general_profile_compatibility_flags_4,
390
+ general_constraint_indicator_flags_1,
391
+ general_constraint_indicator_flags_2,
392
+ general_constraint_indicator_flags_3,
393
+ general_constraint_indicator_flags_4,
394
+ general_constraint_indicator_flags_5,
395
+ general_constraint_indicator_flags_6,
396
+ min_spatial_segmentation_idc,
397
+ constant_frame_rate: 0 /* FIXME!! fps_fixed ? 1 : 0? */,
398
+ chroma_format_idc,
399
+ bit_depth_luma_minus8,
400
+ bit_depth_chroma_minus8,
401
+
402
+ frame_rate: {
403
+ fixed: fps_fixed,
404
+ fps: fps_num / fps_den,
405
+ fps_den: fps_den,
406
+ fps_num: fps_num,
407
+ },
408
+
409
+ sar_ratio: {
410
+ width: sar_width,
411
+ height: sar_height
412
+ },
413
+
414
+ codec_size: {
415
+ width: codec_width,
416
+ height: codec_height
417
+ },
418
+
419
+ present_size: {
420
+ width: codec_width * sar_scale,
421
+ height: codec_height
422
+ }
423
+ };
424
+ }
425
+
426
+ static parsePPS(uint8array) {
427
+ let rbsp = H265NaluParser._ebsp2rbsp(uint8array);
428
+ let gb = new ExpGolomb(rbsp);
429
+
430
+ /* remove NALu Header */
431
+ gb.readByte();
432
+ gb.readByte();
433
+
434
+ let pic_parameter_set_id = gb.readUEG();
435
+ let seq_parameter_set_id = gb.readUEG();
436
+ let dependent_slice_segments_enabled_flag = gb.readBool();
437
+ let output_flag_present_flag = gb.readBool();
438
+ let num_extra_slice_header_bits = gb.readBits(3);
439
+ let sign_data_hiding_enabled_flag = gb.readBool();
440
+ let cabac_init_present_flag = gb.readBool();
441
+ let num_ref_idx_l0_default_active_minus1 = gb.readUEG();
442
+ let num_ref_idx_l1_default_active_minus1 = gb.readUEG();
443
+ let init_qp_minus26 = gb.readSEG();
444
+ let constrained_intra_pred_flag = gb.readBool();
445
+ let transform_skip_enabled_flag = gb.readBool();
446
+ let cu_qp_delta_enabled_flag = gb.readBool();
447
+ if (cu_qp_delta_enabled_flag) {
448
+ let diff_cu_qp_delta_depth = gb.readUEG();
449
+ }
450
+ let cb_qp_offset = gb.readSEG();
451
+ let cr_qp_offset = gb.readSEG();
452
+ let pps_slice_chroma_qp_offsets_present_flag = gb.readBool();
453
+ let weighted_pred_flag = gb.readBool();
454
+ let weighted_bipred_flag = gb.readBool();
455
+ let transquant_bypass_enabled_flag = gb.readBool();
456
+ let tiles_enabled_flag = gb.readBool();
457
+ let entropy_coding_sync_enabled_flag = gb.readBool();
458
+ // and more ...
459
+
460
+ // needs hvcC
461
+ let parallelismType = 1; // slice-based parallel decoding
462
+ if (entropy_coding_sync_enabled_flag && tiles_enabled_flag) {
463
+ parallelismType = 0; // mixed-type parallel decoding
464
+ } else if (entropy_coding_sync_enabled_flag) {
465
+ parallelismType = 3; // wavefront-based parallel decoding
466
+ } else if (tiles_enabled_flag) {
467
+ parallelismType = 2; // tile-based parallel decoding
468
+ }
469
+
470
+ return {
471
+ parallelismType
472
+ }
473
+ }
474
+
475
+ static getChromaFormatString(chroma_idc) {
476
+ switch (chroma_idc) {
477
+ case 0: return '4:0:0';
478
+ case 1: return '4:2:0';
479
+ case 2: return '4:2:2';
480
+ case 3: return '4:4:4';
481
+ default: return 'Unknown';
482
+ }
483
+ }
484
+
485
+ static getProfileString(profile_idc) {
486
+ switch (profile_idc) {
487
+ case 1: return 'Main';
488
+ case 2: return 'Main10';
489
+ case 3: return 'MainSP';
490
+ case 4: return 'Rext';
491
+ case 9: return 'SCC';
492
+ default: return 'Unknown';
493
+ }
494
+ }
495
+
496
+ static getLevelString(level_idc) {
497
+ return (level_idc / 30).toFixed(1);
498
+ }
499
+ }
500
+
501
+ export default H265NaluParser;