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
@@ -89,7 +89,7 @@ export default class StaticRepresentationIndex implements IRepresentationIndex {
89
89
  /**
90
90
  * @returns {Boolean}
91
91
  */
92
- isFinished(): true;
92
+ isStillAwaitingFutureSegments(): false;
93
93
  /**
94
94
  * @returns {Boolean}
95
95
  */
@@ -115,8 +115,8 @@ export default class StaticRepresentationIndex {
115
115
  /**
116
116
  * @returns {Boolean}
117
117
  */
118
- isFinished() {
119
- return true;
118
+ isStillAwaitingFutureSegments() {
119
+ return false;
120
120
  }
121
121
  /**
122
122
  * @returns {Boolean}
@@ -304,7 +304,7 @@ export interface IRepresentationIndex {
304
304
  getLastAvailablePosition(): number | null | undefined;
305
305
  /**
306
306
  * Returns the ending time, in seconds, of the Representation once it is
307
- * "finished" (@see isFinished).
307
+ * "finished" (@see isStillAwaitingFutureSegments).
308
308
  * Should thus be equivalent to `getLastAvailablePosition` once finished.
309
309
  *
310
310
  * Returns `null` if nothing is in the index
@@ -352,13 +352,13 @@ export interface IRepresentationIndex {
352
352
  */
353
353
  checkDiscontinuity(time: number): number | null;
354
354
  /**
355
- * Returns `true` if the last segments in this index have already been
355
+ * Returns `false` if the last segments in this index have already been
356
356
  * generated so that we can freely go to the next period.
357
- * Returns `false` if the index is still waiting on future segments to be
357
+ * Returns `true` if the index is still waiting on future segments to be
358
358
  * generated.
359
359
  * @returns {boolean}
360
360
  */
361
- isFinished(): boolean;
361
+ isStillAwaitingFutureSegments(): boolean;
362
362
  /**
363
363
  * Returns `true` if this index has all the data it needs to give the list
364
364
  * of available segments.
@@ -17,6 +17,7 @@ import { IRepresentationIndex, ISegment } from "../../../../../manifest";
17
17
  import { ISegmentInformation } from "../../../../../transports";
18
18
  import { IEMSG } from "../../../../containers/isobmff";
19
19
  import { IIndexSegment } from "../../../utils/index_helpers";
20
+ import ManifestBoundsCalculator from "../manifest_bounds_calculator";
20
21
  /**
21
22
  * Index property defined for a SegmentBase RepresentationIndex
22
23
  * This object contains every property needed to generate an ISegment for a
@@ -108,6 +109,8 @@ export interface IBaseIndexContextArgument {
108
109
  representationId?: string | undefined;
109
110
  /** Bitrate of the Representation concerned. */
110
111
  representationBitrate?: number | undefined;
112
+ /** Allows to obtain the minimum and maximum positions of a content. */
113
+ manifestBoundsCalculator: ManifestBoundsCalculator;
111
114
  isEMSGWhitelisted: (inbandEvent: IEMSG) => boolean;
112
115
  }
113
116
  export default class BaseRepresentationIndex implements IRepresentationIndex {
@@ -124,6 +127,8 @@ export default class BaseRepresentationIndex implements IRepresentationIndex {
124
127
  private _scaledPeriodStart;
125
128
  /** Absolute end of the period, timescaled and converted to index time. */
126
129
  private _scaledPeriodEnd;
130
+ /** Allows to obtain the minimum and maximum positions of a content. */
131
+ private _manifestBoundsCalculator;
127
132
  private _isEMSGWhitelisted;
128
133
  /**
129
134
  * @param {Object} index
@@ -205,7 +210,7 @@ export default class BaseRepresentationIndex implements IRepresentationIndex {
205
210
  * should become available in the future.
206
211
  * @returns {Boolean}
207
212
  */
208
- isFinished(): true;
213
+ isStillAwaitingFutureSegments(): false;
209
214
  /**
210
215
  * No segment in a `BaseRepresentationIndex` are known initially.
211
216
  * It is only defined generally in an "index segment" that will thus need to
@@ -83,6 +83,7 @@ export default class BaseRepresentationIndex {
83
83
  endNumber: index.endNumber,
84
84
  timeline: (_c = index.timeline) !== null && _c !== void 0 ? _c : [],
85
85
  timescale };
86
+ this._manifestBoundsCalculator = context.manifestBoundsCalculator;
86
87
  this._scaledPeriodStart = toIndexTime(periodStart, this._index);
87
88
  this._scaledPeriodEnd = periodEnd == null ? undefined :
88
89
  toIndexTime(periodEnd, this._index);
@@ -111,7 +112,7 @@ export default class BaseRepresentationIndex {
111
112
  * @returns {Array.<Object>}
112
113
  */
113
114
  getSegments(from, dur) {
114
- return getSegmentsFromTimeline(this._index, from, dur, this._isEMSGWhitelisted, this._scaledPeriodEnd);
115
+ return getSegmentsFromTimeline(this._index, from, dur, this._manifestBoundsCalculator, this._scaledPeriodEnd, this._isEMSGWhitelisted);
115
116
  }
116
117
  /**
117
118
  * Returns false as no Segment-Base based index should need to be refreshed.
@@ -195,8 +196,8 @@ export default class BaseRepresentationIndex {
195
196
  * should become available in the future.
196
197
  * @returns {Boolean}
197
198
  */
198
- isFinished() {
199
- return true;
199
+ isStillAwaitingFutureSegments() {
200
+ return false;
200
201
  }
201
202
  /**
202
203
  * No segment in a `BaseRepresentationIndex` are known initially.
@@ -16,21 +16,24 @@
16
16
  import { ISegment } from "../../../../../manifest";
17
17
  import { IEMSG } from "../../../../containers/isobmff";
18
18
  import { IIndexSegment } from "../../../utils/index_helpers";
19
+ import ManifestBoundsCalculator from "../manifest_bounds_calculator";
19
20
  /**
20
21
  * Get a list of Segments for the time range wanted.
21
22
  * @param {Object} index - index object, constructed by parsing the manifest.
22
23
  * @param {number} from - starting timestamp wanted, in seconds
23
24
  * @param {number} durationWanted - duration wanted, in seconds
25
+ * @param {Object} manifestBoundsCalculator
26
+ * @param {number|undefined} scaledPeriodEnd
24
27
  * @param {function} isEMSGWhitelisted
25
- * @param {number|undefined} maximumTime
26
28
  * @returns {Array.<Object>}
27
29
  */
28
30
  export default function getSegmentsFromTimeline(index: {
29
31
  availabilityTimeComplete?: boolean | undefined;
32
+ availabilityTimeOffset?: number | undefined;
30
33
  segmentUrlTemplate: string | null;
31
34
  startNumber?: number | undefined;
32
35
  endNumber?: number | undefined;
33
36
  timeline: IIndexSegment[];
34
37
  timescale: number;
35
38
  indexTimeOffset: number;
36
- }, from: number, durationWanted: number, isEMSGWhitelisted: (inbandEvent: IEMSG) => boolean, maximumTime?: number): ISegment[];
39
+ }, from: number, durationWanted: number, manifestBoundsCalculator: ManifestBoundsCalculator, scaledPeriodEnd: number | undefined, isEMSGWhitelisted: (inbandEvent: IEMSG) => boolean): ISegment[];
@@ -34,13 +34,17 @@ function getWantedRepeatIndex(segmentStartTime, segmentDuration, wantedTime) {
34
34
  * @param {Object} index - index object, constructed by parsing the manifest.
35
35
  * @param {number} from - starting timestamp wanted, in seconds
36
36
  * @param {number} durationWanted - duration wanted, in seconds
37
+ * @param {Object} manifestBoundsCalculator
38
+ * @param {number|undefined} scaledPeriodEnd
37
39
  * @param {function} isEMSGWhitelisted
38
- * @param {number|undefined} maximumTime
39
40
  * @returns {Array.<Object>}
40
41
  */
41
- export default function getSegmentsFromTimeline(index, from, durationWanted, isEMSGWhitelisted, maximumTime) {
42
+ export default function getSegmentsFromTimeline(index, from, durationWanted, manifestBoundsCalculator, scaledPeriodEnd, isEMSGWhitelisted) {
43
+ var _a;
44
+ const maximumTime = manifestBoundsCalculator.getEstimatedMaximumPosition((_a = index.availabilityTimeOffset) !== null && _a !== void 0 ? _a : 0);
45
+ const wantedMaximum = Math.min(from + durationWanted, maximumTime !== null && maximumTime !== void 0 ? maximumTime : Infinity);
42
46
  const scaledUp = toIndexTime(from, index);
43
- const scaledTo = toIndexTime(from + durationWanted, index);
47
+ const scaledTo = toIndexTime(wantedMaximum, index);
44
48
  const { timeline, timescale, segmentUrlTemplate, startNumber, endNumber } = index;
45
49
  let currentNumber = startNumber !== null && startNumber !== void 0 ? startNumber : 1;
46
50
  const segments = [];
@@ -48,7 +52,14 @@ export default function getSegmentsFromTimeline(index, from, durationWanted, isE
48
52
  for (let i = 0; i < timelineLength; i++) {
49
53
  const timelineItem = timeline[i];
50
54
  const { duration, start, range } = timelineItem;
51
- const repeat = calculateRepeat(timelineItem, timeline[i + 1], maximumTime);
55
+ let maxRepeatTime;
56
+ if (maximumTime === undefined) {
57
+ maxRepeatTime = scaledPeriodEnd;
58
+ }
59
+ else {
60
+ maxRepeatTime = Math.min(maximumTime * timescale, scaledPeriodEnd !== null && scaledPeriodEnd !== void 0 ? scaledPeriodEnd : Infinity);
61
+ }
62
+ const repeat = calculateRepeat(timelineItem, timeline[i + 1], maxRepeatTime);
52
63
  const complete = index.availabilityTimeComplete !== false ||
53
64
  i !== timelineLength - 1 &&
54
65
  repeat !== 0;
@@ -13,8 +13,8 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import BaseRepresentationIndex from "./base";
17
- import ListRepresentationIndex from "./list";
18
- import TemplateRepresentationIndex from "./template";
19
- import TimelineRepresentationIndex from "./timeline";
20
- export { BaseRepresentationIndex, ListRepresentationIndex, TemplateRepresentationIndex, TimelineRepresentationIndex, };
16
+ import BaseRepresentationIndex, { IBaseIndexContextArgument } from "./base";
17
+ import ListRepresentationIndex, { IListIndexContextArgument } from "./list";
18
+ import TemplateRepresentationIndex, { ITemplateIndexContextArgument } from "./template";
19
+ import TimelineRepresentationIndex, { ITimelineIndexContextArgument } from "./timeline";
20
+ export { BaseRepresentationIndex, ListRepresentationIndex, TemplateRepresentationIndex, TimelineRepresentationIndex, IBaseIndexContextArgument, IListIndexContextArgument, ITemplateIndexContextArgument, ITimelineIndexContextArgument, };
@@ -178,7 +178,7 @@ export default class ListRepresentationIndex implements IRepresentationIndex {
178
178
  /**
179
179
  * @returns {Boolean}
180
180
  */
181
- isFinished(): true;
181
+ isStillAwaitingFutureSegments(): false;
182
182
  /**
183
183
  * @returns {Boolean}
184
184
  */
@@ -179,8 +179,8 @@ export default class ListRepresentationIndex {
179
179
  /**
180
180
  * @returns {Boolean}
181
181
  */
182
- isFinished() {
183
- return true;
182
+ isStillAwaitingFutureSegments() {
183
+ return false;
184
184
  }
185
185
  /**
186
186
  * @returns {Boolean}
@@ -102,8 +102,15 @@ export interface ITemplateIndexIndexArgument {
102
102
  }
103
103
  /** Aditional context needed by a SegmentTemplate RepresentationIndex. */
104
104
  export interface ITemplateIndexContextArgument {
105
- /** Minimum availabilityTimeOffset concerning the segments of this Representation. */
106
- availabilityTimeOffset: number;
105
+ /**
106
+ * availability time offset of the concerned Adaptation.
107
+ *
108
+ * If `undefined`, the corresponding property was not set in the MPD and it is
109
+ * thus assumed to be equal to `0`.
110
+ * It might however be semantically different than `0` in the RxPlayer as it
111
+ * means that the packager didn't include that information in the MPD.
112
+ */
113
+ availabilityTimeOffset: number | undefined;
107
114
  /** Allows to obtain the minimum and maximum positions of a content. */
108
115
  manifestBoundsCalculator: ManifestBoundsCalculator;
109
116
  /** Start of the period concerned by this RepresentationIndex, in seconds. */
@@ -208,13 +215,13 @@ export default class TemplateRepresentationIndex implements IRepresentationIndex
208
215
  */
209
216
  canBeOutOfSyncError(): false;
210
217
  /**
211
- * Returns `true` if the last segments in this index have already been
218
+ * Returns `false` if the last segments in this index have already been
212
219
  * generated so that we can freely go to the next period.
213
- * Returns `false` if the index is still waiting on future segments to be
220
+ * Returns `true` if the index is still waiting on future segments to be
214
221
  * generated.
215
222
  * @returns {Boolean}
216
223
  */
217
- isFinished(): boolean;
224
+ isStillAwaitingFutureSegments(): boolean;
218
225
  /**
219
226
  * @returns {Boolean}
220
227
  */
@@ -205,13 +205,24 @@ export default class TemplateRepresentationIndex {
205
205
  const { timescale } = this._index;
206
206
  const segmentTimeRounding = getSegmentTimeRoundingError(timescale);
207
207
  const scaledPeriodStart = this._periodStart * timescale;
208
- const scaledRelativeEnd = end * timescale - scaledPeriodStart;
208
+ const scaledRelativeStart = (start * timescale) - scaledPeriodStart;
209
+ const scaledRelativeEnd = (end * timescale) - scaledPeriodStart;
210
+ const lastSegmentStart = this._getLastSegmentStart();
211
+ if (isNullOrUndefined(lastSegmentStart)) {
212
+ const relativeScaledIndexEnd = this._estimateRelativeScaledEnd();
213
+ if (relativeScaledIndexEnd === undefined) {
214
+ return scaledRelativeEnd + segmentTimeRounding >= 0;
215
+ }
216
+ return scaledRelativeEnd + segmentTimeRounding >= 0 &&
217
+ scaledRelativeStart < relativeScaledIndexEnd - segmentTimeRounding;
218
+ }
219
+ const lastSegmentEnd = lastSegmentStart + this._index.duration;
209
220
  const relativeScaledIndexEnd = this._estimateRelativeScaledEnd();
210
221
  if (relativeScaledIndexEnd === undefined) {
211
- return (scaledRelativeEnd + segmentTimeRounding) >= 0;
222
+ return scaledRelativeEnd > lastSegmentEnd - segmentTimeRounding;
212
223
  }
213
- const scaledRelativeStart = start * timescale - scaledPeriodStart;
214
- return (scaledRelativeStart - segmentTimeRounding) < relativeScaledIndexEnd;
224
+ return scaledRelativeEnd > lastSegmentEnd - segmentTimeRounding &&
225
+ scaledRelativeStart < relativeScaledIndexEnd - segmentTimeRounding;
215
226
  }
216
227
  /**
217
228
  * Returns true if, based on the arguments, the index should be refreshed.
@@ -256,30 +267,30 @@ export default class TemplateRepresentationIndex {
256
267
  return false;
257
268
  }
258
269
  /**
259
- * Returns `true` if the last segments in this index have already been
270
+ * Returns `false` if the last segments in this index have already been
260
271
  * generated so that we can freely go to the next period.
261
- * Returns `false` if the index is still waiting on future segments to be
272
+ * Returns `true` if the index is still waiting on future segments to be
262
273
  * generated.
263
274
  * @returns {Boolean}
264
275
  */
265
- isFinished() {
276
+ isStillAwaitingFutureSegments() {
266
277
  if (!this._isDynamic) {
267
- return true;
278
+ return false;
268
279
  }
269
280
  const scaledRelativeIndexEnd = this._estimateRelativeScaledEnd();
270
281
  if (scaledRelativeIndexEnd === undefined) {
271
- return false;
282
+ return true;
272
283
  }
273
284
  const { timescale } = this._index;
274
285
  const lastSegmentStart = this._getLastSegmentStart();
275
286
  // As last segment start is null if live time is before
276
287
  // current period, consider the index not to be finished.
277
288
  if (isNullOrUndefined(lastSegmentStart)) {
278
- return false;
289
+ return true;
279
290
  }
280
291
  const lastSegmentEnd = lastSegmentStart + this._index.duration;
281
292
  const segmentTimeRounding = getSegmentTimeRoundingError(timescale);
282
- return (lastSegmentEnd + segmentTimeRounding) >= scaledRelativeIndexEnd;
293
+ return (lastSegmentEnd + segmentTimeRounding) < scaledRelativeIndexEnd;
283
294
  }
284
295
  /**
285
296
  * @returns {Boolean}
@@ -317,6 +328,7 @@ export default class TemplateRepresentationIndex {
317
328
  * @returns {number | null | undefined}
318
329
  */
319
330
  _getFirstSegmentStart() {
331
+ var _a;
320
332
  if (!this._isDynamic) {
321
333
  return 0; // it is the start of the Period
322
334
  }
@@ -326,15 +338,15 @@ export default class TemplateRepresentationIndex {
326
338
  // /!\ The scaled max position augments continuously and might not
327
339
  // reflect exactly the real server-side value. As segments are
328
340
  // generated discretely.
329
- const maximumBound = this._manifestBoundsCalculator.estimateMaximumBound();
330
- if (maximumBound !== undefined && maximumBound < this._periodStart) {
341
+ const maximumSegmentTime = this._manifestBoundsCalculator.getEstimatedMaximumPosition((_a = this._availabilityTimeOffset) !== null && _a !== void 0 ? _a : 0);
342
+ if (maximumSegmentTime !== undefined && maximumSegmentTime < this._periodStart) {
331
343
  // Maximum position is before this period.
332
344
  // No segment is yet available here
333
345
  return null;
334
346
  }
335
347
  }
336
348
  const { duration, timescale } = this._index;
337
- const firstPosition = this._manifestBoundsCalculator.estimateMinimumBound();
349
+ const firstPosition = this._manifestBoundsCalculator.getEstimatedMinimumSegmentTime();
338
350
  if (firstPosition === undefined) {
339
351
  return undefined;
340
352
  }
@@ -351,34 +363,35 @@ export default class TemplateRepresentationIndex {
351
363
  * @returns {number|null|undefined}
352
364
  */
353
365
  _getLastSegmentStart() {
354
- var _a;
366
+ var _a, _b;
355
367
  const { duration, timescale, endNumber, startNumber = 1 } = this._index;
356
368
  if (this._isDynamic) {
357
- const lastPos = this._manifestBoundsCalculator.estimateMaximumBound();
358
- if (lastPos === undefined) {
359
- return undefined;
360
- }
361
- if (this._scaledRelativePeriodEnd !== undefined &&
362
- this._scaledRelativePeriodEnd <
363
- (lastPos - this._periodStart) * this._index.timescale) {
369
+ const liveEdge = this._manifestBoundsCalculator.getEstimatedLiveEdge();
370
+ if (liveEdge !== undefined &&
371
+ this._scaledRelativePeriodEnd !== undefined &&
372
+ this._scaledRelativePeriodEnd < liveEdge - (this._periodStart *
373
+ this._index.timescale)) {
364
374
  let numberOfSegments = Math.ceil(this._scaledRelativePeriodEnd / duration);
365
375
  if (endNumber !== undefined && (endNumber - startNumber + 1) < numberOfSegments) {
366
376
  numberOfSegments = endNumber - startNumber + 1;
367
377
  }
368
378
  return (numberOfSegments - 1) * duration;
369
379
  }
380
+ const lastPosition = this._manifestBoundsCalculator
381
+ .getEstimatedMaximumPosition((_a = this._availabilityTimeOffset) !== null && _a !== void 0 ? _a : 0);
382
+ if (lastPosition === undefined) {
383
+ return undefined;
384
+ }
370
385
  // /!\ The scaled last position augments continuously and might not
371
386
  // reflect exactly the real server-side value. As segments are
372
387
  // generated discretely.
373
- const scaledLastPosition = (lastPos - this._periodStart) * timescale;
388
+ const scaledLastPosition = (lastPosition - this._periodStart) * timescale;
374
389
  // Maximum position is before this period.
375
390
  // No segment is yet available here
376
391
  if (scaledLastPosition < 0) {
377
392
  return null;
378
393
  }
379
- const availabilityTimeOffset = ((this._availabilityTimeOffset !== undefined ? this._availabilityTimeOffset : 0))
380
- * timescale;
381
- let numberOfSegmentsAvailable = Math.floor((scaledLastPosition + availabilityTimeOffset) / duration);
394
+ let numberOfSegmentsAvailable = Math.floor(scaledLastPosition / duration);
382
395
  if (endNumber !== undefined &&
383
396
  (endNumber - startNumber + 1) < numberOfSegmentsAvailable) {
384
397
  numberOfSegmentsAvailable = endNumber - startNumber + 1;
@@ -388,7 +401,7 @@ export default class TemplateRepresentationIndex {
388
401
  (numberOfSegmentsAvailable - 1) * duration;
389
402
  }
390
403
  else {
391
- const maximumTime = (_a = this._scaledRelativePeriodEnd) !== null && _a !== void 0 ? _a : 0;
404
+ const maximumTime = (_b = this._scaledRelativePeriodEnd) !== null && _b !== void 0 ? _b : 0;
392
405
  let numberOfSegments = Math.ceil(maximumTime / duration);
393
406
  if (endNumber !== undefined && (endNumber - startNumber + 1) < numberOfSegments) {
394
407
  numberOfSegments = endNumber - startNumber + 1;
@@ -13,5 +13,6 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import TimelineRepresentationIndex from "./timeline_representation_index";
16
+ import TimelineRepresentationIndex, { ITimelineIndexContextArgument } from "./timeline_representation_index";
17
17
  export default TimelineRepresentationIndex;
18
+ export { ITimelineIndexContextArgument };
@@ -27,6 +27,8 @@ import ManifestBoundsCalculator from "../../manifest_bounds_calculator";
27
27
  export interface ITimelineIndex {
28
28
  /** If `false`, the last segment anounced might be still incomplete. */
29
29
  availabilityTimeComplete: boolean;
30
+ /** Minimum availabilityTimeOffset concerning the segments of this Representation. */
31
+ availabilityTimeOffset: number;
30
32
  /** Byte range for a possible index of segments in the server. */
31
33
  indexRange?: [number, number] | undefined;
32
34
  /**
@@ -123,8 +125,25 @@ export interface ITimelineIndexIndexArgument {
123
125
  }
124
126
  /** Aditional context needed by a SegmentTimeline RepresentationIndex. */
125
127
  export interface ITimelineIndexContextArgument {
126
- /** If `false`, the last segment anounced might be still incomplete. */
127
- availabilityTimeComplete: boolean;
128
+ /**
129
+ * If `false`, declared segments in the MPD might still be not completely generated.
130
+ * If `true`, they are completely generated.
131
+ *
132
+ * If `undefined`, the corresponding property was not set in the MPD and it is
133
+ * thus assumed that they are all generated.
134
+ * It might however be semantically different than `true` in the RxPlayer as it
135
+ * means that the packager didn't include that information in the MPD.
136
+ */
137
+ availabilityTimeComplete: boolean | undefined;
138
+ /**
139
+ * availability time offset of the concerned Adaptation.
140
+ *
141
+ * If `undefined`, the corresponding property was not set in the MPD and it is
142
+ * thus assumed to be equal to `0`.
143
+ * It might however be semantically different than `0` in the RxPlayer as it
144
+ * means that the packager didn't include that information in the MPD.
145
+ */
146
+ availabilityTimeOffset: number | undefined;
128
147
  /** Allows to obtain the minimum and maximum positions of a content. */
129
148
  manifestBoundsCalculator: ManifestBoundsCalculator;
130
149
  /** Start of the period linked to this RepresentationIndex, in seconds. */
@@ -164,6 +183,11 @@ export interface ILastSegmentInformation {
164
183
  /** Defines the time at which `lastPosition` was last calculated. */
165
184
  time: number;
166
185
  }
186
+ /**
187
+ * `IRepresentationIndex` implementation for a DASH `SegmentTimeline` segment
188
+ * indexing scheme.
189
+ * @class TimelineRepresentationIndex
190
+ */
167
191
  export default class TimelineRepresentationIndex implements IRepresentationIndex {
168
192
  /** Underlying structure to retrieve segment information. */
169
193
  protected _index: ITimelineIndex;
@@ -287,12 +311,12 @@ export default class TimelineRepresentationIndex implements IRepresentationIndex
287
311
  */
288
312
  _update(newIndex: TimelineRepresentationIndex): void;
289
313
  /**
290
- * Returns `true` if this RepresentationIndex currently contains its last
314
+ * Returns `false` if this RepresentationIndex currently contains its last
291
315
  * segment.
292
- * Returns `false` if it's still pending.
316
+ * Returns `true` if it's still pending.
293
317
  * @returns {Boolean}
294
318
  */
295
- isFinished(): boolean;
319
+ isStillAwaitingFutureSegments(): boolean;
296
320
  /**
297
321
  * @returns {Boolean}
298
322
  */
@@ -311,7 +335,6 @@ export default class TimelineRepresentationIndex implements IRepresentationIndex
311
335
  * available due to timeshifting.
312
336
  */
313
337
  private _refreshTimeline;
314
- static getIndexEnd(timeline: IIndexSegment[], scaledPeriodEnd: number | undefined): number | null;
315
338
  /**
316
339
  * Allows to generate the "timeline" for this RepresentationIndex.
317
340
  * Call this function when the timeline is unknown.
@@ -336,3 +359,73 @@ export default class TimelineRepresentationIndex implements IRepresentationIndex
336
359
  */
337
360
  private _getTimeline;
338
361
  }
362
+ /**
363
+ * Returns true if a Segment returned by the corresponding index is still
364
+ * considered available.
365
+ * Returns false if it is not available anymore.
366
+ * Returns undefined if we cannot know whether it is still available or not.
367
+ * /!\ We do not check the mediaURLs of the segment.
368
+ * @param {Object} segment
369
+ * @param {Object} index
370
+ * @param {Object} manifestBoundsCalculator
371
+ * @param {number|undefined} scaledPeriodEnd
372
+ * @returns {Boolean|undefined}
373
+ */
374
+ export declare function isSegmentStillAvailable(segment: ISegment, index: {
375
+ availabilityTimeOffset: number;
376
+ timeline: IIndexSegment[];
377
+ indexTimeOffset: number;
378
+ timescale: number;
379
+ }, manifestBoundsCalculator: ManifestBoundsCalculator, scaledPeriodEnd: number | undefined): boolean | undefined;
380
+ /**
381
+ * Returns from the given RepresentationIndex information on the last segment
382
+ * that may be requested currently.
383
+ *
384
+ * Returns `null` if there's no such segment.
385
+ * @param {Object} index
386
+ * @param {Object} manifestBoundsCalculator
387
+ * @param {number|undefined} scaledPeriodEnd
388
+ * @returns {number|null}
389
+ */
390
+ export declare function getLastRequestableSegmentInfo(index: {
391
+ availabilityTimeOffset: number;
392
+ timeline: IIndexSegment[];
393
+ timescale: number;
394
+ }, manifestBoundsCalculator: ManifestBoundsCalculator, scaledPeriodEnd: number | undefined): ILastRequestableSegmentInfo | null;
395
+ /**
396
+ * Information on the last requestable segment deduced from a timeline array of
397
+ * segment information.
398
+ */
399
+ export interface ILastRequestableSegmentInfo {
400
+ /**
401
+ * If `true`, we know that the last requestable segment is equal to the last
402
+ * segment that can be deduced from the corresponding given timeline.
403
+ * Written another way, there seem to be no segment announced in the timeline
404
+ * that are not yet requestable.
405
+ *
406
+ * If `false`, we know that the last requestable segment is not the last
407
+ * segment that can be deduced from the corresponding timeline.
408
+ * Written another way, there are supplementary segments in the timeline which
409
+ * are not yet requestable.
410
+ *
411
+ * Note that if the last requestable segment has its information from the last
412
+ * element from the timeline but it's not the last segment that would be
413
+ * deduced from the `repeatCount` property, then this value is set to `false`.
414
+ */
415
+ isLastOfTimeline: boolean;
416
+ /**
417
+ * End time at which the last requestable segment ends, in the corresponding
418
+ * index timescale (__NOT__ in seconds).
419
+ */
420
+ end: number;
421
+ /**
422
+ * The index in `timeline` of the last requestable segment.
423
+ * Note that its `repeatCount` may be updated and put as `newRepeatCount`.
424
+ */
425
+ timelineIdx: number;
426
+ /**
427
+ * The new `repeatCount` value for that last segment. May be equal or
428
+ * different from the timeline element found at `timelineIdx`.
429
+ */
430
+ newRepeatCount: number;
431
+ }