rx-player 4.0.0-dev.2023111400 → 4.0.0-dev.2023121900

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) hide show
  1. package/CHANGELOG.md +20 -60
  2. package/FILES.md +1 -1
  3. package/README.md +2 -33
  4. package/VERSION +1 -1
  5. package/dist/_esm5.processed/core/api/debug/buffer_graph.js +2 -6
  6. package/dist/_esm5.processed/core/api/debug/modules/general_info.js +20 -10
  7. package/dist/_esm5.processed/core/api/option_utils.d.ts +0 -2
  8. package/dist/_esm5.processed/core/api/option_utils.js +0 -6
  9. package/dist/_esm5.processed/core/api/public_api.d.ts +1 -2
  10. package/dist/_esm5.processed/core/api/public_api.js +9 -17
  11. package/dist/_esm5.processed/core/init/directfile_content_initializer.js +1 -1
  12. package/dist/_esm5.processed/core/init/media_source_content_initializer.js +3 -14
  13. package/dist/_esm5.processed/core/init/utils/rebuffering_controller.d.ts +2 -36
  14. package/dist/_esm5.processed/core/init/utils/rebuffering_controller.js +2 -82
  15. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +9 -2
  16. package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.js +1 -1
  17. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +1 -1
  18. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +1 -1
  19. package/dist/_esm5.processed/core/segment_buffers/index.d.ts +2 -2
  20. package/dist/_esm5.processed/core/segment_buffers/inventory/index.d.ts +2 -2
  21. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +25 -8
  22. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +19 -10
  23. package/dist/_esm5.processed/core/stream/representation/utils/get_buffer_status.js +1 -1
  24. package/dist/_esm5.processed/core/stream/representation/utils/get_needed_segments.js +1 -1
  25. package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_extent.js +1 -8
  26. package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_line_height.js +2 -1
  27. package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_origin.js +1 -9
  28. package/dist/_esm5.processed/public_types.d.ts +2 -0
  29. package/dist/commonjs/compat/is_codec_supported.js +22 -1
  30. package/dist/commonjs/config.d.ts +2 -1
  31. package/dist/commonjs/core/adaptive/adaptive_representation_selector.d.ts +2 -19
  32. package/dist/commonjs/core/adaptive/adaptive_representation_selector.js +2 -2
  33. package/dist/commonjs/core/adaptive/network_analyzer.js +3 -3
  34. package/dist/commonjs/core/api/debug/buffer_graph.js +2 -6
  35. package/dist/commonjs/core/api/debug/modules/general_info.js +17 -10
  36. package/dist/commonjs/core/api/index.d.ts +1 -1
  37. package/dist/commonjs/core/api/option_utils.d.ts +2 -0
  38. package/dist/commonjs/core/api/option_utils.js +2 -3
  39. package/dist/commonjs/core/api/playback_observer.d.ts +128 -8
  40. package/dist/commonjs/core/api/playback_observer.js +217 -64
  41. package/dist/commonjs/core/api/public_api.d.ts +9 -0
  42. package/dist/commonjs/core/api/public_api.js +41 -16
  43. package/dist/commonjs/core/api/utils.js +1 -1
  44. package/dist/commonjs/core/decrypt/get_media_keys.js +2 -6
  45. package/dist/commonjs/core/fetchers/manifest/manifest_fetcher.d.ts +6 -0
  46. package/dist/commonjs/core/fetchers/manifest/manifest_fetcher.js +11 -3
  47. package/dist/commonjs/core/fetchers/segment/segment_fetcher.d.ts +8 -1
  48. package/dist/commonjs/core/fetchers/segment/segment_fetcher.js +8 -4
  49. package/dist/commonjs/core/fetchers/segment/segment_fetcher_creator.d.ts +1 -0
  50. package/dist/commonjs/core/fetchers/utils/schedule_request.js +1 -1
  51. package/dist/commonjs/core/init/directfile_content_initializer.js +29 -8
  52. package/dist/commonjs/core/init/media_source_content_initializer.d.ts +6 -0
  53. package/dist/commonjs/core/init/media_source_content_initializer.js +32 -20
  54. package/dist/commonjs/core/init/utils/content_time_boundaries_observer.d.ts +13 -12
  55. package/dist/commonjs/core/init/utils/content_time_boundaries_observer.js +17 -19
  56. package/dist/commonjs/core/init/utils/create_stream_playback_observer.d.ts +1 -5
  57. package/dist/commonjs/core/init/utils/create_stream_playback_observer.js +16 -14
  58. package/dist/commonjs/core/init/utils/get_initial_time.d.ts +17 -3
  59. package/dist/commonjs/core/init/utils/get_initial_time.js +9 -7
  60. package/dist/commonjs/core/init/utils/initial_seek_and_play.d.ts +9 -11
  61. package/dist/commonjs/core/init/utils/initial_seek_and_play.js +121 -91
  62. package/dist/commonjs/core/init/utils/rebuffering_controller.js +27 -70
  63. package/dist/commonjs/core/init/utils/stream_events_emitter/stream_events_emitter.js +4 -2
  64. package/dist/commonjs/core/segment_buffers/garbage_collector.js +1 -2
  65. package/dist/commonjs/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +9 -2
  66. package/dist/commonjs/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +1 -1
  67. package/dist/commonjs/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +1 -1
  68. package/dist/commonjs/core/segment_buffers/index.d.ts +2 -2
  69. package/dist/commonjs/core/segment_buffers/inventory/index.d.ts +2 -2
  70. package/dist/commonjs/core/segment_buffers/inventory/segment_inventory.d.ts +25 -8
  71. package/dist/commonjs/core/segment_buffers/inventory/segment_inventory.js +19 -10
  72. package/dist/commonjs/core/stream/adaptation/get_representations_switch_strategy.d.ts +2 -2
  73. package/dist/commonjs/core/stream/adaptation/get_representations_switch_strategy.js +16 -9
  74. package/dist/commonjs/core/stream/orchestrator/stream_orchestrator.js +14 -18
  75. package/dist/commonjs/core/stream/period/period_stream.js +5 -8
  76. package/dist/commonjs/core/stream/period/types.d.ts +2 -3
  77. package/dist/commonjs/core/stream/period/utils/get_adaptation_switch_strategy.d.ts +4 -5
  78. package/dist/commonjs/core/stream/period/utils/get_adaptation_switch_strategy.js +17 -13
  79. package/dist/commonjs/core/stream/representation/representation_stream.js +3 -4
  80. package/dist/commonjs/core/stream/representation/types.d.ts +2 -2
  81. package/dist/commonjs/core/stream/representation/utils/append_segment_to_buffer.js +11 -12
  82. package/dist/commonjs/core/stream/representation/utils/get_buffer_status.js +4 -4
  83. package/dist/commonjs/core/stream/representation/utils/get_needed_segments.js +1 -1
  84. package/dist/commonjs/default_config.d.ts +12 -16
  85. package/dist/commonjs/default_config.js +21 -16
  86. package/dist/commonjs/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +3 -1
  87. package/dist/commonjs/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +2 -0
  88. package/dist/commonjs/manifest/adaptation.js +2 -1
  89. package/dist/commonjs/manifest/representation_index/static.d.ts +1 -1
  90. package/dist/commonjs/manifest/representation_index/static.js +2 -2
  91. package/dist/commonjs/manifest/representation_index/types.d.ts +4 -4
  92. package/dist/commonjs/parsers/manifest/dash/common/indexes/base.d.ts +6 -1
  93. package/dist/commonjs/parsers/manifest/dash/common/indexes/base.js +4 -3
  94. package/dist/commonjs/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +5 -2
  95. package/dist/commonjs/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +15 -4
  96. package/dist/commonjs/parsers/manifest/dash/common/indexes/index.d.ts +5 -5
  97. package/dist/commonjs/parsers/manifest/dash/common/indexes/list.d.ts +1 -1
  98. package/dist/commonjs/parsers/manifest/dash/common/indexes/list.js +2 -2
  99. package/dist/commonjs/parsers/manifest/dash/common/indexes/template.d.ts +12 -5
  100. package/dist/commonjs/parsers/manifest/dash/common/indexes/template.js +42 -29
  101. package/dist/commonjs/parsers/manifest/dash/common/indexes/timeline/index.d.ts +2 -1
  102. package/dist/commonjs/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +99 -6
  103. package/dist/commonjs/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +250 -51
  104. package/dist/commonjs/parsers/manifest/dash/common/manifest_bounds_calculator.d.ts +40 -17
  105. package/dist/commonjs/parsers/manifest/dash/common/manifest_bounds_calculator.js +38 -18
  106. package/dist/commonjs/parsers/manifest/dash/common/parse_adaptation_sets.js +13 -10
  107. package/dist/commonjs/parsers/manifest/dash/common/parse_mpd.js +27 -14
  108. package/dist/commonjs/parsers/manifest/dash/common/parse_periods.d.ts +1 -1
  109. package/dist/commonjs/parsers/manifest/dash/common/parse_periods.js +17 -18
  110. package/dist/commonjs/parsers/manifest/dash/common/parse_representation_index.d.ts +19 -6
  111. package/dist/commonjs/parsers/manifest/dash/common/parse_representation_index.js +21 -8
  112. package/dist/commonjs/parsers/manifest/dash/common/parse_representations.js +7 -3
  113. package/dist/commonjs/parsers/manifest/local/representation_index.d.ts +1 -1
  114. package/dist/commonjs/parsers/manifest/local/representation_index.js +3 -3
  115. package/dist/commonjs/parsers/manifest/metaplaylist/representation_index.d.ts +1 -1
  116. package/dist/commonjs/parsers/manifest/metaplaylist/representation_index.js +2 -2
  117. package/dist/commonjs/parsers/manifest/smooth/representation_index.d.ts +5 -5
  118. package/dist/commonjs/parsers/manifest/smooth/representation_index.js +25 -9
  119. package/dist/commonjs/parsers/manifest/utils/index_helpers.js +1 -1
  120. package/dist/commonjs/parsers/texttracks/ttml/html/apply_line_height.js +2 -1
  121. package/dist/commonjs/public_types.d.ts +107 -36
  122. package/dist/commonjs/transports/dash/init_segment_loader.js +10 -5
  123. package/dist/commonjs/transports/dash/manifest_parser.js +5 -2
  124. package/dist/commonjs/transports/dash/segment_loader.js +2 -1
  125. package/dist/commonjs/transports/dash/text_loader.js +2 -0
  126. package/dist/commonjs/transports/metaplaylist/manifest_loader.js +2 -1
  127. package/dist/commonjs/transports/metaplaylist/pipelines.js +4 -1
  128. package/dist/commonjs/transports/smooth/pipelines.js +4 -2
  129. package/dist/commonjs/transports/smooth/segment_loader.js +2 -1
  130. package/dist/commonjs/transports/types.d.ts +12 -0
  131. package/dist/commonjs/transports/utils/generate_manifest_loader.js +6 -3
  132. package/dist/commonjs/utils/request/fetch.d.ts +6 -0
  133. package/dist/commonjs/utils/request/fetch.js +29 -8
  134. package/dist/commonjs/utils/request/xhr.d.ts +11 -5
  135. package/dist/commonjs/utils/request/xhr.js +29 -8
  136. package/dist/es2017/compat/is_codec_supported.js +22 -1
  137. package/dist/es2017/config.d.ts +2 -1
  138. package/dist/es2017/core/adaptive/adaptive_representation_selector.d.ts +2 -19
  139. package/dist/es2017/core/adaptive/adaptive_representation_selector.js +2 -2
  140. package/dist/es2017/core/adaptive/network_analyzer.js +3 -3
  141. package/dist/es2017/core/api/debug/buffer_graph.js +2 -6
  142. package/dist/es2017/core/api/debug/modules/general_info.js +17 -10
  143. package/dist/es2017/core/api/index.d.ts +1 -1
  144. package/dist/es2017/core/api/option_utils.d.ts +2 -0
  145. package/dist/es2017/core/api/option_utils.js +2 -3
  146. package/dist/es2017/core/api/playback_observer.d.ts +128 -8
  147. package/dist/es2017/core/api/playback_observer.js +217 -66
  148. package/dist/es2017/core/api/public_api.d.ts +9 -0
  149. package/dist/es2017/core/api/public_api.js +40 -15
  150. package/dist/es2017/core/api/utils.js +1 -1
  151. package/dist/es2017/core/decrypt/get_media_keys.js +2 -6
  152. package/dist/es2017/core/fetchers/manifest/manifest_fetcher.d.ts +6 -0
  153. package/dist/es2017/core/fetchers/manifest/manifest_fetcher.js +11 -3
  154. package/dist/es2017/core/fetchers/segment/segment_fetcher.d.ts +8 -1
  155. package/dist/es2017/core/fetchers/segment/segment_fetcher.js +8 -4
  156. package/dist/es2017/core/fetchers/segment/segment_fetcher_creator.d.ts +1 -0
  157. package/dist/es2017/core/fetchers/utils/schedule_request.js +1 -1
  158. package/dist/es2017/core/init/directfile_content_initializer.js +31 -8
  159. package/dist/es2017/core/init/media_source_content_initializer.d.ts +6 -0
  160. package/dist/es2017/core/init/media_source_content_initializer.js +34 -22
  161. package/dist/es2017/core/init/utils/content_time_boundaries_observer.d.ts +13 -12
  162. package/dist/es2017/core/init/utils/content_time_boundaries_observer.js +17 -17
  163. package/dist/es2017/core/init/utils/create_stream_playback_observer.d.ts +1 -5
  164. package/dist/es2017/core/init/utils/create_stream_playback_observer.js +16 -14
  165. package/dist/es2017/core/init/utils/get_initial_time.d.ts +17 -3
  166. package/dist/es2017/core/init/utils/get_initial_time.js +9 -7
  167. package/dist/es2017/core/init/utils/initial_seek_and_play.d.ts +9 -11
  168. package/dist/es2017/core/init/utils/initial_seek_and_play.js +120 -91
  169. package/dist/es2017/core/init/utils/rebuffering_controller.js +27 -70
  170. package/dist/es2017/core/init/utils/stream_events_emitter/stream_events_emitter.js +4 -2
  171. package/dist/es2017/core/segment_buffers/garbage_collector.js +1 -2
  172. package/dist/es2017/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +9 -2
  173. package/dist/es2017/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +1 -1
  174. package/dist/es2017/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +1 -1
  175. package/dist/es2017/core/segment_buffers/index.d.ts +2 -2
  176. package/dist/es2017/core/segment_buffers/inventory/index.d.ts +2 -2
  177. package/dist/es2017/core/segment_buffers/inventory/segment_inventory.d.ts +25 -8
  178. package/dist/es2017/core/segment_buffers/inventory/segment_inventory.js +19 -10
  179. package/dist/es2017/core/stream/adaptation/get_representations_switch_strategy.d.ts +2 -2
  180. package/dist/es2017/core/stream/adaptation/get_representations_switch_strategy.js +16 -9
  181. package/dist/es2017/core/stream/orchestrator/stream_orchestrator.js +16 -18
  182. package/dist/es2017/core/stream/period/period_stream.js +4 -7
  183. package/dist/es2017/core/stream/period/types.d.ts +2 -3
  184. package/dist/es2017/core/stream/period/utils/get_adaptation_switch_strategy.d.ts +4 -5
  185. package/dist/es2017/core/stream/period/utils/get_adaptation_switch_strategy.js +17 -13
  186. package/dist/es2017/core/stream/representation/representation_stream.js +3 -4
  187. package/dist/es2017/core/stream/representation/types.d.ts +2 -2
  188. package/dist/es2017/core/stream/representation/utils/append_segment_to_buffer.js +1 -2
  189. package/dist/es2017/core/stream/representation/utils/get_buffer_status.js +4 -4
  190. package/dist/es2017/core/stream/representation/utils/get_needed_segments.js +1 -1
  191. package/dist/es2017/default_config.d.ts +12 -16
  192. package/dist/es2017/default_config.js +21 -16
  193. package/dist/es2017/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +3 -1
  194. package/dist/es2017/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +2 -0
  195. package/dist/es2017/manifest/adaptation.js +2 -1
  196. package/dist/es2017/manifest/representation_index/static.d.ts +1 -1
  197. package/dist/es2017/manifest/representation_index/static.js +2 -2
  198. package/dist/es2017/manifest/representation_index/types.d.ts +4 -4
  199. package/dist/es2017/parsers/manifest/dash/common/indexes/base.d.ts +6 -1
  200. package/dist/es2017/parsers/manifest/dash/common/indexes/base.js +4 -3
  201. package/dist/es2017/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +5 -2
  202. package/dist/es2017/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +15 -4
  203. package/dist/es2017/parsers/manifest/dash/common/indexes/index.d.ts +5 -5
  204. package/dist/es2017/parsers/manifest/dash/common/indexes/list.d.ts +1 -1
  205. package/dist/es2017/parsers/manifest/dash/common/indexes/list.js +2 -2
  206. package/dist/es2017/parsers/manifest/dash/common/indexes/template.d.ts +12 -5
  207. package/dist/es2017/parsers/manifest/dash/common/indexes/template.js +40 -27
  208. package/dist/es2017/parsers/manifest/dash/common/indexes/timeline/index.d.ts +2 -1
  209. package/dist/es2017/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +99 -6
  210. package/dist/es2017/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +246 -51
  211. package/dist/es2017/parsers/manifest/dash/common/manifest_bounds_calculator.d.ts +40 -17
  212. package/dist/es2017/parsers/manifest/dash/common/manifest_bounds_calculator.js +38 -18
  213. package/dist/es2017/parsers/manifest/dash/common/parse_adaptation_sets.js +11 -8
  214. package/dist/es2017/parsers/manifest/dash/common/parse_mpd.js +27 -13
  215. package/dist/es2017/parsers/manifest/dash/common/parse_periods.d.ts +1 -1
  216. package/dist/es2017/parsers/manifest/dash/common/parse_periods.js +13 -16
  217. package/dist/es2017/parsers/manifest/dash/common/parse_representation_index.d.ts +19 -6
  218. package/dist/es2017/parsers/manifest/dash/common/parse_representation_index.js +10 -8
  219. package/dist/es2017/parsers/manifest/dash/common/parse_representations.js +7 -3
  220. package/dist/es2017/parsers/manifest/local/representation_index.d.ts +1 -1
  221. package/dist/es2017/parsers/manifest/local/representation_index.js +3 -3
  222. package/dist/es2017/parsers/manifest/metaplaylist/representation_index.d.ts +1 -1
  223. package/dist/es2017/parsers/manifest/metaplaylist/representation_index.js +2 -2
  224. package/dist/es2017/parsers/manifest/smooth/representation_index.d.ts +5 -5
  225. package/dist/es2017/parsers/manifest/smooth/representation_index.js +25 -9
  226. package/dist/es2017/parsers/manifest/utils/index_helpers.js +1 -1
  227. package/dist/es2017/parsers/texttracks/ttml/html/apply_line_height.js +2 -1
  228. package/dist/es2017/public_types.d.ts +107 -36
  229. package/dist/es2017/transports/dash/init_segment_loader.js +5 -0
  230. package/dist/es2017/transports/dash/manifest_parser.js +3 -0
  231. package/dist/es2017/transports/dash/segment_loader.js +1 -0
  232. package/dist/es2017/transports/dash/text_loader.js +2 -0
  233. package/dist/es2017/transports/metaplaylist/manifest_loader.js +1 -0
  234. package/dist/es2017/transports/metaplaylist/pipelines.js +4 -1
  235. package/dist/es2017/transports/smooth/pipelines.js +2 -0
  236. package/dist/es2017/transports/smooth/segment_loader.js +1 -0
  237. package/dist/es2017/transports/types.d.ts +12 -0
  238. package/dist/es2017/transports/utils/generate_manifest_loader.js +3 -0
  239. package/dist/es2017/utils/request/fetch.d.ts +6 -0
  240. package/dist/es2017/utils/request/fetch.js +29 -8
  241. package/dist/es2017/utils/request/xhr.d.ts +11 -5
  242. package/dist/es2017/utils/request/xhr.js +30 -9
  243. package/dist/mpd-parser.wasm +0 -0
  244. package/dist/rx-player.js +1335 -812
  245. package/dist/rx-player.min.js +1 -1
  246. package/package.json +7 -4
  247. package/scripts/canal-release.patch +78 -0
  248. package/scripts/make-dev-releases +65 -0
  249. package/scripts/update-version +7 -0
  250. package/sonar-project.properties +1 -1
  251. package/src/compat/is_codec_supported.ts +23 -1
  252. package/src/core/adaptive/adaptive_representation_selector.ts +4 -21
  253. package/src/core/adaptive/network_analyzer.ts +3 -3
  254. package/src/core/api/debug/buffer_graph.ts +2 -5
  255. package/src/core/api/debug/modules/general_info.ts +15 -10
  256. package/src/core/api/index.ts +1 -0
  257. package/src/core/api/option_utils.ts +3 -3
  258. package/src/core/api/playback_observer.ts +327 -107
  259. package/src/core/api/public_api.ts +42 -14
  260. package/src/core/api/utils.ts +3 -1
  261. package/src/core/decrypt/get_media_keys.ts +2 -8
  262. package/src/core/fetchers/manifest/manifest_fetcher.ts +21 -3
  263. package/src/core/fetchers/segment/segment_fetcher.ts +19 -5
  264. package/src/core/fetchers/segment/segment_fetcher_creator.ts +1 -0
  265. package/src/core/fetchers/utils/schedule_request.ts +1 -1
  266. package/src/core/init/directfile_content_initializer.ts +31 -15
  267. package/src/core/init/media_source_content_initializer.ts +40 -27
  268. package/src/core/init/utils/content_time_boundaries_observer.ts +24 -23
  269. package/src/core/init/utils/create_stream_playback_observer.ts +19 -20
  270. package/src/core/init/utils/get_initial_time.ts +25 -12
  271. package/src/core/init/utils/initial_seek_and_play.ts +140 -108
  272. package/src/core/init/utils/rebuffering_controller.ts +32 -77
  273. package/src/core/init/utils/stream_events_emitter/stream_events_emitter.ts +5 -2
  274. package/src/core/segment_buffers/garbage_collector.ts +1 -1
  275. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +10 -2
  276. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +1 -1
  277. package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +1 -1
  278. package/src/core/segment_buffers/index.ts +2 -0
  279. package/src/core/segment_buffers/inventory/index.ts +2 -0
  280. package/src/core/segment_buffers/inventory/segment_inventory.ts +49 -17
  281. package/src/core/stream/adaptation/get_representations_switch_strategy.ts +21 -12
  282. package/src/core/stream/orchestrator/stream_orchestrator.ts +14 -19
  283. package/src/core/stream/period/period_stream.ts +7 -8
  284. package/src/core/stream/period/types.ts +2 -3
  285. package/src/core/stream/period/utils/get_adaptation_switch_strategy.ts +21 -15
  286. package/src/core/stream/representation/representation_stream.ts +3 -5
  287. package/src/core/stream/representation/types.ts +2 -2
  288. package/src/core/stream/representation/utils/append_segment_to_buffer.ts +1 -1
  289. package/src/core/stream/representation/utils/get_buffer_status.ts +5 -4
  290. package/src/core/stream/representation/utils/get_needed_segments.ts +2 -2
  291. package/src/default_config.ts +22 -17
  292. package/src/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.ts +3 -1
  293. package/src/experimental/tools/createMetaplaylist/get_duration_from_manifest.ts +2 -0
  294. package/src/manifest/adaptation.ts +2 -1
  295. package/src/manifest/representation_index/static.ts +2 -2
  296. package/src/manifest/representation_index/types.ts +4 -4
  297. package/src/parsers/manifest/dash/common/__tests__/manifest_bounds_calculator.test.ts +182 -36
  298. package/src/parsers/manifest/dash/common/indexes/base.ts +12 -4
  299. package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +19 -5
  300. package/src/parsers/manifest/dash/common/indexes/index.ts +16 -4
  301. package/src/parsers/manifest/dash/common/indexes/list.ts +2 -2
  302. package/src/parsers/manifest/dash/common/indexes/template.ts +52 -31
  303. package/src/parsers/manifest/dash/common/indexes/timeline/index.ts +4 -1
  304. package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +366 -60
  305. package/src/parsers/manifest/dash/common/manifest_bounds_calculator.ts +63 -25
  306. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +10 -4
  307. package/src/parsers/manifest/dash/common/parse_mpd.ts +28 -15
  308. package/src/parsers/manifest/dash/common/parse_periods.ts +12 -17
  309. package/src/parsers/manifest/dash/common/parse_representation_index.ts +50 -26
  310. package/src/parsers/manifest/dash/common/parse_representations.ts +9 -3
  311. package/src/parsers/manifest/local/representation_index.ts +3 -3
  312. package/src/parsers/manifest/metaplaylist/representation_index.ts +2 -2
  313. package/src/parsers/manifest/smooth/representation_index.ts +23 -9
  314. package/src/parsers/manifest/utils/__tests__/get_first_time_from_adaptations.test.ts +1 -1
  315. package/src/parsers/manifest/utils/__tests__/get_last_time_from_adaptation.test.ts +1 -1
  316. package/src/parsers/manifest/utils/index_helpers.ts +1 -1
  317. package/src/parsers/texttracks/ttml/html/apply_line_height.ts +3 -1
  318. package/src/public_types.ts +108 -36
  319. package/src/transports/dash/init_segment_loader.ts +5 -0
  320. package/src/transports/dash/manifest_parser.ts +6 -0
  321. package/src/transports/dash/segment_loader.ts +1 -0
  322. package/src/transports/dash/text_loader.ts +2 -0
  323. package/src/transports/metaplaylist/manifest_loader.ts +1 -0
  324. package/src/transports/metaplaylist/pipelines.ts +4 -1
  325. package/src/transports/smooth/pipelines.ts +2 -0
  326. package/src/transports/smooth/segment_loader.ts +1 -0
  327. package/src/transports/types.ts +12 -0
  328. package/src/transports/utils/generate_manifest_loader.ts +3 -0
  329. package/src/utils/request/fetch.ts +35 -8
  330. package/src/utils/request/xhr.ts +45 -14
  331. package/dist/commonjs/parsers/manifest/utils/is_segment_still_available.d.ts +0 -29
  332. package/dist/commonjs/parsers/manifest/utils/is_segment_still_available.js +0 -54
  333. package/dist/es2017/parsers/manifest/utils/is_segment_still_available.d.ts +0 -29
  334. package/dist/es2017/parsers/manifest/utils/is_segment_still_available.js +0 -51
  335. package/src/parsers/manifest/utils/is_segment_still_available.ts +0 -58
  336. package/src/typings/object-assign.d.ts +0 -48
