rx-player 4.0.0-dev.2023120600 → 4.0.0-dev.2023121900
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 +178 -2
- package/README.md +2 -33
- package/VERSION +1 -1
- package/dist/_esm5.processed/compat/add_text_track.d.ts +3 -1
- package/dist/_esm5.processed/compat/add_text_track.js +7 -4
- package/dist/_esm5.processed/compat/browser_compatibility_types.d.ts +7 -0
- package/dist/_esm5.processed/compat/event_listeners.d.ts +15 -2
- package/dist/_esm5.processed/compat/event_listeners.js +37 -2
- package/dist/_esm5.processed/compat/fullscreen.d.ts +32 -0
- package/dist/_esm5.processed/compat/fullscreen.js +78 -0
- package/dist/_esm5.processed/compat/index.d.ts +3 -1
- package/dist/_esm5.processed/compat/index.js +3 -1
- package/dist/_esm5.processed/compat/is_offline.d.ts +39 -0
- package/dist/_esm5.processed/compat/is_offline.js +43 -0
- package/dist/_esm5.processed/config.d.ts +21 -9
- package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.d.ts +58 -0
- package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.js +54 -14
- package/dist/_esm5.processed/core/adaptive/utils/select_optimal_representation.d.ts +8 -2
- package/dist/_esm5.processed/core/adaptive/utils/select_optimal_representation.js +11 -2
- package/dist/_esm5.processed/core/api/debug/modules/general_info.js +46 -17
- package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.js +3 -3
- package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.js +1 -1
- package/dist/_esm5.processed/core/api/option_utils.d.ts +35 -14
- package/dist/_esm5.processed/core/api/option_utils.js +230 -47
- package/dist/_esm5.processed/core/api/public_api.d.ts +266 -92
- package/dist/_esm5.processed/core/api/public_api.js +802 -444
- package/dist/_esm5.processed/core/api/{track_management/media_element_tracks_store.d.ts → tracks_management/media_element_track_choice_manager.d.ts} +75 -15
- package/dist/_esm5.processed/core/api/{track_management/media_element_tracks_store.js → tracks_management/media_element_track_choice_manager.js} +193 -74
- package/dist/_esm5.processed/core/api/tracks_management/track_choice_manager.d.ts +258 -0
- package/dist/_esm5.processed/core/api/tracks_management/track_choice_manager.js +989 -0
- package/dist/_esm5.processed/core/api/utils.d.ts +0 -1
- package/dist/_esm5.processed/core/api/utils.js +11 -28
- package/dist/_esm5.processed/core/decrypt/content_decryptor.js +3 -3
- package/dist/_esm5.processed/core/decrypt/find_key_system.js +71 -83
- package/dist/_esm5.processed/core/decrypt/get_media_keys.js +5 -6
- package/dist/_esm5.processed/core/decrypt/session_events_listener.js +72 -10
- package/dist/_esm5.processed/core/decrypt/utils/persistent_sessions_store.d.ts +4 -4
- package/dist/_esm5.processed/core/decrypt/utils/persistent_sessions_store.js +4 -6
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.d.ts +3 -1
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +26 -7
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +9 -3
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +9 -16
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.d.ts +3 -1
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +1 -1
- package/dist/_esm5.processed/core/fetchers/utils/schedule_request.d.ts +6 -1
- package/dist/_esm5.processed/core/fetchers/utils/schedule_request.js +41 -4
- package/dist/_esm5.processed/core/init/media_source_content_initializer.d.ts +8 -1
- package/dist/_esm5.processed/core/init/media_source_content_initializer.js +5 -2
- package/dist/_esm5.processed/core/init/types.d.ts +15 -5
- package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +9 -2
- package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.d.ts +75 -0
- package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.js +133 -0
- package/dist/_esm5.processed/core/{api/track_management → segment_buffers/implementations/image}/index.d.ts +2 -3
- package/dist/_esm5.processed/core/{api/track_management → segment_buffers/implementations/image}/index.js +2 -3
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +1 -1
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +2 -1
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +4 -3
- package/dist/_esm5.processed/core/segment_buffers/implementations/types.d.ts +2 -2
- package/dist/_esm5.processed/core/segment_buffers/index.d.ts +2 -2
- package/dist/_esm5.processed/core/segment_buffers/index.js +1 -2
- package/dist/_esm5.processed/core/segment_buffers/inventory/index.d.ts +2 -3
- package/dist/_esm5.processed/core/segment_buffers/inventory/index.js +0 -1
- package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +25 -8
- package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +19 -10
- package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.d.ts +1 -0
- package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +16 -2
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +15 -0
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +93 -183
- package/dist/_esm5.processed/core/stream/adaptation/types.d.ts +13 -27
- package/dist/_esm5.processed/core/stream/index.d.ts +3 -2
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +0 -2
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +7 -5
- package/dist/_esm5.processed/core/stream/period/period_stream.js +12 -13
- package/dist/_esm5.processed/core/stream/period/types.d.ts +14 -5
- package/dist/_esm5.processed/core/stream/period/utils/get_adaptation_switch_strategy.d.ts +4 -2
- package/dist/_esm5.processed/core/stream/period/utils/get_adaptation_switch_strategy.js +46 -10
- package/dist/_esm5.processed/core/stream/representation/representation_stream.js +23 -29
- package/dist/_esm5.processed/core/stream/representation/types.d.ts +1 -11
- package/dist/_esm5.processed/core/stream/representation/utils/get_buffer_status.js +1 -1
- package/dist/_esm5.processed/core/stream/representation/utils/get_needed_segments.js +1 -1
- package/dist/_esm5.processed/default_config.d.ts +98 -35
- package/dist/_esm5.processed/default_config.js +113 -36
- package/dist/_esm5.processed/errors/custom_loader_error.d.ts +3 -1
- package/dist/_esm5.processed/errors/custom_loader_error.js +3 -1
- package/dist/_esm5.processed/errors/media_error.js +2 -2
- package/dist/_esm5.processed/errors/network_error.d.ts +1 -0
- package/dist/_esm5.processed/errors/network_error.js +1 -0
- package/dist/_esm5.processed/errors/request_error.d.ts +3 -2
- package/dist/_esm5.processed/errors/request_error.js +5 -2
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +3 -3
- package/dist/_esm5.processed/features/features_object.js +2 -0
- package/dist/_esm5.processed/{transports/smooth/is_mp4_embedded_track.js → features/list/bif_parser.d.ts} +6 -7
- package/dist/_esm5.processed/features/list/bif_parser.js +27 -0
- package/dist/_esm5.processed/features/list/directfile.js +5 -2
- package/dist/_esm5.processed/features/list/image_buffer.d.ts +23 -0
- package/dist/_esm5.processed/features/list/image_buffer.js +25 -0
- package/dist/_esm5.processed/features/list/index.d.ts +2 -0
- package/dist/_esm5.processed/features/list/index.js +2 -0
- package/dist/_esm5.processed/features/types.d.ts +27 -3
- package/dist/_esm5.processed/manifest/adaptation.d.ts +11 -9
- package/dist/_esm5.processed/manifest/adaptation.js +30 -41
- package/dist/_esm5.processed/manifest/index.d.ts +4 -3
- package/dist/_esm5.processed/manifest/manifest.d.ts +54 -5
- package/dist/_esm5.processed/manifest/manifest.js +110 -5
- package/dist/_esm5.processed/manifest/period.d.ts +5 -4
- package/dist/_esm5.processed/manifest/representation.d.ts +5 -10
- package/dist/_esm5.processed/manifest/representation.js +5 -15
- package/dist/_esm5.processed/manifest/representation_index/index.d.ts +2 -2
- package/dist/_esm5.processed/manifest/representation_index/static.d.ts +0 -2
- package/dist/_esm5.processed/manifest/representation_index/static.js +0 -6
- package/dist/_esm5.processed/manifest/representation_index/types.d.ts +21 -42
- package/dist/_esm5.processed/manifest/types.d.ts +2 -0
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +31 -17
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.js +19 -26
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.d.ts +0 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.js +1 -7
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +6 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +8 -11
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +0 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +0 -6
- package/dist/_esm5.processed/parsers/manifest/dash/common/infer_adaptation_type.d.ts +2 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/infer_adaptation_type.js +6 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +5 -3
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.d.ts +2 -0
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.js +2 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.d.ts +2 -0
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.js +2 -2
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.js +6 -10
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/Representation.js +2 -4
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/utils.d.ts +1 -10
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/utils.js +2 -18
- package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +4 -4
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.js +6 -3
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/Representation.js +2 -1
- package/dist/_esm5.processed/parsers/manifest/local/representation_index.d.ts +0 -2
- package/dist/_esm5.processed/parsers/manifest/local/representation_index.js +0 -6
- package/dist/_esm5.processed/parsers/manifest/metaplaylist/metaplaylist_parser.js +6 -6
- package/dist/_esm5.processed/parsers/manifest/metaplaylist/representation_index.d.ts +3 -12
- package/dist/_esm5.processed/parsers/manifest/metaplaylist/representation_index.js +2 -11
- package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.d.ts +1 -0
- package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +17 -11
- package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.d.ts +83 -21
- package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.js +125 -53
- package/dist/_esm5.processed/parsers/manifest/smooth/utils/add_segment_infos.d.ts +6 -3
- package/dist/_esm5.processed/parsers/manifest/smooth/utils/add_segment_infos.js +4 -4
- package/dist/_esm5.processed/parsers/manifest/types.d.ts +3 -3
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_line_height.js +2 -1
- package/dist/_esm5.processed/public_types.d.ts +310 -396
- package/dist/_esm5.processed/tools/TextTrackRenderer/text_track_renderer.d.ts +4 -5
- package/dist/_esm5.processed/tools/TextTrackRenderer/text_track_renderer.js +4 -5
- package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +4 -4
- package/dist/_esm5.processed/transports/dash/image_pipelines.d.ts +38 -0
- package/dist/_esm5.processed/transports/dash/image_pipelines.js +129 -0
- package/dist/_esm5.processed/transports/dash/manifest_parser.js +3 -2
- package/dist/_esm5.processed/transports/dash/pipelines.js +4 -1
- package/dist/_esm5.processed/transports/dash/segment_loader.d.ts +2 -2
- package/dist/_esm5.processed/transports/dash/segment_loader.js +20 -26
- package/dist/_esm5.processed/transports/dash/segment_parser.js +24 -19
- package/dist/_esm5.processed/transports/dash/text_loader.js +5 -5
- package/dist/_esm5.processed/transports/dash/text_parser.js +33 -28
- package/dist/_esm5.processed/transports/local/pipelines.js +10 -1
- package/dist/_esm5.processed/transports/local/segment_loader.js +2 -2
- package/dist/_esm5.processed/transports/local/segment_parser.d.ts +1 -1
- package/dist/_esm5.processed/transports/local/segment_parser.js +10 -10
- package/dist/_esm5.processed/transports/local/text_parser.d.ts +2 -2
- package/dist/_esm5.processed/transports/local/text_parser.js +23 -23
- package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +52 -34
- package/dist/_esm5.processed/transports/smooth/pipelines.js +190 -33
- package/dist/_esm5.processed/transports/smooth/segment_loader.d.ts +1 -1
- package/dist/_esm5.processed/transports/smooth/segment_loader.js +22 -28
- package/dist/_esm5.processed/transports/smooth/utils.d.ts +26 -1
- package/dist/_esm5.processed/transports/smooth/utils.js +55 -1
- package/dist/_esm5.processed/transports/types.d.ts +89 -94
- package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +3 -3
- package/dist/_esm5.processed/transports/utils/infer_segment_container.d.ts +3 -3
- package/dist/_esm5.processed/transports/utils/infer_segment_container.js +7 -5
- package/dist/_esm5.processed/transports/utils/parse_text_track.d.ts +12 -8
- package/dist/_esm5.processed/transports/utils/parse_text_track.js +21 -19
- package/dist/_esm5.processed/utils/array_includes.d.ts +1 -2
- package/dist/_esm5.processed/utils/array_includes.js +28 -30
- package/dist/_esm5.processed/{transports/smooth/is_mp4_embedded_track.d.ts → utils/list_to_map.d.ts} +5 -5
- package/dist/_esm5.processed/utils/list_to_map.js +28 -0
- package/dist/_esm5.processed/utils/request/xhr.js +5 -5
- package/dist/_esm5.processed/utils/simple_set.d.ts +51 -0
- package/dist/_esm5.processed/utils/simple_set.js +57 -0
- package/dist/_esm5.processed/utils/uniq.d.ts +36 -0
- package/dist/_esm5.processed/utils/uniq.js +43 -0
- package/dist/commonjs/config.d.ts +1 -1
- package/dist/commonjs/core/adaptive/adaptive_representation_selector.d.ts +2 -19
- package/dist/commonjs/core/adaptive/adaptive_representation_selector.js +2 -2
- package/dist/commonjs/core/adaptive/network_analyzer.js +3 -3
- package/dist/commonjs/core/api/index.d.ts +1 -1
- package/dist/commonjs/core/api/playback_observer.d.ts +128 -8
- package/dist/commonjs/core/api/playback_observer.js +217 -64
- package/dist/commonjs/core/api/public_api.js +9 -9
- package/dist/commonjs/core/api/utils.js +1 -1
- package/dist/commonjs/core/decrypt/get_media_keys.js +2 -6
- package/dist/commonjs/core/init/directfile_content_initializer.js +5 -1
- package/dist/commonjs/core/init/media_source_content_initializer.js +28 -14
- package/dist/commonjs/core/init/utils/content_time_boundaries_observer.js +1 -2
- package/dist/commonjs/core/init/utils/create_stream_playback_observer.d.ts +1 -5
- package/dist/commonjs/core/init/utils/create_stream_playback_observer.js +16 -14
- package/dist/commonjs/core/init/utils/initial_seek_and_play.d.ts +9 -11
- package/dist/commonjs/core/init/utils/initial_seek_and_play.js +121 -91
- package/dist/commonjs/core/init/utils/rebuffering_controller.js +27 -70
- package/dist/commonjs/core/init/utils/stream_events_emitter/stream_events_emitter.js +4 -2
- package/dist/commonjs/core/segment_buffers/garbage_collector.js +1 -2
- package/dist/commonjs/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +9 -2
- package/dist/commonjs/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +1 -1
- package/dist/commonjs/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +1 -1
- package/dist/commonjs/core/segment_buffers/index.d.ts +2 -2
- package/dist/commonjs/core/segment_buffers/inventory/index.d.ts +2 -2
- package/dist/commonjs/core/segment_buffers/inventory/segment_inventory.d.ts +25 -8
- package/dist/commonjs/core/segment_buffers/inventory/segment_inventory.js +19 -10
- package/dist/commonjs/core/stream/adaptation/get_representations_switch_strategy.d.ts +2 -2
- package/dist/commonjs/core/stream/adaptation/get_representations_switch_strategy.js +16 -9
- package/dist/commonjs/core/stream/orchestrator/stream_orchestrator.js +14 -18
- package/dist/commonjs/core/stream/period/period_stream.js +5 -8
- package/dist/commonjs/core/stream/period/types.d.ts +2 -3
- package/dist/commonjs/core/stream/period/utils/get_adaptation_switch_strategy.d.ts +4 -5
- package/dist/commonjs/core/stream/period/utils/get_adaptation_switch_strategy.js +17 -13
- package/dist/commonjs/core/stream/representation/representation_stream.js +3 -4
- package/dist/commonjs/core/stream/representation/types.d.ts +2 -2
- package/dist/commonjs/core/stream/representation/utils/append_segment_to_buffer.js +11 -12
- package/dist/commonjs/core/stream/representation/utils/get_buffer_status.js +1 -1
- package/dist/commonjs/default_config.d.ts +7 -16
- package/dist/commonjs/default_config.js +16 -16
- package/dist/commonjs/manifest/adaptation.js +2 -1
- package/dist/commonjs/parsers/texttracks/ttml/html/apply_line_height.js +2 -1
- package/dist/commonjs/public_types.d.ts +29 -2
- package/dist/es2017/config.d.ts +1 -1
- package/dist/es2017/core/adaptive/adaptive_representation_selector.d.ts +2 -19
- package/dist/es2017/core/adaptive/adaptive_representation_selector.js +2 -2
- package/dist/es2017/core/adaptive/network_analyzer.js +3 -3
- package/dist/es2017/core/api/index.d.ts +1 -1
- package/dist/es2017/core/api/playback_observer.d.ts +128 -8
- package/dist/es2017/core/api/playback_observer.js +217 -66
- package/dist/es2017/core/api/public_api.js +9 -9
- package/dist/es2017/core/api/utils.js +1 -1
- package/dist/es2017/core/decrypt/get_media_keys.js +2 -6
- package/dist/es2017/core/init/directfile_content_initializer.js +7 -1
- package/dist/es2017/core/init/media_source_content_initializer.js +30 -16
- package/dist/es2017/core/init/utils/content_time_boundaries_observer.js +1 -2
- package/dist/es2017/core/init/utils/create_stream_playback_observer.d.ts +1 -5
- package/dist/es2017/core/init/utils/create_stream_playback_observer.js +16 -14
- package/dist/es2017/core/init/utils/initial_seek_and_play.d.ts +9 -11
- package/dist/es2017/core/init/utils/initial_seek_and_play.js +120 -91
- package/dist/es2017/core/init/utils/rebuffering_controller.js +27 -70
- package/dist/es2017/core/init/utils/stream_events_emitter/stream_events_emitter.js +4 -2
- package/dist/es2017/core/segment_buffers/garbage_collector.js +1 -2
- package/dist/es2017/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +9 -2
- package/dist/es2017/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +1 -1
- package/dist/es2017/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +1 -1
- package/dist/es2017/core/segment_buffers/index.d.ts +2 -2
- package/dist/es2017/core/segment_buffers/inventory/index.d.ts +2 -2
- package/dist/es2017/core/segment_buffers/inventory/segment_inventory.d.ts +25 -8
- package/dist/es2017/core/segment_buffers/inventory/segment_inventory.js +19 -10
- package/dist/es2017/core/stream/adaptation/get_representations_switch_strategy.d.ts +2 -2
- package/dist/es2017/core/stream/adaptation/get_representations_switch_strategy.js +16 -9
- package/dist/es2017/core/stream/orchestrator/stream_orchestrator.js +16 -18
- package/dist/es2017/core/stream/period/period_stream.js +4 -7
- package/dist/es2017/core/stream/period/types.d.ts +2 -3
- package/dist/es2017/core/stream/period/utils/get_adaptation_switch_strategy.d.ts +4 -5
- package/dist/es2017/core/stream/period/utils/get_adaptation_switch_strategy.js +17 -13
- package/dist/es2017/core/stream/representation/representation_stream.js +3 -4
- package/dist/es2017/core/stream/representation/types.d.ts +2 -2
- package/dist/es2017/core/stream/representation/utils/append_segment_to_buffer.js +1 -2
- package/dist/es2017/core/stream/representation/utils/get_buffer_status.js +1 -1
- package/dist/es2017/default_config.d.ts +7 -16
- package/dist/es2017/default_config.js +16 -16
- package/dist/es2017/manifest/adaptation.js +2 -1
- package/dist/es2017/parsers/texttracks/ttml/html/apply_line_height.js +2 -1
- package/dist/es2017/public_types.d.ts +29 -2
- package/dist/mpd-parser.wasm +0 -0
- package/dist/rx-player.js +614 -438
- package/dist/rx-player.min.js +1 -1
- package/package.json +5 -1
- package/scripts/canal-release.patch +78 -0
- package/scripts/make-dev-releases +65 -0
- package/scripts/update-version +5 -0
- package/sonar-project.properties +1 -1
- package/src/core/adaptive/adaptive_representation_selector.ts +4 -21
- package/src/core/adaptive/network_analyzer.ts +3 -3
- package/src/core/api/index.ts +1 -0
- package/src/core/api/playback_observer.ts +327 -107
- package/src/core/api/public_api.ts +9 -9
- package/src/core/api/utils.ts +3 -1
- package/src/core/decrypt/get_media_keys.ts +2 -8
- package/src/core/init/directfile_content_initializer.ts +8 -8
- package/src/core/init/media_source_content_initializer.ts +27 -20
- package/src/core/init/utils/content_time_boundaries_observer.ts +1 -1
- package/src/core/init/utils/create_stream_playback_observer.ts +19 -20
- package/src/core/init/utils/initial_seek_and_play.ts +140 -108
- package/src/core/init/utils/rebuffering_controller.ts +32 -77
- package/src/core/init/utils/stream_events_emitter/stream_events_emitter.ts +5 -2
- package/src/core/segment_buffers/garbage_collector.ts +1 -1
- package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +10 -2
- package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +1 -1
- package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +1 -1
- package/src/core/segment_buffers/index.ts +2 -0
- package/src/core/segment_buffers/inventory/index.ts +2 -0
- package/src/core/segment_buffers/inventory/segment_inventory.ts +49 -17
- package/src/core/stream/adaptation/get_representations_switch_strategy.ts +21 -12
- package/src/core/stream/orchestrator/stream_orchestrator.ts +14 -19
- package/src/core/stream/period/period_stream.ts +7 -8
- package/src/core/stream/period/types.ts +2 -3
- package/src/core/stream/period/utils/get_adaptation_switch_strategy.ts +21 -15
- package/src/core/stream/representation/representation_stream.ts +3 -5
- package/src/core/stream/representation/types.ts +2 -2
- package/src/core/stream/representation/utils/append_segment_to_buffer.ts +1 -1
- package/src/core/stream/representation/utils/get_buffer_status.ts +2 -1
- package/src/default_config.ts +17 -17
- package/src/manifest/adaptation.ts +2 -1
- package/src/parsers/texttracks/ttml/html/apply_line_height.ts +3 -1
- package/src/public_types.ts +29 -2
- package/dist/_esm5.processed/core/api/track_management/track_dispatcher.d.ts +0 -84
- package/dist/_esm5.processed/core/api/track_management/track_dispatcher.js +0 -158
- package/dist/_esm5.processed/core/api/track_management/tracks_store.d.ts +0 -406
- package/dist/_esm5.processed/core/api/track_management/tracks_store.js +0 -932
- package/dist/_esm5.processed/core/segment_buffers/inventory/utils.d.ts +0 -33
- package/dist/_esm5.processed/core/segment_buffers/inventory/utils.js +0 -49
- package/dist/_esm5.processed/core/stream/adaptation/get_representations_switch_strategy.d.ts +0 -39
- package/dist/_esm5.processed/core/stream/adaptation/get_representations_switch_strategy.js +0 -133
- package/dist/_esm5.processed/parsers/manifest/smooth/shared_smooth_segment_timeline.d.ts +0 -119
- package/dist/_esm5.processed/parsers/manifest/smooth/shared_smooth_segment_timeline.js +0 -159
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
+
import isSeekingApproximate from "../../compat/is_seeking_approximate";
|
|
16
17
|
import config from "../../config";
|
|
17
18
|
import log from "../../log";
|
|
18
19
|
import getMonotonicTimeStamp from "../../utils/monotonic_timestamp";
|
|
@@ -65,6 +66,19 @@ export default class PlaybackObserver {
|
|
|
65
66
|
this._lowLatencyMode = options.lowLatencyMode;
|
|
66
67
|
this._canceller = new TaskCanceller();
|
|
67
68
|
this._observationRef = this._createSharedReference();
|
|
69
|
+
this._expectedSeekingPosition = null;
|
|
70
|
+
this._pendingSeek = null;
|
|
71
|
+
const onLoadedMetadata = () => {
|
|
72
|
+
if (this._pendingSeek !== null) {
|
|
73
|
+
const positionToSeekTo = this._pendingSeek;
|
|
74
|
+
this._pendingSeek = null;
|
|
75
|
+
this._actuallySetCurrentTime(positionToSeekTo);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
mediaElement.addEventListener("loadedmetadata", onLoadedMetadata);
|
|
79
|
+
this._canceller.signal.register(() => {
|
|
80
|
+
mediaElement.removeEventListener("loadedmetadata", onLoadedMetadata);
|
|
81
|
+
});
|
|
68
82
|
}
|
|
69
83
|
/**
|
|
70
84
|
* Stop the `PlaybackObserver` from emitting playback observations and free all
|
|
@@ -114,9 +128,14 @@ export default class PlaybackObserver {
|
|
|
114
128
|
* @param {number} time
|
|
115
129
|
*/
|
|
116
130
|
setCurrentTime(time) {
|
|
117
|
-
this.
|
|
118
|
-
|
|
119
|
-
|
|
131
|
+
if (this._mediaElement.readyState >= 1) {
|
|
132
|
+
this._actuallySetCurrentTime(time);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
this._internalSeeksIncoming = [];
|
|
136
|
+
this._pendingSeek = time;
|
|
137
|
+
this._generateObservationForEvent("manual");
|
|
138
|
+
}
|
|
120
139
|
}
|
|
121
140
|
/**
|
|
122
141
|
* Update the playback rate of the `HTMLMediaElement`.
|
|
@@ -181,6 +200,11 @@ export default class PlaybackObserver {
|
|
|
181
200
|
deriveReadOnlyObserver(transform) {
|
|
182
201
|
return generateReadOnlyObserver(this, transform, this._canceller.signal);
|
|
183
202
|
}
|
|
203
|
+
_actuallySetCurrentTime(time) {
|
|
204
|
+
log.info("API: Seeking internally", time);
|
|
205
|
+
this._internalSeeksIncoming.push(time);
|
|
206
|
+
this._mediaElement.currentTime = time;
|
|
207
|
+
}
|
|
184
208
|
/**
|
|
185
209
|
* Creates the `IReadOnlySharedReference` that will generate playback
|
|
186
210
|
* observations.
|
|
@@ -190,57 +214,21 @@ export default class PlaybackObserver {
|
|
|
190
214
|
if (this._observationRef !== undefined) {
|
|
191
215
|
return this._observationRef;
|
|
192
216
|
}
|
|
193
|
-
let lastObservation;
|
|
194
217
|
const { SAMPLING_INTERVAL_MEDIASOURCE, SAMPLING_INTERVAL_LOW_LATENCY, SAMPLING_INTERVAL_NO_MEDIASOURCE } = config.getCurrent();
|
|
195
|
-
const
|
|
196
|
-
let tmpEvt = event;
|
|
197
|
-
let startedInternalSeekTime;
|
|
198
|
-
if (tmpEvt === "seeking" && this._internalSeeksIncoming.length > 0) {
|
|
199
|
-
tmpEvt = "internal-seeking";
|
|
200
|
-
startedInternalSeekTime = this._internalSeeksIncoming.shift();
|
|
201
|
-
}
|
|
202
|
-
const _lastObservation = lastObservation !== null && lastObservation !== void 0 ? lastObservation : this._generateInitialObservation();
|
|
203
|
-
const mediaTimings = getMediaInfos(this._mediaElement, tmpEvt, this._withMediaSource);
|
|
204
|
-
let pendingInternalSeek = null;
|
|
205
|
-
if (mediaTimings.seeking) {
|
|
206
|
-
if (typeof startedInternalSeekTime === "number") {
|
|
207
|
-
pendingInternalSeek = startedInternalSeekTime;
|
|
208
|
-
}
|
|
209
|
-
else if (_lastObservation.pendingInternalSeek !== null && event !== "seeking") {
|
|
210
|
-
pendingInternalSeek = _lastObservation.pendingInternalSeek;
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
const rebufferingStatus = getRebufferingStatus(_lastObservation, mediaTimings, { lowLatencyMode: this._lowLatencyMode,
|
|
214
|
-
withMediaSource: this._withMediaSource });
|
|
215
|
-
const freezingStatus = getFreezingStatus(_lastObservation, mediaTimings);
|
|
216
|
-
const timings = objectAssign({}, { rebuffering: rebufferingStatus,
|
|
217
|
-
freezing: freezingStatus,
|
|
218
|
-
pendingInternalSeek }, mediaTimings);
|
|
219
|
-
if (log.hasLevel("DEBUG")) {
|
|
220
|
-
log.debug("API: current media element state tick", "event", timings.event, "position", timings.position, "seeking", timings.seeking, "internalSeek", timings.pendingInternalSeek, "rebuffering", timings.rebuffering !== null, "freezing", timings.freezing !== null, "ended", timings.ended, "paused", timings.paused, "playbackRate", timings.playbackRate, "readyState", timings.readyState);
|
|
221
|
-
}
|
|
222
|
-
return timings;
|
|
223
|
-
};
|
|
224
|
-
const returnedSharedReference = new SharedReference(getCurrentObservation("init"), this._canceller.signal);
|
|
225
|
-
const generateObservationForEvent = (event) => {
|
|
226
|
-
const newObservation = getCurrentObservation(event);
|
|
227
|
-
if (log.hasLevel("DEBUG")) {
|
|
228
|
-
log.debug("API: current playback timeline:\n" +
|
|
229
|
-
prettyPrintBuffered(newObservation.buffered, newObservation.position), `\n${event}`);
|
|
230
|
-
}
|
|
231
|
-
lastObservation = newObservation;
|
|
232
|
-
returnedSharedReference.setValue(newObservation);
|
|
233
|
-
};
|
|
218
|
+
const returnedSharedReference = new SharedReference(this._getCurrentObservation("init"), this._canceller.signal);
|
|
234
219
|
const interval = this._lowLatencyMode ? SAMPLING_INTERVAL_LOW_LATENCY :
|
|
235
220
|
this._withMediaSource ? SAMPLING_INTERVAL_MEDIASOURCE :
|
|
236
221
|
SAMPLING_INTERVAL_NO_MEDIASOURCE;
|
|
222
|
+
const onInterval = () => {
|
|
223
|
+
this._generateObservationForEvent("timeupdate");
|
|
224
|
+
};
|
|
237
225
|
let intervalId = setInterval(onInterval, interval);
|
|
238
226
|
const removeEventListeners = SCANNED_MEDIA_ELEMENTS_EVENTS.map((eventName) => {
|
|
239
|
-
|
|
240
|
-
function onMediaEvent() {
|
|
227
|
+
const onMediaEvent = () => {
|
|
241
228
|
restartInterval();
|
|
242
|
-
|
|
243
|
-
}
|
|
229
|
+
this._generateObservationForEvent(eventName);
|
|
230
|
+
};
|
|
231
|
+
this._mediaElement.addEventListener(eventName, onMediaEvent);
|
|
244
232
|
return () => {
|
|
245
233
|
this._mediaElement.removeEventListener(eventName, onMediaEvent);
|
|
246
234
|
};
|
|
@@ -251,18 +239,165 @@ export default class PlaybackObserver {
|
|
|
251
239
|
returnedSharedReference.finish();
|
|
252
240
|
});
|
|
253
241
|
return returnedSharedReference;
|
|
254
|
-
function onInterval() {
|
|
255
|
-
generateObservationForEvent("timeupdate");
|
|
256
|
-
}
|
|
257
242
|
function restartInterval() {
|
|
258
243
|
clearInterval(intervalId);
|
|
259
244
|
intervalId = setInterval(onInterval, interval);
|
|
260
245
|
}
|
|
261
246
|
}
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
247
|
+
_getCurrentObservation(event) {
|
|
248
|
+
var _a;
|
|
249
|
+
/** Actual event emitted through an observation. */
|
|
250
|
+
let tmpEvt = event;
|
|
251
|
+
// NOTE: `this._observationRef` may be `undefined` because we might here be
|
|
252
|
+
// called in the constructor when that property is not yet set.
|
|
253
|
+
const previousObservation = this._observationRef === undefined ?
|
|
254
|
+
getInitialObservation(this._mediaElement, this._withMediaSource) :
|
|
255
|
+
this._observationRef.getValue();
|
|
256
|
+
/**
|
|
257
|
+
* If `true`, there is a seek operation ongoing but it was done from the
|
|
258
|
+
* `PlaybackObserver`'s `setCurrentTime` method, not from external code.
|
|
259
|
+
*/
|
|
260
|
+
let isInternalSeeking = false;
|
|
261
|
+
/** If set, the position for which we plan to seek to as soon as possible. */
|
|
262
|
+
let pendingPosition = this._pendingSeek;
|
|
263
|
+
/** Initially-polled playback observation, before adjustments. */
|
|
264
|
+
const mediaTimings = getMediaInfos(this._mediaElement, this._withMediaSource);
|
|
265
|
+
if (tmpEvt === "seeking") {
|
|
266
|
+
// We just began seeking.
|
|
267
|
+
// Let's find out if the seek is internal or external and handle approximate
|
|
268
|
+
// seeking
|
|
269
|
+
if (this._internalSeeksIncoming.length > 0) {
|
|
270
|
+
isInternalSeeking = true;
|
|
271
|
+
tmpEvt = "internal-seeking";
|
|
272
|
+
const startedInternalSeekTime = this._internalSeeksIncoming.shift();
|
|
273
|
+
this._expectedSeekingPosition = isSeekingApproximate ?
|
|
274
|
+
Math.max(mediaTimings.position, startedInternalSeekTime !== null && startedInternalSeekTime !== void 0 ? startedInternalSeekTime : 0) :
|
|
275
|
+
mediaTimings.position;
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
this._expectedSeekingPosition = mediaTimings.position;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
else if (mediaTimings.seeking) {
|
|
282
|
+
// we're still seeking, this time without a "seeking" event so it's an
|
|
283
|
+
// already handled one, keep track of the last wanted position we wanted
|
|
284
|
+
// to seek to, to work-around devices re-seeking silently.
|
|
285
|
+
this._expectedSeekingPosition = Math.max(mediaTimings.position, (_a = this._expectedSeekingPosition) !== null && _a !== void 0 ? _a : 0);
|
|
286
|
+
}
|
|
287
|
+
else if (isSeekingApproximate &&
|
|
288
|
+
this._expectedSeekingPosition !== null &&
|
|
289
|
+
mediaTimings.position < this._expectedSeekingPosition) {
|
|
290
|
+
// We're on a target with aproximate seeking, we're not seeking anymore, but
|
|
291
|
+
// we're not yet at the expected seeking position.
|
|
292
|
+
// Signal to the rest of the application that the intented position is not
|
|
293
|
+
// the current position but the one contained in `this._expectedSeekingPosition`
|
|
294
|
+
pendingPosition = this._expectedSeekingPosition;
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
this._expectedSeekingPosition = null;
|
|
298
|
+
}
|
|
299
|
+
if (mediaTimings.seeking &&
|
|
300
|
+
previousObservation.seeking === 1 /* SeekingState.Internal */ &&
|
|
301
|
+
event !== "seeking") {
|
|
302
|
+
isInternalSeeking = true;
|
|
303
|
+
}
|
|
304
|
+
const rebufferingStatus = getRebufferingStatus(previousObservation, mediaTimings, tmpEvt, { lowLatencyMode: this._lowLatencyMode,
|
|
305
|
+
withMediaSource: this._withMediaSource });
|
|
306
|
+
const freezingStatus = getFreezingStatus(previousObservation, mediaTimings, tmpEvt);
|
|
307
|
+
const seeking = isInternalSeeking ? 1 /* SeekingState.Internal */ :
|
|
308
|
+
mediaTimings.seeking ? 2 /* SeekingState.External */ :
|
|
309
|
+
0 /* SeekingState.None */;
|
|
310
|
+
const timings = objectAssign({}, mediaTimings, { position: new ObservationPosition(mediaTimings.position, pendingPosition),
|
|
311
|
+
event: tmpEvt,
|
|
312
|
+
seeking,
|
|
313
|
+
rebuffering: rebufferingStatus,
|
|
314
|
+
freezing: freezingStatus });
|
|
315
|
+
if (log.hasLevel("DEBUG")) {
|
|
316
|
+
log.debug("API: current media element state tick", "event", timings.event, "position", timings.position.getPolled(), "seeking", timings.seeking, "internalSeek", isInternalSeeking, "rebuffering", timings.rebuffering !== null, "freezing", timings.freezing !== null, "ended", timings.ended, "paused", timings.paused, "playbackRate", timings.playbackRate, "readyState", timings.readyState);
|
|
317
|
+
}
|
|
318
|
+
return timings;
|
|
319
|
+
}
|
|
320
|
+
_generateObservationForEvent(event) {
|
|
321
|
+
const newObservation = this._getCurrentObservation(event);
|
|
322
|
+
if (log.hasLevel("DEBUG")) {
|
|
323
|
+
log.debug("API: current playback timeline:\n" +
|
|
324
|
+
prettyPrintBuffered(newObservation.buffered, newObservation.position.getPolled()), `\n${event}`);
|
|
325
|
+
}
|
|
326
|
+
this._observationRef.setValue(newObservation);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
class ObservationPosition {
|
|
330
|
+
constructor(last, wanted) {
|
|
331
|
+
this._last = last;
|
|
332
|
+
this._wanted = wanted;
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Returns the playback position actually observed on the media element at
|
|
336
|
+
* the time the playback observation was made.
|
|
337
|
+
*
|
|
338
|
+
* Note that it may be different than the position for which media data is
|
|
339
|
+
* wanted in rare scenarios where the goal position is not yet set on the
|
|
340
|
+
* media element.
|
|
341
|
+
*
|
|
342
|
+
* You should use this value when you want to obtain the actual position set
|
|
343
|
+
* on the media element for browser compatibility purposes. Note that this
|
|
344
|
+
* position was calculated at observation time, it might thus not be
|
|
345
|
+
* up-to-date if what you want is milliseconds-accuracy.
|
|
346
|
+
*
|
|
347
|
+
* If what you want is the actual position which the player is intended to
|
|
348
|
+
* play, you should rely on `getWanted` instead`.
|
|
349
|
+
* @returns {number}
|
|
350
|
+
*/
|
|
351
|
+
getPolled() {
|
|
352
|
+
return this._last;
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Returns the position which the player should consider to load media data
|
|
356
|
+
* at the time the observation was made.
|
|
357
|
+
*
|
|
358
|
+
* It can be different than the value returned by `getPolled` in rare
|
|
359
|
+
* scenarios:
|
|
360
|
+
*
|
|
361
|
+
* - When the initial position has not been set yet.
|
|
362
|
+
*
|
|
363
|
+
* - When the current device do not let the RxPlayer peform precize seeks,
|
|
364
|
+
* usually for perfomance reasons by seeking to a previous IDR frame
|
|
365
|
+
* instead (for now only Tizen may be like this), in which case we
|
|
366
|
+
* prefer to generally rely on the position wanted by the player (this
|
|
367
|
+
* e.g. prevents issues where the RxPlayer logic and the device are
|
|
368
|
+
* seeking back and forth in a loop).
|
|
369
|
+
*
|
|
370
|
+
* - When a wanted position has been "forced" (@see forceWantedPosition).
|
|
371
|
+
* @returns {number}
|
|
372
|
+
*/
|
|
373
|
+
getWanted() {
|
|
374
|
+
var _a;
|
|
375
|
+
return (_a = this._wanted) !== null && _a !== void 0 ? _a : this._last;
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Method to call if you want to overwrite the currently wanted position.
|
|
379
|
+
* @param {number} pos
|
|
380
|
+
*/
|
|
381
|
+
forceWantedPosition(pos) {
|
|
382
|
+
this._wanted = pos;
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Returns `true` when the position wanted returned by `getWanted` and the
|
|
386
|
+
* actual position returned by `getPolled` may be different, meaning that
|
|
387
|
+
* we're currently not at the position we want to reach.
|
|
388
|
+
*
|
|
389
|
+
* This is a relatively rare situation which only happens when either the
|
|
390
|
+
* initial seek has not yet been performed. on specific targets where the
|
|
391
|
+
* seeking behavior is a little broken (@see getWanted) or when the wanted
|
|
392
|
+
* position has been forced (@see forceWantedPosition).
|
|
393
|
+
*
|
|
394
|
+
* In those situations, you might temporarily refrain from acting upon the
|
|
395
|
+
* actual current media position, as it may change soon.
|
|
396
|
+
*
|
|
397
|
+
* @returns {boolean}
|
|
398
|
+
*/
|
|
399
|
+
isAwaitingFuturePosition() {
|
|
400
|
+
return this._wanted !== null;
|
|
266
401
|
}
|
|
267
402
|
}
|
|
268
403
|
/**
|
|
@@ -311,10 +446,9 @@ function hasLoadedUntilTheEnd(currentTime, currentRange, ended, duration, lowLat
|
|
|
311
446
|
/**
|
|
312
447
|
* Get basic playback information.
|
|
313
448
|
* @param {HTMLMediaElement} mediaElement
|
|
314
|
-
* @param {string} event
|
|
315
449
|
* @returns {Object}
|
|
316
450
|
*/
|
|
317
|
-
function getMediaInfos(mediaElement,
|
|
451
|
+
function getMediaInfos(mediaElement, withMediaSource) {
|
|
318
452
|
const { buffered, currentTime, duration, ended, paused, playbackRate, readyState, seeking } = mediaElement;
|
|
319
453
|
let currentRange;
|
|
320
454
|
let bufferGap;
|
|
@@ -342,8 +476,7 @@ function getMediaInfos(mediaElement, event, withMediaSource) {
|
|
|
342
476
|
paused,
|
|
343
477
|
playbackRate,
|
|
344
478
|
readyState,
|
|
345
|
-
seeking
|
|
346
|
-
event };
|
|
479
|
+
seeking };
|
|
347
480
|
}
|
|
348
481
|
/**
|
|
349
482
|
* Infer rebuffering status of the media based on:
|
|
@@ -354,12 +487,13 @@ function getMediaInfos(mediaElement, event, withMediaSource) {
|
|
|
354
487
|
* @param {Object} currentInfo - Current set of basic information on the
|
|
355
488
|
* `HTMLMediaElement`. This does not need every single property from a regular
|
|
356
489
|
* playback observation.
|
|
490
|
+
* @param {string} currentEvt
|
|
357
491
|
* @param {Object} options
|
|
358
492
|
* @returns {Object|null}
|
|
359
493
|
*/
|
|
360
|
-
function getRebufferingStatus(prevObservation, currentInfo, { withMediaSource, lowLatencyMode }) {
|
|
494
|
+
function getRebufferingStatus(prevObservation, currentInfo, currentEvt, { withMediaSource, lowLatencyMode }) {
|
|
361
495
|
const { REBUFFERING_GAP } = config.getCurrent();
|
|
362
|
-
const {
|
|
496
|
+
const { position: currentTime, bufferGap, currentRange, duration, paused, readyState, ended } = currentInfo;
|
|
363
497
|
const { rebuffering: prevRebuffering, event: prevEvt, position: prevTime } = prevObservation;
|
|
364
498
|
const fullyLoaded = hasLoadedUntilTheEnd(currentTime, currentRange, ended, duration, lowLatencyMode);
|
|
365
499
|
const canSwitchToRebuffering = (readyState >= 1 &&
|
|
@@ -414,12 +548,12 @@ function getRebufferingStatus(prevObservation, currentInfo, { withMediaSource, l
|
|
|
414
548
|
if (canSwitchToRebuffering &&
|
|
415
549
|
((!paused &&
|
|
416
550
|
currentEvt === "timeupdate" && prevEvt === "timeupdate" &&
|
|
417
|
-
currentTime === prevTime) ||
|
|
551
|
+
currentTime === prevTime.getPolled()) ||
|
|
418
552
|
(currentEvt === "seeking" && (bufferGap === Infinity || (bufferGap === undefined && readyState < 3))))) {
|
|
419
553
|
shouldRebuffer = true;
|
|
420
554
|
}
|
|
421
555
|
else if (prevRebuffering !== null &&
|
|
422
|
-
((currentEvt !== "seeking" && currentTime !== prevTime) ||
|
|
556
|
+
((currentEvt !== "seeking" && currentTime !== prevTime.getPolled()) ||
|
|
423
557
|
currentEvt === "canplay" ||
|
|
424
558
|
(bufferGap === undefined && readyState >= 3) ||
|
|
425
559
|
(bufferGap !== undefined && bufferGap < Infinity &&
|
|
@@ -465,28 +599,29 @@ function getRebufferingStatus(prevObservation, currentInfo, { withMediaSource, l
|
|
|
465
599
|
* `null` if not.
|
|
466
600
|
* @param {Object} prevObservation
|
|
467
601
|
* @param {Object} currentInfo
|
|
602
|
+
* @param {string} currentEvt
|
|
468
603
|
* @returns {Object|null}
|
|
469
604
|
*/
|
|
470
|
-
function getFreezingStatus(prevObservation, currentInfo) {
|
|
605
|
+
function getFreezingStatus(prevObservation, currentInfo, currentEvt) {
|
|
471
606
|
const { MINIMUM_BUFFER_AMOUNT_BEFORE_FREEZING } = config.getCurrent();
|
|
472
607
|
if (prevObservation.freezing) {
|
|
473
608
|
if (currentInfo.ended ||
|
|
474
609
|
currentInfo.paused ||
|
|
475
610
|
currentInfo.readyState === 0 ||
|
|
476
611
|
currentInfo.playbackRate === 0 ||
|
|
477
|
-
prevObservation.position !== currentInfo.position) {
|
|
612
|
+
prevObservation.position.getPolled() !== currentInfo.position) {
|
|
478
613
|
return null; // Quit freezing status
|
|
479
614
|
}
|
|
480
615
|
return prevObservation.freezing; // Stay in it
|
|
481
616
|
}
|
|
482
|
-
return
|
|
617
|
+
return currentEvt === "timeupdate" &&
|
|
483
618
|
currentInfo.bufferGap !== undefined &&
|
|
484
619
|
currentInfo.bufferGap > MINIMUM_BUFFER_AMOUNT_BEFORE_FREEZING &&
|
|
485
620
|
!currentInfo.ended &&
|
|
486
621
|
!currentInfo.paused &&
|
|
487
622
|
currentInfo.readyState >= 1 &&
|
|
488
623
|
currentInfo.playbackRate !== 0 &&
|
|
489
|
-
currentInfo.position === prevObservation.position ?
|
|
624
|
+
currentInfo.position === prevObservation.position.getPolled() ?
|
|
490
625
|
{ timestamp: getMonotonicTimeStamp() } :
|
|
491
626
|
null;
|
|
492
627
|
}
|
|
@@ -589,3 +724,19 @@ function generateReadOnlyObserver(src, transform, cancellationSignal) {
|
|
|
589
724
|
},
|
|
590
725
|
};
|
|
591
726
|
}
|
|
727
|
+
/**
|
|
728
|
+
* Generate the initial playback observation for when no event has yet been
|
|
729
|
+
* emitted to lead to one.
|
|
730
|
+
* @param {HTMLMediaElement} mediaElement
|
|
731
|
+
* @param {boolean} withMediaSource
|
|
732
|
+
* @returns {Object}
|
|
733
|
+
*/
|
|
734
|
+
function getInitialObservation(mediaElement, withMediaSource) {
|
|
735
|
+
const mediaTimings = getMediaInfos(mediaElement, withMediaSource);
|
|
736
|
+
return objectAssign(mediaTimings, { rebuffering: null,
|
|
737
|
+
event: "init",
|
|
738
|
+
seeking: 0 /* SeekingState.None */,
|
|
739
|
+
position: { last: mediaTimings.position,
|
|
740
|
+
pending: undefined },
|
|
741
|
+
freezing: null });
|
|
742
|
+
}
|
|
@@ -91,7 +91,7 @@ class Player extends EventEmitter {
|
|
|
91
91
|
// Workaround to support Firefox autoplay on FF 42.
|
|
92
92
|
// See: https://bugzilla.mozilla.org/show_bug.cgi?id=1194624
|
|
93
93
|
videoElement.preload = "auto";
|
|
94
|
-
this.version = /* PLAYER_VERSION */ "4.0.0-dev.
|
|
94
|
+
this.version = /* PLAYER_VERSION */ "4.0.0-dev.2023121900";
|
|
95
95
|
this.log = log;
|
|
96
96
|
this.state = "STOPPED";
|
|
97
97
|
this.videoElement = videoElement;
|
|
@@ -459,12 +459,12 @@ class Player extends EventEmitter {
|
|
|
459
459
|
case "ENDED":
|
|
460
460
|
this._priv_reloadingMetadata.reloadInPause = true;
|
|
461
461
|
this._priv_reloadingMetadata.reloadPosition =
|
|
462
|
-
playbackObserver.getReference().getValue().position;
|
|
462
|
+
playbackObserver.getReference().getValue().position.getPolled();
|
|
463
463
|
break;
|
|
464
464
|
default:
|
|
465
465
|
const o = playbackObserver.getReference().getValue();
|
|
466
466
|
this._priv_reloadingMetadata.reloadInPause = o.paused;
|
|
467
|
-
this._priv_reloadingMetadata.reloadPosition = o.position;
|
|
467
|
+
this._priv_reloadingMetadata.reloadPosition = o.position.getWanted();
|
|
468
468
|
break;
|
|
469
469
|
}
|
|
470
470
|
};
|
|
@@ -1975,7 +1975,7 @@ class Player extends EventEmitter {
|
|
|
1975
1975
|
const maximumPosition = manifest !== null ? manifest.getMaximumSafePosition() :
|
|
1976
1976
|
undefined;
|
|
1977
1977
|
const positionData = {
|
|
1978
|
-
position: observation.position,
|
|
1978
|
+
position: observation.position.getPolled(),
|
|
1979
1979
|
duration: observation.duration,
|
|
1980
1980
|
playbackRate: observation.playbackRate,
|
|
1981
1981
|
maximumPosition,
|
|
@@ -1987,18 +1987,18 @@ class Player extends EventEmitter {
|
|
|
1987
1987
|
};
|
|
1988
1988
|
if (manifest !== null &&
|
|
1989
1989
|
manifest.isLive &&
|
|
1990
|
-
observation.position > 0) {
|
|
1990
|
+
observation.position.getPolled() > 0) {
|
|
1991
1991
|
const ast = (_b = manifest.availabilityStartTime) !== null && _b !== void 0 ? _b : 0;
|
|
1992
|
-
positionData.wallClockTime = observation.position + ast;
|
|
1992
|
+
positionData.wallClockTime = observation.position.getPolled() + ast;
|
|
1993
1993
|
const livePosition = manifest.getLivePosition();
|
|
1994
1994
|
if (livePosition !== undefined) {
|
|
1995
|
-
positionData.liveGap = livePosition - observation.position;
|
|
1995
|
+
positionData.liveGap = livePosition - observation.position.getPolled();
|
|
1996
1996
|
}
|
|
1997
1997
|
}
|
|
1998
1998
|
else if (isDirectFile && this.videoElement !== null) {
|
|
1999
1999
|
const startDate = getStartDate(this.videoElement);
|
|
2000
2000
|
if (startDate !== undefined) {
|
|
2001
|
-
positionData.wallClockTime = startDate + observation.position;
|
|
2001
|
+
positionData.wallClockTime = startDate + observation.position.getPolled();
|
|
2002
2002
|
}
|
|
2003
2003
|
}
|
|
2004
2004
|
this.trigger("positionUpdate", positionData);
|
|
@@ -2132,5 +2132,5 @@ class Player extends EventEmitter {
|
|
|
2132
2132
|
}
|
|
2133
2133
|
}
|
|
2134
2134
|
}
|
|
2135
|
-
Player.version = /* PLAYER_VERSION */ "4.0.0-dev.
|
|
2135
|
+
Player.version = /* PLAYER_VERSION */ "4.0.0-dev.2023121900";
|
|
2136
2136
|
export default Player;
|
|
@@ -31,7 +31,7 @@ export function emitSeekEvents(mediaElement, playbackObserver, onSeeking, onSeek
|
|
|
31
31
|
if (cancelSignal.isCancelled() || mediaElement === null) {
|
|
32
32
|
return;
|
|
33
33
|
}
|
|
34
|
-
let wasSeeking = playbackObserver.getReference().getValue().seeking
|
|
34
|
+
let wasSeeking = playbackObserver.getReference().getValue().seeking === 2 /* SeekingState.External */;
|
|
35
35
|
if (wasSeeking) {
|
|
36
36
|
onSeeking();
|
|
37
37
|
if (cancelSignal.isCancelled()) {
|
|
@@ -28,13 +28,9 @@ import ServerCertificateStore from "./utils/server_certificate_store";
|
|
|
28
28
|
* @returns {Object|null}
|
|
29
29
|
*/
|
|
30
30
|
function createPersistentSessionsStorage(keySystemOptions) {
|
|
31
|
-
if (isNullOrUndefined(keySystemOptions.persistentLicenseConfig)) {
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
31
|
const { persistentLicenseConfig } = keySystemOptions;
|
|
35
|
-
if (persistentLicenseConfig
|
|
36
|
-
|
|
37
|
-
"persistent license.");
|
|
32
|
+
if (isNullOrUndefined(persistentLicenseConfig)) {
|
|
33
|
+
return null;
|
|
38
34
|
}
|
|
39
35
|
log.debug("DRM: Set the given license storage");
|
|
40
36
|
return new PersistentSessionsStore(persistentLicenseConfig);
|
|
@@ -153,7 +153,13 @@ export default class DirectFileContentInitializer extends ContentInitializer {
|
|
|
153
153
|
log.debug("Init: Initial time calculated:", initTime);
|
|
154
154
|
return initTime;
|
|
155
155
|
};
|
|
156
|
-
performInitialSeekAndPlay(mediaElement,
|
|
156
|
+
performInitialSeekAndPlay({ mediaElement,
|
|
157
|
+
playbackObserver,
|
|
158
|
+
startTime: initialTime,
|
|
159
|
+
mustAutoPlay: autoPlay,
|
|
160
|
+
onWarning: (err) => this.trigger("warning", err),
|
|
161
|
+
isDirectfile: true }, cancelSignal)
|
|
162
|
+
.autoPlayResult
|
|
157
163
|
.then(() => getLoadedReference(playbackObserver, mediaElement, true, cancelSignal)
|
|
158
164
|
.onUpdate((isLoaded, stopListening) => {
|
|
159
165
|
if (isLoaded) {
|
|
@@ -267,7 +267,12 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
267
267
|
cancelSignal.register(() => {
|
|
268
268
|
segmentBuffersStore.disposeAll();
|
|
269
269
|
});
|
|
270
|
-
const { autoPlayResult, initialPlayPerformed
|
|
270
|
+
const { autoPlayResult, initialPlayPerformed } = performInitialSeekAndPlay({ mediaElement,
|
|
271
|
+
playbackObserver,
|
|
272
|
+
startTime: initialTime,
|
|
273
|
+
mustAutoPlay: autoPlay,
|
|
274
|
+
onWarning: (err) => { this.trigger("warning", err); },
|
|
275
|
+
isDirectfile: false }, cancelSignal);
|
|
271
276
|
if (cancelSignal.isCancelled()) {
|
|
272
277
|
return;
|
|
273
278
|
}
|
|
@@ -290,16 +295,19 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
290
295
|
const streamObserver = createStreamPlaybackObserver(playbackObserver, { autoPlay,
|
|
291
296
|
manifest,
|
|
292
297
|
initialPlayPerformed,
|
|
293
|
-
|
|
294
|
-
speed,
|
|
295
|
-
startTime: initialTime }, cancelSignal);
|
|
298
|
+
speed }, cancelSignal);
|
|
296
299
|
const rebufferingController = this._createRebufferingController(playbackObserver, manifest, segmentBuffersStore, speed, cancelSignal);
|
|
297
300
|
rebufferingController.addEventListener("needsReload", () => {
|
|
301
|
+
let position;
|
|
302
|
+
const lastObservation = playbackObserver.getReference().getValue();
|
|
303
|
+
if (lastObservation.position.isAwaitingFuturePosition()) {
|
|
304
|
+
position = lastObservation.position.getWanted();
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
position = playbackObserver.getCurrentTime();
|
|
308
|
+
}
|
|
298
309
|
// NOTE couldn't both be always calculated at event destination?
|
|
299
310
|
// Maybe there are exceptions?
|
|
300
|
-
const position = initialSeekPerformed.getValue() ?
|
|
301
|
-
playbackObserver.getCurrentTime() :
|
|
302
|
-
initialTime;
|
|
303
311
|
const autoplay = initialPlayPerformed.getValue() ?
|
|
304
312
|
!playbackObserver.getIsPaused() :
|
|
305
313
|
autoPlay;
|
|
@@ -360,9 +368,9 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
360
368
|
// Data is buffered around the current position
|
|
361
369
|
obs.currentRange !== null ||
|
|
362
370
|
// Or, for whatever reason, we have no buffer but we're already advancing
|
|
363
|
-
obs.position > seekedTime + 0.1) {
|
|
371
|
+
obs.position.getPolled() > seekedTime + 0.1) {
|
|
364
372
|
stopListening();
|
|
365
|
-
playbackObserver.setCurrentTime(obs.position + 0.001);
|
|
373
|
+
playbackObserver.setCurrentTime(obs.position.getWanted() + 0.001);
|
|
366
374
|
}
|
|
367
375
|
}, { includeLastObservation: false, clearSignal: cancelSignal });
|
|
368
376
|
},
|
|
@@ -434,10 +442,12 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
434
442
|
},
|
|
435
443
|
bitrateEstimateChange: (value) => self.trigger("bitrateEstimateChange", value),
|
|
436
444
|
needsMediaSourceReload: (payload) => {
|
|
437
|
-
var _a
|
|
445
|
+
var _a;
|
|
438
446
|
const lastObservation = streamObserver.getReference().getValue();
|
|
439
|
-
const currentPosition =
|
|
440
|
-
|
|
447
|
+
const currentPosition = lastObservation.position.isAwaitingFuturePosition() ?
|
|
448
|
+
lastObservation.position.getWanted() :
|
|
449
|
+
streamObserver.getCurrentTime();
|
|
450
|
+
const isPaused = (_a = lastObservation.paused.pending) !== null && _a !== void 0 ? _a : streamObserver.getIsPaused();
|
|
441
451
|
let position = currentPosition + payload.timeOffset;
|
|
442
452
|
if (payload.minimumPosition !== undefined) {
|
|
443
453
|
position = Math.max(payload.minimumPosition, position);
|
|
@@ -448,17 +458,21 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
|
|
|
448
458
|
onReloadOrder({ position, autoPlay: !isPaused });
|
|
449
459
|
},
|
|
450
460
|
needsDecipherabilityFlush() {
|
|
451
|
-
var _a
|
|
461
|
+
var _a;
|
|
452
462
|
const keySystem = getKeySystemConfiguration(mediaElement);
|
|
453
463
|
if (shouldReloadMediaSourceOnDecipherabilityUpdate(keySystem === null || keySystem === void 0 ? void 0 : keySystem[0])) {
|
|
454
464
|
const lastObservation = streamObserver.getReference().getValue();
|
|
455
|
-
const position =
|
|
456
|
-
|
|
465
|
+
const position = lastObservation.position.isAwaitingFuturePosition() ?
|
|
466
|
+
lastObservation.position.getWanted() :
|
|
467
|
+
streamObserver.getCurrentTime();
|
|
468
|
+
const isPaused = (_a = lastObservation.paused.pending) !== null && _a !== void 0 ? _a : streamObserver.getIsPaused();
|
|
457
469
|
onReloadOrder({ position, autoPlay: !isPaused });
|
|
458
470
|
}
|
|
459
471
|
else {
|
|
460
472
|
const lastObservation = streamObserver.getReference().getValue();
|
|
461
|
-
const position =
|
|
473
|
+
const position = lastObservation.position.isAwaitingFuturePosition() ?
|
|
474
|
+
lastObservation.position.getWanted() :
|
|
475
|
+
streamObserver.getCurrentTime();
|
|
462
476
|
// simple seek close to the current position
|
|
463
477
|
// to flush the buffers
|
|
464
478
|
if (position + 0.001 < lastObservation.duration) {
|
|
@@ -51,8 +51,7 @@ export default class ContentTimeBoundariesObserver extends EventEmitter {
|
|
|
51
51
|
this._maximumPositionCalculator = maximumPositionCalculator;
|
|
52
52
|
const cancelSignal = this._canceller.signal;
|
|
53
53
|
playbackObserver.listen(({ position }) => {
|
|
54
|
-
|
|
55
|
-
const wantedPosition = (_a = position.pending) !== null && _a !== void 0 ? _a : position.last;
|
|
54
|
+
const wantedPosition = position.getWanted();
|
|
56
55
|
if (wantedPosition < manifest.getMinimumSafePosition()) {
|
|
57
56
|
const warning = new MediaError("MEDIA_TIME_BEFORE_MANIFEST", "The current position is behind the " +
|
|
58
57
|
"earliest time announced in the Manifest.");
|
|
@@ -26,12 +26,8 @@ export interface IStreamPlaybackObserverArguments {
|
|
|
26
26
|
manifest: Manifest;
|
|
27
27
|
/** Becomes `true` after the initial play has been taken care of. */
|
|
28
28
|
initialPlayPerformed: IReadOnlySharedReference<boolean>;
|
|
29
|
-
/** Becomes `true` after the initial seek has been taken care of. */
|
|
30
|
-
initialSeekPerformed: IReadOnlySharedReference<boolean>;
|
|
31
29
|
/** The last speed requested by the user. */
|
|
32
30
|
speed: IReadOnlySharedReference<number>;
|
|
33
|
-
/** The time the player will seek when `initialSeekPerformed` becomes `true`. */
|
|
34
|
-
startTime: number;
|
|
35
31
|
}
|
|
36
32
|
/**
|
|
37
33
|
* Create PlaybackObserver for the `Stream` part of the code.
|
|
@@ -42,4 +38,4 @@ export interface IStreamPlaybackObserverArguments {
|
|
|
42
38
|
* @param {Object} fnCancelSignal - Abort the created PlaybackObserver.
|
|
43
39
|
* @returns {Object}
|
|
44
40
|
*/
|
|
45
|
-
export default function createStreamPlaybackObserver(srcPlaybackObserver: PlaybackObserver, { autoPlay, initialPlayPerformed,
|
|
41
|
+
export default function createStreamPlaybackObserver(srcPlaybackObserver: PlaybackObserver, { autoPlay, initialPlayPerformed, manifest, speed }: IStreamPlaybackObserverArguments, fnCancelSignal: CancellationSignal): IReadOnlyPlaybackObserver<IStreamOrchestratorPlaybackObservation>;
|