rx-player 4.5.0-dev.2026033100 → 4.5.0-dev.2026041501
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/CHANGELOG.md +22 -5
- package/VERSION +1 -1
- package/dist/commonjs/__GENERATED_CODE/embedded_dash_wasm.d.ts.map +1 -1
- package/dist/commonjs/__GENERATED_CODE/embedded_dash_wasm.js +1 -1
- package/dist/commonjs/__GENERATED_CODE/embedded_worker.d.ts.map +1 -1
- package/dist/commonjs/__GENERATED_CODE/embedded_worker.js +1 -1
- package/dist/commonjs/compat/can_patch_out_pssh.d.ts +42 -0
- package/dist/commonjs/compat/can_patch_out_pssh.d.ts.map +1 -0
- package/dist/commonjs/compat/can_patch_out_pssh.js +53 -0
- package/dist/commonjs/compat/env_detector.d.ts +2 -0
- package/dist/commonjs/compat/env_detector.d.ts.map +1 -1
- package/dist/commonjs/compat/env_detector.js +5 -0
- package/dist/commonjs/core/adaptive/network_analyzer.d.ts +1 -2
- package/dist/commonjs/core/adaptive/network_analyzer.d.ts.map +1 -1
- package/dist/commonjs/core/adaptive/network_analyzer.js +3 -3
- package/dist/commonjs/core/adaptive/utils/representation_score_calculator.js +2 -2
- package/dist/commonjs/core/cmcd/cmcd_data_builder.d.ts.map +1 -1
- package/dist/commonjs/core/cmcd/cmcd_data_builder.js +9 -3
- package/dist/commonjs/core/entry/content_preparer.d.ts.map +1 -1
- package/dist/commonjs/core/entry/content_preparer.js +5 -7
- package/dist/commonjs/core/entry/core_entry.d.ts.map +1 -1
- package/dist/commonjs/core/entry/core_entry.js +6 -2
- package/dist/commonjs/core/entry/core_text_displayer_interface.js +3 -3
- package/dist/commonjs/core/fetchers/manifest/manifest_fetcher.d.ts.map +1 -1
- package/dist/commonjs/core/fetchers/manifest/manifest_fetcher.js +12 -0
- package/dist/commonjs/core/fetchers/thumbnails/thumbnail_fetcher.js +1 -1
- package/dist/commonjs/core/fetchers/utils/schedule_request.d.ts.map +1 -1
- package/dist/commonjs/core/fetchers/utils/schedule_request.js +4 -3
- package/dist/commonjs/core/segment_sinks/garbage_collector.d.ts +0 -2
- package/dist/commonjs/core/segment_sinks/garbage_collector.d.ts.map +1 -1
- package/dist/commonjs/core/segment_sinks/garbage_collector.js +0 -3
- package/dist/commonjs/core/segment_sinks/implementations/text/text_segment_sink.d.ts +1 -1
- package/dist/commonjs/core/segment_sinks/implementations/text/text_segment_sink.d.ts.map +1 -1
- package/dist/commonjs/core/segment_sinks/implementations/text/text_segment_sink.js +2 -2
- package/dist/commonjs/core/stream/adaptation/adaptation_stream.d.ts.map +1 -1
- package/dist/commonjs/core/stream/adaptation/adaptation_stream.js +6 -6
- package/dist/commonjs/core/stream/orchestrator/stream_orchestrator.d.ts.map +1 -1
- package/dist/commonjs/core/stream/orchestrator/stream_orchestrator.js +37 -40
- package/dist/commonjs/default_config.d.ts +5 -0
- package/dist/commonjs/default_config.d.ts.map +1 -1
- package/dist/commonjs/default_config.js +5 -0
- package/dist/commonjs/main_thread/api/public_api.d.ts.map +1 -1
- package/dist/commonjs/main_thread/api/public_api.js +23 -16
- package/dist/commonjs/main_thread/decrypt/content_decryptor.d.ts.map +1 -1
- package/dist/commonjs/main_thread/decrypt/content_decryptor.js +4 -1
- package/dist/commonjs/main_thread/decrypt/session_events_listener.js +1 -1
- package/dist/commonjs/main_thread/decrypt/set_server_certificate.d.ts +2 -0
- package/dist/commonjs/main_thread/decrypt/set_server_certificate.d.ts.map +1 -1
- package/dist/commonjs/main_thread/decrypt/set_server_certificate.js +4 -0
- package/dist/commonjs/main_thread/init/media_source_content_initializer.d.ts +0 -8
- package/dist/commonjs/main_thread/init/media_source_content_initializer.d.ts.map +1 -1
- package/dist/commonjs/main_thread/init/media_source_content_initializer.js +58 -50
- package/dist/commonjs/main_thread/init/utils/stream_events_emitter/stream_events_emitter.d.ts +35 -5
- package/dist/commonjs/main_thread/init/utils/stream_events_emitter/stream_events_emitter.d.ts.map +1 -1
- package/dist/commonjs/main_thread/init/utils/stream_events_emitter/stream_events_emitter.js +60 -19
- package/dist/commonjs/main_thread/render_thumbnail.d.ts.map +1 -1
- package/dist/commonjs/main_thread/render_thumbnail.js +4 -0
- package/dist/commonjs/main_thread/tracks_store/media_element_tracks_store.d.ts.map +1 -1
- package/dist/commonjs/main_thread/tracks_store/media_element_tracks_store.js +1 -0
- package/dist/commonjs/main_thread/tracks_store/tracks_store.d.ts +1 -1
- package/dist/commonjs/main_thread/tracks_store/tracks_store.js +1 -1
- package/dist/{es2017/parsers/containers/isobmff/take_pssh_out.d.ts → commonjs/parsers/containers/isobmff/extract_pssh.d.ts} +6 -4
- package/dist/commonjs/parsers/containers/isobmff/extract_pssh.d.ts.map +1 -0
- package/dist/commonjs/parsers/containers/isobmff/{take_pssh_out.js → extract_pssh.js} +22 -17
- package/dist/commonjs/parsers/containers/isobmff/index.d.ts +2 -2
- package/dist/commonjs/parsers/containers/isobmff/index.d.ts.map +1 -1
- package/dist/commonjs/parsers/containers/isobmff/index.js +4 -4
- package/dist/commonjs/playback_observer/core_playback_observer.d.ts +4 -4
- package/dist/commonjs/playback_observer/core_playback_observer.d.ts.map +1 -1
- package/dist/commonjs/playback_observer/media_element_playback_observer.d.ts +1 -2
- package/dist/commonjs/playback_observer/media_element_playback_observer.d.ts.map +1 -1
- package/dist/commonjs/transports/dash/segment_parser.js +1 -1
- package/dist/commonjs/transports/local/segment_parser.js +1 -1
- package/dist/commonjs/utils/test-utils.d.ts +30 -0
- package/dist/commonjs/utils/test-utils.d.ts.map +1 -0
- package/dist/commonjs/utils/test-utils.js +79 -0
- package/dist/es2017/__GENERATED_CODE/embedded_dash_wasm.d.ts.map +1 -1
- package/dist/es2017/__GENERATED_CODE/embedded_dash_wasm.js +1 -1
- package/dist/es2017/__GENERATED_CODE/embedded_worker.d.ts.map +1 -1
- package/dist/es2017/__GENERATED_CODE/embedded_worker.js +1 -1
- package/dist/es2017/compat/can_patch_out_pssh.d.ts +42 -0
- package/dist/es2017/compat/can_patch_out_pssh.d.ts.map +1 -0
- package/dist/es2017/compat/can_patch_out_pssh.js +50 -0
- package/dist/es2017/compat/env_detector.d.ts +2 -0
- package/dist/es2017/compat/env_detector.d.ts.map +1 -1
- package/dist/es2017/compat/env_detector.js +5 -0
- package/dist/es2017/core/adaptive/network_analyzer.d.ts +1 -2
- package/dist/es2017/core/adaptive/network_analyzer.d.ts.map +1 -1
- package/dist/es2017/core/adaptive/network_analyzer.js +3 -3
- package/dist/es2017/core/adaptive/utils/representation_score_calculator.js +2 -2
- package/dist/es2017/core/cmcd/cmcd_data_builder.d.ts.map +1 -1
- package/dist/es2017/core/cmcd/cmcd_data_builder.js +9 -3
- package/dist/es2017/core/entry/content_preparer.d.ts.map +1 -1
- package/dist/es2017/core/entry/content_preparer.js +3 -5
- package/dist/es2017/core/entry/core_entry.d.ts.map +1 -1
- package/dist/es2017/core/entry/core_entry.js +6 -2
- package/dist/es2017/core/entry/core_text_displayer_interface.js +3 -3
- package/dist/es2017/core/fetchers/manifest/manifest_fetcher.d.ts.map +1 -1
- package/dist/es2017/core/fetchers/manifest/manifest_fetcher.js +12 -0
- package/dist/es2017/core/fetchers/thumbnails/thumbnail_fetcher.js +1 -1
- package/dist/es2017/core/fetchers/utils/schedule_request.d.ts.map +1 -1
- package/dist/es2017/core/fetchers/utils/schedule_request.js +2 -3
- package/dist/es2017/core/segment_sinks/garbage_collector.d.ts +0 -2
- package/dist/es2017/core/segment_sinks/garbage_collector.d.ts.map +1 -1
- package/dist/es2017/core/segment_sinks/garbage_collector.js +0 -3
- package/dist/es2017/core/segment_sinks/implementations/text/text_segment_sink.d.ts +1 -1
- package/dist/es2017/core/segment_sinks/implementations/text/text_segment_sink.d.ts.map +1 -1
- package/dist/es2017/core/segment_sinks/implementations/text/text_segment_sink.js +2 -2
- package/dist/es2017/core/stream/adaptation/adaptation_stream.d.ts.map +1 -1
- package/dist/es2017/core/stream/adaptation/adaptation_stream.js +6 -6
- package/dist/es2017/core/stream/orchestrator/stream_orchestrator.d.ts.map +1 -1
- package/dist/es2017/core/stream/orchestrator/stream_orchestrator.js +40 -39
- package/dist/es2017/default_config.d.ts +5 -0
- package/dist/es2017/default_config.d.ts.map +1 -1
- package/dist/es2017/default_config.js +5 -0
- package/dist/es2017/main_thread/api/public_api.d.ts.map +1 -1
- package/dist/es2017/main_thread/api/public_api.js +20 -13
- package/dist/es2017/main_thread/decrypt/content_decryptor.d.ts.map +1 -1
- package/dist/es2017/main_thread/decrypt/content_decryptor.js +4 -1
- package/dist/es2017/main_thread/decrypt/session_events_listener.js +1 -1
- package/dist/es2017/main_thread/decrypt/set_server_certificate.d.ts +2 -0
- package/dist/es2017/main_thread/decrypt/set_server_certificate.d.ts.map +1 -1
- package/dist/es2017/main_thread/decrypt/set_server_certificate.js +4 -0
- package/dist/es2017/main_thread/init/media_source_content_initializer.d.ts +0 -8
- package/dist/es2017/main_thread/init/media_source_content_initializer.d.ts.map +1 -1
- package/dist/es2017/main_thread/init/media_source_content_initializer.js +58 -50
- package/dist/es2017/main_thread/init/utils/stream_events_emitter/stream_events_emitter.d.ts +35 -5
- package/dist/es2017/main_thread/init/utils/stream_events_emitter/stream_events_emitter.d.ts.map +1 -1
- package/dist/es2017/main_thread/init/utils/stream_events_emitter/stream_events_emitter.js +60 -19
- package/dist/es2017/main_thread/render_thumbnail.d.ts.map +1 -1
- package/dist/es2017/main_thread/render_thumbnail.js +4 -0
- package/dist/es2017/main_thread/tracks_store/media_element_tracks_store.d.ts.map +1 -1
- package/dist/es2017/main_thread/tracks_store/media_element_tracks_store.js +1 -0
- package/dist/es2017/main_thread/tracks_store/tracks_store.d.ts +1 -1
- package/dist/es2017/main_thread/tracks_store/tracks_store.js +1 -1
- package/dist/{commonjs/parsers/containers/isobmff/take_pssh_out.d.ts → es2017/parsers/containers/isobmff/extract_pssh.d.ts} +6 -4
- package/dist/es2017/parsers/containers/isobmff/extract_pssh.d.ts.map +1 -0
- package/dist/es2017/parsers/containers/isobmff/{take_pssh_out.js → extract_pssh.js} +21 -16
- package/dist/es2017/parsers/containers/isobmff/index.d.ts +2 -2
- package/dist/es2017/parsers/containers/isobmff/index.d.ts.map +1 -1
- package/dist/es2017/parsers/containers/isobmff/index.js +2 -2
- package/dist/es2017/playback_observer/core_playback_observer.d.ts +4 -4
- package/dist/es2017/playback_observer/core_playback_observer.d.ts.map +1 -1
- package/dist/es2017/playback_observer/media_element_playback_observer.d.ts +1 -2
- package/dist/es2017/playback_observer/media_element_playback_observer.d.ts.map +1 -1
- package/dist/es2017/transports/dash/segment_parser.js +2 -2
- package/dist/es2017/transports/local/segment_parser.js +2 -2
- package/dist/es2017/utils/test-utils.d.ts +30 -0
- package/dist/es2017/utils/test-utils.d.ts.map +1 -0
- package/dist/es2017/utils/test-utils.js +36 -0
- package/dist/mpd-parser.wasm +0 -0
- package/dist/worker.js +6 -6
- package/package.json +4 -2
- package/src/README.md +7 -7
- package/src/__GENERATED_CODE/embedded_dash_wasm.ts +1 -1
- package/src/__GENERATED_CODE/embedded_worker.ts +1 -1
- package/src/compat/__tests__/can_patch_out_pssh.test.ts +40 -0
- package/src/compat/can_patch_out_pssh.ts +53 -0
- package/src/compat/env_detector.ts +4 -0
- package/src/core/README.md +1 -1
- package/src/core/adaptive/README.md +3 -3
- package/src/core/adaptive/__tests__/adaptive_representation_selector.test.ts +181 -110
- package/src/core/adaptive/__tests__/guess_based_chooser.test.ts +229 -123
- package/src/core/adaptive/__tests__/mocks.ts +100 -0
- package/src/core/adaptive/__tests__/network_analyzer.test.ts +152 -59
- package/src/core/adaptive/network_analyzer.ts +4 -4
- package/src/core/adaptive/utils/__tests__/filter_by_bitrate.test.ts +11 -19
- package/src/core/adaptive/utils/__tests__/filter_by_resolution.test.ts +12 -12
- package/src/core/adaptive/utils/__tests__/last_estimate_storage.test.ts +25 -12
- package/src/core/adaptive/utils/__tests__/pending_requests_store.test.ts +13 -9
- package/src/core/adaptive/utils/__tests__/representation_score_calculator.test.ts +11 -11
- package/src/core/adaptive/utils/__tests__/select_optimal_representation.test.ts +13 -23
- package/src/core/adaptive/utils/representation_score_calculator.ts +2 -2
- package/src/core/cmcd/__tests__/cmcd_data_builder.test.ts +60 -15
- package/src/core/cmcd/cmcd_data_builder.ts +9 -3
- package/src/core/entry/README.md +2 -2
- package/src/core/entry/__tests__/core_text_displayer_interface.test.ts +20 -0
- package/src/core/entry/content_preparer.ts +2 -5
- package/src/core/entry/core_entry.ts +6 -2
- package/src/core/entry/core_text_displayer_interface.ts +3 -3
- package/src/core/fetchers/manifest/__tests__/manifest_fetcher.test.ts +52 -3
- package/src/core/fetchers/manifest/manifest_fetcher.ts +12 -0
- package/src/core/fetchers/thumbnails/__tests__/thumbnail_fetcher.test.ts +70 -0
- package/src/core/fetchers/thumbnails/thumbnail_fetcher.ts +1 -1
- package/src/core/fetchers/utils/schedule_request.ts +5 -3
- package/src/core/segment_sinks/__tests__/garbage_collector.test.ts +434 -0
- package/src/core/segment_sinks/__tests__/mocks.ts +49 -0
- package/src/core/segment_sinks/garbage_collector.ts +0 -3
- package/src/core/segment_sinks/implementations/text/__tests__/text_segment_sink.test.ts +177 -0
- package/src/core/segment_sinks/implementations/text/text_segment_sink.ts +2 -2
- package/src/core/segment_sinks/inventory/__tests__/buffered_history.test.ts +215 -0
- package/src/core/segment_sinks/inventory/__tests__/segment_inventory.test.ts +448 -0
- package/src/core/stream/adaptation/__tests__/adaptation_stream.test.ts +973 -0
- package/src/core/stream/adaptation/__tests__/get_representations_switch_strategy.test.ts +283 -374
- package/src/core/stream/adaptation/adaptation_stream.ts +6 -8
- package/src/core/stream/orchestrator/README.md +4 -4
- package/src/core/stream/orchestrator/__tests__/stream_orchestrator.test.ts +707 -0
- package/src/core/stream/orchestrator/stream_orchestrator.ts +41 -46
- package/src/core/stream/period/utils/__tests__/get_adaptation_switch_strategy.test.ts +290 -220
- package/src/core/stream/representation/__tests__/encryption_data_notifier.test.ts +93 -63
- package/src/core/stream/representation/utils/__tests__/append_segment_to_buffer.test.ts +106 -63
- package/src/core/stream/representation/utils/__tests__/check_for_discontinuity.test.ts +179 -204
- package/src/core/stream/representation/utils/__tests__/get_segment_priority.test.ts +7 -7
- package/src/core/stream/representation/utils/__tests__/push_init_segment.test.ts +103 -60
- package/src/core/stream/representation/utils/__tests__/push_media_segment.test.ts +231 -165
- package/src/default_config.ts +6 -0
- package/src/experimental/README.md +1 -1
- package/src/features/README.md +3 -3
- package/src/main_thread/api/README.md +6 -7
- package/src/main_thread/api/public_api.ts +16 -10
- package/src/main_thread/decrypt/README.md +4 -4
- package/src/main_thread/decrypt/__tests__/__global__/content_decryptor.test.ts +135 -0
- package/src/main_thread/decrypt/__tests__/__global__/get_license.test.ts +70 -0
- package/src/main_thread/decrypt/__tests__/__global__/server_certificate.test.ts +44 -0
- package/src/main_thread/decrypt/__tests__/__global__/utils.ts +2 -2
- package/src/main_thread/decrypt/content_decryptor.ts +6 -1
- package/src/main_thread/decrypt/session_events_listener.ts +1 -1
- package/src/main_thread/decrypt/set_server_certificate.ts +5 -0
- package/src/main_thread/init/media_source_content_initializer.ts +69 -55
- package/src/main_thread/init/utils/__tests__/stream_events_emitter.test.ts +175 -0
- package/src/main_thread/init/utils/stream_events_emitter/stream_events_emitter.ts +90 -26
- package/src/main_thread/render_thumbnail.ts +4 -0
- package/src/main_thread/tracks_store/README.md +12 -0
- package/src/main_thread/tracks_store/__tests__/media_element_tracks_store.test.ts +25 -18
- package/src/main_thread/tracks_store/media_element_tracks_store.ts +1 -0
- package/src/main_thread/tracks_store/tracks_store.ts +1 -1
- package/src/manifest/classes/__tests__/mocks.ts +202 -0
- package/src/parsers/containers/isobmff/__tests__/extract_pssh.test.ts +199 -0
- package/src/parsers/containers/isobmff/{take_pssh_out.ts → extract_pssh.ts} +21 -17
- package/src/parsers/containers/isobmff/index.ts +2 -2
- package/src/parsers/manifest/dash/wasm-parser/README.md +9 -9
- package/src/playback_observer/__tests__/mocks.ts +152 -0
- package/src/playback_observer/core_playback_observer.ts +4 -4
- package/src/playback_observer/media_element_playback_observer.ts +1 -1
- package/src/tools/README.md +2 -2
- package/src/transports/README.md +5 -5
- package/src/transports/dash/segment_parser.ts +2 -2
- package/src/transports/local/segment_parser.ts +2 -2
- package/src/transports/metaplaylist/README.md +4 -4
- package/src/utils/README.md +3 -3
- package/src/utils/test-utils.ts +50 -0
- package/dist/commonjs/core/entry/synchronize_sinks_on_observation.d.ts +0 -11
- package/dist/commonjs/core/entry/synchronize_sinks_on_observation.d.ts.map +0 -1
- package/dist/commonjs/core/entry/synchronize_sinks_on_observation.js +0 -20
- package/dist/commonjs/parsers/containers/isobmff/take_pssh_out.d.ts.map +0 -1
- package/dist/es2017/core/entry/synchronize_sinks_on_observation.d.ts +0 -11
- package/dist/es2017/core/entry/synchronize_sinks_on_observation.d.ts.map +0 -1
- package/dist/es2017/core/entry/synchronize_sinks_on_observation.js +0 -17
- package/dist/es2017/parsers/containers/isobmff/take_pssh_out.d.ts.map +0 -1
- package/src/core/adaptive/utils/__tests__/bandwith_estimator.test.ts +0 -117
- package/src/core/entry/synchronize_sinks_on_observation.ts +0 -22
|
@@ -69,7 +69,6 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
69
69
|
manifest: null,
|
|
70
70
|
mediaSourceInfo: null,
|
|
71
71
|
rebufferingController: null,
|
|
72
|
-
streamEventsEmitter: null,
|
|
73
72
|
initialTime: undefined,
|
|
74
73
|
autoPlay: undefined,
|
|
75
74
|
initialPlayPerformed: null,
|
|
@@ -206,17 +205,22 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
206
205
|
return;
|
|
207
206
|
}
|
|
208
207
|
let textDisplayer = null;
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
208
|
+
try {
|
|
209
|
+
if (this._settings.textTrackOptions.textTrackMode === "html" &&
|
|
210
|
+
features.htmlTextDisplayer !== null) {
|
|
211
|
+
assert(this._hasTextBufferFeature());
|
|
212
|
+
textDisplayer = new features.htmlTextDisplayer(mediaElement, this._settings.textTrackOptions.textTrackElement);
|
|
213
|
+
}
|
|
214
|
+
else if (features.nativeTextDisplayer !== null) {
|
|
215
|
+
assert(this._hasTextBufferFeature());
|
|
216
|
+
textDisplayer = new features.nativeTextDisplayer(mediaElement);
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
assert(!this._hasTextBufferFeature());
|
|
220
|
+
}
|
|
217
221
|
}
|
|
218
|
-
|
|
219
|
-
|
|
222
|
+
catch (err) {
|
|
223
|
+
log.error("Init", "failed to initialize text displayer", err instanceof Error ? err : "Unknown Error");
|
|
220
224
|
}
|
|
221
225
|
this._initCanceller.signal.register((err) => {
|
|
222
226
|
textDisplayer === null || textDisplayer === void 0 ? void 0 : textDisplayer.stop(err.reason);
|
|
@@ -234,12 +238,23 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
234
238
|
if (contentInfo !== null) {
|
|
235
239
|
contentInfo.contentDecryptor = contentDecryptor;
|
|
236
240
|
}
|
|
241
|
+
const streamEventsEmitter = new StreamEventsEmitter(playbackObserver);
|
|
242
|
+
streamEventsEmitter.addEventListener("event", (payload) => {
|
|
243
|
+
this.trigger("streamEvent", payload);
|
|
244
|
+
}, this._initCanceller.signal);
|
|
245
|
+
streamEventsEmitter.addEventListener("eventSkip", (payload) => {
|
|
246
|
+
this.trigger("streamEventSkip", payload);
|
|
247
|
+
}, this._initCanceller.signal);
|
|
248
|
+
this._initCanceller.signal.register((err) => {
|
|
249
|
+
streamEventsEmitter.stop(err.reason);
|
|
250
|
+
});
|
|
237
251
|
const playbackStartParams = {
|
|
238
252
|
mediaElement,
|
|
239
253
|
textDisplayer,
|
|
240
254
|
playbackObserver,
|
|
241
255
|
drmInitializationStatus,
|
|
242
256
|
mediaSourceStatus,
|
|
257
|
+
streamEventsEmitter,
|
|
243
258
|
};
|
|
244
259
|
mediaSourceStatus.onUpdate((msInitStatus, stopListeningMSStatus) => {
|
|
245
260
|
if (msInitStatus === 2 /* MediaSourceInitializationStatus.Attached */) {
|
|
@@ -316,10 +331,10 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
316
331
|
if (maximumPosition !== undefined) {
|
|
317
332
|
position = Math.min(maximumPosition, position);
|
|
318
333
|
}
|
|
319
|
-
this._reload(mediaElement, textDisplayer, playbackObserver, mediaSourceStatus, position, !isPaused);
|
|
334
|
+
this._reload(mediaElement, textDisplayer, playbackObserver, mediaSourceStatus, streamEventsEmitter, position, !isPaused);
|
|
320
335
|
};
|
|
321
336
|
const onmessage = (msgData) => {
|
|
322
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26
|
|
337
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26;
|
|
323
338
|
switch (msgData.type) {
|
|
324
339
|
case "attach-media-source" /* CoreMessageType.AttachMediaSource */: {
|
|
325
340
|
if (((_a = this._currentContentInfo) === null || _a === void 0 ? void 0 : _a.contentId) !== msgData.contentId) {
|
|
@@ -635,6 +650,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
635
650
|
return;
|
|
636
651
|
}
|
|
637
652
|
const manifest = msgData.value.manifest;
|
|
653
|
+
streamEventsEmitter.start(manifest);
|
|
638
654
|
this._currentContentInfo.manifest = manifest;
|
|
639
655
|
this._updateCodecSupport(manifest, mediaElement);
|
|
640
656
|
this._startPlaybackIfReady(playbackStartParams);
|
|
@@ -656,19 +672,19 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
656
672
|
// share it with Core and as such don't need to replicate the updates.
|
|
657
673
|
replicateUpdatesOnManifestMetadata(manifest, msgData.value.manifest, msgData.value.updates);
|
|
658
674
|
}
|
|
659
|
-
|
|
675
|
+
streamEventsEmitter.onManifestUpdate(manifest);
|
|
660
676
|
this._updateCodecSupport(manifest, mediaElement);
|
|
661
677
|
this.trigger("manifestUpdate", msgData.value.updates);
|
|
662
678
|
break;
|
|
663
679
|
}
|
|
664
680
|
case "update-playback-rate" /* CoreMessageType.UpdatePlaybackRate */:
|
|
665
|
-
if (((
|
|
681
|
+
if (((_11 = this._currentContentInfo) === null || _11 === void 0 ? void 0 : _11.contentId) !== msgData.contentId) {
|
|
666
682
|
return;
|
|
667
683
|
}
|
|
668
684
|
playbackObserver.setPlaybackRate(msgData.value);
|
|
669
685
|
break;
|
|
670
686
|
case "bitrate-estimate-change" /* CoreMessageType.BitrateEstimateChange */:
|
|
671
|
-
if (((
|
|
687
|
+
if (((_12 = this._currentContentInfo) === null || _12 === void 0 ? void 0 : _12.contentId) !== msgData.contentId) {
|
|
672
688
|
return;
|
|
673
689
|
}
|
|
674
690
|
this.trigger("bitrateEstimateChange", {
|
|
@@ -677,13 +693,13 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
677
693
|
});
|
|
678
694
|
break;
|
|
679
695
|
case "inband-event" /* CoreMessageType.InbandEvent */:
|
|
680
|
-
if (((
|
|
696
|
+
if (((_13 = this._currentContentInfo) === null || _13 === void 0 ? void 0 : _13.contentId) !== msgData.contentId) {
|
|
681
697
|
return;
|
|
682
698
|
}
|
|
683
699
|
this.trigger("inbandEvents", msgData.value);
|
|
684
700
|
break;
|
|
685
701
|
case "locked-stream" /* CoreMessageType.LockedStream */: {
|
|
686
|
-
if (((
|
|
702
|
+
if (((_14 = this._currentContentInfo) === null || _14 === void 0 ? void 0 : _14.contentId) !== msgData.contentId ||
|
|
687
703
|
this._currentContentInfo.manifest === null) {
|
|
688
704
|
return;
|
|
689
705
|
}
|
|
@@ -691,11 +707,11 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
691
707
|
if (period === undefined) {
|
|
692
708
|
return;
|
|
693
709
|
}
|
|
694
|
-
(
|
|
710
|
+
(_15 = this._currentContentInfo.rebufferingController) === null || _15 === void 0 ? void 0 : _15.onLockedStream(msgData.value.bufferType, period);
|
|
695
711
|
break;
|
|
696
712
|
}
|
|
697
713
|
case "period-stream-ready" /* CoreMessageType.PeriodStreamReady */: {
|
|
698
|
-
if (((
|
|
714
|
+
if (((_16 = this._currentContentInfo) === null || _16 === void 0 ? void 0 : _16.contentId) !== msgData.contentId ||
|
|
699
715
|
this._currentContentInfo.manifest === null) {
|
|
700
716
|
return;
|
|
701
717
|
}
|
|
@@ -752,7 +768,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
752
768
|
break;
|
|
753
769
|
}
|
|
754
770
|
case "period-stream-cleared" /* CoreMessageType.PeriodStreamCleared */: {
|
|
755
|
-
if (((
|
|
771
|
+
if (((_17 = this._currentContentInfo) === null || _17 === void 0 ? void 0 : _17.contentId) !== msgData.contentId ||
|
|
756
772
|
this._currentContentInfo.manifest === null) {
|
|
757
773
|
return;
|
|
758
774
|
}
|
|
@@ -763,7 +779,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
763
779
|
break;
|
|
764
780
|
}
|
|
765
781
|
case "discontinuity-update" /* CoreMessageType.DiscontinuityUpdate */: {
|
|
766
|
-
if (((
|
|
782
|
+
if (((_18 = this._currentContentInfo) === null || _18 === void 0 ? void 0 : _18.contentId) !== msgData.contentId ||
|
|
767
783
|
this._currentContentInfo.manifest === null) {
|
|
768
784
|
return;
|
|
769
785
|
}
|
|
@@ -774,7 +790,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
774
790
|
});
|
|
775
791
|
return;
|
|
776
792
|
}
|
|
777
|
-
(
|
|
793
|
+
(_19 = this._currentContentInfo.rebufferingController) === null || _19 === void 0 ? void 0 : _19.updateDiscontinuityInfo({
|
|
778
794
|
period,
|
|
779
795
|
bufferType: msgData.value.bufferType,
|
|
780
796
|
discontinuity: msgData.value.discontinuity,
|
|
@@ -783,7 +799,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
783
799
|
break;
|
|
784
800
|
}
|
|
785
801
|
case "push-text-data" /* CoreMessageType.PushTextData */: {
|
|
786
|
-
if (((
|
|
802
|
+
if (((_20 = this._currentContentInfo) === null || _20 === void 0 ? void 0 : _20.contentId) !== msgData.contentId) {
|
|
787
803
|
return;
|
|
788
804
|
}
|
|
789
805
|
if (textDisplayer === null) {
|
|
@@ -810,7 +826,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
810
826
|
break;
|
|
811
827
|
}
|
|
812
828
|
case "remove-text-data" /* CoreMessageType.RemoveTextData */: {
|
|
813
|
-
if (((
|
|
829
|
+
if (((_21 = this._currentContentInfo) === null || _21 === void 0 ? void 0 : _21.contentId) !== msgData.contentId) {
|
|
814
830
|
return;
|
|
815
831
|
}
|
|
816
832
|
if (textDisplayer === null) {
|
|
@@ -837,7 +853,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
837
853
|
break;
|
|
838
854
|
}
|
|
839
855
|
case "reset-text-displayer" /* CoreMessageType.ResetTextDisplayer */: {
|
|
840
|
-
if (((
|
|
856
|
+
if (((_22 = this._currentContentInfo) === null || _22 === void 0 ? void 0 : _22.contentId) !== msgData.contentId) {
|
|
841
857
|
return;
|
|
842
858
|
}
|
|
843
859
|
if (textDisplayer === null) {
|
|
@@ -849,7 +865,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
849
865
|
break;
|
|
850
866
|
}
|
|
851
867
|
case "stop-text-displayer" /* CoreMessageType.StopTextDisplayer */: {
|
|
852
|
-
if (((
|
|
868
|
+
if (((_23 = this._currentContentInfo) === null || _23 === void 0 ? void 0 : _23.contentId) !== msgData.contentId) {
|
|
853
869
|
return;
|
|
854
870
|
}
|
|
855
871
|
if (textDisplayer === null) {
|
|
@@ -877,7 +893,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
877
893
|
break;
|
|
878
894
|
case "needs-decipherability-flush" /* CoreMessageType.NeedsDecipherabilityFlush */:
|
|
879
895
|
{
|
|
880
|
-
if (((
|
|
896
|
+
if (((_24 = this._currentContentInfo) === null || _24 === void 0 ? void 0 : _24.contentId) !== msgData.contentId) {
|
|
881
897
|
return;
|
|
882
898
|
}
|
|
883
899
|
const keySystem = getKeySystemConfiguration(mediaElement);
|
|
@@ -899,7 +915,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
899
915
|
}
|
|
900
916
|
break;
|
|
901
917
|
case "segment-sink-store-update" /* CoreMessageType.SegmentSinkStoreUpdate */: {
|
|
902
|
-
if (((
|
|
918
|
+
if (((_25 = this._currentContentInfo) === null || _25 === void 0 ? void 0 : _25.contentId) !== msgData.contentId) {
|
|
903
919
|
return;
|
|
904
920
|
}
|
|
905
921
|
const sinkObj = this._awaitingRequests.pendingSinkMetrics.get(msgData.value.requestId);
|
|
@@ -919,7 +935,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
919
935
|
// Already handled by prepare's handler
|
|
920
936
|
break;
|
|
921
937
|
case "thumbnail-response" /* CoreMessageType.ThumbnailDataResponse */: {
|
|
922
|
-
if (((
|
|
938
|
+
if (((_26 = this._currentContentInfo) === null || _26 === void 0 ? void 0 : _26.contentId) !== msgData.contentId) {
|
|
923
939
|
return;
|
|
924
940
|
}
|
|
925
941
|
const tObj = this._awaitingRequests.pendingThumbnailFetching.get(msgData.value.requestId);
|
|
@@ -1147,11 +1163,12 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
1147
1163
|
features.htmlTextDisplayer !== null) ||
|
|
1148
1164
|
features.nativeTextDisplayer !== null);
|
|
1149
1165
|
}
|
|
1150
|
-
_reload(mediaElement, textDisplayer, playbackObserver, mediaSourceStatus, position, autoPlay) {
|
|
1166
|
+
_reload(mediaElement, textDisplayer, playbackObserver, mediaSourceStatus, streamEventsEmitter, position, autoPlay) {
|
|
1151
1167
|
this._currentMediaSourceCanceller.cancel("Init MediaSource Reload");
|
|
1152
1168
|
this._currentMediaSourceCanceller = new TaskCanceller("Init MediaSource");
|
|
1153
1169
|
this._currentMediaSourceCanceller.linkToSignal(this._initCanceller.signal);
|
|
1154
1170
|
mediaSourceStatus.setValue(1 /* MediaSourceInitializationStatus.AttachNow */);
|
|
1171
|
+
streamEventsEmitter.pause();
|
|
1155
1172
|
this.trigger("reloadingMediaSource", { position, autoPlay });
|
|
1156
1173
|
mediaSourceStatus.onUpdate((status, stopListeningMSStatusUpdates) => {
|
|
1157
1174
|
if (status !== 2 /* MediaSourceInitializationStatus.Attached */) {
|
|
@@ -1164,6 +1181,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
1164
1181
|
mediaElement,
|
|
1165
1182
|
textDisplayer,
|
|
1166
1183
|
playbackObserver,
|
|
1184
|
+
streamEventsEmitter,
|
|
1167
1185
|
}, this._currentMediaSourceCanceller.signal);
|
|
1168
1186
|
if (!this._currentMediaSourceCanceller.isUsed() &&
|
|
1169
1187
|
corePlaybackObserver !== null &&
|
|
@@ -1215,9 +1233,10 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
1215
1233
|
}
|
|
1216
1234
|
const { manifest, mediaSourceInfo } = this._currentContentInfo;
|
|
1217
1235
|
const { speed } = this._settings;
|
|
1218
|
-
const { initialTime, autoPlay, mediaElement, textDisplayer, playbackObserver } = parameters;
|
|
1236
|
+
const { initialTime, autoPlay, mediaElement, textDisplayer, playbackObserver, streamEventsEmitter, } = parameters;
|
|
1219
1237
|
this._currentContentInfo.initialTime = initialTime;
|
|
1220
1238
|
this._currentContentInfo.autoPlay = autoPlay;
|
|
1239
|
+
streamEventsEmitter.pause(); // Only start polling events once ready to play
|
|
1221
1240
|
const { autoPlayResult, initialPlayPerformed } = performInitialSeekAndPlay({
|
|
1222
1241
|
mediaElement,
|
|
1223
1242
|
playbackObserver,
|
|
@@ -1227,6 +1246,12 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
1227
1246
|
isDirectfile: false,
|
|
1228
1247
|
}, cancelSignal);
|
|
1229
1248
|
this._currentContentInfo.initialPlayPerformed = initialPlayPerformed;
|
|
1249
|
+
initialPlayPerformed.onUpdate((isPerformed, stopListening) => {
|
|
1250
|
+
if (isPerformed) {
|
|
1251
|
+
stopListening();
|
|
1252
|
+
streamEventsEmitter.resume(); // We can now start polling events
|
|
1253
|
+
}
|
|
1254
|
+
}, { clearSignal: cancelSignal, emitCurrentValue: true });
|
|
1230
1255
|
const corePlaybackObserver = createCorePlaybackObserver(playbackObserver, {
|
|
1231
1256
|
autoPlay,
|
|
1232
1257
|
initialPlayPerformed,
|
|
@@ -1251,24 +1276,6 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
1251
1276
|
});
|
|
1252
1277
|
rebufferingController.start();
|
|
1253
1278
|
this._currentContentInfo.rebufferingController = rebufferingController;
|
|
1254
|
-
const currentContentInfo = this._currentContentInfo;
|
|
1255
|
-
initialPlayPerformed.onUpdate((isPerformed, stopListening) => {
|
|
1256
|
-
if (isPerformed) {
|
|
1257
|
-
stopListening();
|
|
1258
|
-
const streamEventsEmitter = new StreamEventsEmitter(manifest, playbackObserver);
|
|
1259
|
-
currentContentInfo.streamEventsEmitter = streamEventsEmitter;
|
|
1260
|
-
streamEventsEmitter.addEventListener("event", (payload) => {
|
|
1261
|
-
this.trigger("streamEvent", payload);
|
|
1262
|
-
}, cancelSignal);
|
|
1263
|
-
streamEventsEmitter.addEventListener("eventSkip", (payload) => {
|
|
1264
|
-
this.trigger("streamEventSkip", payload);
|
|
1265
|
-
}, cancelSignal);
|
|
1266
|
-
streamEventsEmitter.start();
|
|
1267
|
-
cancelSignal.register((err) => {
|
|
1268
|
-
streamEventsEmitter.stop(err.reason);
|
|
1269
|
-
});
|
|
1270
|
-
}
|
|
1271
|
-
}, { clearSignal: cancelSignal, emitCurrentValue: true });
|
|
1272
1279
|
const _getSegmentSinkMetrics = async () => {
|
|
1273
1280
|
this._awaitingRequests.nextRequestId++;
|
|
1274
1281
|
const requestId = this._awaitingRequests.nextRequestId;
|
|
@@ -1389,6 +1396,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
1389
1396
|
mediaElement: parameters.mediaElement,
|
|
1390
1397
|
textDisplayer: parameters.textDisplayer,
|
|
1391
1398
|
playbackObserver: parameters.playbackObserver,
|
|
1399
|
+
streamEventsEmitter: parameters.streamEventsEmitter,
|
|
1392
1400
|
}, this._currentMediaSourceCanceller.signal);
|
|
1393
1401
|
if (this._currentMediaSourceCanceller.isUsed() || corePlaybackObserver === null) {
|
|
1394
1402
|
return true;
|
|
@@ -25,17 +25,42 @@ interface IStreamEventsEmitterEvent {
|
|
|
25
25
|
* Get events from manifest and emit each time an event has to be emitted
|
|
26
26
|
*/
|
|
27
27
|
export default class StreamEventsEmitter extends EventEmitter<IStreamEventsEmitterEvent> {
|
|
28
|
-
|
|
28
|
+
/** Regularly emit playback metrics such as the position. */
|
|
29
29
|
private _playbackObserver;
|
|
30
|
+
/** Current stream events tracked for the whole content. */
|
|
30
31
|
private _scheduledEventsRef;
|
|
32
|
+
/** Events currently considered active, to only emit their enter/exit once. */
|
|
31
33
|
private _eventsBeingPlayed;
|
|
34
|
+
/** Whether event evaluation is temporarily suspended, e.g. during a reload. */
|
|
35
|
+
private _isPaused;
|
|
36
|
+
/** Last observation used as comparison point for the next event check. */
|
|
37
|
+
private _previousObservation;
|
|
38
|
+
/** Cancels the current emitter lifecycle. */
|
|
32
39
|
private _canceller;
|
|
33
40
|
/**
|
|
34
|
-
* @param {Object} manifest
|
|
35
41
|
* @param {Object} playbackObserver
|
|
36
42
|
*/
|
|
37
|
-
constructor(
|
|
38
|
-
|
|
43
|
+
constructor(playbackObserver: IReadOnlyPlaybackObserver<IPlaybackObservation>);
|
|
44
|
+
/**
|
|
45
|
+
* Initialize the emitter for the given content manifest.
|
|
46
|
+
*
|
|
47
|
+
* The emitter starts in a paused state so the caller can resume it only once
|
|
48
|
+
* the corresponding media instance is actually ready.
|
|
49
|
+
* @param {Object} manifest
|
|
50
|
+
*/
|
|
51
|
+
start(manifest: IManifestMetadata): void;
|
|
52
|
+
/**
|
|
53
|
+
* Suspend event evaluation until `resume` has been called.
|
|
54
|
+
*
|
|
55
|
+
* To use when playback metrics should be temporarily ignored, for example
|
|
56
|
+
* while reloading a content.
|
|
57
|
+
*/
|
|
58
|
+
pause(): void;
|
|
59
|
+
/**
|
|
60
|
+
* Resume event evaluation from the current playback state.
|
|
61
|
+
*/
|
|
62
|
+
resume(): void;
|
|
63
|
+
/** Refresh the tracked stream-event list after a manifest update. */
|
|
39
64
|
onManifestUpdate(man: IManifestMetadata): void;
|
|
40
65
|
/**
|
|
41
66
|
* @param {string | undefined} reason - Human-inspectable reason behind the
|
|
@@ -43,9 +68,14 @@ export default class StreamEventsEmitter extends EventEmitter<IStreamEventsEmitt
|
|
|
43
68
|
* inspection.
|
|
44
69
|
*/
|
|
45
70
|
stop(reason: string | undefined): void;
|
|
71
|
+
/**
|
|
72
|
+
* Construct observation object relied on by the `StreamEventsEmitted` by
|
|
73
|
+
* generating it from this instance's `PlaybackObserver`.
|
|
74
|
+
*/
|
|
75
|
+
private _constructObservation;
|
|
46
76
|
/**
|
|
47
77
|
* Examine playback situation from playback observations to emit stream events and
|
|
48
|
-
* prepare
|
|
78
|
+
* prepare `onExit` callbacks if needed.
|
|
49
79
|
* @param {Array.<Object>} scheduledEvents
|
|
50
80
|
* @param {Object} oldObservation
|
|
51
81
|
* @param {Object} newObservation
|
package/dist/es2017/main_thread/init/utils/stream_events_emitter/stream_events_emitter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream_events_emitter.d.ts","sourceRoot":"","sources":["../../../../../../src/main_thread/init/utils/stream_events_emitter/stream_events_emitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"stream_events_emitter.d.ts","sourceRoot":"","sources":["../../../../../../src/main_thread/init/utils/stream_events_emitter/stream_events_emitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EACV,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,+BAA+B,CAAC;AAEvC,OAAO,YAAY,MAAM,iCAAiC,CAAC;AAK3D,OAAO,KAAK,EAEV,2BAA2B,EAC3B,kBAAkB,EAEnB,MAAM,SAAS,CAAC;AAEjB,UAAU,yBAAyB;IACjC,KAAK,EAAE,kBAAkB,GAAG,2BAA2B,CAAC;IACxD,SAAS,EAAE,kBAAkB,GAAG,2BAA2B,CAAC;CAC7D;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,YAAY,CAAC,yBAAyB,CAAC;IACtF,4DAA4D;IAC5D,OAAO,CAAC,iBAAiB,CAAkD;IAC3E,2DAA2D;IAC3D,OAAO,CAAC,mBAAmB,CAEzB;IACF,8EAA8E;IAC9E,OAAO,CAAC,kBAAkB,CAGxB;IACF,+EAA+E;IAC/E,OAAO,CAAC,SAAS,CAAU;IAC3B,0EAA0E;IAC1E,OAAO,CAAC,oBAAoB,CAKnB;IACT,6CAA6C;IAC7C,OAAO,CAAC,UAAU,CAAuB;IAEzC;;OAEG;gBACS,gBAAgB,EAAE,yBAAyB,CAAC,oBAAoB,CAAC;IAe7E;;;;;;OAMG;IACI,KAAK,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAsE/C;;;;;OAKG;IACI,KAAK,IAAI,IAAI;IAKpB;;OAEG;IACI,MAAM,IAAI,IAAI;IAQrB,qEAAqE;IAC9D,gBAAgB,CAAC,GAAG,EAAE,iBAAiB;IAK9C;;;;OAIG;IACI,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAY7C;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB;CAiE1B"}
|
|
@@ -23,28 +23,37 @@ import refreshScheduledEventsList from "./refresh_scheduled_events_list";
|
|
|
23
23
|
*/
|
|
24
24
|
export default class StreamEventsEmitter extends EventEmitter {
|
|
25
25
|
/**
|
|
26
|
-
* @param {Object} manifest
|
|
27
26
|
* @param {Object} playbackObserver
|
|
28
27
|
*/
|
|
29
|
-
constructor(
|
|
28
|
+
constructor(playbackObserver) {
|
|
30
29
|
super();
|
|
31
|
-
this._manifest = manifest;
|
|
32
30
|
this._playbackObserver = playbackObserver;
|
|
33
31
|
this._canceller = null;
|
|
34
32
|
this._scheduledEventsRef = new SharedReference([]);
|
|
35
33
|
this._eventsBeingPlayed = new WeakMap();
|
|
34
|
+
this._isPaused = true;
|
|
35
|
+
this._previousObservation = null;
|
|
36
36
|
}
|
|
37
|
-
|
|
37
|
+
/**
|
|
38
|
+
* Initialize the emitter for the given content manifest.
|
|
39
|
+
*
|
|
40
|
+
* The emitter starts in a paused state so the caller can resume it only once
|
|
41
|
+
* the corresponding media instance is actually ready.
|
|
42
|
+
* @param {Object} manifest
|
|
43
|
+
*/
|
|
44
|
+
start(manifest) {
|
|
38
45
|
if (this._canceller !== null) {
|
|
39
46
|
return;
|
|
40
47
|
}
|
|
41
48
|
this._canceller = new TaskCanceller("StreamEventsEmitter");
|
|
42
49
|
const cancelSignal = this._canceller.signal;
|
|
43
|
-
|
|
50
|
+
this._isPaused = true;
|
|
51
|
+
this._previousObservation = null;
|
|
52
|
+
this._eventsBeingPlayed = new WeakMap();
|
|
44
53
|
let isPollingEvents = false;
|
|
45
54
|
let cancelCurrentPolling = new TaskCanceller("StreamEventsEmitter Polling");
|
|
46
55
|
cancelCurrentPolling.linkToSignal(cancelSignal);
|
|
47
|
-
this._scheduledEventsRef.setValue(refreshScheduledEventsList([],
|
|
56
|
+
this._scheduledEventsRef.setValue(refreshScheduledEventsList([], manifest));
|
|
48
57
|
this._scheduledEventsRef.onUpdate(({ length: scheduledEventsLength }) => {
|
|
49
58
|
if (scheduledEventsLength === 0) {
|
|
50
59
|
if (isPollingEvents) {
|
|
@@ -59,30 +68,49 @@ export default class StreamEventsEmitter extends EventEmitter {
|
|
|
59
68
|
return;
|
|
60
69
|
}
|
|
61
70
|
isPollingEvents = true;
|
|
62
|
-
let oldObservation = constructObservation();
|
|
63
71
|
const checkStreamEvents = () => {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
72
|
+
if (this._isPaused) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const newObservation = this._constructObservation();
|
|
76
|
+
if (this._previousObservation === null) {
|
|
77
|
+
this._previousObservation = newObservation;
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
this._emitStreamEvents(this._scheduledEventsRef.getValue(), this._previousObservation, newObservation, cancelCurrentPolling.signal);
|
|
81
|
+
this._previousObservation = newObservation;
|
|
67
82
|
};
|
|
68
83
|
const { STREAM_EVENT_EMITTER_POLL_INTERVAL } = config.getCurrent();
|
|
69
84
|
const intervalId = setInterval(checkStreamEvents, STREAM_EVENT_EMITTER_POLL_INTERVAL);
|
|
70
|
-
|
|
85
|
+
this._playbackObserver.listen(checkStreamEvents, {
|
|
71
86
|
includeLastObservation: false,
|
|
72
87
|
clearSignal: cancelCurrentPolling.signal,
|
|
73
88
|
});
|
|
74
89
|
cancelCurrentPolling.signal.register(() => {
|
|
75
90
|
clearInterval(intervalId);
|
|
76
91
|
});
|
|
77
|
-
function constructObservation() {
|
|
78
|
-
var _a;
|
|
79
|
-
const lastObservation = playbackObserver.getReference().getValue();
|
|
80
|
-
const currentTime = (_a = playbackObserver.getCurrentTime()) !== null && _a !== void 0 ? _a : playbackObserver.getReference().getValue().position.getPolled();
|
|
81
|
-
const isSeeking = lastObservation.seeking !== 0 /* SeekingState.None */;
|
|
82
|
-
return { currentTime, isSeeking };
|
|
83
|
-
}
|
|
84
92
|
}, { emitCurrentValue: true, clearSignal: cancelSignal });
|
|
85
93
|
}
|
|
94
|
+
/**
|
|
95
|
+
* Suspend event evaluation until `resume` has been called.
|
|
96
|
+
*
|
|
97
|
+
* To use when playback metrics should be temporarily ignored, for example
|
|
98
|
+
* while reloading a content.
|
|
99
|
+
*/
|
|
100
|
+
pause() {
|
|
101
|
+
this._isPaused = true;
|
|
102
|
+
this._previousObservation = null;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Resume event evaluation from the current playback state.
|
|
106
|
+
*/
|
|
107
|
+
resume() {
|
|
108
|
+
this._isPaused = false;
|
|
109
|
+
// Take a snapshot right now to avoid comparing a post-reload position
|
|
110
|
+
// with a stale pre-reload observation.
|
|
111
|
+
this._previousObservation = this._constructObservation();
|
|
112
|
+
}
|
|
113
|
+
/** Refresh the tracked stream-event list after a manifest update. */
|
|
86
114
|
onManifestUpdate(man) {
|
|
87
115
|
const prev = this._scheduledEventsRef.getValue();
|
|
88
116
|
this._scheduledEventsRef.setValue(refreshScheduledEventsList(prev, man));
|
|
@@ -96,11 +124,24 @@ export default class StreamEventsEmitter extends EventEmitter {
|
|
|
96
124
|
if (this._canceller !== null) {
|
|
97
125
|
this._canceller.cancel(reason !== null && reason !== void 0 ? reason : "StreamEventsEmitter stop");
|
|
98
126
|
this._canceller = null;
|
|
127
|
+
this._previousObservation = null;
|
|
128
|
+
this._eventsBeingPlayed = new WeakMap();
|
|
99
129
|
}
|
|
100
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* Construct observation object relied on by the `StreamEventsEmitted` by
|
|
133
|
+
* generating it from this instance's `PlaybackObserver`.
|
|
134
|
+
*/
|
|
135
|
+
_constructObservation() {
|
|
136
|
+
var _a;
|
|
137
|
+
const lastObservation = this._playbackObserver.getReference().getValue();
|
|
138
|
+
const currentTime = (_a = this._playbackObserver.getCurrentTime()) !== null && _a !== void 0 ? _a : this._playbackObserver.getReference().getValue().position.getPolled();
|
|
139
|
+
const isSeeking = lastObservation.seeking !== 0 /* SeekingState.None */;
|
|
140
|
+
return { currentTime, isSeeking };
|
|
141
|
+
}
|
|
101
142
|
/**
|
|
102
143
|
* Examine playback situation from playback observations to emit stream events and
|
|
103
|
-
* prepare
|
|
144
|
+
* prepare `onExit` callbacks if needed.
|
|
104
145
|
* @param {Array.<Object>} scheduledEvents
|
|
105
146
|
* @param {Object} oldObservation
|
|
106
147
|
* @param {Object} newObservation
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render_thumbnail.d.ts","sourceRoot":"","sources":["../../../src/main_thread/render_thumbnail.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAKlE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAA8B,eAAe,CAC3C,YAAY,EAAE,sBAAsB,GAAG,IAAI,EAC3C,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"render_thumbnail.d.ts","sourceRoot":"","sources":["../../../src/main_thread/render_thumbnail.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAKlE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAA8B,eAAe,CAC3C,YAAY,EAAE,sBAAsB,GAAG,IAAI,EAC3C,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,IAAI,CAAC,CAmNf"}
|
|
@@ -155,6 +155,10 @@ export default async function renderThumbnail(contentInfos, options) {
|
|
|
155
155
|
const error = new ThumbnailRenderingError("ABORTED", "Thumbnail rendering has been aborted");
|
|
156
156
|
throw error;
|
|
157
157
|
}
|
|
158
|
+
if (srcError instanceof ThumbnailRenderingError) {
|
|
159
|
+
onFinished();
|
|
160
|
+
throw srcError;
|
|
161
|
+
}
|
|
158
162
|
const formattedErr = formatError(srcError, {
|
|
159
163
|
defaultCode: "NONE",
|
|
160
164
|
defaultReason: "Unknown error",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media_element_tracks_store.d.ts","sourceRoot":"","sources":["../../../../src/main_thread/tracks_store/media_element_tracks_store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;GAGG;AAEH,OAAO,KAAK,EAMV,aAAa,EACd,MAAM,0CAA0C,CAAC;AAGlD,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACX,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,YAAY,MAAM,2BAA2B,CAAC;AAIrD,qDAAqD;AACrD,UAAU,8BAA8B;IACtC,0BAA0B,EAAE,oBAAoB,EAAE,CAAC;IACnD,0BAA0B,EAAE,oBAAoB,EAAE,CAAC;IACnD,yBAAyB,EAAE,mBAAmB,EAAE,CAAC;IACjD,gBAAgB,EAAE,WAAW,GAAG,IAAI,CAAC;IACrC,gBAAgB,EAAE,WAAW,GAAG,IAAI,CAAC;IACrC,eAAe,EAAE,UAAU,GAAG,IAAI,CAAC;CACpC;AA8HD;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,uBAAwB,SAAQ,YAAY,CAAC,8BAA8B,CAAC;IAC/F,wEAAwE;IACxE,OAAO,CAAC,YAAY,CAGjB;IACH,uEAAuE;IACvE,OAAO,CAAC,WAAW,CAAuD;IAC1E,wEAAwE;IACxE,OAAO,CAAC,YAAY,CAGjB;IAEH,0CAA0C;IAC1C,OAAO,CAAC,4BAA4B,CAAuC;IAC3E,0CAA0C;IAC1C,OAAO,CAAC,4BAA4B,CAAuC;IAC3E,yCAAyC;IACzC,OAAO,CAAC,2BAA2B,CAA+B;IAElE,gEAAgE;IAChE,OAAO,CAAC,kBAAkB,CAAoC;IAC9D,gEAAgE;IAChE,OAAO,CAAC,kBAAkB,CAAoC;IAC9D,+DAA+D;IAC/D,OAAO,CAAC,iBAAiB,CAAmC;IAE5D;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB,CAAuC;IAElE;;;;;;;OAOG;IACH,OAAO,CAAC,kBAAkB,CAA+B;IAEzD;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB,CAAuC;gBAEtD,YAAY,EAAE,aAAa;IA6BvC;;;;;OAKG;IACI,iBAAiB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAYpD;;OAEG;IACI,gBAAgB,IAAI,IAAI;IAK/B;;;;;OAKG;IACI,gBAAgB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAiBnD;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAKhC;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAKhC;;;;;OAKG;IACI,iBAAiB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAYpD;;;;;OAKG;IACI,mBAAmB,IAAI,WAAW,GAAG,IAAI,GAAG,SAAS;IAO5D;;;;;OAKG;IACI,kBAAkB,IAAI,UAAU,GAAG,IAAI,GAAG,SAAS;IAO1D;;;;;OAKG;IACI,mBAAmB,IAAI,WAAW,GAAG,IAAI,GAAG,SAAS;IAO5D;;;OAGG;IACI,uBAAuB,IAAI,oBAAoB,EAAE;IAaxD;;;OAGG;IACI,sBAAsB,IAAI,mBAAmB,EAAE;IActD;;;OAGG;IACI,uBAAuB,IAAI,oBAAoB,EAAE;IAUxD;;OAEG;IACI,OAAO,IAAI,IAAI;IAsBtB;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IAgB7B;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IAgB7B;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IAgB5B;;;;OAIG;IACH,OAAO,CAAC,8BAA8B;IAmBtC;;;;OAIG;IACH,OAAO,CAAC,6BAA6B;IAsBrC;;;;OAIG;IACH,OAAO,CAAC,8BAA8B;IAiBtC;;;OAGG;IACH,OAAO,CAAC,4BAA4B;
|
|
1
|
+
{"version":3,"file":"media_element_tracks_store.d.ts","sourceRoot":"","sources":["../../../../src/main_thread/tracks_store/media_element_tracks_store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;GAGG;AAEH,OAAO,KAAK,EAMV,aAAa,EACd,MAAM,0CAA0C,CAAC;AAGlD,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACX,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,YAAY,MAAM,2BAA2B,CAAC;AAIrD,qDAAqD;AACrD,UAAU,8BAA8B;IACtC,0BAA0B,EAAE,oBAAoB,EAAE,CAAC;IACnD,0BAA0B,EAAE,oBAAoB,EAAE,CAAC;IACnD,yBAAyB,EAAE,mBAAmB,EAAE,CAAC;IACjD,gBAAgB,EAAE,WAAW,GAAG,IAAI,CAAC;IACrC,gBAAgB,EAAE,WAAW,GAAG,IAAI,CAAC;IACrC,eAAe,EAAE,UAAU,GAAG,IAAI,CAAC;CACpC;AA8HD;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,uBAAwB,SAAQ,YAAY,CAAC,8BAA8B,CAAC;IAC/F,wEAAwE;IACxE,OAAO,CAAC,YAAY,CAGjB;IACH,uEAAuE;IACvE,OAAO,CAAC,WAAW,CAAuD;IAC1E,wEAAwE;IACxE,OAAO,CAAC,YAAY,CAGjB;IAEH,0CAA0C;IAC1C,OAAO,CAAC,4BAA4B,CAAuC;IAC3E,0CAA0C;IAC1C,OAAO,CAAC,4BAA4B,CAAuC;IAC3E,yCAAyC;IACzC,OAAO,CAAC,2BAA2B,CAA+B;IAElE,gEAAgE;IAChE,OAAO,CAAC,kBAAkB,CAAoC;IAC9D,gEAAgE;IAChE,OAAO,CAAC,kBAAkB,CAAoC;IAC9D,+DAA+D;IAC/D,OAAO,CAAC,iBAAiB,CAAmC;IAE5D;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB,CAAuC;IAElE;;;;;;;OAOG;IACH,OAAO,CAAC,kBAAkB,CAA+B;IAEzD;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB,CAAuC;gBAEtD,YAAY,EAAE,aAAa;IA6BvC;;;;;OAKG;IACI,iBAAiB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAYpD;;OAEG;IACI,gBAAgB,IAAI,IAAI;IAK/B;;;;;OAKG;IACI,gBAAgB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAiBnD;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAKhC;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAKhC;;;;;OAKG;IACI,iBAAiB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAYpD;;;;;OAKG;IACI,mBAAmB,IAAI,WAAW,GAAG,IAAI,GAAG,SAAS;IAO5D;;;;;OAKG;IACI,kBAAkB,IAAI,UAAU,GAAG,IAAI,GAAG,SAAS;IAO1D;;;;;OAKG;IACI,mBAAmB,IAAI,WAAW,GAAG,IAAI,GAAG,SAAS;IAO5D;;;OAGG;IACI,uBAAuB,IAAI,oBAAoB,EAAE;IAaxD;;;OAGG;IACI,sBAAsB,IAAI,mBAAmB,EAAE;IActD;;;OAGG;IACI,uBAAuB,IAAI,oBAAoB,EAAE;IAUxD;;OAEG;IACI,OAAO,IAAI,IAAI;IAsBtB;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IAgB7B;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IAgB7B;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IAgB5B;;;;OAIG;IACH,OAAO,CAAC,8BAA8B;IAmBtC;;;;OAIG;IACH,OAAO,CAAC,6BAA6B;IAsBrC;;;;OAIG;IACH,OAAO,CAAC,8BAA8B;IAiBtC;;;OAGG;IACH,OAAO,CAAC,4BAA4B;IA8JpC;;;;OAIG;IACH,OAAO,CAAC,0BAA0B;CAMnC"}
|
|
@@ -487,6 +487,7 @@ export default class MediaElementTracksStore extends EventEmitter {
|
|
|
487
487
|
const newAudioTracks = createAudioTracks(this._nativeAudioTracks);
|
|
488
488
|
if (areTrackArraysDifferent(this._audioTracks, newAudioTracks)) {
|
|
489
489
|
this._audioTracks = newAudioTracks;
|
|
490
|
+
this._setPreviouslyLockedAudioTrack();
|
|
490
491
|
this.trigger("availableAudioTracksChange", this.getAvailableAudioTracks());
|
|
491
492
|
const chosenAudioTrack = this._getCurrentAudioTrack();
|
|
492
493
|
if ((chosenAudioTrack === null || chosenAudioTrack === void 0 ? void 0 : chosenAudioTrack.nativeTrack) !== this._lastEmittedNativeAudioTrack) {
|
|
@@ -271,7 +271,7 @@ export default class TracksStore extends EventEmitter<ITracksStoreEvents> {
|
|
|
271
271
|
* Period.
|
|
272
272
|
*
|
|
273
273
|
* Returns `null` is the the current audio track is disabled or not
|
|
274
|
-
* set yet.
|
|
274
|
+
* set yet.
|
|
275
275
|
*
|
|
276
276
|
* Returns `undefined` if the given Period's id is not currently found in the
|
|
277
277
|
* `TracksStore`. The cause being most probably that the corresponding
|
|
@@ -869,7 +869,7 @@ export default class TracksStore extends EventEmitter {
|
|
|
869
869
|
* Period.
|
|
870
870
|
*
|
|
871
871
|
* Returns `null` is the the current audio track is disabled or not
|
|
872
|
-
* set yet.
|
|
872
|
+
* set yet.
|
|
873
873
|
*
|
|
874
874
|
* Returns `undefined` if the given Period's id is not currently found in the
|
|
875
875
|
* `TracksStore`. The cause being most probably that the corresponding
|
|
@@ -21,15 +21,17 @@ export interface IISOBMFFPSSHInfo {
|
|
|
21
21
|
data: Uint8Array<ArrayBuffer>;
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
|
-
*
|
|
25
|
-
*
|
|
24
|
+
* Return every `pssh` box from an ISOBMFF segment.
|
|
25
|
+
*
|
|
26
|
+
* If the current device has no issue with it, also replace them by `free` boxes.
|
|
26
27
|
* Useful to manually manage encryption while avoiding the round-trip with the
|
|
27
28
|
* browser's encrypted event.
|
|
29
|
+
*
|
|
28
30
|
* @param {Uint8Array} data - the ISOBMFF segment
|
|
29
31
|
* @returns {Array.<Uint8Array>} - The extracted PSSH boxes. In the order they
|
|
30
32
|
* are encountered.
|
|
31
33
|
*/
|
|
32
|
-
export default function
|
|
34
|
+
export default function extractPssh(data: Uint8Array<ArrayBuffer>): IISOBMFFPSSHInfo[];
|
|
33
35
|
/**
|
|
34
36
|
* Parse systemId from a "pssh" box into an hexadecimal string.
|
|
35
37
|
* `undefined` if we could not extract a systemId.
|
|
@@ -39,4 +41,4 @@ export default function takePSSHOut(data: Uint8Array<ArrayBuffer>): IISOBMFFPSSH
|
|
|
39
41
|
* @returns {string|undefined}
|
|
40
42
|
*/
|
|
41
43
|
export declare function getPsshSystemID(buff: Uint8Array, initialDataOffset: number): string | undefined;
|
|
42
|
-
//# sourceMappingURL=
|
|
44
|
+
//# sourceMappingURL=extract_pssh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract_pssh.d.ts","sourceRoot":"","sources":["../../../../../src/parsers/containers/isobmff/extract_pssh.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,yCAAyC;AACzC,MAAM,WAAW,gBAAgB;IAC/B,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;CAC/B;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,gBAAgB,EAAE,CAmCrF;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,UAAU,EAChB,iBAAiB,EAAE,MAAM,GACxB,MAAM,GAAG,SAAS,CAWpB"}
|