shaka-player 4.3.10 → 4.4.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/.github/workflows/release-please.yaml +7 -0
- package/AUTHORS +9 -0
- package/CHANGELOG.md +295 -200
- package/CONTRIBUTORS +8 -0
- package/LICENSE +32 -0
- package/README.md +63 -10
- package/demo/autoTemplate.txt +40 -5
- package/demo/close_button.js +11 -0
- package/demo/common/asset.js +13 -1
- package/demo/common/assets.js +53 -3
- package/demo/common/message_ids.js +25 -1
- package/demo/config.js +69 -10
- package/demo/customWarning.txt +2 -2
- package/demo/index.html +3 -1
- package/demo/locales/en.json +26 -2
- package/demo/locales/source.json +105 -9
- package/demo/main.js +52 -9
- package/demo/search.js +3 -1
- package/demo/service_worker.js +3 -0
- package/dist/controls.css +1 -1
- package/dist/controls.css.map +1 -1
- package/dist/demo.compiled.debug.js +124 -112
- package/dist/demo.compiled.debug.map +3 -3
- package/dist/demo.compiled.js +124 -112
- package/dist/demo.compiled.map +3 -3
- package/dist/deps.js +46 -28
- package/dist/locales.js +28 -28
- package/dist/receiver.compiled.debug.js +52 -46
- package/dist/receiver.compiled.debug.map +3 -3
- package/dist/receiver.compiled.js +52 -46
- package/dist/receiver.compiled.map +3 -3
- package/dist/shaka-player.compiled.d.ts +676 -391
- package/dist/shaka-player.compiled.debug.d.ts +676 -391
- package/dist/shaka-player.compiled.debug.externs.js +1188 -616
- package/dist/shaka-player.compiled.debug.js +1045 -700
- package/dist/shaka-player.compiled.debug.map +4 -4
- package/dist/shaka-player.compiled.externs.js +1188 -616
- package/dist/shaka-player.compiled.js +1094 -933
- package/dist/shaka-player.compiled.map +4 -4
- package/dist/shaka-player.ui.d.ts +677 -392
- package/dist/shaka-player.ui.debug.d.ts +677 -392
- package/dist/shaka-player.ui.debug.externs.js +1023 -451
- package/dist/shaka-player.ui.debug.js +1100 -739
- package/dist/shaka-player.ui.debug.map +4 -4
- package/dist/shaka-player.ui.externs.js +1023 -451
- package/dist/shaka-player.ui.js +1244 -1071
- package/dist/shaka-player.ui.map +4 -4
- package/docs/tutorials/ad_monetization.md +15 -1
- package/docs/tutorials/application-level-redirects.md +1 -1
- package/docs/tutorials/config.md +9 -5
- package/docs/tutorials/drm-config.md +61 -0
- package/docs/tutorials/fairplay.md +19 -4
- package/docs/tutorials/license-server-auth.md +4 -4
- package/docs/tutorials/license-wrapping.md +2 -2
- package/docs/tutorials/ui-customization.md +7 -3
- package/docs/tutorials/ui.md +7 -7
- package/docs/tutorials/upgrade.md +3 -0
- package/externs/ima.js +123 -2
- package/externs/isoboxer.js +217 -0
- package/externs/mediakeys.js +18 -0
- package/externs/mux.js +1 -105
- package/externs/pictureinpicture.js +48 -0
- package/externs/shaka/ads.js +61 -1
- package/externs/shaka/cea.js +110 -0
- package/externs/shaka/codecs.js +32 -0
- package/externs/shaka/manifest.js +101 -1
- package/externs/shaka/manifest_parser.js +0 -10
- package/externs/shaka/net.js +36 -7
- package/externs/shaka/offline.js +8 -1
- package/externs/shaka/player.js +220 -21
- package/externs/shaka/text.js +1 -382
- package/externs/shaka/transmuxer.js +59 -0
- package/karma.conf.js +13 -0
- package/lib/abr/simple_abr_manager.js +6 -3
- package/lib/ads/ad_manager.js +60 -2
- package/lib/ads/client_side_ad.js +86 -0
- package/lib/ads/client_side_ad_manager.js +79 -3
- package/lib/ads/server_side_ad.js +86 -0
- package/lib/ads/server_side_ad_manager.js +13 -0
- package/lib/cast/cast_utils.js +1 -0
- package/lib/cea/cea608_data_channel.js +24 -14
- package/lib/cea/cea608_memory.js +5 -2
- package/lib/cea/cea708_service.js +8 -9
- package/lib/cea/cea708_window.js +1 -2
- package/lib/cea/cea_decoder.js +23 -6
- package/lib/cea/cea_utils.js +25 -2
- package/lib/cea/dummy_caption_decoder.js +21 -0
- package/lib/cea/dummy_cea_parser.js +1 -3
- package/lib/cea/mp4_cea_parser.js +15 -10
- package/lib/cea/ts_cea_parser.js +69 -0
- package/lib/dash/content_protection.js +32 -2
- package/lib/dash/dash_parser.js +93 -31
- package/lib/dash/mpd_utils.js +6 -25
- package/lib/dash/segment_base.js +12 -14
- package/lib/dash/segment_list.js +10 -6
- package/lib/dash/segment_template.js +349 -32
- package/lib/dependencies/all.js +8 -0
- package/lib/hls/hls_classes.js +33 -8
- package/lib/hls/hls_parser.js +805 -191
- package/lib/hls/manifest_text_parser.js +4 -14
- package/lib/media/adaptation_set_criteria.js +43 -3
- package/lib/media/closed_caption_parser.js +74 -12
- package/lib/media/drm_engine.js +189 -49
- package/lib/media/gap_jumping_controller.js +1 -1
- package/lib/media/manifest_parser.js +34 -0
- package/lib/media/media_source_capabilities.js +10 -0
- package/lib/media/media_source_engine.js +475 -231
- package/lib/media/playhead.js +1 -1
- package/lib/media/presentation_timeline.js +62 -0
- package/lib/media/segment_index.js +50 -14
- package/lib/media/segment_prefetch.js +277 -0
- package/lib/media/segment_reference.js +70 -4
- package/lib/media/streaming_engine.js +258 -81
- package/lib/media/video_wrapper.js +15 -7
- package/lib/mss/content_protection.js +353 -0
- package/lib/mss/mss_parser.js +1081 -0
- package/lib/net/networking_engine.js +60 -10
- 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 +6 -0
- package/lib/offline/storage.js +2 -4
- package/lib/player.js +309 -105
- package/lib/polyfill/media_capabilities.js +43 -3
- package/lib/polyfill/patchedmediakeys_apple.js +5 -0
- package/lib/polyfill/patchedmediakeys_nop.js +5 -0
- package/lib/polyfill/patchedmediakeys_webkit.js +5 -0
- package/lib/text/cue.js +208 -130
- package/lib/text/lrc_text_parser.js +2 -2
- package/lib/text/mp4_vtt_parser.js +2 -2
- package/lib/text/sbv_text_parser.js +1 -1
- package/lib/text/simple_text_displayer.js +2 -1
- package/lib/text/srt_text_parser.js +9 -1
- package/lib/text/ssa_text_parser.js +2 -2
- package/lib/text/text_engine.js +3 -21
- package/lib/text/text_utils.js +71 -20
- package/lib/text/ui_text_displayer.js +14 -14
- package/lib/text/vtt_text_parser.js +22 -14
- package/lib/transmuxer/aac_transmuxer.js +224 -0
- package/lib/transmuxer/ac3.js +142 -0
- package/lib/transmuxer/ac3_transmuxer.js +212 -0
- package/lib/transmuxer/adts.js +232 -0
- package/lib/transmuxer/ec3.js +103 -0
- package/lib/transmuxer/ec3_transmuxer.js +212 -0
- package/lib/transmuxer/h264.js +324 -0
- package/lib/transmuxer/mp3_transmuxer.js +204 -0
- package/lib/transmuxer/mpeg_audio.js +196 -0
- package/lib/transmuxer/mpeg_ts_transmuxer.js +182 -0
- package/lib/transmuxer/mss_transmuxer.js +389 -0
- package/lib/{media/transmuxer.js → transmuxer/muxjs_transmuxer.js} +34 -80
- package/lib/transmuxer/transmuxer_engine.js +161 -0
- package/lib/transmuxer/ts_transmuxer.js +738 -0
- package/lib/util/cmcd_manager.js +131 -71
- package/lib/util/error.js +62 -26
- package/lib/util/exp_golomb.js +220 -0
- package/lib/util/fairplay_utils.js +64 -13
- package/lib/util/id3_utils.js +56 -3
- package/lib/util/language_utils.js +11 -8
- package/lib/util/manifest_parser_utils.js +3 -0
- package/lib/util/mime_utils.js +44 -7
- package/lib/util/mp4_box_parsers.js +233 -5
- package/lib/util/mp4_generator.js +1381 -0
- package/lib/util/periods.js +40 -34
- package/lib/util/platform.js +17 -3
- package/lib/util/player_configuration.js +38 -1
- package/lib/util/stream_utils.js +138 -27
- package/lib/util/text_parser.js +1 -1
- package/lib/util/ts_parser.js +470 -47
- package/lib/util/xml_utils.js +16 -3
- package/maintained-branches.md +2 -2
- package/package.json +3 -1
- package/roadmap.md +21 -6
- package/shaka-player.uncompiled.js +18 -0
- package/test/abr/simple_abr_manager_unit.js +32 -4
- package/test/ads/ad_manager_unit.js +18 -2
- package/test/cast/cast_utils_unit.js +7 -2
- package/test/cea/cea608_memory_unit.js +24 -0
- package/test/cea/cea_decoder_unit.js +33 -0
- package/test/dash/dash_parser_content_protection_unit.js +93 -3
- package/test/dash/dash_parser_live_unit.js +56 -13
- package/test/dash/dash_parser_manifest_unit.js +70 -2
- package/test/dash/dash_parser_segment_base_unit.js +14 -9
- package/test/dash/dash_parser_segment_template_unit.js +286 -6
- package/test/demo/demo_unit.js +5 -1
- package/test/hls/hls_live_unit.js +188 -28
- package/test/hls/hls_parser_unit.js +250 -109
- package/test/hls/manifest_text_parser_unit.js +18 -13
- package/test/media/adaptation_set_criteria_unit.js +46 -14
- package/test/media/adaptation_set_unit.js +2 -0
- package/test/media/drm_engine_integration.js +11 -8
- package/test/media/drm_engine_unit.js +220 -7
- package/test/media/media_source_engine_integration.js +122 -38
- package/test/media/media_source_engine_unit.js +133 -153
- package/test/media/playhead_unit.js +3 -0
- package/test/media/presentation_timeline_unit.js +51 -0
- package/test/media/segment_index_unit.js +52 -0
- package/test/media/segment_prefetch_unit.js +243 -0
- package/test/media/streaming_engine_integration.js +9 -3
- package/test/media/streaming_engine_unit.js +440 -59
- package/test/mss/mss_parser_content_protection_unit.js +49 -0
- package/test/mss/mss_parser_unit.js +472 -0
- package/test/mss/mss_player_integration.js +123 -0
- package/test/offline/manifest_convert_unit.js +9 -0
- package/test/offline/storage_integration.js +6 -1
- package/test/player_unit.js +386 -133
- package/test/polyfill/media_capabilities_unit.js +18 -0
- package/test/test/assets/hls-raw-aac/fileSequence0.aac +0 -0
- package/test/test/assets/hls-raw-aac/fileSequence1.aac +0 -0
- package/test/test/assets/hls-raw-aac/fileSequence2.aac +0 -0
- package/test/test/assets/hls-raw-aac/fileSequence3.aac +0 -0
- package/test/test/assets/hls-raw-aac/manifest.m3u8 +4 -0
- package/test/test/assets/hls-raw-aac/stream.m4a.m3u8 +14 -0
- package/test/test/assets/hls-raw-ac3/fileSequence0.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence1.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence2.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence3.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence4.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence5.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence6.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence7.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/prog_index.m3u8 +31 -0
- package/test/test/assets/hls-raw-ec3/fileSequence0.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence1.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence2.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence3.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence4.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence5.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence6.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence7.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/prog_index.m3u8 +31 -0
- package/test/test/assets/hls-raw-mp3/chunklist_w905519204.m3u8 +13 -0
- package/test/test/assets/hls-raw-mp3/media_w905519204_0.mp3 +0 -0
- package/test/test/assets/hls-raw-mp3/media_w905519204_1.mp3 +0 -0
- package/test/test/assets/hls-raw-mp3/media_w905519204_2.mp3 +0 -0
- package/test/test/assets/hls-raw-mp3/media_w905519204_3.mp3 +0 -0
- package/test/test/assets/hls-raw-mp3/playlist.m3u8 +4 -0
- package/test/test/assets/hls-ts-aac/playlist.m3u8 +23 -0
- package/test/test/assets/hls-ts-aac/segment_0.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_1.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_2.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_3.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_4.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_5.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_6.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_7.ts +0 -0
- package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0000.ts +0 -0
- package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0001.ts +0 -0
- package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0002.ts +0 -0
- package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0003.ts +0 -0
- package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0004.ts +0 -0
- package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0005.ts +0 -0
- package/test/test/assets/hls-ts-ac3/prog_index.m3u8 +19 -0
- package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0000.ts +0 -0
- package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0001.ts +0 -0
- package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0002.ts +0 -0
- package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0003.ts +0 -0
- package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0004.ts +0 -0
- package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0005.ts +0 -0
- package/test/test/assets/hls-ts-ec3/prog_index.m3u8 +19 -0
- package/test/test/assets/hls-ts-h264/fileSequence0.ts +0 -0
- package/test/test/assets/hls-ts-h264/fileSequence1.ts +0 -0
- package/test/test/assets/hls-ts-h264/fileSequence2.ts +0 -0
- package/test/test/assets/hls-ts-h264/fileSequence3.ts +0 -0
- package/test/test/assets/hls-ts-h264/fileSequence4.ts +0 -0
- package/test/test/assets/hls-ts-h264/fileSequence5.ts +0 -0
- package/test/test/assets/hls-ts-h264/prog_index.m3u8 +25 -0
- package/test/test/assets/hls-ts-mp3/manifest.m3u8 +13 -0
- package/test/test/assets/hls-ts-mp3/media_w239891843_0.ts +0 -0
- package/test/test/assets/hls-ts-mp3/media_w239891843_1.ts +0 -0
- package/test/test/assets/hls-ts-mp3/media_w239891843_2.ts +0 -0
- package/test/test/assets/hls-ts-mp3/media_w239891843_3.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/chunk.m3u8 +17 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/n_0_0_0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/n_1_0_0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/n_2_0_0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/n_3_0_0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/n_4_0_0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/n_5_0_0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/playlist.m3u8 +4 -0
- package/test/test/boot.js +7 -2
- package/test/test/util/fake_ad.js +99 -0
- package/test/test/util/fake_ad_manager.js +7 -1
- package/test/test/util/fake_networking_engine.js +41 -14
- package/test/test/util/fake_segment_prefetch.js +81 -0
- package/test/test/util/manifest_generator.js +19 -5
- package/test/test/util/mss_parser_util.js +115 -0
- package/test/test/util/offline_utils.js +1 -0
- package/test/test/util/simple_fakes.js +12 -3
- package/test/test/util/streaming_engine_util.js +14 -4
- package/test/test/util/ttml_utils.js +2 -2
- package/test/text/cue_integration.js +1 -1
- package/test/text/srt_text_parser_unit.js +78 -0
- package/test/text/text_engine_unit.js +17 -8
- package/test/text/ui_text_displayer_unit.js +4 -4
- package/test/text/vtt_text_parser_unit.js +59 -40
- package/test/text/web_vtt_generator_unit.js +9 -3
- package/test/{media/transmuxer_integration.js → transmuxer/muxjs_transmuxer_integration.js} +30 -33
- package/test/transmuxer/transmuxer_engine_integration.js +60 -0
- package/test/transmuxer/transmuxer_integration.js +296 -0
- package/test/util/cmcd_manager_unit.js +162 -13
- package/test/util/language_utils_unit.js +9 -2
- package/test/util/mp4_box_parsers_unit.js +39 -4
- package/test/util/periods_unit.js +34 -26
- package/test/util/stream_utils_unit.js +60 -107
- package/ui/controls.js +19 -1
- package/ui/controls.less +1 -0
- package/ui/externs/ui.js +11 -1
- package/ui/language_utils.js +15 -0
- package/ui/less/thumbnails.less +26 -0
- package/ui/locales/oc.json +42 -0
- package/ui/pip_button.js +83 -2
- package/ui/range_element.js +15 -0
- package/ui/resolution_selection.js +9 -2
- package/ui/seek_bar.js +223 -0
- package/ui/ui.js +5 -0
- package/lib/cea/i_caption_decoder.js +0 -51
- package/lib/cea/i_cea_parser.js +0 -68
package/lib/dash/segment_base.js
CHANGED
|
@@ -70,11 +70,10 @@ shaka.dash.SegmentBase = class {
|
|
|
70
70
|
* Creates a new StreamInfo object.
|
|
71
71
|
*
|
|
72
72
|
* @param {shaka.dash.DashParser.Context} context
|
|
73
|
-
* @param {shaka.dash.DashParser.
|
|
74
|
-
* requestInitSegment
|
|
73
|
+
* @param {shaka.dash.DashParser.RequestSegmentCallback} requestSegment
|
|
75
74
|
* @return {shaka.dash.DashParser.StreamInfo}
|
|
76
75
|
*/
|
|
77
|
-
static createStreamInfo(context,
|
|
76
|
+
static createStreamInfo(context, requestSegment) {
|
|
78
77
|
goog.asserts.assert(context.representation.segmentBase,
|
|
79
78
|
'Should only be called with SegmentBase');
|
|
80
79
|
// Since SegmentBase does not need updates, simply treat any call as
|
|
@@ -111,7 +110,7 @@ shaka.dash.SegmentBase = class {
|
|
|
111
110
|
return {
|
|
112
111
|
generateSegmentIndex: () => {
|
|
113
112
|
return SegmentBase.generateSegmentIndex_(
|
|
114
|
-
shallowCopyOfContext,
|
|
113
|
+
shallowCopyOfContext, requestSegment, initSegmentReference,
|
|
115
114
|
scaledPresentationTimeOffset);
|
|
116
115
|
},
|
|
117
116
|
};
|
|
@@ -121,8 +120,7 @@ shaka.dash.SegmentBase = class {
|
|
|
121
120
|
* Creates a SegmentIndex for the given URIs and context.
|
|
122
121
|
*
|
|
123
122
|
* @param {shaka.dash.DashParser.Context} context
|
|
124
|
-
* @param {shaka.dash.DashParser.
|
|
125
|
-
* requestInitSegment
|
|
123
|
+
* @param {shaka.dash.DashParser.RequestSegmentCallback} requestSegment
|
|
126
124
|
* @param {shaka.media.InitSegmentReference} initSegmentReference
|
|
127
125
|
* @param {!Array.<string>} uris
|
|
128
126
|
* @param {number} startByte
|
|
@@ -131,7 +129,7 @@ shaka.dash.SegmentBase = class {
|
|
|
131
129
|
* @return {!Promise.<shaka.media.SegmentIndex>}
|
|
132
130
|
*/
|
|
133
131
|
static async generateSegmentIndexFromUris(
|
|
134
|
-
context,
|
|
132
|
+
context, requestSegment, initSegmentReference, uris, startByte,
|
|
135
133
|
endByte, scaledPresentationTimeOffset) {
|
|
136
134
|
// Unpack context right away, before we start an async process.
|
|
137
135
|
// This immunizes us against changes to the context object later.
|
|
@@ -143,16 +141,17 @@ shaka.dash.SegmentBase = class {
|
|
|
143
141
|
const containerType = context.representation.mimeType.split('/')[1];
|
|
144
142
|
|
|
145
143
|
// Create a local variable to bind to so we can set to null to help the GC.
|
|
146
|
-
let localRequest =
|
|
144
|
+
let localRequest = requestSegment;
|
|
147
145
|
let segmentIndex = null;
|
|
148
146
|
|
|
149
147
|
const responses = [
|
|
150
|
-
localRequest(uris, startByte, endByte),
|
|
148
|
+
localRequest(uris, startByte, endByte, /* isInit= */ false),
|
|
151
149
|
containerType == 'webm' ?
|
|
152
150
|
localRequest(
|
|
153
151
|
initSegmentReference.getUris(),
|
|
154
152
|
initSegmentReference.startByte,
|
|
155
|
-
initSegmentReference.endByte
|
|
153
|
+
initSegmentReference.endByte,
|
|
154
|
+
/* isInit= */ true) :
|
|
156
155
|
null,
|
|
157
156
|
];
|
|
158
157
|
|
|
@@ -327,15 +326,14 @@ shaka.dash.SegmentBase = class {
|
|
|
327
326
|
* Generate a SegmentIndex from a Context object.
|
|
328
327
|
*
|
|
329
328
|
* @param {shaka.dash.DashParser.Context} context
|
|
330
|
-
* @param {shaka.dash.DashParser.
|
|
331
|
-
* requestInitSegment
|
|
329
|
+
* @param {shaka.dash.DashParser.RequestSegmentCallback} requestSegment
|
|
332
330
|
* @param {shaka.media.InitSegmentReference} initSegmentReference
|
|
333
331
|
* @param {number} scaledPresentationTimeOffset
|
|
334
332
|
* @return {!Promise.<shaka.media.SegmentIndex>}
|
|
335
333
|
* @private
|
|
336
334
|
*/
|
|
337
335
|
static generateSegmentIndex_(
|
|
338
|
-
context,
|
|
336
|
+
context, requestSegment, initSegmentReference,
|
|
339
337
|
scaledPresentationTimeOffset) {
|
|
340
338
|
const SegmentBase = shaka.dash.SegmentBase;
|
|
341
339
|
|
|
@@ -344,7 +342,7 @@ shaka.dash.SegmentBase = class {
|
|
|
344
342
|
goog.asserts.assert(indexRange, 'Index range should not be null!');
|
|
345
343
|
|
|
346
344
|
return shaka.dash.SegmentBase.generateSegmentIndexFromUris(
|
|
347
|
-
context,
|
|
345
|
+
context, requestSegment, initSegmentReference, indexUris,
|
|
348
346
|
indexRange.start, indexRange.end,
|
|
349
347
|
scaledPresentationTimeOffset);
|
|
350
348
|
}
|
package/lib/dash/segment_list.js
CHANGED
|
@@ -18,6 +18,7 @@ goog.require('shaka.util.Functional');
|
|
|
18
18
|
goog.require('shaka.util.ManifestParserUtils');
|
|
19
19
|
goog.require('shaka.util.XmlUtils');
|
|
20
20
|
goog.requireType('shaka.dash.DashParser');
|
|
21
|
+
goog.requireType('shaka.media.PresentationTimeline');
|
|
21
22
|
|
|
22
23
|
|
|
23
24
|
/**
|
|
@@ -223,9 +224,6 @@ shaka.dash.SegmentList = class {
|
|
|
223
224
|
let prevEndTime = info.startTime;
|
|
224
225
|
for (let i = 0; i < max; i++) {
|
|
225
226
|
const segment = info.mediaSegments[i];
|
|
226
|
-
const mediaUri = ManifestParserUtils.resolveUris(
|
|
227
|
-
baseUris, [segment.mediaUri]);
|
|
228
|
-
|
|
229
227
|
const startTime = prevEndTime;
|
|
230
228
|
let endTime;
|
|
231
229
|
|
|
@@ -243,7 +241,13 @@ shaka.dash.SegmentList = class {
|
|
|
243
241
|
endTime = startTime + periodDuration;
|
|
244
242
|
}
|
|
245
243
|
|
|
246
|
-
|
|
244
|
+
let uris = null;
|
|
245
|
+
const getUris = () => {
|
|
246
|
+
if (uris == null) {
|
|
247
|
+
uris = ManifestParserUtils.resolveUris(baseUris, [segment.mediaUri]);
|
|
248
|
+
}
|
|
249
|
+
return uris;
|
|
250
|
+
};
|
|
247
251
|
references.push(
|
|
248
252
|
new shaka.media.SegmentReference(
|
|
249
253
|
periodStart + startTime,
|
|
@@ -323,7 +327,7 @@ shaka.dash.SegmentList.MediaSegment;
|
|
|
323
327
|
* startTime: number,
|
|
324
328
|
* startNumber: number,
|
|
325
329
|
* scaledPresentationTimeOffset: number,
|
|
326
|
-
* timeline: Array.<shaka.
|
|
330
|
+
* timeline: Array.<shaka.media.PresentationTimeline.TimeRange>,
|
|
327
331
|
* mediaSegments: !Array.<shaka.dash.SegmentList.MediaSegment>
|
|
328
332
|
* }}
|
|
329
333
|
* @private
|
|
@@ -339,7 +343,7 @@ shaka.dash.SegmentList.MediaSegment;
|
|
|
339
343
|
* The start number of the segments; 1 or greater.
|
|
340
344
|
* @property {number} scaledPresentationTimeOffset
|
|
341
345
|
* The scaledPresentationTimeOffset of the representation, in seconds.
|
|
342
|
-
* @property {Array.<shaka.
|
|
346
|
+
* @property {Array.<shaka.media.PresentationTimeline.TimeRange>} timeline
|
|
343
347
|
* The timeline of the representation, if given. Times in seconds.
|
|
344
348
|
* @property {!Array.<shaka.dash.SegmentList.MediaSegment>} mediaSegments
|
|
345
349
|
* The URI and byte-ranges of the media segments.
|
|
@@ -14,9 +14,11 @@ goog.require('shaka.media.InitSegmentReference');
|
|
|
14
14
|
goog.require('shaka.media.SegmentIndex');
|
|
15
15
|
goog.require('shaka.media.SegmentReference');
|
|
16
16
|
goog.require('shaka.util.Error');
|
|
17
|
+
goog.require('shaka.util.IReleasable');
|
|
17
18
|
goog.require('shaka.util.ManifestParserUtils');
|
|
18
19
|
goog.require('shaka.util.ObjectUtils');
|
|
19
20
|
goog.requireType('shaka.dash.DashParser');
|
|
21
|
+
goog.requireType('shaka.media.PresentationTimeline');
|
|
20
22
|
|
|
21
23
|
|
|
22
24
|
/**
|
|
@@ -28,8 +30,7 @@ shaka.dash.SegmentTemplate = class {
|
|
|
28
30
|
* Updates the existing SegmentIndex, if any.
|
|
29
31
|
*
|
|
30
32
|
* @param {shaka.dash.DashParser.Context} context
|
|
31
|
-
* @param {shaka.dash.DashParser.
|
|
32
|
-
* requestInitSegment
|
|
33
|
+
* @param {shaka.dash.DashParser.RequestSegmentCallback} requestSegment
|
|
33
34
|
* @param {!Object.<string, !shaka.extern.Stream>} streamMap
|
|
34
35
|
* @param {boolean} isUpdate True if the manifest is being updated.
|
|
35
36
|
* @param {number} segmentLimit The maximum number of segments to generate for
|
|
@@ -38,13 +39,16 @@ shaka.dash.SegmentTemplate = class {
|
|
|
38
39
|
* @return {shaka.dash.DashParser.StreamInfo}
|
|
39
40
|
*/
|
|
40
41
|
static createStreamInfo(
|
|
41
|
-
context,
|
|
42
|
+
context, requestSegment, streamMap, isUpdate, segmentLimit,
|
|
42
43
|
periodDurationMap) {
|
|
43
44
|
goog.asserts.assert(context.representation.segmentTemplate,
|
|
44
45
|
'Should only be called with SegmentTemplate');
|
|
45
46
|
const SegmentTemplate = shaka.dash.SegmentTemplate;
|
|
47
|
+
const TimelineSegmentIndex = shaka.dash.TimelineSegmentIndex;
|
|
46
48
|
|
|
47
49
|
const initSegmentReference = SegmentTemplate.createInitSegment_(context);
|
|
50
|
+
|
|
51
|
+
/** @type {shaka.dash.SegmentTemplate.SegmentTemplateInfo} */
|
|
48
52
|
const info = SegmentTemplate.parseSegmentTemplateInfo_(context);
|
|
49
53
|
|
|
50
54
|
SegmentTemplate.checkSegmentTemplateInfo_(context, info);
|
|
@@ -62,7 +66,7 @@ shaka.dash.SegmentTemplate = class {
|
|
|
62
66
|
return {
|
|
63
67
|
generateSegmentIndex: () => {
|
|
64
68
|
return SegmentTemplate.generateSegmentIndexFromIndexTemplate_(
|
|
65
|
-
shallowCopyOfContext,
|
|
69
|
+
shallowCopyOfContext, requestSegment, initSegmentReference,
|
|
66
70
|
info);
|
|
67
71
|
},
|
|
68
72
|
};
|
|
@@ -95,12 +99,11 @@ shaka.dash.SegmentTemplate = class {
|
|
|
95
99
|
}
|
|
96
100
|
}
|
|
97
101
|
|
|
98
|
-
const references = SegmentTemplate.createFromTimeline_(
|
|
99
|
-
shallowCopyOfContext, info, initSegmentReference);
|
|
100
|
-
|
|
101
102
|
const periodStart = context.periodInfo.start;
|
|
102
|
-
const periodEnd = context.periodInfo.duration ?
|
|
103
|
-
|
|
103
|
+
const periodEnd = context.periodInfo.duration ? periodStart +
|
|
104
|
+
context.periodInfo.duration : Infinity;
|
|
105
|
+
|
|
106
|
+
shaka.log.debug(`New manifest ${periodStart} - ${periodEnd}`);
|
|
104
107
|
|
|
105
108
|
/* When to fit segments. All refactors should honor/update this table:
|
|
106
109
|
*
|
|
@@ -120,23 +123,32 @@ shaka.dash.SegmentTemplate = class {
|
|
|
120
123
|
// most recent segment to the end of the presentation).
|
|
121
124
|
const shouldFit = !(context.dynamic && context.periodInfo.isLastPeriod);
|
|
122
125
|
|
|
123
|
-
if (segmentIndex) {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
126
|
+
if (!segmentIndex) {
|
|
127
|
+
shaka.log.debug(`Creating TSI with end ${periodEnd}`);
|
|
128
|
+
segmentIndex = new TimelineSegmentIndex(
|
|
129
|
+
info,
|
|
130
|
+
context.representation.id,
|
|
131
|
+
context.bandwidth,
|
|
132
|
+
context.representation.baseUris,
|
|
133
|
+
periodStart,
|
|
134
|
+
periodEnd,
|
|
135
|
+
initSegmentReference,
|
|
136
|
+
shouldFit,
|
|
137
|
+
);
|
|
133
138
|
} else {
|
|
134
|
-
|
|
139
|
+
const tsi = /** @type {!TimelineSegmentIndex} */(segmentIndex);
|
|
140
|
+
tsi.appendTemplateInfo(info, periodStart, periodEnd, shouldFit);
|
|
141
|
+
|
|
142
|
+
const availabilityStart =
|
|
143
|
+
context.presentationTimeline.getSegmentAvailabilityStart();
|
|
144
|
+
tsi.evict(availabilityStart);
|
|
135
145
|
}
|
|
136
|
-
context.presentationTimeline.notifySegments(references);
|
|
137
146
|
|
|
138
|
-
if (
|
|
139
|
-
|
|
147
|
+
if (info.timeline && context.adaptationSet.contentType !== 'image') {
|
|
148
|
+
const timeline = info.timeline;
|
|
149
|
+
context.presentationTimeline.notifyTimeRange(
|
|
150
|
+
timeline,
|
|
151
|
+
periodStart);
|
|
140
152
|
}
|
|
141
153
|
|
|
142
154
|
if (stream && context.dynamic) {
|
|
@@ -148,8 +160,10 @@ shaka.dash.SegmentTemplate = class {
|
|
|
148
160
|
// If segmentIndex is deleted, or segmentIndex's references are
|
|
149
161
|
// released by closeSegmentIndex(), we should set the value of
|
|
150
162
|
// segmentIndex again.
|
|
151
|
-
if (
|
|
152
|
-
|
|
163
|
+
if (segmentIndex instanceof shaka.dash.TimelineSegmentIndex &&
|
|
164
|
+
segmentIndex.isEmpty()) {
|
|
165
|
+
segmentIndex.appendTemplateInfo(info, periodStart,
|
|
166
|
+
periodEnd, shouldFit);
|
|
153
167
|
}
|
|
154
168
|
return Promise.resolve(segmentIndex);
|
|
155
169
|
},
|
|
@@ -253,15 +267,14 @@ shaka.dash.SegmentTemplate = class {
|
|
|
253
267
|
* Generates a SegmentIndex from an index URL template.
|
|
254
268
|
*
|
|
255
269
|
* @param {shaka.dash.DashParser.Context} context
|
|
256
|
-
* @param {shaka.dash.DashParser.
|
|
257
|
-
* requestInitSegment
|
|
270
|
+
* @param {shaka.dash.DashParser.RequestSegmentCallback} requestSegment
|
|
258
271
|
* @param {shaka.media.InitSegmentReference} init
|
|
259
272
|
* @param {shaka.dash.SegmentTemplate.SegmentTemplateInfo} info
|
|
260
273
|
* @return {!Promise.<shaka.media.SegmentIndex>}
|
|
261
274
|
* @private
|
|
262
275
|
*/
|
|
263
276
|
static generateSegmentIndexFromIndexTemplate_(
|
|
264
|
-
context,
|
|
277
|
+
context, requestSegment, init, info) {
|
|
265
278
|
const MpdUtils = shaka.dash.MpdUtils;
|
|
266
279
|
const ManifestParserUtils = shaka.util.ManifestParserUtils;
|
|
267
280
|
|
|
@@ -274,7 +287,7 @@ shaka.dash.SegmentTemplate = class {
|
|
|
274
287
|
context.representation.baseUris, [filledTemplate]);
|
|
275
288
|
|
|
276
289
|
return shaka.dash.SegmentBase.generateSegmentIndexFromUris(
|
|
277
|
-
context,
|
|
290
|
+
context, requestSegment, init, resolvedUris, 0, null,
|
|
278
291
|
info.scaledPresentationTimeOffset);
|
|
279
292
|
}
|
|
280
293
|
|
|
@@ -599,6 +612,311 @@ shaka.dash.SegmentTemplate = class {
|
|
|
599
612
|
}
|
|
600
613
|
};
|
|
601
614
|
|
|
615
|
+
|
|
616
|
+
/**
|
|
617
|
+
* A SegmentIndex that returns segments references on demand from
|
|
618
|
+
* a segment timeline.
|
|
619
|
+
*
|
|
620
|
+
* @extends shaka.media.SegmentIndex
|
|
621
|
+
* @implements {shaka.util.IReleasable}
|
|
622
|
+
* @implements {Iterable.<!shaka.media.SegmentReference>}
|
|
623
|
+
*
|
|
624
|
+
* @private
|
|
625
|
+
*
|
|
626
|
+
*/
|
|
627
|
+
shaka.dash.TimelineSegmentIndex = class extends shaka.media.SegmentIndex {
|
|
628
|
+
/**
|
|
629
|
+
*
|
|
630
|
+
* @param {!shaka.dash.SegmentTemplate.SegmentTemplateInfo} templateInfo
|
|
631
|
+
* @param {?string} representationId
|
|
632
|
+
* @param {number} bandwidth
|
|
633
|
+
* @param {Array.<string>} baseUris
|
|
634
|
+
* @param {number} periodStart
|
|
635
|
+
* @param {number} periodEnd
|
|
636
|
+
* @param {shaka.media.InitSegmentReference} initSegmentReference
|
|
637
|
+
* @param {boolean} shouldFit
|
|
638
|
+
*
|
|
639
|
+
*/
|
|
640
|
+
constructor(templateInfo, representationId, bandwidth, baseUris,
|
|
641
|
+
periodStart, periodEnd, initSegmentReference, shouldFit) {
|
|
642
|
+
super([]);
|
|
643
|
+
|
|
644
|
+
/** @private {?shaka.dash.SegmentTemplate.SegmentTemplateInfo} */
|
|
645
|
+
this.templateInfo_ = templateInfo;
|
|
646
|
+
/** @private {?string} */
|
|
647
|
+
this.representationId_ = representationId;
|
|
648
|
+
/** @private {number} */
|
|
649
|
+
this.bandwidth_ = bandwidth;
|
|
650
|
+
/** @private {Array.<string>} */
|
|
651
|
+
this.baseUris_ = baseUris;
|
|
652
|
+
/** @private {number} */
|
|
653
|
+
this.periodStart_ = periodStart;
|
|
654
|
+
/** @private {number} */
|
|
655
|
+
this.periodEnd_ = periodEnd;
|
|
656
|
+
/** @private {shaka.media.InitSegmentReference} */
|
|
657
|
+
this.initSegmentReference_ = initSegmentReference;
|
|
658
|
+
|
|
659
|
+
|
|
660
|
+
if (shouldFit) {
|
|
661
|
+
this.fitTimeline();
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
/**
|
|
666
|
+
* @override
|
|
667
|
+
*/
|
|
668
|
+
getNumReferences() {
|
|
669
|
+
if (this.templateInfo_) {
|
|
670
|
+
return this.templateInfo_.timeline.length;
|
|
671
|
+
} else {
|
|
672
|
+
return 0;
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
/**
|
|
677
|
+
* @override
|
|
678
|
+
*/
|
|
679
|
+
release() {
|
|
680
|
+
super.release();
|
|
681
|
+
this.templateInfo_ = null;
|
|
682
|
+
// We cannot release other fields, as segment index can
|
|
683
|
+
// be recreated using only template info.
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
|
|
687
|
+
/**
|
|
688
|
+
* @override
|
|
689
|
+
*/
|
|
690
|
+
evict(time) {
|
|
691
|
+
if (!this.templateInfo_) {
|
|
692
|
+
return;
|
|
693
|
+
}
|
|
694
|
+
shaka.log.debug(`${this.representationId_} Evicting at ${time}`);
|
|
695
|
+
let numToEvict = 0;
|
|
696
|
+
const timeline = this.templateInfo_.timeline;
|
|
697
|
+
|
|
698
|
+
for (let i = 0; i < timeline.length; i += 1) {
|
|
699
|
+
const range = timeline[i];
|
|
700
|
+
const end = range.end + this.periodStart_;
|
|
701
|
+
const start = range.start + this.periodStart_;
|
|
702
|
+
|
|
703
|
+
if (end <= time) {
|
|
704
|
+
shaka.log.debug(`Evicting ${start} - ${end}`);
|
|
705
|
+
numToEvict += 1;
|
|
706
|
+
} else {
|
|
707
|
+
break;
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
if (numToEvict > 0) {
|
|
712
|
+
this.templateInfo_.timeline = timeline.slice(numToEvict);
|
|
713
|
+
if (this.references.length >= numToEvict) {
|
|
714
|
+
this.references = this.references.slice(numToEvict);
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
this.numEvicted_ += numToEvict;
|
|
718
|
+
|
|
719
|
+
if (this.getNumReferences() === 0) {
|
|
720
|
+
this.release();
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
/**
|
|
726
|
+
* Merge new template info
|
|
727
|
+
* @param {shaka.dash.SegmentTemplate.SegmentTemplateInfo} info
|
|
728
|
+
* @param {number} periodStart
|
|
729
|
+
* @param {number} periodEnd
|
|
730
|
+
* @param {boolean} shouldFit
|
|
731
|
+
*/
|
|
732
|
+
appendTemplateInfo(info, periodStart, periodEnd, shouldFit) {
|
|
733
|
+
if (!this.templateInfo_) {
|
|
734
|
+
this.templateInfo_ = info;
|
|
735
|
+
this.periodStart_ = periodStart;
|
|
736
|
+
this.periodEnd_ = periodEnd;
|
|
737
|
+
} else {
|
|
738
|
+
const currentTimeline = this.templateInfo_.timeline;
|
|
739
|
+
|
|
740
|
+
// Append timeline
|
|
741
|
+
const lastCurrentEntry = currentTimeline[currentTimeline.length - 1];
|
|
742
|
+
const newEntries = info.timeline.filter((entry) => {
|
|
743
|
+
return entry.start >= lastCurrentEntry.end;
|
|
744
|
+
});
|
|
745
|
+
|
|
746
|
+
if (newEntries.length > 0) {
|
|
747
|
+
shaka.log.debug(`Appending ${newEntries.length} entries`);
|
|
748
|
+
this.templateInfo_.timeline.push(...newEntries);
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
if (this.periodEnd_ !== periodEnd) {
|
|
752
|
+
this.periodEnd_ = periodEnd;
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
if (shouldFit) {
|
|
757
|
+
this.fitTimeline();
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
/**
|
|
762
|
+
*
|
|
763
|
+
* @param {number} time
|
|
764
|
+
*/
|
|
765
|
+
isBeforeFirstEntry(time) {
|
|
766
|
+
const hasTimeline = this.templateInfo_ &&
|
|
767
|
+
this.templateInfo_.timeline && this.templateInfo_.timeline.length;
|
|
768
|
+
|
|
769
|
+
if (hasTimeline) {
|
|
770
|
+
const timeline = this.templateInfo_.timeline;
|
|
771
|
+
return time < timeline[0].start + this.periodStart_;
|
|
772
|
+
} else {
|
|
773
|
+
return false;
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
/**
|
|
778
|
+
* Fit timeline entries to period boundaries
|
|
779
|
+
*/
|
|
780
|
+
fitTimeline() {
|
|
781
|
+
if (this.getIsImmutable()) {
|
|
782
|
+
return;
|
|
783
|
+
}
|
|
784
|
+
const timeline = this.templateInfo_.timeline;
|
|
785
|
+
while (timeline.length) {
|
|
786
|
+
const lastTimePeriod = timeline[timeline.length - 1];
|
|
787
|
+
if (lastTimePeriod.start >= this.periodEnd_) {
|
|
788
|
+
timeline.pop();
|
|
789
|
+
} else {
|
|
790
|
+
break;
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
this.evict(this.periodStart_);
|
|
795
|
+
|
|
796
|
+
if (timeline.length === 0) {
|
|
797
|
+
return;
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
if (this.periodEnd_ !== Infinity) {
|
|
801
|
+
// Adjust the last timeline entry to match the period end
|
|
802
|
+
const lastTimePeriod = timeline[timeline.length - 1];
|
|
803
|
+
// NOTE: end should be relative to period start
|
|
804
|
+
lastTimePeriod.end = this.periodEnd_ - this.periodStart_;
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
/**
|
|
809
|
+
* @override
|
|
810
|
+
*/
|
|
811
|
+
find(time) {
|
|
812
|
+
shaka.log.debug(`Find ${time}`);
|
|
813
|
+
|
|
814
|
+
if (this.isBeforeFirstEntry(time)) {
|
|
815
|
+
return this.numEvicted_;
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
if (!this.templateInfo_) {
|
|
819
|
+
return null;
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
const timeline = this.templateInfo_.timeline;
|
|
823
|
+
|
|
824
|
+
// Early exit if the time isn't within this period
|
|
825
|
+
if (time < this.periodStart_ || time > this.periodEnd_) {
|
|
826
|
+
return null;
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
const lastIndex = timeline.length - 1;
|
|
830
|
+
|
|
831
|
+
for (let i = 0; i < timeline.length; i++) {
|
|
832
|
+
const range = timeline[i];
|
|
833
|
+
const start = range.start + this.periodStart_;
|
|
834
|
+
// A rounding error can cause /time/ to equal e.endTime or fall in between
|
|
835
|
+
// the references by a fraction of a second. To account for this, we use
|
|
836
|
+
// the start of the next segment as /end/, unless this is the last
|
|
837
|
+
// reference, in which case we use the period end as the /end/
|
|
838
|
+
let end = range.end + this.periodStart_;
|
|
839
|
+
|
|
840
|
+
if (i < lastIndex) {
|
|
841
|
+
end = timeline[i + 1].start + this.periodStart_;
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
if ((time >= start) && (time < end)) {
|
|
845
|
+
return i + this.numEvicted_;
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
return null;
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
/**
|
|
853
|
+
* @override
|
|
854
|
+
*/
|
|
855
|
+
get(position) {
|
|
856
|
+
const correctedPosition = position - this.numEvicted_;
|
|
857
|
+
if (correctedPosition < 0 ||
|
|
858
|
+
correctedPosition >= this.getNumReferences() || !this.templateInfo_) {
|
|
859
|
+
return null;
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
let ref = this.references[correctedPosition];
|
|
863
|
+
|
|
864
|
+
if (!ref) {
|
|
865
|
+
const range = this.templateInfo_.timeline[correctedPosition];
|
|
866
|
+
const segmentReplacement = position + this.templateInfo_.startNumber;
|
|
867
|
+
const timeReplacement = this.templateInfo_
|
|
868
|
+
.unscaledPresentationTimeOffset + range.unscaledStart;
|
|
869
|
+
|
|
870
|
+
const createUrisCb = () => {
|
|
871
|
+
return shaka.dash.TimelineSegmentIndex
|
|
872
|
+
.createUris_(
|
|
873
|
+
this.templateInfo_.mediaTemplate,
|
|
874
|
+
this.representationId_,
|
|
875
|
+
segmentReplacement,
|
|
876
|
+
this.bandwidth_,
|
|
877
|
+
timeReplacement,
|
|
878
|
+
this.baseUris_,
|
|
879
|
+
);
|
|
880
|
+
};
|
|
881
|
+
|
|
882
|
+
const timestampOffset = this.periodStart_ -
|
|
883
|
+
this.templateInfo_.scaledPresentationTimeOffset;
|
|
884
|
+
|
|
885
|
+
ref = new shaka.media.SegmentReference(
|
|
886
|
+
this.periodStart_ + range.start,
|
|
887
|
+
this.periodStart_ + range.end,
|
|
888
|
+
createUrisCb,
|
|
889
|
+
/* startByte= */ 0,
|
|
890
|
+
/* endByte= */ null,
|
|
891
|
+
this.initSegmentReference_,
|
|
892
|
+
timestampOffset,
|
|
893
|
+
this.periodStart_,
|
|
894
|
+
this.periodEnd_);
|
|
895
|
+
this.references[correctedPosition] = ref;
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
return ref;
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
/**
|
|
902
|
+
* Fill in a specific template with values to get the segment uris
|
|
903
|
+
*
|
|
904
|
+
* @return {!Array.<string>}
|
|
905
|
+
* @private
|
|
906
|
+
*/
|
|
907
|
+
static createUris_(mediaTemplate, repId, segmentReplacement,
|
|
908
|
+
bandwidth, timeReplacement, baseUris) {
|
|
909
|
+
const mediaUri = shaka.dash.MpdUtils.fillUriTemplate(
|
|
910
|
+
mediaTemplate, repId,
|
|
911
|
+
segmentReplacement, bandwidth || null, timeReplacement);
|
|
912
|
+
return shaka.util.ManifestParserUtils
|
|
913
|
+
.resolveUris(baseUris, [mediaUri])
|
|
914
|
+
.map((g) => {
|
|
915
|
+
return g.toString();
|
|
916
|
+
});
|
|
917
|
+
}
|
|
918
|
+
};
|
|
919
|
+
|
|
602
920
|
/**
|
|
603
921
|
* @typedef {{
|
|
604
922
|
* timescale: number,
|
|
@@ -606,11 +924,10 @@ shaka.dash.SegmentTemplate = class {
|
|
|
606
924
|
* startNumber: number,
|
|
607
925
|
* scaledPresentationTimeOffset: number,
|
|
608
926
|
* unscaledPresentationTimeOffset: number,
|
|
609
|
-
* timeline: Array.<shaka.
|
|
927
|
+
* timeline: Array.<shaka.media.PresentationTimeline.TimeRange>,
|
|
610
928
|
* mediaTemplate: ?string,
|
|
611
929
|
* indexTemplate: ?string
|
|
612
930
|
* }}
|
|
613
|
-
* @private
|
|
614
931
|
*
|
|
615
932
|
* @description
|
|
616
933
|
* Contains information about a SegmentTemplate.
|
|
@@ -625,7 +942,7 @@ shaka.dash.SegmentTemplate = class {
|
|
|
625
942
|
* The presentation time offset of the representation, in seconds.
|
|
626
943
|
* @property {number} unscaledPresentationTimeOffset
|
|
627
944
|
* The presentation time offset of the representation, in timescale units.
|
|
628
|
-
* @property {Array.<shaka.
|
|
945
|
+
* @property {Array.<shaka.media.PresentationTimeline.TimeRange>} timeline
|
|
629
946
|
* The timeline of the representation, if given. Times in seconds.
|
|
630
947
|
* @property {?string} mediaTemplate
|
|
631
948
|
* The media URI template, if given.
|
package/lib/dependencies/all.js
CHANGED
|
@@ -41,6 +41,12 @@ shaka.dependencies = class {
|
|
|
41
41
|
return /** @type {?muxjs} */ (shaka.dependencies.dependencies_.get(
|
|
42
42
|
shaka.dependencies.Allowed.muxjs)());
|
|
43
43
|
}
|
|
44
|
+
|
|
45
|
+
/** @return {?ISOBoxer} */
|
|
46
|
+
static isoBoxer() {
|
|
47
|
+
return /** @type {?ISOBoxer} */ (shaka.dependencies.dependencies_.get(
|
|
48
|
+
shaka.dependencies.Allowed.ISOBoxer)());
|
|
49
|
+
}
|
|
44
50
|
};
|
|
45
51
|
|
|
46
52
|
/**
|
|
@@ -49,6 +55,7 @@ shaka.dependencies = class {
|
|
|
49
55
|
*/
|
|
50
56
|
shaka.dependencies.Allowed = {
|
|
51
57
|
muxjs: 'muxjs',
|
|
58
|
+
ISOBoxer: 'ISOBoxer',
|
|
52
59
|
};
|
|
53
60
|
|
|
54
61
|
/**
|
|
@@ -59,4 +66,5 @@ shaka.dependencies.Allowed = {
|
|
|
59
66
|
*/
|
|
60
67
|
shaka.dependencies.dependencies_ = new Map([
|
|
61
68
|
[shaka.dependencies.Allowed.muxjs, () => window.muxjs],
|
|
69
|
+
[shaka.dependencies.Allowed.ISOBoxer, () => window.ISOBoxer],
|
|
62
70
|
]);
|