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
|
@@ -24,7 +24,7 @@ import TaskCanceller from "../../../utils/task_canceller";
|
|
|
24
24
|
* @param {Object} fnCancelSignal - Abort the created PlaybackObserver.
|
|
25
25
|
* @returns {Object}
|
|
26
26
|
*/
|
|
27
|
-
export default function createStreamPlaybackObserver(srcPlaybackObserver, { autoPlay, initialPlayPerformed,
|
|
27
|
+
export default function createStreamPlaybackObserver(srcPlaybackObserver, { autoPlay, initialPlayPerformed, manifest, speed }, fnCancelSignal) {
|
|
28
28
|
return srcPlaybackObserver.deriveReadOnlyObserver(function transform(observationRef, parentObserverCancelSignal) {
|
|
29
29
|
const canceller = new TaskCanceller();
|
|
30
30
|
canceller.linkToSignal(parentObserverCancelSignal);
|
|
@@ -42,11 +42,7 @@ export default function createStreamPlaybackObserver(srcPlaybackObserver, { auto
|
|
|
42
42
|
function constructStreamPlaybackObservation() {
|
|
43
43
|
const observation = observationRef.getValue();
|
|
44
44
|
const lastSpeed = speed.getValue();
|
|
45
|
-
|
|
46
|
-
if (!initialSeekPerformed.getValue()) {
|
|
47
|
-
pendingPosition = startTime;
|
|
48
|
-
}
|
|
49
|
-
else if (!manifest.isDynamic || manifest.isLastPeriodKnown) {
|
|
45
|
+
if (!manifest.isDynamic || manifest.isLastPeriodKnown) {
|
|
50
46
|
// HACK: When the position is actually further than the maximum
|
|
51
47
|
// position for a finished content, we actually want to be loading
|
|
52
48
|
// the last segment before ending.
|
|
@@ -54,19 +50,25 @@ export default function createStreamPlaybackObserver(srcPlaybackObserver, { auto
|
|
|
54
50
|
// want to seek one second before the period's end (despite never
|
|
55
51
|
// doing it).
|
|
56
52
|
const lastPeriod = manifest.periods[manifest.periods.length - 1];
|
|
57
|
-
if (lastPeriod !== undefined &&
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
53
|
+
if (lastPeriod !== undefined && lastPeriod.end !== undefined) {
|
|
54
|
+
const wantedPosition = observation.position.getWanted();
|
|
55
|
+
if (wantedPosition >= lastPeriod.start &&
|
|
56
|
+
wantedPosition >= lastPeriod.end - 1) {
|
|
57
|
+
// We're after the end of the last Period, check if `buffered`
|
|
58
|
+
// indicates that the last segment is probably not loaded, in which
|
|
59
|
+
// case act as if we want to load one second before the end.
|
|
60
|
+
const buffered = observation.buffered;
|
|
61
|
+
if (buffered.length === 0 ||
|
|
62
|
+
buffered.end(buffered.length - 1) < observation.duration - 1) {
|
|
63
|
+
observation.position.forceWantedPosition(lastPeriod.end - 1);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
61
66
|
}
|
|
62
67
|
}
|
|
63
68
|
return {
|
|
64
69
|
// TODO more exact according to the current Adaptation chosen?
|
|
65
70
|
maximumPosition: manifest.getMaximumSafePosition(),
|
|
66
|
-
position:
|
|
67
|
-
last: observation.position,
|
|
68
|
-
pending: pendingPosition,
|
|
69
|
-
},
|
|
71
|
+
position: observation.position,
|
|
70
72
|
duration: observation.duration,
|
|
71
73
|
paused: {
|
|
72
74
|
last: observation.paused,
|
|
@@ -38,11 +38,6 @@ export type IInitialPlayEvent =
|
|
|
38
38
|
export interface IInitialSeekAndPlayObject {
|
|
39
39
|
/** Emit the result of the auto-play operation, once performed. */
|
|
40
40
|
autoPlayResult: Promise<IInitialPlayEvent>;
|
|
41
|
-
/**
|
|
42
|
-
* Shared reference whose value becomes `true` once the initial seek has
|
|
43
|
-
* been considered / has been done by `performInitialSeekAndPlay`.
|
|
44
|
-
*/
|
|
45
|
-
initialSeekPerformed: IReadOnlySharedReference<boolean>;
|
|
46
41
|
/**
|
|
47
42
|
* Shared reference whose value becomes `true` once the initial play has
|
|
48
43
|
* been considered / has been done by `performInitialSeekAndPlay`.
|
|
@@ -52,12 +47,15 @@ export interface IInitialSeekAndPlayObject {
|
|
|
52
47
|
/**
|
|
53
48
|
* Seek as soon as possible at the initially wanted position and play if
|
|
54
49
|
* autoPlay is wanted.
|
|
55
|
-
* @param {
|
|
56
|
-
* @param {Object} playbackObserver
|
|
57
|
-
* @param {number|Function} startTime
|
|
58
|
-
* @param {boolean} mustAutoPlay
|
|
59
|
-
* @param {Function} onWarning
|
|
50
|
+
* @param {Object} args
|
|
60
51
|
* @param {Object} cancelSignal
|
|
61
52
|
* @returns {Object}
|
|
62
53
|
*/
|
|
63
|
-
export default function performInitialSeekAndPlay(mediaElement
|
|
54
|
+
export default function performInitialSeekAndPlay({ mediaElement, playbackObserver, startTime, mustAutoPlay, isDirectfile, onWarning }: {
|
|
55
|
+
mediaElement: HTMLMediaElement;
|
|
56
|
+
playbackObserver: PlaybackObserver;
|
|
57
|
+
startTime: number | (() => number);
|
|
58
|
+
mustAutoPlay: boolean;
|
|
59
|
+
isDirectfile: boolean;
|
|
60
|
+
onWarning: (err: IPlayerError) => void;
|
|
61
|
+
}, cancelSignal: CancellationSignal): IInitialSeekAndPlayObject;
|
|
@@ -14,115 +14,144 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
import { shouldValidateMetadata } from "../../../compat";
|
|
17
|
-
import { READY_STATES } from "../../../compat/browser_compatibility_types";
|
|
18
17
|
import { MediaError } from "../../../errors";
|
|
19
18
|
import log from "../../../log";
|
|
20
19
|
import SharedReference from "../../../utils/reference";
|
|
21
20
|
/**
|
|
22
21
|
* Seek as soon as possible at the initially wanted position and play if
|
|
23
22
|
* autoPlay is wanted.
|
|
24
|
-
* @param {
|
|
25
|
-
* @param {Object} playbackObserver
|
|
26
|
-
* @param {number|Function} startTime
|
|
27
|
-
* @param {boolean} mustAutoPlay
|
|
28
|
-
* @param {Function} onWarning
|
|
23
|
+
* @param {Object} args
|
|
29
24
|
* @param {Object} cancelSignal
|
|
30
25
|
* @returns {Object}
|
|
31
26
|
*/
|
|
32
|
-
export default function performInitialSeekAndPlay(mediaElement, playbackObserver, startTime, mustAutoPlay, onWarning, cancelSignal) {
|
|
33
|
-
let resolveAutoPlay;
|
|
34
|
-
let rejectAutoPlay;
|
|
35
|
-
const autoPlayResult = new Promise((res, rej) => {
|
|
36
|
-
resolveAutoPlay = res;
|
|
37
|
-
rejectAutoPlay = rej;
|
|
38
|
-
});
|
|
39
|
-
const initialSeekPerformed = new SharedReference(false, cancelSignal);
|
|
27
|
+
export default function performInitialSeekAndPlay({ mediaElement, playbackObserver, startTime, mustAutoPlay, isDirectfile, onWarning }, cancelSignal) {
|
|
40
28
|
const initialPlayPerformed = new SharedReference(false, cancelSignal);
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const initialTime = typeof startTime === "function" ? startTime() :
|
|
53
|
-
startTime;
|
|
54
|
-
log.info("Init: Set initial time", initialTime);
|
|
55
|
-
playbackObserver.setCurrentTime(initialTime);
|
|
56
|
-
initialSeekPerformed.setValue(true);
|
|
57
|
-
initialSeekPerformed.finish();
|
|
58
|
-
if (shouldValidateMetadata() && mediaElement.duration === 0) {
|
|
59
|
-
const error = new MediaError("MEDIA_ERR_NOT_LOADED_METADATA", "Cannot load automatically: your browser " +
|
|
60
|
-
"falsely announced having loaded the content.");
|
|
61
|
-
onWarning(error);
|
|
29
|
+
const autoPlayResult = new Promise((resolveAutoPlay, rejectAutoPlay) => {
|
|
30
|
+
// `startTime` defined as a function might depend on metadata to make its
|
|
31
|
+
// choice, such as the content duration, minimum and/or maximum position.
|
|
32
|
+
//
|
|
33
|
+
// The RxPlayer might already know those through the Manifest file for
|
|
34
|
+
// non-Directfile contents, yet only through the `HTMLMediaElement` once a
|
|
35
|
+
// a sufficient `readyState` has been reached for directfile contents.
|
|
36
|
+
// So let's divide the two possibilities here.
|
|
37
|
+
if (!isDirectfile || typeof startTime === "number") {
|
|
38
|
+
playbackObserver.setCurrentTime(typeof startTime === "number" ? startTime : startTime());
|
|
39
|
+
waitForSeekable();
|
|
62
40
|
}
|
|
63
|
-
|
|
64
|
-
|
|
41
|
+
else {
|
|
42
|
+
playbackObserver.listen((obs, stopListening) => {
|
|
43
|
+
if (obs.readyState >= 1) {
|
|
44
|
+
stopListening();
|
|
45
|
+
playbackObserver.setCurrentTime(typeof startTime === "number" ? startTime : startTime());
|
|
46
|
+
waitForSeekable();
|
|
47
|
+
}
|
|
48
|
+
}, { includeLastObservation: true, clearSignal: cancelSignal });
|
|
65
49
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
50
|
+
const deregisterCancellation = cancelSignal.register((err) => {
|
|
51
|
+
rejectAutoPlay(err);
|
|
52
|
+
});
|
|
53
|
+
/**
|
|
54
|
+
* Logic that should be run once the initial seek has been asked to the
|
|
55
|
+
* PlaybackObserver.
|
|
56
|
+
*
|
|
57
|
+
* Actually wait until the seek has been performed, wait for the right moment
|
|
58
|
+
* to perform autoplay, resolve the promise once everything has been done and
|
|
59
|
+
* potentially send warning if a minor issue is detected.
|
|
60
|
+
*/
|
|
61
|
+
function waitForSeekable() {
|
|
62
|
+
playbackObserver.listen((obs, stopListening) => {
|
|
63
|
+
if (obs.seeking === 0 /* SeekingState.None */ || obs.readyState === 0) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
70
66
|
stopListening();
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
"Media will play as soon as possible.");
|
|
82
|
-
}
|
|
83
|
-
initialPlayPerformed.setValue(true);
|
|
84
|
-
initialPlayPerformed.finish();
|
|
85
|
-
deregisterCancellation();
|
|
86
|
-
return resolveAutoPlay({ type: "skipped" });
|
|
87
|
-
}
|
|
88
|
-
let playResult;
|
|
89
|
-
try {
|
|
90
|
-
playResult = (_a = mediaElement.play()) !== null && _a !== void 0 ? _a : Promise.resolve();
|
|
67
|
+
if (shouldValidateMetadata() && mediaElement.duration === 0) {
|
|
68
|
+
const error = new MediaError("MEDIA_ERR_NOT_LOADED_METADATA", "Cannot load automatically: your browser " +
|
|
69
|
+
"falsely announced having loaded the content.");
|
|
70
|
+
onWarning(error);
|
|
71
|
+
}
|
|
72
|
+
if (cancelSignal.isCancelled()) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
waitForPlayable();
|
|
76
|
+
}, { includeLastObservation: true, clearSignal: cancelSignal });
|
|
91
77
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
78
|
+
/**
|
|
79
|
+
* Logic that should be run once the initial seek has been properly performed.
|
|
80
|
+
*
|
|
81
|
+
* Wait for the media being playable before performing the autoplay operation
|
|
82
|
+
* if asked. Potentially send warning if a minor issue has been detected while
|
|
83
|
+
* doing so.
|
|
84
|
+
*/
|
|
85
|
+
function waitForPlayable() {
|
|
86
|
+
playbackObserver.listen((observation, stopListening) => {
|
|
87
|
+
if (observation.seeking === 0 /* SeekingState.None */ &&
|
|
88
|
+
observation.rebuffering === null &&
|
|
89
|
+
observation.readyState >= 1) {
|
|
90
|
+
stopListening();
|
|
91
|
+
onPlayable();
|
|
92
|
+
}
|
|
93
|
+
}, { includeLastObservation: true, clearSignal: cancelSignal });
|
|
95
94
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
95
|
+
/**
|
|
96
|
+
* Callback called once the content is considered "playable".
|
|
97
|
+
*
|
|
98
|
+
* Perform the autoplay if needed, handling potential issues and resolve the
|
|
99
|
+
* Promise when done.
|
|
100
|
+
* Might also send warnings if minor issues arise.
|
|
101
|
+
*/
|
|
102
|
+
function onPlayable() {
|
|
103
|
+
var _a;
|
|
104
|
+
log.info("Init: Can begin to play content");
|
|
105
|
+
if (!mustAutoPlay) {
|
|
106
|
+
if (mediaElement.autoplay) {
|
|
107
|
+
log.warn("Init: autoplay is enabled on HTML media element. " +
|
|
108
|
+
"Media will play as soon as possible.");
|
|
109
|
+
}
|
|
110
|
+
initialPlayPerformed.setValue(true);
|
|
111
|
+
initialPlayPerformed.finish();
|
|
112
|
+
deregisterCancellation();
|
|
113
|
+
return resolveAutoPlay({ type: "skipped" });
|
|
100
114
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
return resolveAutoPlay({ type: "autoplay" });
|
|
105
|
-
})
|
|
106
|
-
.catch((playError) => {
|
|
107
|
-
deregisterCancellation();
|
|
108
|
-
if (cancelSignal.isCancelled()) {
|
|
109
|
-
return;
|
|
115
|
+
let playResult;
|
|
116
|
+
try {
|
|
117
|
+
playResult = (_a = mediaElement.play()) !== null && _a !== void 0 ? _a : Promise.resolve();
|
|
110
118
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
onWarning(error);
|
|
119
|
+
catch (playError) {
|
|
120
|
+
deregisterCancellation();
|
|
121
|
+
return rejectAutoPlay(playError);
|
|
122
|
+
}
|
|
123
|
+
playResult
|
|
124
|
+
.then(() => {
|
|
118
125
|
if (cancelSignal.isCancelled()) {
|
|
119
126
|
return;
|
|
120
127
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
+
initialPlayPerformed.setValue(true);
|
|
129
|
+
initialPlayPerformed.finish();
|
|
130
|
+
deregisterCancellation();
|
|
131
|
+
return resolveAutoPlay({ type: "autoplay" });
|
|
132
|
+
})
|
|
133
|
+
.catch((playError) => {
|
|
134
|
+
deregisterCancellation();
|
|
135
|
+
if (cancelSignal.isCancelled()) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (playError instanceof Error && playError.name === "NotAllowedError") {
|
|
139
|
+
// auto-play was probably prevented.
|
|
140
|
+
log.warn("Init: Media element can't play." +
|
|
141
|
+
" It may be due to browser auto-play policies.");
|
|
142
|
+
const error = new MediaError("MEDIA_ERR_BLOCKED_AUTOPLAY", "Cannot trigger auto-play automatically: " +
|
|
143
|
+
"your browser does not allow it.");
|
|
144
|
+
onWarning(error);
|
|
145
|
+
if (cancelSignal.isCancelled()) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
return resolveAutoPlay({ type: "autoplay-blocked" });
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
rejectAutoPlay(playError);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
return { autoPlayResult, initialPlayPerformed };
|
|
128
157
|
}
|
|
@@ -13,7 +13,6 @@
|
|
|
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";
|
|
17
16
|
import config from "../../../config";
|
|
18
17
|
import { MediaError } from "../../../errors";
|
|
19
18
|
import log from "../../../log";
|
|
@@ -56,52 +55,15 @@ export default class RebufferingController extends EventEmitter {
|
|
|
56
55
|
return;
|
|
57
56
|
}
|
|
58
57
|
this._isStarted = true;
|
|
59
|
-
/**
|
|
60
|
-
* On some devices (right now only seen on Tizen), seeking through the
|
|
61
|
-
* `currentTime` property can lead to the browser re-seeking once the
|
|
62
|
-
* segments have been loaded to improve seeking performances (for
|
|
63
|
-
* example, by seeking right to an intra video frame).
|
|
64
|
-
* In that case, we risk being in a conflict with that behavior: if for
|
|
65
|
-
* example we encounter a small discontinuity at the position the browser
|
|
66
|
-
* seeks to, we will seek over it, the browser would seek back and so on.
|
|
67
|
-
*
|
|
68
|
-
* This variable allows to store the last known position we were seeking to
|
|
69
|
-
* so we can detect when the browser seeked back (to avoid performing another
|
|
70
|
-
* seek after that). When browsers seek back to a position behind a
|
|
71
|
-
* discontinuity, they are usually able to skip them without our help.
|
|
72
|
-
*/
|
|
73
|
-
let lastSeekingPosition;
|
|
74
|
-
/**
|
|
75
|
-
* In some conditions (see `lastSeekingPosition`), we might want to not
|
|
76
|
-
* automatically seek over discontinuities because the browser might do it
|
|
77
|
-
* itself instead.
|
|
78
|
-
* In that case, we still want to perform the seek ourselves if the browser
|
|
79
|
-
* doesn't do it after sufficient time.
|
|
80
|
-
* This variable allows to store the timestamp at which a discontinuity began
|
|
81
|
-
* to be ignored.
|
|
82
|
-
*/
|
|
83
|
-
let ignoredStallTimeStamp = null;
|
|
84
58
|
const playbackRateUpdater = new PlaybackRateUpdater(this._playbackObserver, this._speed);
|
|
85
59
|
this._canceller.signal.register(() => {
|
|
86
60
|
playbackRateUpdater.dispose();
|
|
87
61
|
});
|
|
88
62
|
let prevFreezingState = null;
|
|
89
63
|
this._playbackObserver.listen((observation) => {
|
|
90
|
-
var _a;
|
|
91
64
|
const discontinuitiesStore = this._discontinuitiesStore;
|
|
92
65
|
const { buffered, position, readyState, rebuffering, freezing } = observation;
|
|
93
|
-
const { BUFFER_DISCONTINUITY_THRESHOLD,
|
|
94
|
-
if (!observation.seeking &&
|
|
95
|
-
isSeekingApproximate &&
|
|
96
|
-
ignoredStallTimeStamp === null &&
|
|
97
|
-
lastSeekingPosition !== null && observation.position < lastSeekingPosition) {
|
|
98
|
-
log.debug("Init: the device appeared to have seeked back by itself.");
|
|
99
|
-
const now = getMonotonicTimeStamp();
|
|
100
|
-
ignoredStallTimeStamp = now;
|
|
101
|
-
}
|
|
102
|
-
lastSeekingPosition = observation.seeking ?
|
|
103
|
-
Math.max((_a = observation.pendingInternalSeek) !== null && _a !== void 0 ? _a : 0, observation.position) :
|
|
104
|
-
null;
|
|
66
|
+
const { BUFFER_DISCONTINUITY_THRESHOLD, FREEZING_STALLED_DELAY, UNFREEZING_SEEK_DELAY, UNFREEZING_DELTA_POSITION } = config.getCurrent();
|
|
105
67
|
if (this._checkDecipherabilityFreeze(observation)) {
|
|
106
68
|
return;
|
|
107
69
|
}
|
|
@@ -110,13 +72,14 @@ export default class RebufferingController extends EventEmitter {
|
|
|
110
72
|
const referenceTimestamp = prevFreezingState === null ?
|
|
111
73
|
freezing.timestamp :
|
|
112
74
|
prevFreezingState.attemptTimestamp;
|
|
113
|
-
if (
|
|
75
|
+
if (!position.isAwaitingFuturePosition() &&
|
|
76
|
+
now - referenceTimestamp > UNFREEZING_SEEK_DELAY) {
|
|
114
77
|
log.warn("Init: trying to seek to un-freeze player");
|
|
115
78
|
this._playbackObserver.setCurrentTime(this._playbackObserver.getCurrentTime() + UNFREEZING_DELTA_POSITION);
|
|
116
79
|
prevFreezingState = { attemptTimestamp: now };
|
|
117
80
|
}
|
|
118
81
|
if (now - freezing.timestamp > FREEZING_STALLED_DELAY) {
|
|
119
|
-
if (rebuffering === null
|
|
82
|
+
if (rebuffering === null) {
|
|
120
83
|
playbackRateUpdater.stopRebuffering();
|
|
121
84
|
}
|
|
122
85
|
else {
|
|
@@ -135,8 +98,9 @@ export default class RebufferingController extends EventEmitter {
|
|
|
135
98
|
// With a readyState set to 1, we should still not be able to play:
|
|
136
99
|
// Return that we're stalled
|
|
137
100
|
let reason;
|
|
138
|
-
if (observation.seeking) {
|
|
139
|
-
reason = observation.
|
|
101
|
+
if (observation.seeking !== 0 /* SeekingState.None */) {
|
|
102
|
+
reason = observation.seeking === 1 /* SeekingState.Internal */ ?
|
|
103
|
+
"internal-seek" :
|
|
140
104
|
"seeking";
|
|
141
105
|
}
|
|
142
106
|
else {
|
|
@@ -151,22 +115,15 @@ export default class RebufferingController extends EventEmitter {
|
|
|
151
115
|
// We want to separate a stall situation when a seek is due to a seek done
|
|
152
116
|
// internally by the player to when its due to a regular user seek.
|
|
153
117
|
const stalledReason = rebuffering.reason === "seeking" &&
|
|
154
|
-
observation.
|
|
118
|
+
observation.seeking === 1 /* SeekingState.Internal */ ?
|
|
155
119
|
"internal-seek" :
|
|
156
120
|
rebuffering.reason;
|
|
157
|
-
if (
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
this.trigger("stalled", stalledReason);
|
|
163
|
-
return;
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
166
|
-
log.warn("Init: ignored stall for too long, considering it", now - ignoredStallTimeStamp);
|
|
167
|
-
}
|
|
121
|
+
if (position.isAwaitingFuturePosition()) {
|
|
122
|
+
playbackRateUpdater.stopRebuffering();
|
|
123
|
+
log.debug("Init: let rebuffering happen as we're awaiting a future position");
|
|
124
|
+
this.trigger("stalled", stalledReason);
|
|
125
|
+
return;
|
|
168
126
|
}
|
|
169
|
-
ignoredStallTimeStamp = null;
|
|
170
127
|
playbackRateUpdater.startRebuffering();
|
|
171
128
|
if (this._manifest === null) {
|
|
172
129
|
this.trigger("stalled", stalledReason);
|
|
@@ -184,14 +141,14 @@ export default class RebufferingController extends EventEmitter {
|
|
|
184
141
|
log.info("Init: position to seek already reached, no seeking", this._playbackObserver.getCurrentTime(), realSeekTime);
|
|
185
142
|
}
|
|
186
143
|
else {
|
|
187
|
-
log.warn("SA: skippable discontinuity found in the stream", position, realSeekTime);
|
|
144
|
+
log.warn("SA: skippable discontinuity found in the stream", position.getPolled(), realSeekTime);
|
|
188
145
|
this._playbackObserver.setCurrentTime(realSeekTime);
|
|
189
146
|
this.trigger("warning", generateDiscontinuityError(stalledPosition, realSeekTime));
|
|
190
147
|
return;
|
|
191
148
|
}
|
|
192
149
|
}
|
|
193
150
|
}
|
|
194
|
-
const
|
|
151
|
+
const positionBlockedAt = stalledPosition !== null && stalledPosition !== void 0 ? stalledPosition : position.getPolled();
|
|
195
152
|
// Is it a very short discontinuity in buffer ? -> Seek at the beginning of the
|
|
196
153
|
// next range
|
|
197
154
|
//
|
|
@@ -199,14 +156,14 @@ export default class RebufferingController extends EventEmitter {
|
|
|
199
156
|
// calculate a stalled state. This is useful for some
|
|
200
157
|
// implementation that might drop an injected segment, or in
|
|
201
158
|
// case of small discontinuity in the content.
|
|
202
|
-
const nextBufferRangeGap = getNextBufferedTimeRangeGap(buffered,
|
|
159
|
+
const nextBufferRangeGap = getNextBufferedTimeRangeGap(buffered, positionBlockedAt);
|
|
203
160
|
if (this._speed.getValue() > 0 &&
|
|
204
161
|
nextBufferRangeGap < BUFFER_DISCONTINUITY_THRESHOLD) {
|
|
205
|
-
const seekTo = (
|
|
162
|
+
const seekTo = (positionBlockedAt + nextBufferRangeGap + EPSILON);
|
|
206
163
|
if (this._playbackObserver.getCurrentTime() < seekTo) {
|
|
207
|
-
log.warn("Init: discontinuity encountered inferior to the threshold",
|
|
164
|
+
log.warn("Init: discontinuity encountered inferior to the threshold", positionBlockedAt, seekTo, BUFFER_DISCONTINUITY_THRESHOLD);
|
|
208
165
|
this._playbackObserver.setCurrentTime(seekTo);
|
|
209
|
-
this.trigger("warning", generateDiscontinuityError(
|
|
166
|
+
this.trigger("warning", generateDiscontinuityError(positionBlockedAt, seekTo));
|
|
210
167
|
return;
|
|
211
168
|
}
|
|
212
169
|
}
|
|
@@ -214,13 +171,13 @@ export default class RebufferingController extends EventEmitter {
|
|
|
214
171
|
// next period
|
|
215
172
|
for (let i = this._manifest.periods.length - 2; i >= 0; i--) {
|
|
216
173
|
const period = this._manifest.periods[i];
|
|
217
|
-
if (period.end !== undefined && period.end <=
|
|
218
|
-
if (this._manifest.periods[i + 1].start >
|
|
174
|
+
if (period.end !== undefined && period.end <= positionBlockedAt) {
|
|
175
|
+
if (this._manifest.periods[i + 1].start > positionBlockedAt &&
|
|
219
176
|
this._manifest.periods[i + 1].start >
|
|
220
177
|
this._playbackObserver.getCurrentTime()) {
|
|
221
178
|
const nextPeriod = this._manifest.periods[i + 1];
|
|
222
179
|
this._playbackObserver.setCurrentTime(nextPeriod.start);
|
|
223
|
-
this.trigger("warning", generateDiscontinuityError(
|
|
180
|
+
this.trigger("warning", generateDiscontinuityError(positionBlockedAt, nextPeriod.start));
|
|
224
181
|
return;
|
|
225
182
|
}
|
|
226
183
|
break;
|
|
@@ -262,10 +219,10 @@ export default class RebufferingController extends EventEmitter {
|
|
|
262
219
|
bufferType !== "video")) {
|
|
263
220
|
return;
|
|
264
221
|
}
|
|
265
|
-
const
|
|
266
|
-
const rebufferingPos = (_a = observation.rebuffering.position) !== null && _a !== void 0 ? _a :
|
|
222
|
+
const loadedPos = observation.position.getWanted();
|
|
223
|
+
const rebufferingPos = (_a = observation.rebuffering.position) !== null && _a !== void 0 ? _a : loadedPos;
|
|
267
224
|
const lockedPeriodStart = period.start;
|
|
268
|
-
if (
|
|
225
|
+
if (loadedPos < lockedPeriodStart &&
|
|
269
226
|
Math.abs(rebufferingPos - lockedPeriodStart) < 1) {
|
|
270
227
|
log.warn("Init: rebuffering because of a future locked stream.\n" +
|
|
271
228
|
"Trying to unlock by seeking to the next Period");
|
|
@@ -300,7 +257,6 @@ export default class RebufferingController extends EventEmitter {
|
|
|
300
257
|
* right handling steps.
|
|
301
258
|
*/
|
|
302
259
|
_checkDecipherabilityFreeze(observation) {
|
|
303
|
-
// XXX TODO allow this in in-worker configuration
|
|
304
260
|
const { readyState, rebuffering, freezing } = observation;
|
|
305
261
|
const bufferGap = observation.bufferGap !== undefined &&
|
|
306
262
|
isFinite(observation.bufferGap) ? observation.bufferGap :
|
|
@@ -424,10 +380,11 @@ function eventContainsDiscontinuity(evt) {
|
|
|
424
380
|
* @returns {Array.<Object>}
|
|
425
381
|
*/
|
|
426
382
|
function updateDiscontinuitiesStore(discontinuitiesStore, evt, observation) {
|
|
383
|
+
const gcTime = Math.min(observation.position.getPolled(), observation.position.getWanted());
|
|
427
384
|
// First, perform clean-up of old discontinuities
|
|
428
385
|
while (discontinuitiesStore.length > 0 &&
|
|
429
386
|
discontinuitiesStore[0].period.end !== undefined &&
|
|
430
|
-
discontinuitiesStore[0].period.end + 10 <
|
|
387
|
+
discontinuitiesStore[0].period.end + 10 < gcTime) {
|
|
431
388
|
discontinuitiesStore.shift();
|
|
432
389
|
}
|
|
433
390
|
const { period, bufferType } = evt;
|
|
@@ -81,8 +81,10 @@ export default class StreamEventsEmitter extends EventEmitter {
|
|
|
81
81
|
clearInterval(intervalId);
|
|
82
82
|
});
|
|
83
83
|
function constructObservation() {
|
|
84
|
-
const
|
|
85
|
-
|
|
84
|
+
const lastObservation = playbackObserver.getReference().getValue();
|
|
85
|
+
const currentTime = mediaElement.currentTime;
|
|
86
|
+
const isSeeking = lastObservation.seeking !== 0 /* SeekingState.None */;
|
|
87
|
+
return { currentTime,
|
|
86
88
|
isSeeking };
|
|
87
89
|
}
|
|
88
90
|
}, { emitCurrentValue: true, clearSignal: cancelSignal });
|
|
@@ -28,8 +28,7 @@ import { getInnerAndOuterRangesFromBufferedTimeRanges } from "../../utils/ranges
|
|
|
28
28
|
export default function BufferGarbageCollector({ segmentBuffer, playbackObserver, maxBufferBehind, maxBufferAhead }, cancellationSignal) {
|
|
29
29
|
let lastPosition;
|
|
30
30
|
playbackObserver.listen((o) => {
|
|
31
|
-
|
|
32
|
-
lastPosition = (_a = o.position.pending) !== null && _a !== void 0 ? _a : o.position.last;
|
|
31
|
+
lastPosition = o.position.getWanted();
|
|
33
32
|
clean();
|
|
34
33
|
}, { includeLastObservation: true, clearSignal: cancellationSignal });
|
|
35
34
|
function clean() {
|
package/dist/es2017/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js
CHANGED
|
@@ -207,7 +207,14 @@ export default class AudioVideoSegmentBuffer extends SegmentBuffer {
|
|
|
207
207
|
err :
|
|
208
208
|
new Error("An unknown error occured when doing operations " +
|
|
209
209
|
"on the SourceBuffer");
|
|
210
|
-
this._pendingTask
|
|
210
|
+
const task = this._pendingTask;
|
|
211
|
+
if (task.type === SegmentBufferOperation.Push &&
|
|
212
|
+
task.data.length === 0 &&
|
|
213
|
+
task.inventoryData !== null) {
|
|
214
|
+
this._segmentInventory.insertChunk(task.inventoryData, false);
|
|
215
|
+
}
|
|
216
|
+
this._pendingTask = null;
|
|
217
|
+
task.reject(error);
|
|
211
218
|
}
|
|
212
219
|
}
|
|
213
220
|
/**
|
|
@@ -254,7 +261,7 @@ export default class AudioVideoSegmentBuffer extends SegmentBuffer {
|
|
|
254
261
|
switch (task.type) {
|
|
255
262
|
case SegmentBufferOperation.Push:
|
|
256
263
|
if (task.inventoryData !== null) {
|
|
257
|
-
this._segmentInventory.insertChunk(task.inventoryData);
|
|
264
|
+
this._segmentInventory.insertChunk(task.inventoryData, true);
|
|
258
265
|
}
|
|
259
266
|
break;
|
|
260
267
|
case SegmentBufferOperation.EndOfSegment:
|
package/dist/es2017/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js
CHANGED
|
@@ -213,7 +213,7 @@ export default class HTMLTextSegmentBuffer extends SegmentBuffer {
|
|
|
213
213
|
return;
|
|
214
214
|
}
|
|
215
215
|
if (infos.inventoryInfos !== null) {
|
|
216
|
-
this._segmentInventory.insertChunk(infos.inventoryInfos);
|
|
216
|
+
this._segmentInventory.insertChunk(infos.inventoryInfos, true);
|
|
217
217
|
}
|
|
218
218
|
this._buffer.insert(cues, start, end);
|
|
219
219
|
this._buffered.insert(start, end);
|
package/dist/es2017/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js
CHANGED
|
@@ -138,7 +138,7 @@ export default class NativeTextSegmentBuffer extends SegmentBuffer {
|
|
|
138
138
|
}
|
|
139
139
|
this._buffered.insert(start, end);
|
|
140
140
|
if (infos.inventoryInfos !== null) {
|
|
141
|
-
this._segmentInventory.insertChunk(infos.inventoryInfos);
|
|
141
|
+
this._segmentInventory.insertChunk(infos.inventoryInfos, true);
|
|
142
142
|
}
|
|
143
143
|
}
|
|
144
144
|
catch (err) {
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import BufferGarbageCollector from "./garbage_collector";
|
|
17
17
|
import { IBufferType, IEndOfSegmentInfos, IEndOfSegmentOperation, IPushChunkInfos, IPushedChunkData, IPushOperation, IRemoveOperation, ISBOperation, SegmentBuffer, SegmentBufferOperation } from "./implementations";
|
|
18
|
-
import { IBufferedChunk, IChunkContext, IInsertedChunkInfos, getFirstSegmentAfterPeriod, getLastSegmentBeforePeriod } from "./inventory";
|
|
18
|
+
import { ChunkStatus, IBufferedChunk, IChunkContext, IInsertedChunkInfos, getFirstSegmentAfterPeriod, getLastSegmentBeforePeriod } from "./inventory";
|
|
19
19
|
import SegmentBuffersStore, { ISegmentBufferOptions, ITextTrackSegmentBufferOptions } from "./segment_buffers_store";
|
|
20
20
|
export default SegmentBuffersStore;
|
|
21
|
-
export { BufferGarbageCollector, ISegmentBufferOptions, ITextTrackSegmentBufferOptions, SegmentBuffer, IBufferType, IBufferedChunk, IChunkContext, IInsertedChunkInfos, IPushChunkInfos, IPushedChunkData, IEndOfSegmentInfos, SegmentBufferOperation, ISBOperation, IEndOfSegmentOperation, IPushOperation, IRemoveOperation, getFirstSegmentAfterPeriod, getLastSegmentBeforePeriod, };
|
|
21
|
+
export { BufferGarbageCollector, ChunkStatus, ISegmentBufferOptions, ITextTrackSegmentBufferOptions, SegmentBuffer, IBufferType, IBufferedChunk, IChunkContext, IInsertedChunkInfos, IPushChunkInfos, IPushedChunkData, IEndOfSegmentInfos, SegmentBufferOperation, ISBOperation, IEndOfSegmentOperation, IPushOperation, IRemoveOperation, getFirstSegmentAfterPeriod, getLastSegmentBeforePeriod, };
|
|
@@ -13,9 +13,9 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import SegmentInventory, { IBufferedChunk, IInsertedChunkInfos } from "./segment_inventory";
|
|
16
|
+
import SegmentInventory, { ChunkStatus, IBufferedChunk, IInsertedChunkInfos } from "./segment_inventory";
|
|
17
17
|
export default SegmentInventory;
|
|
18
|
-
export { IBufferedChunk, IInsertedChunkInfos, };
|
|
18
|
+
export { ChunkStatus, IBufferedChunk, IInsertedChunkInfos, };
|
|
19
19
|
export { IBufferedHistoryEntry } from "./buffered_history";
|
|
20
20
|
export { IChunkContext } from "./types";
|
|
21
21
|
export { getFirstSegmentAfterPeriod, getLastSegmentBeforePeriod, } from "./utils";
|