rx-player 4.0.0-dev.2023120600 → 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 (326) hide show
  1. package/CHANGELOG.md +178 -2
  2. package/README.md +2 -33
  3. package/VERSION +1 -1
  4. package/dist/_esm5.processed/compat/add_text_track.d.ts +3 -1
  5. package/dist/_esm5.processed/compat/add_text_track.js +7 -4
  6. package/dist/_esm5.processed/compat/browser_compatibility_types.d.ts +7 -0
  7. package/dist/_esm5.processed/compat/event_listeners.d.ts +15 -2
  8. package/dist/_esm5.processed/compat/event_listeners.js +37 -2
  9. package/dist/_esm5.processed/compat/fullscreen.d.ts +32 -0
  10. package/dist/_esm5.processed/compat/fullscreen.js +78 -0
  11. package/dist/_esm5.processed/compat/index.d.ts +3 -1
  12. package/dist/_esm5.processed/compat/index.js +3 -1
  13. package/dist/_esm5.processed/compat/is_offline.d.ts +39 -0
  14. package/dist/_esm5.processed/compat/is_offline.js +43 -0
  15. package/dist/_esm5.processed/config.d.ts +21 -9
  16. package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.d.ts +58 -0
  17. package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.js +54 -14
  18. package/dist/_esm5.processed/core/adaptive/utils/select_optimal_representation.d.ts +8 -2
  19. package/dist/_esm5.processed/core/adaptive/utils/select_optimal_representation.js +11 -2
  20. package/dist/_esm5.processed/core/api/debug/modules/general_info.js +46 -17
  21. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.js +3 -3
  22. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.js +1 -1
  23. package/dist/_esm5.processed/core/api/option_utils.d.ts +35 -14
  24. package/dist/_esm5.processed/core/api/option_utils.js +230 -47
  25. package/dist/_esm5.processed/core/api/public_api.d.ts +266 -92
  26. package/dist/_esm5.processed/core/api/public_api.js +802 -444
  27. package/dist/_esm5.processed/core/api/{track_management/media_element_tracks_store.d.ts → tracks_management/media_element_track_choice_manager.d.ts} +75 -15
  28. package/dist/_esm5.processed/core/api/{track_management/media_element_tracks_store.js → tracks_management/media_element_track_choice_manager.js} +193 -74
  29. package/dist/_esm5.processed/core/api/tracks_management/track_choice_manager.d.ts +258 -0
  30. package/dist/_esm5.processed/core/api/tracks_management/track_choice_manager.js +989 -0
  31. package/dist/_esm5.processed/core/api/utils.d.ts +0 -1
  32. package/dist/_esm5.processed/core/api/utils.js +11 -28
  33. package/dist/_esm5.processed/core/decrypt/content_decryptor.js +3 -3
  34. package/dist/_esm5.processed/core/decrypt/find_key_system.js +71 -83
  35. package/dist/_esm5.processed/core/decrypt/get_media_keys.js +5 -6
  36. package/dist/_esm5.processed/core/decrypt/session_events_listener.js +72 -10
  37. package/dist/_esm5.processed/core/decrypt/utils/persistent_sessions_store.d.ts +4 -4
  38. package/dist/_esm5.processed/core/decrypt/utils/persistent_sessions_store.js +4 -6
  39. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.d.ts +3 -1
  40. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +26 -7
  41. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +9 -3
  42. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +9 -16
  43. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.d.ts +3 -1
  44. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +1 -1
  45. package/dist/_esm5.processed/core/fetchers/utils/schedule_request.d.ts +6 -1
  46. package/dist/_esm5.processed/core/fetchers/utils/schedule_request.js +41 -4
  47. package/dist/_esm5.processed/core/init/media_source_content_initializer.d.ts +8 -1
  48. package/dist/_esm5.processed/core/init/media_source_content_initializer.js +5 -2
  49. package/dist/_esm5.processed/core/init/types.d.ts +15 -5
  50. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +9 -2
  51. package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.d.ts +75 -0
  52. package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.js +133 -0
  53. package/dist/_esm5.processed/core/{api/track_management → segment_buffers/implementations/image}/index.d.ts +2 -3
  54. package/dist/_esm5.processed/core/{api/track_management → segment_buffers/implementations/image}/index.js +2 -3
  55. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +1 -1
  56. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +2 -1
  57. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +4 -3
  58. package/dist/_esm5.processed/core/segment_buffers/implementations/types.d.ts +2 -2
  59. package/dist/_esm5.processed/core/segment_buffers/index.d.ts +2 -2
  60. package/dist/_esm5.processed/core/segment_buffers/index.js +1 -2
  61. package/dist/_esm5.processed/core/segment_buffers/inventory/index.d.ts +2 -3
  62. package/dist/_esm5.processed/core/segment_buffers/inventory/index.js +0 -1
  63. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +25 -8
  64. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +19 -10
  65. package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.d.ts +1 -0
  66. package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +16 -2
  67. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +15 -0
  68. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +93 -183
  69. package/dist/_esm5.processed/core/stream/adaptation/types.d.ts +13 -27
  70. package/dist/_esm5.processed/core/stream/index.d.ts +3 -2
  71. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +0 -2
  72. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +7 -5
  73. package/dist/_esm5.processed/core/stream/period/period_stream.js +12 -13
  74. package/dist/_esm5.processed/core/stream/period/types.d.ts +14 -5
  75. package/dist/_esm5.processed/core/stream/period/utils/get_adaptation_switch_strategy.d.ts +4 -2
  76. package/dist/_esm5.processed/core/stream/period/utils/get_adaptation_switch_strategy.js +46 -10
  77. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +23 -29
  78. package/dist/_esm5.processed/core/stream/representation/types.d.ts +1 -11
  79. package/dist/_esm5.processed/core/stream/representation/utils/get_buffer_status.js +1 -1
  80. package/dist/_esm5.processed/core/stream/representation/utils/get_needed_segments.js +1 -1
  81. package/dist/_esm5.processed/default_config.d.ts +98 -35
  82. package/dist/_esm5.processed/default_config.js +113 -36
  83. package/dist/_esm5.processed/errors/custom_loader_error.d.ts +3 -1
  84. package/dist/_esm5.processed/errors/custom_loader_error.js +3 -1
  85. package/dist/_esm5.processed/errors/media_error.js +2 -2
  86. package/dist/_esm5.processed/errors/network_error.d.ts +1 -0
  87. package/dist/_esm5.processed/errors/network_error.js +1 -0
  88. package/dist/_esm5.processed/errors/request_error.d.ts +3 -2
  89. package/dist/_esm5.processed/errors/request_error.js +5 -2
  90. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +3 -3
  91. package/dist/_esm5.processed/features/features_object.js +2 -0
  92. package/dist/_esm5.processed/{transports/smooth/is_mp4_embedded_track.js → features/list/bif_parser.d.ts} +6 -7
  93. package/dist/_esm5.processed/features/list/bif_parser.js +27 -0
  94. package/dist/_esm5.processed/features/list/directfile.js +5 -2
  95. package/dist/_esm5.processed/features/list/image_buffer.d.ts +23 -0
  96. package/dist/_esm5.processed/features/list/image_buffer.js +25 -0
  97. package/dist/_esm5.processed/features/list/index.d.ts +2 -0
  98. package/dist/_esm5.processed/features/list/index.js +2 -0
  99. package/dist/_esm5.processed/features/types.d.ts +27 -3
  100. package/dist/_esm5.processed/manifest/adaptation.d.ts +11 -9
  101. package/dist/_esm5.processed/manifest/adaptation.js +30 -41
  102. package/dist/_esm5.processed/manifest/index.d.ts +4 -3
  103. package/dist/_esm5.processed/manifest/manifest.d.ts +54 -5
  104. package/dist/_esm5.processed/manifest/manifest.js +110 -5
  105. package/dist/_esm5.processed/manifest/period.d.ts +5 -4
  106. package/dist/_esm5.processed/manifest/representation.d.ts +5 -10
  107. package/dist/_esm5.processed/manifest/representation.js +5 -15
  108. package/dist/_esm5.processed/manifest/representation_index/index.d.ts +2 -2
  109. package/dist/_esm5.processed/manifest/representation_index/static.d.ts +0 -2
  110. package/dist/_esm5.processed/manifest/representation_index/static.js +0 -6
  111. package/dist/_esm5.processed/manifest/representation_index/types.d.ts +21 -42
  112. package/dist/_esm5.processed/manifest/types.d.ts +2 -0
  113. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +31 -17
  114. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.js +19 -26
  115. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.d.ts +0 -2
  116. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.js +1 -7
  117. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +6 -2
  118. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +8 -11
  119. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +0 -2
  120. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +0 -6
  121. package/dist/_esm5.processed/parsers/manifest/dash/common/infer_adaptation_type.d.ts +2 -2
  122. package/dist/_esm5.processed/parsers/manifest/dash/common/infer_adaptation_type.js +6 -1
  123. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +5 -3
  124. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.d.ts +2 -0
  125. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +1 -1
  126. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.js +2 -2
  127. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.d.ts +2 -0
  128. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.js +2 -2
  129. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.js +6 -10
  130. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/Representation.js +2 -4
  131. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/utils.d.ts +1 -10
  132. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/utils.js +2 -18
  133. package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +4 -4
  134. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.js +6 -3
  135. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/Representation.js +2 -1
  136. package/dist/_esm5.processed/parsers/manifest/local/representation_index.d.ts +0 -2
  137. package/dist/_esm5.processed/parsers/manifest/local/representation_index.js +0 -6
  138. package/dist/_esm5.processed/parsers/manifest/metaplaylist/metaplaylist_parser.js +6 -6
  139. package/dist/_esm5.processed/parsers/manifest/metaplaylist/representation_index.d.ts +3 -12
  140. package/dist/_esm5.processed/parsers/manifest/metaplaylist/representation_index.js +2 -11
  141. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.d.ts +1 -0
  142. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +17 -11
  143. package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.d.ts +83 -21
  144. package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.js +125 -53
  145. package/dist/_esm5.processed/parsers/manifest/smooth/utils/add_segment_infos.d.ts +6 -3
  146. package/dist/_esm5.processed/parsers/manifest/smooth/utils/add_segment_infos.js +4 -4
  147. package/dist/_esm5.processed/parsers/manifest/types.d.ts +3 -3
  148. package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_line_height.js +2 -1
  149. package/dist/_esm5.processed/public_types.d.ts +310 -396
  150. package/dist/_esm5.processed/tools/TextTrackRenderer/text_track_renderer.d.ts +4 -5
  151. package/dist/_esm5.processed/tools/TextTrackRenderer/text_track_renderer.js +4 -5
  152. package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +4 -4
  153. package/dist/_esm5.processed/transports/dash/image_pipelines.d.ts +38 -0
  154. package/dist/_esm5.processed/transports/dash/image_pipelines.js +129 -0
  155. package/dist/_esm5.processed/transports/dash/manifest_parser.js +3 -2
  156. package/dist/_esm5.processed/transports/dash/pipelines.js +4 -1
  157. package/dist/_esm5.processed/transports/dash/segment_loader.d.ts +2 -2
  158. package/dist/_esm5.processed/transports/dash/segment_loader.js +20 -26
  159. package/dist/_esm5.processed/transports/dash/segment_parser.js +24 -19
  160. package/dist/_esm5.processed/transports/dash/text_loader.js +5 -5
  161. package/dist/_esm5.processed/transports/dash/text_parser.js +33 -28
  162. package/dist/_esm5.processed/transports/local/pipelines.js +10 -1
  163. package/dist/_esm5.processed/transports/local/segment_loader.js +2 -2
  164. package/dist/_esm5.processed/transports/local/segment_parser.d.ts +1 -1
  165. package/dist/_esm5.processed/transports/local/segment_parser.js +10 -10
  166. package/dist/_esm5.processed/transports/local/text_parser.d.ts +2 -2
  167. package/dist/_esm5.processed/transports/local/text_parser.js +23 -23
  168. package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +52 -34
  169. package/dist/_esm5.processed/transports/smooth/pipelines.js +190 -33
  170. package/dist/_esm5.processed/transports/smooth/segment_loader.d.ts +1 -1
  171. package/dist/_esm5.processed/transports/smooth/segment_loader.js +22 -28
  172. package/dist/_esm5.processed/transports/smooth/utils.d.ts +26 -1
  173. package/dist/_esm5.processed/transports/smooth/utils.js +55 -1
  174. package/dist/_esm5.processed/transports/types.d.ts +89 -94
  175. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +3 -3
  176. package/dist/_esm5.processed/transports/utils/infer_segment_container.d.ts +3 -3
  177. package/dist/_esm5.processed/transports/utils/infer_segment_container.js +7 -5
  178. package/dist/_esm5.processed/transports/utils/parse_text_track.d.ts +12 -8
  179. package/dist/_esm5.processed/transports/utils/parse_text_track.js +21 -19
  180. package/dist/_esm5.processed/utils/array_includes.d.ts +1 -2
  181. package/dist/_esm5.processed/utils/array_includes.js +28 -30
  182. package/dist/_esm5.processed/{transports/smooth/is_mp4_embedded_track.d.ts → utils/list_to_map.d.ts} +5 -5
  183. package/dist/_esm5.processed/utils/list_to_map.js +28 -0
  184. package/dist/_esm5.processed/utils/request/xhr.js +5 -5
  185. package/dist/_esm5.processed/utils/simple_set.d.ts +51 -0
  186. package/dist/_esm5.processed/utils/simple_set.js +57 -0
  187. package/dist/_esm5.processed/utils/uniq.d.ts +36 -0
  188. package/dist/_esm5.processed/utils/uniq.js +43 -0
  189. package/dist/commonjs/config.d.ts +1 -1
  190. package/dist/commonjs/core/adaptive/adaptive_representation_selector.d.ts +2 -19
  191. package/dist/commonjs/core/adaptive/adaptive_representation_selector.js +2 -2
  192. package/dist/commonjs/core/adaptive/network_analyzer.js +3 -3
  193. package/dist/commonjs/core/api/index.d.ts +1 -1
  194. package/dist/commonjs/core/api/playback_observer.d.ts +128 -8
  195. package/dist/commonjs/core/api/playback_observer.js +217 -64
  196. package/dist/commonjs/core/api/public_api.js +9 -9
  197. package/dist/commonjs/core/api/utils.js +1 -1
  198. package/dist/commonjs/core/decrypt/get_media_keys.js +2 -6
  199. package/dist/commonjs/core/init/directfile_content_initializer.js +5 -1
  200. package/dist/commonjs/core/init/media_source_content_initializer.js +28 -14
  201. package/dist/commonjs/core/init/utils/content_time_boundaries_observer.js +1 -2
  202. package/dist/commonjs/core/init/utils/create_stream_playback_observer.d.ts +1 -5
  203. package/dist/commonjs/core/init/utils/create_stream_playback_observer.js +16 -14
  204. package/dist/commonjs/core/init/utils/initial_seek_and_play.d.ts +9 -11
  205. package/dist/commonjs/core/init/utils/initial_seek_and_play.js +121 -91
  206. package/dist/commonjs/core/init/utils/rebuffering_controller.js +27 -70
  207. package/dist/commonjs/core/init/utils/stream_events_emitter/stream_events_emitter.js +4 -2
  208. package/dist/commonjs/core/segment_buffers/garbage_collector.js +1 -2
  209. package/dist/commonjs/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +9 -2
  210. package/dist/commonjs/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +1 -1
  211. package/dist/commonjs/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +1 -1
  212. package/dist/commonjs/core/segment_buffers/index.d.ts +2 -2
  213. package/dist/commonjs/core/segment_buffers/inventory/index.d.ts +2 -2
  214. package/dist/commonjs/core/segment_buffers/inventory/segment_inventory.d.ts +25 -8
  215. package/dist/commonjs/core/segment_buffers/inventory/segment_inventory.js +19 -10
  216. package/dist/commonjs/core/stream/adaptation/get_representations_switch_strategy.d.ts +2 -2
  217. package/dist/commonjs/core/stream/adaptation/get_representations_switch_strategy.js +16 -9
  218. package/dist/commonjs/core/stream/orchestrator/stream_orchestrator.js +14 -18
  219. package/dist/commonjs/core/stream/period/period_stream.js +5 -8
  220. package/dist/commonjs/core/stream/period/types.d.ts +2 -3
  221. package/dist/commonjs/core/stream/period/utils/get_adaptation_switch_strategy.d.ts +4 -5
  222. package/dist/commonjs/core/stream/period/utils/get_adaptation_switch_strategy.js +17 -13
  223. package/dist/commonjs/core/stream/representation/representation_stream.js +3 -4
  224. package/dist/commonjs/core/stream/representation/types.d.ts +2 -2
  225. package/dist/commonjs/core/stream/representation/utils/append_segment_to_buffer.js +11 -12
  226. package/dist/commonjs/core/stream/representation/utils/get_buffer_status.js +1 -1
  227. package/dist/commonjs/default_config.d.ts +7 -16
  228. package/dist/commonjs/default_config.js +16 -16
  229. package/dist/commonjs/manifest/adaptation.js +2 -1
  230. package/dist/commonjs/parsers/texttracks/ttml/html/apply_line_height.js +2 -1
  231. package/dist/commonjs/public_types.d.ts +29 -2
  232. package/dist/es2017/config.d.ts +1 -1
  233. package/dist/es2017/core/adaptive/adaptive_representation_selector.d.ts +2 -19
  234. package/dist/es2017/core/adaptive/adaptive_representation_selector.js +2 -2
  235. package/dist/es2017/core/adaptive/network_analyzer.js +3 -3
  236. package/dist/es2017/core/api/index.d.ts +1 -1
  237. package/dist/es2017/core/api/playback_observer.d.ts +128 -8
  238. package/dist/es2017/core/api/playback_observer.js +217 -66
  239. package/dist/es2017/core/api/public_api.js +9 -9
  240. package/dist/es2017/core/api/utils.js +1 -1
  241. package/dist/es2017/core/decrypt/get_media_keys.js +2 -6
  242. package/dist/es2017/core/init/directfile_content_initializer.js +7 -1
  243. package/dist/es2017/core/init/media_source_content_initializer.js +30 -16
  244. package/dist/es2017/core/init/utils/content_time_boundaries_observer.js +1 -2
  245. package/dist/es2017/core/init/utils/create_stream_playback_observer.d.ts +1 -5
  246. package/dist/es2017/core/init/utils/create_stream_playback_observer.js +16 -14
  247. package/dist/es2017/core/init/utils/initial_seek_and_play.d.ts +9 -11
  248. package/dist/es2017/core/init/utils/initial_seek_and_play.js +120 -91
  249. package/dist/es2017/core/init/utils/rebuffering_controller.js +27 -70
  250. package/dist/es2017/core/init/utils/stream_events_emitter/stream_events_emitter.js +4 -2
  251. package/dist/es2017/core/segment_buffers/garbage_collector.js +1 -2
  252. package/dist/es2017/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +9 -2
  253. package/dist/es2017/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +1 -1
  254. package/dist/es2017/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +1 -1
  255. package/dist/es2017/core/segment_buffers/index.d.ts +2 -2
  256. package/dist/es2017/core/segment_buffers/inventory/index.d.ts +2 -2
  257. package/dist/es2017/core/segment_buffers/inventory/segment_inventory.d.ts +25 -8
  258. package/dist/es2017/core/segment_buffers/inventory/segment_inventory.js +19 -10
  259. package/dist/es2017/core/stream/adaptation/get_representations_switch_strategy.d.ts +2 -2
  260. package/dist/es2017/core/stream/adaptation/get_representations_switch_strategy.js +16 -9
  261. package/dist/es2017/core/stream/orchestrator/stream_orchestrator.js +16 -18
  262. package/dist/es2017/core/stream/period/period_stream.js +4 -7
  263. package/dist/es2017/core/stream/period/types.d.ts +2 -3
  264. package/dist/es2017/core/stream/period/utils/get_adaptation_switch_strategy.d.ts +4 -5
  265. package/dist/es2017/core/stream/period/utils/get_adaptation_switch_strategy.js +17 -13
  266. package/dist/es2017/core/stream/representation/representation_stream.js +3 -4
  267. package/dist/es2017/core/stream/representation/types.d.ts +2 -2
  268. package/dist/es2017/core/stream/representation/utils/append_segment_to_buffer.js +1 -2
  269. package/dist/es2017/core/stream/representation/utils/get_buffer_status.js +1 -1
  270. package/dist/es2017/default_config.d.ts +7 -16
  271. package/dist/es2017/default_config.js +16 -16
  272. package/dist/es2017/manifest/adaptation.js +2 -1
  273. package/dist/es2017/parsers/texttracks/ttml/html/apply_line_height.js +2 -1
  274. package/dist/es2017/public_types.d.ts +29 -2
  275. package/dist/mpd-parser.wasm +0 -0
  276. package/dist/rx-player.js +614 -438
  277. package/dist/rx-player.min.js +1 -1
  278. package/package.json +5 -1
  279. package/scripts/canal-release.patch +78 -0
  280. package/scripts/make-dev-releases +65 -0
  281. package/scripts/update-version +5 -0
  282. package/sonar-project.properties +1 -1
  283. package/src/core/adaptive/adaptive_representation_selector.ts +4 -21
  284. package/src/core/adaptive/network_analyzer.ts +3 -3
  285. package/src/core/api/index.ts +1 -0
  286. package/src/core/api/playback_observer.ts +327 -107
  287. package/src/core/api/public_api.ts +9 -9
  288. package/src/core/api/utils.ts +3 -1
  289. package/src/core/decrypt/get_media_keys.ts +2 -8
  290. package/src/core/init/directfile_content_initializer.ts +8 -8
  291. package/src/core/init/media_source_content_initializer.ts +27 -20
  292. package/src/core/init/utils/content_time_boundaries_observer.ts +1 -1
  293. package/src/core/init/utils/create_stream_playback_observer.ts +19 -20
  294. package/src/core/init/utils/initial_seek_and_play.ts +140 -108
  295. package/src/core/init/utils/rebuffering_controller.ts +32 -77
  296. package/src/core/init/utils/stream_events_emitter/stream_events_emitter.ts +5 -2
  297. package/src/core/segment_buffers/garbage_collector.ts +1 -1
  298. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +10 -2
  299. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +1 -1
  300. package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +1 -1
  301. package/src/core/segment_buffers/index.ts +2 -0
  302. package/src/core/segment_buffers/inventory/index.ts +2 -0
  303. package/src/core/segment_buffers/inventory/segment_inventory.ts +49 -17
  304. package/src/core/stream/adaptation/get_representations_switch_strategy.ts +21 -12
  305. package/src/core/stream/orchestrator/stream_orchestrator.ts +14 -19
  306. package/src/core/stream/period/period_stream.ts +7 -8
  307. package/src/core/stream/period/types.ts +2 -3
  308. package/src/core/stream/period/utils/get_adaptation_switch_strategy.ts +21 -15
  309. package/src/core/stream/representation/representation_stream.ts +3 -5
  310. package/src/core/stream/representation/types.ts +2 -2
  311. package/src/core/stream/representation/utils/append_segment_to_buffer.ts +1 -1
  312. package/src/core/stream/representation/utils/get_buffer_status.ts +2 -1
  313. package/src/default_config.ts +17 -17
  314. package/src/manifest/adaptation.ts +2 -1
  315. package/src/parsers/texttracks/ttml/html/apply_line_height.ts +3 -1
  316. package/src/public_types.ts +29 -2
  317. package/dist/_esm5.processed/core/api/track_management/track_dispatcher.d.ts +0 -84
  318. package/dist/_esm5.processed/core/api/track_management/track_dispatcher.js +0 -158
  319. package/dist/_esm5.processed/core/api/track_management/tracks_store.d.ts +0 -406
  320. package/dist/_esm5.processed/core/api/track_management/tracks_store.js +0 -932
  321. package/dist/_esm5.processed/core/segment_buffers/inventory/utils.d.ts +0 -33
  322. package/dist/_esm5.processed/core/segment_buffers/inventory/utils.js +0 -49
  323. package/dist/_esm5.processed/core/stream/adaptation/get_representations_switch_strategy.d.ts +0 -39
  324. package/dist/_esm5.processed/core/stream/adaptation/get_representations_switch_strategy.js +0 -133
  325. package/dist/_esm5.processed/parsers/manifest/smooth/shared_smooth_segment_timeline.d.ts +0 -119
  326. package/dist/_esm5.processed/parsers/manifest/smooth/shared_smooth_segment_timeline.js +0 -159
