rx-player 4.0.0-dev.2023110700 → 4.0.0-dev.2023120600

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.
Files changed (479) hide show
  1. package/CHANGELOG.md +18 -226
  2. package/FILES.md +1 -1
  3. package/VERSION +1 -1
  4. package/dist/_esm5.processed/compat/add_text_track.d.ts +1 -3
  5. package/dist/_esm5.processed/compat/add_text_track.js +4 -7
  6. package/dist/_esm5.processed/compat/browser_compatibility_types.d.ts +0 -7
  7. package/dist/_esm5.processed/compat/event_listeners.d.ts +2 -15
  8. package/dist/_esm5.processed/compat/event_listeners.js +2 -37
  9. package/dist/_esm5.processed/compat/index.d.ts +1 -3
  10. package/dist/_esm5.processed/compat/index.js +1 -3
  11. package/dist/_esm5.processed/config.d.ts +9 -21
  12. package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.d.ts +0 -58
  13. package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.js +14 -54
  14. package/dist/_esm5.processed/core/adaptive/utils/select_optimal_representation.d.ts +2 -8
  15. package/dist/_esm5.processed/core/adaptive/utils/select_optimal_representation.js +2 -11
  16. package/dist/_esm5.processed/core/api/debug/buffer_graph.js +2 -6
  17. package/dist/_esm5.processed/core/api/debug/modules/general_info.js +13 -32
  18. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.js +3 -3
  19. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.js +1 -1
  20. package/dist/_esm5.processed/core/api/option_utils.d.ts +14 -35
  21. package/dist/_esm5.processed/core/api/option_utils.js +47 -230
  22. package/dist/_esm5.processed/core/api/public_api.d.ts +92 -266
  23. package/dist/_esm5.processed/core/api/public_api.js +451 -807
  24. package/dist/_esm5.processed/core/{segment_buffers/implementations/image → api/track_management}/index.d.ts +3 -2
  25. package/dist/_esm5.processed/core/{segment_buffers/implementations/image → api/track_management}/index.js +3 -2
  26. package/dist/_esm5.processed/core/api/{tracks_management/media_element_track_choice_manager.d.ts → track_management/media_element_tracks_store.d.ts} +15 -75
  27. package/dist/_esm5.processed/core/api/{tracks_management/media_element_track_choice_manager.js → track_management/media_element_tracks_store.js} +74 -193
  28. package/dist/_esm5.processed/core/api/track_management/track_dispatcher.d.ts +84 -0
  29. package/dist/_esm5.processed/core/api/track_management/track_dispatcher.js +158 -0
  30. package/dist/_esm5.processed/core/api/track_management/tracks_store.d.ts +406 -0
  31. package/dist/_esm5.processed/core/api/track_management/tracks_store.js +932 -0
  32. package/dist/_esm5.processed/core/api/utils.d.ts +1 -0
  33. package/dist/_esm5.processed/core/api/utils.js +28 -11
  34. package/dist/_esm5.processed/core/decrypt/content_decryptor.js +3 -3
  35. package/dist/_esm5.processed/core/decrypt/find_key_system.js +83 -71
  36. package/dist/_esm5.processed/core/decrypt/get_media_keys.js +6 -5
  37. package/dist/_esm5.processed/core/decrypt/session_events_listener.js +10 -72
  38. package/dist/_esm5.processed/core/decrypt/utils/persistent_sessions_store.d.ts +4 -4
  39. package/dist/_esm5.processed/core/decrypt/utils/persistent_sessions_store.js +6 -4
  40. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.d.ts +1 -3
  41. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +7 -26
  42. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +3 -9
  43. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +16 -9
  44. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.d.ts +1 -3
  45. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +1 -1
  46. package/dist/_esm5.processed/core/fetchers/utils/schedule_request.d.ts +1 -6
  47. package/dist/_esm5.processed/core/fetchers/utils/schedule_request.js +4 -41
  48. package/dist/_esm5.processed/core/init/directfile_content_initializer.js +1 -1
  49. package/dist/_esm5.processed/core/init/media_source_content_initializer.d.ts +1 -8
  50. package/dist/_esm5.processed/core/init/media_source_content_initializer.js +5 -19
  51. package/dist/_esm5.processed/core/init/types.d.ts +5 -15
  52. package/dist/_esm5.processed/core/init/utils/rebuffering_controller.d.ts +2 -36
  53. package/dist/_esm5.processed/core/init/utils/rebuffering_controller.js +2 -82
  54. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/text_track_cues_store.js +54 -6
  55. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/utils.d.ts +2 -1
  56. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/utils.js +19 -2
  57. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +1 -2
  58. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +2 -3
  59. package/dist/_esm5.processed/core/segment_buffers/implementations/types.d.ts +2 -2
  60. package/dist/_esm5.processed/core/segment_buffers/index.d.ts +2 -2
  61. package/dist/_esm5.processed/core/segment_buffers/index.js +2 -1
  62. package/dist/_esm5.processed/core/segment_buffers/inventory/index.d.ts +1 -0
  63. package/dist/_esm5.processed/core/segment_buffers/inventory/index.js +1 -0
  64. package/dist/_esm5.processed/core/segment_buffers/inventory/utils.d.ts +33 -0
  65. package/dist/_esm5.processed/core/segment_buffers/inventory/utils.js +49 -0
  66. package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.d.ts +0 -1
  67. package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +2 -16
  68. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +0 -15
  69. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +183 -93
  70. package/dist/_esm5.processed/core/stream/adaptation/get_representations_switch_strategy.d.ts +39 -0
  71. package/dist/_esm5.processed/core/stream/adaptation/get_representations_switch_strategy.js +133 -0
  72. package/dist/_esm5.processed/core/stream/adaptation/types.d.ts +27 -13
  73. package/dist/_esm5.processed/core/stream/index.d.ts +2 -3
  74. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +2 -0
  75. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +5 -7
  76. package/dist/_esm5.processed/core/stream/period/period_stream.js +13 -12
  77. package/dist/_esm5.processed/core/stream/period/types.d.ts +5 -14
  78. package/dist/_esm5.processed/core/stream/period/utils/get_adaptation_switch_strategy.d.ts +2 -4
  79. package/dist/_esm5.processed/core/stream/period/utils/get_adaptation_switch_strategy.js +10 -46
  80. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +29 -23
  81. package/dist/_esm5.processed/core/stream/representation/types.d.ts +11 -1
  82. package/dist/_esm5.processed/default_config.d.ts +35 -98
  83. package/dist/_esm5.processed/default_config.js +36 -113
  84. package/dist/_esm5.processed/errors/custom_loader_error.d.ts +1 -3
  85. package/dist/_esm5.processed/errors/custom_loader_error.js +1 -3
  86. package/dist/_esm5.processed/errors/media_error.js +2 -2
  87. package/dist/_esm5.processed/errors/network_error.d.ts +0 -1
  88. package/dist/_esm5.processed/errors/network_error.js +0 -1
  89. package/dist/_esm5.processed/errors/request_error.d.ts +2 -3
  90. package/dist/_esm5.processed/errors/request_error.js +2 -5
  91. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +3 -3
  92. package/dist/_esm5.processed/features/features_object.js +0 -2
  93. package/dist/_esm5.processed/features/list/directfile.js +2 -5
  94. package/dist/_esm5.processed/features/list/index.d.ts +0 -2
  95. package/dist/_esm5.processed/features/list/index.js +0 -2
  96. package/dist/_esm5.processed/features/types.d.ts +3 -27
  97. package/dist/_esm5.processed/manifest/adaptation.d.ts +9 -11
  98. package/dist/_esm5.processed/manifest/adaptation.js +41 -30
  99. package/dist/_esm5.processed/manifest/index.d.ts +3 -4
  100. package/dist/_esm5.processed/manifest/manifest.d.ts +5 -54
  101. package/dist/_esm5.processed/manifest/manifest.js +5 -110
  102. package/dist/_esm5.processed/manifest/period.d.ts +4 -5
  103. package/dist/_esm5.processed/manifest/representation.d.ts +10 -5
  104. package/dist/_esm5.processed/manifest/representation.js +33 -10
  105. package/dist/_esm5.processed/manifest/representation_index/index.d.ts +2 -2
  106. package/dist/_esm5.processed/manifest/representation_index/static.d.ts +2 -0
  107. package/dist/_esm5.processed/manifest/representation_index/static.js +6 -0
  108. package/dist/_esm5.processed/manifest/representation_index/types.d.ts +42 -21
  109. package/dist/_esm5.processed/manifest/types.d.ts +0 -2
  110. package/dist/_esm5.processed/parsers/manifest/dash/common/convert_supplemental_codecs.d.ts +17 -0
  111. package/dist/_esm5.processed/parsers/manifest/dash/common/convert_supplemental_codecs.js +26 -0
  112. package/dist/_esm5.processed/parsers/manifest/dash/common/flatten_overlapping_periods.js +5 -0
  113. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +17 -31
  114. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.js +26 -19
  115. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.d.ts +2 -0
  116. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.js +7 -1
  117. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +2 -6
  118. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +11 -8
  119. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +2 -0
  120. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +6 -0
  121. package/dist/_esm5.processed/parsers/manifest/dash/common/infer_adaptation_type.d.ts +2 -2
  122. package/dist/_esm5.processed/parsers/manifest/dash/common/infer_adaptation_type.js +1 -6
  123. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +3 -5
  124. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.d.ts +0 -2
  125. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +1 -1
  126. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.js +2 -2
  127. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.d.ts +0 -2
  128. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.js +2 -2
  129. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +29 -17
  130. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.js +13 -6
  131. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/Representation.js +7 -2
  132. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/utils.d.ts +10 -1
  133. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/utils.js +18 -2
  134. package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +6 -4
  135. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.js +7 -6
  136. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/Representation.js +5 -2
  137. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/types.d.ts +2 -1
  138. package/dist/_esm5.processed/parsers/manifest/local/representation_index.d.ts +2 -0
  139. package/dist/_esm5.processed/parsers/manifest/local/representation_index.js +6 -0
  140. package/dist/_esm5.processed/parsers/manifest/metaplaylist/metaplaylist_parser.js +6 -6
  141. package/dist/_esm5.processed/parsers/manifest/metaplaylist/representation_index.d.ts +12 -3
  142. package/dist/_esm5.processed/parsers/manifest/metaplaylist/representation_index.js +11 -2
  143. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.d.ts +0 -1
  144. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +11 -17
  145. package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.d.ts +21 -83
  146. package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.js +53 -125
  147. package/dist/_esm5.processed/parsers/manifest/smooth/shared_smooth_segment_timeline.d.ts +119 -0
  148. package/dist/_esm5.processed/parsers/manifest/smooth/shared_smooth_segment_timeline.js +159 -0
  149. package/dist/_esm5.processed/parsers/manifest/smooth/utils/add_segment_infos.d.ts +3 -6
  150. package/dist/_esm5.processed/parsers/manifest/smooth/utils/add_segment_infos.js +4 -4
  151. package/dist/_esm5.processed/parsers/manifest/types.d.ts +4 -3
  152. package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_extent.js +1 -8
  153. package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_origin.js +1 -9
  154. package/dist/_esm5.processed/public_types.d.ts +396 -308
  155. package/dist/_esm5.processed/tools/TextTrackRenderer/text_track_renderer.d.ts +5 -4
  156. package/dist/_esm5.processed/tools/TextTrackRenderer/text_track_renderer.js +5 -4
  157. package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +4 -4
  158. package/dist/_esm5.processed/transports/dash/manifest_parser.js +2 -3
  159. package/dist/_esm5.processed/transports/dash/pipelines.js +1 -4
  160. package/dist/_esm5.processed/transports/dash/segment_loader.d.ts +2 -2
  161. package/dist/_esm5.processed/transports/dash/segment_loader.js +26 -20
  162. package/dist/_esm5.processed/transports/dash/segment_parser.js +19 -24
  163. package/dist/_esm5.processed/transports/dash/text_loader.js +5 -5
  164. package/dist/_esm5.processed/transports/dash/text_parser.js +28 -33
  165. package/dist/_esm5.processed/transports/local/pipelines.js +1 -10
  166. package/dist/_esm5.processed/transports/local/segment_loader.js +2 -2
  167. package/dist/_esm5.processed/transports/local/segment_parser.d.ts +1 -1
  168. package/dist/_esm5.processed/transports/local/segment_parser.js +10 -10
  169. package/dist/_esm5.processed/transports/local/text_parser.d.ts +2 -2
  170. package/dist/_esm5.processed/transports/local/text_parser.js +23 -23
  171. package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +34 -52
  172. package/dist/_esm5.processed/{utils/list_to_map.d.ts → transports/smooth/is_mp4_embedded_track.d.ts} +5 -5
  173. package/dist/_esm5.processed/{features/list/image_buffer.d.ts → transports/smooth/is_mp4_embedded_track.js} +7 -6
  174. package/dist/_esm5.processed/transports/smooth/pipelines.js +33 -190
  175. package/dist/_esm5.processed/transports/smooth/segment_loader.d.ts +1 -1
  176. package/dist/_esm5.processed/transports/smooth/segment_loader.js +28 -22
  177. package/dist/_esm5.processed/transports/smooth/utils.d.ts +1 -26
  178. package/dist/_esm5.processed/transports/smooth/utils.js +1 -55
  179. package/dist/_esm5.processed/transports/types.d.ts +94 -89
  180. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +3 -3
  181. package/dist/_esm5.processed/transports/utils/infer_segment_container.d.ts +3 -3
  182. package/dist/_esm5.processed/transports/utils/infer_segment_container.js +5 -7
  183. package/dist/_esm5.processed/transports/utils/parse_text_track.d.ts +8 -12
  184. package/dist/_esm5.processed/transports/utils/parse_text_track.js +19 -21
  185. package/dist/_esm5.processed/utils/array_includes.d.ts +2 -1
  186. package/dist/_esm5.processed/utils/array_includes.js +30 -28
  187. package/dist/_esm5.processed/utils/request/xhr.js +5 -5
  188. package/dist/commonjs/compat/is_codec_supported.js +22 -1
  189. package/dist/commonjs/compat/patch_webkit_source_buffer.js +2 -2
  190. package/dist/commonjs/config.d.ts +1 -0
  191. package/dist/commonjs/core/api/debug/buffer_graph.js +2 -6
  192. package/dist/commonjs/core/api/debug/modules/general_info.js +17 -10
  193. package/dist/commonjs/core/api/option_utils.d.ts +4 -0
  194. package/dist/commonjs/core/api/option_utils.js +8 -3
  195. package/dist/commonjs/core/api/public_api.d.ts +11 -1
  196. package/dist/commonjs/core/api/public_api.js +46 -11
  197. package/dist/commonjs/core/fetchers/manifest/manifest_fetcher.d.ts +6 -0
  198. package/dist/commonjs/core/fetchers/manifest/manifest_fetcher.js +11 -3
  199. package/dist/commonjs/core/fetchers/segment/segment_fetcher.d.ts +8 -1
  200. package/dist/commonjs/core/fetchers/segment/segment_fetcher.js +8 -4
  201. package/dist/commonjs/core/fetchers/segment/segment_fetcher_creator.d.ts +1 -0
  202. package/dist/commonjs/core/fetchers/utils/schedule_request.js +1 -1
  203. package/dist/commonjs/core/init/directfile_content_initializer.js +24 -7
  204. package/dist/commonjs/core/init/media_source_content_initializer.d.ts +6 -0
  205. package/dist/commonjs/core/init/media_source_content_initializer.js +4 -6
  206. package/dist/commonjs/core/init/utils/content_time_boundaries_observer.d.ts +13 -12
  207. package/dist/commonjs/core/init/utils/content_time_boundaries_observer.js +16 -17
  208. package/dist/commonjs/core/init/utils/get_initial_time.d.ts +17 -3
  209. package/dist/commonjs/core/init/utils/get_initial_time.js +9 -7
  210. package/dist/commonjs/core/segment_buffers/implementations/text/html/text_track_cues_store.js +54 -6
  211. package/dist/commonjs/core/segment_buffers/implementations/text/html/utils.d.ts +2 -1
  212. package/dist/commonjs/core/segment_buffers/implementations/text/html/utils.js +19 -2
  213. package/dist/commonjs/core/stream/adaptation/adaptation_stream.js +2 -2
  214. package/dist/commonjs/core/stream/orchestrator/stream_orchestrator.js +3 -3
  215. package/dist/commonjs/core/stream/period/period_stream.js +2 -2
  216. package/dist/commonjs/core/stream/representation/utils/get_buffer_status.js +3 -3
  217. package/dist/commonjs/core/stream/representation/utils/get_needed_segments.js +1 -1
  218. package/dist/commonjs/default_config.d.ts +5 -0
  219. package/dist/commonjs/default_config.js +5 -0
  220. package/dist/commonjs/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +3 -1
  221. package/dist/commonjs/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +2 -0
  222. package/dist/commonjs/manifest/representation.js +18 -5
  223. package/dist/commonjs/manifest/representation_index/static.d.ts +1 -1
  224. package/dist/commonjs/manifest/representation_index/static.js +2 -2
  225. package/dist/commonjs/manifest/representation_index/types.d.ts +4 -4
  226. package/dist/commonjs/parsers/manifest/dash/common/convert_supplemental_codecs.d.ts +17 -0
  227. package/dist/commonjs/parsers/manifest/dash/common/convert_supplemental_codecs.js +30 -0
  228. package/dist/commonjs/parsers/manifest/dash/common/flatten_overlapping_periods.js +5 -0
  229. package/dist/commonjs/parsers/manifest/dash/common/indexes/base.d.ts +6 -1
  230. package/dist/commonjs/parsers/manifest/dash/common/indexes/base.js +4 -3
  231. package/dist/commonjs/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +5 -2
  232. package/dist/commonjs/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +15 -4
  233. package/dist/commonjs/parsers/manifest/dash/common/indexes/index.d.ts +5 -5
  234. package/dist/commonjs/parsers/manifest/dash/common/indexes/list.d.ts +1 -1
  235. package/dist/commonjs/parsers/manifest/dash/common/indexes/list.js +2 -2
  236. package/dist/commonjs/parsers/manifest/dash/common/indexes/template.d.ts +12 -5
  237. package/dist/commonjs/parsers/manifest/dash/common/indexes/template.js +42 -29
  238. package/dist/commonjs/parsers/manifest/dash/common/indexes/timeline/index.d.ts +2 -1
  239. package/dist/commonjs/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +99 -6
  240. package/dist/commonjs/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +250 -51
  241. package/dist/commonjs/parsers/manifest/dash/common/manifest_bounds_calculator.d.ts +40 -17
  242. package/dist/commonjs/parsers/manifest/dash/common/manifest_bounds_calculator.js +38 -18
  243. package/dist/commonjs/parsers/manifest/dash/common/parse_adaptation_sets.js +13 -10
  244. package/dist/commonjs/parsers/manifest/dash/common/parse_mpd.js +27 -14
  245. package/dist/commonjs/parsers/manifest/dash/common/parse_periods.d.ts +1 -1
  246. package/dist/commonjs/parsers/manifest/dash/common/parse_periods.js +17 -18
  247. package/dist/commonjs/parsers/manifest/dash/common/parse_representation_index.d.ts +19 -6
  248. package/dist/commonjs/parsers/manifest/dash/common/parse_representation_index.js +21 -8
  249. package/dist/commonjs/parsers/manifest/dash/common/parse_representations.js +36 -20
  250. package/dist/commonjs/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.js +3 -0
  251. package/dist/commonjs/parsers/manifest/dash/js-parser/node_parsers/Representation.js +3 -0
  252. package/dist/commonjs/parsers/manifest/dash/node_parser_types.d.ts +2 -0
  253. package/dist/commonjs/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.js +4 -0
  254. package/dist/commonjs/parsers/manifest/dash/wasm-parser/ts/generators/Representation.js +4 -0
  255. package/dist/commonjs/parsers/manifest/dash/wasm-parser/ts/types.d.ts +2 -1
  256. package/dist/commonjs/parsers/manifest/local/representation_index.d.ts +1 -1
  257. package/dist/commonjs/parsers/manifest/local/representation_index.js +3 -3
  258. package/dist/commonjs/parsers/manifest/metaplaylist/representation_index.d.ts +1 -1
  259. package/dist/commonjs/parsers/manifest/metaplaylist/representation_index.js +2 -2
  260. package/dist/commonjs/parsers/manifest/smooth/representation_index.d.ts +5 -5
  261. package/dist/commonjs/parsers/manifest/smooth/representation_index.js +25 -9
  262. package/dist/commonjs/parsers/manifest/types.d.ts +1 -0
  263. package/dist/commonjs/parsers/manifest/utils/index_helpers.js +1 -1
  264. package/dist/commonjs/public_types.d.ts +78 -34
  265. package/dist/commonjs/transports/dash/init_segment_loader.js +10 -5
  266. package/dist/commonjs/transports/dash/manifest_parser.js +5 -2
  267. package/dist/commonjs/transports/dash/segment_loader.js +2 -1
  268. package/dist/commonjs/transports/dash/text_loader.js +2 -0
  269. package/dist/commonjs/transports/metaplaylist/manifest_loader.js +2 -1
  270. package/dist/commonjs/transports/metaplaylist/pipelines.js +4 -1
  271. package/dist/commonjs/transports/smooth/pipelines.js +4 -2
  272. package/dist/commonjs/transports/smooth/segment_loader.js +2 -1
  273. package/dist/commonjs/transports/types.d.ts +12 -0
  274. package/dist/commonjs/transports/utils/generate_manifest_loader.js +6 -3
  275. package/dist/commonjs/utils/queue_microtask.d.ts +2 -0
  276. package/dist/commonjs/utils/queue_microtask.js +7 -0
  277. package/dist/commonjs/utils/request/fetch.d.ts +6 -0
  278. package/dist/commonjs/utils/request/fetch.js +29 -8
  279. package/dist/commonjs/utils/request/xhr.d.ts +11 -5
  280. package/dist/commonjs/utils/request/xhr.js +29 -8
  281. package/dist/es2017/compat/is_codec_supported.js +22 -1
  282. package/dist/es2017/compat/patch_webkit_source_buffer.js +2 -2
  283. package/dist/es2017/config.d.ts +1 -0
  284. package/dist/es2017/core/api/debug/buffer_graph.js +2 -6
  285. package/dist/es2017/core/api/debug/modules/general_info.js +17 -10
  286. package/dist/es2017/core/api/option_utils.d.ts +4 -0
  287. package/dist/es2017/core/api/option_utils.js +8 -3
  288. package/dist/es2017/core/api/public_api.d.ts +11 -1
  289. package/dist/es2017/core/api/public_api.js +44 -9
  290. package/dist/es2017/core/fetchers/manifest/manifest_fetcher.d.ts +6 -0
  291. package/dist/es2017/core/fetchers/manifest/manifest_fetcher.js +11 -3
  292. package/dist/es2017/core/fetchers/segment/segment_fetcher.d.ts +8 -1
  293. package/dist/es2017/core/fetchers/segment/segment_fetcher.js +8 -4
  294. package/dist/es2017/core/fetchers/segment/segment_fetcher_creator.d.ts +1 -0
  295. package/dist/es2017/core/fetchers/utils/schedule_request.js +1 -1
  296. package/dist/es2017/core/init/directfile_content_initializer.js +24 -7
  297. package/dist/es2017/core/init/media_source_content_initializer.d.ts +6 -0
  298. package/dist/es2017/core/init/media_source_content_initializer.js +4 -6
  299. package/dist/es2017/core/init/utils/content_time_boundaries_observer.d.ts +13 -12
  300. package/dist/es2017/core/init/utils/content_time_boundaries_observer.js +16 -15
  301. package/dist/es2017/core/init/utils/get_initial_time.d.ts +17 -3
  302. package/dist/es2017/core/init/utils/get_initial_time.js +9 -7
  303. package/dist/es2017/core/segment_buffers/implementations/text/html/text_track_cues_store.js +54 -6
  304. package/dist/es2017/core/segment_buffers/implementations/text/html/utils.d.ts +2 -1
  305. package/dist/es2017/core/segment_buffers/implementations/text/html/utils.js +18 -2
  306. package/dist/es2017/core/stream/adaptation/adaptation_stream.js +2 -2
  307. package/dist/es2017/core/stream/orchestrator/stream_orchestrator.js +3 -3
  308. package/dist/es2017/core/stream/period/period_stream.js +2 -2
  309. package/dist/es2017/core/stream/representation/utils/get_buffer_status.js +3 -3
  310. package/dist/es2017/core/stream/representation/utils/get_needed_segments.js +1 -1
  311. package/dist/es2017/default_config.d.ts +5 -0
  312. package/dist/es2017/default_config.js +5 -0
  313. package/dist/es2017/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +3 -1
  314. package/dist/es2017/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +2 -0
  315. package/dist/es2017/manifest/representation.js +18 -5
  316. package/dist/es2017/manifest/representation_index/static.d.ts +1 -1
  317. package/dist/es2017/manifest/representation_index/static.js +2 -2
  318. package/dist/es2017/manifest/representation_index/types.d.ts +4 -4
  319. package/dist/es2017/parsers/manifest/dash/common/convert_supplemental_codecs.d.ts +17 -0
  320. package/dist/es2017/parsers/manifest/dash/common/convert_supplemental_codecs.js +26 -0
  321. package/dist/es2017/parsers/manifest/dash/common/flatten_overlapping_periods.js +5 -0
  322. package/dist/es2017/parsers/manifest/dash/common/indexes/base.d.ts +6 -1
  323. package/dist/es2017/parsers/manifest/dash/common/indexes/base.js +4 -3
  324. package/dist/es2017/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +5 -2
  325. package/dist/es2017/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +15 -4
  326. package/dist/es2017/parsers/manifest/dash/common/indexes/index.d.ts +5 -5
  327. package/dist/es2017/parsers/manifest/dash/common/indexes/list.d.ts +1 -1
  328. package/dist/es2017/parsers/manifest/dash/common/indexes/list.js +2 -2
  329. package/dist/es2017/parsers/manifest/dash/common/indexes/template.d.ts +12 -5
  330. package/dist/es2017/parsers/manifest/dash/common/indexes/template.js +40 -27
  331. package/dist/es2017/parsers/manifest/dash/common/indexes/timeline/index.d.ts +2 -1
  332. package/dist/es2017/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +99 -6
  333. package/dist/es2017/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +246 -51
  334. package/dist/es2017/parsers/manifest/dash/common/manifest_bounds_calculator.d.ts +40 -17
  335. package/dist/es2017/parsers/manifest/dash/common/manifest_bounds_calculator.js +38 -18
  336. package/dist/es2017/parsers/manifest/dash/common/parse_adaptation_sets.js +11 -8
  337. package/dist/es2017/parsers/manifest/dash/common/parse_mpd.js +27 -13
  338. package/dist/es2017/parsers/manifest/dash/common/parse_periods.d.ts +1 -1
  339. package/dist/es2017/parsers/manifest/dash/common/parse_periods.js +13 -16
  340. package/dist/es2017/parsers/manifest/dash/common/parse_representation_index.d.ts +19 -6
  341. package/dist/es2017/parsers/manifest/dash/common/parse_representation_index.js +10 -8
  342. package/dist/es2017/parsers/manifest/dash/common/parse_representations.js +36 -20
  343. package/dist/es2017/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.js +3 -0
  344. package/dist/es2017/parsers/manifest/dash/js-parser/node_parsers/Representation.js +3 -0
  345. package/dist/es2017/parsers/manifest/dash/node_parser_types.d.ts +2 -0
  346. package/dist/es2017/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.js +4 -0
  347. package/dist/es2017/parsers/manifest/dash/wasm-parser/ts/generators/Representation.js +4 -0
  348. package/dist/es2017/parsers/manifest/dash/wasm-parser/ts/types.d.ts +2 -1
  349. package/dist/es2017/parsers/manifest/local/representation_index.d.ts +1 -1
  350. package/dist/es2017/parsers/manifest/local/representation_index.js +3 -3
  351. package/dist/es2017/parsers/manifest/metaplaylist/representation_index.d.ts +1 -1
  352. package/dist/es2017/parsers/manifest/metaplaylist/representation_index.js +2 -2
  353. package/dist/es2017/parsers/manifest/smooth/representation_index.d.ts +5 -5
  354. package/dist/es2017/parsers/manifest/smooth/representation_index.js +25 -9
  355. package/dist/es2017/parsers/manifest/types.d.ts +1 -0
  356. package/dist/es2017/parsers/manifest/utils/index_helpers.js +1 -1
  357. package/dist/es2017/public_types.d.ts +78 -34
  358. package/dist/es2017/transports/dash/init_segment_loader.js +5 -0
  359. package/dist/es2017/transports/dash/manifest_parser.js +3 -0
  360. package/dist/es2017/transports/dash/segment_loader.js +1 -0
  361. package/dist/es2017/transports/dash/text_loader.js +2 -0
  362. package/dist/es2017/transports/metaplaylist/manifest_loader.js +1 -0
  363. package/dist/es2017/transports/metaplaylist/pipelines.js +4 -1
  364. package/dist/es2017/transports/smooth/pipelines.js +2 -0
  365. package/dist/es2017/transports/smooth/segment_loader.js +1 -0
  366. package/dist/es2017/transports/types.d.ts +12 -0
  367. package/dist/es2017/transports/utils/generate_manifest_loader.js +3 -0
  368. package/dist/es2017/utils/queue_microtask.d.ts +2 -0
  369. package/dist/es2017/utils/queue_microtask.js +5 -0
  370. package/dist/es2017/utils/request/fetch.d.ts +6 -0
  371. package/dist/es2017/utils/request/fetch.js +29 -8
  372. package/dist/es2017/utils/request/xhr.d.ts +11 -5
  373. package/dist/es2017/utils/request/xhr.js +30 -9
  374. package/dist/mpd-parser.wasm +0 -0
  375. package/dist/rx-player.js +900 -492
  376. package/dist/rx-player.min.js +1 -1
  377. package/package.json +3 -7
  378. package/scripts/update-version +2 -0
  379. package/sonar-project.properties +1 -1
  380. package/src/compat/is_codec_supported.ts +23 -1
  381. package/src/compat/patch_webkit_source_buffer.ts +2 -2
  382. package/src/core/api/debug/buffer_graph.ts +2 -5
  383. package/src/core/api/debug/modules/general_info.ts +15 -10
  384. package/src/core/api/option_utils.ts +11 -3
  385. package/src/core/api/public_api.ts +48 -8
  386. package/src/core/fetchers/manifest/manifest_fetcher.ts +21 -3
  387. package/src/core/fetchers/segment/segment_fetcher.ts +19 -5
  388. package/src/core/fetchers/segment/segment_fetcher_creator.ts +1 -0
  389. package/src/core/fetchers/utils/schedule_request.ts +1 -1
  390. package/src/core/init/directfile_content_initializer.ts +23 -7
  391. package/src/core/init/media_source_content_initializer.ts +13 -7
  392. package/src/core/init/utils/content_time_boundaries_observer.ts +23 -22
  393. package/src/core/init/utils/get_initial_time.ts +25 -12
  394. package/src/core/segment_buffers/implementations/text/html/__tests__/utils.test.ts +15 -0
  395. package/src/core/segment_buffers/implementations/text/html/text_track_cues_store.ts +57 -6
  396. package/src/core/segment_buffers/implementations/text/html/utils.ts +19 -2
  397. package/src/core/stream/adaptation/adaptation_stream.ts +2 -2
  398. package/src/core/stream/orchestrator/stream_orchestrator.ts +3 -3
  399. package/src/core/stream/period/period_stream.ts +2 -2
  400. package/src/core/stream/representation/utils/get_buffer_status.ts +3 -3
  401. package/src/core/stream/representation/utils/get_needed_segments.ts +2 -2
  402. package/src/default_config.ts +5 -0
  403. package/src/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.ts +3 -1
  404. package/src/experimental/tools/createMetaplaylist/get_duration_from_manifest.ts +2 -0
  405. package/src/manifest/representation.ts +19 -6
  406. package/src/manifest/representation_index/static.ts +2 -2
  407. package/src/manifest/representation_index/types.ts +4 -4
  408. package/src/parsers/manifest/dash/common/__tests__/convert_supplemental_codecs.test.ts +37 -0
  409. package/src/parsers/manifest/dash/common/__tests__/flatten_overlapping_period.test.ts +20 -0
  410. package/src/parsers/manifest/dash/common/__tests__/manifest_bounds_calculator.test.ts +182 -36
  411. package/src/parsers/manifest/dash/common/convert_supplemental_codecs.ts +32 -0
  412. package/src/parsers/manifest/dash/common/flatten_overlapping_periods.ts +5 -0
  413. package/src/parsers/manifest/dash/common/indexes/base.ts +12 -4
  414. package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +19 -5
  415. package/src/parsers/manifest/dash/common/indexes/index.ts +16 -4
  416. package/src/parsers/manifest/dash/common/indexes/list.ts +2 -2
  417. package/src/parsers/manifest/dash/common/indexes/template.ts +52 -31
  418. package/src/parsers/manifest/dash/common/indexes/timeline/index.ts +4 -1
  419. package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +366 -60
  420. package/src/parsers/manifest/dash/common/manifest_bounds_calculator.ts +63 -25
  421. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +10 -4
  422. package/src/parsers/manifest/dash/common/parse_mpd.ts +28 -15
  423. package/src/parsers/manifest/dash/common/parse_periods.ts +12 -17
  424. package/src/parsers/manifest/dash/common/parse_representation_index.ts +50 -26
  425. package/src/parsers/manifest/dash/common/parse_representations.ts +39 -20
  426. package/src/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.ts +4 -0
  427. package/src/parsers/manifest/dash/js-parser/node_parsers/Representation.ts +4 -0
  428. package/src/parsers/manifest/dash/node_parser_types.ts +2 -0
  429. package/src/parsers/manifest/dash/wasm-parser/rs/events.rs +2 -0
  430. package/src/parsers/manifest/dash/wasm-parser/rs/processor/attributes.rs +2 -0
  431. package/src/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.ts +4 -0
  432. package/src/parsers/manifest/dash/wasm-parser/ts/generators/Representation.ts +4 -0
  433. package/src/parsers/manifest/dash/wasm-parser/ts/types.ts +2 -0
  434. package/src/parsers/manifest/local/representation_index.ts +3 -3
  435. package/src/parsers/manifest/metaplaylist/representation_index.ts +2 -2
  436. package/src/parsers/manifest/smooth/representation_index.ts +23 -9
  437. package/src/parsers/manifest/types.ts +2 -0
  438. package/src/parsers/manifest/utils/__tests__/get_first_time_from_adaptations.test.ts +1 -1
  439. package/src/parsers/manifest/utils/__tests__/get_last_time_from_adaptation.test.ts +1 -1
  440. package/src/parsers/manifest/utils/index_helpers.ts +1 -1
  441. package/src/public_types.ts +79 -34
  442. package/src/transports/dash/init_segment_loader.ts +5 -0
  443. package/src/transports/dash/manifest_parser.ts +6 -0
  444. package/src/transports/dash/segment_loader.ts +1 -0
  445. package/src/transports/dash/text_loader.ts +2 -0
  446. package/src/transports/metaplaylist/manifest_loader.ts +1 -0
  447. package/src/transports/metaplaylist/pipelines.ts +4 -1
  448. package/src/transports/smooth/pipelines.ts +2 -0
  449. package/src/transports/smooth/segment_loader.ts +1 -0
  450. package/src/transports/types.ts +12 -0
  451. package/src/transports/utils/generate_manifest_loader.ts +3 -0
  452. package/src/utils/queue_microtask.ts +7 -0
  453. package/src/utils/request/fetch.ts +35 -8
  454. package/src/utils/request/xhr.ts +45 -14
  455. package/dist/_esm5.processed/compat/fullscreen.d.ts +0 -32
  456. package/dist/_esm5.processed/compat/fullscreen.js +0 -78
  457. package/dist/_esm5.processed/compat/is_offline.d.ts +0 -39
  458. package/dist/_esm5.processed/compat/is_offline.js +0 -43
  459. package/dist/_esm5.processed/core/api/tracks_management/track_choice_manager.d.ts +0 -258
  460. package/dist/_esm5.processed/core/api/tracks_management/track_choice_manager.js +0 -989
  461. package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.d.ts +0 -75
  462. package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.js +0 -133
  463. package/dist/_esm5.processed/features/list/bif_parser.d.ts +0 -23
  464. package/dist/_esm5.processed/features/list/bif_parser.js +0 -27
  465. package/dist/_esm5.processed/features/list/image_buffer.js +0 -25
  466. package/dist/_esm5.processed/transports/dash/image_pipelines.d.ts +0 -38
  467. package/dist/_esm5.processed/transports/dash/image_pipelines.js +0 -129
  468. package/dist/_esm5.processed/utils/list_to_map.js +0 -28
  469. package/dist/_esm5.processed/utils/simple_set.d.ts +0 -51
  470. package/dist/_esm5.processed/utils/simple_set.js +0 -57
  471. package/dist/_esm5.processed/utils/uniq.d.ts +0 -36
  472. package/dist/_esm5.processed/utils/uniq.js +0 -43
  473. package/dist/commonjs/parsers/manifest/utils/is_segment_still_available.d.ts +0 -29
  474. package/dist/commonjs/parsers/manifest/utils/is_segment_still_available.js +0 -54
  475. package/dist/es2017/parsers/manifest/utils/is_segment_still_available.d.ts +0 -29
  476. package/dist/es2017/parsers/manifest/utils/is_segment_still_available.js +0 -51
  477. package/src/parsers/manifest/utils/is_segment_still_available.ts +0 -58
  478. package/src/typings/next-tick.d.ts +0 -23
  479. package/src/typings/object-assign.d.ts +0 -48
