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,25 +24,110 @@ var __assign = (this && this.__assign) || function () {
|
|
|
24
24
|
};
|
|
25
25
|
return __assign.apply(this, arguments);
|
|
26
26
|
};
|
|
27
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
28
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
29
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
30
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
31
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
32
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
33
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
37
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
38
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
39
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
40
|
+
function step(op) {
|
|
41
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
42
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
43
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
44
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
45
|
+
switch (op[0]) {
|
|
46
|
+
case 0: case 1: t = op; break;
|
|
47
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
48
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
49
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
50
|
+
default:
|
|
51
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
52
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
53
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
54
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
55
|
+
if (t[2]) _.ops.pop();
|
|
56
|
+
_.trys.pop(); continue;
|
|
57
|
+
}
|
|
58
|
+
op = body.call(thisArg, _);
|
|
59
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
60
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
import features from "../../features";
|
|
27
64
|
import log from "../../log";
|
|
28
65
|
import Manifest from "../../manifest";
|
|
29
66
|
import { getMDAT } from "../../parsers/containers/isobmff";
|
|
30
|
-
import createSmoothManifestParser from "../../parsers/manifest/smooth";
|
|
67
|
+
import createSmoothManifestParser, { SmoothRepresentationIndex, } from "../../parsers/manifest/smooth";
|
|
31
68
|
import request from "../../utils/request";
|
|
32
69
|
import { strToUtf8, utf8ToStr, } from "../../utils/string_parsing";
|
|
70
|
+
import warnOnce from "../../utils/warn_once";
|
|
33
71
|
import checkISOBMFFIntegrity from "../utils/check_isobmff_integrity";
|
|
34
72
|
import generateManifestLoader from "../utils/generate_manifest_loader";
|
|
35
73
|
import extractTimingsInfos from "./extract_timings_infos";
|
|
36
|
-
import isMP4EmbeddedTrack from "./is_mp4_embedded_track";
|
|
37
74
|
import { patchSegment } from "./isobmff";
|
|
38
75
|
import generateSegmentLoader from "./segment_loader";
|
|
39
|
-
import { constructSegmentUrl } from "./utils";
|
|
76
|
+
import { constructSegmentUrl, extractISML, extractToken, isMP4EmbeddedTrack, replaceToken, resolveManifest, } from "./utils";
|
|
77
|
+
var WSX_REG = /\.wsx?(\?token=\S+)?/;
|
|
78
|
+
/**
|
|
79
|
+
* @param {Object} adaptation
|
|
80
|
+
* @param {Object} dlSegment
|
|
81
|
+
* @param {Object} nextSegments
|
|
82
|
+
*/
|
|
83
|
+
function addNextSegments(adaptation, nextSegments, dlSegment) {
|
|
84
|
+
var _a;
|
|
85
|
+
log.debug("Smooth Parser: update segments information.");
|
|
86
|
+
var representations = adaptation.representations;
|
|
87
|
+
for (var i = 0; i < representations.length; i++) {
|
|
88
|
+
var representation = representations[i];
|
|
89
|
+
if (representation.index instanceof SmoothRepresentationIndex &&
|
|
90
|
+
((_a = dlSegment === null || dlSegment === void 0 ? void 0 : dlSegment.privateInfos) === null || _a === void 0 ? void 0 : _a.smoothMediaSegment) !== undefined) {
|
|
91
|
+
representation.index.addNewSegments(nextSegments, dlSegment.privateInfos.smoothMediaSegment);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
log.warn("Smooth Parser: should only encounter SmoothRepresentationIndex");
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
40
98
|
export default function (transportOptions) {
|
|
41
99
|
var smoothManifestParser = createSmoothManifestParser(transportOptions);
|
|
42
100
|
var segmentLoader = generateSegmentLoader(transportOptions);
|
|
43
101
|
var manifestLoaderOptions = { customManifestLoader: transportOptions.manifestLoader };
|
|
44
102
|
var manifestLoader = generateManifestLoader(manifestLoaderOptions, "text");
|
|
45
103
|
var manifestPipeline = {
|
|
104
|
+
// TODO (v4.x.x) Remove that function
|
|
105
|
+
resolveManifestUrl: function (url, cancelSignal) {
|
|
106
|
+
if (url === undefined) {
|
|
107
|
+
return Promise.resolve(undefined);
|
|
108
|
+
}
|
|
109
|
+
var resolving;
|
|
110
|
+
if (WSX_REG.test(url)) {
|
|
111
|
+
warnOnce("Giving WSX URL to loadVideo is deprecated." +
|
|
112
|
+
" You should only give Manifest URLs.");
|
|
113
|
+
resolving = request({ url: replaceToken(url, ""),
|
|
114
|
+
responseType: "document", cancelSignal: cancelSignal })
|
|
115
|
+
.then(function (value) {
|
|
116
|
+
var extractedURL = extractISML(value.responseData);
|
|
117
|
+
if (extractedURL === null || extractedURL.length === 0) {
|
|
118
|
+
throw new Error("Invalid ISML");
|
|
119
|
+
}
|
|
120
|
+
return extractedURL;
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
resolving = Promise.resolve(url);
|
|
125
|
+
}
|
|
126
|
+
var token = extractToken(url);
|
|
127
|
+
return resolving.then(function (_url) {
|
|
128
|
+
return replaceToken(resolveManifest(_url), token);
|
|
129
|
+
});
|
|
130
|
+
},
|
|
46
131
|
loadManifest: manifestLoader,
|
|
47
132
|
parseManifest: function (manifestData, parserOptions) {
|
|
48
133
|
var _a;
|
|
@@ -54,6 +139,8 @@ export default function (transportOptions) {
|
|
|
54
139
|
var parserResult = smoothManifestParser(documentData, url, manifestReceivedTime);
|
|
55
140
|
var manifest = new Manifest(parserResult, {
|
|
56
141
|
representationFilter: transportOptions.representationFilter,
|
|
142
|
+
supplementaryImageTracks: transportOptions.supplementaryImageTracks,
|
|
143
|
+
supplementaryTextTracks: transportOptions.supplementaryTextTracks,
|
|
57
144
|
});
|
|
58
145
|
return { manifest: manifest, url: url };
|
|
59
146
|
},
|
|
@@ -66,26 +153,26 @@ export default function (transportOptions) {
|
|
|
66
153
|
/**
|
|
67
154
|
* Load a Smooth audio/video segment.
|
|
68
155
|
* @param {Object|null} wantedCdn
|
|
69
|
-
* @param {Object}
|
|
156
|
+
* @param {Object} content
|
|
70
157
|
* @param {Object} loaderOptions
|
|
71
158
|
* @param {Object} cancelSignal
|
|
72
159
|
* @param {Object} callbacks
|
|
73
160
|
* @returns {Promise}
|
|
74
161
|
*/
|
|
75
|
-
loadSegment: function (wantedCdn,
|
|
76
|
-
var url = constructSegmentUrl(wantedCdn,
|
|
77
|
-
return segmentLoader(url,
|
|
162
|
+
loadSegment: function (wantedCdn, content, loaderOptions, cancelSignal, callbacks) {
|
|
163
|
+
var url = constructSegmentUrl(wantedCdn, content.segment);
|
|
164
|
+
return segmentLoader(url, content, loaderOptions, cancelSignal, callbacks);
|
|
78
165
|
},
|
|
79
|
-
parseSegment: function (loadedSegment,
|
|
166
|
+
parseSegment: function (loadedSegment, content, initTimescale) {
|
|
80
167
|
var _a, _b;
|
|
81
|
-
var segment =
|
|
168
|
+
var segment = content.segment, adaptation = content.adaptation, manifest = content.manifest;
|
|
82
169
|
var data = loadedSegment.data, isChunked = loadedSegment.isChunked;
|
|
83
170
|
if (data === null) {
|
|
84
171
|
if (segment.isInit) {
|
|
85
172
|
return { segmentType: "init",
|
|
86
173
|
initializationData: null,
|
|
87
174
|
initializationDataSize: 0,
|
|
88
|
-
|
|
175
|
+
protectionDataUpdate: false,
|
|
89
176
|
initTimescale: undefined };
|
|
90
177
|
}
|
|
91
178
|
return { segmentType: "media",
|
|
@@ -93,7 +180,7 @@ export default function (transportOptions) {
|
|
|
93
180
|
chunkInfos: null,
|
|
94
181
|
chunkOffset: 0,
|
|
95
182
|
chunkSize: 0,
|
|
96
|
-
|
|
183
|
+
protectionDataUpdate: false,
|
|
97
184
|
appendWindow: [undefined, undefined] };
|
|
98
185
|
}
|
|
99
186
|
var responseBuffer = data instanceof Uint8Array ? data :
|
|
@@ -106,10 +193,10 @@ export default function (transportOptions) {
|
|
|
106
193
|
// smooth init segments are crafted by hand.
|
|
107
194
|
// Their timescale is the one from the manifest.
|
|
108
195
|
initTimescale: timescale,
|
|
109
|
-
|
|
196
|
+
protectionDataUpdate: false };
|
|
110
197
|
}
|
|
111
198
|
var timingInfos = initTimescale !== undefined ?
|
|
112
|
-
extractTimingsInfos(responseBuffer, isChunked, initTimescale, segment,
|
|
199
|
+
extractTimingsInfos(responseBuffer, isChunked, initTimescale, segment, manifest.isLive) :
|
|
113
200
|
null;
|
|
114
201
|
if (timingInfos === null ||
|
|
115
202
|
timingInfos.chunkInfos === null ||
|
|
@@ -118,22 +205,24 @@ export default function (transportOptions) {
|
|
|
118
205
|
}
|
|
119
206
|
var nextSegments = timingInfos.nextSegments, chunkInfos = timingInfos.chunkInfos, scaledSegmentTime = timingInfos.scaledSegmentTime;
|
|
120
207
|
var chunkData = patchSegment(responseBuffer, scaledSegmentTime);
|
|
121
|
-
|
|
122
|
-
|
|
208
|
+
if (nextSegments.length > 0) {
|
|
209
|
+
addNextSegments(adaptation, nextSegments, segment);
|
|
210
|
+
}
|
|
123
211
|
return { segmentType: "media", chunkData: chunkData, chunkInfos: chunkInfos, chunkOffset: 0,
|
|
124
212
|
chunkSize: chunkData.length,
|
|
125
|
-
|
|
213
|
+
protectionDataUpdate: false,
|
|
214
|
+
appendWindow: [undefined, undefined] };
|
|
126
215
|
},
|
|
127
216
|
};
|
|
128
217
|
var textTrackPipeline = {
|
|
129
|
-
loadSegment: function (wantedCdn,
|
|
130
|
-
var segment =
|
|
218
|
+
loadSegment: function (wantedCdn, content, loaderOptions, cancelSignal, callbacks) {
|
|
219
|
+
var segment = content.segment, representation = content.representation;
|
|
131
220
|
var url = constructSegmentUrl(wantedCdn, segment);
|
|
132
221
|
if (segment.isInit || url === null) {
|
|
133
222
|
return Promise.resolve({ resultType: "segment-created",
|
|
134
223
|
resultData: null });
|
|
135
224
|
}
|
|
136
|
-
var isMP4 = isMP4EmbeddedTrack(
|
|
225
|
+
var isMP4 = isMP4EmbeddedTrack(representation);
|
|
137
226
|
if (!isMP4) {
|
|
138
227
|
return request({ url: url, responseType: "text",
|
|
139
228
|
timeout: loaderOptions.timeout, cancelSignal: cancelSignal, onProgress: callbacks.onProgress })
|
|
@@ -149,23 +238,25 @@ export default function (transportOptions) {
|
|
|
149
238
|
resultData: data };
|
|
150
239
|
}
|
|
151
240
|
var dataU8 = new Uint8Array(data.responseData);
|
|
152
|
-
checkISOBMFFIntegrity(dataU8,
|
|
241
|
+
checkISOBMFFIntegrity(dataU8, content.segment.isInit);
|
|
153
242
|
return { resultType: "segment-loaded",
|
|
154
243
|
resultData: __assign(__assign({}, data), { responseData: dataU8 }) };
|
|
155
244
|
});
|
|
156
245
|
}
|
|
157
246
|
},
|
|
158
|
-
parseSegment: function (loadedSegment,
|
|
247
|
+
parseSegment: function (loadedSegment, content, initTimescale) {
|
|
159
248
|
var _a;
|
|
160
|
-
var
|
|
161
|
-
var
|
|
249
|
+
var manifest = content.manifest, adaptation = content.adaptation, representation = content.representation, segment = content.segment;
|
|
250
|
+
var language = adaptation.language;
|
|
251
|
+
var isMP4 = isMP4EmbeddedTrack(representation);
|
|
252
|
+
var _b = representation.mimeType, mimeType = _b === void 0 ? "" : _b, _c = representation.codec, codec = _c === void 0 ? "" : _c;
|
|
162
253
|
var data = loadedSegment.data, isChunked = loadedSegment.isChunked;
|
|
163
254
|
var chunkSize;
|
|
164
255
|
if (segment.isInit) { // text init segment has no use in HSS
|
|
165
256
|
return { segmentType: "init",
|
|
166
257
|
initializationData: null,
|
|
167
258
|
initializationDataSize: 0,
|
|
168
|
-
|
|
259
|
+
protectionDataUpdate: false,
|
|
169
260
|
initTimescale: undefined };
|
|
170
261
|
}
|
|
171
262
|
if (data === null) {
|
|
@@ -174,7 +265,7 @@ export default function (transportOptions) {
|
|
|
174
265
|
chunkInfos: null,
|
|
175
266
|
chunkOffset: 0,
|
|
176
267
|
chunkSize: 0,
|
|
177
|
-
|
|
268
|
+
protectionDataUpdate: false,
|
|
178
269
|
appendWindow: [undefined, undefined] };
|
|
179
270
|
}
|
|
180
271
|
var nextSegments;
|
|
@@ -194,7 +285,7 @@ export default function (transportOptions) {
|
|
|
194
285
|
}
|
|
195
286
|
chunkSize = chunkBytes.length;
|
|
196
287
|
var timingInfos = initTimescale !== undefined ?
|
|
197
|
-
extractTimingsInfos(chunkBytes, isChunked, initTimescale, segment,
|
|
288
|
+
extractTimingsInfos(chunkBytes, isChunked, initTimescale, segment, manifest.isLive) :
|
|
198
289
|
null;
|
|
199
290
|
nextSegments = timingInfos === null || timingInfos === void 0 ? void 0 : timingInfos.nextSegments;
|
|
200
291
|
chunkInfos = (_a = timingInfos === null || timingInfos === void 0 ? void 0 : timingInfos.chunkInfos) !== null && _a !== void 0 ? _a : null;
|
|
@@ -213,7 +304,7 @@ export default function (transportOptions) {
|
|
|
213
304
|
chunkInfos.time + chunkInfos.duration :
|
|
214
305
|
segment.end;
|
|
215
306
|
}
|
|
216
|
-
var lcCodec =
|
|
307
|
+
var lcCodec = codec.toLowerCase();
|
|
217
308
|
if (mimeType === "application/ttml+xml+mp4" ||
|
|
218
309
|
lcCodec === "stpp" ||
|
|
219
310
|
lcCodec === "stpp.ttml.im1t") {
|
|
@@ -255,7 +346,7 @@ export default function (transportOptions) {
|
|
|
255
346
|
break;
|
|
256
347
|
}
|
|
257
348
|
if (_sdType === undefined) {
|
|
258
|
-
var lcCodec =
|
|
349
|
+
var lcCodec = codec.toLowerCase();
|
|
259
350
|
if (lcCodec === "srt") {
|
|
260
351
|
_sdType = "srt";
|
|
261
352
|
}
|
|
@@ -265,19 +356,85 @@ export default function (transportOptions) {
|
|
|
265
356
|
}
|
|
266
357
|
_sdData = chunkString;
|
|
267
358
|
}
|
|
268
|
-
|
|
269
|
-
nextSegments.length > 0
|
|
270
|
-
|
|
359
|
+
if (chunkInfos !== null &&
|
|
360
|
+
Array.isArray(nextSegments) && nextSegments.length > 0) {
|
|
361
|
+
addNextSegments(adaptation, nextSegments, segment);
|
|
362
|
+
}
|
|
271
363
|
var chunkOffset = segmentStart !== null && segmentStart !== void 0 ? segmentStart : 0;
|
|
272
364
|
return { segmentType: "media",
|
|
273
365
|
chunkData: { type: _sdType,
|
|
274
366
|
data: _sdData,
|
|
275
367
|
start: segmentStart,
|
|
276
|
-
end: segmentEnd, language: language }, chunkSize: chunkSize, chunkInfos: chunkInfos, chunkOffset: chunkOffset,
|
|
368
|
+
end: segmentEnd, language: language }, chunkSize: chunkSize, chunkInfos: chunkInfos, chunkOffset: chunkOffset, protectionDataUpdate: false,
|
|
369
|
+
appendWindow: [undefined, undefined] };
|
|
370
|
+
},
|
|
371
|
+
};
|
|
372
|
+
var imageTrackPipeline = {
|
|
373
|
+
loadSegment: function (wantedCdn, content, loaderOptions, cancelSignal, callbacks) {
|
|
374
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
375
|
+
var segment, url, data;
|
|
376
|
+
return __generator(this, function (_a) {
|
|
377
|
+
switch (_a.label) {
|
|
378
|
+
case 0:
|
|
379
|
+
segment = content.segment;
|
|
380
|
+
url = constructSegmentUrl(wantedCdn, segment);
|
|
381
|
+
if (segment.isInit || url === null) {
|
|
382
|
+
// image do not need an init segment. Passthrough directly to the parser
|
|
383
|
+
return [2 /*return*/, { resultType: "segment-created",
|
|
384
|
+
resultData: null }];
|
|
385
|
+
}
|
|
386
|
+
return [4 /*yield*/, request({ url: url, responseType: "arraybuffer",
|
|
387
|
+
timeout: loaderOptions.timeout,
|
|
388
|
+
onProgress: callbacks.onProgress, cancelSignal: cancelSignal })];
|
|
389
|
+
case 1:
|
|
390
|
+
data = _a.sent();
|
|
391
|
+
return [2 /*return*/, { resultType: "segment-loaded",
|
|
392
|
+
resultData: data }];
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
});
|
|
396
|
+
},
|
|
397
|
+
parseSegment: function (loadedSegment, content, _initTimescale) {
|
|
398
|
+
var data = loadedSegment.data, isChunked = loadedSegment.isChunked;
|
|
399
|
+
if (content.segment.isInit) { // image init segment has no use
|
|
400
|
+
return { segmentType: "init",
|
|
401
|
+
initializationData: null,
|
|
402
|
+
initializationDataSize: 0,
|
|
403
|
+
protectionDataUpdate: false,
|
|
404
|
+
initTimescale: undefined };
|
|
405
|
+
}
|
|
406
|
+
if (isChunked) {
|
|
407
|
+
throw new Error("Image data should not be downloaded in chunks");
|
|
408
|
+
}
|
|
409
|
+
// TODO image Parsing should be more on the buffer side, no?
|
|
410
|
+
if (data === null || features.imageParser === null) {
|
|
411
|
+
return { segmentType: "media",
|
|
412
|
+
chunkData: null,
|
|
413
|
+
chunkInfos: null,
|
|
414
|
+
chunkOffset: 0,
|
|
415
|
+
chunkSize: 0,
|
|
416
|
+
protectionDataUpdate: false,
|
|
417
|
+
appendWindow: [undefined, undefined] };
|
|
418
|
+
}
|
|
419
|
+
var bifObject = features.imageParser(new Uint8Array(data));
|
|
420
|
+
var thumbsData = bifObject.thumbs;
|
|
421
|
+
return { segmentType: "media",
|
|
422
|
+
chunkData: { data: thumbsData,
|
|
423
|
+
start: 0,
|
|
424
|
+
end: Number.MAX_VALUE,
|
|
425
|
+
timescale: 1,
|
|
426
|
+
type: "bif" },
|
|
427
|
+
chunkInfos: { time: 0,
|
|
428
|
+
duration: Number.MAX_VALUE },
|
|
429
|
+
chunkSize: undefined,
|
|
430
|
+
chunkOffset: 0,
|
|
431
|
+
protectionDataUpdate: false,
|
|
432
|
+
appendWindow: [undefined, undefined] };
|
|
277
433
|
},
|
|
278
434
|
};
|
|
279
435
|
return { manifest: manifestPipeline,
|
|
280
436
|
audio: audioVideoPipeline,
|
|
281
437
|
video: audioVideoPipeline,
|
|
282
|
-
text: textTrackPipeline
|
|
438
|
+
text: textTrackPipeline,
|
|
439
|
+
image: imageTrackPipeline };
|
|
283
440
|
}
|
|
@@ -23,5 +23,5 @@ import { ISegmentContext, ISegmentLoaderCallbacks, ISegmentLoaderOptions, ISegme
|
|
|
23
23
|
declare const generateSegmentLoader: ({ checkMediaSegmentIntegrity, customSegmentLoader, }: {
|
|
24
24
|
checkMediaSegmentIntegrity?: boolean | undefined;
|
|
25
25
|
customSegmentLoader?: ICustomSegmentLoader | undefined;
|
|
26
|
-
}) => (url: string | null,
|
|
26
|
+
}) => (url: string | null, content: ISegmentContext, loaderOptions: ISegmentLoaderOptions, cancelSignal: CancellationSignal, callbacks: ISegmentLoaderCallbacks<Uint8Array | ArrayBuffer | null>) => Promise<ISegmentLoaderResultSegmentLoaded<Uint8Array | ArrayBuffer | null> | ISegmentLoaderResultSegmentCreated<Uint8Array | ArrayBuffer | null>>;
|
|
27
27
|
export default generateSegmentLoader;
|
|
@@ -29,33 +29,33 @@ import assert from "../../utils/assert";
|
|
|
29
29
|
import request from "../../utils/request";
|
|
30
30
|
import byteRange from "../utils/byte_range";
|
|
31
31
|
import checkISOBMFFIntegrity from "../utils/check_isobmff_integrity";
|
|
32
|
-
import isMP4EmbeddedTrack from "./is_mp4_embedded_track";
|
|
33
32
|
import { createAudioInitSegment, createVideoInitSegment, } from "./isobmff";
|
|
33
|
+
import { isMP4EmbeddedTrack } from "./utils";
|
|
34
34
|
/**
|
|
35
35
|
* Segment loader triggered if there was no custom-defined one in the API.
|
|
36
36
|
* @param {string} url
|
|
37
|
-
* @param {Object}
|
|
37
|
+
* @param {Object} content
|
|
38
38
|
* @param {Object} loaderOptions
|
|
39
39
|
* @param {Object} callbacks
|
|
40
40
|
* @param {Object} cancelSignal
|
|
41
41
|
* @param {boolean} checkMediaSegmentIntegrity
|
|
42
42
|
* @returns {Promise}
|
|
43
43
|
*/
|
|
44
|
-
function regularSegmentLoader(url,
|
|
44
|
+
function regularSegmentLoader(url, content, callbacks, loaderOptions, cancelSignal, checkMediaSegmentIntegrity) {
|
|
45
45
|
var headers;
|
|
46
|
-
var range =
|
|
46
|
+
var range = content.segment.range;
|
|
47
47
|
if (Array.isArray(range)) {
|
|
48
48
|
headers = { Range: byteRange(range) };
|
|
49
49
|
}
|
|
50
50
|
return request({ url: url, responseType: "arraybuffer", headers: headers, timeout: loaderOptions.timeout, cancelSignal: cancelSignal, onProgress: callbacks.onProgress })
|
|
51
51
|
.then(function (data) {
|
|
52
|
-
var isMP4 = isMP4EmbeddedTrack(
|
|
52
|
+
var isMP4 = isMP4EmbeddedTrack(content.representation);
|
|
53
53
|
if (!isMP4 || checkMediaSegmentIntegrity !== true) {
|
|
54
54
|
return { resultType: "segment-loaded",
|
|
55
55
|
resultData: data };
|
|
56
56
|
}
|
|
57
57
|
var dataU8 = new Uint8Array(data.responseData);
|
|
58
|
-
checkISOBMFFIntegrity(dataU8,
|
|
58
|
+
checkISOBMFFIntegrity(dataU8, content.segment.isInit);
|
|
59
59
|
return { resultType: "segment-loaded",
|
|
60
60
|
resultData: __assign(__assign({}, data), { responseData: dataU8 }) };
|
|
61
61
|
});
|
|
@@ -66,8 +66,8 @@ function regularSegmentLoader(url, context, callbacks, loaderOptions, cancelSign
|
|
|
66
66
|
*/
|
|
67
67
|
var generateSegmentLoader = function (_a) {
|
|
68
68
|
var checkMediaSegmentIntegrity = _a.checkMediaSegmentIntegrity, customSegmentLoader = _a.customSegmentLoader;
|
|
69
|
-
return function (url,
|
|
70
|
-
var segment =
|
|
69
|
+
return function (url, content, loaderOptions, cancelSignal, callbacks) {
|
|
70
|
+
var segment = content.segment, manifest = content.manifest, period = content.period, adaptation = content.adaptation, representation = content.representation;
|
|
71
71
|
if (segment.isInit) {
|
|
72
72
|
if (segment.privateInfos === undefined ||
|
|
73
73
|
segment.privateInfos.smoothInitSegment === undefined) {
|
|
@@ -75,19 +75,20 @@ var generateSegmentLoader = function (_a) {
|
|
|
75
75
|
}
|
|
76
76
|
var smoothInitPrivateInfos = segment.privateInfos.smoothInitSegment;
|
|
77
77
|
var responseData = void 0;
|
|
78
|
-
var codecPrivateData = smoothInitPrivateInfos.codecPrivateData, timescale = smoothInitPrivateInfos.timescale,
|
|
78
|
+
var codecPrivateData = smoothInitPrivateInfos.codecPrivateData, timescale = smoothInitPrivateInfos.timescale, _a = smoothInitPrivateInfos.protection, protection = _a === void 0 ? { keyId: undefined,
|
|
79
79
|
keySystems: undefined } : _a;
|
|
80
80
|
if (codecPrivateData === undefined) {
|
|
81
81
|
throw new Error("Smooth: no codec private data.");
|
|
82
82
|
}
|
|
83
|
-
switch (
|
|
83
|
+
switch (adaptation.type) {
|
|
84
84
|
case "video": {
|
|
85
|
-
|
|
85
|
+
var _b = representation.width, width = _b === void 0 ? 0 : _b, _c = representation.height, height = _c === void 0 ? 0 : _c;
|
|
86
|
+
responseData = createVideoInitSegment(timescale, width, height, 72, 72, 4, // vRes, hRes, nal
|
|
86
87
|
codecPrivateData, protection.keyId);
|
|
87
88
|
break;
|
|
88
89
|
}
|
|
89
90
|
case "audio": {
|
|
90
|
-
var
|
|
91
|
+
var _d = smoothInitPrivateInfos.channels, channels = _d === void 0 ? 0 : _d, _e = smoothInitPrivateInfos.bitsPerSample, bitsPerSample = _e === void 0 ? 0 : _e, _f = smoothInitPrivateInfos.packetSize, packetSize = _f === void 0 ? 0 : _f, _g = smoothInitPrivateInfos.samplingRate, samplingRate = _g === void 0 ? 0 : _g;
|
|
91
92
|
responseData = createAudioInitSegment(timescale, channels, bitsPerSample, packetSize, samplingRate, codecPrivateData, protection.keyId);
|
|
92
93
|
break;
|
|
93
94
|
}
|
|
@@ -105,8 +106,10 @@ var generateSegmentLoader = function (_a) {
|
|
|
105
106
|
resultData: null });
|
|
106
107
|
}
|
|
107
108
|
else {
|
|
109
|
+
var args_1 = { adaptation: adaptation, manifest: manifest, period: period, representation: representation, segment: segment, transport: "smooth",
|
|
110
|
+
timeout: loaderOptions.timeout, url: url };
|
|
108
111
|
if (typeof customSegmentLoader !== "function") {
|
|
109
|
-
return regularSegmentLoader(url,
|
|
112
|
+
return regularSegmentLoader(url, content, callbacks, loaderOptions, cancelSignal, checkMediaSegmentIntegrity);
|
|
110
113
|
}
|
|
111
114
|
return new Promise(function (res, rej) {
|
|
112
115
|
/** `true` when the custom segmentLoader should not be active anymore. */
|
|
@@ -121,7 +124,7 @@ var generateSegmentLoader = function (_a) {
|
|
|
121
124
|
}
|
|
122
125
|
hasFinished = true;
|
|
123
126
|
cancelSignal.deregister(abortCustomLoader);
|
|
124
|
-
var isMP4 = isMP4EmbeddedTrack(
|
|
127
|
+
var isMP4 = isMP4EmbeddedTrack(content.representation);
|
|
125
128
|
if (!isMP4 || checkMediaSegmentIntegrity !== true) {
|
|
126
129
|
res({ resultType: "segment-loaded",
|
|
127
130
|
resultData: { responseData: _args.data,
|
|
@@ -130,7 +133,7 @@ var generateSegmentLoader = function (_a) {
|
|
|
130
133
|
}
|
|
131
134
|
var dataU8 = _args.data instanceof Uint8Array ? _args.data :
|
|
132
135
|
new Uint8Array(_args.data);
|
|
133
|
-
checkISOBMFFIntegrity(dataU8,
|
|
136
|
+
checkISOBMFFIntegrity(dataU8, content.segment.isInit);
|
|
134
137
|
res({ resultType: "segment-loaded",
|
|
135
138
|
resultData: { responseData: dataU8,
|
|
136
139
|
size: _args.size,
|
|
@@ -141,7 +144,7 @@ var generateSegmentLoader = function (_a) {
|
|
|
141
144
|
* @param {*} err - The corresponding error encountered
|
|
142
145
|
*/
|
|
143
146
|
var reject = function (err) {
|
|
144
|
-
var _a, _b;
|
|
147
|
+
var _a, _b, _c;
|
|
145
148
|
if (hasFinished || cancelSignal.isCancelled()) {
|
|
146
149
|
return;
|
|
147
150
|
}
|
|
@@ -151,7 +154,7 @@ var generateSegmentLoader = function (_a) {
|
|
|
151
154
|
var castedErr = err;
|
|
152
155
|
var message = (_a = castedErr === null || castedErr === void 0 ? void 0 : castedErr.message) !== null && _a !== void 0 ? _a : "Unknown error when fetching a Smooth segment through a " +
|
|
153
156
|
"custom segmentLoader.";
|
|
154
|
-
var emittedErr = new CustomLoaderError(message, (_b = castedErr === null || castedErr === void 0 ? void 0 : castedErr.canRetry) !== null && _b !== void 0 ? _b : false, castedErr === null || castedErr === void 0 ? void 0 : castedErr.xhr);
|
|
157
|
+
var emittedErr = new CustomLoaderError(message, (_b = castedErr === null || castedErr === void 0 ? void 0 : castedErr.canRetry) !== null && _b !== void 0 ? _b : false, (_c = castedErr === null || castedErr === void 0 ? void 0 : castedErr.isOfflineError) !== null && _c !== void 0 ? _c : false, castedErr === null || castedErr === void 0 ? void 0 : castedErr.xhr);
|
|
155
158
|
rej(emittedErr);
|
|
156
159
|
};
|
|
157
160
|
var progress = function (_args) {
|
|
@@ -168,20 +171,11 @@ var generateSegmentLoader = function (_a) {
|
|
|
168
171
|
}
|
|
169
172
|
hasFinished = true;
|
|
170
173
|
cancelSignal.deregister(abortCustomLoader);
|
|
171
|
-
regularSegmentLoader(url,
|
|
174
|
+
regularSegmentLoader(url, content, callbacks, loaderOptions, cancelSignal, checkMediaSegmentIntegrity)
|
|
172
175
|
.then(res, rej);
|
|
173
176
|
};
|
|
174
177
|
var customCallbacks = { reject: reject, resolve: resolve, fallback: fallback, progress: progress };
|
|
175
|
-
var
|
|
176
|
-
if (context.segment.range !== undefined) {
|
|
177
|
-
byteRanges = [context.segment.range];
|
|
178
|
-
if (context.segment.indexRange !== undefined) {
|
|
179
|
-
byteRanges.push(context.segment.indexRange);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
var args = { isInit: context.segment.isInit,
|
|
183
|
-
timeout: loaderOptions.timeout, byteRanges: byteRanges, type: context.type, url: url };
|
|
184
|
-
var abort = customSegmentLoader(args, customCallbacks);
|
|
178
|
+
var abort = customSegmentLoader(args_1, customCallbacks);
|
|
185
179
|
cancelSignal.register(abortCustomLoader);
|
|
186
180
|
/**
|
|
187
181
|
* The logic to run when the custom loader is cancelled while pending.
|
|
@@ -15,6 +15,31 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { ISegment, Representation } from "../../manifest";
|
|
17
17
|
import { ICdnMetadata } from "../../parsers/manifest";
|
|
18
|
+
/**
|
|
19
|
+
* TODO Remove this logic completely from the player
|
|
20
|
+
* @param {Document} doc
|
|
21
|
+
* @returns {string|null}
|
|
22
|
+
*/
|
|
23
|
+
declare function extractISML(doc: Document): string | null;
|
|
24
|
+
/**
|
|
25
|
+
* Returns string corresponding to the token contained in the url's querystring.
|
|
26
|
+
* Empty string if no token is found.
|
|
27
|
+
* @param {string} url
|
|
28
|
+
* @returns {string}
|
|
29
|
+
*/
|
|
30
|
+
declare function extractToken(url: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* Replace/Remove token from the url's querystring
|
|
33
|
+
* @param {string} url
|
|
34
|
+
* @param {string} [token]
|
|
35
|
+
* @returns {string}
|
|
36
|
+
*/
|
|
37
|
+
declare function replaceToken(url: string, token?: string): string;
|
|
38
|
+
/**
|
|
39
|
+
* @param {string} url
|
|
40
|
+
* @returns {string}
|
|
41
|
+
*/
|
|
42
|
+
declare function resolveManifest(url: string): string;
|
|
18
43
|
/**
|
|
19
44
|
* Returns `true` if the given Representation refers to segments in an MP4
|
|
20
45
|
* container
|
|
@@ -23,4 +48,4 @@ import { ICdnMetadata } from "../../parsers/manifest";
|
|
|
23
48
|
*/
|
|
24
49
|
declare function isMP4EmbeddedTrack(representation: Representation): boolean;
|
|
25
50
|
declare function constructSegmentUrl(wantedCdn: ICdnMetadata | null, segment: ISegment): string | null;
|
|
26
|
-
export { constructSegmentUrl, isMP4EmbeddedTrack, };
|
|
51
|
+
export { constructSegmentUrl, extractISML, extractToken, isMP4EmbeddedTrack, replaceToken, resolveManifest, };
|
|
@@ -13,7 +13,61 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
+
import isNonEmptyString from "../../utils/is_non_empty_string";
|
|
16
17
|
import resolveURL from "../../utils/resolve_url";
|
|
18
|
+
import warnOnce from "../../utils/warn_once";
|
|
19
|
+
var ISM_REG = /(\.isml?)(\?token=\S+)?$/;
|
|
20
|
+
var TOKEN_REG = /\?token=(\S+)/;
|
|
21
|
+
/**
|
|
22
|
+
* TODO Remove this logic completely from the player
|
|
23
|
+
* @param {Document} doc
|
|
24
|
+
* @returns {string|null}
|
|
25
|
+
*/
|
|
26
|
+
function extractISML(doc) {
|
|
27
|
+
return doc.getElementsByTagName("media")[0].getAttribute("src");
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Returns string corresponding to the token contained in the url's querystring.
|
|
31
|
+
* Empty string if no token is found.
|
|
32
|
+
* @param {string} url
|
|
33
|
+
* @returns {string}
|
|
34
|
+
*/
|
|
35
|
+
function extractToken(url) {
|
|
36
|
+
var tokenMatch = TOKEN_REG.exec(url);
|
|
37
|
+
if (tokenMatch !== null) {
|
|
38
|
+
var match = tokenMatch[1];
|
|
39
|
+
if (match !== undefined) {
|
|
40
|
+
return match;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return "";
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Replace/Remove token from the url's querystring
|
|
47
|
+
* @param {string} url
|
|
48
|
+
* @param {string} [token]
|
|
49
|
+
* @returns {string}
|
|
50
|
+
*/
|
|
51
|
+
function replaceToken(url, token) {
|
|
52
|
+
if (isNonEmptyString(token)) {
|
|
53
|
+
return url.replace(TOKEN_REG, "?token=" + token);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
return url.replace(TOKEN_REG, "");
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* @param {string} url
|
|
61
|
+
* @returns {string}
|
|
62
|
+
*/
|
|
63
|
+
function resolveManifest(url) {
|
|
64
|
+
if (ISM_REG.test(url)) {
|
|
65
|
+
warnOnce("Giving a isml URL to loadVideo is deprecated." +
|
|
66
|
+
" Please give the Manifest URL directly");
|
|
67
|
+
return url.replace(ISM_REG, "$1/manifest$2");
|
|
68
|
+
}
|
|
69
|
+
return url;
|
|
70
|
+
}
|
|
17
71
|
/**
|
|
18
72
|
* Returns `true` if the given Representation refers to segments in an MP4
|
|
19
73
|
* container
|
|
@@ -29,4 +83,4 @@ function constructSegmentUrl(wantedCdn, segment) {
|
|
|
29
83
|
segment.url === null ? wantedCdn.baseUrl :
|
|
30
84
|
resolveURL(wantedCdn.baseUrl, segment.url);
|
|
31
85
|
}
|
|
32
|
-
export { constructSegmentUrl, isMP4EmbeddedTrack, };
|
|
86
|
+
export { constructSegmentUrl, extractISML, extractToken, isMP4EmbeddedTrack, replaceToken, resolveManifest, };
|