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
@@ -18,6 +18,7 @@ declare class ConfigHandler {
18
18
  _config: {
19
19
  DEFAULT_UNMUTED_VOLUME: number;
20
20
  DEFAULT_REQUEST_TIMEOUT: number;
21
+ DEFAULT_CONNECTION_TIMEOUT: number;
21
22
  DEFAULT_TEXT_TRACK_MODE: "native" | "html";
22
23
  DEFAULT_ENABLE_FAST_SWITCHING: boolean;
23
24
  DELTA_POSITION_AFTER_RELOAD: {
@@ -35,6 +36,7 @@ declare class ConfigHandler {
35
36
  DEFAULT_MAX_BUFFER_BEHIND: number;
36
37
  DEFAULT_MAX_VIDEO_BUFFER_SIZE: number;
37
38
  MAXIMUM_MAX_BUFFER_AHEAD: Partial<Record<"audio" | "video" | "text", number>>;
39
+ MINIMUM_MAX_BUFFER_AHEAD: Partial<Record<"audio" | "video" | "image" | "text", number>>;
38
40
  MAXIMUM_MAX_BUFFER_BEHIND: Partial<Record<"audio" | "video" | "text", number>>;
39
41
  DEFAULT_BASE_BANDWIDTH: number;
40
42
  INACTIVITY_DELAY: number;
@@ -45,7 +47,6 @@ declare class ConfigHandler {
45
47
  LOW_LATENCY: number;
46
48
  };
47
49
  BUFFER_DISCONTINUITY_THRESHOLD: number;
48
- FORCE_DISCONTINUITY_SEEK_DELAY: number;
49
50
  BITRATE_REBUFFERING_RATIO: number;
50
51
  BUFFER_GC_GAPS: {
51
52
  CALM: number;
@@ -16,7 +16,7 @@
16
16
  import Manifest, { Adaptation, ISegment, Period, Representation } from "../../manifest";
17
17
  import { IReadOnlySharedReference } from "../../utils/reference";
18
18
  import { CancellationSignal } from "../../utils/task_canceller";
19
- import { IReadOnlyPlaybackObserver } from "../api";
19
+ import { IObservationPosition, IReadOnlyPlaybackObserver } from "../api";
20
20
  import { IBufferType } from "../segment_buffers";
21
21
  import BandwidthEstimator from "./utils/bandwidth_estimator";
22
22
  import { IResolutionInfo } from "./utils/filter_by_resolution";
@@ -99,24 +99,7 @@ export interface IRepresentationEstimatorPlaybackObservation {
99
99
  * Information on the current media position in seconds at the time of a
100
100
  * Playback Observation.
101
101
  */
102
- position: {
103
- /**
104
- * Known position at the time the Observation was emitted, in seconds.
105
- *
106
- * Note that it might have changed since. If you want truly precize
107
- * information, you should recuperate it from the HTMLMediaElement directly
108
- * through another mean.
109
- */
110
- last: number;
111
- /**
112
- * Actually wanted position in seconds that is not yet reached.
113
- *
114
- * This might for example be set to the initial position when the content is
115
- * loading (and thus potentially at a `0` position) but which will be seeked
116
- * to a given position once possible.
117
- */
118
- pending: number | undefined;
119
- };
102
+ position: IObservationPosition;
120
103
  /**
121
104
  * Last "playback rate" set by the user. This is the ideal "playback rate" at
122
105
  * which the media should play.
@@ -197,7 +197,7 @@ function getEstimateReference({ bandwidthEstimator, context, currentRepresentati
197
197
  }
198
198
  const { position, speed } = lastPlaybackObservation;
199
199
  const timeRanges = val.buffered;
200
- const bufferGap = getLeftSizeOfBufferedTimeRange(timeRanges, position.last);
200
+ const bufferGap = getLeftSizeOfBufferedTimeRange(timeRanges, position.getWanted());
201
201
  const { representation } = val.content;
202
202
  const currentScore = scoreCalculator.getEstimate(representation);
203
203
  const currentBitrate = representation.bitrate;
@@ -288,7 +288,7 @@ function getEstimateReference({ bandwidthEstimator, context, currentRepresentati
288
288
  if (lowLatencyMode &&
289
289
  currentRepresentationVal !== null &&
290
290
  context.manifest.isDynamic &&
291
- maximumPosition - position.last < 40) {
291
+ maximumPosition - position.getWanted() < 40) {
292
292
  chosenRepFromGuessMode = guessBasedChooser
293
293
  .getGuess(sortedRepresentations, lastPlaybackObservation, currentRepresentationVal, currentBestBitrate, requests);
294
294
  }
@@ -120,7 +120,7 @@ function estimateStarvationModeBitrate(pendingRequests, playbackInfo, currentRep
120
120
  const { bufferGap, speed, position } = playbackInfo;
121
121
  const realBufferGap = isFinite(bufferGap) ? bufferGap :
122
122
  0;
123
- const nextNeededPosition = position.last + realBufferGap;
123
+ const nextNeededPosition = position.getWanted() + realBufferGap;
124
124
  const concernedRequests = getConcernedRequests(pendingRequests, nextNeededPosition);
125
125
  if (concernedRequests.length !== 1) { // 0 == no request
126
126
  // 2+ == too complicated to calculate
@@ -188,7 +188,7 @@ function shouldDirectlySwitchToLowBitrate(playbackInfo, requests, lowLatencyMode
188
188
  }
189
189
  const realBufferGap = isFinite(playbackInfo.bufferGap) ? playbackInfo.bufferGap :
190
190
  0;
191
- const nextNeededPosition = playbackInfo.position.last + realBufferGap;
191
+ const nextNeededPosition = playbackInfo.position.getWanted() + realBufferGap;
192
192
  const nextRequest = arrayFind(requests, ({ content }) => content.segment.duration > 0 &&
193
193
  (content.segment.time + content.segment.duration) > nextNeededPosition);
194
194
  if (nextRequest === undefined) {
@@ -261,7 +261,7 @@ export default class NetworkAnalyzer {
261
261
  const { ABR_STARVATION_DURATION_DELTA } = config.getCurrent();
262
262
  // check if should get in/out of starvation mode
263
263
  if (isNaN(duration) ||
264
- realBufferGap + position.last < duration - ABR_STARVATION_DURATION_DELTA) {
264
+ realBufferGap + position.getWanted() < duration - ABR_STARVATION_DURATION_DELTA) {
265
265
  if (!this._inStarvationMode && realBufferGap <= localConf.starvationGap) {
266
266
  log.info("ABR: enter starvation mode.");
267
267
  this._inStarvationMode = true;
@@ -1,4 +1,4 @@
1
- const BUFFER_WIDTH_IN_SECONDS = 10000;
1
+ const BUFFER_WIDTH_IN_SECONDS = 30 * 60;
2
2
  const COLORS = [
3
3
  "#2ab7ca",
4
4
  "#fed766",
@@ -65,11 +65,7 @@ export default class SegmentBufferGraph {
65
65
  let minimumPosition;
66
66
  let maximumPosition;
67
67
  if (maximumPoint - minimumPoint > BUFFER_WIDTH_IN_SECONDS) {
68
- if (currentTime === undefined) {
69
- minimumPosition = minimumPoint;
70
- maximumPosition = maximumPoint;
71
- }
72
- else if (maximumPoint - currentTime < BUFFER_WIDTH_IN_SECONDS / 2) {
68
+ if (maximumPoint - currentTime < BUFFER_WIDTH_IN_SECONDS / 2) {
73
69
  maximumPosition = maximumPoint;
74
70
  minimumPosition = maximumPoint - BUFFER_WIDTH_IN_SECONDS;
75
71
  }
@@ -141,23 +141,30 @@ export default function constructDebugGeneralInfo(instance, parentElt, cancelSig
141
141
  ]);
142
142
  adaptationsElt.appendChild(textAdaps);
143
143
  }
144
- const videoBitrates = (_c = (_b = instance.getVideoTrack()) === null || _b === void 0 ? void 0 : _b.representations.map(r => {
145
- return r.bitrate;
146
- }).filter(bitrate => bitrate !== undefined)) !== null && _c !== void 0 ? _c : [];
147
- const audioBitrates = (_e = (_d = instance.getAudioTrack()) === null || _d === void 0 ? void 0 : _d.representations.map(r => {
148
- return r.bitrate;
149
- }).filter(bitrate => bitrate !== undefined)) !== null && _e !== void 0 ? _e : [];
144
+ const adaptations = instance.__priv_getCurrentAdaptation();
145
+ const videoBitratesStr = (_c = (_b = adaptations === null || adaptations === void 0 ? void 0 : adaptations.video) === null || _b === void 0 ? void 0 : _b.representations.map((r) => {
146
+ var _a;
147
+ return String((_a = r.bitrate) !== null && _a !== void 0 ? _a : "N/A") +
148
+ (r.isSupported ? "" : " U!") +
149
+ (r.decipherable !== false ? "" : " E!");
150
+ })) !== null && _c !== void 0 ? _c : [];
151
+ const audioBitratesStr = (_e = (_d = adaptations === null || adaptations === void 0 ? void 0 : adaptations.video) === null || _d === void 0 ? void 0 : _d.representations.map((r) => {
152
+ var _a;
153
+ return String((_a = r.bitrate) !== null && _a !== void 0 ? _a : "N/A") +
154
+ (r.isSupported ? "" : " U!") +
155
+ (r.decipherable !== false ? "" : " E!");
156
+ })) !== null && _e !== void 0 ? _e : [];
150
157
  representationsElt.innerHTML = "";
151
- if (videoBitrates.length > 0) {
158
+ if (videoBitratesStr.length > 0) {
152
159
  representationsElt.appendChild(createMetricTitle("vb"));
153
160
  representationsElt.appendChild(createElement("span", {
154
- textContent: videoBitrates.join(" ") + " ",
161
+ textContent: videoBitratesStr.join(" ") + " ",
155
162
  }));
156
163
  }
157
- if (audioBitrates.length > 0) {
164
+ if (audioBitratesStr.length > 0) {
158
165
  representationsElt.appendChild(createMetricTitle("ab"));
159
166
  representationsElt.appendChild(createElement("span", {
160
- textContent: audioBitrates.join(" ") + " ",
167
+ textContent: audioBitratesStr.join(" ") + " ",
161
168
  }));
162
169
  }
163
170
  }
@@ -16,5 +16,5 @@
16
16
  import PlaybackObserver from "./playback_observer";
17
17
  import Player from "./public_api";
18
18
  export { PlaybackObserver };
19
- export { IPlaybackObservation, IPlaybackObserverEventType, IReadOnlyPlaybackObserver, IFreezingStatus, IRebufferingStatus, } from "./playback_observer";
19
+ export { IObservationPosition, IPlaybackObservation, IPlaybackObserverEventType, IReadOnlyPlaybackObserver, IFreezingStatus, IRebufferingStatus, } from "./playback_observer";
20
20
  export default Player;
@@ -23,6 +23,8 @@ export type IParsedStartAtOption = {
23
23
  percentage: number;
24
24
  } | {
25
25
  fromLastPosition: number;
26
+ } | {
27
+ fromLivePosition: number;
26
28
  } | {
27
29
  fromFirstPosition: number;
28
30
  };
@@ -259,9 +259,8 @@ function parseLoadVideoOptions(options) {
259
259
  "an \"html\" textTrackMode. It will be ignored.");
260
260
  }
261
261
  if (!isNullOrUndefined(options.startAt)) {
262
- // TODO Better way to express that in TypeScript?
263
- if (options.startAt.wallClockTime
264
- instanceof Date) {
262
+ if ("wallClockTime" in options.startAt
263
+ && options.startAt.wallClockTime instanceof Date) {
265
264
  const wallClockTime = options.startAt
266
265
  .wallClockTime.getTime() / 1000;
267
266
  startAt = objectAssign({}, options.startAt, { wallClockTime });
@@ -39,6 +39,13 @@ export default class PlaybackObserver {
39
39
  * influence on some chosen interval values here.
40
40
  */
41
41
  private _lowLatencyMode;
42
+ /**
43
+ * If set, position which could not yet be seeked to as the HTMLMediaElement
44
+ * had a readyState of `0`.
45
+ * This position should be seeked to as soon as the HTMLMediaElement is able
46
+ * to handle it.
47
+ */
48
+ private _pendingSeek;
42
49
  /**
43
50
  * The RxPlayer usually wants to differientate when a seek was sourced from
44
51
  * the RxPlayer's internal logic vs when it was sourced from an outside
@@ -64,6 +71,21 @@ export default class PlaybackObserver {
64
71
  * observations.
65
72
  */
66
73
  private _canceller;
74
+ /**
75
+ * On some devices (right now only seen on Tizen), seeking through the
76
+ * `currentTime` property can lead to the browser re-seeking once the
77
+ * segments have been loaded to improve seeking performances (for
78
+ * example, by seeking right to an intra video frame).
79
+ * In that case, we risk being in a conflict with that behavior: if for
80
+ * example we encounter a small discontinuity at the position the browser
81
+ * seeks to, we will seek over it, the browser would seek back and so on.
82
+ *
83
+ * This variable allows to store the maximum known position we were seeking to
84
+ * so we can detect when the browser seeked back (to avoid performing another
85
+ * seek after that). When browsers seek back to a position behind a
86
+ * discontinuity, they are usually able to skip them without our help.
87
+ */
88
+ private _expectedSeekingPosition;
67
89
  /**
68
90
  * Create a new `PlaybackObserver`, which allows to produce new "playback
69
91
  * observations" on various media events and intervals.
@@ -164,18 +186,22 @@ export default class PlaybackObserver {
164
186
  * @returns {Object}
165
187
  */
166
188
  deriveReadOnlyObserver<TDest>(transform: (observationRef: IReadOnlySharedReference<IPlaybackObservation>, cancellationSignal: CancellationSignal) => IReadOnlySharedReference<TDest>): IReadOnlyPlaybackObserver<TDest>;
189
+ private _actuallySetCurrentTime;
167
190
  /**
168
191
  * Creates the `IReadOnlySharedReference` that will generate playback
169
192
  * observations.
170
193
  * @returns {Object}
171
194
  */
172
195
  private _createSharedReference;
173
- private _generateInitialObservation;
196
+ private _getCurrentObservation;
197
+ private _generateObservationForEvent;
174
198
  }
175
199
  /** "Event" that triggered the playback observation. */
176
200
  export type IPlaybackObserverEventType =
177
201
  /** First playback observation automatically emitted. */
178
- "init" | // set once on first emit
202
+ "init" |
203
+ /** Observation manually forced by the PlaybackObserver. */
204
+ "manual" |
179
205
  /** Regularly emitted playback observation when no event happened in a long time. */
180
206
  "timeupdate" |
181
207
  /** On the HTML5 event with the same name */
@@ -236,8 +262,18 @@ interface IMediaInfos {
236
262
  readyState: number;
237
263
  /** Current `seeking` value on the mediaElement. */
238
264
  seeking: boolean;
239
- /** Event that triggered this playback observation. */
240
- event: IPlaybackObserverEventType;
265
+ }
266
+ /** Categorize a pending seek operation. */
267
+ export declare const enum SeekingState {
268
+ /** We're not currently seeking. */
269
+ None = 0,
270
+ /**
271
+ * We're currently seeking due to an internal logic of the RxPlayer (e.g.
272
+ * discontinuity skipping).
273
+ */
274
+ Internal = 1,
275
+ /** We're currently seeking due to a regular seek wanted by the application. */
276
+ External = 2
241
277
  }
242
278
  /**
243
279
  * Describes when the player is "rebuffering" and what event started that
@@ -277,7 +313,16 @@ export interface IFreezingStatus {
277
313
  timestamp: number;
278
314
  }
279
315
  /** Information emitted on each playback observation. */
280
- export interface IPlaybackObservation extends IMediaInfos {
316
+ export interface IPlaybackObservation extends Omit<IMediaInfos, "position" | "seeking"> {
317
+ /** Event that triggered this playback observation. */
318
+ event: IPlaybackObserverEventType;
319
+ /** Current seeking state. */
320
+ seeking: SeekingState;
321
+ /**
322
+ * Information on the current position being played, the position for which
323
+ * media is wanted etc.
324
+ */
325
+ position: IObservationPosition;
281
326
  /**
282
327
  * Set if the player is short on audio and/or video media data and is a such,
283
328
  * rebuffering.
@@ -292,11 +337,86 @@ export interface IPlaybackObservation extends IMediaInfos {
292
337
  * `null` if the player is not frozen.
293
338
  */
294
339
  freezing: IFreezingStatus | null;
340
+ }
341
+ export type IObservationPosition = ObservationPosition;
342
+ declare class ObservationPosition {
343
+ /**
344
+ * Known position at the time the Observation was emitted, in seconds.
345
+ *
346
+ * Note that it might have changed since. If you want truly precize
347
+ * information, you should recuperate it from the HTMLMediaElement directly
348
+ * through another mean.
349
+ */
350
+ private _last;
351
+ /**
352
+ * Actually wanted position in seconds that is not yet reached.
353
+ *
354
+ * This might for example be set to the initial position when the content is
355
+ * loading (and thus potentially at a `0` position) but which will be seeked
356
+ * to a given position once possible. It may also be the position of a seek
357
+ * that has not been properly accounted for by the current device.
358
+ */
359
+ private _wanted;
360
+ constructor(last: number, wanted: number | null);
361
+ /**
362
+ * Returns the playback position actually observed on the media element at
363
+ * the time the playback observation was made.
364
+ *
365
+ * Note that it may be different than the position for which media data is
366
+ * wanted in rare scenarios where the goal position is not yet set on the
367
+ * media element.
368
+ *
369
+ * You should use this value when you want to obtain the actual position set
370
+ * on the media element for browser compatibility purposes. Note that this
371
+ * position was calculated at observation time, it might thus not be
372
+ * up-to-date if what you want is milliseconds-accuracy.
373
+ *
374
+ * If what you want is the actual position which the player is intended to
375
+ * play, you should rely on `getWanted` instead`.
376
+ * @returns {number}
377
+ */
378
+ getPolled(): number;
379
+ /**
380
+ * Returns the position which the player should consider to load media data
381
+ * at the time the observation was made.
382
+ *
383
+ * It can be different than the value returned by `getPolled` in rare
384
+ * scenarios:
385
+ *
386
+ * - When the initial position has not been set yet.
387
+ *
388
+ * - When the current device do not let the RxPlayer peform precize seeks,
389
+ * usually for perfomance reasons by seeking to a previous IDR frame
390
+ * instead (for now only Tizen may be like this), in which case we
391
+ * prefer to generally rely on the position wanted by the player (this
392
+ * e.g. prevents issues where the RxPlayer logic and the device are
393
+ * seeking back and forth in a loop).
394
+ *
395
+ * - When a wanted position has been "forced" (@see forceWantedPosition).
396
+ * @returns {number}
397
+ */
398
+ getWanted(): number;
399
+ /**
400
+ * Method to call if you want to overwrite the currently wanted position.
401
+ * @param {number} pos
402
+ */
403
+ forceWantedPosition(pos: number): void;
295
404
  /**
296
- * If `true`, an "internal seek" (a seeking operation triggered by the
297
- * RxPlayer code) is currently pending.
405
+ * Returns `true` when the position wanted returned by `getWanted` and the
406
+ * actual position returned by `getPolled` may be different, meaning that
407
+ * we're currently not at the position we want to reach.
408
+ *
409
+ * This is a relatively rare situation which only happens when either the
410
+ * initial seek has not yet been performed. on specific targets where the
411
+ * seeking behavior is a little broken (@see getWanted) or when the wanted
412
+ * position has been forced (@see forceWantedPosition).
413
+ *
414
+ * In those situations, you might temporarily refrain from acting upon the
415
+ * actual current media position, as it may change soon.
416
+ *
417
+ * @returns {boolean}
298
418
  */
299
- pendingInternalSeek: number | null;
419
+ isAwaitingFuturePosition(): boolean;
300
420
  }
301
421
  /**
302
422
  * Interface providing a generic and read-only version of a `PlaybackObserver`.