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
@@ -13,6 +13,7 @@
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";
16
17
  import config from "../../config";
17
18
  import log from "../../log";
18
19
  import getMonotonicTimeStamp from "../../utils/monotonic_timestamp";
@@ -65,6 +66,19 @@ export default class PlaybackObserver {
65
66
  this._lowLatencyMode = options.lowLatencyMode;
66
67
  this._canceller = new TaskCanceller();
67
68
  this._observationRef = this._createSharedReference();
69
+ this._expectedSeekingPosition = null;
70
+ this._pendingSeek = null;
71
+ const onLoadedMetadata = () => {
72
+ if (this._pendingSeek !== null) {
73
+ const positionToSeekTo = this._pendingSeek;
74
+ this._pendingSeek = null;
75
+ this._actuallySetCurrentTime(positionToSeekTo);
76
+ }
77
+ };
78
+ mediaElement.addEventListener("loadedmetadata", onLoadedMetadata);
79
+ this._canceller.signal.register(() => {
80
+ mediaElement.removeEventListener("loadedmetadata", onLoadedMetadata);
81
+ });
68
82
  }
69
83
  /**
70
84
  * Stop the `PlaybackObserver` from emitting playback observations and free all
@@ -114,9 +128,14 @@ export default class PlaybackObserver {
114
128
  * @param {number} time
115
129
  */
116
130
  setCurrentTime(time) {
117
- this._internalSeeksIncoming.push(time);
118
- log.info("API: Seeking internally", time);
119
- this._mediaElement.currentTime = time;
131
+ if (this._mediaElement.readyState >= 1) {
132
+ this._actuallySetCurrentTime(time);
133
+ }
134
+ else {
135
+ this._internalSeeksIncoming = [];
136
+ this._pendingSeek = time;
137
+ this._generateObservationForEvent("manual");
138
+ }
120
139
  }