@@ -24,7 +24,7 @@ import TaskCanceller from "../../../utils/task_canceller";
24
24
  * @param {Object} fnCancelSignal - Abort the created PlaybackObserver.
25
25
  * @returns {Object}
26
26
  */
27
- export default function createStreamPlaybackObserver(srcPlaybackObserver, { autoPlay, initialPlayPerformed, initialSeekPerformed, manifest, speed, startTime }, fnCancelSignal) {
27
+ export default function createStreamPlaybackObserver(srcPlaybackObserver, { autoPlay, initialPlayPerformed, manifest, speed }, fnCancelSignal) {
28
28
  return srcPlaybackObserver.deriveReadOnlyObserver(function transform(observationRef, parentObserverCancelSignal) {
29
29
  const canceller = new TaskCanceller();
30
30
  canceller.linkToSignal(parentObserverCancelSignal);
@@ -42,11 +42,7 @@ export default function createStreamPlaybackObserver(srcPlaybackObserver, { auto
42
42
  function constructStreamPlaybackObservation() {
43
43
  const observation = observationRef.getValue();
44
44
  const lastSpeed = speed.getValue();
45
- let pendingPosition;
46
- if (!initialSeekPerformed.getValue()) {
47
- pendingPosition = startTime;
48
- }
49
- else if (!manifest.isDynamic || manifest.isLastPeriodKnown) {
45
+ if (!manifest.isDynamic || manifest.isLastPeriodKnown) {
50
46
  // HACK: When the position is actually further than the maximum
51
47
  // position for a finished content, we actually want to be loading
52
48
  // the last segment before ending.
@@ -54,19 +50,25 @@ export default function createStreamPlaybackObserver(srcPlaybackObserver, { auto
54
50
  // want to seek one second before the period's end (despite never
55
51
  // doing it).
56
52
  const lastPeriod = manifest.periods[manifest.periods.length - 1];
57
- if (lastPeriod !== undefined &&
58
- lastPeriod.end !== undefined &&
59
- observation.position > lastPeriod.end) {
60
- pendingPosition = lastPeriod.end - 1;
53
+ if (lastPeriod !== undefined && lastPeriod.end !== undefined) {
54
+ const wantedPosition = observation.position.getWanted();
55
+ if (wantedPosition >= lastPeriod.start &&
56
+ wantedPosition >= lastPeriod.end - 1) {
57
+ // We're after the end of the last Period, check if `buffered`
58
+ // indicates that the last segment is probably not loaded, in which
59
+ // case act as if we want to load one second before the end.
60
+ const buffered = observation.buffered;
61
+ if (buffered.length === 0 ||
62
+ buffered.end(buffered.length - 1) < observation.duration - 1) {
63
+ observation.position.forceWantedPosition(lastPeriod.end - 1);
64
+ }
65
+ }
61
66
  }
62
67
  }
63
68
  return {
64
69
  // TODO more exact according to the current Adaptation chosen?
65
70
  maximumPosition: manifest.getMaximumSafePosition(),
66
- position: {
67
- last: observation.position,
68
- pending: pendingPosition,
69
- },
71
+ position: observation.position,
70
72
  duration: observation.duration,
71
73
  paused: {
72
74
  last: observation.paused,
@@ -38,11 +38,6 @@ export type IInitialPlayEvent =
38
38
  export interface IInitialSeekAndPlayObject {
39
39
  /** Emit the result of the auto-play operation, once performed. */
40
40
  autoPlayResult: Promise<IInitialPlayEvent>;
41
- /**
42
- * Shared reference whose value becomes `true` once the initial seek has
43
- * been considered / has been done by `performInitialSeekAndPlay`.
44
- */
45
- initialSeekPerformed: IReadOnlySharedReference<boolean>;
46
41
  /**
47
42
  * Shared reference whose value becomes `true` once the initial play has
48
43
  * been considered / has been done by `performInitialSeekAndPlay`.
@@ -52,12 +47,15 @@ export interface IInitialSeekAndPlayObject {
52
47
  /**
53
48
  * Seek as soon as possible at the initially wanted position and play if
54
49
  * autoPlay is wanted.
55
- * @param {HTMLMediaElement} mediaElement
56
- * @param {Object} playbackObserver
57
- * @param {number|Function} startTime
58
- * @param {boolean} mustAutoPlay
59
- * @param {Function} onWarning
50
+ * @param {Object} args
60
51
  * @param {Object} cancelSignal
61
52
  * @returns {Object}
62
53
  */
63
- export default function performInitialSeekAndPlay(mediaElement: HTMLMediaElement, playbackObserver: PlaybackObserver, startTime: number | (() => number), mustAutoPlay: boolean, onWarning: (err: IPlayerError) => void, cancelSignal: CancellationSignal): IInitialSeekAndPlayObject;
54
+ export default function performInitialSeekAndPlay({ mediaElement, playbackObserver, startTime, mustAutoPlay, isDirectfile, onWarning }: {
55
+ mediaElement: HTMLMediaElement;
56
+ playbackObserver: PlaybackObserver;
57
+ startTime: number | (() => number);
58
+ mustAutoPlay: boolean;
59
+ isDirectfile: boolean;
60
+ onWarning: (err: IPlayerError) => void;
61
+ }, cancelSignal: CancellationSignal): IInitialSeekAndPlayObject;
@@ -14,115 +14,144 @@
14
14
  * limitations under the License.
15
15
  */
16
16
  import { shouldValidateMetadata } from "../../../compat";
17
- import { READY_STATES } from "../../../compat/browser_compatibility_types";
18
17
  import { MediaError } from "../../../errors";
19
18
  import log from "../../../log";
20
19
  import SharedReference from "../../../utils/reference";
21
20
  /**
22
21
  * Seek as soon as possible at the initially wanted position and play if
23
22
  * autoPlay is wanted.
24
- * @param {HTMLMediaElement} mediaElement
25
- * @param {Object} playbackObserver
26
- * @param {number|Function} startTime
27
- * @param {boolean} mustAutoPlay
28
- * @param {Function} onWarning
23
+ * @param {Object} args
29
24
  * @param {Object} cancelSignal
30
25
  * @returns {Object}
31
26
  */
32
- export default function performInitialSeekAndPlay(mediaElement, playbackObserver, startTime, mustAutoPlay, onWarning, cancelSignal) {
33
- let resolveAutoPlay;
34
- let rejectAutoPlay;
35
- const autoPlayResult = new Promise((res, rej) => {
36
- resolveAutoPlay = res;
37
- rejectAutoPlay = rej;
38
- });
39
- const initialSeekPerformed = new SharedReference(false, cancelSignal);
27
+ export default function performInitialSeekAndPlay({ mediaElement, playbackObserver, startTime, mustAutoPlay, isDirectfile, onWarning }, cancelSignal) {
40
28
  const initialPlayPerformed = new SharedReference(false, cancelSignal);
41
- mediaElement.addEventListener("loadedmetadata", onLoadedMetadata);
42
- const deregisterCancellation = cancelSignal.register((err) => {
43
- mediaElement.removeEventListener("loadedmetadata", onLoadedMetadata);
44
- rejectAutoPlay(err);
45
- });
46
- if (mediaElement.readyState >= READY_STATES.HAVE_METADATA) {
47
- onLoadedMetadata();
48
- }
49
- return { autoPlayResult, initialPlayPerformed, initialSeekPerformed };
50
- function onLoadedMetadata() {
51
- mediaElement.removeEventListener("loadedmetadata", onLoadedMetadata);
52
- const initialTime = typeof startTime === "function" ? startTime() :
53
- startTime;
54
- log.info("Init: Set initial time", initialTime);
55
- playbackObserver.setCurrentTime(initialTime);
56
- initialSeekPerformed.setValue(true);
57
- initialSeekPerformed.finish();
58
- if (shouldValidateMetadata() && mediaElement.duration === 0) {
59
- const error = new MediaError("MEDIA_ERR_NOT_LOADED_METADATA", "Cannot load automatically: your browser " +
60
- "falsely announced having loaded the content.");
61
- onWarning(error);
29
+ const autoPlayResult = new Promise((resolveAutoPlay, rejectAutoPlay) => {
30
+ // `startTime` defined as a function might depend on metadata to make its
31
+ // choice, such as the content duration, minimum and/or maximum position.
32
+ //
33
+ // The RxPlayer might already know those through the Manifest file for
34
+ // non-Directfile contents, yet only through the `HTMLMediaElement` once a
35
+ // a sufficient `readyState` has been reached for directfile contents.
36
+ // So let's divide the two possibilities here.
37
+ if (!isDirectfile || typeof startTime === "number") {
38
+ playbackObserver.setCurrentTime(typeof startTime === "number" ? startTime : startTime());
39
+ waitForSeekable();
62
40
  }
63
- if (cancelSignal.isCancelled()) {
64
- return;
41
+ else {
42
+ playbackObserver.listen((obs, stopListening) => {
43
+ if (obs.readyState >= 1) {
44
+ stopListening();
45
+ playbackObserver.setCurrentTime(typeof startTime === "number" ? startTime : startTime());
46
+ waitForSeekable();
47
+ }
48
+ }, { includeLastObservation: true, clearSignal: cancelSignal });
65
49
  }
66
- playbackObserver.listen((observation, stopListening) => {
67
- if (!observation.seeking &&
68
- observation.rebuffering === null &&
69
- observation.readyState >= 1) {
50
+ const deregisterCancellation = cancelSignal.register((err) => {
51
+ rejectAutoPlay(err);
52
+ });
53
+ /**
54
+ * Logic that should be run once the initial seek has been asked to the
55
+ * PlaybackObserver.
56
+ *
57
+ * Actually wait until the seek has been performed, wait for the right moment
58
+ * to perform autoplay, resolve the promise once everything has been done and
59
+ * potentially send warning if a minor issue is detected.
60
+ */
61
+ function waitForSeekable() {
62
+ playbackObserver.listen((obs, stopListening) => {
63
+ if (obs.seeking === 0 /* SeekingState.None */ || obs.readyState === 0) {
64
+ return;
65
+ }
70
66
  stopListening();
71
- onPlayable();
72
- }
73
- }, { includeLastObservation: true, clearSignal: cancelSignal });
74
- }
75
- function onPlayable() {
76
- var _a;
77
- log.info("Init: Can begin to play content");
78
- if (!mustAutoPlay) {
79
- if (mediaElement.autoplay) {
80
- log.warn("Init: autoplay is enabled on HTML media element. " +
81
- "Media will play as soon as possible.");
82
- }
83
- initialPlayPerformed.setValue(true);
84
- initialPlayPerformed.finish();
85
- deregisterCancellation();
86
- return resolveAutoPlay({ type: "skipped" });
87
- }
88
- let playResult;
89
- try {
90
- playResult = (_a = mediaElement.play()) !== null && _a !== void 0 ? _a : Promise.resolve();
67
+ if (shouldValidateMetadata() && mediaElement.duration === 0) {
68
+ const error = new MediaError("MEDIA_ERR_NOT_LOADED_METADATA", "Cannot load automatically: your browser " +
69
+ "falsely announced having loaded the content.");
70
+ onWarning(error);
71
+ }
72
+ if (cancelSignal.isCancelled()) {
73
+ return;
74
+ }
75
+ waitForPlayable();
76
+ }, { includeLastObservation: true, clearSignal: cancelSignal });
91
77
  }
92
- catch (playError) {
93
- deregisterCancellation();
94
- return rejectAutoPlay(playError);
78
+ /**
79
+ * Logic that should be run once the initial seek has been properly performed.
80
+ *
81
+ * Wait for the media being playable before performing the autoplay operation
82
+ * if asked. Potentially send warning if a minor issue has been detected while
83
+ * doing so.
84
+ */
85
+ function waitForPlayable() {
86
+ playbackObserver.listen((observation, stopListening) => {
87
+ if (observation.seeking === 0 /* SeekingState.None */ &&
88
+ observation.rebuffering === null &&
89
+ observation.readyState >= 1) {
90
+ stopListening();
91
+ onPlayable();
92
+ }
93
+ }, { includeLastObservation: true, clearSignal: cancelSignal });
95
94
  }
96
- playResult
97
- .then(() => {
98
- if (cancelSignal.isCancelled()) {
99
- return;
95
+ /**
96
+ * Callback called once the content is considered "playable".
97
+ *
98
+ * Perform the autoplay if needed, handling potential issues and resolve the
99
+ * Promise when done.
100
+ * Might also send warnings if minor issues arise.
101
+ */
102
+ function onPlayable() {
103
+ var _a;
104
+ log.info("Init: Can begin to play content");
105
+ if (!mustAutoPlay) {
106
+ if (mediaElement.autoplay) {
107
+ log.warn("Init: autoplay is enabled on HTML media element. " +
108
+ "Media will play as soon as possible.");
109
+ }
110
+ initialPlayPerformed.setValue(true);
111
+ initialPlayPerformed.finish();
112
+ deregisterCancellation();
113
+ return resolveAutoPlay({ type: "skipped" });
100
114
  }
101
- initialPlayPerformed.setValue(true);
102
- initialPlayPerformed.finish();
103
- deregisterCancellation();
104
- return resolveAutoPlay({ type: "autoplay" });
105
- })
106
- .catch((playError) => {
107
- deregisterCancellation();
108
- if (cancelSignal.isCancelled()) {
109
- return;
115
+ let playResult;
116
+ try {
117
+ playResult = (_a = mediaElement.play()) !== null && _a !== void 0 ? _a : Promise.resolve();
110
118
  }
111
- if (playError instanceof Error && playError.name === "NotAllowedError") {
112
- // auto-play was probably prevented.
113
- log.warn("Init: Media element can't play." +
114
- " It may be due to browser auto-play policies.");
115
- const error = new MediaError("MEDIA_ERR_BLOCKED_AUTOPLAY", "Cannot trigger auto-play automatically: " +
116
- "your browser does not allow it.");
117
- onWarning(error);
119
+ catch (playError) {
120
+ deregisterCancellation();
121
+ return rejectAutoPlay(playError);
122
+ }
123
+ playResult
124
+ .then(() => {
118
125
  if (cancelSignal.isCancelled()) {
119
126
  return;
120
127
  }
121
- return resolveAutoPlay({ type: "autoplay-blocked" });
122
- }
123
- else {
124
- rejectAutoPlay(playError);
125
- }
126
- });
127
- }
128
+ initialPlayPerformed.setValue(true);
129
+ initialPlayPerformed.finish();
130
+ deregisterCancellation();
131
+ return resolveAutoPlay({ type: "autoplay" });
132
+ })
133
+ .catch((playError) => {
134
+ deregisterCancellation();
135
+ if (cancelSignal.isCancelled()) {
136
+ return;
137
+ }
138
+ if (playError instanceof Error && playError.name === "NotAllowedError") {
139
+ // auto-play was probably prevented.
140
+ log.warn("Init: Media element can't play." +
141
+ " It may be due to browser auto-play policies.");
142
+ const error = new MediaError("MEDIA_ERR_BLOCKED_AUTOPLAY", "Cannot trigger auto-play automatically: " +
143
+ "your browser does not allow it.");
144
+ onWarning(error);
145
+ if (cancelSignal.isCancelled()) {
146
+ return;
147
+ }
148
+ return resolveAutoPlay({ type: "autoplay-blocked" });
149
+ }
150
+ else {
151
+ rejectAutoPlay(playError);
152
+ }
153
+ });
154
+ }
155
+ });
156
+ return { autoPlayResult, initialPlayPerformed };
128
157
  }
@@ -13,7 +13,6 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import isSeekingApproximate from "../../../compat/is_seeking_approximate";
17
16
  import config from "../../../config";
18
17
  import { MediaError } from "../../../errors";
19
18
  import log from "../../../log";
@@ -56,52 +55,15 @@ export default class RebufferingController extends EventEmitter {
56
55
  return;
57
56
  }
58
57
  this._isStarted = true;
59
- /**
60
- * On some devices (right now only seen on Tizen), seeking through the
61
- * `currentTime` property can lead to the browser re-seeking once the
62
- * segments have been loaded to improve seeking performances (for
63
- * example, by seeking right to an intra video frame).
64
- * In that case, we risk being in a conflict with that behavior: if for
65
- * example we encounter a small discontinuity at the position the browser
66
- * seeks to, we will seek over it, the browser would seek back and so on.
67
- *
68
- * This variable allows to store the last known position we were seeking to
69
- * so we can detect when the browser seeked back (to avoid performing another
70
- * seek after that). When browsers seek back to a position behind a
71
- * discontinuity, they are usually able to skip them without our help.
72
- */
73
- let lastSeekingPosition;
74
- /**
75
- * In some conditions (see `lastSeekingPosition`), we might want to not
76
- * automatically seek over discontinuities because the browser might do it
77
- * itself instead.
78
- * In that case, we still want to perform the seek ourselves if the browser
79
- * doesn't do it after sufficient time.
80
- * This variable allows to store the timestamp at which a discontinuity began
81
- * to be ignored.
82
- */
83
- let ignoredStallTimeStamp = null;
84
58
  const playbackRateUpdater = new PlaybackRateUpdater(this._playbackObserver, this._speed);
85
59
  this._canceller.signal.register(() => {
86
60
  playbackRateUpdater.dispose();
87
61
  });
88
62
  let prevFreezingState = null;
89
63
  this._playbackObserver.listen((observation) => {
90
- var _a;
91
64
  const discontinuitiesStore = this._discontinuitiesStore;
92
65
  const { buffered, position, readyState, rebuffering, freezing } = observation;
93
- const { BUFFER_DISCONTINUITY_THRESHOLD, FORCE_DISCONTINUITY_SEEK_DELAY, FREEZING_STALLED_DELAY, UNFREEZING_SEEK_DELAY, UNFREEZING_DELTA_POSITION } = config.getCurrent();
94
- if (!observation.seeking &&
95
- isSeekingApproximate &&
96
- ignoredStallTimeStamp === null &&
97
- lastSeekingPosition !== null && observation.position < lastSeekingPosition) {
98
- log.debug("Init: the device appeared to have seeked back by itself.");
99
- const now = getMonotonicTimeStamp();
100
- ignoredStallTimeStamp = now;
101
- }
102
- lastSeekingPosition = observation.seeking ?
103
- Math.max((_a = observation.pendingInternalSeek) !== null && _a !== void 0 ? _a : 0, observation.position) :
104
- null;
66
+ const { BUFFER_DISCONTINUITY_THRESHOLD, FREEZING_STALLED_DELAY, UNFREEZING_SEEK_DELAY, UNFREEZING_DELTA_POSITION } = config.getCurrent();
105
67
  if (this._checkDecipherabilityFreeze(observation)) {
106
68
  return;
107
69
  }
@@ -110,13 +72,14 @@ export default class RebufferingController extends EventEmitter {
110
72
  const referenceTimestamp = prevFreezingState === null ?
111
73
  freezing.timestamp :
112
74
  prevFreezingState.attemptTimestamp;
113
- if (now - referenceTimestamp > UNFREEZING_SEEK_DELAY) {
75
+ if (!position.isAwaitingFuturePosition() &&
76
+ now - referenceTimestamp > UNFREEZING_SEEK_DELAY) {
114
77
  log.warn("Init: trying to seek to un-freeze player");
115
78
  this._playbackObserver.setCurrentTime(this._playbackObserver.getCurrentTime() + UNFREEZING_DELTA_POSITION);
116
79
  prevFreezingState = { attemptTimestamp: now };
117
80
  }
118
81
  if (now - freezing.timestamp > FREEZING_STALLED_DELAY) {
119
- if (rebuffering === null || ignoredStallTimeStamp !== null) {
82
+ if (rebuffering === null) {
120
83
  playbackRateUpdater.stopRebuffering();
121
84
  }
122
85
  else {
@@ -135,8 +98,9 @@ export default class RebufferingController extends EventEmitter {
135
98
  // With a readyState set to 1, we should still not be able to play:
136
99
  // Return that we're stalled
137
100
  let reason;
138
- if (observation.seeking) {
139
- reason = observation.pendingInternalSeek !== null ? "internal-seek" :
101
+ if (observation.seeking !== 0 /* SeekingState.None */) {
102
+ reason = observation.seeking === 1 /* SeekingState.Internal */ ?
103
+ "internal-seek" :
140
104
  "seeking";
141
105
  }
142
106
  else {
@@ -151,22 +115,15 @@ export default class RebufferingController extends EventEmitter {
151
115
  // We want to separate a stall situation when a seek is due to a seek done
152
116
  // internally by the player to when its due to a regular user seek.
153
117
  const stalledReason = rebuffering.reason === "seeking" &&
154
- observation.pendingInternalSeek !== null ?
118
+ observation.seeking === 1 /* SeekingState.Internal */ ?
155
119
  "internal-seek" :
156
120
  rebuffering.reason;
157
- if (ignoredStallTimeStamp !== null) {
158
- const now = getMonotonicTimeStamp();
159
- if (now - ignoredStallTimeStamp < FORCE_DISCONTINUITY_SEEK_DELAY) {
160
- playbackRateUpdater.stopRebuffering();
161
- log.debug("Init: letting the device get out of a stall by itself");
162
- this.trigger("stalled", stalledReason);
163
- return;
164
- }
165
- else {
166
- log.warn("Init: ignored stall for too long, considering it", now - ignoredStallTimeStamp);
167
- }
121
+ if (position.isAwaitingFuturePosition()) {
122
+ playbackRateUpdater.stopRebuffering();
123
+ log.debug("Init: let rebuffering happen as we're awaiting a future position");
124
+ this.trigger("stalled", stalledReason);
125
+ return;
168
126
  }
169
- ignoredStallTimeStamp = null;
170
127
  playbackRateUpdater.startRebuffering();
171
128
  if (this._manifest === null) {
172
129
  this.trigger("stalled", stalledReason);
@@ -184,14 +141,14 @@ export default class RebufferingController extends EventEmitter {
184
141
  log.info("Init: position to seek already reached, no seeking", this._playbackObserver.getCurrentTime(), realSeekTime);
185
142
  }
186
143
  else {
187
- log.warn("SA: skippable discontinuity found in the stream", position, realSeekTime);
144
+ log.warn("SA: skippable discontinuity found in the stream", position.getPolled(), realSeekTime);
188
145
  this._playbackObserver.setCurrentTime(realSeekTime);
189
146
  this.trigger("warning", generateDiscontinuityError(stalledPosition, realSeekTime));
190
147
  return;
191
148
  }
192
149
  }
193
150
  }
194
- const freezePosition = stalledPosition !== null && stalledPosition !== void 0 ? stalledPosition : position;
151
+ const positionBlockedAt = stalledPosition !== null && stalledPosition !== void 0 ? stalledPosition : position.getPolled();
195
152
  // Is it a very short discontinuity in buffer ? -> Seek at the beginning of the
196
153
  // next range
197
154
  //
@@ -199,14 +156,14 @@ export default class RebufferingController extends EventEmitter {
199
156
  // calculate a stalled state. This is useful for some
200
157
  // implementation that might drop an injected segment, or in
201
158
  // case of small discontinuity in the content.
202
- const nextBufferRangeGap = getNextBufferedTimeRangeGap(buffered, freezePosition);
159
+ const nextBufferRangeGap = getNextBufferedTimeRangeGap(buffered, positionBlockedAt);
203
160
  if (this._speed.getValue() > 0 &&
204
161
  nextBufferRangeGap < BUFFER_DISCONTINUITY_THRESHOLD) {
205
- const seekTo = (freezePosition + nextBufferRangeGap + EPSILON);
162
+ const seekTo = (positionBlockedAt + nextBufferRangeGap + EPSILON);
206
163
  if (this._playbackObserver.getCurrentTime() < seekTo) {
207
- log.warn("Init: discontinuity encountered inferior to the threshold", freezePosition, seekTo, BUFFER_DISCONTINUITY_THRESHOLD);
164
+ log.warn("Init: discontinuity encountered inferior to the threshold", positionBlockedAt, seekTo, BUFFER_DISCONTINUITY_THRESHOLD);
208
165
  this._playbackObserver.setCurrentTime(seekTo);
209
- this.trigger("warning", generateDiscontinuityError(freezePosition, seekTo));
166
+ this.trigger("warning", generateDiscontinuityError(positionBlockedAt, seekTo));
210
167
  return;
211
168
  }
212
169
  }
@@ -214,13 +171,13 @@ export default class RebufferingController extends EventEmitter {
214
171
  // next period
215
172
  for (let i = this._manifest.periods.length - 2; i >= 0; i--) {
216
173
  const period = this._manifest.periods[i];
217
- if (period.end !== undefined && period.end <= freezePosition) {
218
- if (this._manifest.periods[i + 1].start > freezePosition &&
174
+ if (period.end !== undefined && period.end <= positionBlockedAt) {
175
+ if (this._manifest.periods[i + 1].start > positionBlockedAt &&
219
176
  this._manifest.periods[i + 1].start >
220
177
  this._playbackObserver.getCurrentTime()) {
221
178
  const nextPeriod = this._manifest.periods[i + 1];
222
179
  this._playbackObserver.setCurrentTime(nextPeriod.start);
223
- this.trigger("warning", generateDiscontinuityError(freezePosition, nextPeriod.start));
180
+ this.trigger("warning", generateDiscontinuityError(positionBlockedAt, nextPeriod.start));
224
181
  return;
225
182
  }
226
183
  break;
@@ -262,10 +219,10 @@ export default class RebufferingController extends EventEmitter {
262
219
  bufferType !== "video")) {
263
220
  return;
264
221
  }
265
- const currPos = observation.position;
266
- const rebufferingPos = (_a = observation.rebuffering.position) !== null && _a !== void 0 ? _a : currPos;
222
+ const loadedPos = observation.position.getWanted();
223
+ const rebufferingPos = (_a = observation.rebuffering.position) !== null && _a !== void 0 ? _a : loadedPos;
267
224
  const lockedPeriodStart = period.start;
268
- if (currPos < lockedPeriodStart &&
225
+ if (loadedPos < lockedPeriodStart &&
269
226
  Math.abs(rebufferingPos - lockedPeriodStart) < 1) {
270
227
  log.warn("Init: rebuffering because of a future locked stream.\n" +
271
228
  "Trying to unlock by seeking to the next Period");
@@ -300,7 +257,6 @@ export default class RebufferingController extends EventEmitter {
300
257
  * right handling steps.
301
258
  */
302
259
  _checkDecipherabilityFreeze(observation) {
303
- // XXX TODO allow this in in-worker configuration
304
260
  const { readyState, rebuffering, freezing } = observation;
305
261
  const bufferGap = observation.bufferGap !== undefined &&
306
262
  isFinite(observation.bufferGap) ? observation.bufferGap :
@@ -424,10 +380,11 @@ function eventContainsDiscontinuity(evt) {
424
380
  * @returns {Array.<Object>}
425
381
  */
426
382
  function updateDiscontinuitiesStore(discontinuitiesStore, evt, observation) {
383
+ const gcTime = Math.min(observation.position.getPolled(), observation.position.getWanted());
427
384
  // First, perform clean-up of old discontinuities
428
385
  while (discontinuitiesStore.length > 0 &&
429
386
  discontinuitiesStore[0].period.end !== undefined &&
430
- discontinuitiesStore[0].period.end + 10 < observation.position) {
387
+ discontinuitiesStore[0].period.end + 10 < gcTime) {
431
388
  discontinuitiesStore.shift();
432
389
  }
433
390
  const { period, bufferType } = evt;
@@ -81,8 +81,10 @@ export default class StreamEventsEmitter extends EventEmitter {
81
81
  clearInterval(intervalId);
82
82
  });
83
83
  function constructObservation() {
84
- const isSeeking = playbackObserver.getReference().getValue().seeking;
85
- return { currentTime: mediaElement.currentTime,
84
+ const lastObservation = playbackObserver.getReference().getValue();
85
+ const currentTime = mediaElement.currentTime;
86
+ const isSeeking = lastObservation.seeking !== 0 /* SeekingState.None */;
87
+ return { currentTime,
86
88
  isSeeking };
87
89
  }
88
90
  }, { emitCurrentValue: true, clearSignal: cancelSignal });
@@ -28,8 +28,7 @@ import { getInnerAndOuterRangesFromBufferedTimeRanges } from "../../utils/ranges
28
28
  export default function BufferGarbageCollector({ segmentBuffer, playbackObserver, maxBufferBehind, maxBufferAhead }, cancellationSignal) {
29
29
  let lastPosition;
30
30
  playbackObserver.listen((o) => {
31
- var _a;
32
- lastPosition = (_a = o.position.pending) !== null && _a !== void 0 ? _a : o.position.last;
31
+ lastPosition = o.position.getWanted();
33
32
  clean();
34
33
  }, { includeLastObservation: true, clearSignal: cancellationSignal });
35
34
  function clean() {
@@ -207,7 +207,14 @@ export default class AudioVideoSegmentBuffer extends SegmentBuffer {
207
207
  err :
208
208
  new Error("An unknown error occured when doing operations " +
209
209
  "on the SourceBuffer");
210
- this._pendingTask.reject(error);
210
+ const task = this._pendingTask;
211
+ if (task.type === SegmentBufferOperation.Push &&
212
+ task.data.length === 0 &&
213
+ task.inventoryData !== null) {
214
+ this._segmentInventory.insertChunk(task.inventoryData, false);
215
+ }
216
+ this._pendingTask = null;
217
+ task.reject(error);
211
218
  }
212
219
  }
213
220
  /**
@@ -254,7 +261,7 @@ export default class AudioVideoSegmentBuffer extends SegmentBuffer {
254
261
  switch (task.type) {
255
262
  case SegmentBufferOperation.Push:
256
263
  if (task.inventoryData !== null) {
257
- this._segmentInventory.insertChunk(task.inventoryData);
264
+ this._segmentInventory.insertChunk(task.inventoryData, true);
258
265
  }
259
266
  break;
260
267
  case SegmentBufferOperation.EndOfSegment:
@@ -213,7 +213,7 @@ export default class HTMLTextSegmentBuffer extends SegmentBuffer {
213
213
  return;
214
214
  }
215
215
  if (infos.inventoryInfos !== null) {
216
- this._segmentInventory.insertChunk(infos.inventoryInfos);
216
+ this._segmentInventory.insertChunk(infos.inventoryInfos, true);
217
217
  }
218
218
  this._buffer.insert(cues, start, end);
219
219
  this._buffered.insert(start, end);
@@ -138,7 +138,7 @@ export default class NativeTextSegmentBuffer extends SegmentBuffer {
138
138
  }
139
139
  this._buffered.insert(start, end);
140
140
  if (infos.inventoryInfos !== null) {
141
- this._segmentInventory.insertChunk(infos.inventoryInfos);
141
+ this._segmentInventory.insertChunk(infos.inventoryInfos, true);
142
142
  }
143
143
  }
144
144
  catch (err) {
@@ -15,7 +15,7 @@
15
15
  */
16
16
  import BufferGarbageCollector from "./garbage_collector";
17
17
  import { IBufferType, IEndOfSegmentInfos, IEndOfSegmentOperation, IPushChunkInfos, IPushedChunkData, IPushOperation, IRemoveOperation, ISBOperation, SegmentBuffer, SegmentBufferOperation } from "./implementations";
18
- import { IBufferedChunk, IChunkContext, IInsertedChunkInfos, getFirstSegmentAfterPeriod, getLastSegmentBeforePeriod } from "./inventory";
18
+ import { ChunkStatus, IBufferedChunk, IChunkContext, IInsertedChunkInfos, getFirstSegmentAfterPeriod, getLastSegmentBeforePeriod } from "./inventory";
19
19
  import SegmentBuffersStore, { ISegmentBufferOptions, ITextTrackSegmentBufferOptions } from "./segment_buffers_store";
20
20
  export default SegmentBuffersStore;
21
- export { BufferGarbageCollector, ISegmentBufferOptions, ITextTrackSegmentBufferOptions, SegmentBuffer, IBufferType, IBufferedChunk, IChunkContext, IInsertedChunkInfos, IPushChunkInfos, IPushedChunkData, IEndOfSegmentInfos, SegmentBufferOperation, ISBOperation, IEndOfSegmentOperation, IPushOperation, IRemoveOperation, getFirstSegmentAfterPeriod, getLastSegmentBeforePeriod, };
21
+ export { BufferGarbageCollector, ChunkStatus, ISegmentBufferOptions, ITextTrackSegmentBufferOptions, SegmentBuffer, IBufferType, IBufferedChunk, IChunkContext, IInsertedChunkInfos, IPushChunkInfos, IPushedChunkData, IEndOfSegmentInfos, SegmentBufferOperation, ISBOperation, IEndOfSegmentOperation, IPushOperation, IRemoveOperation, getFirstSegmentAfterPeriod, getLastSegmentBeforePeriod, };
@@ -13,9 +13,9 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import SegmentInventory, { IBufferedChunk, IInsertedChunkInfos } from "./segment_inventory";
16
+ import SegmentInventory, { ChunkStatus, IBufferedChunk, IInsertedChunkInfos } from "./segment_inventory";
17
17
  export default SegmentInventory;
18
- export { IBufferedChunk, IInsertedChunkInfos, };
18
+ export { ChunkStatus, IBufferedChunk, IInsertedChunkInfos, };
19
19
  export { IBufferedHistoryEntry } from "./buffered_history";
20
20
  export { IChunkContext } from "./types";
21
21
  export { getFirstSegmentAfterPeriod, getLastSegmentBeforePeriod, } from "./utils";