shaka-player 3.3.2 → 4.0.0
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/.csslintrc +11 -1
- package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
- package/.github/pull_request_template.md +6 -34
- package/.github/workflows/build-and-test.yaml +129 -0
- package/.github/workflows/custom-actions/prep-for-appspot/action.yaml +56 -0
- package/.github/workflows/custom-actions/set-commit-status/action.yaml +41 -0
- package/.github/workflows/demo-version-index.yaml +37 -0
- package/.github/workflows/nightly-demo.yaml +42 -0
- package/.github/workflows/release-please.yaml +168 -0
- package/.github/workflows/safari-homedir-launcher.sh +18 -0
- package/.github/workflows/selenium-lab-tests.yaml +92 -0
- package/.github/workflows/sync-labels.yaml +33 -0
- package/.github/workflows/update-issues.yaml +29 -0
- package/.github/workflows/validate-pr-title.yaml +35 -0
- package/AUTHORS +3 -0
- package/CHANGELOG.md +1866 -1675
- package/CONTRIBUTING.md +2 -2
- package/CONTRIBUTORS +3 -0
- package/README.md +16 -13
- package/app-engine/README.md +9 -0
- package/app-engine/demo-version-index/README.md +14 -0
- package/app-engine/demo-version-index/app.yaml +28 -0
- package/app-engine/demo-version-index/generate.py +164 -0
- package/app-engine/demo-version-index/main.py +11 -0
- package/app-engine/demo-version-index/requirements.txt +5 -0
- package/app-engine/demo-version-index/templates/index.html +114 -0
- package/app-engine/shaka-player-demo/README.md +18 -0
- package/app-engine/shaka-player-demo/app.yaml +61 -0
- package/app-engine/shaka-player-demo/main.py +95 -0
- package/app-engine/shaka-player-demo/posters/10yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/10yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/1yo.jpg +0 -0
- package/app-engine/shaka-player-demo/posters/2yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/2yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/3yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/3yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/4yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/4yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/5yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/5yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/6yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/6yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/7yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/7yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/8yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/8yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/9yo.png +0 -0
- package/app-engine/shaka-player-demo/posters/9yo.xcf +0 -0
- package/app-engine/shaka-player-demo/posters/audioOnly.gif +0 -0
- package/app-engine/shaka-player-demo/posters/audioRickRoll.gif +0 -0
- package/app-engine/shaka-player-demo/posters/colorbars.gif +0 -0
- package/app-engine/shaka-player-demo/posters/fireworks.jpg +0 -0
- package/app-engine/shaka-player-demo/posters/party-hat.png +0 -0
- package/app-engine/shaka-player-demo/posters/sources.txt +46 -0
- package/app-engine/shaka-player-demo/posters/standard.png +0 -0
- package/app-engine/shaka-player-demo/posters/trek.jpg +0 -0
- package/app-engine/shaka-player-demo/posters/valentines.png +0 -0
- package/app-engine/shaka-player-demo/posters/zombie.jpg +0 -0
- package/app-engine/shaka-player-demo/posters.py +110 -0
- package/app-engine/shaka-player-demo/requirements.txt +5 -0
- package/app-engine/shaka-player-demo/time.txt +1 -0
- package/build/README.md +3 -3
- package/build/checkversion.py +1 -1
- package/build/compiler.py +1 -1
- package/build/conformance.textproto +13 -0
- package/build/docker/Dockerfile +20 -0
- package/build/docker/docker-compose.yml +10 -0
- package/build/gendeps.py +18 -15
- package/build/shaka-lab.yaml +161 -0
- package/build/shakaBuildHelpers.py +4 -29
- package/build/test.py +94 -29
- package/build/types/core +0 -1
- package/build/types/polyfill +1 -3
- package/build/wrapper.template.js +2 -2
- package/demo/TengwarTelcontar.woff2 +0 -0
- package/demo/asset_card.js +1 -2
- package/demo/cast_receiver/index.html +1 -1
- package/demo/cast_receiver/receiver_app.css +14 -14
- package/demo/common/asset.js +17 -1
- package/demo/common/assets.js +31 -0
- package/demo/common/message_ids.js +6 -3
- package/demo/config.js +10 -12
- package/demo/custom.js +39 -1
- package/demo/customWarning.txt +2 -2
- package/demo/demo.less +29 -18
- package/demo/demo_uncompiled.js +1 -13
- package/demo/demo_utils.js +0 -1
- package/demo/index.html +1 -1
- package/demo/locales/en.json +6 -3
- package/demo/locales/source.json +22 -10
- package/demo/main.js +12 -9
- package/demo/search.js +2 -1
- package/dist/controls.css +3 -3
- package/dist/controls.css.map +1 -1
- package/dist/demo.compiled.debug.js +236 -232
- package/dist/demo.compiled.debug.map +4 -4
- package/dist/demo.compiled.js +236 -232
- package/dist/demo.compiled.map +4 -4
- package/dist/demo.css +1 -1
- package/dist/demo.css.map +1 -1
- package/dist/deps.js +229 -226
- package/dist/locales.js +34 -32
- package/dist/receiver.compiled.debug.js +75 -73
- package/dist/receiver.compiled.debug.map +4 -4
- package/dist/receiver.compiled.js +75 -73
- package/dist/receiver.compiled.map +4 -4
- package/dist/shaka-player.compiled.d.ts +321 -314
- package/dist/shaka-player.compiled.debug.d.ts +321 -314
- package/dist/shaka-player.compiled.debug.externs.js +140 -129
- package/dist/shaka-player.compiled.debug.js +527 -592
- package/dist/shaka-player.compiled.debug.map +4 -4
- package/dist/shaka-player.compiled.externs.js +140 -129
- package/dist/shaka-player.compiled.js +836 -860
- package/dist/shaka-player.compiled.map +4 -4
- package/dist/shaka-player.ui.d.ts +367 -358
- package/dist/shaka-player.ui.debug.d.ts +367 -358
- package/dist/shaka-player.ui.debug.externs.js +148 -129
- package/dist/shaka-player.ui.debug.js +586 -649
- package/dist/shaka-player.ui.debug.map +4 -4
- package/dist/shaka-player.ui.externs.js +148 -129
- package/dist/shaka-player.ui.js +1008 -1028
- package/dist/shaka-player.ui.map +4 -4
- package/docs/design/REDESIGN.md +33 -33
- package/docs/design/bg-fetch.md +2 -2
- package/docs/design/codec_preferences.md +1 -1
- package/docs/design/dash-audio-channels.md +3 -3
- package/docs/design/dash-manifests.md +1 -1
- package/docs/design/gap-jumping.md +3 -3
- package/docs/design/preload.md +2 -2
- package/docs/tutorials/config.md +0 -2
- package/docs/tutorials/drm-config.md +5 -0
- package/docs/tutorials/fairplay.md +7 -22
- package/docs/tutorials/faq.md +8 -19
- package/docs/tutorials/index.json +3 -8
- package/docs/tutorials/plugins.md +4 -6
- package/docs/tutorials/selenium-grid-config.md +122 -0
- package/docs/tutorials/upgrade.md +83 -11
- package/docs/tutorials/welcome.md +10 -2
- package/externs/cmcd.js +1 -1
- package/externs/polyfill.js +15 -0
- package/externs/shaka/manifest.js +5 -1
- package/externs/shaka/net.js +12 -0
- package/externs/shaka/offline.js +5 -1
- package/externs/shaka/player.js +39 -32
- package/externs/shaka/text.js +12 -12
- package/externs/sourcebuffer.js +15 -0
- package/karma.conf.js +137 -30
- package/lib/abr/simple_abr_manager.js +12 -6
- package/lib/ads/client_side_ad.js +13 -2
- package/lib/ads/client_side_ad_manager.js +22 -4
- package/lib/cast/cast_proxy.js +3 -4
- package/lib/cast/cast_utils.js +0 -1
- package/lib/cea/cea608_data_channel.js +2 -2
- package/lib/cea/cea708_service.js +5 -4
- package/lib/cea/mp4_cea_parser.js +11 -5
- package/lib/cea/sei_processor.js +6 -3
- package/lib/dash/content_protection.js +85 -5
- package/lib/dash/dash_parser.js +10 -12
- package/lib/dash/mpd_utils.js +4 -5
- package/lib/dash/segment_list.js +1 -2
- package/lib/dash/segment_template.js +3 -3
- package/lib/hls/hls_parser.js +386 -749
- package/lib/hls/manifest_text_parser.js +5 -6
- package/lib/media/adaptation_set.js +1 -2
- package/lib/media/content_workarounds.js +2 -2
- package/lib/media/drm_engine.js +105 -55
- package/lib/media/gap_jumping_controller.js +10 -45
- package/lib/media/media_source_engine.js +90 -17
- package/lib/media/mp4_segment_index_parser.js +1 -4
- package/lib/media/playhead.js +4 -7
- package/lib/media/presentation_timeline.js +19 -10
- package/lib/media/segment_index.js +13 -46
- package/lib/media/segment_reference.js +47 -1
- package/lib/media/streaming_engine.js +35 -17
- package/lib/media/time_ranges_utils.js +5 -12
- package/lib/media/video_wrapper.js +1 -1
- package/lib/net/networking_engine.js +4 -1
- package/lib/offline/indexeddb/v1_storage_cell.js +1 -0
- package/lib/offline/indexeddb/v2_storage_cell.js +1 -0
- package/lib/offline/manifest_converter.js +1 -0
- package/lib/offline/storage.js +104 -136
- package/lib/player.js +50 -216
- package/lib/polyfill/all.js +2 -3
- package/lib/polyfill/encryption_scheme.js +1 -1
- package/lib/polyfill/media_capabilities.js +15 -9
- package/lib/polyfill/mediasource.js +0 -28
- package/lib/polyfill/patchedmediakeys_nop.js +2 -0
- package/lib/polyfill/patchedmediakeys_webkit.js +2 -0
- package/lib/polyfill/symbol.js +46 -0
- package/lib/text/cue.js +1 -7
- package/lib/text/lrc_text_parser.js +8 -0
- package/lib/text/mp4_ttml_parser.js +8 -0
- package/lib/text/mp4_vtt_parser.js +8 -0
- package/lib/text/sbv_text_parser.js +8 -0
- package/lib/text/simple_text_displayer.js +3 -8
- package/lib/text/srt_text_parser.js +8 -0
- package/lib/text/ssa_text_parser.js +8 -0
- package/lib/text/text_engine.js +19 -3
- package/lib/text/ttml_text_parser.js +16 -5
- package/lib/text/ui_text_displayer.js +2 -8
- package/lib/text/vtt_text_parser.js +24 -2
- package/lib/text/web_vtt_generator.js +1 -7
- package/lib/util/buffer_utils.js +1 -3
- package/lib/util/ebml_parser.js +3 -3
- package/lib/util/error.js +10 -14
- package/lib/util/fairplay_utils.js +109 -0
- package/lib/util/functional.js +0 -42
- package/lib/util/iterables.js +0 -46
- package/lib/util/mime_utils.js +2 -0
- package/lib/util/mp4_box_parsers.js +1 -4
- package/lib/util/mp4_parser.js +5 -7
- package/lib/util/periods.js +10 -11
- package/lib/util/platform.js +48 -3
- package/lib/util/player_configuration.js +12 -6
- package/lib/util/pssh.js +24 -8
- package/lib/util/stream_utils.js +96 -25
- package/lib/util/string_utils.js +3 -5
- package/lib/util/uint8array_utils.js +3 -21
- package/lib/util/xml_utils.js +16 -8
- package/package.json +61 -36
- package/roadmap.md +27 -27
- package/shaka-player.uncompiled.js +1 -3
- package/test/abr/simple_abr_manager_unit.js +3 -8
- package/test/ads/ad_manager_unit.js +0 -6
- package/test/cast/cast_proxy_unit.js +0 -8
- package/test/cast/cast_receiver_integration.js +1 -18
- package/test/cast/cast_receiver_unit.js +1 -9
- package/test/cast/cast_sender_unit.js +0 -6
- package/test/cast/cast_utils_unit.js +1 -13
- package/test/cea/cea608_memory_unit.js +0 -5
- package/test/cea/cea708_service_unit.js +0 -7
- package/test/cea/cea708_window_unit.js +0 -5
- package/test/cea/cea_decoder_unit.js +0 -6
- package/test/cea/dtvcc_packet_builder_unit.js +0 -3
- package/test/cea/dtvcc_packet_unit.js +0 -5
- package/test/cea/mp4_cea_parser_unit.js +0 -4
- package/test/dash/dash_parser_content_protection_unit.js +45 -10
- package/test/dash/dash_parser_live_unit.js +2 -15
- package/test/dash/dash_parser_manifest_unit.js +2 -40
- package/test/dash/dash_parser_segment_base_unit.js +1 -8
- package/test/dash/dash_parser_segment_list_unit.js +1 -7
- package/test/dash/dash_parser_segment_template_unit.js +3 -13
- package/test/dash/mpd_utils_unit.js +3 -11
- package/test/demo/demo_unit.js +2 -6
- package/test/deprecate/enforcer_unit.js +0 -4
- package/test/deprecate/version_unit.js +0 -2
- package/test/hls/hls_live_unit.js +101 -234
- package/test/hls/hls_parser_unit.js +517 -447
- package/test/hls/manifest_text_parser_unit.js +0 -10
- package/test/media/adaptation_set_criteria_unit.js +3 -7
- package/test/media/adaptation_set_unit.js +0 -2
- package/test/media/buffering_observer_unit.js +1 -4
- package/test/media/closed_caption_parser_unit.js +0 -3
- package/test/media/drm_engine_integration.js +2 -15
- package/test/media/drm_engine_unit.js +90 -144
- package/test/media/manifest_parser_unit.js +0 -4
- package/test/media/media_source_engine_integration.js +26 -10
- package/test/media/media_source_engine_unit.js +8 -20
- package/test/media/mp4_segment_index_parser_unit.js +0 -4
- package/test/media/play_rate_controller_unit.js +0 -4
- package/test/media/playhead_unit.js +35 -207
- package/test/media/presentation_timeline_unit.js +4 -7
- package/test/media/quality_observer_unit.js +0 -4
- package/test/media/region_observer_unit.js +1 -6
- package/test/media/region_timeline_unit.js +0 -3
- package/test/media/segment_index_unit.js +15 -31
- package/test/media/segment_reference_unit.js +0 -3
- package/test/media/stall_detector_unit.js +0 -5
- package/test/media/streaming_engine_integration.js +13 -75
- package/test/media/streaming_engine_unit.js +14 -37
- package/test/media/time_ranges_utils_unit.js +0 -7
- package/test/media/transmuxer_integration.js +0 -6
- package/test/media/webm_segment_index_parser_unit.js +0 -4
- package/test/net/data_uri_plugin_unit.js +0 -7
- package/test/net/http_plugin_unit.js +0 -9
- package/test/net/networking_engine_unit.js +0 -11
- package/test/offline/download_progress_estimator_unit.js +0 -2
- package/test/offline/indexeddb_storage_unit.js +0 -6
- package/test/offline/manifest_convert_unit.js +34 -12
- package/test/offline/offline_integration.js +1 -10
- package/test/offline/offline_manifest_parser_unit.js +1 -6
- package/test/offline/offline_scheme_unit.js +0 -8
- package/test/offline/offline_uri_unit.js +0 -2
- package/test/offline/storage_compatibility_unit.js +1 -14
- package/test/offline/storage_integration.js +6 -31
- package/test/player_external.js +1 -15
- package/test/player_integration.js +38 -28
- package/test/player_load_graph_integration.js +1 -6
- package/test/player_src_equals_external.js +3 -9
- package/test/player_src_equals_integration.js +0 -7
- package/test/player_unit.js +78 -37
- package/test/routing/walker_unit.js +0 -8
- package/test/test/assets/large_file.mpd +1 -1
- package/test/test/boot.js +75 -22
- package/test/test/externs/jasmine.js +2 -2
- package/test/test/externs/karma.js +4 -0
- package/test/test/namespace.js +10 -0
- package/test/test/util/canned_idb.js +0 -8
- package/test/test/util/cea_utils.js +0 -6
- package/test/test/util/dash_parser_util.js +0 -13
- package/test/test/util/fake_ad.js +0 -3
- package/test/test/util/fake_ad_manager.js +0 -9
- package/test/test/util/fake_demo_main.js +0 -5
- package/test/test/util/fake_drm_engine.js +0 -6
- package/test/test/util/fake_media_source_engine.js +11 -11
- package/test/test/util/fake_networking_engine.js +0 -5
- package/test/test/util/fake_text_displayer.js +0 -5
- package/test/test/util/indexeddb_utils.js +1 -10
- package/test/test/util/jasmine_fetch.js +0 -1
- package/test/test/util/loader.js +0 -18
- package/test/test/util/manifest_generator.js +12 -15
- package/test/test/util/manifest_parser_util.js +4 -7
- package/test/test/util/offline_utils.js +1 -5
- package/test/test/util/simple_fakes.js +9 -26
- package/test/test/util/stream_generator.js +0 -14
- package/test/test/util/streaming_engine_util.js +1 -15
- package/test/test/util/test_scheme.js +25 -20
- package/test/test/util/ttml_utils.js +0 -2
- package/test/test/util/ui_utils.js +0 -9
- package/test/test/util/util.js +9 -23
- package/test/test/util/waiter.js +84 -43
- package/test/text/cue_integration.js +2 -6
- package/test/text/lrc_text_parser_unit.js +6 -11
- package/test/text/mp4_ttml_parser_unit.js +6 -10
- package/test/text/mp4_vtt_parser_unit.js +7 -12
- package/test/text/sbv_text_parser_unit.js +5 -10
- package/test/text/simple_text_displayer_unit.js +1 -8
- package/test/text/srt_text_parser_unit.js +5 -10
- package/test/text/ssa_text_parser_unit.js +17 -34
- package/test/text/text_engine_unit.js +47 -12
- package/test/text/text_track_integration.js +0 -2
- package/test/text/ttml_text_parser_unit.js +79 -88
- package/test/text/ui_text_displayer_unit.js +44 -41
- package/test/text/vtt_text_parser_unit.js +55 -66
- package/test/text/web_vtt_generator_unit.js +0 -3
- package/test/ui/ad_ui_unit.js +0 -11
- package/test/ui/localization_unit.js +0 -3
- package/test/ui/text_displayer_layout_unit.js +1 -12
- package/test/ui/ui_customization_unit.js +0 -6
- package/test/ui/ui_integration.js +0 -32
- package/test/ui/ui_unit.js +28 -17
- package/test/util/abortable_operation_unit.js +4 -9
- package/test/util/array_utils_unit.js +0 -2
- package/test/util/buffer_utils_unit.js +0 -2
- package/test/util/cmcd_manager_unit.js +3 -3
- package/test/util/data_view_reader_unit.js +0 -4
- package/test/util/ebml_parser_unit.js +0 -4
- package/test/util/event_manager_unit.js +0 -3
- package/test/util/fake_event_target_unit.js +0 -5
- package/test/util/iterables_unit.js +0 -64
- package/test/util/language_utils_unit.js +0 -3
- package/test/util/manifest_parser_utils_unit.js +0 -2
- package/test/util/mp4_box_parsers_unit.js +0 -5
- package/test/util/mp4_parser_unit.js +0 -4
- package/test/util/multi_map_unit.js +0 -3
- package/test/util/object_utils_unit.js +0 -2
- package/test/util/periods_unit.js +14 -7
- package/test/util/pssh_unit.js +0 -5
- package/test/util/state_history_unit.js +0 -2
- package/test/util/stream_utils_unit.js +26 -15
- package/test/util/string_utils_unit.js +0 -6
- package/test/util/text_parser_unit.js +0 -2
- package/test/util/xml_utils_unit.js +0 -4
- package/ui/controls.js +65 -40
- package/ui/fullscreen_button.js +26 -6
- package/ui/less/ad_controls.less +6 -6
- package/ui/less/buttons.less +6 -6
- package/ui/less/containers.less +10 -12
- package/ui/less/overflow_menu.less +4 -4
- package/ui/less/range_elements.less +7 -2
- package/ui/less/tooltip.less +4 -4
- package/ui/locales/en.json +1 -0
- package/ui/locales/sjn-translations.yaml +257 -0
- package/ui/locales/sjn.json +42 -0
- package/ui/locales/source.json +5 -0
- package/ui/resolution_selection.js +31 -33
- package/ui/seek_bar.js +2 -1
- package/ui/ui.js +0 -17
- package/.github/workflows/build_and_test.yaml +0 -73
- package/.github/workflows/release.yaml +0 -53
- package/docs/tutorials/upgrade-v2-5.md +0 -441
- package/docs/tutorials/upgrade-v3.md +0 -38
- package/externs/svgelement.js +0 -18
- package/externs/webcrypto.js +0 -18
- package/lib/polyfill/mathround.js +0 -49
- package/lib/polyfill/patchedmediakeys_apple.js +0 -744
- package/lib/polyfill/patchedmediakeys_ms.js +0 -698
- package/lib/util/mutex.js +0 -52
- package/test/util/functional_unit.js +0 -82
|
@@ -4,18 +4,6 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
goog.require('goog.asserts');
|
|
8
|
-
goog.require('shaka.hls.HlsParser');
|
|
9
|
-
goog.require('shaka.net.NetworkingEngine');
|
|
10
|
-
goog.require('shaka.test.FakeNetworkingEngine');
|
|
11
|
-
goog.require('shaka.test.ManifestParser');
|
|
12
|
-
goog.require('shaka.test.Util');
|
|
13
|
-
goog.require('shaka.util.Functional');
|
|
14
|
-
goog.require('shaka.util.Iterables');
|
|
15
|
-
goog.require('shaka.util.PlayerConfiguration');
|
|
16
|
-
goog.require('shaka.util.Uint8ArrayUtils');
|
|
17
|
-
goog.requireType('shaka.util.PublicPromise');
|
|
18
|
-
|
|
19
7
|
describe('HlsParser live', () => {
|
|
20
8
|
const ManifestParser = shaka.test.ManifestParser;
|
|
21
9
|
|
|
@@ -40,14 +28,6 @@ describe('HlsParser live', () => {
|
|
|
40
28
|
let segmentData;
|
|
41
29
|
/** @type {!Uint8Array} */
|
|
42
30
|
let selfInitializingSegmentData;
|
|
43
|
-
/** @type {!Uint8Array} */
|
|
44
|
-
let tsSegmentData;
|
|
45
|
-
/** @type {!Uint8Array} */
|
|
46
|
-
let pastRolloverSegmentData;
|
|
47
|
-
/** @type {number} */
|
|
48
|
-
let rolloverOffset;
|
|
49
|
-
/** @type {number} */
|
|
50
|
-
let segmentDataStartTime;
|
|
51
31
|
|
|
52
32
|
beforeEach(() => {
|
|
53
33
|
// TODO: use StreamGenerator?
|
|
@@ -78,36 +58,6 @@ describe('HlsParser live', () => {
|
|
|
78
58
|
0x00, 0x00, 0x00, 0x00, // baseMediaDecodeTime first 4 bytes
|
|
79
59
|
0x00, 0x00, 0x07, 0xd0, // baseMediaDecodeTime last 4 bytes (2000)
|
|
80
60
|
]);
|
|
81
|
-
tsSegmentData = new Uint8Array([
|
|
82
|
-
0x47, // TS sync byte (fixed value)
|
|
83
|
-
0x41, 0x01, // not corrupt, payload follows, packet ID 257
|
|
84
|
-
0x10, // not scrambled, no adaptation field, payload only, seq #0
|
|
85
|
-
0x00, 0x00, 0x01, // PES start code (fixed value)
|
|
86
|
-
0xe0, // stream ID (video stream 0)
|
|
87
|
-
0x00, 0x00, // PES packet length (doesn't matter)
|
|
88
|
-
0x80, // marker bits (fixed value), not scrambled, not priority
|
|
89
|
-
0x80, // PTS only, no DTS, other flags 0 (don't matter)
|
|
90
|
-
0x05, // remaining PES header length == 5 (one timestamp)
|
|
91
|
-
0x21, 0x00, 0x0b, 0x7e, 0x41, // PTS = 180000, encoded into 5 bytes
|
|
92
|
-
]);
|
|
93
|
-
// 180000 divided by TS timescale (90000) = segment starts at 2s.
|
|
94
|
-
segmentDataStartTime = 2;
|
|
95
|
-
|
|
96
|
-
pastRolloverSegmentData = new Uint8Array([
|
|
97
|
-
0x00, 0x00, 0x00, 0x24, // size (36)
|
|
98
|
-
0x6D, 0x6F, 0x6F, 0x66, // type (moof)
|
|
99
|
-
0x00, 0x00, 0x00, 0x1C, // traf size (28)
|
|
100
|
-
0x74, 0x72, 0x61, 0x66, // type (traf)
|
|
101
|
-
0x00, 0x00, 0x00, 0x14, // tfdt size (20)
|
|
102
|
-
0x74, 0x66, 0x64, 0x74, // type (tfdt)
|
|
103
|
-
0x01, 0x00, 0x00, 0x00, // version and flags
|
|
104
|
-
0x00, 0x00, 0x00, 0x00, // baseMediaDecodeTime first 4 bytes
|
|
105
|
-
0x0b, 0x60, 0xbc, 0x28, // baseMediaDecodeTime last 4 bytes (190889000)
|
|
106
|
-
]);
|
|
107
|
-
|
|
108
|
-
// The timestamp above would roll over twice, so this rollover offset should
|
|
109
|
-
// be applied.
|
|
110
|
-
rolloverOffset = (0x200000000 * 2) / 90000;
|
|
111
61
|
|
|
112
62
|
selfInitializingSegmentData =
|
|
113
63
|
shaka.util.Uint8ArrayUtils.concat(initSegmentData, segmentData);
|
|
@@ -233,8 +183,10 @@ describe('HlsParser live', () => {
|
|
|
233
183
|
|
|
234
184
|
describe('update', () => {
|
|
235
185
|
it('adds new segments when they appear', async () => {
|
|
236
|
-
const ref1 =
|
|
237
|
-
|
|
186
|
+
const ref1 = makeReference(
|
|
187
|
+
'test:/main.mp4', 0, 2, /* syncTime= */ null);
|
|
188
|
+
const ref2 = makeReference(
|
|
189
|
+
'test:/main2.mp4', 2, 4, /* syncTime= */ null);
|
|
238
190
|
|
|
239
191
|
await testUpdate(
|
|
240
192
|
master, media, [ref1], mediaWithAdditionalSegment, [ref1, ref2]);
|
|
@@ -248,8 +200,10 @@ describe('HlsParser live', () => {
|
|
|
248
200
|
].join('');
|
|
249
201
|
|
|
250
202
|
const masterWithTwoVariants = master + secondVariant;
|
|
251
|
-
const ref1 =
|
|
252
|
-
|
|
203
|
+
const ref1 = makeReference(
|
|
204
|
+
'test:/main.mp4', 0, 2, /* syncTime= */ null);
|
|
205
|
+
const ref2 = makeReference(
|
|
206
|
+
'test:/main2.mp4', 2, 4, /* syncTime= */ null);
|
|
253
207
|
|
|
254
208
|
await testUpdate(
|
|
255
209
|
masterWithTwoVariants, media, [ref1], mediaWithAdditionalSegment,
|
|
@@ -269,8 +223,10 @@ describe('HlsParser live', () => {
|
|
|
269
223
|
].join('');
|
|
270
224
|
|
|
271
225
|
const masterWithAudio = masterlist + audio;
|
|
272
|
-
const ref1 =
|
|
273
|
-
|
|
226
|
+
const ref1 = makeReference(
|
|
227
|
+
'test:/main.mp4', 0, 2, /* syncTime= */ null);
|
|
228
|
+
const ref2 = makeReference(
|
|
229
|
+
'test:/main2.mp4', 2, 4, /* syncTime= */ null);
|
|
274
230
|
|
|
275
231
|
await testUpdate(
|
|
276
232
|
masterWithAudio, media, [ref1], mediaWithAdditionalSegment,
|
|
@@ -290,9 +246,12 @@ describe('HlsParser live', () => {
|
|
|
290
246
|
|
|
291
247
|
const updatedMedia1 = media + newSegment1;
|
|
292
248
|
const updatedMedia2 = updatedMedia1 + newSegment2;
|
|
293
|
-
const ref1 =
|
|
294
|
-
|
|
295
|
-
const
|
|
249
|
+
const ref1 = makeReference(
|
|
250
|
+
'test:/main.mp4', 0, 2, /* syncTime= */ null);
|
|
251
|
+
const ref2 = makeReference(
|
|
252
|
+
'test:/main2.mp4', 2, 4, /* syncTime= */ null);
|
|
253
|
+
const ref3 = makeReference(
|
|
254
|
+
'test:/main3.mp4', 4, 6, /* syncTime= */ null);
|
|
296
255
|
|
|
297
256
|
fakeNetEngine
|
|
298
257
|
.setResponseText('test:/master', master)
|
|
@@ -398,19 +357,6 @@ describe('HlsParser live', () => {
|
|
|
398
357
|
'main.mp4\n',
|
|
399
358
|
].join('');
|
|
400
359
|
|
|
401
|
-
const mediaWithByteRange = [
|
|
402
|
-
'#EXTM3U\n',
|
|
403
|
-
'#EXT-X-TARGETDURATION:5\n',
|
|
404
|
-
'#EXT-X-MAP:URI="init.mp4",BYTERANGE="616@0"\n',
|
|
405
|
-
'#EXT-X-MEDIA-SEQUENCE:0\n',
|
|
406
|
-
'#EXT-X-BYTERANGE:121090@616\n',
|
|
407
|
-
'#EXTINF:2,\n',
|
|
408
|
-
'main.mp4\n',
|
|
409
|
-
].join('');
|
|
410
|
-
|
|
411
|
-
const expectedStartByte = 616;
|
|
412
|
-
const expectedEndByte = 121705;
|
|
413
|
-
|
|
414
360
|
const mediaWithAdditionalSegment = [
|
|
415
361
|
'#EXTM3U\n',
|
|
416
362
|
'#EXT-X-TARGETDURATION:5\n',
|
|
@@ -437,8 +383,8 @@ describe('HlsParser live', () => {
|
|
|
437
383
|
'#EXT-X-MAP:URI="init.mp4",BYTERANGE="616@0"\n',
|
|
438
384
|
'#EXT-X-MEDIA-SEQUENCE:0\n',
|
|
439
385
|
].join('');
|
|
440
|
-
|
|
441
|
-
|
|
386
|
+
|
|
387
|
+
for (let i = 0; i < 1000; i++) {
|
|
442
388
|
mediaWithManySegments += '#EXTINF:2,\n';
|
|
443
389
|
mediaWithManySegments += 'main.mp4\n';
|
|
444
390
|
}
|
|
@@ -575,17 +521,17 @@ describe('HlsParser live', () => {
|
|
|
575
521
|
.setResponseValue('test:/main.mp4', segmentData)
|
|
576
522
|
.setResponseValue('test:/main2.mp4', segmentData);
|
|
577
523
|
|
|
578
|
-
const ref1 =
|
|
579
|
-
'test:/main.mp4',
|
|
524
|
+
const ref1 = makeReference(
|
|
525
|
+
'test:/main.mp4', 0, 2, /* syncTime= */ null,
|
|
580
526
|
/* baseUri= */ '', /* startByte= */ 0, /* endByte= */ null,
|
|
581
527
|
/* timestampOffset= */ 0);
|
|
582
528
|
|
|
583
529
|
// Expect the timestamp offset to be set for the segment after the
|
|
584
530
|
// EXT-X-DISCONTINUITY tag.
|
|
585
|
-
const ref2 =
|
|
586
|
-
'test:/main2.mp4',
|
|
531
|
+
const ref2 = makeReference(
|
|
532
|
+
'test:/main2.mp4', 2, 4, /* syncTime= */ null,
|
|
587
533
|
/* baseUri= */ '', /* startByte= */ 0, /* endByte= */ null,
|
|
588
|
-
/* timestampOffset= */
|
|
534
|
+
/* timestampOffset= */ 0);
|
|
589
535
|
|
|
590
536
|
const manifest = await parser.start('test:/master', playerInterface);
|
|
591
537
|
const video = manifest.variants[0].video;
|
|
@@ -593,57 +539,6 @@ describe('HlsParser live', () => {
|
|
|
593
539
|
ManifestParser.verifySegmentIndex(video, [ref1, ref2]);
|
|
594
540
|
});
|
|
595
541
|
|
|
596
|
-
it('offsets VTT text with rolled over TS timestamps', async () => {
|
|
597
|
-
const masterWithVtt = [
|
|
598
|
-
'#EXTM3U\n',
|
|
599
|
-
'#EXT-X-MEDIA:TYPE=SUBTITLES,LANGUAGE="fra",URI="text",',
|
|
600
|
-
'GROUP-ID="sub1"\n',
|
|
601
|
-
'#EXT-X-STREAM-INF:BANDWIDTH=200,CODECS="avc1",',
|
|
602
|
-
'RESOLUTION=960x540,FRAME-RATE=60,SUBTITLES="sub1"\n',
|
|
603
|
-
'video\n',
|
|
604
|
-
].join('');
|
|
605
|
-
|
|
606
|
-
const textPlaylist = [
|
|
607
|
-
'#EXTM3U\n',
|
|
608
|
-
'#EXT-X-TARGETDURATION:5\n',
|
|
609
|
-
'#EXT-X-MEDIA-SEQUENCE:0\n',
|
|
610
|
-
'#EXTINF:2,\n',
|
|
611
|
-
'main.vtt\n',
|
|
612
|
-
].join('');
|
|
613
|
-
|
|
614
|
-
const vtt = [
|
|
615
|
-
'WEBVTT\n',
|
|
616
|
-
'\n',
|
|
617
|
-
'00:00.000 --> 00:01.000\n',
|
|
618
|
-
'Hello, world!\n',
|
|
619
|
-
].join('');
|
|
620
|
-
|
|
621
|
-
fakeNetEngine
|
|
622
|
-
.setResponseText('test:/master', masterWithVtt)
|
|
623
|
-
.setResponseText('test:/video', media)
|
|
624
|
-
.setResponseText('test:/text', textPlaylist)
|
|
625
|
-
.setResponseValue('test:/init.mp4', initSegmentData)
|
|
626
|
-
.setResponseValue('test:/main.mp4', pastRolloverSegmentData)
|
|
627
|
-
.setResponseText('test:/main.vtt', vtt);
|
|
628
|
-
|
|
629
|
-
const manifest = await parser.start('test:/master', playerInterface);
|
|
630
|
-
const textStream = manifest.textStreams[0];
|
|
631
|
-
await textStream.createSegmentIndex();
|
|
632
|
-
goog.asserts.assert(textStream.segmentIndex, 'Null segmentIndex!');
|
|
633
|
-
|
|
634
|
-
let ref = Array.from(textStream.segmentIndex)[0];
|
|
635
|
-
expect(ref).not.toBe(null);
|
|
636
|
-
expect(ref.startTime).not.toBeLessThan(rolloverOffset);
|
|
637
|
-
|
|
638
|
-
const videoStream = manifest.variants[0].video;
|
|
639
|
-
await videoStream.createSegmentIndex();
|
|
640
|
-
goog.asserts.assert(videoStream.segmentIndex, 'Null segmentIndex!');
|
|
641
|
-
|
|
642
|
-
ref = Array.from(videoStream.segmentIndex)[0];
|
|
643
|
-
expect(ref).not.toBe(null);
|
|
644
|
-
expect(ref.startTime).not.toBeLessThan(rolloverOffset);
|
|
645
|
-
});
|
|
646
|
-
|
|
647
542
|
it('parses streams with partial and preload hinted segments', async () => {
|
|
648
543
|
playerInterface.isLowLatencyMode = () => true;
|
|
649
544
|
const mediaWithPartialSegments = [
|
|
@@ -673,35 +568,32 @@ describe('HlsParser live', () => {
|
|
|
673
568
|
.setResponseValue('test:/partial.mp4', segmentData)
|
|
674
569
|
.setResponseValue('test:/partial2.mp4', segmentData);
|
|
675
570
|
|
|
676
|
-
const partialRef =
|
|
677
|
-
'test:/partial.mp4',
|
|
571
|
+
const partialRef = makeReference(
|
|
572
|
+
'test:/partial.mp4', 0, 2, /* syncTime= */ null,
|
|
678
573
|
/* baseUri= */ '', /* startByte= */ 0, /* endByte= */ 199);
|
|
679
574
|
|
|
680
|
-
const partialRef2 =
|
|
681
|
-
'test:/partial2.mp4',
|
|
682
|
-
|
|
683
|
-
/* endByte= */ 429);
|
|
575
|
+
const partialRef2 = makeReference(
|
|
576
|
+
'test:/partial2.mp4', 2, 4, /* syncTime= */ null,
|
|
577
|
+
/* baseUri= */ '', /* startByte= */ 200, /* endByte= */ 429);
|
|
684
578
|
|
|
685
|
-
const partialRef3 =
|
|
686
|
-
'test:/partial.mp4',
|
|
687
|
-
segmentDataStartTime + 6,
|
|
579
|
+
const partialRef3 = makeReference(
|
|
580
|
+
'test:/partial.mp4', 4, 6, /* syncTime= */ null,
|
|
688
581
|
/* baseUri= */ '', /* startByte= */ 0, /* endByte= */ 209);
|
|
689
582
|
|
|
690
583
|
// A preload hinted partial segment doesn't have duration information,
|
|
691
584
|
// so its startTime and endTime are the same.
|
|
692
|
-
const preloadRef =
|
|
693
|
-
'test:/partial.mp4',
|
|
694
|
-
segmentDataStartTime + 6,
|
|
585
|
+
const preloadRef = makeReference(
|
|
586
|
+
'test:/partial.mp4', 6, 6, /* syncTime= */ null,
|
|
695
587
|
/* baseUri= */ '', /* startByte= */ 210, /* endByte= */ null);
|
|
696
588
|
|
|
697
|
-
const ref =
|
|
698
|
-
'test:/main.mp4',
|
|
589
|
+
const ref = makeReference(
|
|
590
|
+
'test:/main.mp4', 0, 4, /* syncTime= */ null,
|
|
699
591
|
/* baseUri= */ '', /* startByte= */ 0, /* endByte= */ 429,
|
|
700
592
|
/* timestampOffset= */ 0, [partialRef, partialRef2]);
|
|
701
593
|
|
|
702
594
|
// ref2 is not fully published yet, so it doesn't have a segment uri.
|
|
703
|
-
const ref2 =
|
|
704
|
-
'',
|
|
595
|
+
const ref2 = makeReference(
|
|
596
|
+
'', 4, 6, /* syncTime= */ null,
|
|
705
597
|
/* baseUri= */ '', /* startByte= */ 0, /* endByte= */ null,
|
|
706
598
|
/* timestampOffset= */ 0, [partialRef3, preloadRef]);
|
|
707
599
|
|
|
@@ -713,16 +605,20 @@ describe('HlsParser live', () => {
|
|
|
713
605
|
|
|
714
606
|
describe('update', () => {
|
|
715
607
|
it('adds new segments when they appear', async () => {
|
|
716
|
-
const ref1 =
|
|
717
|
-
|
|
608
|
+
const ref1 = makeReference(
|
|
609
|
+
'test:/main.mp4', 0, 2, /* syncTime= */ null);
|
|
610
|
+
const ref2 = makeReference(
|
|
611
|
+
'test:/main2.mp4', 2, 4, /* syncTime= */ null);
|
|
718
612
|
|
|
719
613
|
await testUpdate(
|
|
720
614
|
master, media, [ref1], mediaWithAdditionalSegment, [ref1, ref2]);
|
|
721
615
|
});
|
|
722
616
|
|
|
723
617
|
it('evicts removed segments', async () => {
|
|
724
|
-
const ref1 =
|
|
725
|
-
|
|
618
|
+
const ref1 = makeReference(
|
|
619
|
+
'test:/main.mp4', 0, 2, /* syncTime= */ null);
|
|
620
|
+
const ref2 = makeReference(
|
|
621
|
+
'test:/main2.mp4', 2, 4, /* syncTime= */ null);
|
|
726
622
|
|
|
727
623
|
await testUpdate(
|
|
728
624
|
master, mediaWithAdditionalSegment, [ref1, ref2],
|
|
@@ -730,12 +626,13 @@ describe('HlsParser live', () => {
|
|
|
730
626
|
});
|
|
731
627
|
|
|
732
628
|
it('handles updates with redirects', async () => {
|
|
733
|
-
const oldRef1 =
|
|
629
|
+
const oldRef1 = makeReference(
|
|
630
|
+
'test:/main.mp4', 0, 2, /* syncTime= */ null);
|
|
734
631
|
|
|
735
|
-
const newRef1 =
|
|
736
|
-
|
|
737
|
-
const newRef2 =
|
|
738
|
-
|
|
632
|
+
const newRef1 = makeReference(
|
|
633
|
+
'test:/redirected/main.mp4', 0, 2, /* syncTime= */ null);
|
|
634
|
+
const newRef2 = makeReference(
|
|
635
|
+
'test:/redirected/main2.mp4', 2, 4, /* syncTime= */ null);
|
|
739
636
|
|
|
740
637
|
let playlistFetchCount = 0;
|
|
741
638
|
|
|
@@ -762,8 +659,8 @@ describe('HlsParser live', () => {
|
|
|
762
659
|
.setResponseValue('test:/init.mp4', initSegmentData)
|
|
763
660
|
.setResponseValue('test:/main.mp4', segmentData);
|
|
764
661
|
|
|
765
|
-
const expectedRef =
|
|
766
|
-
'test:/main.mp4',
|
|
662
|
+
const expectedRef = makeReference(
|
|
663
|
+
'test:/main.mp4', 0, 2, /* syncTime= */ null);
|
|
767
664
|
// In live content, we do not set timestampOffset.
|
|
768
665
|
expectedRef.timestampOffset = 0;
|
|
769
666
|
|
|
@@ -780,12 +677,11 @@ describe('HlsParser live', () => {
|
|
|
780
677
|
.setResponseValue('test:/init.mp4', initSegmentData)
|
|
781
678
|
.setResponseValue('test:/main.mp4', segmentData);
|
|
782
679
|
|
|
783
|
-
const ref1 =
|
|
784
|
-
'test:/main.mp4',
|
|
680
|
+
const ref1 = makeReference(
|
|
681
|
+
'test:/main.mp4', 0, 2, /* syncTime= */ null);
|
|
785
682
|
|
|
786
|
-
const ref2 =
|
|
787
|
-
'test:/main2.mp4',
|
|
788
|
-
segmentDataStartTime + 4);
|
|
683
|
+
const ref2 = makeReference(
|
|
684
|
+
'test:/main2.mp4', 2, 4, /* syncTime= */ null);
|
|
789
685
|
|
|
790
686
|
const manifest = await parser.start('test:/master', playerInterface);
|
|
791
687
|
const video = manifest.variants[0].video;
|
|
@@ -821,11 +717,11 @@ describe('HlsParser live', () => {
|
|
|
821
717
|
.setResponseValue('test:/main.mp4', segmentData)
|
|
822
718
|
.setResponseValue('test:/main2.mp4', segmentData);
|
|
823
719
|
|
|
824
|
-
const ref1 =
|
|
825
|
-
|
|
720
|
+
const ref1 = makeReference(
|
|
721
|
+
'test:/main.mp4', 0, 2, /* syncTime= */ null);
|
|
826
722
|
|
|
827
|
-
const ref2 =
|
|
828
|
-
|
|
723
|
+
const ref2 = makeReference(
|
|
724
|
+
'test:/main2.mp4', 2, 4, /* syncTime= */ null);
|
|
829
725
|
|
|
830
726
|
const manifest =
|
|
831
727
|
await parser.start('test:/master', playerInterface);
|
|
@@ -858,57 +754,6 @@ describe('HlsParser live', () => {
|
|
|
858
754
|
shaka.net.NetworkingEngine.RequestType.SEGMENT);
|
|
859
755
|
});
|
|
860
756
|
|
|
861
|
-
it('parses start time from ts segments', async () => {
|
|
862
|
-
const tsMediaPlaylist =
|
|
863
|
-
mediaWithRemovedSegment.replace(/\.mp4/g, '.ts');
|
|
864
|
-
|
|
865
|
-
fakeNetEngine
|
|
866
|
-
.setResponseText('test:/master', master)
|
|
867
|
-
.setResponseText('test:/video', tsMediaPlaylist)
|
|
868
|
-
.setResponseValue('test:/main2.ts', tsSegmentData);
|
|
869
|
-
|
|
870
|
-
const expectedRef = ManifestParser.makeReference(
|
|
871
|
-
'test:/main2.ts', segmentDataStartTime, segmentDataStartTime + 2);
|
|
872
|
-
// In live content, we do not set timestampOffset.
|
|
873
|
-
expectedRef.timestampOffset = 0;
|
|
874
|
-
|
|
875
|
-
const manifest = await parser.start('test:/master', playerInterface);
|
|
876
|
-
const video = manifest.variants[0].video;
|
|
877
|
-
await video.createSegmentIndex();
|
|
878
|
-
ManifestParser.verifySegmentIndex(video, [expectedRef]);
|
|
879
|
-
});
|
|
880
|
-
|
|
881
|
-
it('gets start time of segments with byte range', async () => {
|
|
882
|
-
// Nit: this value is an implementation detail of the fix for #1106
|
|
883
|
-
const partialEndByte = expectedStartByte + 2048 - 1;
|
|
884
|
-
|
|
885
|
-
fakeNetEngine
|
|
886
|
-
.setResponseText('test:/master', master)
|
|
887
|
-
.setResponseText('test:/video', mediaWithByteRange)
|
|
888
|
-
.setResponseValue('test:/init.mp4', initSegmentData)
|
|
889
|
-
.setResponseValue('test:/main.mp4', segmentData);
|
|
890
|
-
|
|
891
|
-
const expectedRef = ManifestParser.makeReference(
|
|
892
|
-
/* uri= */ 'test:/main.mp4',
|
|
893
|
-
/* start= */ segmentDataStartTime,
|
|
894
|
-
/* end= */ segmentDataStartTime + 2,
|
|
895
|
-
/* baseUri= */ '',
|
|
896
|
-
expectedStartByte,
|
|
897
|
-
expectedEndByte); // Complete segment reference
|
|
898
|
-
|
|
899
|
-
const manifest = await parser.start('test:/master', playerInterface);
|
|
900
|
-
const video = manifest.variants[0].video;
|
|
901
|
-
await video.createSegmentIndex();
|
|
902
|
-
ManifestParser.verifySegmentIndex(video, [expectedRef]);
|
|
903
|
-
|
|
904
|
-
// There should have been a range request for this segment to get the
|
|
905
|
-
// start time.
|
|
906
|
-
fakeNetEngine.expectRangeRequest(
|
|
907
|
-
'test:/main.mp4',
|
|
908
|
-
expectedStartByte,
|
|
909
|
-
partialEndByte); // partial segment request
|
|
910
|
-
});
|
|
911
|
-
|
|
912
757
|
it('request playlist delta updates to skip segments', async () => {
|
|
913
758
|
const mediaWithDeltaUpdates = [
|
|
914
759
|
'#EXTM3U\n',
|
|
@@ -973,9 +818,12 @@ describe('HlsParser live', () => {
|
|
|
973
818
|
].join('');
|
|
974
819
|
|
|
975
820
|
playerInterface.isLowLatencyMode = () => true;
|
|
976
|
-
const ref1 =
|
|
977
|
-
|
|
978
|
-
const
|
|
821
|
+
const ref1 = makeReference(
|
|
822
|
+
'test:/main.mp4', 0, 2, /* syncTime= */ null);
|
|
823
|
+
const ref2 = makeReference(
|
|
824
|
+
'test:/main2.mp4', 2, 4, /* syncTime= */ null);
|
|
825
|
+
const ref3 = makeReference(
|
|
826
|
+
'test:/main3.mp4', 4, 6, /* syncTime= */ null);
|
|
979
827
|
// With 'SKIPPED-SEGMENTS', ref1 is skipped from the playlist,
|
|
980
828
|
// and ref1 should be in the SegmentReferences list.
|
|
981
829
|
// ref3 should be appended to the SegmentReferences list.
|
|
@@ -1015,29 +863,29 @@ describe('HlsParser live', () => {
|
|
|
1015
863
|
|
|
1016
864
|
playerInterface.isLowLatencyMode = () => true;
|
|
1017
865
|
|
|
1018
|
-
const ref1 =
|
|
1019
|
-
'test:/main.mp4',
|
|
866
|
+
const ref1 = makeReference(
|
|
867
|
+
'test:/main.mp4', 0, 2, /* syncTime= */ null,
|
|
1020
868
|
/* baseUri= */ '', /* startByte= */ 0, /* endByte= */ null,
|
|
1021
869
|
/* timestampOffset= */ 0);
|
|
1022
870
|
|
|
1023
871
|
// Expect the timestamp offset to be set for the segment after the
|
|
1024
872
|
// EXT-X-DISCONTINUITY tag.
|
|
1025
|
-
const ref2 =
|
|
1026
|
-
'test:/main2.mp4',
|
|
1027
|
-
|
|
1028
|
-
/*
|
|
873
|
+
const ref2 = makeReference(
|
|
874
|
+
'test:/main2.mp4', 2, 4, /* syncTime= */ null,
|
|
875
|
+
/* baseUri= */ '', /* startByte= */ 0, /* endByte= */ null,
|
|
876
|
+
/* timestampOffset= */ 0);
|
|
1029
877
|
|
|
1030
878
|
// Expect the timestamp offset to be set for the segment, with the
|
|
1031
879
|
// EXT-X-DISCONTINUITY tag skipped in the playlist.
|
|
1032
|
-
const ref3 =
|
|
1033
|
-
'test:/main3.mp4',
|
|
1034
|
-
|
|
1035
|
-
/*
|
|
880
|
+
const ref3 = makeReference(
|
|
881
|
+
'test:/main3.mp4', 4, 6, /* syncTime= */ null,
|
|
882
|
+
/* baseUri= */ '', /* startByte= */ 0, /* endByte= */ null,
|
|
883
|
+
/* timestampOffset= */ 0);
|
|
1036
884
|
|
|
1037
|
-
const ref4 =
|
|
1038
|
-
'test:/main4.mp4',
|
|
1039
|
-
|
|
1040
|
-
/*
|
|
885
|
+
const ref4 = makeReference(
|
|
886
|
+
'test:/main4.mp4', 6, 8, /* syncTime= */ null,
|
|
887
|
+
/* baseUri= */ '', /* startByte= */ 0, /* endByte= */ null,
|
|
888
|
+
/* timestampOffset= */ 0);
|
|
1041
889
|
|
|
1042
890
|
// With 'SKIPPED-SEGMENTS', ref1, ref2 are skipped from the playlist,
|
|
1043
891
|
// and ref1,ref2 should be in the SegmentReferences list.
|
|
@@ -1048,4 +896,23 @@ describe('HlsParser live', () => {
|
|
|
1048
896
|
});
|
|
1049
897
|
}); // describe('update')
|
|
1050
898
|
}); // describe('playlist type LIVE')
|
|
899
|
+
|
|
900
|
+
/**
|
|
901
|
+
* @param {string} uri A relative URI to http://example.com
|
|
902
|
+
* @param {number} start
|
|
903
|
+
* @param {number} end
|
|
904
|
+
* @param {?number} syncTime
|
|
905
|
+
* @param {string=} baseUri
|
|
906
|
+
* @param {number=} startByte
|
|
907
|
+
* @param {?number=} endByte
|
|
908
|
+
* @param {number=} timestampOffset
|
|
909
|
+
* @param {!Array.<!shaka.media.SegmentReference>=} partialReferences
|
|
910
|
+
* @param {?string=} tilesLayout
|
|
911
|
+
* @return {!shaka.media.SegmentReference}
|
|
912
|
+
*/
|
|
913
|
+
function makeReference(uri, start, end, syncTime, baseUri, startByte, endByte,
|
|
914
|
+
timestampOffset, partialReferences, tilesLayout) {
|
|
915
|
+
return ManifestParser.makeReference(uri, start, end, baseUri, startByte,
|
|
916
|
+
endByte, timestampOffset, partialReferences, tilesLayout, syncTime);
|
|
917
|
+
}
|
|
1051
918
|
}); // describe('HlsParser live')
|