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
@@ -22,6 +22,7 @@ import { getFilenameIndexInUrl } from "../../../../utils/resolve_url";
22
22
  import getClockOffset from "./get_clock_offset";
23
23
  import getHTTPUTCTimingURL from "./get_http_utc-timing_url";
24
24
  import getMinimumAndMaximumPositions from "./get_minimum_and_maximum_positions";
25
+ import ManifestBoundsCalculator from "./manifest_bounds_calculator";
25
26
  import parseAvailabilityStartTime from "./parse_availability_start_time";
26
27
  import parsePeriods from "./parse_periods";
27
28
  import resolveBaseURLs from "./resolve_base_urls";
@@ -129,11 +130,19 @@ function parseCompleteIntermediateRepresentation(mpdIR, args, warnings, xlinkInf
129
130
  const availabilityStartTime = parseAvailabilityStartTime(rootAttributes, args.referenceDateTime);
130
131
  const timeShiftBufferDepth = rootAttributes.timeShiftBufferDepth;
131
132
  const { externalClockOffset: clockOffset, unsafelyBaseOnPreviousManifest } = args;
133
+ const { externalClockOffset } = args;
134
+ const manifestBoundsCalculator = new ManifestBoundsCalculator({
135
+ availabilityStartTime,
136
+ isDynamic,
137
+ timeShiftBufferDepth,
138
+ serverTimestampOffset: externalClockOffset,
139
+ });
132
140
  const manifestInfos = { availabilityStartTime,
133
141
  baseURLs: mpdBaseUrls,
134
142
  clockOffset,
135
143
  duration: rootAttributes.duration,
136
144
  isDynamic,
145
+ manifestBoundsCalculator,
137
146
  manifestProfiles: mpdIR.attributes.profiles,
138
147
  receivedTime: args.manifestReceivedTime,
139
148
  timeShiftBufferDepth,
@@ -178,30 +187,33 @@ function parseCompleteIntermediateRepresentation(mpdIR, args, warnings, xlinkInf
178
187
  time: now };
179
188
  }
180
189
  else {
181
- minimumTime = minimumSafePosition;
182
- timeshiftDepth = timeShiftBufferDepth !== null && timeShiftBufferDepth !== void 0 ? timeShiftBufferDepth : null;
190
+ // Determine the maximum seekable position
183
191
  let finalMaximumSafePosition;
184
- let livePosition;
185
- if (maximumUnsafePosition !== undefined) {
186
- livePosition = maximumUnsafePosition;
187
- }
188
192
  if (maximumSafePosition !== undefined) {
189
193
  finalMaximumSafePosition = maximumSafePosition;
190
194
  }
191
195
  else {
192
- const ast = availabilityStartTime !== null && availabilityStartTime !== void 0 ? availabilityStartTime : 0;
193
- const { externalClockOffset } = args;
194
196
  if (externalClockOffset === undefined) {
195
197
  log.warn("DASH Parser: use system clock to define maximum position");
196
- finalMaximumSafePosition = (Date.now() / 1000) - ast;
198
+ finalMaximumSafePosition = (Date.now() / 1000) - availabilityStartTime;
197
199
  }
198
200
  else {
199
201
  const serverTime = getMonotonicTimeStamp() + externalClockOffset;
200
- finalMaximumSafePosition = (serverTime / 1000) - ast;
202
+ finalMaximumSafePosition = (serverTime / 1000) - availabilityStartTime;
201
203
  }
202
204
  }
205
+ // Determine live edge (what position corresponds to live content, can be
206
+ // inferior or superior to the maximum anounced position in some specific
207
+ // scenarios). However, the `timeShiftBufferDepth` should be based on it.
208
+ let livePosition = manifestBoundsCalculator.getEstimatedLiveEdge();
203
209
  if (livePosition === undefined) {
204
- livePosition = finalMaximumSafePosition;
210
+ if (maximumUnsafePosition !== undefined) {
211
+ livePosition = maximumUnsafePosition;
212
+ }
213
+ else {
214
+ livePosition = finalMaximumSafePosition;
215
+ }
216
+ // manifestBoundsCalculator.forceLiveEdge(livePosition);
205
217
  }
206
218
  maximumTimeData = { isLinear: true,
207
219
  maximumSafePosition: finalMaximumSafePosition,
@@ -209,9 +221,11 @@ function parseCompleteIntermediateRepresentation(mpdIR, args, warnings, xlinkInf
209
221
  time: now };
210
222
  // if the minimum calculated time is even below the buffer depth, perhaps we
211
223
  // can go even lower in terms of depth
224
+ minimumTime = minimumSafePosition;
225
+ timeshiftDepth = timeShiftBufferDepth !== null && timeShiftBufferDepth !== void 0 ? timeShiftBufferDepth : null;
212
226
  if (timeshiftDepth !== null && minimumTime !== undefined &&
213
- finalMaximumSafePosition - minimumTime > timeshiftDepth) {
214
- timeshiftDepth = finalMaximumSafePosition - minimumTime;
227
+ livePosition - minimumTime > timeshiftDepth) {
228
+ timeshiftDepth = livePosition - minimumTime;
215
229
  }
216
230
  }
217
231
  // `isLastPeriodKnown` should be `true` in two cases for DASH contents:
@@ -63,5 +63,5 @@ export interface IPeriodContext extends IInheritedAdaptationContext {
63
63
  value: string;
64
64
  }> | undefined;
65
65
  }
66
- type IInheritedAdaptationContext = Omit<IAdaptationSetContext, "availabilityTimeComplete" | "availabilityTimeOffset" | "duration" | "isLastPeriod" | "manifestBoundsCalculator" | "start" | "unsafelyBaseOnPreviousPeriod">;
66
+ type IInheritedAdaptationContext = Omit<IAdaptationSetContext, "availabilityTimeComplete" | "availabilityTimeOffset" | "duration" | "isLastPeriod" | "start" | "unsafelyBaseOnPreviousPeriod">;
67
67
  export {};
@@ -16,13 +16,13 @@
16
16
  import log from "../../../../log";
17
17
  import flatMap from "../../../../utils/flat_map";
18
18
  import idGenerator from "../../../../utils/id_generator";
19
+ import isNullOrUndefined from "../../../../utils/is_null_or_undefined";
19
20
  import getMonotonicTimeStamp from "../../../../utils/monotonic_timestamp";
20
21
  import objectValues from "../../../../utils/object_values";
21
22
  import { utf8ToStr } from "../../../../utils/string_parsing";
22
23
  // eslint-disable-next-line max-len
23
24
  import flattenOverlappingPeriods from "./flatten_overlapping_periods";
24
25
  import getPeriodsTimeInformation from "./get_periods_time_infos";
25
- import ManifestBoundsCalculator from "./manifest_bounds_calculator";
26
26
  import parseAdaptationSets from "./parse_adaptation_sets";
27
27
  import resolveBaseURLs from "./resolve_base_urls";
28
28
  const generatePeriodID = idGenerator();
@@ -33,16 +33,14 @@ const generatePeriodID = idGenerator();
33
33
  * @returns {Array.<Object>}
34
34
  */
35
35
  export default function parsePeriods(periodsIR, context) {
36
- var _a, _b, _c, _d, _e, _f;
36
+ var _a, _b, _c, _d;
37
37
  const parsedPeriods = [];
38
38
  const periodsTimeInformation = getPeriodsTimeInformation(periodsIR, context);
39
39
  if (periodsTimeInformation.length !== periodsIR.length) {
40
40
  throw new Error("MPD parsing error: the time information are incoherent.");
41
41
  }
42
- const { isDynamic, timeShiftBufferDepth } = context;
43
- const manifestBoundsCalculator = new ManifestBoundsCalculator({ isDynamic,
44
- timeShiftBufferDepth });
45
- if (!isDynamic && context.duration != null) {
42
+ const { isDynamic, manifestBoundsCalculator } = context;
43
+ if (!isDynamic && !isNullOrUndefined(context.duration)) {
46
44
  manifestBoundsCalculator.setLastPosition(context.duration);
47
45
  }
48
46
  // We parse it in reverse because we might need to deduce the buffer depth from
@@ -54,7 +52,7 @@ export default function parsePeriods(periodsIR, context) {
54
52
  const periodBaseURLs = resolveBaseURLs(context.baseURLs, periodIR.children.baseURLs);
55
53
  const { periodStart, periodDuration, periodEnd } = periodsTimeInformation[i];
56
54
  let periodID;
57
- if (periodIR.attributes.id == null) {
55
+ if (isNullOrUndefined(periodIR.attributes.id)) {
58
56
  log.warn("DASH: No usable id found in the Period. Generating one.");
59
57
  periodID = "gen-dash-period-" + generatePeriodID();
60
58
  }
@@ -69,8 +67,8 @@ export default function parsePeriods(periodsIR, context) {
69
67
  context.receivedTime;
70
68
  const unsafelyBaseOnPreviousPeriod = (_b = (_a = context
71
69
  .unsafelyBaseOnPreviousManifest) === null || _a === void 0 ? void 0 : _a.getPeriod(periodID)) !== null && _b !== void 0 ? _b : null;
72
- const availabilityTimeComplete = (_c = periodIR.attributes.availabilityTimeComplete) !== null && _c !== void 0 ? _c : true;
73
- const availabilityTimeOffset = (_d = periodIR.attributes.availabilityTimeOffset) !== null && _d !== void 0 ? _d : 0;
70
+ const availabilityTimeComplete = periodIR.attributes.availabilityTimeComplete;
71
+ const availabilityTimeOffset = periodIR.attributes.availabilityTimeOffset;
74
72
  const { manifestProfiles } = context;
75
73
  const { segmentTemplate } = periodIR.children;
76
74
  const adapCtxt = { availabilityTimeComplete,
@@ -84,11 +82,10 @@ export default function parsePeriods(periodsIR, context) {
84
82
  receivedTime,
85
83
  segmentTemplate,
86
84
  start: periodStart,
87
- timeShiftBufferDepth,
88
85
  unsafelyBaseOnPreviousPeriod };
89
86
  const adaptations = parseAdaptationSets(periodIR.children.adaptations, adapCtxt);
90
- const namespaces = ((_e = context.xmlNamespaces) !== null && _e !== void 0 ? _e : [])
91
- .concat((_f = periodIR.attributes.namespaces) !== null && _f !== void 0 ? _f : []);
87
+ const namespaces = ((_c = context.xmlNamespaces) !== null && _c !== void 0 ? _c : [])
88
+ .concat((_d = periodIR.attributes.namespaces) !== null && _d !== void 0 ? _d : []);
92
89
  const streamEvents = generateStreamEvents(periodIR.children.eventStreams, periodStart, namespaces);
93
90
  const parsedPeriod = { id: periodID,
94
91
  start: periodStart,
@@ -158,7 +155,7 @@ export default function parsePeriods(periodsIR, context) {
158
155
  * @returns {Array.<number|undefined>}
159
156
  */
160
157
  function guessLastPositionFromClock(context, minimumTime) {
161
- if (context.clockOffset != null) {
158
+ if (!isNullOrUndefined(context.clockOffset)) {
162
159
  const lastPosition = context.clockOffset / 1000 -
163
160
  context.availabilityStartTime;
164
161
  const positionTime = getMonotonicTimeStamp() / 1000;
@@ -193,7 +190,7 @@ function getMaximumLastPosition(adaptationsPerType) {
193
190
  let maxEncounteredPosition = null;
194
191
  let allIndexAreEmpty = true;
195
192
  const adaptationsVal = objectValues(adaptationsPerType)
196
- .filter((ada) => ada != null);
193
+ .filter((ada) => !isNullOrUndefined(ada));
197
194
  const allAdaptations = flatMap(adaptationsVal, (adaptationsForType) => adaptationsForType);
198
195
  for (const adaptation of allAdaptations) {
199
196
  const representations = adaptation.representations;
@@ -203,13 +200,13 @@ function getMaximumLastPosition(adaptationsPerType) {
203
200
  allIndexAreEmpty = false;
204
201
  if (typeof position === "number") {
205
202
  maxEncounteredPosition =
206
- maxEncounteredPosition == null ? position :
203
+ isNullOrUndefined(maxEncounteredPosition) ? position :
207
204
  Math.max(maxEncounteredPosition, position);
208
205
  }
209
206
  }
210
207
  }
211
208
  }
212
- if (maxEncounteredPosition != null) {
209
+ if (!isNullOrUndefined(maxEncounteredPosition)) {
213
210
  return maxEncounteredPosition;
214
211
  }
215
212
  else if (allIndexAreEmpty) {
@@ -29,10 +29,25 @@ export default function parseRepresentationIndex(representation: IRepresentation
29
29
  export interface IRepresentationIndexContext {
30
30
  /** Parsed AdaptationSet which contains the Representation. */
31
31
  adaptation: IAdaptationSetIntermediateRepresentation;
32
- /** If false, declared segments in the MPD might still be not completely generated. */
33
- availabilityTimeComplete: boolean;
34
- /** availability time offset of the concerned Adaptation. */
35
- availabilityTimeOffset: number;
32
+ /**
33
+ * If `false`, declared segments in the MPD might still be not completely generated.
34
+ * If `true`, they are completely generated.
35
+ *
36
+ * If `undefined`, the corresponding property was not set in the MPD and it is
37
+ * thus assumed that they are all generated.
38
+ * It might however be semantically different than `true` in the RxPlayer as it
39
+ * means that the packager didn't include that information in the MPD.
40
+ */
41
+ availabilityTimeComplete: boolean | undefined;
42
+ /**
43
+ * availability time offset of the concerned Adaptation.
44
+ *
45
+ * If `undefined`, the corresponding property was not set in the MPD and it is
46
+ * thus assumed to be equal to `0`.
47
+ * It might however be semantically different than `0` in the RxPlayer as it
48
+ * means that the packager didn't include that information in the MPD.
49
+ */
50
+ availabilityTimeOffset: number | undefined;
36
51
  /** Eventual URLs from which every relative URL will be based on. */
37
52
  baseURLs: IResolvedBaseUrl[];
38
53
  /** End time of the current Period, in seconds. */
@@ -61,8 +76,6 @@ export interface IRepresentationIndexContext {
61
76
  receivedTime?: number | undefined;
62
77
  /** Start time of the current period, in seconds. */
63
78
  start: number;
64
- /** Depth of the buffer for the whole content, in seconds. */
65
- timeShiftBufferDepth?: number | undefined;
66
79
  /**
67
80
  * The parser should take this Representation - which is the same as this one
68
81
  * parsed at an earlier time - as a base to speed-up the parsing process.
@@ -24,7 +24,7 @@ import { BaseRepresentationIndex, ListRepresentationIndex, TemplateRepresentatio
24
24
  */
25
25
  export default function parseRepresentationIndex(representation, context) {
26
26
  var _a, _b;
27
- const { availabilityTimeOffset, manifestBoundsCalculator, isDynamic, end: periodEnd, start: periodStart, receivedTime, timeShiftBufferDepth, unsafelyBaseOnPreviousRepresentation, inbandEventStreams, isLastPeriod } = context;
27
+ const { availabilityTimeOffset, manifestBoundsCalculator, isDynamic, end: periodEnd, start: periodStart, receivedTime, unsafelyBaseOnPreviousRepresentation, inbandEventStreams, isLastPeriod } = context;
28
28
  const isEMSGWhitelisted = (inbandEvent) => {
29
29
  if (inbandEventStreams === undefined) {
30
30
  return false;
@@ -32,7 +32,8 @@ export default function parseRepresentationIndex(representation, context) {
32
32
  return inbandEventStreams
33
33
  .some(({ schemeIdUri }) => schemeIdUri === inbandEvent.schemeIdUri);
34
34
  };
35
- const reprIndexCtxt = { availabilityTimeComplete: true,
35
+ const reprIndexCtxt = {
36
+ availabilityTimeComplete: undefined,
36
37
  availabilityTimeOffset,
37
38
  unsafelyBaseOnPreviousRepresentation,
38
39
  isEMSGWhitelisted,
@@ -44,7 +45,7 @@ export default function parseRepresentationIndex(representation, context) {
44
45
  receivedTime,
45
46
  representationBitrate: representation.attributes.bitrate,
46
47
  representationId: representation.attributes.id,
47
- timeShiftBufferDepth };
48
+ };
48
49
  let representationIndex;
49
50
  if (representation.children.segmentBase !== undefined) {
50
51
  const { segmentBase } = representation.children;
@@ -62,11 +63,12 @@ export default function parseRepresentationIndex(representation, context) {
62
63
  segmentTemplates.push(childSegmentTemplate);
63
64
  }
64
65
  const segmentTemplate = objectAssign({}, ...segmentTemplates /* Ugly TS Hack */);
65
- reprIndexCtxt.availabilityTimeComplete =
66
- (_a = segmentTemplate.availabilityTimeComplete) !== null && _a !== void 0 ? _a : context.availabilityTimeComplete;
67
- reprIndexCtxt.availabilityTimeOffset =
68
- ((_b = segmentTemplate.availabilityTimeOffset) !== null && _b !== void 0 ? _b : 0) +
69
- context.availabilityTimeOffset;
66
+ if (segmentTemplate.availabilityTimeOffset !== undefined ||
67
+ context.availabilityTimeOffset !== undefined) {
68
+ reprIndexCtxt.availabilityTimeOffset =
69
+ ((_a = segmentTemplate.availabilityTimeOffset) !== null && _a !== void 0 ? _a : 0) +
70
+ ((_b = context.availabilityTimeOffset) !== null && _b !== void 0 ? _b : 0);
71
+ }
70
72
  representationIndex = TimelineRepresentationIndex
71
73
  .isTimelineIndexArgument(segmentTemplate) ?
72
74
  new TimelineRepresentationIndex(segmentTemplate, reprIndexCtxt) :
@@ -77,7 +77,7 @@ function getHDRInformation({ adaptationProfiles, essentialProperties, supplement
77
77
  * @returns {Array.<Object>}
78
78
  */
79
79
  export default function parseRepresentations(representationsIR, adaptation, context) {
80
- var _a, _b, _c, _d;
80
+ var _a, _b, _c, _d, _e;
81
81
  const parsedRepresentations = [];
82
82
  for (const representation of representationsIR) {
83
83
  // Compute Representation ID
@@ -105,8 +105,12 @@ export default function parseRepresentations(representationsIR, adaptation, cont
105
105
  .unsafelyBaseOnPreviousAdaptation) === null || _a === void 0 ? void 0 : _a.getRepresentation(representationID)) !== null && _b !== void 0 ? _b : null;
106
106
  const inbandEventStreams = combineInbandEventStreams(representation, adaptation);
107
107
  const availabilityTimeComplete = (_c = representation.attributes.availabilityTimeComplete) !== null && _c !== void 0 ? _c : context.availabilityTimeComplete;
108
- const availabilityTimeOffset = ((_d = representation.attributes.availabilityTimeOffset) !== null && _d !== void 0 ? _d : 0) +
109
- context.availabilityTimeOffset;
108
+ let availabilityTimeOffset;
109
+ if (representation.attributes.availabilityTimeOffset !== undefined ||
110
+ context.availabilityTimeOffset !== undefined) {
111
+ availabilityTimeOffset = ((_d = representation.attributes.availabilityTimeOffset) !== null && _d !== void 0 ? _d : 0) +
112
+ ((_e = context.availabilityTimeOffset) !== null && _e !== void 0 ? _e : 0);
113
+ }
110
114
  const reprIndexCtxt = objectAssign({}, context, { availabilityTimeOffset,
111
115
  availabilityTimeComplete,
112
116
  unsafelyBaseOnPreviousRepresentation,
@@ -63,7 +63,7 @@ export default class LocalRepresentationIndex implements IRepresentationIndex {
63
63
  * @returns {Boolean}
64
64
  */
65
65
  isSegmentStillAvailable(): true;
66
- isFinished(): boolean;
66
+ isStillAwaitingFutureSegments(): boolean;
67
67
  /**
68
68
  * @returns {Boolean}
69
69
  */
@@ -130,7 +130,7 @@ export default class LocalRepresentationIndex {
130
130
  * @returns {boolean|undefined}
131
131
  */
132
132
  awaitSegmentBetween(start, end) {
133
- if (this.isFinished()) {
133
+ if (this.isStillAwaitingFutureSegments()) {
134
134
  return false;
135
135
  }
136
136
  if (this._index.incomingRanges === undefined) {
@@ -150,8 +150,8 @@ export default class LocalRepresentationIndex {
150
150
  isSegmentStillAvailable() {
151
151
  return true;
152
152
  }
153
- isFinished() {
154
- return this._index.isFinished;
153
+ isStillAwaitingFutureSegments() {
154
+ return !this._index.isFinished;
155
155
  }
156
156
  /**
157
157
  * @returns {Boolean}
@@ -128,7 +128,7 @@ export default class MetaRepresentationIndex implements IRepresentationIndex {
128
128
  /**
129
129
  * @returns {Boolean}
130
130
  */
131
- isFinished(): boolean;
131
+ isStillAwaitingFutureSegments(): boolean;
132
132
  /**
133
133
  * @returns {Boolean}
134
134
  */
@@ -162,8 +162,8 @@ export default class MetaRepresentationIndex {
162
162
  /**
163
163
  * @returns {Boolean}
164
164
  */
165
- isFinished() {
166
- return this._wrappedIndex.isFinished();
165
+ isStillAwaitingFutureSegments() {
166
+ return this._wrappedIndex.isStillAwaitingFutureSegments();
167
167
  }
168
168
  /**
169
169
  * @returns {Boolean}
@@ -189,9 +189,9 @@ export default class SmoothRepresentationIndex implements IRepresentationIndex {
189
189
  */
190
190
  _update(newIndex: SmoothRepresentationIndex): void;
191
191
  /**
192
- * Returns `true` if the last segments in this index have already been
192
+ * Returns `false` if the last segments in this index have already been
193
193
  * generated.
194
- * Returns `false` if the index is still waiting on future segments to be
194
+ * Returns `true` if the index is still waiting on future segments to be
195
195
  * generated.
196
196
  *
197
197
  * For Smooth, it should only depend on whether the content is a live content
@@ -199,7 +199,7 @@ export default class SmoothRepresentationIndex implements IRepresentationIndex {
199
199
  * TODO What about Smooth live content that finishes at some point?
200
200
  * @returns {boolean}
201
201
  */
202
- isFinished(): boolean;
202
+ isStillAwaitingFutureSegments(): boolean;
203
203
  /**
204
204
  * @returns {Boolean}
205
205
  */
@@ -209,8 +209,8 @@ export default class SmoothRepresentationIndex implements IRepresentationIndex {
209
209
  * Add segments to a `SharedSmoothSegmentTimeline` that were predicted to come
210
210
  * after `currentSegment`.
211
211
  * @param {Array.<Object>} nextSegments - The segment information parsed.
212
- * @param {Object} segment - Information on the segment which contained that
213
- * new segment information.
212
+ * @param {Object} currentSegment - Information on the segment which contained
213
+ * that new segment information.
214
214
  */
215
215
  addPredictedSegments(nextSegments: Array<{
216
216
  duration: number;
@@ -18,7 +18,6 @@ import log from "../../../log";
18
18
  import assert from "../../../utils/assert";
19
19
  import getMonotonicTimeStamp from "../../../utils/monotonic_timestamp";
20
20
  import { checkDiscontinuity, getIndexSegmentEnd, } from "../utils/index_helpers";
21
- import isSegmentStillAvailable from "../utils/is_segment_still_available";
22
21
  import { replaceSegmentSmoothTokens } from "./utils/tokens";
23
22
  /**
24
23
  * @param {Number} start
@@ -271,7 +270,7 @@ export default class SmoothRepresentationIndex {
271
270
  awaitSegmentBetween(start, end) {
272
271
  var _a;
273
272
  assert(start <= end);
274
- if (this.isFinished()) {
273
+ if (this.isStillAwaitingFutureSegments()) {
275
274
  return false;
276
275
  }
277
276
  const lastAvailablePosition = this.getLastAvailablePosition();
@@ -308,7 +307,24 @@ export default class SmoothRepresentationIndex {
308
307
  }
309
308
  this._refreshTimeline();
310
309
  const { timeline, timescale } = this._sharedSmoothTimeline;
311
- return isSegmentStillAvailable(segment, timeline, timescale, 0);
310
+ for (let i = 0; i < timeline.length; i++) {
311
+ const tSegment = timeline[i];
312
+ const tSegmentTime = tSegment.start / timescale;
313
+ if (tSegmentTime > segment.time) {
314
+ return false; // We went over it without finding it
315
+ }
316
+ else if (tSegmentTime === segment.time) {
317
+ return true;
318
+ }
319
+ else { // tSegment.start < segment.time
320
+ if (tSegment.repeatCount >= 0 && tSegment.duration !== undefined) {
321
+ const timeDiff = tSegmentTime - tSegment.start;
322
+ const repeat = (timeDiff / tSegment.duration) - 1;
323
+ return repeat % 1 === 0 && repeat <= tSegment.repeatCount;
324
+ }
325
+ }
326
+ }
327
+ return false;
312
328
  }
313
329
  /**
314
330
  * @param {Error} error
@@ -342,9 +358,9 @@ export default class SmoothRepresentationIndex {
342
358
  this._sharedSmoothTimeline.update(newIndex._sharedSmoothTimeline);
343
359
  }
344
360
  /**
345
- * Returns `true` if the last segments in this index have already been
361
+ * Returns `false` if the last segments in this index have already been
346
362
  * generated.
347
- * Returns `false` if the index is still waiting on future segments to be
363
+ * Returns `true` if the index is still waiting on future segments to be
348
364
  * generated.
349
365
  *
350
366
  * For Smooth, it should only depend on whether the content is a live content
@@ -352,8 +368,8 @@ export default class SmoothRepresentationIndex {
352
368
  * TODO What about Smooth live content that finishes at some point?
353
369
  * @returns {boolean}
354
370
  */
355
- isFinished() {
356
- return !this._isLive;
371
+ isStillAwaitingFutureSegments() {
372
+ return this._isLive;
357
373
  }
358
374
  /**
359
375
  * @returns {Boolean}
@@ -368,8 +384,8 @@ export default class SmoothRepresentationIndex {
368
384
  * Add segments to a `SharedSmoothSegmentTimeline` that were predicted to come
369
385
  * after `currentSegment`.
370
386
  * @param {Array.<Object>} nextSegments - The segment information parsed.
371
- * @param {Object} segment - Information on the segment which contained that
372
- * new segment information.
387
+ * @param {Object} currentSegment - Information on the segment which contained
388
+ * that new segment information.
373
389
  */
374
390
  addPredictedSegments(nextSegments, currentSegment) {
375
391
  this._sharedSmoothTimeline.addPredictedSegments(nextSegments, currentSegment);
@@ -97,7 +97,7 @@ export function getTimescaledRange(start, duration, timescale) {
97
97
  * timescaled time.
98
98
  * Returns -1 if the given time is lower than the start of the first available
99
99
  * segment.
100
- * @param {Object} index
100
+ * @param {Object} timeline
101
101
  * @param {Number} timeTScaled
102
102
  * @returns {Number}
103
103
  */
@@ -22,10 +22,11 @@ import { REGXP_LENGTH } from "../regexps";
22
22
  */
23
23
  export default function applyLineHeight(element, lineHeight) {
24
24
  const trimmedLineHeight = lineHeight.trim();
25
+ const splittedLineHeight = trimmedLineHeight.split(" ");
25
26
  if (trimmedLineHeight === "auto") {
26
27
  return;
27
28
  }
28
- const firstLineHeight = REGXP_LENGTH.exec(trimmedLineHeight[0]);
29
+ const firstLineHeight = REGXP_LENGTH.exec(splittedLineHeight[0]);
29
30
  if (firstLineHeight === null) {
30
31
  return;
31
32
  }