@@ -116,7 +116,7 @@ var Player = /** @class */ (function (_super) {
116
116
  // Workaround to support Firefox autoplay on FF 42.
117
117
  // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1194624
118
118
  videoElement.preload = "auto";
119
- _this.version = /* PLAYER_VERSION */ "4.0.0-dev.2023111400";
119
+ _this.version = /* PLAYER_VERSION */ "4.0.0-dev.2023121900";
120
120
  _this.log = log_1.default;
121
121
  _this.state = "STOPPED";
122
122
  _this.videoElement = videoElement;
@@ -321,7 +321,7 @@ var Player = /** @class */ (function (_super) {
321
321
  */
322
322
  Player.prototype._priv_initializeContentPlayback = function (options) {
323
323
  var _this = this;
324
- var _a, _b, _c, _d;
324
+ var _a, _b, _c, _d, _e, _f;
325
325
  var autoPlay = options.autoPlay, defaultAudioTrackSwitchingMode = options.defaultAudioTrackSwitchingMode, enableFastSwitching = options.enableFastSwitching, initialManifest = options.initialManifest, keySystems = options.keySystems, lowLatencyMode = options.lowLatencyMode, minimumManifestUpdateInterval = options.minimumManifestUpdateInterval, requestConfig = options.requestConfig, onCodecSwitch = options.onCodecSwitch, startAt = options.startAt, transport = options.transport, checkMediaSegmentIntegrity = options.checkMediaSegmentIntegrity, manifestLoader = options.manifestLoader, referenceDateTime = options.referenceDateTime, representationFilter = options.representationFilter, segmentLoader = options.segmentLoader, serverSyncInfos = options.serverSyncInfos, __priv_manifestUpdateUrl = options.__priv_manifestUpdateUrl, __priv_patchLastSegmentInSidx = options.__priv_patchLastSegmentInSidx, url = options.url;
326
326
  // Perform multiple checks on the given options
327
327
  if (this.videoElement === null) {
@@ -347,7 +347,8 @@ var Player = /** @class */ (function (_super) {
347
347
  var transportPipelines = transportFn({ lowLatencyMode: lowLatencyMode, checkMediaSegmentIntegrity: checkMediaSegmentIntegrity, manifestLoader: manifestLoader, referenceDateTime: referenceDateTime, representationFilter: representationFilter, segmentLoader: segmentLoader, serverSyncInfos: serverSyncInfos, __priv_manifestUpdateUrl: __priv_manifestUpdateUrl, __priv_patchLastSegmentInSidx: __priv_patchLastSegmentInSidx });
348
348
  /** Interface used to load and refresh the Manifest. */
349
349
  var manifestRequestSettings = { lowLatencyMode: lowLatencyMode, maxRetry: (_a = requestConfig.manifest) === null || _a === void 0 ? void 0 : _a.maxRetry,
350
- requestTimeout: (_b = requestConfig.manifest) === null || _b === void 0 ? void 0 : _b.timeout, minimumManifestUpdateInterval: minimumManifestUpdateInterval, initialManifest: initialManifest };
350
+ requestTimeout: (_b = requestConfig.manifest) === null || _b === void 0 ? void 0 : _b.timeout,
351
+ connectionTimeout: (_c = requestConfig.manifest) === null || _c === void 0 ? void 0 : _c.connectionTimeout, minimumManifestUpdateInterval: minimumManifestUpdateInterval, initialManifest: initialManifest };
351
352
  var relyOnVideoVisibilityAndSize = (0, can_rely_on_video_visibility_and_size_1.default)();
352
353
  var throttlers = { throttleBitrate: {},
353
354
  limitResolution: {} };
@@ -390,8 +391,9 @@ var Player = /** @class */ (function (_super) {
390
391
  { textTrackMode: "html",
391
392
  textTrackElement: options.textTrackElement };
392
393
  var bufferOptions = (0, object_assign_1.default)({ enableFastSwitching: enableFastSwitching, onCodecSwitch: onCodecSwitch }, this._priv_bufferOptions);
393
- var segmentRequestOptions = { lowLatencyMode: lowLatencyMode, maxRetry: (_c = requestConfig.segment) === null || _c === void 0 ? void 0 : _c.maxRetry,
394
- requestTimeout: (_d = requestConfig.segment) === null || _d === void 0 ? void 0 : _d.timeout };
394
+ var segmentRequestOptions = { lowLatencyMode: lowLatencyMode, maxRetry: (_d = requestConfig.segment) === null || _d === void 0 ? void 0 : _d.maxRetry,
395
+ requestTimeout: (_e = requestConfig.segment) === null || _e === void 0 ? void 0 : _e.timeout,
396
+ connectionTimeout: (_f = requestConfig.segment) === null || _f === void 0 ? void 0 : _f.connectionTimeout };
395
397
  initializer = new features_1.default.mediaSourceInit({
396
398
  adaptiveOptions: adaptiveOptions,
397
399
  autoPlay: autoPlay,
@@ -531,12 +533,12 @@ var Player = /** @class */ (function (_super) {
531
533
  case "ENDED":
532
534
  _this._priv_reloadingMetadata.reloadInPause = true;
533
535
  _this._priv_reloadingMetadata.reloadPosition =
534
- playbackObserver.getReference().getValue().position;
536
+ playbackObserver.getReference().getValue().position.getPolled();
535
537
  break;
536
538
  default:
537
539
  var o = playbackObserver.getReference().getValue();
538
540
  _this._priv_reloadingMetadata.reloadInPause = o.paused;
539
- _this._priv_reloadingMetadata.reloadPosition = o.position;
541
+ _this._priv_reloadingMetadata.reloadPosition = o.position.getWanted();
540
542
  break;
541
543
  }
542
544
  };
@@ -1543,6 +1545,27 @@ var Player = /** @class */ (function (_super) {
1543
1545
  }
1544
1546
  return null;
1545
1547
  };
1548
+ /**
1549
+ * Returns the current position for live contents.
1550
+ *
1551
+ * Returns `null` if no content is loaded or if the current loaded content is
1552
+ * not considered as a live content.
1553
+ * Returns `undefined` if that live position is currently unknown.
1554
+ * @returns {number}
1555
+ */
1556
+ Player.prototype.getLivePosition = function () {
1557
+ if (this._priv_contentInfos === null) {
1558
+ return null;
1559
+ }
1560
+ var _a = this._priv_contentInfos, isDirectFile = _a.isDirectFile, manifest = _a.manifest;
1561
+ if (isDirectFile) {
1562
+ return undefined;
1563
+ }
1564
+ if ((manifest === null || manifest === void 0 ? void 0 : manifest.isLive) !== true) {
1565
+ return null;
1566
+ }
1567
+ return manifest.getLivePosition();
1568
+ };
1546
1569
  /**
1547
1570
  * Get maximum seek-able position.
1548
1571
  * @returns {number}
@@ -1587,9 +1610,11 @@ var Player = /** @class */ (function (_super) {
1587
1610
  }
1588
1611
  var segmentBufferStatus = this._priv_contentInfos
1589
1612
  .segmentBuffersStore.getStatus(bufferType);
1590
- return segmentBufferStatus.type === "initialized" ?
1591
- segmentBufferStatus.value.getInventory() :
1592
- null;
1613
+ if (segmentBufferStatus.type === "initialized") {
1614
+ segmentBufferStatus.value.synchronizeInventory();
1615
+ return segmentBufferStatus.value.getInventory();
1616
+ }
1617
+ return null;
1593
1618
  };
1594
1619
  /**
1595
1620
  * /!\ For tools use only! Do not touch!
@@ -2061,7 +2086,7 @@ var Player = /** @class */ (function (_super) {
2061
2086
  var maximumPosition = manifest !== null ? manifest.getMaximumSafePosition() :
2062
2087
  undefined;
2063
2088
  var positionData = {
2064
- position: observation.position,
2089
+ position: observation.position.getPolled(),
2065
2090
  duration: observation.duration,
2066
2091
  playbackRate: observation.playbackRate,
2067
2092
  maximumPosition: maximumPosition,
@@ -2073,18 +2098,18 @@ var Player = /** @class */ (function (_super) {
2073
2098
  };
2074
2099
  if (manifest !== null &&
2075
2100
  manifest.isLive &&
2076
- observation.position > 0) {
2101
+ observation.position.getPolled() > 0) {
2077
2102
  var ast = (_b = manifest.availabilityStartTime) !== null && _b !== void 0 ? _b : 0;
2078
- positionData.wallClockTime = observation.position + ast;
2103
+ positionData.wallClockTime = observation.position.getPolled() + ast;
2079
2104
  var livePosition = manifest.getLivePosition();
2080
2105
  if (livePosition !== undefined) {
2081
- positionData.liveGap = livePosition - observation.position;
2106
+ positionData.liveGap = livePosition - observation.position.getPolled();
2082
2107
  }
2083
2108
  }
2084
2109
  else if (isDirectFile && this.videoElement !== null) {
2085
2110
  var startDate = (0, compat_1.getStartDate)(this.videoElement);
2086
2111
  if (startDate !== undefined) {
2087
- positionData.wallClockTime = startDate + observation.position;
2112
+ positionData.wallClockTime = startDate + observation.position.getPolled();
2088
2113
  }
2089
2114
  }
2090
2115
  this.trigger("positionUpdate", positionData);
@@ -2232,5 +2257,5 @@ var Player = /** @class */ (function (_super) {
2232
2257
  };
2233
2258
  return Player;
2234
2259
  }(event_emitter_1.default));
2235
- Player.version = /* PLAYER_VERSION */ "4.0.0-dev.2023111400";
2260
+ Player.version = /* PLAYER_VERSION */ "4.0.0-dev.2023121900";
2236
2261
  exports.default = Player;
@@ -34,7 +34,7 @@ function emitSeekEvents(mediaElement, playbackObserver, onSeeking, onSeeked, can
34
34
  if (cancelSignal.isCancelled() || mediaElement === null) {
35
35
  return;
36
36
  }
37
- var wasSeeking = playbackObserver.getReference().getValue().seeking;
37
+ var wasSeeking = playbackObserver.getReference().getValue().seeking === 2 /* SeekingState.External */;
38
38
  if (wasSeeking) {
39
39
  onSeeking();
40
40
  if (cancelSignal.isCancelled()) {
@@ -66,13 +66,9 @@ var server_certificate_store_1 = require("./utils/server_certificate_store");
66
66
  * @returns {Object|null}
67
67
  */
68
68
  function createPersistentSessionsStorage(keySystemOptions) {
69
- if ((0, is_null_or_undefined_1.default)(keySystemOptions.persistentLicenseConfig)) {
70
- return null;
71
- }
72
69
  var persistentLicenseConfig = keySystemOptions.persistentLicenseConfig;
73
- if (persistentLicenseConfig == null) {
74
- throw new errors_1.EncryptedMediaError("INVALID_KEY_SYSTEM", "No `persistentLicenseConfig` found for " +
75
- "persistent license.");
70
+ if ((0, is_null_or_undefined_1.default)(persistentLicenseConfig)) {
71
+ return null;
76
72
  }
77
73
  log_1.default.debug("DRM: Set the given license storage");
78
74
  return new persistent_sessions_store_1.default(persistentLicenseConfig);
@@ -171,6 +171,12 @@ export interface IManifestFetcherSettings {
171
171
  * `undefined` will lead to a default, large, timeout being used.
172
172
  */
173
173
  requestTimeout: number | undefined;
174
+ /**
175
+ * Connection timeout, in milliseconds, after which the request is canceled
176
+ * if the responses headers has not being received.
177
+ * Do not set or set to "undefined" to disable it.
178
+ */
179
+ connectionTimeout: number | undefined;
174
180
  /** Limit the frequency of Manifest updates. */
175
181
  minimumManifestUpdateInterval: number;
176
182
  /**
@@ -82,7 +82,6 @@ var errors_1 = require("../../../errors");
82
82
  var log_1 = require("../../../log");
83
83
  var manifest_1 = require("../../../manifest");
84
84
  var event_emitter_1 = require("../../../utils/event_emitter");
85
- var is_null_or_undefined_1 = require("../../../utils/is_null_or_undefined");
86
85
  var monotonic_timestamp_1 = require("../../../utils/monotonic_timestamp");
87
86
  var noop_1 = require("../../../utils/noop");
88
87
  var task_canceller_1 = require("../../../utils/task_canceller");
@@ -206,13 +205,22 @@ var ManifestFetcher = /** @class */ (function (_super) {
206
205
  */
207
206
  function callLoaderWithRetries(manifestUrl) {
208
207
  var loadManifest = pipelines.loadManifest;
209
- var requestTimeout = (0, is_null_or_undefined_1.default)(settings.requestTimeout) ?
208
+ var requestTimeout = (settings.requestTimeout === undefined) ?
210
209
  config_1.default.getCurrent().DEFAULT_REQUEST_TIMEOUT :
211
210
  settings.requestTimeout;
211
+ var connectionTimeout = (settings.connectionTimeout === undefined) ?
212
+ config_1.default.getCurrent().DEFAULT_CONNECTION_TIMEOUT :
213
+ settings.connectionTimeout;
212
214
  if (requestTimeout < 0) {
213
215
  requestTimeout = undefined;
214
216
  }
215
- var callLoader = function () { return loadManifest(manifestUrl, { timeout: requestTimeout }, cancelSignal); };
217
+ if (connectionTimeout < 0) {
218
+ connectionTimeout = undefined;
219
+ }
220
+ var callLoader = function () { return loadManifest(manifestUrl, {
221
+ timeout: requestTimeout,
222
+ connectionTimeout: connectionTimeout,
223
+ }, cancelSignal); };
216
224
  return (0, schedule_request_1.scheduleRequestPromise)(callLoader, backoffSettings, cancelSignal);
217
225
  }
218
226
  var cancelSignal, settings, pipelines, requestUrl, backoffSettings, response_1, err_1;
@@ -135,14 +135,21 @@ export interface ISegmentFetcherOptions {
135
135
  * To set to `-1` for no timeout.
136
136
  */
137
137
  requestTimeout: number;
138
+ /**
139
+ * Connection timeout, in milliseconds, after which the request is canceled
140
+ * if the responses headers has not being received.
141
+ * Do not set or set to "undefined" to disable it.
142
+ */
143
+ connectionTimeout: number | undefined;
138
144
  }
139
145
  /**
140
146
  * @param {string} bufferType
141
147
  * @param {Object}
142
148
  * @returns {Object}
143
149
  */
144
- export declare function getSegmentFetcherOptions({ maxRetry, lowLatencyMode, requestTimeout }: {
150
+ export declare function getSegmentFetcherOptions({ maxRetry, lowLatencyMode, requestTimeout, connectionTimeout }: {
145
151
  maxRetry?: number | undefined;
146
152
  requestTimeout?: number | undefined;
153
+ connectionTimeout?: number | undefined;
147
154
  lowLatencyMode: boolean;
148
155
  }): ISegmentFetcherOptions;
@@ -95,6 +95,8 @@ function createSegmentFetcher(bufferType, pipeline, cdnPrioritizer, lifecycleCal
95
95
  var requestOptions = {
96
96
  timeout: options.requestTimeout < 0 ? undefined :
97
97
  options.requestTimeout,
98
+ connectionTimeout: options.connectionTimeout === undefined ? undefined :
99
+ options.connectionTimeout < 0 ? undefined : options.connectionTimeout,
98
100
  };
99
101
  /**
100
102
  * Cache audio and video initialization segments.
@@ -308,14 +310,16 @@ exports.default = createSegmentFetcher;
308
310
  * @returns {Object}
309
311
  */
310
312
  function getSegmentFetcherOptions(_a) {
311
- var maxRetry = _a.maxRetry, lowLatencyMode = _a.lowLatencyMode, requestTimeout = _a.requestTimeout;
312
- var _b = config_1.default.getCurrent(), DEFAULT_MAX_REQUESTS_RETRY_ON_ERROR = _b.DEFAULT_MAX_REQUESTS_RETRY_ON_ERROR, DEFAULT_REQUEST_TIMEOUT = _b.DEFAULT_REQUEST_TIMEOUT, INITIAL_BACKOFF_DELAY_BASE = _b.INITIAL_BACKOFF_DELAY_BASE, MAX_BACKOFF_DELAY_BASE = _b.MAX_BACKOFF_DELAY_BASE;
313
+ var maxRetry = _a.maxRetry, lowLatencyMode = _a.lowLatencyMode, requestTimeout = _a.requestTimeout, connectionTimeout = _a.connectionTimeout;
314
+ var _b = config_1.default.getCurrent(), DEFAULT_MAX_REQUESTS_RETRY_ON_ERROR = _b.DEFAULT_MAX_REQUESTS_RETRY_ON_ERROR, DEFAULT_REQUEST_TIMEOUT = _b.DEFAULT_REQUEST_TIMEOUT, DEFAULT_CONNECTION_TIMEOUT = _b.DEFAULT_CONNECTION_TIMEOUT, INITIAL_BACKOFF_DELAY_BASE = _b.INITIAL_BACKOFF_DELAY_BASE, MAX_BACKOFF_DELAY_BASE = _b.MAX_BACKOFF_DELAY_BASE;
313
315
  return { maxRetry: maxRetry !== null && maxRetry !== void 0 ? maxRetry : DEFAULT_MAX_REQUESTS_RETRY_ON_ERROR,
314
316
  baseDelay: lowLatencyMode ? INITIAL_BACKOFF_DELAY_BASE.LOW_LATENCY :
315
317
  INITIAL_BACKOFF_DELAY_BASE.REGULAR,
316
318
  maxDelay: lowLatencyMode ? MAX_BACKOFF_DELAY_BASE.LOW_LATENCY :
317
319
  MAX_BACKOFF_DELAY_BASE.REGULAR,
318
- requestTimeout: (0, is_null_or_undefined_1.default)(requestTimeout) ? DEFAULT_REQUEST_TIMEOUT :
319
- requestTimeout };
320
+ requestTimeout: (requestTimeout === undefined) ? DEFAULT_REQUEST_TIMEOUT :
321
+ requestTimeout,
322
+ connectionTimeout: (connectionTimeout === undefined) ?
323
+ DEFAULT_CONNECTION_TIMEOUT : connectionTimeout, };
320
324
  }
321
325
  exports.getSegmentFetcherOptions = getSegmentFetcherOptions;
@@ -74,4 +74,5 @@ export interface ISegmentFetcherCreatorBackoffOptions {
74
74
  * `undefined` will lead to a default, large, timeout being used.
75
75
  */
76
76
  requestTimeout: number | undefined;
77
+ connectionTimeout: number | undefined;
77
78
  }
@@ -329,7 +329,7 @@ function scheduleRequestWithCdns(cdns, cdnPrioritizer, performRequest, options,
329
329
  * attempts already done for that resource.
330
330
  *
331
331
  * Returns `undefined` if there's no Cdn left to request the resource.
332
- * @param {Array.<Object>}
332
+ * @param {Array.<Object>} sortedCdns
333
333
  * @returns {Object|undefined}
334
334
  */
335
335
  function getPrioritaryRequestableCdnFromSortedList(sortedCdns) {
@@ -37,6 +37,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
37
37
  var compat_1 = require("../../compat");
38
38
  var log_1 = require("../../log");
39
39
  var assert_1 = require("../../utils/assert");
40
+ var is_null_or_undefined_1 = require("../../utils/is_null_or_undefined");
40
41
  var reference_1 = require("../../utils/reference");
41
42
  var task_canceller_1 = require("../../utils/task_canceller");
42
43
  var types_1 = require("./types");
@@ -179,7 +180,11 @@ var DirectFileContentInitializer = /** @class */ (function (_super) {
179
180
  log_1.default.debug("Init: Initial time calculated:", initTime);
180
181
  return initTime;
181
182
  };
182
- (0, initial_seek_and_play_1.default)(mediaElement, playbackObserver, initialTime, autoPlay, function (err) { return _this.trigger("warning", err); }, cancelSignal).autoPlayResult
183
+ (0, initial_seek_and_play_1.default)({ mediaElement: mediaElement, playbackObserver: playbackObserver, startTime: initialTime,
184
+ mustAutoPlay: autoPlay,
185
+ onWarning: function (err) { return _this.trigger("warning", err); },
186
+ isDirectfile: true }, cancelSignal)
187
+ .autoPlayResult
183
188
  .then(function () {
184
189
  return (0, get_loaded_reference_1.default)(playbackObserver, mediaElement, true, cancelSignal)
185
190
  .onUpdate(function (isLoaded, stopListening) {
@@ -205,10 +210,10 @@ exports.default = DirectFileContentInitializer;
205
210
  * @returns {number}
206
211
  */
207
212
  function getDirectFileInitialTime(mediaElement, startAt) {
208
- if (startAt == null) {
213
+ if ((0, is_null_or_undefined_1.default)(startAt)) {
209
214
  return 0;
210
215
  }
211
- if (startAt.position != null) {
216
+ if (!(0, is_null_or_undefined_1.default)(startAt.position)) {
212
217
  return startAt.position;
213
218
  }
214
219
  else if (startAt.wallClockTime != null) {
@@ -218,15 +223,31 @@ function getDirectFileInitialTime(mediaElement, startAt) {
218
223
  return startAt.fromFirstPosition;
219
224
  }
220
225
  var duration = mediaElement.duration;
221
- if (duration == null || !isFinite(duration)) {
222
- log_1.default.warn("startAt.fromLastPosition set but no known duration, " +
223
- "beginning at 0.");
224
- return 0;
225
- }
226
226
  if (typeof startAt.fromLastPosition === "number") {
227
+ if ((0, is_null_or_undefined_1.default)(duration) || !isFinite(duration)) {
228
+ log_1.default.warn("startAt.fromLastPosition set but no known duration, " +
229
+ "beginning at 0.");
230
+ return 0;
231
+ }
227
232
  return Math.max(0, duration + startAt.fromLastPosition);
228
233
  }
234
+ else if (typeof startAt.fromLivePosition === "number") {
235
+ var livePosition = mediaElement.seekable.length > 0 ?
236
+ mediaElement.seekable.end(0) :
237
+ duration;
238
+ if ((0, is_null_or_undefined_1.default)(livePosition)) {
239
+ log_1.default.warn("startAt.fromLivePosition set but no known live position, " +
240
+ "beginning at 0.");
241
+ return 0;
242
+ }
243
+ return Math.max(0, livePosition + startAt.fromLivePosition);
244
+ }
229
245
  else if (startAt.percentage != null) {
246
+ if ((0, is_null_or_undefined_1.default)(duration) || !isFinite(duration)) {
247
+ log_1.default.warn("startAt.percentage set but no known duration, " +
248
+ "beginning at 0.");
249
+ return 0;
250
+ }
230
251
  var percentage = startAt.percentage;
231
252
  if (percentage >= 100) {
232
253
  return duration;
@@ -160,6 +160,12 @@ export interface IInitializeArguments {
160
160
  * `-1` indicates no timeout.
161
161
  */
162
162
  requestTimeout: number | undefined;
163
+ /**
164
+ * Amount of time, in milliseconds, after which a request that hasn't receive
165
+ * the headers and status code should be aborted and optionnaly retried,
166
+ * depending on the maxRetry configuration.
167
+ */
168
+ connectionTimeout: number | undefined;
163
169
  /** Maximum number of time a request on error will be retried. */
164
170
  maxRetry: number | undefined;
165
171
  };
@@ -341,7 +341,10 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
341
341
  cancelSignal.register(function () {
342
342
  segmentBuffersStore.disposeAll();
343
343
  });
344
- var _b = (0, initial_seek_and_play_1.default)(mediaElement, playbackObserver, initialTime, autoPlay, function (err) { return _this.trigger("warning", err); }, cancelSignal), autoPlayResult = _b.autoPlayResult, initialPlayPerformed = _b.initialPlayPerformed, initialSeekPerformed = _b.initialSeekPerformed;
344
+ var _b = (0, initial_seek_and_play_1.default)({ mediaElement: mediaElement, playbackObserver: playbackObserver, startTime: initialTime,
345
+ mustAutoPlay: autoPlay,
346
+ onWarning: function (err) { _this.trigger("warning", err); },
347
+ isDirectfile: false }, cancelSignal), autoPlayResult = _b.autoPlayResult, initialPlayPerformed = _b.initialPlayPerformed;
345
348
  if (cancelSignal.isCancelled()) {
346
349
  return;
347
350
  }
@@ -361,14 +364,19 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
361
364
  });
362
365
  }
363
366
  }, { clearSignal: cancelSignal, emitCurrentValue: true });
364
- var streamObserver = (0, create_stream_playback_observer_1.default)(playbackObserver, { autoPlay: autoPlay, manifest: manifest, initialPlayPerformed: initialPlayPerformed, initialSeekPerformed: initialSeekPerformed, speed: speed, startTime: initialTime }, cancelSignal);
367
+ var streamObserver = (0, create_stream_playback_observer_1.default)(playbackObserver, { autoPlay: autoPlay, manifest: manifest, initialPlayPerformed: initialPlayPerformed, speed: speed }, cancelSignal);
365
368
  var rebufferingController = this._createRebufferingController(playbackObserver, manifest, segmentBuffersStore, speed, cancelSignal);
366
369
  rebufferingController.addEventListener("needsReload", function () {
370
+ var position;
371
+ var lastObservation = playbackObserver.getReference().getValue();
372
+ if (lastObservation.position.isAwaitingFuturePosition()) {
373
+ position = lastObservation.position.getWanted();
374
+ }
375
+ else {
376
+ position = playbackObserver.getCurrentTime();
377
+ }
367
378
  // NOTE couldn't both be always calculated at event destination?
368
379
  // Maybe there are exceptions?
369
- var position = initialSeekPerformed.getValue() ?
370
- playbackObserver.getCurrentTime() :
371
- initialTime;
372
380
  var autoplay = initialPlayPerformed.getValue() ?
373
381
  !playbackObserver.getIsPaused() :
374
382
  autoPlay;
@@ -428,10 +436,10 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
428
436
  if (
429
437
  // Data is buffered around the current position
430
438
  obs.currentRange !== null ||
431
- // Or, for whatever reason, playback is already advancing
432
- obs.position > seekedTime + 0.1) {
439
+ // Or, for whatever reason, we have no buffer but we're already advancing
440
+ obs.position.getPolled() > seekedTime + 0.1) {
433
441
  stopListening();
434
- playbackObserver.setCurrentTime(obs.position + 0.001);
442
+ playbackObserver.setCurrentTime(obs.position.getWanted() + 0.001);
435
443
  }
436
444
  }, { includeLastObservation: false, clearSignal: cancelSignal });
437
445
  },
@@ -507,10 +515,12 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
507
515
  return self.trigger("bitrateEstimateChange", value);
508
516
  },
509
517
  needsMediaSourceReload: function (payload) {
510
- var _a, _b;
518
+ var _a;
511
519
  var lastObservation = streamObserver.getReference().getValue();
512
- var currentPosition = (_a = lastObservation.position.pending) !== null && _a !== void 0 ? _a : streamObserver.getCurrentTime();
513
- var isPaused = (_b = lastObservation.paused.pending) !== null && _b !== void 0 ? _b : streamObserver.getIsPaused();
520
+ var currentPosition = lastObservation.position.isAwaitingFuturePosition() ?
521
+ lastObservation.position.getWanted() :
522
+ streamObserver.getCurrentTime();
523
+ var isPaused = (_a = lastObservation.paused.pending) !== null && _a !== void 0 ? _a : streamObserver.getIsPaused();
514
524
  var position = currentPosition + payload.timeOffset;
515
525
  if (payload.minimumPosition !== undefined) {
516
526
  position = Math.max(payload.minimumPosition, position);
@@ -521,17 +531,21 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
521
531
  onReloadOrder({ position: position, autoPlay: !isPaused });
522
532
  },
523
533
  needsDecipherabilityFlush: function () {
524
- var _a, _b, _c;
534
+ var _a;
525
535
  var keySystem = (0, decrypt_1.getKeySystemConfiguration)(mediaElement);
526
536
  if ((0, compat_1.shouldReloadMediaSourceOnDecipherabilityUpdate)(keySystem === null || keySystem === void 0 ? void 0 : keySystem[0])) {
527
537
  var lastObservation = streamObserver.getReference().getValue();
528
- var position = (_a = lastObservation.position.pending) !== null && _a !== void 0 ? _a : streamObserver.getCurrentTime();
529
- var isPaused = (_b = lastObservation.paused.pending) !== null && _b !== void 0 ? _b : streamObserver.getIsPaused();
538
+ var position = lastObservation.position.isAwaitingFuturePosition() ?
539
+ lastObservation.position.getWanted() :
540
+ streamObserver.getCurrentTime();
541
+ var isPaused = (_a = lastObservation.paused.pending) !== null && _a !== void 0 ? _a : streamObserver.getIsPaused();
530
542
  onReloadOrder({ position: position, autoPlay: !isPaused });
531
543
  }
532
544
  else {
533
545
  var lastObservation = streamObserver.getReference().getValue();
534
- var position = (_c = lastObservation.position.pending) !== null && _c !== void 0 ? _c : streamObserver.getCurrentTime();
546
+ var position = lastObservation.position.isAwaitingFuturePosition() ?
547
+ lastObservation.position.getWanted() :
548
+ streamObserver.getCurrentTime();
535
549
  // simple seek close to the current position
536
550
  // to flush the buffers
537
551
  if (position + 0.001 < lastObservation.duration) {
@@ -599,9 +613,7 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
599
613
  contentTimeBoundariesObserver.addEventListener("periodChange", function (period) {
600
614
  _this.trigger("activePeriodChanged", { period: period });
601
615
  });
602
- contentTimeBoundariesObserver.addEventListener("durationUpdate", function (newDuration) {
603
- mediaSourceDurationUpdater.updateDuration(newDuration.duration, newDuration.isEnd);
604
- });
616
+ contentTimeBoundariesObserver.addEventListener("endingPositionChange", function (x) { return mediaSourceDurationUpdater.updateDuration(x.endingPosition, x.isEnd); });
605
617
  contentTimeBoundariesObserver.addEventListener("endOfStream", function () {
606
618
  if (endOfStreamCanceller === null) {
607
619
  endOfStreamCanceller = new task_canceller_1.default();
@@ -617,8 +629,8 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
617
629
  endOfStreamCanceller = null;
618
630
  }
619
631
  });
620
- var currentDuration = contentTimeBoundariesObserver.getCurrentDuration();
621
- mediaSourceDurationUpdater.updateDuration(currentDuration.duration, currentDuration.isEnd);
632
+ var endInfo = contentTimeBoundariesObserver.getCurrentEndingTime();
633
+ mediaSourceDurationUpdater.updateDuration(endInfo.endingPosition, endInfo.isEnd);
622
634
  return contentTimeBoundariesObserver;
623
635
  };
624
636
  /**
@@ -22,8 +22,8 @@ import { IStreamOrchestratorPlaybackObservation } from "../../stream";
22
22
  /**
23
23
  * Observes what's being played and take care of media events relating to time
24
24
  * boundaries:
25
- * - Emits a `durationUpdate` when the duration of the current content is
26
- * known and every time it changes.
25
+ * - Emits a `endingPositionChange` when the known maximum playable position
26
+ * of the current content is known and every time it changes.
27
27
  * - Emits `endOfStream` API once segments have been pushed until the end and
28
28
  * `resumeStream` if downloads starts back.
29
29
  * - Emits a `periodChange` event when the currently-playing Period seemed to
@@ -56,10 +56,11 @@ export default class ContentTimeBoundariesObserver extends EventEmitter<IContent
56
56
  */
57
57
  constructor(manifest: Manifest, playbackObserver: IReadOnlyPlaybackObserver<IStreamOrchestratorPlaybackObservation>, bufferTypes: IBufferType[]);
58
58
  /**
59
- * Returns an estimate of the current duration of the content.
59
+ * Returns an estimate of the current last position which may be played in
60
+ * the content at the moment.
60
61
  * @returns {Object}
61
62
  */
62
- getCurrentDuration(): IDurationItem;
63
+ getCurrentEndingTime(): IEndingPositionInformation;
63
64
  /**
64
65
  * Method to call any time an Adaptation has been selected.
65
66
  *
@@ -126,20 +127,20 @@ export default class ContentTimeBoundariesObserver extends EventEmitter<IContent
126
127
  private _addActivelyLoadedPeriod;
127
128
  private _removeActivelyLoadedPeriod;
128
129
  private _checkCurrentPeriod;
129
- private _getManifestDuration;
130
+ private _getManifestEndTime;
130
131
  private _lazilyCreateActiveStreamInfo;
131
132
  private _checkEndOfStream;
132
133
  }
133
- export interface IDurationItem {
134
+ export interface IEndingPositionInformation {
134
135
  /**
135
136
  * The new maximum known position (note that this is the ending position
136
137
  * currently known of the current content, it might be superior to the last
137
138
  * position at which segments are available and it might also evolve over
138
139
  * time), in seconds.
139
140
  */
140
- duration: number;
141
+ endingPosition: number;
141
142
  /**
142
- * If `true`, the communicated `duration` is the actual end of the content.
143
+ * If `true`, the communicated `endingPosition` is the actual end of the content.
143
144
  * It may still be updated due to a track change or to add precision, but it
144
145
  * is still a (rough) estimate of the maximum position that content should
145
146
  * have.
@@ -147,7 +148,7 @@ export interface IDurationItem {
147
148
  * If `false`, this is the currently known maximum position associated to
148
149
  * the content, but the content is still evolving (typically, new media
149
150
  * segments are still being generated) and as such it can still have a
150
- * longer duration in the future.
151
+ * longer `endingPosition` in the future.
151
152
  */
152
153
  isEnd: boolean;
153
154
  }
@@ -161,10 +162,10 @@ export interface IContentTimeBoundariesObserverEvent {
161
162
  /** Triggered when a new `Period` is currently playing. */
162
163
  periodChange: Period;
163
164
  /**
164
- * Triggered when the duration of the currently-playing content became known
165
- * or changed.
165
+ * Triggered when the ending position of the currently-playing content became
166
+ * known or changed.
166
167
  */
167
- durationUpdate: IDurationItem;
168
+ endingPositionChange: IEndingPositionInformation;
168
169
  /**
169
170
  * Triggered when the last possible chronological segment for all types of
170
171
  * buffers has either been pushed or is being pushed to the corresponding