121
140
  /**
122
141
  * Update the playback rate of the `HTMLMediaElement`.
@@ -181,6 +200,11 @@ export default class PlaybackObserver {
181
200
  deriveReadOnlyObserver(transform) {
182
201
  return generateReadOnlyObserver(this, transform, this._canceller.signal);
183
202
  }
203
+ _actuallySetCurrentTime(time) {
204
+ log.info("API: Seeking internally", time);
205
+ this._internalSeeksIncoming.push(time);
206
+ this._mediaElement.currentTime = time;
207
+ }
184
208
  /**
185
209
  * Creates the `IReadOnlySharedReference` that will generate playback
186
210
  * observations.
@@ -190,57 +214,21 @@ export default class PlaybackObserver {
190
214
  if (this._observationRef !== undefined) {
191
215
  return this._observationRef;
192
216
  }
193
- let lastObservation;
194
217
  const { SAMPLING_INTERVAL_MEDIASOURCE, SAMPLING_INTERVAL_LOW_LATENCY, SAMPLING_INTERVAL_NO_MEDIASOURCE } = config.getCurrent();
195
- const getCurrentObservation = (event) => {
196
- let tmpEvt = event;
197
- let startedInternalSeekTime;
198
- if (tmpEvt === "seeking" && this._internalSeeksIncoming.length > 0) {
199
- tmpEvt = "internal-seeking";
200
- startedInternalSeekTime = this._internalSeeksIncoming.shift();
201
- }
202
- const _lastObservation = lastObservation !== null && lastObservation !== void 0 ? lastObservation : this._generateInitialObservation();
203
- const mediaTimings = getMediaInfos(this._mediaElement, tmpEvt, this._withMediaSource);
204
- let pendingInternalSeek = null;
205
- if (mediaTimings.seeking) {
206
- if (typeof startedInternalSeekTime === "number") {
207
- pendingInternalSeek = startedInternalSeekTime;
208
- }
209
- else if (_lastObservation.pendingInternalSeek !== null && event !== "seeking") {
210
- pendingInternalSeek = _lastObservation.pendingInternalSeek;
211
- }
212
- }
213
- const rebufferingStatus = getRebufferingStatus(_lastObservation, mediaTimings, { lowLatencyMode: this._lowLatencyMode,
214
- withMediaSource: this._withMediaSource });
215
- const freezingStatus = getFreezingStatus(_lastObservation, mediaTimings);
216
- const timings = objectAssign({}, { rebuffering: rebufferingStatus,
217
- freezing: freezingStatus,
218
- pendingInternalSeek }, mediaTimings);
219
- if (log.hasLevel("DEBUG")) {
220
- log.debug("API: current media element state tick", "event", timings.event, "position", timings.position, "seeking", timings.seeking, "internalSeek", timings.pendingInternalSeek, "rebuffering", timings.rebuffering !== null, "freezing", timings.freezing !== null, "ended", timings.ended, "paused", timings.paused, "playbackRate", timings.playbackRate, "readyState", timings.readyState);
221
- }
222
- return timings;
223
- };
224
- const returnedSharedReference = new SharedReference(getCurrentObservation("init"), this._canceller.signal);
225
- const generateObservationForEvent = (event) => {
226
- const newObservation = getCurrentObservation(event);
227
- if (log.hasLevel("DEBUG")) {
228
- log.debug("API: current playback timeline:\n" +
229
- prettyPrintBuffered(newObservation.buffered, newObservation.position), `\n${event}`);
230
- }
231
- lastObservation = newObservation;
232
- returnedSharedReference.setValue(newObservation);
233
- };
218
+ const returnedSharedReference = new SharedReference(this._getCurrentObservation("init"), this._canceller.signal);
234
219
  const interval = this._lowLatencyMode ? SAMPLING_INTERVAL_LOW_LATENCY :
235
220
  this._withMediaSource ? SAMPLING_INTERVAL_MEDIASOURCE :
236
221
  SAMPLING_INTERVAL_NO_MEDIASOURCE;
222
+ const onInterval = () => {
223
+ this._generateObservationForEvent("timeupdate");
224
+ };
237
225
  let intervalId = setInterval(onInterval, interval);
238
226
  const removeEventListeners = SCANNED_MEDIA_ELEMENTS_EVENTS.map((eventName) => {
239
- this._mediaElement.addEventListener(eventName, onMediaEvent);
240
- function onMediaEvent() {
227
+ const onMediaEvent = () => {
241
228
  restartInterval();
242
- generateObservationForEvent(eventName);
243
- }
229
+ this._generateObservationForEvent(eventName);
230
+ };
231
+ this._mediaElement.addEventListener(eventName, onMediaEvent);
244
232
  return () => {
245
233
  this._mediaElement.removeEventListener(eventName, onMediaEvent);
246
234
  };
@@ -251,18 +239,165 @@ export default class PlaybackObserver {
251
239
  returnedSharedReference.finish();
252
240
  });
253
241
  return returnedSharedReference;
254
- function onInterval() {
255
- generateObservationForEvent("timeupdate");
256
- }
257
242
  function restartInterval() {
258
243
  clearInterval(intervalId);
259
244
  intervalId = setInterval(onInterval, interval);
260
245
  }
261
246
  }
262
- _generateInitialObservation() {
263
- return objectAssign(getMediaInfos(this._mediaElement, "init", this._withMediaSource), { rebuffering: null,
264
- freezing: null,
265
- pendingInternalSeek: null });
247
+ _getCurrentObservation(event) {
248
+ var _a;
249
+ /** Actual event emitted through an observation. */
250
+ let tmpEvt = event;
251
+ // NOTE: `this._observationRef` may be `undefined` because we might here be
252
+ // called in the constructor when that property is not yet set.
253
+ const previousObservation = this._observationRef === undefined ?
254
+ getInitialObservation(this._mediaElement, this._withMediaSource) :
255
+ this._observationRef.getValue();
256
+ /**
257
+ * If `true`, there is a seek operation ongoing but it was done from the
258
+ * `PlaybackObserver`'s `setCurrentTime` method, not from external code.
259
+ */
260
+ let isInternalSeeking = false;
261
+ /** If set, the position for which we plan to seek to as soon as possible. */
262
+ let pendingPosition = this._pendingSeek;
263
+ /** Initially-polled playback observation, before adjustments. */
264
+ const mediaTimings = getMediaInfos(this._mediaElement, this._withMediaSource);
265
+ if (tmpEvt === "seeking") {
266
+ // We just began seeking.
267
+ // Let's find out if the seek is internal or external and handle approximate
268
+ // seeking
269
+ if (this._internalSeeksIncoming.length > 0) {
270
+ isInternalSeeking = true;
271
+ tmpEvt = "internal-seeking";
272
+ const startedInternalSeekTime = this._internalSeeksIncoming.shift();
273
+ this._expectedSeekingPosition = isSeekingApproximate ?
274
+ Math.max(mediaTimings.position, startedInternalSeekTime !== null && startedInternalSeekTime !== void 0 ? startedInternalSeekTime : 0) :
275
+ mediaTimings.position;
276
+ }
277
+ else {
278
+ this._expectedSeekingPosition = mediaTimings.position;
279
+ }
280
+ }
281
+ else if (mediaTimings.seeking) {
282
+ // we're still seeking, this time without a "seeking" event so it's an
283
+ // already handled one, keep track of the last wanted position we wanted
284
+ // to seek to, to work-around devices re-seeking silently.
285
+ this._expectedSeekingPosition = Math.max(mediaTimings.position, (_a = this._expectedSeekingPosition) !== null && _a !== void 0 ? _a : 0);
286
+ }
287
+ else if (isSeekingApproximate &&
288
+ this._expectedSeekingPosition !== null &&
289
+ mediaTimings.position < this._expectedSeekingPosition) {
290
+ // We're on a target with aproximate seeking, we're not seeking anymore, but
291
+ // we're not yet at the expected seeking position.
292
+ // Signal to the rest of the application that the intented position is not
293
+ // the current position but the one contained in `this._expectedSeekingPosition`
294
+ pendingPosition = this._expectedSeekingPosition;
295
+ }
296
+ else {
297
+ this._expectedSeekingPosition = null;
298
+ }
299
+ if (mediaTimings.seeking &&
300
+ previousObservation.seeking === 1 /* SeekingState.Internal */ &&
301
+ event !== "seeking") {
302
+ isInternalSeeking = true;
303
+ }
304
+ const rebufferingStatus = getRebufferingStatus(previousObservation, mediaTimings, tmpEvt, { lowLatencyMode: this._lowLatencyMode,
305
+ withMediaSource: this._withMediaSource });
306
+ const freezingStatus = getFreezingStatus(previousObservation, mediaTimings, tmpEvt);
307
+ const seeking = isInternalSeeking ? 1 /* SeekingState.Internal */ :
308
+ mediaTimings.seeking ? 2 /* SeekingState.External */ :
309
+ 0 /* SeekingState.None */;
310
+ const timings = objectAssign({}, mediaTimings, { position: new ObservationPosition(mediaTimings.position, pendingPosition),
311
+ event: tmpEvt,
312
+ seeking,
313
+ rebuffering: rebufferingStatus,
314
+ freezing: freezingStatus });
315
+ if (log.hasLevel("DEBUG")) {
316
+ log.debug("API: current media element state tick", "event", timings.event, "position", timings.position.getPolled(), "seeking", timings.seeking, "internalSeek", isInternalSeeking, "rebuffering", timings.rebuffering !== null, "freezing", timings.freezing !== null, "ended", timings.ended, "paused", timings.paused, "playbackRate", timings.playbackRate, "readyState", timings.readyState);
317
+ }
318
+ return timings;
319
+ }
320
+ _generateObservationForEvent(event) {
321
+ const newObservation = this._getCurrentObservation(event);
322
+ if (log.hasLevel("DEBUG")) {
323
+ log.debug("API: current playback timeline:\n" +
324
+ prettyPrintBuffered(newObservation.buffered, newObservation.position.getPolled()), `\n${event}`);
325
+ }
326
+ this._observationRef.setValue(newObservation);
327
+ }
328
+ }
329
+ class ObservationPosition {
330
+ constructor(last, wanted) {
331
+ this._last = last;
332
+ this._wanted = wanted;
333
+ }
334
+ /**
335
+ * Returns the playback position actually observed on the media element at
336
+ * the time the playback observation was made.
337
+ *
338
+ * Note that it may be different than the position for which media data is
339
+ * wanted in rare scenarios where the goal position is not yet set on the
340
+ * media element.
341
+ *
342
+ * You should use this value when you want to obtain the actual position set
343
+ * on the media element for browser compatibility purposes. Note that this
344
+ * position was calculated at observation time, it might thus not be
345
+ * up-to-date if what you want is milliseconds-accuracy.
346
+ *
347
+ * If what you want is the actual position which the player is intended to
348
+ * play, you should rely on `getWanted` instead`.
349
+ * @returns {number}
350
+ */
351
+ getPolled() {
352
+ return this._last;
353
+ }
354
+ /**
355
+ * Returns the position which the player should consider to load media data
356
+ * at the time the observation was made.
357
+ *
358
+ * It can be different than the value returned by `getPolled` in rare
359
+ * scenarios:
360
+ *
361
+ * - When the initial position has not been set yet.
362
+ *
363
+ * - When the current device do not let the RxPlayer peform precize seeks,
364
+ * usually for perfomance reasons by seeking to a previous IDR frame
365
+ * instead (for now only Tizen may be like this), in which case we
366
+ * prefer to generally rely on the position wanted by the player (this
367
+ * e.g. prevents issues where the RxPlayer logic and the device are
368
+ * seeking back and forth in a loop).
369
+ *
370
+ * - When a wanted position has been "forced" (@see forceWantedPosition).
371
+ * @returns {number}
372
+ */
373
+ getWanted() {
374
+ var _a;
375
+ return (_a = this._wanted) !== null && _a !== void 0 ? _a : this._last;
376
+ }
377
+ /**
378
+ * Method to call if you want to overwrite the currently wanted position.
379
+ * @param {number} pos
380
+ */
381
+ forceWantedPosition(pos) {
382
+ this._wanted = pos;
383
+ }
384
+ /**
385
+ * Returns `true` when the position wanted returned by `getWanted` and the
386
+ * actual position returned by `getPolled` may be different, meaning that
387
+ * we're currently not at the position we want to reach.
388
+ *
389
+ * This is a relatively rare situation which only happens when either the
390
+ * initial seek has not yet been performed. on specific targets where the
391
+ * seeking behavior is a little broken (@see getWanted) or when the wanted
392
+ * position has been forced (@see forceWantedPosition).
393
+ *
394
+ * In those situations, you might temporarily refrain from acting upon the
395
+ * actual current media position, as it may change soon.
396
+ *
397
+ * @returns {boolean}
398
+ */
399
+ isAwaitingFuturePosition() {
400
+ return this._wanted !== null;
266
401
  }
267
402
  }
