rx-player 3.29.0 → 3.30.0-dev.2023011800
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 +23 -0
- package/VERSION +1 -1
- package/dist/_esm5.processed/compat/can_reuse_media_keys.d.ts +3 -2
- package/dist/_esm5.processed/compat/can_reuse_media_keys.js +5 -4
- package/dist/_esm5.processed/compat/eme/custom_media_keys/ie11_media_keys.js +16 -7
- package/dist/_esm5.processed/compat/event_listeners.d.ts +33 -56
- package/dist/_esm5.processed/compat/event_listeners.js +66 -116
- package/dist/_esm5.processed/compat/index.d.ts +1 -4
- package/dist/_esm5.processed/compat/index.js +1 -4
- package/dist/_esm5.processed/compat/on_height_width_change.d.ts +1 -1
- package/dist/_esm5.processed/compat/on_height_width_change.js +2 -2
- package/dist/_esm5.processed/config.d.ts +1 -0
- package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.d.ts +3 -1
- package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.js +27 -6
- package/dist/_esm5.processed/core/api/playback_observer.d.ts +8 -9
- package/dist/_esm5.processed/core/api/playback_observer.js +6 -7
- package/dist/_esm5.processed/core/api/public_api.d.ts +39 -41
- package/dist/_esm5.processed/core/api/public_api.js +569 -578
- package/dist/_esm5.processed/core/api/tracks_management/track_choice_manager.d.ts +9 -14
- package/dist/_esm5.processed/core/api/tracks_management/track_choice_manager.js +73 -43
- package/dist/_esm5.processed/core/api/utils.d.ts +15 -10
- package/dist/_esm5.processed/core/api/utils.js +84 -19
- package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.d.ts +22 -5
- package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.js +97 -25
- package/dist/_esm5.processed/core/decrypt/attach_media_keys.d.ts +3 -2
- package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +3 -2
- package/dist/_esm5.processed/core/decrypt/clear_on_stop.d.ts +1 -1
- package/dist/_esm5.processed/core/decrypt/clear_on_stop.js +1 -1
- package/dist/_esm5.processed/core/decrypt/content_decryptor.js +12 -20
- package/dist/_esm5.processed/core/decrypt/create_session.js +1 -1
- package/dist/_esm5.processed/core/decrypt/find_key_system.js +35 -13
- package/dist/_esm5.processed/core/decrypt/get_media_keys.js +1 -1
- package/dist/_esm5.processed/core/decrypt/session_events_listener.d.ts +32 -31
- package/dist/_esm5.processed/core/decrypt/session_events_listener.js +291 -160
- package/dist/_esm5.processed/core/decrypt/set_server_certificate.d.ts +1 -1
- package/dist/_esm5.processed/core/decrypt/set_server_certificate.js +1 -1
- package/dist/_esm5.processed/core/decrypt/types.d.ts +0 -6
- package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.d.ts +1 -1
- package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +1 -1
- package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +1 -1
- package/dist/_esm5.processed/core/fetchers/index.d.ts +2 -2
- package/dist/_esm5.processed/core/fetchers/manifest/index.d.ts +2 -2
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.d.ts +153 -89
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +419 -144
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.d.ts +0 -24
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +0 -24
- package/dist/_esm5.processed/core/init/{initialize_directfile.d.ts → directfile_content_initializer.d.ts} +13 -16
- package/dist/_esm5.processed/core/init/directfile_content_initializer.js +196 -0
- package/dist/_esm5.processed/core/init/index.d.ts +2 -2
- package/dist/_esm5.processed/core/init/index.js +2 -2
- package/dist/_esm5.processed/core/init/media_source_content_initializer.d.ts +181 -0
- package/dist/_esm5.processed/core/init/media_source_content_initializer.js +576 -0
- package/dist/_esm5.processed/core/init/types.d.ts +203 -64
- package/dist/_esm5.processed/core/init/types.js +36 -1
- package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.d.ts +164 -0
- package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.js +484 -0
- package/dist/_esm5.processed/core/init/{create_media_source.d.ts → utils/create_media_source.d.ts} +8 -4
- package/dist/_esm5.processed/core/init/utils/create_media_source.js +118 -0
- package/dist/_esm5.processed/core/init/{create_stream_playback_observer.d.ts → utils/create_stream_playback_observer.d.ts} +4 -4
- package/dist/_esm5.processed/core/init/{create_stream_playback_observer.js → utils/create_stream_playback_observer.js} +2 -5
- package/dist/_esm5.processed/core/init/{end_of_stream.d.ts → utils/end_of_stream.d.ts} +5 -5
- package/dist/_esm5.processed/core/init/utils/end_of_stream.js +85 -0
- package/dist/_esm5.processed/core/init/{get_initial_time.d.ts → utils/get_initial_time.d.ts} +1 -1
- package/dist/_esm5.processed/core/init/{get_initial_time.js → utils/get_initial_time.js} +3 -3
- package/dist/_esm5.processed/core/init/{emit_loaded_event.d.ts → utils/get_loaded_reference.d.ts} +9 -9
- package/dist/_esm5.processed/core/init/{emit_loaded_event.js → utils/get_loaded_reference.js} +23 -17
- package/dist/_esm5.processed/core/init/utils/initial_seek_and_play.d.ts +63 -0
- package/dist/_esm5.processed/core/init/utils/initial_seek_and_play.js +124 -0
- package/dist/_esm5.processed/core/init/utils/initialize_content_decryption.d.ts +80 -0
- package/dist/_esm5.processed/core/init/utils/initialize_content_decryption.js +111 -0
- package/dist/_esm5.processed/core/init/{media_duration_updater.d.ts → utils/media_duration_updater.d.ts} +3 -3
- package/dist/_esm5.processed/core/init/{media_duration_updater.js → utils/media_duration_updater.js} +115 -41
- package/dist/_esm5.processed/core/init/utils/rebuffering_controller.d.ts +113 -0
- package/dist/_esm5.processed/core/init/utils/rebuffering_controller.js +483 -0
- package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/are_same_stream_events.d.ts +0 -0
- package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/are_same_stream_events.js +0 -0
- package/dist/_esm5.processed/core/{stream/types.js → init/utils/stream_events_emitter/index.d.ts} +3 -1
- package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/index.js +0 -0
- package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/refresh_scheduled_events_list.d.ts +1 -1
- package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/refresh_scheduled_events_list.js +0 -0
- package/dist/_esm5.processed/core/init/utils/stream_events_emitter/stream_events_emitter.d.ts +30 -0
- package/dist/_esm5.processed/core/init/utils/stream_events_emitter/stream_events_emitter.js +155 -0
- package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/types.d.ts +1 -13
- package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/types.js +0 -0
- package/dist/_esm5.processed/core/init/{throw_on_media_error.d.ts → utils/throw_on_media_error.d.ts} +5 -5
- package/dist/_esm5.processed/core/init/{throw_on_media_error.js → utils/throw_on_media_error.js} +19 -15
- package/dist/_esm5.processed/core/segment_buffers/garbage_collector.d.ts +0 -1
- package/dist/_esm5.processed/core/segment_buffers/garbage_collector.js +0 -1
- package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.d.ts +0 -5
- package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +0 -5
- package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.d.ts +3 -3
- package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.js +3 -3
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.d.ts +1 -1
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +1 -1
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +25 -130
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +188 -117
- package/dist/_esm5.processed/core/stream/adaptation/index.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/adaptation/index.js +1 -0
- package/dist/_esm5.processed/core/stream/adaptation/types.d.ts +172 -0
- package/dist/_esm5.processed/core/stream/adaptation/types.js +1 -0
- package/dist/_esm5.processed/core/stream/adaptation/{create_representation_estimator.d.ts → utils/create_representation_estimator.d.ts} +6 -6
- package/dist/_esm5.processed/core/stream/adaptation/{create_representation_estimator.js → utils/create_representation_estimator.js} +3 -4
- package/dist/_esm5.processed/core/stream/index.d.ts +4 -3
- package/dist/_esm5.processed/core/stream/index.js +0 -1
- package/dist/_esm5.processed/core/stream/orchestrator/index.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +142 -17
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +303 -229
- package/dist/_esm5.processed/core/stream/period/index.d.ts +2 -3
- package/dist/_esm5.processed/core/stream/period/index.js +1 -0
- package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +27 -62
- package/dist/_esm5.processed/core/stream/period/period_stream.js +278 -105
- package/dist/_esm5.processed/core/stream/period/types.d.ts +110 -0
- package/dist/_esm5.processed/core/stream/period/types.js +1 -0
- package/dist/_esm5.processed/core/stream/period/{get_adaptation_switch_strategy.d.ts → utils/get_adaptation_switch_strategy.d.ts} +3 -3
- package/dist/_esm5.processed/core/stream/period/{get_adaptation_switch_strategy.js → utils/get_adaptation_switch_strategy.js} +3 -3
- package/dist/_esm5.processed/core/stream/representation/index.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/representation/index.js +1 -0
- package/dist/_esm5.processed/core/stream/representation/representation_stream.d.ts +32 -121
- package/dist/_esm5.processed/core/stream/representation/representation_stream.js +210 -136
- package/dist/_esm5.processed/core/stream/representation/types.d.ts +267 -0
- package/dist/_esm5.processed/core/stream/representation/types.js +1 -0
- package/dist/_esm5.processed/core/stream/representation/{append_segment_to_buffer.d.ts → utils/append_segment_to_buffer.d.ts} +5 -5
- package/dist/_esm5.processed/core/stream/representation/{append_segment_to_buffer.js → utils/append_segment_to_buffer.js} +8 -3
- package/dist/_esm5.processed/core/stream/representation/{check_for_discontinuity.d.ts → utils/check_for_discontinuity.d.ts} +2 -2
- package/dist/_esm5.processed/core/stream/representation/{check_for_discontinuity.js → utils/check_for_discontinuity.js} +1 -1
- package/dist/_esm5.processed/core/stream/representation/{downloading_queue.d.ts → utils/downloading_queue.d.ts} +85 -80
- package/dist/_esm5.processed/core/stream/representation/utils/downloading_queue.js +378 -0
- package/dist/_esm5.processed/core/stream/representation/{force_garbage_collection.d.ts → utils/force_garbage_collection.d.ts} +2 -2
- package/dist/_esm5.processed/core/stream/representation/{force_garbage_collection.js → utils/force_garbage_collection.js} +3 -3
- package/dist/_esm5.processed/core/stream/representation/{get_buffer_status.d.ts → utils/get_buffer_status.d.ts} +3 -3
- package/dist/_esm5.processed/core/stream/representation/{get_buffer_status.js → utils/get_buffer_status.js} +3 -3
- package/dist/_esm5.processed/core/stream/representation/{get_needed_segments.d.ts → utils/get_needed_segments.d.ts} +3 -3
- package/dist/_esm5.processed/core/stream/representation/{get_needed_segments.js → utils/get_needed_segments.js} +4 -5
- package/dist/_esm5.processed/core/stream/representation/{get_segment_priority.d.ts → utils/get_segment_priority.d.ts} +0 -0
- package/dist/_esm5.processed/core/stream/representation/{get_segment_priority.js → utils/get_segment_priority.js} +1 -1
- package/dist/_esm5.processed/core/stream/representation/{push_init_segment.d.ts → utils/push_init_segment.d.ts} +9 -12
- package/dist/_esm5.processed/core/stream/representation/utils/push_init_segment.js +85 -0
- package/dist/_esm5.processed/core/stream/representation/{push_media_segment.d.ts → utils/push_media_segment.d.ts} +9 -12
- package/dist/_esm5.processed/core/stream/representation/utils/push_media_segment.js +109 -0
- package/dist/_esm5.processed/default_config.d.ts +10 -0
- package/dist/_esm5.processed/default_config.js +12 -1
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.js +1 -1
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/remove_buffer_around_time.d.ts +1 -1
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/remove_buffer_around_time.js +1 -1
- package/dist/_esm5.processed/experimental/tools/createMetaplaylist/get_duration_from_manifest.d.ts +2 -3
- package/dist/_esm5.processed/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +107 -59
- package/dist/_esm5.processed/experimental/tools/createMetaplaylist/index.js +6 -7
- package/dist/_esm5.processed/features/initialize_features.js +1 -1
- package/dist/_esm5.processed/features/list/directfile.js +1 -1
- package/dist/_esm5.processed/features/types.d.ts +2 -3
- package/dist/_esm5.processed/manifest/adaptation.d.ts +7 -0
- package/dist/_esm5.processed/manifest/adaptation.js +3 -0
- package/dist/_esm5.processed/manifest/manifest.d.ts +2 -1
- package/dist/_esm5.processed/manifest/manifest.js +4 -3
- package/dist/_esm5.processed/manifest/update_period_in_place.d.ts +26 -1
- package/dist/_esm5.processed/manifest/update_period_in_place.js +58 -7
- package/dist/_esm5.processed/manifest/update_periods.d.ts +19 -2
- package/dist/_esm5.processed/manifest/update_periods.js +62 -18
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +3 -0
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.js +1 -0
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +1 -0
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +7 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +16 -0
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +63 -25
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +3 -0
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +60 -6
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +39 -13
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +7 -3
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/SegmentBase.js +5 -0
- package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +3 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.d.ts +0 -1
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +0 -1
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/SegmentBase.js +5 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/SegmentTemplate.js +6 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/types.d.ts +2 -1
- package/dist/_esm5.processed/parsers/manifest/types.d.ts +13 -2
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/create_element.js +7 -0
- package/dist/_esm5.processed/public_types.d.ts +2 -0
- package/dist/_esm5.processed/transports/dash/manifest_parser.js +2 -2
- package/dist/_esm5.processed/transports/dash/segment_loader.js +1 -1
- package/dist/_esm5.processed/transports/dash/text_parser.js +3 -3
- package/dist/_esm5.processed/transports/local/segment_loader.js +1 -1
- package/dist/_esm5.processed/utils/event_emitter.d.ts +3 -13
- package/dist/_esm5.processed/utils/event_emitter.js +0 -19
- package/dist/_esm5.processed/utils/reference.d.ts +46 -67
- package/dist/_esm5.processed/utils/reference.js +63 -93
- package/dist/_esm5.processed/utils/request/xhr.d.ts +3 -68
- package/dist/_esm5.processed/utils/{rx-retry_with_backoff.d.ts → retry_promise_with_backoff.d.ts} +19 -34
- package/dist/_esm5.processed/utils/retry_promise_with_backoff.js +119 -0
- package/dist/_esm5.processed/utils/sleep.d.ts +10 -0
- package/dist/_esm5.processed/utils/sleep.js +14 -0
- package/dist/_esm5.processed/utils/sorted_list.d.ts +1 -0
- package/dist/_esm5.processed/utils/sorted_list.js +3 -0
- package/dist/mpd-parser.wasm +0 -0
- package/dist/rx-player.js +8116 -11600
- package/dist/rx-player.min.js +1 -1
- package/dist/rx-player.min.js.LICENSE.txt +0 -15
- package/manifest.mpd +149 -0
- package/package.json +26 -26
- package/scripts/build/generate_build.js +1 -8
- package/sonar-project.properties +1 -1
- package/src/README.md +2 -2
- package/src/compat/__tests__/can_reuse_media_keys.test.ts +4 -27
- package/src/compat/can_reuse_media_keys.ts +5 -7
- package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +14 -15
- package/src/compat/event_listeners.ts +84 -148
- package/src/compat/index.ts +0 -6
- package/src/compat/on_height_width_change.ts +2 -2
- package/src/core/README.md +1 -1
- package/src/core/adaptive/adaptive_representation_selector.ts +36 -7
- package/src/core/api/README.md +0 -33
- package/src/core/api/playback_observer.ts +20 -11
- package/src/core/api/public_api.ts +826 -815
- package/src/core/api/tracks_management/track_choice_manager.ts +97 -57
- package/src/core/api/utils.ts +112 -42
- package/src/core/decrypt/__tests__/__global__/get_license.test.ts +42 -38
- package/src/core/decrypt/__tests__/__global__/init_data.test.ts +15 -20
- package/src/core/decrypt/__tests__/__global__/media_key_system_access.test.ts +35 -47
- package/src/core/decrypt/__tests__/__global__/utils.ts +116 -17
- package/src/core/decrypt/attach_media_keys.ts +3 -2
- package/src/core/decrypt/clear_on_stop.ts +1 -1
- package/src/core/decrypt/content_decryptor.ts +19 -27
- package/src/core/decrypt/create_session.ts +1 -1
- package/src/core/decrypt/find_key_system.ts +31 -11
- package/src/core/decrypt/get_media_keys.ts +1 -1
- package/src/core/decrypt/session_events_listener.ts +259 -277
- package/src/core/decrypt/set_server_certificate.ts +1 -1
- package/src/core/decrypt/types.ts +0 -5
- package/src/core/decrypt/utils/clean_old_loaded_sessions.ts +1 -1
- package/src/core/decrypt/utils/loaded_sessions_store.ts +1 -1
- package/src/core/fetchers/README.md +3 -0
- package/src/core/fetchers/index.ts +6 -6
- package/src/core/fetchers/manifest/index.ts +7 -7
- package/src/core/fetchers/manifest/manifest_fetcher.ts +646 -295
- package/src/core/fetchers/segment/segment_fetcher_creator.ts +0 -24
- package/src/core/init/README.md +31 -45
- package/src/core/init/directfile_content_initializer.ts +229 -0
- package/src/core/init/index.ts +3 -3
- package/src/core/init/media_source_content_initializer.ts +819 -0
- package/src/core/init/types.ts +220 -132
- package/src/core/init/{__tests__ → utils/__tests__}/are_same_stream_events.test.ts +0 -0
- package/src/core/init/{__tests__ → utils/__tests__}/refresh_scheduled_events_list.test.ts +0 -0
- package/src/core/init/utils/content_time_boundaries_observer.ts +609 -0
- package/src/core/init/{create_media_source.ts → utils/create_media_source.ts} +60 -55
- package/src/core/init/{create_stream_playback_observer.ts → utils/create_stream_playback_observer.ts} +7 -11
- package/src/core/init/utils/end_of_stream.ts +104 -0
- package/src/core/init/{get_initial_time.ts → utils/get_initial_time.ts} +4 -4
- package/src/core/init/utils/get_loaded_reference.ts +76 -0
- package/src/core/init/utils/initial_seek_and_play.ts +179 -0
- package/src/core/init/utils/initialize_content_decryption.ts +178 -0
- package/src/core/init/{media_duration_updater.ts → utils/media_duration_updater.ts} +166 -84
- package/src/core/init/{rebuffering_controller.ts → utils/rebuffering_controller.ts} +247 -226
- package/src/core/init/{stream_events_emitter → utils/stream_events_emitter}/are_same_stream_events.ts +0 -0
- package/src/core/init/{stream_events_emitter → utils/stream_events_emitter}/index.ts +1 -13
- package/src/core/init/{stream_events_emitter → utils/stream_events_emitter}/refresh_scheduled_events_list.ts +1 -1
- package/src/core/init/utils/stream_events_emitter/stream_events_emitter.ts +210 -0
- package/src/core/init/{stream_events_emitter → utils/stream_events_emitter}/types.ts +1 -19
- package/src/core/init/utils/throw_on_media_error.ts +74 -0
- package/src/core/segment_buffers/README.md +5 -4
- package/src/core/segment_buffers/garbage_collector.ts +0 -1
- package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +2 -8
- package/src/core/segment_buffers/implementations/image/image_segment_buffer.ts +3 -3
- package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +1 -1
- package/src/core/stream/README.md +1 -1
- package/src/core/stream/adaptation/adaptation_stream.ts +265 -330
- package/src/core/stream/adaptation/index.ts +2 -12
- package/src/core/stream/adaptation/types.ts +193 -0
- package/src/core/stream/adaptation/{create_representation_estimator.ts → utils/create_representation_estimator.ts} +10 -9
- package/src/core/stream/index.ts +9 -1
- package/src/core/stream/orchestrator/README.md +1 -4
- package/src/core/stream/orchestrator/index.ts +2 -0
- package/src/core/stream/orchestrator/stream_orchestrator.ts +423 -326
- package/src/core/stream/period/index.ts +2 -12
- package/src/core/stream/period/period_stream.ts +301 -238
- package/src/core/stream/period/types.ts +132 -0
- package/src/core/stream/period/{get_adaptation_switch_strategy.ts → utils/get_adaptation_switch_strategy.ts} +6 -6
- package/src/core/stream/representation/README.md +2 -23
- package/src/core/stream/representation/index.ts +2 -12
- package/src/core/stream/representation/representation_stream.ts +315 -415
- package/src/core/stream/representation/types.ts +292 -0
- package/src/core/stream/representation/{append_segment_to_buffer.ts → utils/append_segment_to_buffer.ts} +11 -7
- package/src/core/stream/representation/{check_for_discontinuity.ts → utils/check_for_discontinuity.ts} +3 -3
- package/src/core/stream/representation/utils/downloading_queue.ts +592 -0
- package/src/core/stream/representation/{force_garbage_collection.ts → utils/force_garbage_collection.ts} +5 -6
- package/src/core/stream/representation/{get_buffer_status.ts → utils/get_buffer_status.ts} +5 -5
- package/src/core/stream/representation/{get_needed_segments.ts → utils/get_needed_segments.ts} +6 -7
- package/src/core/stream/representation/{get_segment_priority.ts → utils/get_segment_priority.ts} +1 -2
- package/src/core/stream/representation/utils/push_init_segment.ts +80 -0
- package/src/core/stream/representation/utils/push_media_segment.ts +113 -0
- package/src/default_config.ts +13 -1
- package/src/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.ts +1 -1
- package/src/experimental/tools/VideoThumbnailLoader/remove_buffer_around_time.ts +1 -1
- package/src/experimental/tools/createMetaplaylist/get_duration_from_manifest.ts +58 -66
- package/src/experimental/tools/createMetaplaylist/index.ts +29 -38
- package/src/features/__tests__/initialize_features.test.ts +1 -1
- package/src/features/initialize_features.ts +2 -1
- package/src/features/list/__tests__/directfile.test.ts +3 -2
- package/src/features/list/directfile.ts +1 -1
- package/src/features/types.ts +2 -7
- package/src/manifest/__tests__/manifest.test.ts +14 -365
- package/src/manifest/__tests__/update_period_in_place.test.ts +522 -57
- package/src/manifest/__tests__/update_periods.test.ts +254 -40
- package/src/manifest/adaptation.ts +11 -0
- package/src/manifest/manifest.ts +6 -4
- package/src/manifest/update_period_in_place.ts +84 -14
- package/src/manifest/update_periods.ts +93 -33
- package/src/parsers/manifest/dash/common/indexes/base.ts +4 -0
- package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +8 -1
- package/src/parsers/manifest/dash/common/indexes/template.ts +76 -25
- package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +61 -3
- package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +46 -15
- package/src/parsers/manifest/dash/common/parse_representations.ts +7 -3
- package/src/parsers/manifest/dash/js-parser/node_parsers/SegmentBase.ts +6 -0
- package/src/parsers/manifest/dash/node_parser_types.ts +3 -0
- package/src/parsers/manifest/dash/wasm-parser/rs/events.rs +3 -0
- package/src/parsers/manifest/dash/wasm-parser/rs/processor/attributes.rs +4 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +1 -1
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/SegmentBase.ts +6 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/SegmentTemplate.ts +7 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/types.ts +3 -0
- package/src/parsers/manifest/types.ts +13 -2
- package/src/parsers/texttracks/ttml/html/create_element.ts +8 -0
- package/src/public_types.ts +2 -0
- package/src/transports/README.md +15 -54
- package/src/transports/dash/manifest_parser.ts +2 -2
- package/src/transports/dash/segment_loader.ts +1 -1
- package/src/transports/dash/text_parser.ts +3 -3
- package/src/transports/local/segment_loader.ts +1 -1
- package/src/utils/__tests__/event_emitter.test.ts +1 -76
- package/src/utils/event_emitter.ts +6 -30
- package/src/utils/reference.ts +112 -169
- package/src/utils/request/xhr.ts +3 -68
- package/src/utils/retry_promise_with_backoff.ts +95 -0
- package/src/utils/sleep.ts +14 -0
- package/src/utils/sorted_list.ts +4 -0
- package/dist/_esm5.processed/compat/play.d.ts +0 -23
- package/dist/_esm5.processed/compat/play.js +0 -32
- package/dist/_esm5.processed/compat/set_element_src.d.ts +0 -26
- package/dist/_esm5.processed/compat/set_element_src.js +0 -37
- package/dist/_esm5.processed/compat/when_loaded_metadata.d.ts +0 -23
- package/dist/_esm5.processed/compat/when_loaded_metadata.js +0 -33
- package/dist/_esm5.processed/core/init/content_time_boundaries_observer.d.ts +0 -45
- package/dist/_esm5.processed/core/init/content_time_boundaries_observer.js +0 -295
- package/dist/_esm5.processed/core/init/create_media_source.js +0 -107
- package/dist/_esm5.processed/core/init/end_of_stream.js +0 -74
- package/dist/_esm5.processed/core/init/events_generators.d.ts +0 -88
- package/dist/_esm5.processed/core/init/events_generators.js +0 -87
- package/dist/_esm5.processed/core/init/initial_seek_and_play.d.ts +0 -81
- package/dist/_esm5.processed/core/init/initial_seek_and_play.js +0 -114
- package/dist/_esm5.processed/core/init/initialize_directfile.js +0 -120
- package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +0 -122
- package/dist/_esm5.processed/core/init/initialize_media_source.js +0 -201
- package/dist/_esm5.processed/core/init/link_drm_and_content.d.ts +0 -62
- package/dist/_esm5.processed/core/init/link_drm_and_content.js +0 -94
- package/dist/_esm5.processed/core/init/load_on_media_source.d.ts +0 -46
- package/dist/_esm5.processed/core/init/load_on_media_source.js +0 -122
- package/dist/_esm5.processed/core/init/manifest_update_scheduler.d.ts +0 -65
- package/dist/_esm5.processed/core/init/manifest_update_scheduler.js +0 -233
- package/dist/_esm5.processed/core/init/rebuffering_controller.d.ts +0 -81
- package/dist/_esm5.processed/core/init/rebuffering_controller.js +0 -439
- package/dist/_esm5.processed/core/init/stream_events_emitter/index.d.ts +0 -19
- package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.d.ts +0 -27
- package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +0 -126
- package/dist/_esm5.processed/core/init/update_playback_rate.d.ts +0 -0
- package/dist/_esm5.processed/core/init/update_playback_rate.js +0 -1
- package/dist/_esm5.processed/core/stream/events_generators.d.ts +0 -67
- package/dist/_esm5.processed/core/stream/events_generators.js +0 -112
- package/dist/_esm5.processed/core/stream/orchestrator/active_period_emitter.d.ts +0 -53
- package/dist/_esm5.processed/core/stream/orchestrator/active_period_emitter.js +0 -124
- package/dist/_esm5.processed/core/stream/orchestrator/are_streams_complete.d.ts +0 -35
- package/dist/_esm5.processed/core/stream/orchestrator/are_streams_complete.js +0 -53
- package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.d.ts +0 -36
- package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +0 -46
- package/dist/_esm5.processed/core/stream/reload_after_switch.d.ts +0 -47
- package/dist/_esm5.processed/core/stream/reload_after_switch.js +0 -56
- package/dist/_esm5.processed/core/stream/representation/downloading_queue.js +0 -371
- package/dist/_esm5.processed/core/stream/representation/push_init_segment.js +0 -49
- package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +0 -76
- package/dist/_esm5.processed/core/stream/types.d.ts +0 -437
- package/dist/_esm5.processed/utils/cast_to_observable.d.ts +0 -24
- package/dist/_esm5.processed/utils/cast_to_observable.js +0 -35
- package/dist/_esm5.processed/utils/concat_map_latest.d.ts +0 -23
- package/dist/_esm5.processed/utils/concat_map_latest.js +0 -48
- package/dist/_esm5.processed/utils/defer_subscriptions.d.ts +0 -79
- package/dist/_esm5.processed/utils/defer_subscriptions.js +0 -89
- package/dist/_esm5.processed/utils/filter_map.d.ts +0 -28
- package/dist/_esm5.processed/utils/filter_map.js +0 -32
- package/dist/_esm5.processed/utils/rx-from_cancellable_promise.d.ts +0 -39
- package/dist/_esm5.processed/utils/rx-from_cancellable_promise.js +0 -63
- package/dist/_esm5.processed/utils/rx-next-tick.d.ts +0 -27
- package/dist/_esm5.processed/utils/rx-next-tick.js +0 -41
- package/dist/_esm5.processed/utils/rx-retry_with_backoff.js +0 -70
- package/dist/_esm5.processed/utils/rx-throttle.d.ts +0 -40
- package/dist/_esm5.processed/utils/rx-throttle.js +0 -47
- package/dist/_esm5.processed/utils/rx-try_catch.d.ts +0 -23
- package/dist/_esm5.processed/utils/rx-try_catch.js +0 -30
- package/src/compat/__tests__/play.test.ts +0 -73
- package/src/compat/__tests__/set_element_src.test.ts +0 -71
- package/src/compat/__tests__/when_loaded_metadata.test.ts +0 -109
- package/src/compat/play.ts +0 -37
- package/src/compat/set_element_src.ts +0 -47
- package/src/compat/when_loaded_metadata.ts +0 -40
- package/src/core/init/content_time_boundaries_observer.ts +0 -382
- package/src/core/init/emit_loaded_event.ts +0 -71
- package/src/core/init/end_of_stream.ts +0 -104
- package/src/core/init/events_generators.ts +0 -140
- package/src/core/init/initial_seek_and_play.ts +0 -208
- package/src/core/init/initialize_directfile.ts +0 -191
- package/src/core/init/initialize_media_source.ts +0 -389
- package/src/core/init/link_drm_and_content.ts +0 -176
- package/src/core/init/load_on_media_source.ts +0 -237
- package/src/core/init/manifest_update_scheduler.ts +0 -362
- package/src/core/init/stream_events_emitter/stream_events_emitter.ts +0 -182
- package/src/core/init/throw_on_media_error.ts +0 -68
- package/src/core/init/update_playback_rate.ts +0 -0
- package/src/core/stream/events_generators.ts +0 -217
- package/src/core/stream/orchestrator/active_period_emitter.ts +0 -146
- package/src/core/stream/orchestrator/are_streams_complete.ts +0 -70
- package/src/core/stream/period/create_empty_adaptation_stream.ts +0 -70
- package/src/core/stream/reload_after_switch.ts +0 -76
- package/src/core/stream/representation/downloading_queue.ts +0 -632
- package/src/core/stream/representation/push_init_segment.ts +0 -87
- package/src/core/stream/representation/push_media_segment.ts +0 -125
- package/src/core/stream/types.ts +0 -558
- package/src/utils/__tests__/cast_to_observable.test.ts +0 -93
- package/src/utils/__tests__/concat_map_latest.test.ts +0 -221
- package/src/utils/__tests__/defer_subscriptions.test.ts +0 -50
- package/src/utils/__tests__/filter_map.test.ts +0 -87
- package/src/utils/__tests__/rx-throttle.test.ts +0 -252
- package/src/utils/__tests__/rx-try_catch.test.ts +0 -100
- package/src/utils/cast_to_observable.ts +0 -48
- package/src/utils/concat_map_latest.ts +0 -61
- package/src/utils/defer_subscriptions.ts +0 -96
- package/src/utils/filter_map.ts +0 -43
- package/src/utils/rx-from_cancellable_promise.ts +0 -71
- package/src/utils/rx-next-tick.ts +0 -43
- package/src/utils/rx-retry_with_backoff.ts +0 -101
- package/src/utils/rx-throttle.ts +0 -84
- package/src/utils/rx-try_catch.ts +0 -37
|
@@ -43,7 +43,6 @@ var __assign = (this && this.__assign) || function () {
|
|
|
43
43
|
* This file defines the public API for the RxPlayer.
|
|
44
44
|
* It also starts the different sub-parts of the player on various API calls.
|
|
45
45
|
*/
|
|
46
|
-
import { combineLatest as observableCombineLatest, concat as observableConcat, connectable, distinctUntilChanged, EMPTY, filter, map, merge as observableMerge, mergeMap, Observable, of as observableOf, share, shareReplay, skipWhile, startWith, Subject, switchMap, take, takeUntil, tap, } from "rxjs";
|
|
47
46
|
import { events, exitFullscreen, getStartDate, isFullscreen, requestFullscreen, } from "../../compat";
|
|
48
47
|
/* eslint-disable-next-line max-len */
|
|
49
48
|
import canRelyOnVideoVisibilityAndSize from "../../compat/can_rely_on_video_visibility_and_size";
|
|
@@ -51,9 +50,10 @@ import config from "../../config";
|
|
|
51
50
|
import { ErrorCodes, ErrorTypes, formatError, MediaError, } from "../../errors";
|
|
52
51
|
import features from "../../features";
|
|
53
52
|
import log from "../../log";
|
|
54
|
-
import Manifest from "../../manifest";
|
|
55
53
|
import areArraysOfNumbersEqual from "../../utils/are_arrays_of_numbers_equal";
|
|
54
|
+
import assert from "../../utils/assert";
|
|
56
55
|
import EventEmitter from "../../utils/event_emitter";
|
|
56
|
+
import idGenerator from "../../utils/id_generator";
|
|
57
57
|
import isNullOrUndefined from "../../utils/is_null_or_undefined";
|
|
58
58
|
import objectAssign from "../../utils/object_assign";
|
|
59
59
|
import { getLeftSizeOfRange, getPlayedSizeOfRange, getSizeOfRange, } from "../../utils/ranges";
|
|
@@ -61,14 +61,14 @@ import createSharedReference, { createMappedReference, } from "../../utils/refer
|
|
|
61
61
|
import TaskCanceller from "../../utils/task_canceller";
|
|
62
62
|
import warnOnce from "../../utils/warn_once";
|
|
63
63
|
import { clearOnStop, disposeDecryptionResources, getCurrentKeySystem, } from "../decrypt";
|
|
64
|
-
import
|
|
65
|
-
import initializeMediaSourcePlayback from "../init";
|
|
64
|
+
import MediaSourceContentInitializer from "../init/media_source_content_initializer";
|
|
66
65
|
import { checkReloadOptions, parseConstructorOptions, parseLoadVideoOptions, } from "./option_utils";
|
|
67
66
|
import PlaybackObserver from "./playback_observer";
|
|
68
67
|
import TrackChoiceManager from "./tracks_management/track_choice_manager";
|
|
69
|
-
import { emitSeekEvents,
|
|
68
|
+
import { constructPlayerStateReference, emitSeekEvents, isLoadedState, } from "./utils";
|
|
70
69
|
/* eslint-disable @typescript-eslint/naming-convention */
|
|
71
|
-
var
|
|
70
|
+
var generateContentId = idGenerator();
|
|
71
|
+
var getPageActivityRef = events.getPageActivityRef, getPictureOnPictureStateRef = events.getPictureOnPictureStateRef, getVideoVisibilityRef = events.getVideoVisibilityRef, getVideoWidthRef = events.getVideoWidthRef, onFullscreenChange = events.onFullscreenChange, onTextTrackAdded = events.onTextTrackAdded, onTextTrackRemoved = events.onTextTrackRemoved;
|
|
72
72
|
/**
|
|
73
73
|
* @class Player
|
|
74
74
|
* @extends EventEmitter
|
|
@@ -81,80 +81,88 @@ var Player = /** @class */ (function (_super) {
|
|
|
81
81
|
*/
|
|
82
82
|
function Player(options) {
|
|
83
83
|
if (options === void 0) { options = {}; }
|
|
84
|
-
var _this =
|
|
85
|
-
var _a
|
|
84
|
+
var _this = this;
|
|
85
|
+
var _a, _b;
|
|
86
|
+
_this = _super.call(this) || this;
|
|
87
|
+
var _c = parseConstructorOptions(options), initialAudioBitrate = _c.initialAudioBitrate, initialVideoBitrate = _c.initialVideoBitrate, limitVideoWidth = _c.limitVideoWidth, minAudioBitrate = _c.minAudioBitrate, minVideoBitrate = _c.minVideoBitrate, maxAudioBitrate = _c.maxAudioBitrate, maxBufferAhead = _c.maxBufferAhead, maxBufferBehind = _c.maxBufferBehind, maxVideoBitrate = _c.maxVideoBitrate, preferredAudioTracks = _c.preferredAudioTracks, preferredTextTracks = _c.preferredTextTracks, preferredVideoTracks = _c.preferredVideoTracks, throttleWhenHidden = _c.throttleWhenHidden, throttleVideoBitrateWhenHidden = _c.throttleVideoBitrateWhenHidden, videoElement = _c.videoElement, wantedBufferAhead = _c.wantedBufferAhead, maxVideoBufferSize = _c.maxVideoBufferSize, stopAtEnd = _c.stopAtEnd;
|
|
86
88
|
var DEFAULT_UNMUTED_VOLUME = config.getCurrent().DEFAULT_UNMUTED_VOLUME;
|
|
87
89
|
// Workaround to support Firefox autoplay on FF 42.
|
|
88
90
|
// See: https://bugzilla.mozilla.org/show_bug.cgi?id=1194624
|
|
89
91
|
videoElement.preload = "auto";
|
|
90
|
-
_this.version = /* PLAYER_VERSION */ "3.
|
|
92
|
+
_this.version = /* PLAYER_VERSION */ "3.30.0-dev.2023011800";
|
|
91
93
|
_this.log = log;
|
|
92
94
|
_this.state = "STOPPED";
|
|
93
95
|
_this.videoElement = videoElement;
|
|
94
96
|
var destroyCanceller = new TaskCanceller();
|
|
95
|
-
_this.
|
|
96
|
-
_this._priv_destroy$.pipe(take(1)).subscribe(function () {
|
|
97
|
-
destroyCanceller.cancel();
|
|
98
|
-
});
|
|
97
|
+
_this._destroyCanceller = destroyCanceller;
|
|
99
98
|
_this._priv_pictureInPictureRef = getPictureOnPictureStateRef(videoElement, destroyCanceller.signal);
|
|
100
99
|
/** @deprecated */
|
|
101
|
-
onFullscreenChange
|
|
102
|
-
.pipe(takeUntil(_this._priv_destroy$))
|
|
100
|
+
onFullscreenChange(videoElement, function () {
|
|
103
101
|
/* eslint-disable import/no-deprecated */
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
102
|
+
_this.trigger("fullscreenChange", _this.isFullscreen());
|
|
103
|
+
/* eslint-enable import/no-deprecated */
|
|
104
|
+
}, destroyCanceller.signal);
|
|
105
|
+
/** Store last known TextTrack array linked to the media element. */
|
|
106
|
+
var prevTextTracks = [];
|
|
107
|
+
for (var i = 0; i < ((_a = videoElement.textTracks) === null || _a === void 0 ? void 0 : _a.length); i++) {
|
|
108
|
+
var textTrack = (_b = videoElement.textTracks) === null || _b === void 0 ? void 0 : _b[i];
|
|
109
|
+
if (!isNullOrUndefined(textTrack)) {
|
|
110
|
+
prevTextTracks.push(textTrack);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/** Callback called when a TextTrack element is added or removed. */
|
|
114
|
+
var onTextTrackChanges = function (_evt) {
|
|
115
|
+
var evt = _evt;
|
|
109
116
|
var target = evt.target;
|
|
110
|
-
var
|
|
117
|
+
var textTrackArr = [];
|
|
111
118
|
for (var i = 0; i < target.length; i++) {
|
|
112
119
|
var textTrack = target[i];
|
|
113
|
-
|
|
120
|
+
textTrackArr.push(textTrack);
|
|
114
121
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
return false;
|
|
122
|
+
var oldTextTracks = prevTextTracks;
|
|
123
|
+
prevTextTracks = textTrackArr;
|
|
124
|
+
// We can have two consecutive textTrackChanges with the exact same
|
|
125
|
+
// payload when we perform multiple texttrack operations before the event
|
|
126
|
+
// loop is freed.
|
|
127
|
+
if (oldTextTracks.length !== textTrackArr.length) {
|
|
128
|
+
_this._priv_onNativeTextTracksNext(textTrackArr);
|
|
129
|
+
return;
|
|
124
130
|
}
|
|
125
|
-
for (var i = 0; i <
|
|
126
|
-
if (
|
|
127
|
-
|
|
131
|
+
for (var i = 0; i < oldTextTracks.length; i++) {
|
|
132
|
+
if (oldTextTracks[i] !== textTrackArr[i]) {
|
|
133
|
+
_this._priv_onNativeTextTracksNext(textTrackArr);
|
|
134
|
+
return;
|
|
128
135
|
}
|
|
129
136
|
}
|
|
130
|
-
return
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
|
|
137
|
+
return;
|
|
138
|
+
};
|
|
139
|
+
if (!isNullOrUndefined(videoElement.textTracks)) {
|
|
140
|
+
onTextTrackAdded(videoElement.textTracks, onTextTrackChanges, destroyCanceller.signal);
|
|
141
|
+
onTextTrackRemoved(videoElement.textTracks, onTextTrackChanges, destroyCanceller.signal);
|
|
142
|
+
}
|
|
143
|
+
_this._priv_speed = createSharedReference(videoElement.playbackRate, _this._destroyCanceller.signal);
|
|
134
144
|
_this._priv_preferTrickModeTracks = false;
|
|
135
|
-
_this._priv_contentLock = createSharedReference(false);
|
|
145
|
+
_this._priv_contentLock = createSharedReference(false, _this._destroyCanceller.signal);
|
|
136
146
|
_this._priv_bufferOptions = {
|
|
137
|
-
wantedBufferAhead: createSharedReference(wantedBufferAhead),
|
|
138
|
-
maxBufferAhead: createSharedReference(maxBufferAhead),
|
|
139
|
-
maxBufferBehind: createSharedReference(maxBufferBehind),
|
|
140
|
-
maxVideoBufferSize: createSharedReference(maxVideoBufferSize),
|
|
147
|
+
wantedBufferAhead: createSharedReference(wantedBufferAhead, _this._destroyCanceller.signal),
|
|
148
|
+
maxBufferAhead: createSharedReference(maxBufferAhead, _this._destroyCanceller.signal),
|
|
149
|
+
maxBufferBehind: createSharedReference(maxBufferBehind, _this._destroyCanceller.signal),
|
|
150
|
+
maxVideoBufferSize: createSharedReference(maxVideoBufferSize, _this._destroyCanceller.signal),
|
|
141
151
|
};
|
|
142
152
|
_this._priv_bitrateInfos = {
|
|
143
153
|
lastBitrates: { audio: initialAudioBitrate,
|
|
144
154
|
video: initialVideoBitrate },
|
|
145
|
-
minAutoBitrates: { audio: createSharedReference(minAudioBitrate),
|
|
146
|
-
video: createSharedReference(minVideoBitrate) },
|
|
147
|
-
maxAutoBitrates: { audio: createSharedReference(maxAudioBitrate),
|
|
148
|
-
video: createSharedReference(maxVideoBitrate) },
|
|
149
|
-
manualBitrates: { audio: createSharedReference(-1),
|
|
150
|
-
video: createSharedReference(-1) },
|
|
155
|
+
minAutoBitrates: { audio: createSharedReference(minAudioBitrate, _this._destroyCanceller.signal),
|
|
156
|
+
video: createSharedReference(minVideoBitrate, _this._destroyCanceller.signal) },
|
|
157
|
+
maxAutoBitrates: { audio: createSharedReference(maxAudioBitrate, _this._destroyCanceller.signal),
|
|
158
|
+
video: createSharedReference(maxVideoBitrate, _this._destroyCanceller.signal) },
|
|
159
|
+
manualBitrates: { audio: createSharedReference(-1, _this._destroyCanceller.signal),
|
|
160
|
+
video: createSharedReference(-1, _this._destroyCanceller.signal) },
|
|
151
161
|
};
|
|
152
162
|
_this._priv_throttleWhenHidden = throttleWhenHidden;
|
|
153
163
|
_this._priv_throttleVideoBitrateWhenHidden = throttleVideoBitrateWhenHidden;
|
|
154
164
|
_this._priv_limitVideoWidth = limitVideoWidth;
|
|
155
165
|
_this._priv_mutedMemory = DEFAULT_UNMUTED_VOLUME;
|
|
156
|
-
_this._priv_trackChoiceManager = null;
|
|
157
|
-
_this._priv_mediaElementTrackChoiceManager = null;
|
|
158
166
|
_this._priv_currentError = null;
|
|
159
167
|
_this._priv_contentInfos = null;
|
|
160
168
|
_this._priv_contentEventsMemory = {};
|
|
@@ -246,22 +254,8 @@ var Player = /** @class */ (function (_super) {
|
|
|
246
254
|
log.error("API: Could not dispose decryption resources: " + message);
|
|
247
255
|
});
|
|
248
256
|
}
|
|
249
|
-
// free
|
|
250
|
-
this.
|
|
251
|
-
this._priv_destroy$.complete();
|
|
252
|
-
// Complete all subjects and references
|
|
253
|
-
this._priv_speed.finish();
|
|
254
|
-
this._priv_contentLock.finish();
|
|
255
|
-
this._priv_bufferOptions.wantedBufferAhead.finish();
|
|
256
|
-
this._priv_bufferOptions.maxVideoBufferSize.finish();
|
|
257
|
-
this._priv_bufferOptions.maxBufferAhead.finish();
|
|
258
|
-
this._priv_bufferOptions.maxBufferBehind.finish();
|
|
259
|
-
this._priv_bitrateInfos.manualBitrates.video.finish();
|
|
260
|
-
this._priv_bitrateInfos.manualBitrates.audio.finish();
|
|
261
|
-
this._priv_bitrateInfos.minAutoBitrates.video.finish();
|
|
262
|
-
this._priv_bitrateInfos.minAutoBitrates.audio.finish();
|
|
263
|
-
this._priv_bitrateInfos.maxAutoBitrates.video.finish();
|
|
264
|
-
this._priv_bitrateInfos.maxAutoBitrates.audio.finish();
|
|
257
|
+
// free resources linked to the Player instance
|
|
258
|
+
this._destroyCanceller.cancel();
|
|
265
259
|
this._priv_reloadingMetadata = {};
|
|
266
260
|
// un-attach video element
|
|
267
261
|
this.videoElement = null;
|
|
@@ -324,44 +318,17 @@ var Player = /** @class */ (function (_super) {
|
|
|
324
318
|
*/
|
|
325
319
|
Player.prototype._priv_initializeContentPlayback = function (options) {
|
|
326
320
|
var _this = this;
|
|
327
|
-
var _a, _b, _c;
|
|
328
321
|
var autoPlay = options.autoPlay, audioTrackSwitchingMode = options.audioTrackSwitchingMode, defaultAudioTrack = options.defaultAudioTrack, defaultTextTrack = options.defaultTextTrack, enableFastSwitching = options.enableFastSwitching, initialManifest = options.initialManifest, keySystems = options.keySystems, lowLatencyMode = options.lowLatencyMode, manualBitrateSwitchingMode = options.manualBitrateSwitchingMode, minimumManifestUpdateInterval = options.minimumManifestUpdateInterval, networkConfig = options.networkConfig, onCodecSwitch = options.onCodecSwitch, startAt = options.startAt, transport = options.transport, transportOptions = options.transportOptions, url = options.url;
|
|
329
322
|
// Perform multiple checks on the given options
|
|
330
323
|
if (this.videoElement === null) {
|
|
331
324
|
throw new Error("the attached video element is disposed");
|
|
332
325
|
}
|
|
333
326
|
var isDirectFile = transport === "directfile";
|
|
334
|
-
/**
|
|
327
|
+
/** Emit to stop the current content. */
|
|
335
328
|
var currentContentCanceller = new TaskCanceller();
|
|
336
|
-
// Some logic needs the equivalent of the `currentContentCanceller` under
|
|
337
|
-
// an Observable form
|
|
338
|
-
// TODO remove the need for `stoppedContent$`
|
|
339
|
-
var stoppedContent$ = new Observable(function (obs) {
|
|
340
|
-
currentContentCanceller.signal.register(function () {
|
|
341
|
-
obs.next();
|
|
342
|
-
obs.complete();
|
|
343
|
-
});
|
|
344
|
-
});
|
|
345
|
-
/** Future `this._priv_contentInfos` related to this content. */
|
|
346
|
-
var contentInfos = { url: url, currentContentCanceller: currentContentCanceller, isDirectFile: isDirectFile, segmentBuffersStore: null,
|
|
347
|
-
thumbnails: null,
|
|
348
|
-
manifest: null,
|
|
349
|
-
currentPeriod: null,
|
|
350
|
-
activeAdaptations: null,
|
|
351
|
-
activeRepresentations: null,
|
|
352
|
-
initialAudioTrack: defaultAudioTrack,
|
|
353
|
-
initialTextTrack: defaultTextTrack };
|
|
354
329
|
var videoElement = this.videoElement;
|
|
355
|
-
|
|
356
|
-
var
|
|
357
|
-
withMediaSource: !isDirectFile,
|
|
358
|
-
lowLatencyMode: lowLatencyMode,
|
|
359
|
-
});
|
|
360
|
-
currentContentCanceller.signal.register(function () {
|
|
361
|
-
playbackObserver.stop();
|
|
362
|
-
});
|
|
363
|
-
/** Emit playback events. */
|
|
364
|
-
var playback$;
|
|
330
|
+
var initializer;
|
|
331
|
+
var mediaElementTrackChoiceManager = null;
|
|
365
332
|
if (!isDirectFile) {
|
|
366
333
|
var transportFn = features.transports[transport];
|
|
367
334
|
if (typeof transportFn !== "function") {
|
|
@@ -373,34 +340,9 @@ var Player = /** @class */ (function (_super) {
|
|
|
373
340
|
var transportPipelines = transportFn(transportOptions);
|
|
374
341
|
var offlineRetry = networkConfig.offlineRetry, segmentRetry = networkConfig.segmentRetry, manifestRetry = networkConfig.manifestRetry, manifestRequestTimeout = networkConfig.manifestRequestTimeout, segmentRequestTimeout = networkConfig.segmentRequestTimeout;
|
|
375
342
|
/** Interface used to load and refresh the Manifest. */
|
|
376
|
-
var
|
|
343
|
+
var manifestRequestSettings = { lowLatencyMode: lowLatencyMode, maxRetryRegular: manifestRetry,
|
|
377
344
|
maxRetryOffline: offlineRetry,
|
|
378
|
-
requestTimeout: manifestRequestTimeout }
|
|
379
|
-
/** Observable emitting the initial Manifest */
|
|
380
|
-
var manifest$ = void 0;
|
|
381
|
-
if (initialManifest instanceof Manifest) {
|
|
382
|
-
manifest$ = observableOf({ type: "parsed",
|
|
383
|
-
manifest: initialManifest });
|
|
384
|
-
}
|
|
385
|
-
else if (initialManifest !== undefined) {
|
|
386
|
-
manifest$ = manifestFetcher.parse(initialManifest, { previousManifest: null,
|
|
387
|
-
unsafeMode: false });
|
|
388
|
-
}
|
|
389
|
-
else {
|
|
390
|
-
manifest$ = manifestFetcher.fetch(url).pipe(mergeMap(function (response) { return response.type === "warning" ?
|
|
391
|
-
observableOf(response) : // bubble-up warnings
|
|
392
|
-
response.parse({ previousManifest: null, unsafeMode: false }); }));
|
|
393
|
-
}
|
|
394
|
-
// Load the Manifest right now and share it with every subscriber until
|
|
395
|
-
// the content is stopped
|
|
396
|
-
manifest$ = manifest$.pipe(takeUntil(stoppedContent$), shareReplay());
|
|
397
|
-
manifest$.subscribe();
|
|
398
|
-
// now that the Manifest is loading, stop previous content and reset state
|
|
399
|
-
// This is done after fetching the Manifest as `stop` could technically
|
|
400
|
-
// take time.
|
|
401
|
-
this.stop();
|
|
402
|
-
this._priv_currentError = null;
|
|
403
|
-
this._priv_contentInfos = contentInfos;
|
|
345
|
+
requestTimeout: manifestRequestTimeout, minimumManifestUpdateInterval: minimumManifestUpdateInterval, initialManifest: initialManifest };
|
|
404
346
|
var relyOnVideoVisibilityAndSize = canRelyOnVideoVisibilityAndSize();
|
|
405
347
|
var throttlers = { throttle: {},
|
|
406
348
|
throttleBitrate: {},
|
|
@@ -454,126 +396,165 @@ var Player = /** @class */ (function (_super) {
|
|
|
454
396
|
{ textTrackMode: "html",
|
|
455
397
|
textTrackElement: options.textTrackElement };
|
|
456
398
|
var bufferOptions = objectAssign({ audioTrackSwitchingMode: audioTrackSwitchingMode, enableFastSwitching: enableFastSwitching, manualBitrateSwitchingMode: manualBitrateSwitchingMode, onCodecSwitch: onCodecSwitch }, this._priv_bufferOptions);
|
|
457
|
-
var segmentRequestOptions = {
|
|
399
|
+
var segmentRequestOptions = { lowLatencyMode: lowLatencyMode, maxRetryRegular: segmentRetry,
|
|
458
400
|
requestTimeout: segmentRequestTimeout,
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
401
|
+
maxRetryOffline: offlineRetry };
|
|
402
|
+
initializer = new MediaSourceContentInitializer({
|
|
403
|
+
adaptiveOptions: adaptiveOptions,
|
|
404
|
+
autoPlay: autoPlay,
|
|
405
|
+
bufferOptions: bufferOptions,
|
|
406
|
+
keySystems: keySystems,
|
|
407
|
+
lowLatencyMode: lowLatencyMode,
|
|
408
|
+
manifestRequestSettings: manifestRequestSettings,
|
|
409
|
+
transport: transportPipelines,
|
|
410
|
+
segmentRequestOptions: segmentRequestOptions,
|
|
411
|
+
speed: this._priv_speed,
|
|
412
|
+
startAt: startAt,
|
|
413
|
+
textTrackOptions: textTrackOptions,
|
|
414
|
+
url: url,
|
|
415
|
+
});
|
|
465
416
|
}
|
|
466
417
|
else {
|
|
467
|
-
// Stop previous content and reset its state
|
|
468
|
-
this.stop();
|
|
469
|
-
this._priv_currentError = null;
|
|
470
418
|
if (features.directfile === null) {
|
|
419
|
+
this.stop();
|
|
420
|
+
this._priv_currentError = null;
|
|
471
421
|
throw new Error("DirectFile feature not activated in your build.");
|
|
472
422
|
}
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
.addEventListener("availableTextTracksChange", function (val) {
|
|
504
|
-
return _this.trigger("availableTextTracksChange", val);
|
|
505
|
-
});
|
|
506
|
-
this._priv_mediaElementTrackChoiceManager
|
|
507
|
-
.addEventListener("audioTrackChange", function (val) {
|
|
508
|
-
return _this.trigger("audioTrackChange", val);
|
|
509
|
-
});
|
|
510
|
-
this._priv_mediaElementTrackChoiceManager
|
|
511
|
-
.addEventListener("videoTrackChange", function (val) {
|
|
512
|
-
return _this.trigger("videoTrackChange", val);
|
|
423
|
+
mediaElementTrackChoiceManager =
|
|
424
|
+
this._priv_initializeMediaElementTrackChoiceManager(defaultAudioTrack, defaultTextTrack, currentContentCanceller.signal);
|
|
425
|
+
if (currentContentCanceller.isUsed) {
|
|
426
|
+
return;
|
|
427
|
+
}
|
|
428
|
+
initializer = new features.directfile.initDirectFile({ autoPlay: autoPlay, keySystems: keySystems, speed: this._priv_speed, startAt: startAt, url: url });
|
|
429
|
+
}
|
|
430
|
+
/** Future `this._priv_contentInfos` related to this content. */
|
|
431
|
+
var contentInfos = {
|
|
432
|
+
contentId: generateContentId(),
|
|
433
|
+
originalUrl: url,
|
|
434
|
+
currentContentCanceller: currentContentCanceller,
|
|
435
|
+
initializer: initializer,
|
|
436
|
+
isDirectFile: isDirectFile,
|
|
437
|
+
segmentBuffersStore: null,
|
|
438
|
+
thumbnails: null,
|
|
439
|
+
manifest: null,
|
|
440
|
+
currentPeriod: null,
|
|
441
|
+
activeAdaptations: null,
|
|
442
|
+
activeRepresentations: null,
|
|
443
|
+
initialAudioTrack: defaultAudioTrack,
|
|
444
|
+
initialTextTrack: defaultTextTrack,
|
|
445
|
+
trackChoiceManager: null,
|
|
446
|
+
mediaElementTrackChoiceManager: mediaElementTrackChoiceManager,
|
|
447
|
+
};
|
|
448
|
+
// Bind events
|
|
449
|
+
initializer.addEventListener("error", function (error) {
|
|
450
|
+
var formattedError = formatError(error, {
|
|
451
|
+
defaultCode: "NONE",
|
|
452
|
+
defaultReason: "An unknown error stopped content playback.",
|
|
513
453
|
});
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
454
|
+
formattedError.fatal = true;
|
|
455
|
+
contentInfos.currentContentCanceller.cancel();
|
|
456
|
+
_this._priv_cleanUpCurrentContentState();
|
|
457
|
+
_this._priv_currentError = formattedError;
|
|
458
|
+
log.error("API: The player stopped because of an error", error instanceof Error ? error : "");
|
|
459
|
+
_this._priv_setPlayerState("STOPPED" /* PLAYER_STATES.STOPPED */);
|
|
460
|
+
// TODO This condition is here because the eventual callback called when the
|
|
461
|
+
// player state is updated can launch a new content, thus the error will not
|
|
462
|
+
// be here anymore, in which case triggering the "error" event is unwanted.
|
|
463
|
+
// This is very ugly though, and we should probable have a better solution
|
|
464
|
+
if (_this._priv_currentError === formattedError) {
|
|
465
|
+
_this.trigger("error", formattedError);
|
|
466
|
+
}
|
|
467
|
+
});
|
|
468
|
+
initializer.addEventListener("warning", function (error) {
|
|
469
|
+
var formattedError = formatError(error, {
|
|
470
|
+
defaultCode: "NONE",
|
|
471
|
+
defaultReason: "An unknown error happened.",
|
|
517
472
|
});
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
var stalled$ = playback$.pipe(filter(function (evt) { return evt.type === "stalled" ||
|
|
526
|
-
evt.type === "unstalled"; }), map(function (x) { return x.value; }), distinctUntilChanged(function (prevStallReason, currStallReason) {
|
|
527
|
-
return prevStallReason === null && currStallReason === null ||
|
|
528
|
-
(prevStallReason !== null && currStallReason !== null &&
|
|
529
|
-
prevStallReason === currStallReason);
|
|
530
|
-
}));
|
|
531
|
-
/** Emit when the content is considered "loaded". */
|
|
532
|
-
var loaded$ = playback$.pipe(filter(function (evt) { return evt.type === "loaded"; }), share());
|
|
533
|
-
/** Emit when we will "reload" the MediaSource. */
|
|
534
|
-
var reloading$ = playback$
|
|
535
|
-
.pipe(filter(function (evt) {
|
|
536
|
-
return evt.type === "reloading-media-source";
|
|
537
|
-
}), share());
|
|
538
|
-
/** Emit when the media element emits a "seeking" event. */
|
|
539
|
-
var observation$ = playbackObserver.getReference().asObservable();
|
|
540
|
-
var stateChangingEvent$ = observation$.pipe(filter(function (o) {
|
|
541
|
-
return o.event === "seeking" || o.event === "ended" ||
|
|
542
|
-
o.event === "play" || o.event === "pause";
|
|
543
|
-
}));
|
|
544
|
-
/** Emit state updates once the content is considered "loaded". */
|
|
545
|
-
var loadedStateUpdates$ = observableCombineLatest([
|
|
546
|
-
stalled$.pipe(startWith(null)),
|
|
547
|
-
stateChangingEvent$.pipe(startWith(null)),
|
|
548
|
-
]).pipe(takeUntil(stoppedContent$), map(function (_a) {
|
|
549
|
-
var stalledStatus = _a[0];
|
|
550
|
-
return getLoadedContentState(videoElement, stalledStatus);
|
|
551
|
-
}));
|
|
552
|
-
/** Emit all player "state" updates. */
|
|
553
|
-
var playerState$ = observableConcat(observableOf("LOADING" /* PLAYER_STATES.LOADING */), // Begin with LOADING
|
|
554
|
-
loaded$.pipe(switchMap(function (_, i) {
|
|
555
|
-
var isFirstLoad = i === 0;
|
|
556
|
-
return observableMerge(
|
|
557
|
-
// Purposely subscribed first so a RELOADING triggered synchronously
|
|
558
|
-
// after a LOADED state is catched.
|
|
559
|
-
reloading$.pipe(map(function () { return "RELOADING" /* PLAYER_STATES.RELOADING */; })),
|
|
560
|
-
// Only switch to LOADED state for the first (i.e. non-RELOADING) load
|
|
561
|
-
isFirstLoad ? observableOf("LOADED" /* PLAYER_STATES.LOADED */) :
|
|
562
|
-
EMPTY,
|
|
563
|
-
// Purposely put last so any other state change happens after we've
|
|
564
|
-
// already switched to LOADED
|
|
565
|
-
loadedStateUpdates$.pipe(takeUntil(reloading$),
|
|
566
|
-
// For the first load, we prefer staying at the LOADED state over
|
|
567
|
-
// PAUSED when autoPlay is disabled.
|
|
568
|
-
// For consecutive loads however, there's no LOADED state.
|
|
569
|
-
skipWhile(function (state) { return isFirstLoad && state === "PAUSED" /* PLAYER_STATES.PAUSED */; })));
|
|
570
|
-
}))).pipe(distinctUntilChanged());
|
|
571
|
-
var playbackSubscription;
|
|
572
|
-
stoppedContent$.subscribe(function () {
|
|
573
|
-
if (playbackSubscription !== undefined) {
|
|
574
|
-
playbackSubscription.unsubscribe();
|
|
473
|
+
log.warn("API: Sending warning:", formattedError);
|
|
474
|
+
_this.trigger("warning", formattedError);
|
|
475
|
+
});
|
|
476
|
+
initializer.addEventListener("reloadingMediaSource", function () {
|
|
477
|
+
contentInfos.segmentBuffersStore = null;
|
|
478
|
+
if (contentInfos.trackChoiceManager !== null) {
|
|
479
|
+
contentInfos.trackChoiceManager.resetPeriods();
|
|
575
480
|
}
|
|
576
481
|
});
|
|
482
|
+
initializer.addEventListener("inbandEvents", function (inbandEvents) {
|
|
483
|
+
return _this.trigger("inbandEvents", inbandEvents);
|
|
484
|
+
});
|
|
485
|
+
initializer.addEventListener("streamEvent", function (streamEvent) {
|
|
486
|
+
return _this.trigger("streamEvent", streamEvent);
|
|
487
|
+
});
|
|
488
|
+
initializer.addEventListener("streamEventSkip", function (streamEventSkip) {
|
|
489
|
+
return _this.trigger("streamEventSkip", streamEventSkip);
|
|
490
|
+
});
|
|
491
|
+
initializer.addEventListener("decipherabilityUpdate", function (decipherabilityUpdate) {
|
|
492
|
+
return _this.trigger("decipherabilityUpdate", decipherabilityUpdate);
|
|
493
|
+
});
|
|
494
|
+
initializer.addEventListener("activePeriodChanged", function (periodInfo) {
|
|
495
|
+
return _this._priv_onActivePeriodChanged(contentInfos, periodInfo);
|
|
496
|
+
});
|
|
497
|
+
initializer.addEventListener("periodStreamReady", function (periodReadyInfo) {
|
|
498
|
+
return _this._priv_onPeriodStreamReady(contentInfos, periodReadyInfo);
|
|
499
|
+
});
|
|
500
|
+
initializer.addEventListener("periodStreamCleared", function (periodClearedInfo) {
|
|
501
|
+
return _this._priv_onPeriodStreamCleared(contentInfos, periodClearedInfo);
|
|
502
|
+
});
|
|
503
|
+
initializer.addEventListener("representationChange", function (representationInfo) {
|
|
504
|
+
return _this._priv_onRepresentationChange(contentInfos, representationInfo);
|
|
505
|
+
});
|
|
506
|
+
initializer.addEventListener("adaptationChange", function (adaptationInfo) {
|
|
507
|
+
return _this._priv_onAdaptationChange(contentInfos, adaptationInfo);
|
|
508
|
+
});
|
|
509
|
+
initializer.addEventListener("bitrateEstimationChange", function (bitrateEstimationInfo) {
|
|
510
|
+
return _this._priv_onBitrateEstimationChange(bitrateEstimationInfo);
|
|
511
|
+
});
|
|
512
|
+
initializer.addEventListener("manifestReady", function (manifest) {
|
|
513
|
+
return _this._priv_onManifestReady(contentInfos, manifest);
|
|
514
|
+
});
|
|
515
|
+
initializer.addEventListener("loaded", function (evt) {
|
|
516
|
+
contentInfos.segmentBuffersStore = evt.segmentBuffersStore;
|
|
517
|
+
});
|
|
518
|
+
initializer.addEventListener("addedSegment", function (evt) {
|
|
519
|
+
// Manage image tracks
|
|
520
|
+
// @deprecated
|
|
521
|
+
var content = evt.content, segmentData = evt.segmentData;
|
|
522
|
+
if (content.adaptation.type === "image") {
|
|
523
|
+
if (!isNullOrUndefined(segmentData) &&
|
|
524
|
+
segmentData.type === "bif") {
|
|
525
|
+
var imageData = segmentData.data;
|
|
526
|
+
/* eslint-disable import/no-deprecated */
|
|
527
|
+
contentInfos.thumbnails = imageData;
|
|
528
|
+
_this.trigger("imageTrackUpdate", { data: contentInfos.thumbnails });
|
|
529
|
+
/* eslint-enable import/no-deprecated */
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
});
|
|
533
|
+
// Now, that most events are linked, prepare the next content.
|
|
534
|
+
initializer.prepare();
|
|
535
|
+
// Now that the content is prepared, stop previous content and reset state
|
|
536
|
+
// This is done after content preparation as `stop` could technically have
|
|
537
|
+
// a long and synchronous blocking time.
|
|
538
|
+
// Note that this call is done **synchronously** after all events linking.
|
|
539
|
+
// This is **VERY** important so:
|
|
540
|
+
// - the `STOPPED` state is switched to synchronously after loading a new
|
|
541
|
+
// content.
|
|
542
|
+
// - we can avoid involontarily catching events linked to the previous
|
|
543
|
+
// content.
|
|
544
|
+
this.stop();
|
|
545
|
+
/** Global "playback observer" which will emit playback conditions */
|
|
546
|
+
var playbackObserver = new PlaybackObserver(videoElement, {
|
|
547
|
+
withMediaSource: !isDirectFile,
|
|
548
|
+
lowLatencyMode: lowLatencyMode,
|
|
549
|
+
});
|
|
550
|
+
currentContentCanceller.signal.register(function () {
|
|
551
|
+
playbackObserver.stop();
|
|
552
|
+
});
|
|
553
|
+
// Update the RxPlayer's state at the right events
|
|
554
|
+
var playerStateRef = constructPlayerStateReference(initializer, videoElement, playbackObserver, currentContentCanceller.signal);
|
|
555
|
+
currentContentCanceller.signal.register(function () {
|
|
556
|
+
initializer.dispose();
|
|
557
|
+
});
|
|
577
558
|
/**
|
|
578
559
|
* Function updating `this._priv_reloadingMetadata` in function of the
|
|
579
560
|
* current state and playback conditions.
|
|
@@ -598,44 +579,55 @@ var Player = /** @class */ (function (_super) {
|
|
|
598
579
|
break;
|
|
599
580
|
}
|
|
600
581
|
};
|
|
601
|
-
|
|
582
|
+
/**
|
|
583
|
+
* `TaskCanceller` allowing to stop emitting `"seeking"` and `"seeked"`
|
|
584
|
+
* events.
|
|
585
|
+
* `null` when such events are not emitted currently.
|
|
586
|
+
*/
|
|
587
|
+
var seekEventsCanceller = null;
|
|
588
|
+
// React to player state change
|
|
589
|
+
playerStateRef.onUpdate(function (newState) {
|
|
602
590
|
updateReloadingMetadata(newState);
|
|
603
591
|
_this._priv_setPlayerState(newState);
|
|
592
|
+
if (currentContentCanceller.isUsed) {
|
|
593
|
+
return;
|
|
594
|
+
}
|
|
595
|
+
if (seekEventsCanceller !== null) {
|
|
596
|
+
if (!isLoadedState(_this.state)) {
|
|
597
|
+
seekEventsCanceller.cancel();
|
|
598
|
+
seekEventsCanceller = null;
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
else if (isLoadedState(_this.state)) {
|
|
602
|
+
seekEventsCanceller = new TaskCanceller({
|
|
603
|
+
cancelOn: currentContentCanceller.signal,
|
|
604
|
+
});
|
|
605
|
+
emitSeekEvents(videoElement, playbackObserver, function () { return _this.trigger("seeking", null); }, function () { return _this.trigger("seeked", null); }, seekEventsCanceller.signal);
|
|
606
|
+
}
|
|
604
607
|
// Previous call could have performed all kind of side-effects, thus,
|
|
605
608
|
// we re-check the current state associated to the RxPlayer
|
|
606
|
-
if (_this.state === "ENDED" && _this._priv_stopAtEnd) {
|
|
609
|
+
if (_this.state === "ENDED" /* PLAYER_STATES.ENDED */ && _this._priv_stopAtEnd) {
|
|
607
610
|
currentContentCanceller.cancel();
|
|
608
611
|
}
|
|
609
|
-
}
|
|
610
|
-
|
|
612
|
+
}, { emitCurrentValue: true, clearSignal: currentContentCanceller.signal });
|
|
613
|
+
// React to playback conditions change
|
|
614
|
+
playbackObserver.listen(function (observation) {
|
|
611
615
|
updateReloadingMetadata(_this.state);
|
|
612
|
-
_this._priv_triggerPositionUpdate(
|
|
613
|
-
});
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
});
|
|
619
|
-
// Link playback events to the corresponding callbacks
|
|
620
|
-
playback$.subscribe({
|
|
621
|
-
next: function (x) { return _this._priv_onPlaybackEvent(x); },
|
|
622
|
-
error: function (err) { return _this._priv_onPlaybackError(err); },
|
|
623
|
-
complete: function () {
|
|
624
|
-
if (!contentInfos.currentContentCanceller.isUsed) {
|
|
625
|
-
log.info("API: Previous playback finished. Stopping and cleaning-up...");
|
|
626
|
-
contentInfos.currentContentCanceller.cancel();
|
|
627
|
-
_this._priv_cleanUpCurrentContentState();
|
|
628
|
-
_this._priv_setPlayerState("STOPPED" /* PLAYER_STATES.STOPPED */);
|
|
629
|
-
}
|
|
630
|
-
},
|
|
616
|
+
_this._priv_triggerPositionUpdate(contentInfos, observation);
|
|
617
|
+
}, { clearSignal: currentContentCanceller.signal });
|
|
618
|
+
this._priv_currentError = null;
|
|
619
|
+
this._priv_contentInfos = contentInfos;
|
|
620
|
+
currentContentCanceller.signal.register(function () {
|
|
621
|
+
initializer.removeEventListener();
|
|
631
622
|
});
|
|
632
623
|
// initialize the content only when the lock is inactive
|
|
633
|
-
this._priv_contentLock.
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
624
|
+
this._priv_contentLock.onUpdate(function (isLocked, stopListeningToLock) {
|
|
625
|
+
if (!isLocked) {
|
|
626
|
+
stopListeningToLock();
|
|
627
|
+
// start playback!
|
|
628
|
+
initializer.start(videoElement, playbackObserver);
|
|
629
|
+
}
|
|
630
|
+
}, { emitCurrentValue: true, clearSignal: currentContentCanceller.signal });
|
|
639
631
|
};
|
|
640
632
|
/**
|
|
641
633
|
* Returns fatal error if one for the current content.
|
|
@@ -755,7 +747,8 @@ var Player = /** @class */ (function (_super) {
|
|
|
755
747
|
return this._priv_preferTrickModeTracks;
|
|
756
748
|
};
|
|
757
749
|
/**
|
|
758
|
-
* Returns the url of the content
|
|
750
|
+
* Returns the url of the currently considered Manifest, or of the content for
|
|
751
|
+
* directfile content.
|
|
759
752
|
* @returns {string|undefined} - Current URL. `undefined` if not known or no
|
|
760
753
|
* URL yet.
|
|
761
754
|
*/
|
|
@@ -763,15 +756,30 @@ var Player = /** @class */ (function (_super) {
|
|
|
763
756
|
if (this._priv_contentInfos === null) {
|
|
764
757
|
return undefined;
|
|
765
758
|
}
|
|
766
|
-
var _a = this._priv_contentInfos, isDirectFile = _a.isDirectFile, manifest = _a.manifest,
|
|
759
|
+
var _a = this._priv_contentInfos, isDirectFile = _a.isDirectFile, manifest = _a.manifest, originalUrl = _a.originalUrl;
|
|
767
760
|
if (isDirectFile) {
|
|
768
|
-
return
|
|
761
|
+
return originalUrl;
|
|
769
762
|
}
|
|
770
763
|
if (manifest !== null) {
|
|
771
764
|
return manifest.getUrl();
|
|
772
765
|
}
|
|
773
766
|
return undefined;
|
|
774
767
|
};
|
|
768
|
+
/**
|
|
769
|
+
* Update URL of the content currently being played (e.g. DASH's MPD).
|
|
770
|
+
* @param {Array.<string>|undefined} urls - URLs to reach that content /
|
|
771
|
+
* Manifest from the most prioritized URL to the least prioritized URL.
|
|
772
|
+
* @param {Object|undefined} [params]
|
|
773
|
+
* @param {boolean} params.refresh - If `true` the resource in question
|
|
774
|
+
* (e.g. DASH's MPD) will be refreshed immediately.
|
|
775
|
+
*/
|
|
776
|
+
Player.prototype.updateContentUrls = function (urls, params) {
|
|
777
|
+
if (this._priv_contentInfos === null) {
|
|
778
|
+
throw new Error("No content loaded");
|
|
779
|
+
}
|
|
780
|
+
var refreshNow = (params === null || params === void 0 ? void 0 : params.refresh) === true;
|
|
781
|
+
this._priv_contentInfos.initializer.updateContentUrls(urls, refreshNow);
|
|
782
|
+
};
|
|
775
783
|
/**
|
|
776
784
|
* Returns the video duration, in seconds.
|
|
777
785
|
* NaN if no video is playing.
|
|
@@ -938,6 +946,7 @@ var Player = /** @class */ (function (_super) {
|
|
|
938
946
|
* @param {Object} opts
|
|
939
947
|
*/
|
|
940
948
|
Player.prototype.setPlaybackRate = function (rate, opts) {
|
|
949
|
+
var _a;
|
|
941
950
|
if (rate !== this._priv_speed.getValue()) {
|
|
942
951
|
this._priv_speed.setValue(rate);
|
|
943
952
|
}
|
|
@@ -946,14 +955,13 @@ var Player = /** @class */ (function (_super) {
|
|
|
946
955
|
return;
|
|
947
956
|
}
|
|
948
957
|
this._priv_preferTrickModeTracks = preferTrickModeTracks;
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
958
|
+
var trackChoiceManager = (_a = this._priv_contentInfos) === null || _a === void 0 ? void 0 : _a.trackChoiceManager;
|
|
959
|
+
if (!isNullOrUndefined(trackChoiceManager)) {
|
|
960
|
+
if (preferTrickModeTracks && !trackChoiceManager.isTrickModeEnabled()) {
|
|
961
|
+
trackChoiceManager.enableVideoTrickModeTracks();
|
|
953
962
|
}
|
|
954
|
-
else if (!preferTrickModeTracks &&
|
|
955
|
-
|
|
956
|
-
this._priv_trackChoiceManager.disableVideoTrickModeTracks();
|
|
963
|
+
else if (!preferTrickModeTracks && trackChoiceManager.isTrickModeEnabled()) {
|
|
964
|
+
trackChoiceManager.disableVideoTrickModeTracks();
|
|
957
965
|
}
|
|
958
966
|
}
|
|
959
967
|
};
|
|
@@ -1378,54 +1386,54 @@ var Player = /** @class */ (function (_super) {
|
|
|
1378
1386
|
* @returns {Array.<Object>|null}
|
|
1379
1387
|
*/
|
|
1380
1388
|
Player.prototype.getAvailableAudioTracks = function () {
|
|
1381
|
-
var _a
|
|
1389
|
+
var _a;
|
|
1382
1390
|
if (this._priv_contentInfos === null) {
|
|
1383
1391
|
return [];
|
|
1384
1392
|
}
|
|
1385
|
-
var
|
|
1393
|
+
var _b = this._priv_contentInfos, currentPeriod = _b.currentPeriod, isDirectFile = _b.isDirectFile, trackChoiceManager = _b.trackChoiceManager, mediaElementTrackChoiceManager = _b.mediaElementTrackChoiceManager;
|
|
1386
1394
|
if (isDirectFile) {
|
|
1387
|
-
return (
|
|
1395
|
+
return (_a = mediaElementTrackChoiceManager === null || mediaElementTrackChoiceManager === void 0 ? void 0 : mediaElementTrackChoiceManager.getAvailableAudioTracks()) !== null && _a !== void 0 ? _a : [];
|
|
1388
1396
|
}
|
|
1389
|
-
if (
|
|
1397
|
+
if (trackChoiceManager === null || currentPeriod === null) {
|
|
1390
1398
|
return [];
|
|
1391
1399
|
}
|
|
1392
|
-
return
|
|
1400
|
+
return trackChoiceManager.getAvailableAudioTracks(currentPeriod);
|
|
1393
1401
|
};
|
|
1394
1402
|
/**
|
|
1395
1403
|
* Returns every available text tracks for the current Period.
|
|
1396
1404
|
* @returns {Array.<Object>|null}
|
|
1397
1405
|
*/
|
|
1398
1406
|
Player.prototype.getAvailableTextTracks = function () {
|
|
1399
|
-
var _a
|
|
1407
|
+
var _a;
|
|
1400
1408
|
if (this._priv_contentInfos === null) {
|
|
1401
1409
|
return [];
|
|
1402
1410
|
}
|
|
1403
|
-
var
|
|
1411
|
+
var _b = this._priv_contentInfos, currentPeriod = _b.currentPeriod, isDirectFile = _b.isDirectFile, trackChoiceManager = _b.trackChoiceManager, mediaElementTrackChoiceManager = _b.mediaElementTrackChoiceManager;
|
|
1404
1412
|
if (isDirectFile) {
|
|
1405
|
-
return (
|
|
1413
|
+
return (_a = mediaElementTrackChoiceManager === null || mediaElementTrackChoiceManager === void 0 ? void 0 : mediaElementTrackChoiceManager.getAvailableTextTracks()) !== null && _a !== void 0 ? _a : [];
|
|
1406
1414
|
}
|
|
1407
|
-
if (
|
|
1415
|
+
if (trackChoiceManager === null || currentPeriod === null) {
|
|
1408
1416
|
return [];
|
|
1409
1417
|
}
|
|
1410
|
-
return
|
|
1418
|
+
return trackChoiceManager.getAvailableTextTracks(currentPeriod);
|
|
1411
1419
|
};
|
|
1412
1420
|
/**
|
|
1413
1421
|
* Returns every available video tracks for the current Period.
|
|
1414
1422
|
* @returns {Array.<Object>|null}
|
|
1415
1423
|
*/
|
|
1416
1424
|
Player.prototype.getAvailableVideoTracks = function () {
|
|
1417
|
-
var _a
|
|
1425
|
+
var _a;
|
|
1418
1426
|
if (this._priv_contentInfos === null) {
|
|
1419
1427
|
return [];
|
|
1420
1428
|
}
|
|
1421
|
-
var
|
|
1429
|
+
var _b = this._priv_contentInfos, currentPeriod = _b.currentPeriod, isDirectFile = _b.isDirectFile, trackChoiceManager = _b.trackChoiceManager, mediaElementTrackChoiceManager = _b.mediaElementTrackChoiceManager;
|
|
1422
1430
|
if (isDirectFile) {
|
|
1423
|
-
return (
|
|
1431
|
+
return (_a = mediaElementTrackChoiceManager === null || mediaElementTrackChoiceManager === void 0 ? void 0 : mediaElementTrackChoiceManager.getAvailableVideoTracks()) !== null && _a !== void 0 ? _a : [];
|
|
1424
1432
|
}
|
|
1425
|
-
if (
|
|
1433
|
+
if (trackChoiceManager === null || currentPeriod === null) {
|
|
1426
1434
|
return [];
|
|
1427
1435
|
}
|
|
1428
|
-
return
|
|
1436
|
+
return trackChoiceManager.getAvailableVideoTracks(currentPeriod);
|
|
1429
1437
|
};
|
|
1430
1438
|
/**
|
|
1431
1439
|
* Returns currently chosen audio language for the current Period.
|
|
@@ -1435,17 +1443,17 @@ var Player = /** @class */ (function (_super) {
|
|
|
1435
1443
|
if (this._priv_contentInfos === null) {
|
|
1436
1444
|
return undefined;
|
|
1437
1445
|
}
|
|
1438
|
-
var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile;
|
|
1446
|
+
var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile, trackChoiceManager = _a.trackChoiceManager, mediaElementTrackChoiceManager = _a.mediaElementTrackChoiceManager;
|
|
1439
1447
|
if (isDirectFile) {
|
|
1440
|
-
if (
|
|
1448
|
+
if (mediaElementTrackChoiceManager === null) {
|
|
1441
1449
|
return undefined;
|
|
1442
1450
|
}
|
|
1443
|
-
return
|
|
1451
|
+
return mediaElementTrackChoiceManager.getChosenAudioTrack();
|
|
1444
1452
|
}
|
|
1445
|
-
if (
|
|
1453
|
+
if (trackChoiceManager === null || currentPeriod === null) {
|
|
1446
1454
|
return undefined;
|
|
1447
1455
|
}
|
|
1448
|
-
return
|
|
1456
|
+
return trackChoiceManager.getChosenAudioTrack(currentPeriod);
|
|
1449
1457
|
};
|
|
1450
1458
|
/**
|
|
1451
1459
|
* Returns currently chosen subtitle for the current Period.
|
|
@@ -1455,17 +1463,17 @@ var Player = /** @class */ (function (_super) {
|
|
|
1455
1463
|
if (this._priv_contentInfos === null) {
|
|
1456
1464
|
return undefined;
|
|
1457
1465
|
}
|
|
1458
|
-
var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile;
|
|
1466
|
+
var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile, trackChoiceManager = _a.trackChoiceManager, mediaElementTrackChoiceManager = _a.mediaElementTrackChoiceManager;
|
|
1459
1467
|
if (isDirectFile) {
|
|
1460
|
-
if (
|
|
1468
|
+
if (mediaElementTrackChoiceManager === null) {
|
|
1461
1469
|
return undefined;
|
|
1462
1470
|
}
|
|
1463
|
-
return
|
|
1471
|
+
return mediaElementTrackChoiceManager.getChosenTextTrack();
|
|
1464
1472
|
}
|
|
1465
|
-
if (
|
|
1473
|
+
if (trackChoiceManager === null || currentPeriod === null) {
|
|
1466
1474
|
return undefined;
|
|
1467
1475
|
}
|
|
1468
|
-
return
|
|
1476
|
+
return trackChoiceManager.getChosenTextTrack(currentPeriod);
|
|
1469
1477
|
};
|
|
1470
1478
|
/**
|
|
1471
1479
|
* Returns currently chosen video track for the current Period.
|
|
@@ -1475,17 +1483,17 @@ var Player = /** @class */ (function (_super) {
|
|
|
1475
1483
|
if (this._priv_contentInfos === null) {
|
|
1476
1484
|
return undefined;
|
|
1477
1485
|
}
|
|
1478
|
-
var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile;
|
|
1486
|
+
var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile, trackChoiceManager = _a.trackChoiceManager, mediaElementTrackChoiceManager = _a.mediaElementTrackChoiceManager;
|
|
1479
1487
|
if (isDirectFile) {
|
|
1480
|
-
if (
|
|
1488
|
+
if (mediaElementTrackChoiceManager === null) {
|
|
1481
1489
|
return undefined;
|
|
1482
1490
|
}
|
|
1483
|
-
return
|
|
1491
|
+
return mediaElementTrackChoiceManager.getChosenVideoTrack();
|
|
1484
1492
|
}
|
|
1485
|
-
if (
|
|
1493
|
+
if (trackChoiceManager === null || currentPeriod === null) {
|
|
1486
1494
|
return undefined;
|
|
1487
1495
|
}
|
|
1488
|
-
return
|
|
1496
|
+
return trackChoiceManager.getChosenVideoTrack(currentPeriod);
|
|
1489
1497
|
};
|
|
1490
1498
|
/**
|
|
1491
1499
|
* Update the audio language for the current Period.
|
|
@@ -1494,25 +1502,24 @@ var Player = /** @class */ (function (_super) {
|
|
|
1494
1502
|
* @throws Error - the given id is linked to no audio track.
|
|
1495
1503
|
*/
|
|
1496
1504
|
Player.prototype.setAudioTrack = function (audioId) {
|
|
1497
|
-
var _a;
|
|
1498
1505
|
if (this._priv_contentInfos === null) {
|
|
1499
1506
|
throw new Error("No content loaded");
|
|
1500
1507
|
}
|
|
1501
|
-
var
|
|
1508
|
+
var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile, trackChoiceManager = _a.trackChoiceManager, mediaElementTrackChoiceManager = _a.mediaElementTrackChoiceManager;
|
|
1502
1509
|
if (isDirectFile) {
|
|
1503
1510
|
try {
|
|
1504
|
-
|
|
1511
|
+
mediaElementTrackChoiceManager === null || mediaElementTrackChoiceManager === void 0 ? void 0 : mediaElementTrackChoiceManager.setAudioTrackById(audioId);
|
|
1505
1512
|
return;
|
|
1506
1513
|
}
|
|
1507
1514
|
catch (e) {
|
|
1508
1515
|
throw new Error("player: unknown audio track");
|
|
1509
1516
|
}
|
|
1510
1517
|
}
|
|
1511
|
-
if (
|
|
1518
|
+
if (trackChoiceManager === null || currentPeriod === null) {
|
|
1512
1519
|
throw new Error("No compatible content launched.");
|
|
1513
1520
|
}
|
|
1514
1521
|
try {
|
|
1515
|
-
|
|
1522
|
+
trackChoiceManager.setAudioTrackByID(currentPeriod, audioId);
|
|
1516
1523
|
}
|
|
1517
1524
|
catch (e) {
|
|
1518
1525
|
throw new Error("player: unknown audio track");
|
|
@@ -1525,25 +1532,24 @@ var Player = /** @class */ (function (_super) {
|
|
|
1525
1532
|
* @throws Error - the given id is linked to no text track.
|
|
1526
1533
|
*/
|
|
1527
1534
|
Player.prototype.setTextTrack = function (textId) {
|
|
1528
|
-
var _a;
|
|
1529
1535
|
if (this._priv_contentInfos === null) {
|
|
1530
1536
|
throw new Error("No content loaded");
|
|
1531
1537
|
}
|
|
1532
|
-
var
|
|
1538
|
+
var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile, trackChoiceManager = _a.trackChoiceManager, mediaElementTrackChoiceManager = _a.mediaElementTrackChoiceManager;
|
|
1533
1539
|
if (isDirectFile) {
|
|
1534
1540
|
try {
|
|
1535
|
-
|
|
1541
|
+
mediaElementTrackChoiceManager === null || mediaElementTrackChoiceManager === void 0 ? void 0 : mediaElementTrackChoiceManager.setTextTrackById(textId);
|
|
1536
1542
|
return;
|
|
1537
1543
|
}
|
|
1538
1544
|
catch (e) {
|
|
1539
1545
|
throw new Error("player: unknown text track");
|
|
1540
1546
|
}
|
|
1541
1547
|
}
|
|
1542
|
-
if (
|
|
1548
|
+
if (trackChoiceManager === null || currentPeriod === null) {
|
|
1543
1549
|
throw new Error("No compatible content launched.");
|
|
1544
1550
|
}
|
|
1545
1551
|
try {
|
|
1546
|
-
|
|
1552
|
+
trackChoiceManager.setTextTrackByID(currentPeriod, textId);
|
|
1547
1553
|
}
|
|
1548
1554
|
catch (e) {
|
|
1549
1555
|
throw new Error("player: unknown text track");
|
|
@@ -1553,19 +1559,18 @@ var Player = /** @class */ (function (_super) {
|
|
|
1553
1559
|
* Disable subtitles for the current content.
|
|
1554
1560
|
*/
|
|
1555
1561
|
Player.prototype.disableTextTrack = function () {
|
|
1556
|
-
var _a;
|
|
1557
1562
|
if (this._priv_contentInfos === null) {
|
|
1558
1563
|
return;
|
|
1559
1564
|
}
|
|
1560
|
-
var
|
|
1565
|
+
var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile, trackChoiceManager = _a.trackChoiceManager, mediaElementTrackChoiceManager = _a.mediaElementTrackChoiceManager;
|
|
1561
1566
|
if (isDirectFile) {
|
|
1562
|
-
|
|
1567
|
+
mediaElementTrackChoiceManager === null || mediaElementTrackChoiceManager === void 0 ? void 0 : mediaElementTrackChoiceManager.disableTextTrack();
|
|
1563
1568
|
return;
|
|
1564
1569
|
}
|
|
1565
|
-
if (
|
|
1570
|
+
if (trackChoiceManager === null || currentPeriod === null) {
|
|
1566
1571
|
return;
|
|
1567
1572
|
}
|
|
1568
|
-
return
|
|
1573
|
+
return trackChoiceManager.disableTextTrack(currentPeriod);
|
|
1569
1574
|
};
|
|
1570
1575
|
/**
|
|
1571
1576
|
* Update the video track for the current Period.
|
|
@@ -1574,25 +1579,24 @@ var Player = /** @class */ (function (_super) {
|
|
|
1574
1579
|
* @throws Error - the given id is linked to no video track.
|
|
1575
1580
|
*/
|
|
1576
1581
|
Player.prototype.setVideoTrack = function (videoId) {
|
|
1577
|
-
var _a;
|
|
1578
1582
|
if (this._priv_contentInfos === null) {
|
|
1579
1583
|
throw new Error("No content loaded");
|
|
1580
1584
|
}
|
|
1581
|
-
var
|
|
1585
|
+
var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile, trackChoiceManager = _a.trackChoiceManager, mediaElementTrackChoiceManager = _a.mediaElementTrackChoiceManager;
|
|
1582
1586
|
if (isDirectFile) {
|
|
1583
1587
|
try {
|
|
1584
|
-
|
|
1588
|
+
mediaElementTrackChoiceManager === null || mediaElementTrackChoiceManager === void 0 ? void 0 : mediaElementTrackChoiceManager.setVideoTrackById(videoId);
|
|
1585
1589
|
return;
|
|
1586
1590
|
}
|
|
1587
1591
|
catch (e) {
|
|
1588
1592
|
throw new Error("player: unknown video track");
|
|
1589
1593
|
}
|
|
1590
1594
|
}
|
|
1591
|
-
if (
|
|
1595
|
+
if (trackChoiceManager === null || currentPeriod === null) {
|
|
1592
1596
|
throw new Error("No compatible content launched.");
|
|
1593
1597
|
}
|
|
1594
1598
|
try {
|
|
1595
|
-
|
|
1599
|
+
trackChoiceManager.setVideoTrackByID(currentPeriod, videoId);
|
|
1596
1600
|
}
|
|
1597
1601
|
catch (e) {
|
|
1598
1602
|
throw new Error("player: unknown video track");
|
|
@@ -1605,14 +1609,14 @@ var Player = /** @class */ (function (_super) {
|
|
|
1605
1609
|
if (this._priv_contentInfos === null) {
|
|
1606
1610
|
return;
|
|
1607
1611
|
}
|
|
1608
|
-
var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile;
|
|
1609
|
-
if (isDirectFile &&
|
|
1610
|
-
return
|
|
1612
|
+
var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile, trackChoiceManager = _a.trackChoiceManager, mediaElementTrackChoiceManager = _a.mediaElementTrackChoiceManager;
|
|
1613
|
+
if (isDirectFile && mediaElementTrackChoiceManager !== null) {
|
|
1614
|
+
return mediaElementTrackChoiceManager.disableVideoTrack();
|
|
1611
1615
|
}
|
|
1612
|
-
if (
|
|
1616
|
+
if (trackChoiceManager === null || currentPeriod === null) {
|
|
1613
1617
|
return;
|
|
1614
1618
|
}
|
|
1615
|
-
return
|
|
1619
|
+
return trackChoiceManager.disableVideoTrack(currentPeriod);
|
|
1616
1620
|
};
|
|
1617
1621
|
/**
|
|
1618
1622
|
* Returns the current list of preferred audio tracks, in preference order.
|
|
@@ -1649,11 +1653,12 @@ var Player = /** @class */ (function (_super) {
|
|
|
1649
1653
|
"Should have been an Array.");
|
|
1650
1654
|
}
|
|
1651
1655
|
this._priv_preferredAudioTracks = tracks;
|
|
1652
|
-
|
|
1653
|
-
|
|
1656
|
+
var contentInfos = this._priv_contentInfos;
|
|
1657
|
+
if (!isNullOrUndefined(contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.trackChoiceManager)) {
|
|
1658
|
+
contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.trackChoiceManager.setPreferredAudioTracks(tracks, shouldApply);
|
|
1654
1659
|
}
|
|
1655
|
-
else if (
|
|
1656
|
-
|
|
1660
|
+
else if (!isNullOrUndefined(contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.mediaElementTrackChoiceManager)) {
|
|
1661
|
+
contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.mediaElementTrackChoiceManager.setPreferredAudioTracks(tracks, shouldApply);
|
|
1657
1662
|
}
|
|
1658
1663
|
};
|
|
1659
1664
|
/**
|
|
@@ -1670,11 +1675,12 @@ var Player = /** @class */ (function (_super) {
|
|
|
1670
1675
|
"Should have been an Array.");
|
|
1671
1676
|
}
|
|
1672
1677
|
this._priv_preferredTextTracks = tracks;
|
|
1673
|
-
|
|
1674
|
-
|
|
1678
|
+
var contentInfos = this._priv_contentInfos;
|
|
1679
|
+
if (!isNullOrUndefined(contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.trackChoiceManager)) {
|
|
1680
|
+
contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.trackChoiceManager.setPreferredTextTracks(tracks, shouldApply);
|
|
1675
1681
|
}
|
|
1676
|
-
else if (
|
|
1677
|
-
|
|
1682
|
+
else if (!isNullOrUndefined(contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.mediaElementTrackChoiceManager)) {
|
|
1683
|
+
contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.mediaElementTrackChoiceManager.setPreferredTextTracks(tracks, shouldApply);
|
|
1678
1684
|
}
|
|
1679
1685
|
};
|
|
1680
1686
|
/**
|
|
@@ -1691,11 +1697,12 @@ var Player = /** @class */ (function (_super) {
|
|
|
1691
1697
|
"Should have been an Array.");
|
|
1692
1698
|
}
|
|
1693
1699
|
this._priv_preferredVideoTracks = tracks;
|
|
1694
|
-
|
|
1695
|
-
|
|
1700
|
+
var contentInfos = this._priv_contentInfos;
|
|
1701
|
+
if (!isNullOrUndefined(contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.trackChoiceManager)) {
|
|
1702
|
+
contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.trackChoiceManager.setPreferredVideoTracks(tracks, shouldApply);
|
|
1696
1703
|
}
|
|
1697
|
-
else if (
|
|
1698
|
-
|
|
1704
|
+
else if (!isNullOrUndefined(contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.mediaElementTrackChoiceManager)) {
|
|
1705
|
+
contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.mediaElementTrackChoiceManager.setPreferredVideoTracks(tracks, shouldApply);
|
|
1699
1706
|
}
|
|
1700
1707
|
};
|
|
1701
1708
|
/**
|
|
@@ -1776,14 +1783,12 @@ var Player = /** @class */ (function (_super) {
|
|
|
1776
1783
|
*/
|
|
1777
1784
|
Player.prototype._priv_cleanUpCurrentContentState = function () {
|
|
1778
1785
|
var _this = this;
|
|
1779
|
-
var _a;
|
|
1786
|
+
var _a, _b;
|
|
1780
1787
|
log.debug("Locking `contentLock` to clean-up the current content.");
|
|
1781
1788
|
// lock playback of new contents while cleaning up is pending
|
|
1782
1789
|
this._priv_contentLock.setValue(true);
|
|
1790
|
+
(_b = (_a = this._priv_contentInfos) === null || _a === void 0 ? void 0 : _a.mediaElementTrackChoiceManager) === null || _b === void 0 ? void 0 : _b.dispose();
|
|
1783
1791
|
this._priv_contentInfos = null;
|
|
1784
|
-
this._priv_trackChoiceManager = null;
|
|
1785
|
-
(_a = this._priv_mediaElementTrackChoiceManager) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
1786
|
-
this._priv_mediaElementTrackChoiceManager = null;
|
|
1787
1792
|
this._priv_contentEventsMemory = {};
|
|
1788
1793
|
// DRM-related clean-up
|
|
1789
1794
|
var freeUpContentLock = function () {
|
|
@@ -1807,153 +1812,61 @@ var Player = /** @class */ (function (_super) {
|
|
|
1807
1812
|
freeUpContentLock();
|
|
1808
1813
|
}
|
|
1809
1814
|
};
|
|
1810
|
-
/**
|
|
1811
|
-
* Triggered each time the playback Observable emits.
|
|
1812
|
-
*
|
|
1813
|
-
* React to various events.
|
|
1814
|
-
*
|
|
1815
|
-
* @param {Object} event - payload emitted
|
|
1816
|
-
*/
|
|
1817
|
-
Player.prototype._priv_onPlaybackEvent = function (event) {
|
|
1818
|
-
switch (event.type) {
|
|
1819
|
-
case "inband-events":
|
|
1820
|
-
var inbandEvents = event.value;
|
|
1821
|
-
this.trigger("inbandEvents", inbandEvents);
|
|
1822
|
-
return;
|
|
1823
|
-
case "stream-event":
|
|
1824
|
-
this.trigger("streamEvent", event.value);
|
|
1825
|
-
break;
|
|
1826
|
-
case "stream-event-skip":
|
|
1827
|
-
this.trigger("streamEventSkip", event.value);
|
|
1828
|
-
break;
|
|
1829
|
-
case "activePeriodChanged":
|
|
1830
|
-
this._priv_onActivePeriodChanged(event.value);
|
|
1831
|
-
break;
|
|
1832
|
-
case "periodStreamReady":
|
|
1833
|
-
this._priv_onPeriodStreamReady(event.value);
|
|
1834
|
-
break;
|
|
1835
|
-
case "periodStreamCleared":
|
|
1836
|
-
this._priv_onPeriodStreamCleared(event.value);
|
|
1837
|
-
break;
|
|
1838
|
-
case "reloading-media-source":
|
|
1839
|
-
this._priv_onReloadingMediaSource();
|
|
1840
|
-
break;
|
|
1841
|
-
case "representationChange":
|
|
1842
|
-
this._priv_onRepresentationChange(event.value);
|
|
1843
|
-
break;
|
|
1844
|
-
case "adaptationChange":
|
|
1845
|
-
this._priv_onAdaptationChange(event.value);
|
|
1846
|
-
break;
|
|
1847
|
-
case "bitrateEstimationChange":
|
|
1848
|
-
this._priv_onBitrateEstimationChange(event.value);
|
|
1849
|
-
break;
|
|
1850
|
-
case "manifestReady":
|
|
1851
|
-
this._priv_onManifestReady(event.value);
|
|
1852
|
-
break;
|
|
1853
|
-
case "warning":
|
|
1854
|
-
this._priv_onPlaybackWarning(event.value);
|
|
1855
|
-
break;
|
|
1856
|
-
case "loaded":
|
|
1857
|
-
if (this._priv_contentInfos === null) {
|
|
1858
|
-
log.error("API: Loaded event while no content is loaded");
|
|
1859
|
-
return;
|
|
1860
|
-
}
|
|
1861
|
-
this._priv_contentInfos.segmentBuffersStore = event.value.segmentBuffersStore;
|
|
1862
|
-
break;
|
|
1863
|
-
case "decipherabilityUpdate":
|
|
1864
|
-
this.trigger("decipherabilityUpdate", event.value);
|
|
1865
|
-
break;
|
|
1866
|
-
case "added-segment":
|
|
1867
|
-
if (this._priv_contentInfos === null) {
|
|
1868
|
-
log.error("API: Added segment while no content is loaded");
|
|
1869
|
-
return;
|
|
1870
|
-
}
|
|
1871
|
-
// Manage image tracks
|
|
1872
|
-
// @deprecated
|
|
1873
|
-
var _a = event.value, content = _a.content, segmentData = _a.segmentData;
|
|
1874
|
-
if (content.adaptation.type === "image") {
|
|
1875
|
-
if (!isNullOrUndefined(segmentData) &&
|
|
1876
|
-
segmentData.type === "bif") {
|
|
1877
|
-
var imageData = segmentData.data;
|
|
1878
|
-
/* eslint-disable import/no-deprecated */
|
|
1879
|
-
this._priv_contentInfos.thumbnails = imageData;
|
|
1880
|
-
this.trigger("imageTrackUpdate", { data: this._priv_contentInfos.thumbnails });
|
|
1881
|
-
/* eslint-enable import/no-deprecated */
|
|
1882
|
-
}
|
|
1883
|
-
}
|
|
1884
|
-
}
|
|
1885
|
-
};
|
|
1886
|
-
/**
|
|
1887
|
-
* Triggered when we received a fatal error.
|
|
1888
|
-
* Clean-up ressources and signal that the content has stopped on error.
|
|
1889
|
-
* @param {Error} error
|
|
1890
|
-
*/
|
|
1891
|
-
Player.prototype._priv_onPlaybackError = function (error) {
|
|
1892
|
-
var formattedError = formatError(error, {
|
|
1893
|
-
defaultCode: "NONE",
|
|
1894
|
-
defaultReason: "An unknown error stopped content playback.",
|
|
1895
|
-
});
|
|
1896
|
-
formattedError.fatal = true;
|
|
1897
|
-
if (this._priv_contentInfos !== null) {
|
|
1898
|
-
this._priv_contentInfos.currentContentCanceller.cancel();
|
|
1899
|
-
}
|
|
1900
|
-
this._priv_cleanUpCurrentContentState();
|
|
1901
|
-
this._priv_currentError = formattedError;
|
|
1902
|
-
log.error("API: The player stopped because of an error", error instanceof Error ? error : "");
|
|
1903
|
-
this._priv_setPlayerState("STOPPED" /* PLAYER_STATES.STOPPED */);
|
|
1904
|
-
// TODO This condition is here because the eventual callback called when the
|
|
1905
|
-
// player state is updated can launch a new content, thus the error will not
|
|
1906
|
-
// be here anymore, in which case triggering the "error" event is unwanted.
|
|
1907
|
-
// This is very ugly though, and we should probable have a better solution
|
|
1908
|
-
if (this._priv_currentError === formattedError) {
|
|
1909
|
-
this.trigger("error", formattedError);
|
|
1910
|
-
}
|
|
1911
|
-
};
|
|
1912
|
-
/**
|
|
1913
|
-
* Triggered when we received a warning event during playback.
|
|
1914
|
-
* Trigger the right API event.
|
|
1915
|
-
* @param {Error} error
|
|
1916
|
-
*/
|
|
1917
|
-
Player.prototype._priv_onPlaybackWarning = function (error) {
|
|
1918
|
-
var formattedError = formatError(error, {
|
|
1919
|
-
defaultCode: "NONE",
|
|
1920
|
-
defaultReason: "An unknown error happened.",
|
|
1921
|
-
});
|
|
1922
|
-
log.warn("API: Sending warning:", formattedError);
|
|
1923
|
-
this.trigger("warning", formattedError);
|
|
1924
|
-
};
|
|
1925
1815
|
/**
|
|
1926
1816
|
* Triggered when the Manifest has been loaded for the current content.
|
|
1927
1817
|
* Initialize various private properties and emit initial event.
|
|
1928
|
-
* @param {Object}
|
|
1818
|
+
* @param {Object} contentInfos
|
|
1819
|
+
* @param {Object} manifest
|
|
1929
1820
|
*/
|
|
1930
|
-
Player.prototype._priv_onManifestReady = function (
|
|
1821
|
+
Player.prototype._priv_onManifestReady = function (contentInfos, manifest) {
|
|
1931
1822
|
var _this = this;
|
|
1932
|
-
var
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
log.error("API: The manifest is loaded but no content is.");
|
|
1936
|
-
return;
|
|
1823
|
+
var _a;
|
|
1824
|
+
if (contentInfos.contentId !== ((_a = this._priv_contentInfos) === null || _a === void 0 ? void 0 : _a.contentId)) {
|
|
1825
|
+
return; // Event for another content
|
|
1937
1826
|
}
|
|
1938
1827
|
contentInfos.manifest = manifest;
|
|
1828
|
+
var cancelSignal = contentInfos.currentContentCanceller.signal;
|
|
1939
1829
|
this._priv_reloadingMetadata.manifest = manifest;
|
|
1940
1830
|
var initialAudioTrack = contentInfos.initialAudioTrack, initialTextTrack = contentInfos.initialTextTrack;
|
|
1941
|
-
|
|
1831
|
+
contentInfos.trackChoiceManager = new TrackChoiceManager({
|
|
1942
1832
|
preferTrickModeTracks: this._priv_preferTrickModeTracks,
|
|
1943
1833
|
});
|
|
1944
1834
|
var preferredAudioTracks = initialAudioTrack === undefined ?
|
|
1945
1835
|
this._priv_preferredAudioTracks :
|
|
1946
1836
|
[initialAudioTrack];
|
|
1947
|
-
|
|
1837
|
+
contentInfos.trackChoiceManager.setPreferredAudioTracks(preferredAudioTracks, true);
|
|
1948
1838
|
var preferredTextTracks = initialTextTrack === undefined ?
|
|
1949
1839
|
this._priv_preferredTextTracks :
|
|
1950
1840
|
[initialTextTrack];
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1841
|
+
contentInfos.trackChoiceManager.setPreferredTextTracks(preferredTextTracks, true);
|
|
1842
|
+
contentInfos.trackChoiceManager
|
|
1843
|
+
.setPreferredVideoTracks(this._priv_preferredVideoTracks, true);
|
|
1844
|
+
manifest.addEventListener("manifestUpdate", function (updates) {
|
|
1845
|
+
var _a, _b, _c;
|
|
1954
1846
|
// Update the tracks chosen if it changed
|
|
1955
|
-
if (
|
|
1956
|
-
|
|
1847
|
+
if (contentInfos.trackChoiceManager !== null) {
|
|
1848
|
+
contentInfos.trackChoiceManager.update();
|
|
1849
|
+
}
|
|
1850
|
+
var currentPeriod = (_b = (_a = _this._priv_contentInfos) === null || _a === void 0 ? void 0 : _a.currentPeriod) !== null && _b !== void 0 ? _b : undefined;
|
|
1851
|
+
var trackChoiceManager = (_c = _this._priv_contentInfos) === null || _c === void 0 ? void 0 : _c.trackChoiceManager;
|
|
1852
|
+
if (currentPeriod === undefined || isNullOrUndefined(trackChoiceManager)) {
|
|
1853
|
+
return;
|
|
1854
|
+
}
|
|
1855
|
+
for (var _i = 0, _d = updates.updatedPeriods; _i < _d.length; _i++) {
|
|
1856
|
+
var update = _d[_i];
|
|
1857
|
+
if (update.period.id === currentPeriod.id) {
|
|
1858
|
+
if (update.result.addedAdaptations.length > 0 ||
|
|
1859
|
+
update.result.removedAdaptations.length > 0) {
|
|
1860
|
+
// We might have new (or less) tracks, send events just to be sure
|
|
1861
|
+
var audioTracks = trackChoiceManager.getAvailableAudioTracks(currentPeriod);
|
|
1862
|
+
_this._priv_triggerEventIfNotStopped("availableAudioTracksChange", audioTracks !== null && audioTracks !== void 0 ? audioTracks : [], cancelSignal);
|
|
1863
|
+
var textTracks = trackChoiceManager.getAvailableTextTracks(currentPeriod);
|
|
1864
|
+
_this._priv_triggerEventIfNotStopped("availableTextTracksChange", textTracks !== null && textTracks !== void 0 ? textTracks : [], cancelSignal);
|
|
1865
|
+
var videoTracks = trackChoiceManager.getAvailableVideoTracks(currentPeriod);
|
|
1866
|
+
_this._priv_triggerEventIfNotStopped("availableVideoTracksChange", videoTracks !== null && videoTracks !== void 0 ? videoTracks : [], cancelSignal);
|
|
1867
|
+
}
|
|
1868
|
+
}
|
|
1869
|
+
return;
|
|
1957
1870
|
}
|
|
1958
1871
|
}, contentInfos.currentContentCanceller.signal);
|
|
1959
1872
|
};
|
|
@@ -1961,114 +1874,134 @@ var Player = /** @class */ (function (_super) {
|
|
|
1961
1874
|
* Triggered each times the current Period Changed.
|
|
1962
1875
|
* Store and emit initial state for the Period.
|
|
1963
1876
|
*
|
|
1964
|
-
* @param {Object}
|
|
1877
|
+
* @param {Object} contentInfos
|
|
1878
|
+
* @param {Object} periodInfo
|
|
1965
1879
|
*/
|
|
1966
|
-
Player.prototype._priv_onActivePeriodChanged = function (_a) {
|
|
1967
|
-
var _b, _c, _d, _e, _f, _g;
|
|
1880
|
+
Player.prototype._priv_onActivePeriodChanged = function (contentInfos, _a) {
|
|
1881
|
+
var _b, _c, _d, _e, _f, _g, _h, _j;
|
|
1968
1882
|
var period = _a.period;
|
|
1969
|
-
if (this._priv_contentInfos === null) {
|
|
1970
|
-
|
|
1971
|
-
return;
|
|
1883
|
+
if (contentInfos.contentId !== ((_b = this._priv_contentInfos) === null || _b === void 0 ? void 0 : _b.contentId)) {
|
|
1884
|
+
return; // Event for another content
|
|
1972
1885
|
}
|
|
1973
|
-
|
|
1886
|
+
contentInfos.currentPeriod = period;
|
|
1887
|
+
var cancelSignal = contentInfos.currentContentCanceller.signal;
|
|
1974
1888
|
if (this._priv_contentEventsMemory.periodChange !== period) {
|
|
1975
1889
|
this._priv_contentEventsMemory.periodChange = period;
|
|
1976
|
-
this.
|
|
1890
|
+
this._priv_triggerEventIfNotStopped("periodChange", period, cancelSignal);
|
|
1977
1891
|
}
|
|
1978
|
-
this.
|
|
1979
|
-
this.
|
|
1980
|
-
this.
|
|
1892
|
+
this._priv_triggerEventIfNotStopped("availableAudioTracksChange", this.getAvailableAudioTracks(), cancelSignal);
|
|
1893
|
+
this._priv_triggerEventIfNotStopped("availableTextTracksChange", this.getAvailableTextTracks(), cancelSignal);
|
|
1894
|
+
this._priv_triggerEventIfNotStopped("availableVideoTracksChange", this.getAvailableVideoTracks(), cancelSignal);
|
|
1895
|
+
var trackChoiceManager = (_c = this._priv_contentInfos) === null || _c === void 0 ? void 0 : _c.trackChoiceManager;
|
|
1981
1896
|
// Emit intial events for the Period
|
|
1982
|
-
if (
|
|
1983
|
-
var audioTrack =
|
|
1984
|
-
|
|
1985
|
-
var
|
|
1986
|
-
this.
|
|
1987
|
-
|
|
1988
|
-
this.
|
|
1897
|
+
if (!isNullOrUndefined(trackChoiceManager)) {
|
|
1898
|
+
var audioTrack = trackChoiceManager.getChosenAudioTrack(period);
|
|
1899
|
+
this._priv_triggerEventIfNotStopped("audioTrackChange", audioTrack, cancelSignal);
|
|
1900
|
+
var textTrack = trackChoiceManager.getChosenTextTrack(period);
|
|
1901
|
+
this._priv_triggerEventIfNotStopped("textTrackChange", textTrack, cancelSignal);
|
|
1902
|
+
var videoTrack = trackChoiceManager.getChosenVideoTrack(period);
|
|
1903
|
+
this._priv_triggerEventIfNotStopped("videoTrackChange", videoTrack, cancelSignal);
|
|
1989
1904
|
}
|
|
1990
1905
|
else {
|
|
1991
|
-
this.
|
|
1992
|
-
this.
|
|
1993
|
-
this.
|
|
1906
|
+
this._priv_triggerEventIfNotStopped("audioTrackChange", null, cancelSignal);
|
|
1907
|
+
this._priv_triggerEventIfNotStopped("textTrackChange", null, cancelSignal);
|
|
1908
|
+
this._priv_triggerEventIfNotStopped("videoTrackChange", null, cancelSignal);
|
|
1909
|
+
}
|
|
1910
|
+
this._priv_triggerAvailableBitratesChangeEvent("availableAudioBitratesChange", this.getAvailableAudioBitrates(), cancelSignal);
|
|
1911
|
+
if (contentInfos.currentContentCanceller.isUsed) {
|
|
1912
|
+
return;
|
|
1913
|
+
}
|
|
1914
|
+
this._priv_triggerAvailableBitratesChangeEvent("availableVideoBitratesChange", this.getAvailableVideoBitrates(), cancelSignal);
|
|
1915
|
+
if (contentInfos.currentContentCanceller.isUsed) {
|
|
1916
|
+
return;
|
|
1994
1917
|
}
|
|
1995
|
-
|
|
1996
|
-
this.
|
|
1997
|
-
|
|
1998
|
-
|
|
1999
|
-
|
|
2000
|
-
this.
|
|
1918
|
+
var audioBitrate = (_f = (_e = (_d = this._priv_getCurrentRepresentations()) === null || _d === void 0 ? void 0 : _d.audio) === null || _e === void 0 ? void 0 : _e.bitrate) !== null && _f !== void 0 ? _f : -1;
|
|
1919
|
+
this._priv_triggerCurrentBitrateChangeEvent("audioBitrateChange", audioBitrate, cancelSignal);
|
|
1920
|
+
if (contentInfos.currentContentCanceller.isUsed) {
|
|
1921
|
+
return;
|
|
1922
|
+
}
|
|
1923
|
+
var videoBitrate = (_j = (_h = (_g = this._priv_getCurrentRepresentations()) === null || _g === void 0 ? void 0 : _g.video) === null || _h === void 0 ? void 0 : _h.bitrate) !== null && _j !== void 0 ? _j : -1;
|
|
1924
|
+
this._priv_triggerCurrentBitrateChangeEvent("videoBitrateChange", videoBitrate, cancelSignal);
|
|
2001
1925
|
};
|
|
2002
1926
|
/**
|
|
2003
1927
|
* Triggered each times a new "PeriodStream" is ready.
|
|
2004
1928
|
* Choose the right Adaptation for the Period and emit it.
|
|
1929
|
+
* @param {Object} contentInfos
|
|
2005
1930
|
* @param {Object} value
|
|
2006
1931
|
*/
|
|
2007
|
-
Player.prototype._priv_onPeriodStreamReady = function (value) {
|
|
2008
|
-
var
|
|
1932
|
+
Player.prototype._priv_onPeriodStreamReady = function (contentInfos, value) {
|
|
1933
|
+
var _a;
|
|
1934
|
+
if (contentInfos.contentId !== ((_a = this._priv_contentInfos) === null || _a === void 0 ? void 0 : _a.contentId)) {
|
|
1935
|
+
return; // Event for another content
|
|
1936
|
+
}
|
|
1937
|
+
var type = value.type, period = value.period, adaptationRef = value.adaptationRef;
|
|
1938
|
+
var trackChoiceManager = contentInfos.trackChoiceManager;
|
|
2009
1939
|
switch (type) {
|
|
2010
1940
|
case "video":
|
|
2011
|
-
if (
|
|
1941
|
+
if (isNullOrUndefined(trackChoiceManager)) {
|
|
2012
1942
|
log.error("API: TrackChoiceManager not instanciated for a new video period");
|
|
2013
|
-
|
|
1943
|
+
adaptationRef.setValue(null);
|
|
2014
1944
|
}
|
|
2015
1945
|
else {
|
|
2016
|
-
|
|
2017
|
-
|
|
1946
|
+
trackChoiceManager.addPeriod(type, period, adaptationRef);
|
|
1947
|
+
trackChoiceManager.setInitialVideoTrack(period);
|
|
2018
1948
|
}
|
|
2019
1949
|
break;
|
|
2020
1950
|
case "audio":
|
|
2021
|
-
if (
|
|
1951
|
+
if (isNullOrUndefined(trackChoiceManager)) {
|
|
2022
1952
|
log.error("API: TrackChoiceManager not instanciated for a new ".concat(type, " period"));
|
|
2023
|
-
|
|
1953
|
+
adaptationRef.setValue(null);
|
|
2024
1954
|
}
|
|
2025
1955
|
else {
|
|
2026
|
-
|
|
2027
|
-
|
|
1956
|
+
trackChoiceManager.addPeriod(type, period, adaptationRef);
|
|
1957
|
+
trackChoiceManager.setInitialAudioTrack(period);
|
|
2028
1958
|
}
|
|
2029
1959
|
break;
|
|
2030
1960
|
case "text":
|
|
2031
|
-
if (
|
|
1961
|
+
if (isNullOrUndefined(trackChoiceManager)) {
|
|
2032
1962
|
log.error("API: TrackChoiceManager not instanciated for a new ".concat(type, " period"));
|
|
2033
|
-
|
|
1963
|
+
adaptationRef.setValue(null);
|
|
2034
1964
|
}
|
|
2035
1965
|
else {
|
|
2036
|
-
|
|
2037
|
-
|
|
1966
|
+
trackChoiceManager.addPeriod(type, period, adaptationRef);
|
|
1967
|
+
trackChoiceManager.setInitialTextTrack(period);
|
|
2038
1968
|
}
|
|
2039
1969
|
break;
|
|
2040
1970
|
default:
|
|
2041
1971
|
var adaptations = period.adaptations[type];
|
|
2042
1972
|
if (!isNullOrUndefined(adaptations) && adaptations.length > 0) {
|
|
2043
|
-
|
|
1973
|
+
adaptationRef.setValue(adaptations[0]);
|
|
2044
1974
|
}
|
|
2045
1975
|
else {
|
|
2046
|
-
|
|
1976
|
+
adaptationRef.setValue(null);
|
|
2047
1977
|
}
|
|
2048
1978
|
break;
|
|
2049
1979
|
}
|
|
2050
1980
|
};
|
|
2051
1981
|
/**
|
|
2052
1982
|
* Triggered each times we "remove" a PeriodStream.
|
|
1983
|
+
* @param {Object} contentInfos
|
|
2053
1984
|
* @param {Object} value
|
|
2054
1985
|
*/
|
|
2055
|
-
Player.prototype._priv_onPeriodStreamCleared = function (value) {
|
|
1986
|
+
Player.prototype._priv_onPeriodStreamCleared = function (contentInfos, value) {
|
|
1987
|
+
var _a;
|
|
1988
|
+
if (contentInfos.contentId !== ((_a = this._priv_contentInfos) === null || _a === void 0 ? void 0 : _a.contentId)) {
|
|
1989
|
+
return; // Event for another content
|
|
1990
|
+
}
|
|
2056
1991
|
var type = value.type, period = value.period;
|
|
1992
|
+
var trackChoiceManager = contentInfos.trackChoiceManager;
|
|
2057
1993
|
// Clean-up track choice from TrackChoiceManager
|
|
2058
1994
|
switch (type) {
|
|
2059
1995
|
case "audio":
|
|
2060
1996
|
case "text":
|
|
2061
1997
|
case "video":
|
|
2062
|
-
if (
|
|
2063
|
-
|
|
1998
|
+
if (!isNullOrUndefined(trackChoiceManager)) {
|
|
1999
|
+
trackChoiceManager.removePeriod(type, period);
|
|
2064
2000
|
}
|
|
2065
2001
|
break;
|
|
2066
2002
|
}
|
|
2067
2003
|
// Clean-up stored Representation and Adaptation information
|
|
2068
|
-
|
|
2069
|
-
return;
|
|
2070
|
-
}
|
|
2071
|
-
var _a = this._priv_contentInfos, activeAdaptations = _a.activeAdaptations, activeRepresentations = _a.activeRepresentations;
|
|
2004
|
+
var activeAdaptations = contentInfos.activeAdaptations, activeRepresentations = contentInfos.activeRepresentations;
|
|
2072
2005
|
if (!isNullOrUndefined(activeAdaptations) &&
|
|
2073
2006
|
!isNullOrUndefined(activeAdaptations[period.id])) {
|
|
2074
2007
|
var activePeriodAdaptations = activeAdaptations[period.id];
|
|
@@ -2086,35 +2019,25 @@ var Player = /** @class */ (function (_super) {
|
|
|
2086
2019
|
}
|
|
2087
2020
|
}
|
|
2088
2021
|
};
|
|
2089
|
-
/**
|
|
2090
|
-
* Triggered each time the content is re-loaded on the MediaSource.
|
|
2091
|
-
*/
|
|
2092
|
-
Player.prototype._priv_onReloadingMediaSource = function () {
|
|
2093
|
-
if (this._priv_contentInfos !== null) {
|
|
2094
|
-
this._priv_contentInfos.segmentBuffersStore = null;
|
|
2095
|
-
}
|
|
2096
|
-
if (this._priv_trackChoiceManager !== null) {
|
|
2097
|
-
this._priv_trackChoiceManager.resetPeriods();
|
|
2098
|
-
}
|
|
2099
|
-
};
|
|
2100
2022
|
/**
|
|
2101
2023
|
* Triggered each times a new Adaptation is considered for the current
|
|
2102
2024
|
* content.
|
|
2103
2025
|
* Store given Adaptation and emit it if from the current Period.
|
|
2026
|
+
* @param {Object} contentInfos
|
|
2104
2027
|
* @param {Object} value
|
|
2105
2028
|
*/
|
|
2106
|
-
Player.prototype._priv_onAdaptationChange = function (_a) {
|
|
2029
|
+
Player.prototype._priv_onAdaptationChange = function (contentInfos, _a) {
|
|
2107
2030
|
var _b;
|
|
2031
|
+
var _c;
|
|
2108
2032
|
var type = _a.type, adaptation = _a.adaptation, period = _a.period;
|
|
2109
|
-
if (this._priv_contentInfos === null) {
|
|
2110
|
-
|
|
2111
|
-
return;
|
|
2033
|
+
if (contentInfos.contentId !== ((_c = this._priv_contentInfos) === null || _c === void 0 ? void 0 : _c.contentId)) {
|
|
2034
|
+
return; // Event for another content
|
|
2112
2035
|
}
|
|
2113
|
-
// lazily create
|
|
2114
|
-
if (
|
|
2115
|
-
|
|
2036
|
+
// lazily create contentInfos.activeAdaptations
|
|
2037
|
+
if (contentInfos.activeAdaptations === null) {
|
|
2038
|
+
contentInfos.activeAdaptations = {};
|
|
2116
2039
|
}
|
|
2117
|
-
var
|
|
2040
|
+
var activeAdaptations = contentInfos.activeAdaptations, currentPeriod = contentInfos.currentPeriod;
|
|
2118
2041
|
var activePeriodAdaptations = activeAdaptations[period.id];
|
|
2119
2042
|
if (isNullOrUndefined(activePeriodAdaptations)) {
|
|
2120
2043
|
activeAdaptations[period.id] = (_b = {}, _b[type] = adaptation, _b);
|
|
@@ -2122,28 +2045,27 @@ var Player = /** @class */ (function (_super) {
|
|
|
2122
2045
|
else {
|
|
2123
2046
|
activePeriodAdaptations[type] = adaptation;
|
|
2124
2047
|
}
|
|
2125
|
-
|
|
2048
|
+
var trackChoiceManager = contentInfos.trackChoiceManager;
|
|
2049
|
+
var cancelSignal = contentInfos.currentContentCanceller.signal;
|
|
2050
|
+
if (trackChoiceManager !== null &&
|
|
2126
2051
|
currentPeriod !== null && !isNullOrUndefined(period) &&
|
|
2127
2052
|
period.id === currentPeriod.id) {
|
|
2128
2053
|
switch (type) {
|
|
2129
2054
|
case "audio":
|
|
2130
|
-
var audioTrack =
|
|
2131
|
-
|
|
2132
|
-
this.trigger("audioTrackChange", audioTrack);
|
|
2055
|
+
var audioTrack = trackChoiceManager.getChosenAudioTrack(currentPeriod);
|
|
2056
|
+
this._priv_triggerEventIfNotStopped("audioTrackChange", audioTrack, cancelSignal);
|
|
2133
2057
|
var availableAudioBitrates = this.getAvailableAudioBitrates();
|
|
2134
|
-
this._priv_triggerAvailableBitratesChangeEvent("availableAudioBitratesChange", availableAudioBitrates);
|
|
2058
|
+
this._priv_triggerAvailableBitratesChangeEvent("availableAudioBitratesChange", availableAudioBitrates, cancelSignal);
|
|
2135
2059
|
break;
|
|
2136
2060
|
case "text":
|
|
2137
|
-
var textTrack =
|
|
2138
|
-
|
|
2139
|
-
this.trigger("textTrackChange", textTrack);
|
|
2061
|
+
var textTrack = trackChoiceManager.getChosenTextTrack(currentPeriod);
|
|
2062
|
+
this._priv_triggerEventIfNotStopped("textTrackChange", textTrack, cancelSignal);
|
|
2140
2063
|
break;
|
|
2141
2064
|
case "video":
|
|
2142
|
-
var videoTrack =
|
|
2143
|
-
|
|
2144
|
-
this.trigger("videoTrackChange", videoTrack);
|
|
2065
|
+
var videoTrack = trackChoiceManager.getChosenVideoTrack(currentPeriod);
|
|
2066
|
+
this._priv_triggerEventIfNotStopped("videoTrackChange", videoTrack, cancelSignal);
|
|
2145
2067
|
var availableVideoBitrates = this.getAvailableVideoBitrates();
|
|
2146
|
-
this._priv_triggerAvailableBitratesChangeEvent("availableVideoBitratesChange", availableVideoBitrates);
|
|
2068
|
+
this._priv_triggerAvailableBitratesChangeEvent("availableVideoBitratesChange", availableVideoBitrates, cancelSignal);
|
|
2147
2069
|
break;
|
|
2148
2070
|
}
|
|
2149
2071
|
}
|
|
@@ -2153,21 +2075,21 @@ var Player = /** @class */ (function (_super) {
|
|
|
2153
2075
|
*
|
|
2154
2076
|
* Store given Representation and emit it if from the current Period.
|
|
2155
2077
|
*
|
|
2078
|
+
* @param {Object} contentInfos
|
|
2156
2079
|
* @param {Object} obj
|
|
2157
2080
|
*/
|
|
2158
|
-
Player.prototype._priv_onRepresentationChange = function (_a) {
|
|
2081
|
+
Player.prototype._priv_onRepresentationChange = function (contentInfos, _a) {
|
|
2159
2082
|
var _b;
|
|
2160
|
-
var _c;
|
|
2083
|
+
var _c, _d;
|
|
2161
2084
|
var type = _a.type, period = _a.period, representation = _a.representation;
|
|
2162
|
-
if (this._priv_contentInfos === null) {
|
|
2163
|
-
|
|
2164
|
-
return;
|
|
2085
|
+
if (contentInfos.contentId !== ((_c = this._priv_contentInfos) === null || _c === void 0 ? void 0 : _c.contentId)) {
|
|
2086
|
+
return; // Event for another content
|
|
2165
2087
|
}
|
|
2166
|
-
// lazily create
|
|
2167
|
-
if (
|
|
2168
|
-
|
|
2088
|
+
// lazily create contentInfos.activeRepresentations
|
|
2089
|
+
if (contentInfos.activeRepresentations === null) {
|
|
2090
|
+
contentInfos.activeRepresentations = {};
|
|
2169
2091
|
}
|
|
2170
|
-
var
|
|
2092
|
+
var activeRepresentations = contentInfos.activeRepresentations, currentPeriod = contentInfos.currentPeriod;
|
|
2171
2093
|
var activePeriodRepresentations = activeRepresentations[period.id];
|
|
2172
2094
|
if (isNullOrUndefined(activePeriodRepresentations)) {
|
|
2173
2095
|
activeRepresentations[period.id] = (_b = {}, _b[type] = representation, _b);
|
|
@@ -2175,15 +2097,16 @@ var Player = /** @class */ (function (_super) {
|
|
|
2175
2097
|
else {
|
|
2176
2098
|
activePeriodRepresentations[type] = representation;
|
|
2177
2099
|
}
|
|
2178
|
-
var bitrate = (
|
|
2100
|
+
var bitrate = (_d = representation === null || representation === void 0 ? void 0 : representation.bitrate) !== null && _d !== void 0 ? _d : -1;
|
|
2179
2101
|
if (!isNullOrUndefined(period) &&
|
|
2180
2102
|
currentPeriod !== null &&
|
|
2181
2103
|
currentPeriod.id === period.id) {
|
|
2104
|
+
var cancelSignal = this._priv_contentInfos.currentContentCanceller.signal;
|
|
2182
2105
|
if (type === "video") {
|
|
2183
|
-
this._priv_triggerCurrentBitrateChangeEvent("videoBitrateChange", bitrate);
|
|
2106
|
+
this._priv_triggerCurrentBitrateChangeEvent("videoBitrateChange", bitrate, cancelSignal);
|
|
2184
2107
|
}
|
|
2185
2108
|
else if (type === "audio") {
|
|
2186
|
-
this._priv_triggerCurrentBitrateChangeEvent("audioBitrateChange", bitrate);
|
|
2109
|
+
this._priv_triggerCurrentBitrateChangeEvent("audioBitrateChange", bitrate, cancelSignal);
|
|
2187
2110
|
}
|
|
2188
2111
|
}
|
|
2189
2112
|
};
|
|
@@ -2230,15 +2153,15 @@ var Player = /** @class */ (function (_super) {
|
|
|
2230
2153
|
*
|
|
2231
2154
|
* Trigger the right Player Event
|
|
2232
2155
|
*
|
|
2156
|
+
* @param {Object} contentInfos
|
|
2233
2157
|
* @param {Object} observation
|
|
2234
2158
|
*/
|
|
2235
|
-
Player.prototype._priv_triggerPositionUpdate = function (observation) {
|
|
2236
|
-
var _a;
|
|
2237
|
-
if (this._priv_contentInfos === null) {
|
|
2238
|
-
|
|
2239
|
-
return;
|
|
2159
|
+
Player.prototype._priv_triggerPositionUpdate = function (contentInfos, observation) {
|
|
2160
|
+
var _a, _b;
|
|
2161
|
+
if (contentInfos.contentId !== ((_a = this._priv_contentInfos) === null || _a === void 0 ? void 0 : _a.contentId)) {
|
|
2162
|
+
return; // Event for another content
|
|
2240
2163
|
}
|
|
2241
|
-
var
|
|
2164
|
+
var isDirectFile = contentInfos.isDirectFile, manifest = contentInfos.manifest;
|
|
2242
2165
|
if ((!isDirectFile && manifest === null) || isNullOrUndefined(observation)) {
|
|
2243
2166
|
return;
|
|
2244
2167
|
}
|
|
@@ -2258,7 +2181,7 @@ var Player = /** @class */ (function (_super) {
|
|
|
2258
2181
|
if (manifest !== null &&
|
|
2259
2182
|
manifest.isLive &&
|
|
2260
2183
|
observation.position > 0) {
|
|
2261
|
-
var ast = (
|
|
2184
|
+
var ast = (_b = manifest.availabilityStartTime) !== null && _b !== void 0 ? _b : 0;
|
|
2262
2185
|
positionData.wallClockTime = observation.position + ast;
|
|
2263
2186
|
var livePosition = manifest.getLivePosition();
|
|
2264
2187
|
if (livePosition !== undefined) {
|
|
@@ -2278,10 +2201,12 @@ var Player = /** @class */ (function (_super) {
|
|
|
2278
2201
|
* the previously stored value.
|
|
2279
2202
|
* @param {string} event
|
|
2280
2203
|
* @param {Array.<number>} newVal
|
|
2204
|
+
* @param {Object} currentContentCancelSignal
|
|
2281
2205
|
*/
|
|
2282
|
-
Player.prototype._priv_triggerAvailableBitratesChangeEvent = function (event, newVal) {
|
|
2206
|
+
Player.prototype._priv_triggerAvailableBitratesChangeEvent = function (event, newVal, currentContentCancelSignal) {
|
|
2283
2207
|
var prevVal = this._priv_contentEventsMemory[event];
|
|
2284
|
-
if (
|
|
2208
|
+
if (!currentContentCancelSignal.isCancelled &&
|
|
2209
|
+
(prevVal === undefined || !areArraysOfNumbersEqual(newVal, prevVal))) {
|
|
2285
2210
|
this._priv_contentEventsMemory[event] = newVal;
|
|
2286
2211
|
this.trigger(event, newVal);
|
|
2287
2212
|
}
|
|
@@ -2291,9 +2216,11 @@ var Player = /** @class */ (function (_super) {
|
|
|
2291
2216
|
* previously stored value.
|
|
2292
2217
|
* @param {string} event
|
|
2293
2218
|
* @param {number} newVal
|
|
2219
|
+
* @param {Object} currentContentCancelSignal
|
|
2294
2220
|
*/
|
|
2295
|
-
Player.prototype._priv_triggerCurrentBitrateChangeEvent = function (event, newVal) {
|
|
2296
|
-
if (
|
|
2221
|
+
Player.prototype._priv_triggerCurrentBitrateChangeEvent = function (event, newVal, currentContentCancelSignal) {
|
|
2222
|
+
if (!currentContentCancelSignal.isCancelled &&
|
|
2223
|
+
newVal !== this._priv_contentEventsMemory[event]) {
|
|
2297
2224
|
this._priv_contentEventsMemory[event] = newVal;
|
|
2298
2225
|
this.trigger(event, newVal);
|
|
2299
2226
|
}
|
|
@@ -2310,7 +2237,71 @@ var Player = /** @class */ (function (_super) {
|
|
|
2310
2237
|
}
|
|
2311
2238
|
return activeRepresentations[currentPeriod.id];
|
|
2312
2239
|
};
|
|
2240
|
+
/**
|
|
2241
|
+
* @param {string} evt
|
|
2242
|
+
* @param {*} arg
|
|
2243
|
+
* @param {Object} currentContentCancelSignal
|
|
2244
|
+
*/
|
|
2245
|
+
Player.prototype._priv_triggerEventIfNotStopped = function (evt, arg, currentContentCancelSignal) {
|
|
2246
|
+
if (!currentContentCancelSignal.isCancelled) {
|
|
2247
|
+
this.trigger(evt, arg);
|
|
2248
|
+
}
|
|
2249
|
+
};
|
|
2250
|
+
/**
|
|
2251
|
+
* @param {Object} defaultAudioTrack
|
|
2252
|
+
* @param {Object} defaultTextTrack
|
|
2253
|
+
* @param {Object} cancelSignal
|
|
2254
|
+
* @returns {Object}
|
|
2255
|
+
*/
|
|
2256
|
+
Player.prototype._priv_initializeMediaElementTrackChoiceManager = function (defaultAudioTrack, defaultTextTrack, cancelSignal) {
|
|
2257
|
+
var _this = this;
|
|
2258
|
+
var _a, _b, _c;
|
|
2259
|
+
assert(features.directfile !== null, "Initializing `MediaElementTrackChoiceManager` without Directfile feature");
|
|
2260
|
+
assert(this.videoElement !== null, "Initializing `MediaElementTrackChoiceManager` on a disposed RxPlayer");
|
|
2261
|
+
var mediaElementTrackChoiceManager = new features.directfile.mediaElementTrackChoiceManager(this.videoElement);
|
|
2262
|
+
var preferredAudioTracks = defaultAudioTrack === undefined ?
|
|
2263
|
+
this._priv_preferredAudioTracks :
|
|
2264
|
+
[defaultAudioTrack];
|
|
2265
|
+
mediaElementTrackChoiceManager.setPreferredAudioTracks(preferredAudioTracks, true);
|
|
2266
|
+
var preferredTextTracks = defaultTextTrack === undefined ?
|
|
2267
|
+
this._priv_preferredTextTracks :
|
|
2268
|
+
[defaultTextTrack];
|
|
2269
|
+
mediaElementTrackChoiceManager.setPreferredTextTracks(preferredTextTracks, true);
|
|
2270
|
+
mediaElementTrackChoiceManager
|
|
2271
|
+
.setPreferredVideoTracks(this._priv_preferredVideoTracks, true);
|
|
2272
|
+
this._priv_triggerEventIfNotStopped("availableAudioTracksChange", mediaElementTrackChoiceManager.getAvailableAudioTracks(), cancelSignal);
|
|
2273
|
+
this._priv_triggerEventIfNotStopped("availableVideoTracksChange", mediaElementTrackChoiceManager.getAvailableVideoTracks(), cancelSignal);
|
|
2274
|
+
this._priv_triggerEventIfNotStopped("availableTextTracksChange", mediaElementTrackChoiceManager.getAvailableTextTracks(), cancelSignal);
|
|
2275
|
+
this._priv_triggerEventIfNotStopped("audioTrackChange", (_a = mediaElementTrackChoiceManager.getChosenAudioTrack()) !== null && _a !== void 0 ? _a : null, cancelSignal);
|
|
2276
|
+
this._priv_triggerEventIfNotStopped("textTrackChange", (_b = mediaElementTrackChoiceManager.getChosenTextTrack()) !== null && _b !== void 0 ? _b : null, cancelSignal);
|
|
2277
|
+
this._priv_triggerEventIfNotStopped("videoTrackChange", (_c = mediaElementTrackChoiceManager.getChosenVideoTrack()) !== null && _c !== void 0 ? _c : null, cancelSignal);
|
|
2278
|
+
mediaElementTrackChoiceManager
|
|
2279
|
+
.addEventListener("availableVideoTracksChange", function (val) {
|
|
2280
|
+
return _this.trigger("availableVideoTracksChange", val);
|
|
2281
|
+
});
|
|
2282
|
+
mediaElementTrackChoiceManager
|
|
2283
|
+
.addEventListener("availableAudioTracksChange", function (val) {
|
|
2284
|
+
return _this.trigger("availableAudioTracksChange", val);
|
|
2285
|
+
});
|
|
2286
|
+
mediaElementTrackChoiceManager
|
|
2287
|
+
.addEventListener("availableTextTracksChange", function (val) {
|
|
2288
|
+
return _this.trigger("availableTextTracksChange", val);
|
|
2289
|
+
});
|
|
2290
|
+
mediaElementTrackChoiceManager
|
|
2291
|
+
.addEventListener("audioTrackChange", function (val) {
|
|
2292
|
+
return _this.trigger("audioTrackChange", val);
|
|
2293
|
+
});
|
|
2294
|
+
mediaElementTrackChoiceManager
|
|
2295
|
+
.addEventListener("videoTrackChange", function (val) {
|
|
2296
|
+
return _this.trigger("videoTrackChange", val);
|
|
2297
|
+
});
|
|
2298
|
+
mediaElementTrackChoiceManager
|
|
2299
|
+
.addEventListener("textTrackChange", function (val) {
|
|
2300
|
+
return _this.trigger("textTrackChange", val);
|
|
2301
|
+
});
|
|
2302
|
+
return mediaElementTrackChoiceManager;
|
|
2303
|
+
};
|
|
2313
2304
|
return Player;
|
|
2314
2305
|
}(EventEmitter));
|
|
2315
|
-
Player.version = /* PLAYER_VERSION */ "3.
|
|
2306
|
+
Player.version = /* PLAYER_VERSION */ "3.30.0-dev.2023011800";
|
|
2316
2307
|
export default Player;
|