@@ -20,7 +20,6 @@ import assert from "../../../../../../utils/assert";
20
20
  import getMonotonicTimeStamp from "../../../../../../utils/monotonic_timestamp";
21
21
  import clearTimelineFromPosition from "../../../../utils/clear_timeline_from_position";
22
22
  import { checkDiscontinuity, fromIndexTime, getIndexSegmentEnd, toIndexTime, } from "../../../../utils/index_helpers";
23
- import isSegmentStillAvailable from "../../../../utils/is_segment_still_available";
24
23
  import updateSegmentTimeline from "../../../../utils/update_segment_timeline";
25
24
  import getInitSegment from "../get_init_segment";
26
25
  import getSegmentsFromTimeline from "../get_segments_from_timeline";
@@ -29,6 +28,11 @@ import { getSegmentTimeRoundingError } from "../utils";
29
28
  import constructTimelineFromElements from "./construct_timeline_from_elements";
30
29
  // eslint-disable-next-line max-len
31
30
  import constructTimelineFromPreviousTimeline from "./construct_timeline_from_previous_timeline";
31
+ /**
32
+ * `IRepresentationIndex` implementation for a DASH `SegmentTimeline` segment
33
+ * indexing scheme.
34
+ * @class TimelineRepresentationIndex
35
+ */
32
36
  export default class TimelineRepresentationIndex {
33
37
  /**
34
38
  * @param {Object} index
@@ -40,7 +44,7 @@ export default class TimelineRepresentationIndex {
40
44
  throw new Error("The given index is not compatible with a " +
41
45
  "TimelineRepresentationIndex.");
42
46
  }
43
- const { availabilityTimeComplete, manifestBoundsCalculator, isDynamic, isLastPeriod, representationId, representationBitrate, periodStart, periodEnd, isEMSGWhitelisted } = context;
47
+ const { availabilityTimeComplete, availabilityTimeOffset, manifestBoundsCalculator, isDynamic, isLastPeriod, representationId, representationBitrate, periodStart, periodEnd, isEMSGWhitelisted } = context;
44
48
  const timescale = (_a = index.timescale) !== null && _a !== void 0 ? _a : 1;
45
49
  const presentationTimeOffset = index.presentationTimeOffset != null ?
46
50
  index.presentationTimeOffset :
@@ -71,7 +75,26 @@ export default class TimelineRepresentationIndex {
71
75
  const segmentUrlTemplate = index.media === undefined ?
72
76
  null :
73
77
  constructRepresentationUrl(index.media, representationId, representationBitrate);
74
- this._index = { availabilityTimeComplete,
78
+ let actualAvailabilityTimeOffset;
79
+ // Technically, it seems (although it is not clear) that an MPD may contain
80
+ // future segments and it's the job of a player to not request segments later
81
+ // than the time at which they should be available.
82
+ // In practice, we don't do that for various reasons: precision issues,
83
+ // various DASH spec interpretations by packagers and players...
84
+ //
85
+ // So as a compromise, if nothing in the MPD indicates that future segments
86
+ // may be announced (see code below), we will act as if ALL segments in this
87
+ // TimelineRepresentationIndex are requestable
88
+ if (availabilityTimeOffset === undefined &&
89
+ availabilityTimeComplete === undefined) {
90
+ actualAvailabilityTimeOffset = Infinity; // Meaning: we can request
91
+ // everything in the index
92
+ }
93
+ else {
94
+ actualAvailabilityTimeOffset = availabilityTimeOffset !== null && availabilityTimeOffset !== void 0 ? availabilityTimeOffset : 0;
95
+ }
96
+ this._index = { availabilityTimeComplete: availabilityTimeComplete !== null && availabilityTimeComplete !== void 0 ? availabilityTimeComplete : true,
97
+ availabilityTimeOffset: actualAvailabilityTimeOffset,
75
98
  indexRange: index.indexRange,
76
99
  indexTimeOffset,
77
100
  initialization: index.initialization == null ?
@@ -116,7 +139,7 @@ export default class TimelineRepresentationIndex {
116
139
  endNumber,
117
140
  timeline,
118
141
  timescale,
119
- indexTimeOffset }, from, duration, this._isEMSGWhitelisted, this._scaledPeriodEnd);
142
+ indexTimeOffset }, from, duration, this._manifestBoundsCalculator, this._scaledPeriodEnd, this._isEMSGWhitelisted);
120
143
  }
121
144
  /**
122
145
  * Returns true if the index should be refreshed.
@@ -149,13 +172,19 @@ export default class TimelineRepresentationIndex {
149
172
  * @returns {Number|null}
150
173
  */
151
174
  getLastAvailablePosition() {
175
+ var _a;
152
176
  this._refreshTimeline();
153
177
  if (this._index.timeline === null) {
154
178
  this._index.timeline = this._getTimeline();
155
179
  }
156
- const lastTime = TimelineRepresentationIndex.getIndexEnd(this._index.timeline, this._scaledPeriodEnd);
157
- return lastTime === null ? null :
158
- fromIndexTime(lastTime, this._index);
180
+ const lastReqSegInfo = getLastRequestableSegmentInfo(
181
+ // Needed typecast for TypeScript
182
+ this._index, this._manifestBoundsCalculator, this._scaledPeriodEnd);
183
+ if (lastReqSegInfo === null) {
184
+ return null;
185
+ }
186
+ const lastScaledPosition = Math.min(lastReqSegInfo.end, (_a = this._scaledPeriodEnd) !== null && _a !== void 0 ? _a : Infinity);
187
+ return fromIndexTime(lastScaledPosition, this._index);
159
188
  }
160
189
  /**
161
190
  * Returns the absolute end in seconds this RepresentationIndex can reach once
@@ -163,10 +192,20 @@ export default class TimelineRepresentationIndex {
163
192
  * @returns {number|null|undefined}
164
193
  */
165
194
  getEnd() {
166
- if (!this._isDynamic || !this._isLastPeriod) { // @see isFinished
167
- return this.getLastAvailablePosition();
195
+ var _a;
196
+ if (this._isDynamic && !this._isLastPeriod) {
197
+ return undefined;
198
+ }
199
+ this._refreshTimeline();
200
+ if (this._index.timeline === null) {
201
+ this._index.timeline = this._getTimeline();
202
+ }
203
+ if (this._index.timeline.length <= 0) {
204
+ return null;
168
205
  }
169
- return undefined;
206
+ const lastSegment = this._index.timeline[this._index.timeline.length - 1];
207
+ const lastTime = Math.min(getIndexSegmentEnd(lastSegment, null, this._scaledPeriodEnd), (_a = this._scaledPeriodEnd) !== null && _a !== void 0 ? _a : Infinity);
208
+ return fromIndexTime(lastTime, this._index);
170
209
  }
171
210
  /**
172
211
  * Returns:
@@ -180,33 +219,54 @@ export default class TimelineRepresentationIndex {
180
219
  * @returns {boolean|undefined}
181
220
  */
182
221
  awaitSegmentBetween(start, end) {
183
- var _a;
222
+ var _a, _b;
184
223
  assert(start <= end);
185
- if (!this._isDynamic || !this._isLastPeriod) {
186
- return false;
224
+ if (!this._isDynamic) {
225
+ return false; // No segment will be newly available in the future
187
226
  }
188
227
  this._refreshTimeline();
189
228
  if (this._index.timeline === null) {
190
229
  this._index.timeline = this._getTimeline();
191
230
  }
192
- const { timeline, timescale } = this._index;
231
+ const { timescale, timeline } = this._index;
193
232
  const segmentTimeRounding = getSegmentTimeRoundingError(timescale);
194
- const scaledEnd = toIndexTime(end, this._index);
195
- if (timeline.length > 0) {
196
- const lastTimelineElement = timeline[timeline.length - 1];
197
- const lastSegmentEnd = getIndexSegmentEnd(lastTimelineElement, null, this._scaledPeriodEnd);
198
- const roundedEnd = lastSegmentEnd + segmentTimeRounding;
199
- if (roundedEnd >= Math.min(scaledEnd, (_a = this._scaledPeriodEnd) !== null && _a !== void 0 ? _a : Infinity)) {
200
- return false; // already loaded
233
+ const scaledWantedEnd = toIndexTime(end, this._index);
234
+ const lastReqSegInfo = getLastRequestableSegmentInfo(
235
+ // Needed typecast for TypeScript
236
+ this._index, this._manifestBoundsCalculator, this._scaledPeriodEnd);
237
+ if (lastReqSegInfo !== null) {
238
+ const lastReqSegmentEnd = Math.min(lastReqSegInfo.end, (_a = this._scaledPeriodEnd) !== null && _a !== void 0 ? _a : Infinity);
239
+ const roundedReqSegmentEnd = lastReqSegmentEnd + segmentTimeRounding;
240
+ if (roundedReqSegmentEnd >= Math.min(scaledWantedEnd, (_b = this._scaledPeriodEnd) !== null && _b !== void 0 ? _b : Infinity)) {
241
+ return false; // everything up to that point is already requestable
242
+ }
243
+ }
244
+ const scaledWantedStart = toIndexTime(start, this._index);
245
+ if (timeline.length > 0 &&
246
+ lastReqSegInfo !== null &&
247
+ !lastReqSegInfo.isLastOfTimeline) {
248
+ // There are some future segments already anounced in the MPD
249
+ const lastSegment = timeline[timeline.length - 1];
250
+ const lastSegmentEnd = getIndexSegmentEnd(lastSegment, null, this._scaledPeriodEnd);
251
+ const roundedLastSegEnd = lastSegmentEnd + segmentTimeRounding;
252
+ if (scaledWantedStart < roundedLastSegEnd + segmentTimeRounding) {
253
+ return true; // The MPD's timeline already contains one such element,
254
+ // It is just not requestable yet
201
255
  }
202
256
  }
257
+ if (!this._isLastPeriod) {
258
+ // Let's consider - perhaps wrongly, that Periods which aren't the last
259
+ // one have all of their segments announced.
260
+ return false;
261
+ }
203
262
  if (this._scaledPeriodEnd === undefined) {
204
- return (scaledEnd + segmentTimeRounding) > this._scaledPeriodStart ? undefined :
205
- false;
263
+ return (scaledWantedEnd + segmentTimeRounding) > this._scaledPeriodStart ?
264
+ undefined : // There may be future segments at this point
265
+ false; // Before the current Period
206
266
  }
207
- const scaledStart = toIndexTime(start, this._index);
208
- return (scaledStart - segmentTimeRounding) < this._scaledPeriodEnd &&
209
- (scaledEnd + segmentTimeRounding) > this._scaledPeriodStart;
267
+ // `true` if within the boundaries of this Period. `false` otherwise.
268
+ return (scaledWantedStart - segmentTimeRounding) < this._scaledPeriodEnd &&
269
+ (scaledWantedEnd + segmentTimeRounding) > this._scaledPeriodStart;
210
270
  }
211
271
  /**
212
272
  * Returns true if a Segment returned by this index is still considered
@@ -224,8 +284,9 @@ export default class TimelineRepresentationIndex {
224
284
  if (this._index.timeline === null) {
225
285
  this._index.timeline = this._getTimeline();
226
286
  }
227
- const { timeline, timescale, indexTimeOffset } = this._index;
228
- return isSegmentStillAvailable(segment, timeline, timescale, indexTimeOffset);
287
+ return isSegmentStillAvailable(segment,
288
+ // Needed typecast for TypeScript
289
+ this._index, this._manifestBoundsCalculator, this._scaledPeriodEnd);
229
290
  }
230
291
  /**
231
292
  * Checks if the time given is in a discontinuity. That is:
@@ -288,6 +349,8 @@ export default class TimelineRepresentationIndex {
288
349
  if (hasReplaced) {
289
350
  this._index.startNumber = newIndex._index.startNumber;
290
351
  }
352
+ this._index.availabilityTimeOffset = newIndex._index.availabilityTimeOffset;
353
+ this._index.availabilityTimeComplete = newIndex._index.availabilityTimeComplete;
291
354
  this._index.endNumber = newIndex._index.endNumber;
292
355
  this._isDynamic = newIndex._isDynamic;
293
356
  this._scaledPeriodStart = newIndex._scaledPeriodStart;
@@ -296,32 +359,67 @@ export default class TimelineRepresentationIndex {
296
359
  this._isLastPeriod = newIndex._isLastPeriod;
297
360
  }
298
361
  /**
299
- * Returns `true` if this RepresentationIndex currently contains its last
362
+ * Returns `false` if this RepresentationIndex currently contains its last
300
363
  * segment.
301
- * Returns `false` if it's still pending.
364
+ * Returns `true` if it's still pending.
302
365
  * @returns {Boolean}
303
366
  */
304
- isFinished() {
305
- if (!this._isDynamic || !this._isLastPeriod) {
306
- // Either the content is not dynamic, in which case no new segment will
307
- // be generated, either it is but this index is not linked to the current
308
- // last Period in the MPD, in which case it is inferred that it has been
309
- // completely generated. Note that this second condition might break very
310
- // very rare use cases where old Periods are still being generated, yet it
311
- // should fix more cases than it breaks.
312
- return true;
367
+ isStillAwaitingFutureSegments() {
368
+ var _a;
369
+ if (!this._isDynamic) {
370
+ return false;
313
371
  }
372
+ this._refreshTimeline();
314
373
  if (this._index.timeline === null) {
315
374
  this._index.timeline = this._getTimeline();
316
375
  }
317
376
  const { timeline } = this._index;
318
- if (this._scaledPeriodEnd === undefined || timeline.length === 0) {
319
- return false;
377
+ if (timeline.length === 0) {
378
+ // No segment announced in this Period
379
+ if (this._scaledPeriodEnd !== undefined) {
380
+ const liveEdge = this._manifestBoundsCalculator.getEstimatedLiveEdge();
381
+ if (liveEdge !== undefined &&
382
+ toIndexTime(liveEdge, this._index) > this._scaledPeriodEnd) {
383
+ // This Period is over, we're not awaiting anything
384
+ return false;
385
+ }
386
+ }
387
+ // Let's just consider that we're awaiting only for when this is the last Period.
388
+ return this._isLastPeriod;
320
389
  }
321
- const lastTimelineElement = timeline[timeline.length - 1];
322
- const lastTime = getIndexSegmentEnd(lastTimelineElement, null, this._scaledPeriodEnd);
323
390
  const segmentTimeRounding = getSegmentTimeRoundingError(this._index.timescale);
324
- return (lastTime + segmentTimeRounding) >= this._scaledPeriodEnd;
391
+ const lastReqSegInfo = getLastRequestableSegmentInfo(
392
+ // Needed typecast for TypeScript
393
+ this._index, this._manifestBoundsCalculator, this._scaledPeriodEnd);
394
+ if (lastReqSegInfo !== null && !lastReqSegInfo.isLastOfTimeline) {
395
+ // There might be non-yet requestable segments in the manifest
396
+ const lastReqSegmentEnd = Math.min(lastReqSegInfo.end, (_a = this._scaledPeriodEnd) !== null && _a !== void 0 ? _a : Infinity);
397
+ if (this._scaledPeriodEnd !== undefined &&
398
+ lastReqSegmentEnd + segmentTimeRounding >= this._scaledPeriodEnd) {
399
+ // The last requestable segment ends after the end of the Period anyway
400
+ return false;
401
+ }
402
+ return true; // There are not-yet requestable segments
403
+ }
404
+ if (!this._isLastPeriod) {
405
+ // This index is not linked to the current last Period in the MPD, in
406
+ // which case it is inferred that all segments have been announced.
407
+ //
408
+ // Note that this condition might break very very rare use cases where old
409
+ // Periods are still being generated, yet it should fix more cases than it
410
+ // breaks.
411
+ return false;
412
+ }
413
+ if (this._scaledPeriodEnd === undefined) {
414
+ // This is the last Period of a dynamic content whose end is unknown.
415
+ // Just return true.
416
+ return true;
417
+ }
418
+ const lastSegment = timeline[timeline.length - 1];
419
+ const lastSegmentEnd = getIndexSegmentEnd(lastSegment, null, this._scaledPeriodEnd);
420
+ // We're awaiting future segments only if the current end is before the end
421
+ // of the Period
422
+ return (lastSegmentEnd + segmentTimeRounding) < this._scaledPeriodEnd;
325
423
  }
326
424
  /**
327
425
  * @returns {Boolean}
@@ -356,7 +454,8 @@ export default class TimelineRepresentationIndex {
356
454
  if (!this._isDynamic) {
357
455
  return;
358
456
  }
359
- const firstPosition = this._manifestBoundsCalculator.estimateMinimumBound();
457
+ const firstPosition = this._manifestBoundsCalculator
458
+ .getEstimatedMinimumSegmentTime();
360
459
  if (firstPosition == null) {
361
460
  return; // we don't know yet
362
461
  }
@@ -369,12 +468,6 @@ export default class TimelineRepresentationIndex {
369
468
  this._index.startNumber = nbEltsRemoved + 1;
370
469
  }
371
470
  }
372
- static getIndexEnd(timeline, scaledPeriodEnd) {
373
- if (timeline.length <= 0) {
374
- return null;
375
- }
376
- return Math.min(getIndexSegmentEnd(timeline[timeline.length - 1], null, scaledPeriodEnd), scaledPeriodEnd !== null && scaledPeriodEnd !== void 0 ? scaledPeriodEnd : Infinity);
377
- }
378
471
  /**
379
472
  * Allows to generate the "timeline" for this RepresentationIndex.
380
473
  * Call this function when the timeline is unknown.
@@ -462,3 +555,105 @@ function updateTimelineFromEndNumber(timeline, startNumber, endNumber) {
462
555
  }
463
556
  return timeline;
464
557
  }
558
+ /**
559
+ * Returns true if a Segment returned by the corresponding index is still
560
+ * considered available.
561
+ * Returns false if it is not available anymore.
562
+ * Returns undefined if we cannot know whether it is still available or not.
563
+ * /!\ We do not check the mediaURLs of the segment.
564
+ * @param {Object} segment
565
+ * @param {Object} index
566
+ * @param {Object} manifestBoundsCalculator
567
+ * @param {number|undefined} scaledPeriodEnd
568
+ * @returns {Boolean|undefined}
569
+ */
570
+ export function isSegmentStillAvailable(segment, index, manifestBoundsCalculator, scaledPeriodEnd) {
571
+ const lastReqSegInfo = getLastRequestableSegmentInfo(index, manifestBoundsCalculator, scaledPeriodEnd);
572
+ if (lastReqSegInfo === null) {
573
+ return false;
574
+ }
575
+ for (let i = 0; i < index.timeline.length; i++) {
576
+ if (lastReqSegInfo.timelineIdx < i) {
577
+ return false;
578
+ }
579
+ const tSegment = index.timeline[i];
580
+ const tSegmentTime = (tSegment.start - index.indexTimeOffset) / index.timescale;
581
+ if (tSegmentTime > segment.time) {
582
+ return false; // We went over it without finding it
583
+ }
584
+ else if (tSegmentTime === segment.time) {
585
+ if (tSegment.range === undefined) {
586
+ return segment.range === undefined;
587
+ }
588
+ return segment.range != null &&
589
+ tSegment.range[0] === segment.range[0] &&
590
+ tSegment.range[1] === segment.range[1];
591
+ }
592
+ else { // tSegment.start < segment.time
593
+ if (tSegment.repeatCount >= 0 && tSegment.duration !== undefined) {
594
+ const timeDiff = tSegmentTime - tSegment.start;
595
+ const repeat = (timeDiff / tSegment.duration) - 1;
596
+ return repeat % 1 === 0 && repeat <= lastReqSegInfo.newRepeatCount;
597
+ }
598
+ }
599
+ }
600
+ return false;
601
+ }
602
+ /**
603
+ * Returns from the given RepresentationIndex information on the last segment
604
+ * that may be requested currently.
605
+ *
606
+ * Returns `null` if there's no such segment.
607
+ * @param {Object} index
608
+ * @param {Object} manifestBoundsCalculator
609
+ * @param {number|undefined} scaledPeriodEnd
610
+ * @returns {number|null}
611
+ */
612
+ export function getLastRequestableSegmentInfo(index, manifestBoundsCalculator, scaledPeriodEnd) {
613
+ if (index.timeline.length <= 0) {
614
+ return null;
615
+ }
616
+ if (index.availabilityTimeOffset === Infinity) {
617
+ // availabilityTimeOffset to Infinity == Everything is requestable in the timeline.
618
+ const lastIndex = index.timeline.length - 1;
619
+ const lastElem = index.timeline[lastIndex];
620
+ return { isLastOfTimeline: true,
621
+ timelineIdx: lastIndex,
622
+ newRepeatCount: lastElem.repeatCount,
623
+ end: getIndexSegmentEnd(lastElem, null, scaledPeriodEnd) };
624
+ }
625
+ const adjustedMaxSeconds = manifestBoundsCalculator.getEstimatedMaximumPosition(index.availabilityTimeOffset);
626
+ if (adjustedMaxSeconds === undefined) {
627
+ const lastIndex = index.timeline.length - 1;
628
+ const lastElem = index.timeline[lastIndex];
629
+ return { isLastOfTimeline: true,
630
+ timelineIdx: lastIndex,
631
+ newRepeatCount: lastElem.repeatCount,
632
+ end: getIndexSegmentEnd(lastElem, null, scaledPeriodEnd) };
633
+ }
634
+ for (let i = index.timeline.length - 1; i >= index.timeline.length; i--) {
635
+ const element = index.timeline[i];
636
+ const endOfFirstOccurence = element.start + element.duration;
637
+ if (fromIndexTime(endOfFirstOccurence, index) <= adjustedMaxSeconds) {
638
+ const endTime = getIndexSegmentEnd(element, index.timeline[i + 1], scaledPeriodEnd);
639
+ if (fromIndexTime(endTime, index) <= adjustedMaxSeconds) {
640
+ return { isLastOfTimeline: i === index.timeline.length - 1,
641
+ timelineIdx: i,
642
+ newRepeatCount: element.repeatCount,
643
+ end: endOfFirstOccurence };
644
+ }
645
+ else {
646
+ // We have to find the right repeatCount
647
+ const maxIndexTime = toIndexTime(adjustedMaxSeconds, index);
648
+ const diffToSegStart = maxIndexTime - element.start;
649
+ const nbOfSegs = Math.floor(diffToSegStart / element.duration);
650
+ assert(nbOfSegs >= 1);
651
+ return { isLastOfTimeline: false,
652
+ timelineIdx: i,
653
+ newRepeatCount: nbOfSegs - 1,
654
+ end: element.start + nbOfSegs * element.duration };
655
+ }
656
+ }
657
+ }
658
+ return null;
659
+ }
@@ -17,16 +17,6 @@
17
17
  * This class allows to easily calculate the first and last available positions
18
18
  * in a content at any time.
19
19
  *
20
- * That task can be an hard for dynamic DASH contents: it depends on a
21
- * `timeShiftBufferDepth` defined in the MPD and on the maximum possible
22
- * position.
23
- *
24
- * The latter can come from either a clock synchronization mechanism or the
25
- * indexing schemes (e.g. SegmentTemplate, SegmentTimeline etc.) of the last
26
- * Periods.
27
- * As such, it might only be known once a large chunk of the MPD has already
28
- * been parsed.
29
- *
30
20
  * By centralizing the manifest bounds calculation in this class and by giving
31
21
  * an instance of it to each parsed elements which might depend on it, we
32
22
  * ensure that we can provide it once it is known to every one of those
@@ -34,8 +24,18 @@
34
24
  * @class ManifestBoundsCalculator
35
25
  */
36
26
  export default class ManifestBoundsCalculator {
37
- /** Value of MPD@timeShiftBufferDepth. */
27
+ /**
28
+ * Value of MPD@timeShiftBufferDepth.
29
+ * `null` if not defined.
30
+ */
38
31
  private _timeShiftBufferDepth;
32
+ /**
33
+ * Value of MPD@availabilityStartTime as an unix timestamp in seconds.
34
+ * `0` if it wasn't defined.
35
+ */
36
+ private _availabilityStartTime;
37
+ /** `true` if MPD@type is equal to "dynamic". */
38
+ private _isDynamic;
39
39
  /**
40
40
  * Monotonically-raising timestamp (the one used by the RxPlayer) when
41
41
  * `lastPosition` was calculated.
@@ -43,14 +43,21 @@ export default class ManifestBoundsCalculator {
43
43
  private _positionTime;
44
44
  /** Last position calculated at a given moment (itself indicated by `_positionTime`. */
45
45
  private _lastPosition;
46
- /** `true` if MPD@type is equal to "dynamic". */
47
- private _isDynamic;
46
+ /**
47
+ * Offset to add to `performance.now` to obtain a good estimation of the
48
+ * server-side unix timestamp.
49
+ *
50
+ * `undefined` if unknown.
51
+ */
52
+ private _serverTimestampOffset;
48
53
  /**
49
54
  * @param {Object} args
50
55
  */
51
56
  constructor(args: {
57
+ availabilityStartTime: number;
52
58
  timeShiftBufferDepth: number | undefined;
53
59
  isDynamic: boolean;
60
+ serverTimestampOffset: number | undefined;
54
61
  });
55
62
  /**
56
63
  * Set the last position and the position time (the value of the RxPlayer's
@@ -82,11 +89,27 @@ export default class ManifestBoundsCalculator {
82
89
  * Consider that it is only an estimation, not the real value.
83
90
  * @return {number|undefined}
84
91
  */
85
- estimateMinimumBound(): number | undefined;
92
+ getEstimatedMinimumSegmentTime(): number | undefined;
86
93
  /**
87
- * Estimate a maximum bound for the content from the last set segment time.
88
- * Consider that it is only an estimation, not the real value.
94
+ * Estimate the segment time in seconds that corresponds to what could be
95
+ * considered the live edge (or `undefined` for non-live contents).
96
+ *
97
+ * Note that for some contents which just anounce segments in advance, this
98
+ * value might be very different than the maximum position that is
99
+ * requestable.
89
100
  * @return {number|undefined}
90
101
  */
91
- estimateMaximumBound(): number | undefined;
102
+ getEstimatedLiveEdge(): number | undefined;
103
+ /**
104
+ * Produce a rough estimate of the ending time of the last requestable segment
105
+ * in that content.
106
+ *
107
+ * This value is only an estimate and may be far from reality.
108
+ *
109
+ * The `availabilityTimeOffset` in argument is the corresponding
110
+ * `availabilityTimeOffset` that applies to the current wanted segment, or `0`
111
+ * if none exist. It will be applied on live content to deduce the maximum
112
+ * segment time available.
113
+ */
114
+ getEstimatedMaximumPosition(availabilityTimeOffset: number): number | undefined;
92
115
  }
@@ -18,16 +18,6 @@ import getMonotonicTimeStamp from "../../../../utils/monotonic_timestamp";
18
18
  * This class allows to easily calculate the first and last available positions
19
19
  * in a content at any time.
20
20
  *
21
- * That task can be an hard for dynamic DASH contents: it depends on a
22
- * `timeShiftBufferDepth` defined in the MPD and on the maximum possible
23
- * position.
24
- *
25
- * The latter can come from either a clock synchronization mechanism or the
26
- * indexing schemes (e.g. SegmentTemplate, SegmentTimeline etc.) of the last
27
- * Periods.
28
- * As such, it might only be known once a large chunk of the MPD has already
29
- * been parsed.
30
- *
31
21
  * By centralizing the manifest bounds calculation in this class and by giving
32
22
  * an instance of it to each parsed elements which might depend on it, we
33
23
  * ensure that we can provide it once it is known to every one of those
@@ -44,6 +34,8 @@ export default class ManifestBoundsCalculator {
44
34
  args.timeShiftBufferDepth === undefined ?
45
35
  null :
46
36
  args.timeShiftBufferDepth;
37
+ this._serverTimestampOffset = args.serverTimestampOffset;
38
+ this._availabilityStartTime = args.availabilityStartTime;
47
39
  }
48
40
  /**
49
41
  * Set the last position and the position time (the value of the RxPlayer's
@@ -83,11 +75,12 @@ export default class ManifestBoundsCalculator {
83
75
  * Consider that it is only an estimation, not the real value.
84
76
  * @return {number|undefined}
85
77
  */
86
- estimateMinimumBound() {
78
+ getEstimatedMinimumSegmentTime() {
79
+ var _a;
87
80
  if (!this._isDynamic || this._timeShiftBufferDepth === null) {
88
81
  return 0;
89
82
  }
90
- const maximumBound = this.estimateMaximumBound();
83
+ const maximumBound = (_a = this.getEstimatedLiveEdge()) !== null && _a !== void 0 ? _a : this.getEstimatedMaximumPosition(0);
91
84
  if (maximumBound === undefined) {
92
85
  return undefined;
93
86
  }
@@ -95,14 +88,41 @@ export default class ManifestBoundsCalculator {
95
88
  return minimumBound;
96
89
  }
97
90
  /**
98
- * Estimate a maximum bound for the content from the last set segment time.
99
- * Consider that it is only an estimation, not the real value.
91
+ * Estimate the segment time in seconds that corresponds to what could be
92
+ * considered the live edge (or `undefined` for non-live contents).
93
+ *
94
+ * Note that for some contents which just anounce segments in advance, this
95
+ * value might be very different than the maximum position that is
96
+ * requestable.
100
97
  * @return {number|undefined}
101
98
  */
102
- estimateMaximumBound() {
103
- if (this._isDynamic &&
104
- this._positionTime != null &&
105
- this._lastPosition != null) {
99
+ getEstimatedLiveEdge() {
100
+ if (!this._isDynamic || this._serverTimestampOffset === undefined) {
101
+ return undefined;
102
+ }
103
+ return (getMonotonicTimeStamp() + this._serverTimestampOffset) / 1000 -
104
+ this._availabilityStartTime;
105
+ }
106
+ /**
107
+ * Produce a rough estimate of the ending time of the last requestable segment
108
+ * in that content.
109
+ *
110
+ * This value is only an estimate and may be far from reality.
111
+ *
112
+ * The `availabilityTimeOffset` in argument is the corresponding
113
+ * `availabilityTimeOffset` that applies to the current wanted segment, or `0`
114
+ * if none exist. It will be applied on live content to deduce the maximum
115
+ * segment time available.
116
+ */
117
+ getEstimatedMaximumPosition(availabilityTimeOffset) {
118
+ if (!this._isDynamic) {
119
+ return this._lastPosition;
120
+ }
121
+ const liveEdge = this.getEstimatedLiveEdge();
122
+ if (liveEdge !== undefined && availabilityTimeOffset !== Infinity) {
123
+ return liveEdge + availabilityTimeOffset;
124
+ }
125
+ else if (this._positionTime !== undefined && this._lastPosition !== undefined) {
106
126
  return Math.max((this._lastPosition - this._positionTime) +
107
127
  (getMonotonicTimeStamp() / 1000), 0);
108
128
  }
@@ -154,7 +154,7 @@ function getAdaptationSetSwitchingIDs(adaptation) {
154
154
  * @returns {Array.<Object>}
155
155
  */
156
156
  export default function parseAdaptationSets(adaptationsIR, context) {
157
- var _a, _b, _c, _d, _e, _f;
157
+ var _a, _b, _c, _d, _e, _f, _g;
158
158
  const parsedAdaptations = { video: [],
159
159
  audio: [],
160
160
  text: [] };
@@ -170,8 +170,12 @@ export default function parseAdaptationSets(adaptationsIR, context) {
170
170
  roles.some((role) => role.schemeIdUri === "urn:mpeg:dash:role:2011");
171
171
  const representationsIR = adaptation.children.representations;
172
172
  const availabilityTimeComplete = (_a = adaptation.attributes.availabilityTimeComplete) !== null && _a !== void 0 ? _a : context.availabilityTimeComplete;
173
- const availabilityTimeOffset = ((_b = adaptation.attributes.availabilityTimeOffset) !== null && _b !== void 0 ? _b : 0) +
174
- context.availabilityTimeOffset;
173
+ let availabilityTimeOffset;
174
+ if (adaptation.attributes.availabilityTimeOffset !== undefined ||
175
+ context.availabilityTimeOffset !== undefined) {
176
+ availabilityTimeOffset = ((_b = adaptation.attributes.availabilityTimeOffset) !== null && _b !== void 0 ? _b : 0) +
177
+ ((_c = context.availabilityTimeOffset) !== null && _c !== void 0 ? _c : 0);
178
+ }
175
179
  const adaptationMimeType = adaptation.attributes.mimeType;
176
180
  const adaptationCodecs = adaptation.attributes.codecs;
177
181
  const type = inferAdaptationType(representationsIR, isNonEmptyString(adaptationMimeType) ?
@@ -184,7 +188,7 @@ export default function parseAdaptationSets(adaptationsIR, context) {
184
188
  if (type === undefined) {
185
189
  continue;
186
190
  }
187
- const priority = (_c = adaptation.attributes.selectionPriority) !== null && _c !== void 0 ? _c : 1;
191
+ const priority = (_d = adaptation.attributes.selectionPriority) !== null && _d !== void 0 ? _d : 1;
188
192
  const originalID = adaptation.attributes.id;
189
193
  const adaptationSetSwitchingIDs = getAdaptationSetSwitchingIDs(adaptation);
190
194
  const parentSegmentTemplates = [];
@@ -206,14 +210,13 @@ export default function parseAdaptationSets(adaptationsIR, context) {
206
210
  parentSegmentTemplates,
207
211
  receivedTime: context.receivedTime,
208
212
  start: context.start,
209
- timeShiftBufferDepth: context.timeShiftBufferDepth,
210
213
  unsafelyBaseOnPreviousAdaptation: null,
211
214
  };
212
215
  const trickModeProperty = Array.isArray(essentialProperties) ?
213
216
  arrayFind(essentialProperties, (scheme) => {
214
217
  return scheme.schemeIdUri === "http://dashif.org/guidelines/trickmode";
215
218
  }) : undefined;
216
- const trickModeAttachedAdaptationIds = (_d = trickModeProperty === null || trickModeProperty === void 0 ? void 0 : trickModeProperty.value) === null || _d === void 0 ? void 0 : _d.split(" ");
219
+ const trickModeAttachedAdaptationIds = (_e = trickModeProperty === null || trickModeProperty === void 0 ? void 0 : trickModeProperty.value) === null || _e === void 0 ? void 0 : _e.split(" ");
217
220
  const isTrickModeTrack = trickModeAttachedAdaptationIds !== undefined;
218
221
  const { accessibilities } = adaptationChildren;
219
222
  let isDub;
@@ -261,8 +264,8 @@ export default function parseAdaptationSets(adaptationsIR, context) {
261
264
  }
262
265
  const newID = adaptationID;
263
266
  parsedAdaptationsIDs.push(adaptationID);
264
- reprCtxt.unsafelyBaseOnPreviousAdaptation = (_f = (_e = context
265
- .unsafelyBaseOnPreviousPeriod) === null || _e === void 0 ? void 0 : _e.getAdaptation(adaptationID)) !== null && _f !== void 0 ? _f : null;
267
+ reprCtxt.unsafelyBaseOnPreviousAdaptation = (_g = (_f = context
268
+ .unsafelyBaseOnPreviousPeriod) === null || _f === void 0 ? void 0 : _f.getAdaptation(adaptationID)) !== null && _g !== void 0 ? _g : null;
266
269
  const representations = parseRepresentations(representationsIR, adaptation, reprCtxt);
267
270
  const parsedAdaptationSet = { id: adaptationID,
268
271
  representations,