268
403
  /**
@@ -311,10 +446,9 @@ function hasLoadedUntilTheEnd(currentTime, currentRange, ended, duration, lowLat
311
446
  /**
312
447
  * Get basic playback information.
313
448
  * @param {HTMLMediaElement} mediaElement
314
- * @param {string} event
315
449
  * @returns {Object}
316
450
  */
317
- function getMediaInfos(mediaElement, event, withMediaSource) {
451
+ function getMediaInfos(mediaElement, withMediaSource) {
318
452
  const { buffered, currentTime, duration, ended, paused, playbackRate, readyState, seeking } = mediaElement;
319
453
  let currentRange;
320
454
  let bufferGap;
@@ -342,8 +476,7 @@ function getMediaInfos(mediaElement, event, withMediaSource) {
342
476
  paused,
343
477
  playbackRate,
344
478
  readyState,
345
- seeking,
346
- event };
479
+ seeking };
347
480
  }
348
481
  /**
349
482
  * Infer rebuffering status of the media based on:
@@ -354,12 +487,13 @@ function getMediaInfos(mediaElement, event, withMediaSource) {
354
487
  * @param {Object} currentInfo - Current set of basic information on the
355
488
  * `HTMLMediaElement`. This does not need every single property from a regular
356
489
  * playback observation.
490
+ * @param {string} currentEvt
357
491
  * @param {Object} options
358
492
  * @returns {Object|null}
359
493
  */
