@dolbylaboratories/alps 2.0.0 → 3.0.0-alpha.2
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/dist/alps.bundle.js +262 -125
- package/dist/alps.bundle.js.map +2 -2
- package/dist/alps.bundle.min.js +1 -1
- package/package.json +2 -2
package/dist/alps.bundle.js
CHANGED
|
@@ -1102,35 +1102,69 @@ var PRESENTATION_LEVEL = "presentation_level";
|
|
|
1102
1102
|
var PAYLOAD_BASE_MINUS1 = "payload_base_minus1";
|
|
1103
1103
|
var BYTE_ALIGNMENT = "byte_alignment";
|
|
1104
1104
|
var AC4_TOC_END = "ac4_toc_end";
|
|
1105
|
+
var PAYLOAD_BASE = "payload_base";
|
|
1105
1106
|
|
|
1106
1107
|
// src/bitwise_operations.js
|
|
1108
|
+
var rev = (byte) => {
|
|
1109
|
+
let result = (byte & 240) >>> 4 | (byte & 15) << 4;
|
|
1110
|
+
result = (result & 204) >>> 2 | (result & 51) << 2;
|
|
1111
|
+
result = (result & 170) >>> 1 | (result & 85) << 1;
|
|
1112
|
+
return result;
|
|
1113
|
+
};
|
|
1107
1114
|
var shiftLeft = (data, offset, width, shift) => {
|
|
1115
|
+
if (width === 0) return data;
|
|
1108
1116
|
const startByte = offset >> 3;
|
|
1109
1117
|
const endByte = offset + width - 1 >> 3;
|
|
1110
|
-
const
|
|
1111
|
-
const
|
|
1112
|
-
const
|
|
1113
|
-
const
|
|
1118
|
+
const startMask = 255 >> (offset & 7);
|
|
1119
|
+
const endMask = 255 << 7 - (offset + width - 1 & 7) & 255;
|
|
1120
|
+
const useBitwise = shift < 24;
|
|
1121
|
+
const shiftMul = useBitwise ? 0 : 2 ** shift;
|
|
1114
1122
|
let shiftAcc = 0;
|
|
1115
1123
|
for (let i = endByte; i >= startByte; i--) {
|
|
1116
|
-
const currByte = data.getUint8(i);
|
|
1117
1124
|
let mask = 255;
|
|
1118
|
-
if (i === startByte)
|
|
1119
|
-
|
|
1125
|
+
if (i === startByte) mask &= startMask;
|
|
1126
|
+
if (i === endByte) mask &= endMask;
|
|
1127
|
+
const byte = data.getUint8(i);
|
|
1128
|
+
if (useBitwise) {
|
|
1129
|
+
shiftAcc = ((byte & mask) << shift) + shiftAcc;
|
|
1130
|
+
data.setUint8(i, byte & ~mask | shiftAcc & 255 & mask);
|
|
1131
|
+
shiftAcc >>>= 8;
|
|
1132
|
+
} else {
|
|
1133
|
+
shiftAcc = (byte & mask) * shiftMul + shiftAcc;
|
|
1134
|
+
data.setUint8(i, byte & ~mask | shiftAcc % 256 & mask);
|
|
1135
|
+
shiftAcc = Math.trunc(shiftAcc / 256);
|
|
1120
1136
|
}
|
|
1121
|
-
|
|
1122
|
-
|
|
1137
|
+
}
|
|
1138
|
+
return data;
|
|
1139
|
+
};
|
|
1140
|
+
var shiftRight = (data, offset, width, shift) => {
|
|
1141
|
+
if (width === 0) return data;
|
|
1142
|
+
const startByte = offset >> 3;
|
|
1143
|
+
const endByte = offset + width - 1 >> 3;
|
|
1144
|
+
const startMask = 255 >> (offset & 7);
|
|
1145
|
+
const endMask = 255 << 7 - (offset + width - 1 & 7) & 255;
|
|
1146
|
+
const useBitwise = shift < 24;
|
|
1147
|
+
const shiftMul = useBitwise ? 0 : 2 ** shift;
|
|
1148
|
+
let shiftAcc = 0;
|
|
1149
|
+
for (let i = startByte; i <= endByte; i++) {
|
|
1150
|
+
let mask = 255;
|
|
1151
|
+
if (i === startByte) mask &= startMask;
|
|
1152
|
+
if (i === endByte) mask &= endMask;
|
|
1153
|
+
const byte = data.getUint8(i);
|
|
1154
|
+
if (useBitwise) {
|
|
1155
|
+
shiftAcc = (rev(byte & mask) << shift) + shiftAcc;
|
|
1156
|
+
data.setUint8(i, byte & ~mask | rev(shiftAcc & 255) & mask);
|
|
1157
|
+
shiftAcc >>>= 8;
|
|
1158
|
+
} else {
|
|
1159
|
+
shiftAcc = rev(byte & mask) * shiftMul + shiftAcc;
|
|
1160
|
+
data.setUint8(i, byte & ~mask | rev(shiftAcc % 256) & mask);
|
|
1161
|
+
shiftAcc = Math.trunc(shiftAcc / 256);
|
|
1123
1162
|
}
|
|
1124
|
-
const clearedByte = currByte & ~mask;
|
|
1125
|
-
const maskedCurrByte = currByte & mask;
|
|
1126
|
-
shiftAcc = (maskedCurrByte << shift) + shiftAcc;
|
|
1127
|
-
const shiftedCurrByte = clearedByte | shiftAcc & 255 & mask;
|
|
1128
|
-
shiftAcc >>= 8;
|
|
1129
|
-
data.setUint8(i, shiftedCurrByte);
|
|
1130
1163
|
}
|
|
1131
1164
|
return data;
|
|
1132
1165
|
};
|
|
1133
1166
|
var setBits = (data, offset, width, value) => {
|
|
1167
|
+
console.assert(value >> width === 0, "value is not a ".concat(width, " bit value"));
|
|
1134
1168
|
const byteOffset = offset >>> 3;
|
|
1135
1169
|
const bitOffset = offset & 7;
|
|
1136
1170
|
const mask = (1 << width) - 1 << 16 - width >> bitOffset;
|
|
@@ -1216,6 +1250,9 @@ var BitSource = class {
|
|
|
1216
1250
|
const BYTE_SIZE = 8;
|
|
1217
1251
|
const INT_SIZE = 32;
|
|
1218
1252
|
if (bitsWidth > MAX_SUPPORTED_WIDTH) {
|
|
1253
|
+
console.warn(
|
|
1254
|
+
"BitSource.get getting value ".concat(varname, " with not supported width=").concat(bitsWidth, " (max supported width: 24)")
|
|
1255
|
+
);
|
|
1219
1256
|
}
|
|
1220
1257
|
let width = bitsWidth;
|
|
1221
1258
|
while (this.bitsLeft < width) {
|
|
@@ -1312,6 +1349,17 @@ var FilterSink = class {
|
|
|
1312
1349
|
this.callback(name, null, null, position, "after_position");
|
|
1313
1350
|
}
|
|
1314
1351
|
}
|
|
1352
|
+
/**
|
|
1353
|
+
* Called after a derived/computed value is assigned to a variable (e.g. when
|
|
1354
|
+
* `payload_base` is extended beyond the initial 5-bit field).
|
|
1355
|
+
* @param {string} name - name of the AC-4 TOC element
|
|
1356
|
+
* @param {number} value - final computed value of the element
|
|
1357
|
+
*/
|
|
1358
|
+
after_add(name, value) {
|
|
1359
|
+
if (this.elements.includes(name)) {
|
|
1360
|
+
this.callback(name, value, null, null, "after_add");
|
|
1361
|
+
}
|
|
1362
|
+
}
|
|
1315
1363
|
};
|
|
1316
1364
|
|
|
1317
1365
|
// src/ac4_toc_parser.js
|
|
@@ -1423,8 +1471,8 @@ var Parser = class {
|
|
|
1423
1471
|
}
|
|
1424
1472
|
}
|
|
1425
1473
|
F_bitrate_indicator() {
|
|
1426
|
-
var bi;
|
|
1427
1474
|
var factor;
|
|
1475
|
+
var bi;
|
|
1428
1476
|
{
|
|
1429
1477
|
{
|
|
1430
1478
|
bi = this.BAM_source.get("", 3);
|
|
@@ -1454,12 +1502,12 @@ var Parser = class {
|
|
|
1454
1502
|
}
|
|
1455
1503
|
}
|
|
1456
1504
|
F_content_type() {
|
|
1505
|
+
var b_start_tag;
|
|
1457
1506
|
var b_serialized_language_tag;
|
|
1458
|
-
var
|
|
1507
|
+
var b_language_indicator;
|
|
1459
1508
|
var language_tag_chunk;
|
|
1509
|
+
var n_language_tag_bytes;
|
|
1460
1510
|
var language_tag_bytes;
|
|
1461
|
-
var b_language_indicator;
|
|
1462
|
-
var b_start_tag;
|
|
1463
1511
|
{
|
|
1464
1512
|
{
|
|
1465
1513
|
this.content_classifier = this.BAM_source.get("", 3);
|
|
@@ -1505,19 +1553,19 @@ var Parser = class {
|
|
|
1505
1553
|
}
|
|
1506
1554
|
}
|
|
1507
1555
|
F_ac4_substream_info_chan(asio_group_index, asio_gs_index, asio_b_substreams_present_chan) {
|
|
1508
|
-
var substream_index;
|
|
1509
|
-
var b_sf_multiplier;
|
|
1510
|
-
var b_bitrate_info;
|
|
1511
1556
|
var si_ch_mode;
|
|
1512
|
-
var si_channel_mode;
|
|
1513
1557
|
var top_channels_present;
|
|
1514
|
-
var b_4_back_channels_present;
|
|
1515
1558
|
var si_b_iframe;
|
|
1559
|
+
var si_channel_mode;
|
|
1560
|
+
var b_bitrate_info;
|
|
1561
|
+
var b_sf_multiplier;
|
|
1516
1562
|
var b_center_present;
|
|
1563
|
+
var add_ch_base;
|
|
1564
|
+
var b_4_back_channels_present;
|
|
1565
|
+
var sf_multiplier;
|
|
1566
|
+
var substream_index;
|
|
1517
1567
|
var b_lfe = null;
|
|
1518
1568
|
var b_lfe;
|
|
1519
|
-
var sf_multiplier;
|
|
1520
|
-
var add_ch_base;
|
|
1521
1569
|
{
|
|
1522
1570
|
{
|
|
1523
1571
|
this.F_define_channel_modes();
|
|
@@ -1754,18 +1802,18 @@ var Parser = class {
|
|
|
1754
1802
|
}
|
|
1755
1803
|
}
|
|
1756
1804
|
F_ac4_substream_info(si_b_associated, si_b_dialog, si_ps_index) {
|
|
1757
|
-
var
|
|
1805
|
+
var sf_multiplier;
|
|
1806
|
+
var b_associated_content;
|
|
1758
1807
|
var si_b_iframe;
|
|
1759
|
-
var
|
|
1808
|
+
var si_channel_mode;
|
|
1760
1809
|
var b_bitrate_info;
|
|
1810
|
+
var b_sf_multiplier;
|
|
1761
1811
|
var b_dialog_content;
|
|
1762
|
-
var
|
|
1812
|
+
var b_content_type;
|
|
1813
|
+
var add_ch_base;
|
|
1814
|
+
var substream_index;
|
|
1763
1815
|
var b_lfe = null;
|
|
1764
1816
|
var b_lfe;
|
|
1765
|
-
var sf_multiplier;
|
|
1766
|
-
var add_ch_base;
|
|
1767
|
-
var b_associated_content;
|
|
1768
|
-
var b_content_type;
|
|
1769
1817
|
{
|
|
1770
1818
|
{
|
|
1771
1819
|
this.F_define_channel_modes();
|
|
@@ -1961,10 +2009,10 @@ var Parser = class {
|
|
|
1961
2009
|
}
|
|
1962
2010
|
}
|
|
1963
2011
|
F_emdf_protection() {
|
|
1964
|
-
var
|
|
2012
|
+
var protection_bits_primary;
|
|
1965
2013
|
var protection_length_secondary;
|
|
2014
|
+
var protection_bits_secondary;
|
|
1966
2015
|
var protection_length_primary;
|
|
1967
|
-
var protection_bits_primary;
|
|
1968
2016
|
{
|
|
1969
2017
|
{
|
|
1970
2018
|
protection_length_primary = this.BAM_source.get("", 2);
|
|
@@ -2148,17 +2196,17 @@ var Parser = class {
|
|
|
2148
2196
|
}
|
|
2149
2197
|
}
|
|
2150
2198
|
F_oamd_common_data() {
|
|
2151
|
-
var add_data_bits;
|
|
2152
|
-
var ocd_p1;
|
|
2153
|
-
var add_data;
|
|
2154
|
-
var ocd_p0;
|
|
2155
|
-
var bits_used;
|
|
2156
|
-
var b_bed_object_chan_distribute;
|
|
2157
|
-
var master_screen_size_ratio;
|
|
2158
2199
|
var add_data_bytes_minus1;
|
|
2159
2200
|
var add_data_bytes;
|
|
2160
2201
|
var b_additional_data;
|
|
2202
|
+
var bits_used;
|
|
2203
|
+
var ocd_p1;
|
|
2204
|
+
var master_screen_size_ratio;
|
|
2205
|
+
var add_data;
|
|
2206
|
+
var b_bed_object_chan_distribute;
|
|
2207
|
+
var add_data_bits;
|
|
2161
2208
|
var b_default_screen_size_ratio;
|
|
2209
|
+
var ocd_p0;
|
|
2162
2210
|
{
|
|
2163
2211
|
{
|
|
2164
2212
|
b_default_screen_size_ratio = this.BAM_source.get("", 1);
|
|
@@ -2247,23 +2295,23 @@ var Parser = class {
|
|
|
2247
2295
|
}
|
|
2248
2296
|
}
|
|
2249
2297
|
F_ac4_substream_info_ajoc(asio_group_index, asio_gs_index_ajoc, asio_b_substreams_present) {
|
|
2250
|
-
var n_fullband_upmix_signals_minus1;
|
|
2251
|
-
var substream_index;
|
|
2252
2298
|
var b_oamd_common_data_present;
|
|
2299
|
+
var si_b_iframe;
|
|
2253
2300
|
var b_sf_multiplier;
|
|
2301
|
+
var si_channel_mode_j;
|
|
2254
2302
|
var b_bitrate_info;
|
|
2303
|
+
var sf_multiplier;
|
|
2304
|
+
var n_fullband_upmix_signals_minus1;
|
|
2305
|
+
var b_static_dmx;
|
|
2255
2306
|
var n_fullband_dmx_signals;
|
|
2307
|
+
var n_fullband_dmx_signals_minus1;
|
|
2256
2308
|
var n_fullband_upmix_signals;
|
|
2257
|
-
var si_b_iframe;
|
|
2258
2309
|
var num_objects_DYNAMIC = null;
|
|
2259
2310
|
var num_objects_DYNAMIC;
|
|
2311
|
+
var substream_index;
|
|
2260
2312
|
var ajoc_b_lfe;
|
|
2261
|
-
var n_fullband_dmx_signals_minus1;
|
|
2262
2313
|
var b_lfe = null;
|
|
2263
2314
|
var b_lfe;
|
|
2264
|
-
var si_channel_mode_j;
|
|
2265
|
-
var b_static_dmx;
|
|
2266
|
-
var sf_multiplier;
|
|
2267
2315
|
{
|
|
2268
2316
|
{
|
|
2269
2317
|
num_objects_DYNAMIC = this.BAM_g_table6.slice(0);
|
|
@@ -2481,18 +2529,18 @@ var Parser = class {
|
|
|
2481
2529
|
}
|
|
2482
2530
|
}
|
|
2483
2531
|
F_ac4_substream_group_info(si_group_index) {
|
|
2484
|
-
var obj_index;
|
|
2485
|
-
var b_dialog_content;
|
|
2486
|
-
var sus;
|
|
2487
|
-
var n_lf_substreams;
|
|
2488
|
-
var b_substreams_present;
|
|
2489
2532
|
var b_channel_coded;
|
|
2533
|
+
var sus_ver;
|
|
2490
2534
|
var b_ajoc;
|
|
2535
|
+
var sus;
|
|
2536
|
+
var b_dialog_content;
|
|
2491
2537
|
var n_lf_substreams_minus2;
|
|
2492
|
-
var
|
|
2538
|
+
var obj_index;
|
|
2539
|
+
var b_associated_content;
|
|
2493
2540
|
var b_oamd_substream;
|
|
2541
|
+
var n_lf_substreams;
|
|
2542
|
+
var b_substreams_present;
|
|
2494
2543
|
var b_content_type;
|
|
2495
|
-
var b_associated_content;
|
|
2496
2544
|
{
|
|
2497
2545
|
{
|
|
2498
2546
|
b_substreams_present = this.BAM_source.get("", 1);
|
|
@@ -2721,8 +2769,8 @@ var Parser = class {
|
|
|
2721
2769
|
}
|
|
2722
2770
|
}
|
|
2723
2771
|
F_oamd_substream_info(oamd_b_substreams_present) {
|
|
2724
|
-
var substream_index;
|
|
2725
2772
|
var b_iframe_oamd;
|
|
2773
|
+
var substream_index;
|
|
2726
2774
|
{
|
|
2727
2775
|
{
|
|
2728
2776
|
this.F_define_oamd();
|
|
@@ -2774,32 +2822,32 @@ var Parser = class {
|
|
|
2774
2822
|
}
|
|
2775
2823
|
}
|
|
2776
2824
|
F_ac4_substream_info_obj(asio_group_index, asio_gs_index, asio_gs_index_obj, asio_b_substreams_present) {
|
|
2777
|
-
var
|
|
2778
|
-
var b_nonstd_bed_channel_assignment;
|
|
2779
|
-
var res_bytes;
|
|
2780
|
-
var b_bed_start;
|
|
2781
|
-
var bed_chan_assign_code;
|
|
2782
|
-
var j;
|
|
2825
|
+
var si_b_lfe;
|
|
2783
2826
|
var si_b_iframe;
|
|
2784
|
-
var n_objs;
|
|
2785
|
-
var si_num_channels;
|
|
2786
2827
|
var reserved_data;
|
|
2787
|
-
var b_isf_start;
|
|
2788
2828
|
var n_objects_code;
|
|
2789
|
-
var
|
|
2790
|
-
var substream_index;
|
|
2829
|
+
var b_isf_start;
|
|
2791
2830
|
var b_sf_multiplier;
|
|
2792
|
-
var
|
|
2831
|
+
var obj_type;
|
|
2832
|
+
var b_bed_start;
|
|
2833
|
+
var j;
|
|
2834
|
+
var isf_config;
|
|
2835
|
+
var n_objs;
|
|
2836
|
+
var res_bytes;
|
|
2837
|
+
var b_ch_assign_code;
|
|
2793
2838
|
var b_dynamic_objects;
|
|
2839
|
+
var std_bed_channel_assignment_mask;
|
|
2840
|
+
var nonstd_bed_channel_assignment_mask;
|
|
2794
2841
|
var b_bitrate_info;
|
|
2842
|
+
var b_bed_objects;
|
|
2843
|
+
var bed_chan_assign_code;
|
|
2844
|
+
var sf_multiplier;
|
|
2845
|
+
var si_num_channels;
|
|
2795
2846
|
var b_isf;
|
|
2796
|
-
var
|
|
2797
|
-
var
|
|
2847
|
+
var b_nonstd_bed_channel_assignment;
|
|
2848
|
+
var substream_index;
|
|
2798
2849
|
var b_lfe = null;
|
|
2799
2850
|
var b_lfe;
|
|
2800
|
-
var std_bed_channel_assignment_mask;
|
|
2801
|
-
var sf_multiplier;
|
|
2802
|
-
var si_b_lfe;
|
|
2803
2851
|
{
|
|
2804
2852
|
{
|
|
2805
2853
|
n_objs = 0;
|
|
@@ -3094,23 +3142,23 @@ var Parser = class {
|
|
|
3094
3142
|
}
|
|
3095
3143
|
}
|
|
3096
3144
|
F_bed_dyn_obj_assignment(n_signals, b_upmix, bd_lfe) {
|
|
3145
|
+
var b_ch_assign_code;
|
|
3146
|
+
var b_chan_assign_mask;
|
|
3147
|
+
var std_bed_channel_assignment_mask;
|
|
3148
|
+
var lfe_signalled;
|
|
3149
|
+
var nonstd_bed_channel_assignment_mask;
|
|
3150
|
+
var obj_type;
|
|
3151
|
+
var b_is_isf;
|
|
3097
3152
|
var n_isf;
|
|
3153
|
+
var bed_ch_bits;
|
|
3154
|
+
var b_dyn_objects_only;
|
|
3155
|
+
var nonstd_bed_channel_assignment;
|
|
3098
3156
|
var isf_config;
|
|
3157
|
+
var bed_chan_assign_code;
|
|
3099
3158
|
var oc_num_channels;
|
|
3100
|
-
var obj_type;
|
|
3101
3159
|
var n_bed_signals_minus1;
|
|
3102
|
-
var b_nonstd_bed_channel_assignment;
|
|
3103
|
-
var nonstd_bed_channel_assignment;
|
|
3104
|
-
var bed_chan_assign_code;
|
|
3105
|
-
var nonstd_bed_channel_assignment_mask;
|
|
3106
|
-
var lfe_signalled;
|
|
3107
|
-
var b_is_isf;
|
|
3108
3160
|
var n_bed_signals;
|
|
3109
|
-
var
|
|
3110
|
-
var b_ch_assign_code;
|
|
3111
|
-
var std_bed_channel_assignment_mask;
|
|
3112
|
-
var b_dyn_objects_only;
|
|
3113
|
-
var b_chan_assign_mask;
|
|
3161
|
+
var b_nonstd_bed_channel_assignment;
|
|
3114
3162
|
var b;
|
|
3115
3163
|
{
|
|
3116
3164
|
{
|
|
@@ -3258,11 +3306,11 @@ var Parser = class {
|
|
|
3258
3306
|
}
|
|
3259
3307
|
}
|
|
3260
3308
|
F_ac4_presentation_substream_info(aps_presentation_version) {
|
|
3309
|
+
var b_alternative;
|
|
3310
|
+
var b_iframe_pres;
|
|
3261
3311
|
var substream_index;
|
|
3262
3312
|
var b_lfe = null;
|
|
3263
3313
|
var b_lfe;
|
|
3264
|
-
var b_alternative;
|
|
3265
|
-
var b_iframe_pres;
|
|
3266
3314
|
{
|
|
3267
3315
|
{
|
|
3268
3316
|
b_alternative = this.BAM_source.get("", 1);
|
|
@@ -3306,8 +3354,8 @@ var Parser = class {
|
|
|
3306
3354
|
}
|
|
3307
3355
|
}
|
|
3308
3356
|
F_presentation_version() {
|
|
3309
|
-
var val;
|
|
3310
3357
|
var b_tmp;
|
|
3358
|
+
var val;
|
|
3311
3359
|
{
|
|
3312
3360
|
{
|
|
3313
3361
|
val = 0;
|
|
@@ -3480,16 +3528,16 @@ var Parser = class {
|
|
|
3480
3528
|
}
|
|
3481
3529
|
}
|
|
3482
3530
|
F_define_channel_modes() {
|
|
3483
|
-
var CHANNEL_MODE_7X_34 = null;
|
|
3484
|
-
var CHANNEL_MODE_7X_34;
|
|
3485
|
-
var CHANNEL_MODE_7X_322 = null;
|
|
3486
|
-
var CHANNEL_MODE_7X_322;
|
|
3487
|
-
var CHANNEL_MODE_7X = null;
|
|
3488
|
-
var CHANNEL_MODE_7X;
|
|
3489
3531
|
var CHANNEL_MODE_7X_52 = null;
|
|
3490
3532
|
var CHANNEL_MODE_7X_52;
|
|
3491
3533
|
var CHANNEL_MODE_5X = null;
|
|
3492
3534
|
var CHANNEL_MODE_5X;
|
|
3535
|
+
var CHANNEL_MODE_7X_34 = null;
|
|
3536
|
+
var CHANNEL_MODE_7X_34;
|
|
3537
|
+
var CHANNEL_MODE_7X = null;
|
|
3538
|
+
var CHANNEL_MODE_7X;
|
|
3539
|
+
var CHANNEL_MODE_7X_322 = null;
|
|
3540
|
+
var CHANNEL_MODE_7X_322;
|
|
3493
3541
|
{
|
|
3494
3542
|
{
|
|
3495
3543
|
this.CHANNEL_MODE_MONO = 0;
|
|
@@ -3598,8 +3646,8 @@ var Parser = class {
|
|
|
3598
3646
|
}
|
|
3599
3647
|
}
|
|
3600
3648
|
F_variable_bits(n_bits) {
|
|
3601
|
-
var read;
|
|
3602
3649
|
var value;
|
|
3650
|
+
var read;
|
|
3603
3651
|
var b_read_more;
|
|
3604
3652
|
{
|
|
3605
3653
|
{
|
|
@@ -3637,9 +3685,9 @@ var Parser = class {
|
|
|
3637
3685
|
}
|
|
3638
3686
|
}
|
|
3639
3687
|
F_raw_ac4_frame_toc_only() {
|
|
3640
|
-
var ac4_toc_end;
|
|
3641
|
-
var ac4_toc_begin;
|
|
3642
3688
|
var frame_len_base;
|
|
3689
|
+
var ac4_toc_begin;
|
|
3690
|
+
var ac4_toc_end;
|
|
3643
3691
|
{
|
|
3644
3692
|
{
|
|
3645
3693
|
ac4_toc_begin = this.BAM_g_position;
|
|
@@ -3864,16 +3912,16 @@ var Parser = class {
|
|
|
3864
3912
|
}
|
|
3865
3913
|
}
|
|
3866
3914
|
F_substream_index_table() {
|
|
3867
|
-
var b_size_present;
|
|
3868
3915
|
var substream_type = null;
|
|
3869
3916
|
var substream_type;
|
|
3917
|
+
var b_size_present;
|
|
3918
|
+
var n_substreams;
|
|
3870
3919
|
var b_substream_type_known = null;
|
|
3871
3920
|
var b_substream_type_known;
|
|
3872
3921
|
var substream_size = null;
|
|
3873
3922
|
var substream_size;
|
|
3874
|
-
var n_substreams;
|
|
3875
|
-
var s;
|
|
3876
3923
|
var b_more_bits;
|
|
3924
|
+
var s;
|
|
3877
3925
|
{
|
|
3878
3926
|
{
|
|
3879
3927
|
n_substreams = this.BAM_source.get("", 2);
|
|
@@ -4232,21 +4280,21 @@ var Parser = class {
|
|
|
4232
4280
|
}
|
|
4233
4281
|
}
|
|
4234
4282
|
F_ac4_toc() {
|
|
4283
|
+
var payload_base;
|
|
4284
|
+
var program_uuid;
|
|
4235
4285
|
var b_wait_frames;
|
|
4286
|
+
var b_program_uuid_present;
|
|
4287
|
+
var b_payload_base;
|
|
4288
|
+
var short_program_id;
|
|
4236
4289
|
var payload_base_minus1;
|
|
4237
|
-
var
|
|
4290
|
+
var sequence_counter;
|
|
4238
4291
|
var wait_frames;
|
|
4239
|
-
var b_payload_base;
|
|
4240
|
-
var program_uuid;
|
|
4241
|
-
var total_n_substream_groups;
|
|
4242
|
-
var payload_base;
|
|
4243
|
-
var b_program_uuid_present;
|
|
4244
|
-
var b_single_presentation;
|
|
4245
4292
|
var b_iframe_global;
|
|
4246
|
-
var sequence_counter;
|
|
4247
|
-
var b_program_id;
|
|
4248
4293
|
var b_more_presentations;
|
|
4249
|
-
var
|
|
4294
|
+
var total_n_substream_groups;
|
|
4295
|
+
var n_presentations;
|
|
4296
|
+
var b_program_id;
|
|
4297
|
+
var b_single_presentation;
|
|
4250
4298
|
{
|
|
4251
4299
|
{
|
|
4252
4300
|
this.bitstream_version = this.BAM_source.get("", 2);
|
|
@@ -4365,6 +4413,7 @@ var Parser = class {
|
|
|
4365
4413
|
}
|
|
4366
4414
|
{
|
|
4367
4415
|
payload_base += this.v;
|
|
4416
|
+
this.BAM_sink.after_add("payload_base", payload_base);
|
|
4368
4417
|
}
|
|
4369
4418
|
}
|
|
4370
4419
|
}
|
|
@@ -4521,8 +4570,8 @@ var Parser = class {
|
|
|
4521
4570
|
}
|
|
4522
4571
|
}
|
|
4523
4572
|
F_frame_rate_multiply_info() {
|
|
4524
|
-
var multiplier_bit;
|
|
4525
4573
|
var b_multiplier;
|
|
4574
|
+
var multiplier_bit;
|
|
4526
4575
|
{
|
|
4527
4576
|
if (this.BAM_g_table14.slice(0).indexOf(this.frame_rate_index) >= 0) {
|
|
4528
4577
|
{
|
|
@@ -4566,9 +4615,9 @@ var Parser = class {
|
|
|
4566
4615
|
}
|
|
4567
4616
|
}
|
|
4568
4617
|
F_frame_rate_fractions_info() {
|
|
4569
|
-
var b_frame_rate_fraction_is_4;
|
|
4570
|
-
var frame_rate_fraction;
|
|
4571
4618
|
var b_frame_rate_fraction;
|
|
4619
|
+
var frame_rate_fraction;
|
|
4620
|
+
var b_frame_rate_fraction_is_4;
|
|
4572
4621
|
{
|
|
4573
4622
|
{
|
|
4574
4623
|
frame_rate_fraction = 1;
|
|
@@ -4639,6 +4688,7 @@ var parseTocElements = (data, elements) => {
|
|
|
4639
4688
|
try {
|
|
4640
4689
|
parser.F_raw_ac4_frame_toc_only();
|
|
4641
4690
|
} catch (err) {
|
|
4691
|
+
console.error(err);
|
|
4642
4692
|
parsedElements = null;
|
|
4643
4693
|
}
|
|
4644
4694
|
return parsedElements;
|
|
@@ -4649,19 +4699,27 @@ var PRESENTATION_LEVEL_WIDTH = 3;
|
|
|
4649
4699
|
var UNDECODABLE_PRESENTATION_LEVEL = 7;
|
|
4650
4700
|
var BITS_TO_SHIFT_TO_DIVIDE_BY_8 = 3;
|
|
4651
4701
|
var MINIMUM_PRESENTATIONS_AMOUNT = 2;
|
|
4652
|
-
var DIALOG_GAIN_ADJUSTMENT_FACTOR =
|
|
4702
|
+
var DIALOG_GAIN_ADJUSTMENT_FACTOR = 2;
|
|
4703
|
+
var MAX_PAYLOAD_BASE = 39;
|
|
4704
|
+
var PAYLOAD_BASE_EXTENDED_THRESHOLD = 31;
|
|
4705
|
+
var PAYLOAD_BASE_MINUS1_FIELD_WIDTH = 5;
|
|
4706
|
+
var PAYLOAD_BASE_EXTENSION_WIDTH = 3;
|
|
4707
|
+
var PAYLOAD_BASE_EXTENSION_RANGE_START = 32;
|
|
4708
|
+
var VARIABLE_BITS_CONTINUE_SIZE = 1;
|
|
4653
4709
|
var elementsToParse = [
|
|
4654
4710
|
PRESENTATION_LEVEL,
|
|
4655
4711
|
B_PRESENTATION_ID,
|
|
4656
4712
|
PRESENTATION_ID,
|
|
4657
4713
|
PAYLOAD_BASE_MINUS1,
|
|
4658
4714
|
BYTE_ALIGNMENT,
|
|
4659
|
-
AC4_TOC_END
|
|
4715
|
+
AC4_TOC_END,
|
|
4716
|
+
PAYLOAD_BASE
|
|
4660
4717
|
];
|
|
4661
4718
|
var processIsoBmffInitSegment = (parsedSegmentBuffer) => {
|
|
4662
4719
|
var _a, _b, _c, _d;
|
|
4663
4720
|
const movie = parsedSegmentBuffer.fetch(MOVIE);
|
|
4664
4721
|
const meta = parsedSegmentBuffer.fetch(META);
|
|
4722
|
+
console.log("ALPS::processIsoBmffSegment - found init segment");
|
|
4665
4723
|
const presentations = [];
|
|
4666
4724
|
const groupsList = meta && meta.boxes.find((box) => box.type === GROUPS_LIST);
|
|
4667
4725
|
const preselectionGroups = groupsList && groupsList.boxes.filter((box) => box.type === PRESELECTION_GROUP);
|
|
@@ -4709,21 +4767,32 @@ var processIsoBmffInitSegment = (parsedSegmentBuffer) => {
|
|
|
4709
4767
|
}
|
|
4710
4768
|
}
|
|
4711
4769
|
} else {
|
|
4770
|
+
console.log("ALPS::processIsoBmffSegment - no preselection group found");
|
|
4712
4771
|
}
|
|
4713
4772
|
return presentations;
|
|
4714
4773
|
};
|
|
4715
4774
|
var processIsoBmffMediaSegment = (parsedSegmentBuffer, activePresentationId) => {
|
|
4775
|
+
var _a;
|
|
4776
|
+
console.log("ALPS::processIsoBmffSegment - processing moof media. ActivePresentation: ".concat(activePresentationId));
|
|
4716
4777
|
const sampleOffsets = getSampleOffsets(parsedSegmentBuffer);
|
|
4778
|
+
console.log("ALPS::processIsoBmffSegment - obtained ".concat(sampleOffsets.length, " sample offsets"));
|
|
4717
4779
|
for (const sampleOffset of sampleOffsets) {
|
|
4718
4780
|
const sampleData = new DataView(parsedSegmentBuffer._raw.buffer, sampleOffset.offset, sampleOffset.size);
|
|
4719
4781
|
const parsedElements = parseTocElements(sampleData, elementsToParse);
|
|
4720
4782
|
if (parsedElements === null) {
|
|
4783
|
+
console.log("ALPS::processIsobmffSegment - parsing error");
|
|
4721
4784
|
return null;
|
|
4722
4785
|
}
|
|
4723
4786
|
const payloadBaseMinus1 = parsedElements.find((element) => element.name === PAYLOAD_BASE_MINUS1);
|
|
4724
4787
|
if (!payloadBaseMinus1) {
|
|
4788
|
+
console.log("ALPS::processIsobmffSegment - payloadBaseMinus1 field not found, returning unmodified buffer");
|
|
4725
4789
|
return null;
|
|
4726
4790
|
}
|
|
4791
|
+
let payloadBase = (_a = parsedElements.find((element) => element.name === PAYLOAD_BASE)) == null ? void 0 : _a.value;
|
|
4792
|
+
if (!payloadBase) {
|
|
4793
|
+
console.log("ALPS::processIsobmffSegment - payloadBase field not found");
|
|
4794
|
+
payloadBase = payloadBaseMinus1.value + 1;
|
|
4795
|
+
}
|
|
4727
4796
|
let accumulatedShift = 0;
|
|
4728
4797
|
const byteAlignment = parsedElements.find((element) => element.name === BYTE_ALIGNMENT);
|
|
4729
4798
|
if (byteAlignment) {
|
|
@@ -4741,6 +4810,7 @@ var processIsoBmffMediaSegment = (parsedSegmentBuffer, activePresentationId) =>
|
|
|
4741
4810
|
case PRESENTATION_ID: {
|
|
4742
4811
|
const lastPresentationOffset = presentationOffsets[presentationOffsets.length - 1];
|
|
4743
4812
|
if (presentationOffsets.length === 0) {
|
|
4813
|
+
console.error("Encountered a presentationID without a presentation");
|
|
4744
4814
|
}
|
|
4745
4815
|
if (element.handler === "before_call") {
|
|
4746
4816
|
lastPresentationOffset.presentationIdPos = element.pos;
|
|
@@ -4758,38 +4828,56 @@ var processIsoBmffMediaSegment = (parsedSegmentBuffer, activePresentationId) =>
|
|
|
4758
4828
|
break;
|
|
4759
4829
|
}
|
|
4760
4830
|
case PAYLOAD_BASE_MINUS1:
|
|
4831
|
+
case PAYLOAD_BASE:
|
|
4761
4832
|
case BYTE_ALIGNMENT:
|
|
4762
4833
|
case AC4_TOC_END: {
|
|
4763
4834
|
break;
|
|
4764
4835
|
}
|
|
4765
4836
|
default: {
|
|
4837
|
+
console.error("Unknown TOC parsed element: ".concat(element.name));
|
|
4766
4838
|
}
|
|
4767
4839
|
}
|
|
4768
4840
|
});
|
|
4769
4841
|
if (presentationOffsets.length < MINIMUM_PRESENTATIONS_AMOUNT) {
|
|
4842
|
+
console.log("ALPS::processIsobmffSegment - less then 2 presentations found");
|
|
4770
4843
|
return null;
|
|
4771
4844
|
}
|
|
4772
4845
|
if (presentationOffsets.some((presentation) => presentation.presentationId === void 0)) {
|
|
4846
|
+
console.error("Not every presentation carries an ID");
|
|
4773
4847
|
return null;
|
|
4774
4848
|
}
|
|
4775
4849
|
if (presentationOffsets.every((offset) => offset.presentationId !== activePresentationId)) {
|
|
4850
|
+
console.log("ALPS::processIsobmffSegment - activePresentationId not found in TOC");
|
|
4851
|
+
return null;
|
|
4852
|
+
}
|
|
4853
|
+
const availableAdditionalBytes = accumulatedShift >>> BITS_TO_SHIFT_TO_DIVIDE_BY_8;
|
|
4854
|
+
const newPayloadBase = payloadBase + availableAdditionalBytes;
|
|
4855
|
+
if (newPayloadBase > MAX_PAYLOAD_BASE) {
|
|
4856
|
+
console.error(
|
|
4857
|
+
"ALPS::processIsoBmffMediaSegment - newPayloadBase (".concat(newPayloadBase, ") exceeds the maximum supported value of ").concat(MAX_PAYLOAD_BASE)
|
|
4858
|
+
);
|
|
4776
4859
|
return null;
|
|
4777
4860
|
}
|
|
4861
|
+
if (newPayloadBase > PAYLOAD_BASE_EXTENDED_THRESHOLD && payloadBase <= PAYLOAD_BASE_EXTENDED_THRESHOLD) {
|
|
4862
|
+
const newAccumulatedShift = accumulatedShift - (PAYLOAD_BASE_EXTENSION_WIDTH + VARIABLE_BITS_CONTINUE_SIZE);
|
|
4863
|
+
const newAvailableAdditionalBytes = newAccumulatedShift >>> BITS_TO_SHIFT_TO_DIVIDE_BY_8;
|
|
4864
|
+
const newPayloadBaseAfterShift = payloadBase + newAvailableAdditionalBytes;
|
|
4865
|
+
if (newPayloadBaseAfterShift <= PAYLOAD_BASE_EXTENDED_THRESHOLD) {
|
|
4866
|
+
console.error(
|
|
4867
|
+
"ALPS::processIsoBmffMediaSegment - inserting the 4-bit payload_base extension header reduces available shift such that extended encoding is no longer required (adjusted newPayloadBase=".concat(newPayloadBaseAfterShift, "); this indicates a stream conformance error")
|
|
4868
|
+
);
|
|
4869
|
+
return null;
|
|
4870
|
+
}
|
|
4871
|
+
}
|
|
4778
4872
|
presentationOffsets.forEach((presentation) => {
|
|
4779
4873
|
const presentationId = presentation.presentationId;
|
|
4780
4874
|
if (presentation.width !== PRESENTATION_LEVEL_WIDTH) {
|
|
4875
|
+
console.warn("Presentation level has unexpected width: ".concat(presentation.width));
|
|
4781
4876
|
}
|
|
4782
4877
|
if (activePresentationId !== presentationId) {
|
|
4783
4878
|
setBits(sampleData, presentation.pos, presentation.width, UNDECODABLE_PRESENTATION_LEVEL);
|
|
4784
4879
|
}
|
|
4785
4880
|
});
|
|
4786
|
-
const availableAdditionalBytes = accumulatedShift >>> BITS_TO_SHIFT_TO_DIVIDE_BY_8;
|
|
4787
|
-
setBits(
|
|
4788
|
-
sampleData,
|
|
4789
|
-
payloadBaseMinus1.pos,
|
|
4790
|
-
payloadBaseMinus1.width,
|
|
4791
|
-
payloadBaseMinus1.value + availableAdditionalBytes
|
|
4792
|
-
);
|
|
4793
4881
|
bPresentationIds.forEach((bPresentationId) => {
|
|
4794
4882
|
setBits(sampleData, bPresentationId.pos, bPresentationId.width, 0);
|
|
4795
4883
|
});
|
|
@@ -4797,7 +4885,47 @@ var processIsoBmffMediaSegment = (parsedSegmentBuffer, activePresentationId) =>
|
|
|
4797
4885
|
const shiftWidth = ac4TocEnd.pos - presentation.presentationIdPos;
|
|
4798
4886
|
shiftLeft(sampleData, presentation.presentationIdPos, shiftWidth, presentation.presentationIdWidth);
|
|
4799
4887
|
});
|
|
4888
|
+
if (newPayloadBase <= PAYLOAD_BASE_EXTENDED_THRESHOLD) {
|
|
4889
|
+
setBits(
|
|
4890
|
+
sampleData,
|
|
4891
|
+
payloadBaseMinus1.pos,
|
|
4892
|
+
payloadBaseMinus1.width,
|
|
4893
|
+
payloadBaseMinus1.value + availableAdditionalBytes
|
|
4894
|
+
);
|
|
4895
|
+
} else if (payloadBase > PAYLOAD_BASE_EXTENDED_THRESHOLD) {
|
|
4896
|
+
setBits(
|
|
4897
|
+
sampleData,
|
|
4898
|
+
payloadBaseMinus1.pos + PAYLOAD_BASE_MINUS1_FIELD_WIDTH,
|
|
4899
|
+
PAYLOAD_BASE_EXTENSION_WIDTH,
|
|
4900
|
+
newPayloadBase - PAYLOAD_BASE_EXTENSION_RANGE_START
|
|
4901
|
+
);
|
|
4902
|
+
} else {
|
|
4903
|
+
const newAccumulatedShift = accumulatedShift - (PAYLOAD_BASE_EXTENSION_WIDTH + VARIABLE_BITS_CONTINUE_SIZE);
|
|
4904
|
+
const newAvailableAdditionalBytes = newAccumulatedShift >>> BITS_TO_SHIFT_TO_DIVIDE_BY_8;
|
|
4905
|
+
const newPayloadBaseAfterShift = payloadBase + newAvailableAdditionalBytes;
|
|
4906
|
+
const shiftWidth = ac4TocEnd.pos - payloadBaseMinus1.pos;
|
|
4907
|
+
shiftRight(
|
|
4908
|
+
sampleData,
|
|
4909
|
+
payloadBaseMinus1.pos,
|
|
4910
|
+
shiftWidth,
|
|
4911
|
+
PAYLOAD_BASE_EXTENSION_WIDTH + VARIABLE_BITS_CONTINUE_SIZE
|
|
4912
|
+
);
|
|
4913
|
+
setBits(sampleData, payloadBaseMinus1.pos, payloadBaseMinus1.width, PAYLOAD_BASE_EXTENDED_THRESHOLD);
|
|
4914
|
+
setBits(
|
|
4915
|
+
sampleData,
|
|
4916
|
+
payloadBaseMinus1.pos + PAYLOAD_BASE_MINUS1_FIELD_WIDTH,
|
|
4917
|
+
PAYLOAD_BASE_EXTENSION_WIDTH,
|
|
4918
|
+
newPayloadBaseAfterShift - PAYLOAD_BASE_EXTENSION_RANGE_START
|
|
4919
|
+
);
|
|
4920
|
+
setBits(
|
|
4921
|
+
sampleData,
|
|
4922
|
+
payloadBaseMinus1.pos + PAYLOAD_BASE_MINUS1_FIELD_WIDTH + PAYLOAD_BASE_EXTENSION_WIDTH,
|
|
4923
|
+
VARIABLE_BITS_CONTINUE_SIZE,
|
|
4924
|
+
0
|
|
4925
|
+
);
|
|
4926
|
+
}
|
|
4800
4927
|
}
|
|
4928
|
+
console.log("ALPS::processIsoBmffSegment - done");
|
|
4801
4929
|
return activePresentationId;
|
|
4802
4930
|
};
|
|
4803
4931
|
|
|
@@ -4809,7 +4937,7 @@ var SEGMENT_TYPES = {
|
|
|
4809
4937
|
};
|
|
4810
4938
|
import_codem_isoboxer.default.addBoxProcessor("diap", function() {
|
|
4811
4939
|
this._procFullBox();
|
|
4812
|
-
this._procField("dialog_gain", "int",
|
|
4940
|
+
this._procField("dialog_gain", "int", 8);
|
|
4813
4941
|
});
|
|
4814
4942
|
var _streams, _presentationsChangedEventHandler, _Alps_instances, initializeStream_fn;
|
|
4815
4943
|
var Alps = class {
|
|
@@ -4822,6 +4950,7 @@ var Alps = class {
|
|
|
4822
4950
|
__privateAdd(this, _streams, {});
|
|
4823
4951
|
/** @type {presentationsChangedCallback|undefined} */
|
|
4824
4952
|
__privateAdd(this, _presentationsChangedEventHandler);
|
|
4953
|
+
console.log("ALPS::constructor");
|
|
4825
4954
|
}
|
|
4826
4955
|
/**
|
|
4827
4956
|
* Get presentation and activePresentationId for all streams
|
|
@@ -4842,6 +4971,7 @@ var Alps = class {
|
|
|
4842
4971
|
* @param {presentationsChangedCallback} presentationsChangedEventHandler Callback function that will be called if the list of presentations changes
|
|
4843
4972
|
*/
|
|
4844
4973
|
setPresentationsChangedEventHandler(presentationsChangedEventHandler) {
|
|
4974
|
+
console.log("ALPS::setPresentationsChangedEventHandler");
|
|
4845
4975
|
__privateSet(this, _presentationsChangedEventHandler, presentationsChangedEventHandler);
|
|
4846
4976
|
}
|
|
4847
4977
|
/**
|
|
@@ -4851,6 +4981,9 @@ var Alps = class {
|
|
|
4851
4981
|
*/
|
|
4852
4982
|
getPresentations(streamId = null) {
|
|
4853
4983
|
__privateMethod(this, _Alps_instances, initializeStream_fn).call(this, streamId);
|
|
4984
|
+
console.log(
|
|
4985
|
+
"ALPS::getPresentations - List of presentations: ".concat(JSON.stringify(__privateGet(this, _streams)[streamId].presentations))
|
|
4986
|
+
);
|
|
4854
4987
|
return __privateGet(this, _streams)[streamId].presentations;
|
|
4855
4988
|
}
|
|
4856
4989
|
/**
|
|
@@ -4859,7 +4992,8 @@ var Alps = class {
|
|
|
4859
4992
|
* @returns {number|undefined} The ID of the active presentation, -1 if no presentation is set, undefined if no stream data exists
|
|
4860
4993
|
*/
|
|
4861
4994
|
getActivePresentationId(streamId = null) {
|
|
4862
|
-
var _b;
|
|
4995
|
+
var _a, _b;
|
|
4996
|
+
console.log("ALPS::getActivePresentation - activePresentation: ".concat((_a = __privateGet(this, _streams)[streamId]) == null ? void 0 : _a.activePresentationId));
|
|
4863
4997
|
return (_b = __privateGet(this, _streams)[streamId]) == null ? void 0 : _b.activePresentationId;
|
|
4864
4998
|
}
|
|
4865
4999
|
/**
|
|
@@ -4868,6 +5002,7 @@ var Alps = class {
|
|
|
4868
5002
|
* @param {string|null} streamId The ID of the stream, null for non-multi-period use
|
|
4869
5003
|
*/
|
|
4870
5004
|
setActivePresentationId(presentationId, streamId = null) {
|
|
5005
|
+
console.log("ALPS::setActivePresentation - new activePresentation: ".concat(presentationId));
|
|
4871
5006
|
__privateMethod(this, _Alps_instances, initializeStream_fn).call(this, streamId);
|
|
4872
5007
|
__privateGet(this, _streams)[streamId].activePresentationId = presentationId;
|
|
4873
5008
|
}
|
|
@@ -4879,6 +5014,7 @@ var Alps = class {
|
|
|
4879
5014
|
* @returns {ProcessIsoBmffSegmentResult} Data retrieved from processed segment
|
|
4880
5015
|
*/
|
|
4881
5016
|
processIsoBmffSegment(segmentBuffer, streamId = null, activePresentationId = void 0) {
|
|
5017
|
+
console.log("ALPS::processIsoBmffSegment");
|
|
4882
5018
|
let forcedPresentationId = null;
|
|
4883
5019
|
let presentations = null;
|
|
4884
5020
|
let segmentType = null;
|
|
@@ -4903,6 +5039,7 @@ var Alps = class {
|
|
|
4903
5039
|
);
|
|
4904
5040
|
segmentType = SEGMENT_TYPES.MEDIA;
|
|
4905
5041
|
}
|
|
5042
|
+
console.log("ALPS::processIsoBmffSegment - done");
|
|
4906
5043
|
return {
|
|
4907
5044
|
forcedPresentationId,
|
|
4908
5045
|
presentations,
|