360
- function getRebufferingStatus(prevObservation, currentInfo, { withMediaSource, lowLatencyMode }) {
494
+ function getRebufferingStatus(prevObservation, currentInfo, currentEvt, { withMediaSource, lowLatencyMode }) {
361
495
  const { REBUFFERING_GAP } = config.getCurrent();
362
- const { event: currentEvt, position: currentTime, bufferGap, currentRange, duration, paused, readyState, ended } = currentInfo;
496
+ const { position: currentTime, bufferGap, currentRange, duration, paused, readyState, ended } = currentInfo;
363
497
  const { rebuffering: prevRebuffering, event: prevEvt, position: prevTime } = prevObservation;
364
498
  const fullyLoaded = hasLoadedUntilTheEnd(currentTime, currentRange, ended, duration, lowLatencyMode);
365
499
  const canSwitchToRebuffering = (readyState >= 1 &&
@@ -414,12 +548,12 @@ function getRebufferingStatus(prevObservation, currentInfo, { withMediaSource, l
414
548
  if (canSwitchToRebuffering &&
415
549
  ((!paused &&
416
550
  currentEvt === "timeupdate" && prevEvt === "timeupdate" &&
417
- currentTime === prevTime) ||
551
+ currentTime === prevTime.getPolled()) ||
418
552
  (currentEvt === "seeking" && (bufferGap === Infinity || (bufferGap === undefined && readyState < 3))))) {
419
553
  shouldRebuffer = true;
420
554
  }
421
555
  else if (prevRebuffering !== null &&
422
- ((currentEvt !== "seeking" && currentTime !== prevTime) ||
556
+ ((currentEvt !== "seeking" && currentTime !== prevTime.getPolled()) ||
423
557
  currentEvt === "canplay" ||
424
558
  (bufferGap === undefined && readyState >= 3) ||
425
559
  (bufferGap !== undefined && bufferGap < Infinity &&
@@ -465,28 +599,29 @@ function getRebufferingStatus(prevObservation, currentInfo, { withMediaSource, l
465
599
  * `null` if not.
466
600
  * @param {Object} prevObservation
467
601
  * @param {Object} currentInfo
602
+ * @param {string} currentEvt
468
603
  * @returns {Object|null}
469
604
  */
470
- function getFreezingStatus(prevObservation, currentInfo) {
605
+ function getFreezingStatus(prevObservation, currentInfo, currentEvt) {
471
606
  const { MINIMUM_BUFFER_AMOUNT_BEFORE_FREEZING } = config.getCurrent();
472
607
  if (prevObservation.freezing) {
473
608
  if (currentInfo.ended ||
474
609
  currentInfo.paused ||
475
610
  currentInfo.readyState === 0 ||
476
611
  currentInfo.playbackRate === 0 ||
477
- prevObservation.position !== currentInfo.position) {
612
+ prevObservation.position.getPolled() !== currentInfo.position) {
478
613
  return null; // Quit freezing status
479
614
  }
480
615
  return prevObservation.freezing; // Stay in it
481
616
  }
482
- return currentInfo.event === "timeupdate" &&
617
+ return currentEvt === "timeupdate" &&
483
618
  currentInfo.bufferGap !== undefined &&
484
619
  currentInfo.bufferGap > MINIMUM_BUFFER_AMOUNT_BEFORE_FREEZING &&
485
620
  !currentInfo.ended &&
486
621
  !currentInfo.paused &&
487
622
  currentInfo.readyState >= 1 &&
488
623
  currentInfo.playbackRate !== 0 &&
489
- currentInfo.position === prevObservation.position ?
624
+ currentInfo.position === prevObservation.position.getPolled() ?
490
625
  { timestamp: getMonotonicTimeStamp() } :
491
626
  null;
492
627
  }
@@ -589,3 +724,19 @@ function generateReadOnlyObserver(src, transform, cancellationSignal) {
589
724
  },
590
725
  };
591
726
  }
727
+ /**
728
+ * Generate the initial playback observation for when no event has yet been
729
+ * emitted to lead to one.
730
+ * @param {HTMLMediaElement} mediaElement
731
+ * @param {boolean} withMediaSource
732
+ * @returns {Object}
733
+ */
734
+ function getInitialObservation(mediaElement, withMediaSource) {
735
+ const mediaTimings = getMediaInfos(mediaElement, withMediaSource);
736
+ return objectAssign(mediaTimings, { rebuffering: null,
737
+ event: "init",
738
+ seeking: 0 /* SeekingState.None */,
739
+ position: { last: mediaTimings.position,
740
+ pending: undefined },
741
+ freezing: null });
742
+ }
@@ -91,7 +91,7 @@ class Player extends EventEmitter {
91
91
  // Workaround to support Firefox autoplay on FF 42.
92
92
  // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1194624
93
93
  videoElement.preload = "auto";
94
- this.version = /* PLAYER_VERSION */ "4.0.0-dev.2023120600";
94
+ this.version = /* PLAYER_VERSION */ "4.0.0-dev.2023121900";
95
95
  this.log = log;
96
96
  this.state = "STOPPED";
97
97
  this.videoElement = videoElement;
@@ -459,12 +459,12 @@ class Player extends EventEmitter {
459
459
  case "ENDED":
460
460
  this._priv_reloadingMetadata.reloadInPause = true;
461
461
  this._priv_reloadingMetadata.reloadPosition =
462
- playbackObserver.getReference().getValue().position;
462
+ playbackObserver.getReference().getValue().position.getPolled();
463
463
  break;
464
464
  default:
465
465
  const o = playbackObserver.getReference().getValue();
466
466
  this._priv_reloadingMetadata.reloadInPause = o.paused;
467
- this._priv_reloadingMetadata.reloadPosition = o.position;
467
+ this._priv_reloadingMetadata.reloadPosition = o.position.getWanted();
468
468
  break;
469
469
  }
470
470
  };
@@ -1975,7 +1975,7 @@ class Player extends EventEmitter {
1975
1975
  const maximumPosition = manifest !== null ? manifest.getMaximumSafePosition() :
1976
1976
  undefined;
1977
1977
  const positionData = {
1978
- position: observation.position,
1978
+ position: observation.position.getPolled(),
1979
1979
  duration: observation.duration,
1980
1980
  playbackRate: observation.playbackRate,
1981
1981
  maximumPosition,
@@ -1987,18 +1987,18 @@ class Player extends EventEmitter {
1987
1987
  };
1988
1988
  if (manifest !== null &&
1989
1989
  manifest.isLive &&
1990
- observation.position > 0) {
1990
+ observation.position.getPolled() > 0) {
1991
1991
  const ast = (_b = manifest.availabilityStartTime) !== null && _b !== void 0 ? _b : 0;
1992
- positionData.wallClockTime = observation.position + ast;
1992
+ positionData.wallClockTime = observation.position.getPolled() + ast;
1993
1993
  const livePosition = manifest.getLivePosition();
1994
1994
  if (livePosition !== undefined) {
1995
- positionData.liveGap = livePosition - observation.position;
1995
+ positionData.liveGap = livePosition - observation.position.getPolled();
1996
1996
  }
1997
1997
  }
1998
1998
  else if (isDirectFile && this.videoElement !== null) {
1999
1999
  const startDate = getStartDate(this.videoElement);
2000
2000
  if (startDate !== undefined) {
2001
- positionData.wallClockTime = startDate + observation.position;
2001
+ positionData.wallClockTime = startDate + observation.position.getPolled();
2002
2002
  }
2003
2003
  }
2004
2004
  this.trigger("positionUpdate", positionData);
@@ -2132,5 +2132,5 @@ class Player extends EventEmitter {
2132
2132
  }
2133
2133
  }
2134
2134
  }
2135
- Player.version = /* PLAYER_VERSION */ "4.0.0-dev.2023120600";
2135
+ Player.version = /* PLAYER_VERSION */ "4.0.0-dev.2023121900";
2136
2136
  export default Player;
@@ -31,7 +31,7 @@ export function emitSeekEvents(mediaElement, playbackObserver, onSeeking, onSeek
31
31
  if (cancelSignal.isCancelled() || mediaElement === null) {
32
32
  return;
33
33
  }
34
- let wasSeeking = playbackObserver.getReference().getValue().seeking;
34
+ let wasSeeking = playbackObserver.getReference().getValue().seeking === 2 /* SeekingState.External */;
35
35
  if (wasSeeking) {
36
36
  onSeeking();
37
37
  if (cancelSignal.isCancelled()) {
@@ -28,13 +28,9 @@ import ServerCertificateStore from "./utils/server_certificate_store";
28
28
  * @returns {Object|null}
29
29
  */
30
30
  function createPersistentSessionsStorage(keySystemOptions) {
31
- if (isNullOrUndefined(keySystemOptions.persistentLicenseConfig)) {
32
- return null;
33
- }
34
31
  const { persistentLicenseConfig } = keySystemOptions;
35
- if (persistentLicenseConfig == null) {
36
- throw new EncryptedMediaError("INVALID_KEY_SYSTEM", "No `persistentLicenseConfig` found for " +
37
- "persistent license.");
32
+ if (isNullOrUndefined(persistentLicenseConfig)) {
33
+ return null;
38
34
  }
39
35
  log.debug("DRM: Set the given license storage");
40
36
  return new PersistentSessionsStore(persistentLicenseConfig);
@@ -153,7 +153,13 @@ export default class DirectFileContentInitializer extends ContentInitializer {
153
153
  log.debug("Init: Initial time calculated:", initTime);
154
154
  return initTime;
155
155
  };
156
- performInitialSeekAndPlay(mediaElement, playbackObserver, initialTime, autoPlay, (err) => this.trigger("warning", err), cancelSignal).autoPlayResult
156
+ performInitialSeekAndPlay({ mediaElement,
157
+ playbackObserver,
158
+ startTime: initialTime,
159
+ mustAutoPlay: autoPlay,
160
+ onWarning: (err) => this.trigger("warning", err),
161
+ isDirectfile: true }, cancelSignal)
162
+ .autoPlayResult
157
163
  .then(() => getLoadedReference(playbackObserver, mediaElement, true, cancelSignal)
158
164
  .onUpdate((isLoaded, stopListening) => {
159
165
  if (isLoaded) {
@@ -267,7 +267,12 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
267
267
  cancelSignal.register(() => {
268
268
  segmentBuffersStore.disposeAll();
269
269
  });
270
- const { autoPlayResult, initialPlayPerformed, initialSeekPerformed } = performInitialSeekAndPlay(mediaElement, playbackObserver, initialTime, autoPlay, (err) => this.trigger("warning", err), cancelSignal);
270
+ const { autoPlayResult, initialPlayPerformed } = performInitialSeekAndPlay({ mediaElement,
271
+ playbackObserver,
272
+ startTime: initialTime,
273
+ mustAutoPlay: autoPlay,
274
+ onWarning: (err) => { this.trigger("warning", err); },
275
+ isDirectfile: false }, cancelSignal);
271
276
  if (cancelSignal.isCancelled()) {
272
277
  return;
273
278
  }
@@ -290,16 +295,19 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
290
295
  const streamObserver = createStreamPlaybackObserver(playbackObserver, { autoPlay,
291
296
  manifest,
292
297
  initialPlayPerformed,
293
- initialSeekPerformed,
294
- speed,
295
- startTime: initialTime }, cancelSignal);
298
+ speed }, cancelSignal);
296
299
  const rebufferingController = this._createRebufferingController(playbackObserver, manifest, segmentBuffersStore, speed, cancelSignal);
297
300
  rebufferingController.addEventListener("needsReload", () => {
301
+ let position;
302
+ const lastObservation = playbackObserver.getReference().getValue();
303
+ if (lastObservation.position.isAwaitingFuturePosition()) {
304
+ position = lastObservation.position.getWanted();
305
+ }
306
+ else {
307
+ position = playbackObserver.getCurrentTime();
308
+ }
298
309
  // NOTE couldn't both be always calculated at event destination?
299
310
  // Maybe there are exceptions?
300
- const position = initialSeekPerformed.getValue() ?
301
- playbackObserver.getCurrentTime() :
302
- initialTime;
303
311
  const autoplay = initialPlayPerformed.getValue() ?
304
312
  !playbackObserver.getIsPaused() :
305
313
  autoPlay;
@@ -360,9 +368,9 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
360
368
  // Data is buffered around the current position
361
369
  obs.currentRange !== null ||
362
370
  // Or, for whatever reason, we have no buffer but we're already advancing
363
- obs.position > seekedTime + 0.1) {
371
+ obs.position.getPolled() > seekedTime + 0.1) {
364
372
  stopListening();
365
- playbackObserver.setCurrentTime(obs.position + 0.001);
373
+ playbackObserver.setCurrentTime(obs.position.getWanted() + 0.001);
366
374
  }
367
375
  }, { includeLastObservation: false, clearSignal: cancelSignal });
368
376
  },
@@ -434,10 +442,12 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
434
442
  },
435
443
  bitrateEstimateChange: (value) => self.trigger("bitrateEstimateChange", value),
436
444
  needsMediaSourceReload: (payload) => {
437
- var _a, _b;
445
+ var _a;
438
446
  const lastObservation = streamObserver.getReference().getValue();
439
- const currentPosition = (_a = lastObservation.position.pending) !== null && _a !== void 0 ? _a : streamObserver.getCurrentTime();
440
- const isPaused = (_b = lastObservation.paused.pending) !== null && _b !== void 0 ? _b : streamObserver.getIsPaused();
447
+ const currentPosition = lastObservation.position.isAwaitingFuturePosition() ?
448
+ lastObservation.position.getWanted() :
449
+ streamObserver.getCurrentTime();
450
+ const isPaused = (_a = lastObservation.paused.pending) !== null && _a !== void 0 ? _a : streamObserver.getIsPaused();
441
451
  let position = currentPosition + payload.timeOffset;
442
452
  if (payload.minimumPosition !== undefined) {
443
453
  position = Math.max(payload.minimumPosition, position);
@@ -448,17 +458,21 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
448
458
  onReloadOrder({ position, autoPlay: !isPaused });
449
459
  },
450
460
  needsDecipherabilityFlush() {
451
- var _a, _b, _c;
461
+ var _a;
452
462
  const keySystem = getKeySystemConfiguration(mediaElement);
453
463
  if (shouldReloadMediaSourceOnDecipherabilityUpdate(keySystem === null || keySystem === void 0 ? void 0 : keySystem[0])) {
454
464
  const lastObservation = streamObserver.getReference().getValue();
455
- const position = (_a = lastObservation.position.pending) !== null && _a !== void 0 ? _a : streamObserver.getCurrentTime();
456
- const isPaused = (_b = lastObservation.paused.pending) !== null && _b !== void 0 ? _b : streamObserver.getIsPaused();
465
+ const position = lastObservation.position.isAwaitingFuturePosition() ?
466
+ lastObservation.position.getWanted() :
467
+ streamObserver.getCurrentTime();
468
+ const isPaused = (_a = lastObservation.paused.pending) !== null && _a !== void 0 ? _a : streamObserver.getIsPaused();
457
469
  onReloadOrder({ position, autoPlay: !isPaused });
458
470
  }
459
471
  else {
460
472
  const lastObservation = streamObserver.getReference().getValue();
461
- const position = (_c = lastObservation.position.pending) !== null && _c !== void 0 ? _c : streamObserver.getCurrentTime();
473
+ const position = lastObservation.position.isAwaitingFuturePosition() ?
474
+ lastObservation.position.getWanted() :
475
+ streamObserver.getCurrentTime();
462
476
  // simple seek close to the current position
463
477
  // to flush the buffers
464
478
  if (position + 0.001 < lastObservation.duration) {
@@ -51,8 +51,7 @@ export default class ContentTimeBoundariesObserver extends EventEmitter {
51
51
  this._maximumPositionCalculator = maximumPositionCalculator;
52
52
  const cancelSignal = this._canceller.signal;
53
53
  playbackObserver.listen(({ position }) => {
54
- var _a;
55
- const wantedPosition = (_a = position.pending) !== null && _a !== void 0 ? _a : position.last;
54
+ const wantedPosition = position.getWanted();
56
55
  if (wantedPosition < manifest.getMinimumSafePosition()) {
57
56
  const warning = new MediaError("MEDIA_TIME_BEFORE_MANIFEST", "The current position is behind the " +
58
57
  "earliest time announced in the Manifest.");
@@ -26,12 +26,8 @@ export interface IStreamPlaybackObserverArguments {
26
26
  manifest: Manifest;
27
27
  /** Becomes `true` after the initial play has been taken care of. */
28
28
  initialPlayPerformed: IReadOnlySharedReference<boolean>;
29
- /** Becomes `true` after the initial seek has been taken care of. */
30
- initialSeekPerformed: IReadOnlySharedReference<boolean>;
31
29
  /** The last speed requested by the user. */
32
30
  speed: IReadOnlySharedReference<number>;
33
- /** The time the player will seek when `initialSeekPerformed` becomes `true`. */
34
- startTime: number;
35
31
  }
36
32
  /**
37
33
  * Create PlaybackObserver for the `Stream` part of the code.
@@ -42,4 +38,4 @@ export interface IStreamPlaybackObserverArguments {
42
38
  * @param {Object} fnCancelSignal - Abort the created PlaybackObserver.
43
39
  * @returns {Object}
44
40
  */
45
- export default function createStreamPlaybackObserver(srcPlaybackObserver: PlaybackObserver, { autoPlay, initialPlayPerformed, initialSeekPerformed, manifest, speed, startTime }: IStreamPlaybackObserverArguments, fnCancelSignal: CancellationSignal): IReadOnlyPlaybackObserver<IStreamOrchestratorPlaybackObservation>;
41
+ export default function createStreamPlaybackObserver(srcPlaybackObserver: PlaybackObserver, { autoPlay, initialPlayPerformed, manifest, speed }: IStreamPlaybackObserverArguments, fnCancelSignal: CancellationSignal): IReadOnlyPlaybackObserver<IStreamOrchestratorPlaybackObservation>;