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
@@ -43,32 +43,32 @@ var __assign = (this && this.__assign) || function () {
43
43
  * This file defines the public API for the RxPlayer.
44
44
  * It also starts the different sub-parts of the player on various API calls.
45
45
  */
46
- import { events, getStartDate, } from "../../compat";
46
+ import { events, exitFullscreen, getStartDate, isFullscreen, requestFullscreen, } from "../../compat";
47
47
  /* eslint-disable-next-line max-len */
48
48
  import canRelyOnVideoVisibilityAndSize from "../../compat/can_rely_on_video_visibility_and_size";
49
49
  import config from "../../config";
50
50
  import { ErrorCodes, ErrorTypes, formatError, MediaError, } from "../../errors";
51
51
  import features, { addFeatures, } from "../../features";
52
52
  import log from "../../log";
53
+ import areArraysOfNumbersEqual from "../../utils/are_arrays_of_numbers_equal";
53
54
  import arrayIncludes from "../../utils/array_includes";
54
55
  import assert from "../../utils/assert";
55
- import assertUnreachable from "../../utils/assert_unreachable";
56
56
  import EventEmitter from "../../utils/event_emitter";
57
57
  import idGenerator from "../../utils/id_generator";
58
58
  import isNullOrUndefined from "../../utils/is_null_or_undefined";
59
59
  import objectAssign from "../../utils/object_assign";
60
- import { getLeftSizeOfRange } from "../../utils/ranges";
60
+ import { getLeftSizeOfRange, getPlayedSizeOfRange, getSizeOfRange, } from "../../utils/ranges";
61
61
  import SharedReference, { createMappedReference, } from "../../utils/reference";
62
62
  import TaskCanceller from "../../utils/task_canceller";
63
63
  import warnOnce from "../../utils/warn_once";
64
64
  import { clearOnStop, disposeDecryptionResources, getKeySystemConfiguration, getCurrentKeySystem, } from "../decrypt";
65
65
  import { checkReloadOptions, parseConstructorOptions, parseLoadVideoOptions, } from "./option_utils";
66
66
  import PlaybackObserver from "./playback_observer";
67
- import TracksStore from "./track_management/tracks_store";
67
+ import TrackChoiceManager from "./tracks_management/track_choice_manager";
68
68
  import { constructPlayerStateReference, emitPlayPauseEvents, emitSeekEvents, isLoadedState, } from "./utils";
69
69
  /* eslint-disable @typescript-eslint/naming-convention */
70
70
  var generateContentId = idGenerator();
71
- var getPictureOnPictureStateRef = events.getPictureOnPictureStateRef, getVideoVisibilityRef = events.getVideoVisibilityRef, getVideoWidthRef = events.getVideoWidthRef;
71
+ var getPageActivityRef = events.getPageActivityRef, getPictureOnPictureStateRef = events.getPictureOnPictureStateRef, getVideoVisibilityRef = events.getVideoVisibilityRef, getVideoWidthRef = events.getVideoWidthRef, onFullscreenChange = events.onFullscreenChange, onTextTrackAdded = events.onTextTrackAdded, onTextTrackRemoved = events.onTextTrackRemoved;
72
72
  /**
73
73
  * @class Player
74
74
  * @extends EventEmitter
@@ -81,8 +81,9 @@ var Player = /** @class */ (function (_super) {
81
81
  */
82
82
  function Player(options) {
83
83
  if (options === void 0) { options = {}; }
84
+ var _a, _b;
84
85
  var _this = _super.call(this) || this;
85
- var _a = parseConstructorOptions(options), baseBandwidth = _a.baseBandwidth, limitVideoWidth = _a.limitVideoWidth, maxBufferAhead = _a.maxBufferAhead, maxBufferBehind = _a.maxBufferBehind, throttleVideoBitrateWhenHidden = _a.throttleVideoBitrateWhenHidden, videoElement = _a.videoElement, wantedBufferAhead = _a.wantedBufferAhead, maxVideoBufferSize = _a.maxVideoBufferSize;
86
+ var _c = parseConstructorOptions(options), initialAudioBitrate = _c.initialAudioBitrate, initialVideoBitrate = _c.initialVideoBitrate, limitVideoWidth = _c.limitVideoWidth, minAudioBitrate = _c.minAudioBitrate, minVideoBitrate = _c.minVideoBitrate, maxAudioBitrate = _c.maxAudioBitrate, maxBufferAhead = _c.maxBufferAhead, maxBufferBehind = _c.maxBufferBehind, maxVideoBitrate = _c.maxVideoBitrate, preferredAudioTracks = _c.preferredAudioTracks, preferredTextTracks = _c.preferredTextTracks, preferredVideoTracks = _c.preferredVideoTracks, throttleWhenHidden = _c.throttleWhenHidden, throttleVideoBitrateWhenHidden = _c.throttleVideoBitrateWhenHidden, videoElement = _c.videoElement, wantedBufferAhead = _c.wantedBufferAhead, maxVideoBufferSize = _c.maxVideoBufferSize, stopAtEnd = _c.stopAtEnd;
86
87
  var DEFAULT_UNMUTED_VOLUME = config.getCurrent().DEFAULT_UNMUTED_VOLUME;
87
88
  // Workaround to support Firefox autoplay on FF 42.
88
89
  // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1194624
@@ -94,6 +95,50 @@ var Player = /** @class */ (function (_super) {
94
95
  var destroyCanceller = new TaskCanceller();
95
96
  _this._destroyCanceller = destroyCanceller;
96
97
  _this._priv_pictureInPictureRef = getPictureOnPictureStateRef(videoElement, destroyCanceller.signal);
98
+ /** @deprecated */
99
+ onFullscreenChange(videoElement, function () {
100
+ /* eslint-disable import/no-deprecated */
101
+ _this.trigger("fullscreenChange", _this.isFullscreen());
102
+ /* eslint-enable import/no-deprecated */
103
+ }, destroyCanceller.signal);
104
+ /** Store last known TextTrack array linked to the media element. */
105
+ var prevTextTracks = [];
106
+ for (var i = 0; i < ((_a = videoElement.textTracks) === null || _a === void 0 ? void 0 : _a.length); i++) {
107
+ var textTrack = (_b = videoElement.textTracks) === null || _b === void 0 ? void 0 : _b[i];
108
+ if (!isNullOrUndefined(textTrack)) {
109
+ prevTextTracks.push(textTrack);
110
+ }
111
+ }
112
+ /** Callback called when a TextTrack element is added or removed. */
113
+ var onTextTrackChanges = function (_evt) {
114
+ var evt = _evt;
115
+ var target = evt.target;
116
+ var textTrackArr = [];
117
+ for (var i = 0; i < target.length; i++) {
118
+ var textTrack = target[i];
119
+ textTrackArr.push(textTrack);
120
+ }
121
+ var oldTextTracks = prevTextTracks;
122
+ prevTextTracks = textTrackArr;
123
+ // We can have two consecutive textTrackChanges with the exact same
124
+ // payload when we perform multiple texttrack operations before the event
125
+ // loop is freed.
126
+ if (oldTextTracks.length !== textTrackArr.length) {
127
+ _this._priv_onNativeTextTracksNext(textTrackArr);
128
+ return;
129
+ }
130
+ for (var i = 0; i < oldTextTracks.length; i++) {
131
+ if (oldTextTracks[i] !== textTrackArr[i]) {
132
+ _this._priv_onNativeTextTracksNext(textTrackArr);
133
+ return;
134
+ }
135
+ }
136
+ return;
137
+ };
138
+ if (!isNullOrUndefined(videoElement.textTracks)) {
139
+ onTextTrackAdded(videoElement.textTracks, onTextTrackChanges, destroyCanceller.signal);
140
+ onTextTrackRemoved(videoElement.textTracks, onTextTrackChanges, destroyCanceller.signal);
141
+ }
97
142
  _this._priv_speed = new SharedReference(videoElement.playbackRate, _this._destroyCanceller.signal);
98
143
  _this._priv_preferTrickModeTracks = false;
99
144
  _this._priv_contentLock = new SharedReference(false, _this._destroyCanceller.signal);
@@ -104,16 +149,27 @@ var Player = /** @class */ (function (_super) {
104
149
  maxVideoBufferSize: new SharedReference(maxVideoBufferSize, _this._destroyCanceller.signal),
105
150
  };
106
151
  _this._priv_bitrateInfos = {
107
- lastBitrates: { audio: baseBandwidth,
108
- video: baseBandwidth },
152
+ lastBitrates: { audio: initialAudioBitrate,
153
+ video: initialVideoBitrate },
154
+ minAutoBitrates: { audio: new SharedReference(minAudioBitrate, _this._destroyCanceller.signal),
155
+ video: new SharedReference(minVideoBitrate, _this._destroyCanceller.signal) },
156
+ maxAutoBitrates: { audio: new SharedReference(maxAudioBitrate, _this._destroyCanceller.signal),
157
+ video: new SharedReference(maxVideoBitrate, _this._destroyCanceller.signal) },
158
+ manualBitrates: { audio: new SharedReference(-1, _this._destroyCanceller.signal),
159
+ video: new SharedReference(-1, _this._destroyCanceller.signal) },
109
160
  };
161
+ _this._priv_throttleWhenHidden = throttleWhenHidden;
110
162
  _this._priv_throttleVideoBitrateWhenHidden = throttleVideoBitrateWhenHidden;
111
163
  _this._priv_limitVideoWidth = limitVideoWidth;
112
164
  _this._priv_mutedMemory = DEFAULT_UNMUTED_VOLUME;
113
165
  _this._priv_currentError = null;
114
166
  _this._priv_contentInfos = null;
115
167
  _this._priv_contentEventsMemory = {};
168
+ _this._priv_stopAtEnd = stopAtEnd;
116
169
  _this._priv_setPlayerState("STOPPED" /* PLAYER_STATES.STOPPED */);
170
+ _this._priv_preferredAudioTracks = preferredAudioTracks;
171
+ _this._priv_preferredTextTracks = preferredTextTracks;
172
+ _this._priv_preferredVideoTracks = preferredVideoTracks;
117
173
  _this._priv_reloadingMetadata = {};
118
174
  _this._priv_lastAutoPlay = false;
119
175
  return _this;
@@ -227,8 +283,8 @@ var Player = /** @class */ (function (_super) {
227
283
  * @param {Object} reloadOpts
228
284
  */
229
285
  Player.prototype.reload = function (reloadOpts) {
230
- var _a, _b, _c;
231
- var _d = this._priv_reloadingMetadata, options = _d.options, manifest = _d.manifest, reloadPosition = _d.reloadPosition, reloadInPause = _d.reloadInPause;
286
+ var _a, _b;
287
+ var _c = this._priv_reloadingMetadata, options = _c.options, manifest = _c.manifest, reloadPosition = _c.reloadPosition, reloadInPause = _c.reloadInPause;
232
288
  if (options === undefined) {
233
289
  throw new Error("API: Can't reload without having previously loaded a content.");
234
290
  }
@@ -255,13 +311,6 @@ var Player = /** @class */ (function (_super) {
255
311
  else if (reloadInPause !== undefined) {
256
312
  autoPlay = !reloadInPause;
257
313
  }
258
- var keySystems;
259
- if ((reloadOpts === null || reloadOpts === void 0 ? void 0 : reloadOpts.keySystems) !== undefined) {
260
- keySystems = reloadOpts.keySystems;
261
- }
262
- else if (((_c = this._priv_reloadingMetadata.options) === null || _c === void 0 ? void 0 : _c.keySystems) !== undefined) {
263
- keySystems = this._priv_reloadingMetadata.options.keySystems;
264
- }
265
314
  var newOptions = __assign(__assign({}, options), { initialManifest: manifest });
266
315
  if (startAt !== undefined) {
267
316
  newOptions.startAt = startAt;
@@ -269,9 +318,6 @@ var Player = /** @class */ (function (_super) {
269
318
  if (autoPlay !== undefined) {
270
319
  newOptions.autoPlay = autoPlay;
271
320
  }
272
- if (keySystems !== undefined) {
273
- newOptions.keySystems = keySystems;
274
- }
275
321
  this._priv_initializeContentPlayback(newOptions);
276
322
  };
277
323
  Player.prototype.createDebugElement = function (element) {
@@ -292,8 +338,7 @@ var Player = /** @class */ (function (_super) {
292
338
  */
293
339
  Player.prototype._priv_initializeContentPlayback = function (options) {
294
340
  var _this = this;
295
- var _a, _b, _c, _d;
296
- var autoPlay = options.autoPlay, defaultAudioTrackSwitchingMode = options.defaultAudioTrackSwitchingMode, enableFastSwitching = options.enableFastSwitching, initialManifest = options.initialManifest, keySystems = options.keySystems, lowLatencyMode = options.lowLatencyMode, minimumManifestUpdateInterval = options.minimumManifestUpdateInterval, requestConfig = options.requestConfig, onCodecSwitch = options.onCodecSwitch, startAt = options.startAt, transport = options.transport, checkMediaSegmentIntegrity = options.checkMediaSegmentIntegrity, manifestLoader = options.manifestLoader, manifestUpdateUrl = options.manifestUpdateUrl, referenceDateTime = options.referenceDateTime, representationFilter = options.representationFilter, segmentLoader = options.segmentLoader, serverSyncInfos = options.serverSyncInfos, __priv_patchLastSegmentInSidx = options.__priv_patchLastSegmentInSidx, url = options.url;
341
+ var autoPlay = options.autoPlay, audioTrackSwitchingMode = options.audioTrackSwitchingMode, defaultAudioTrack = options.defaultAudioTrack, defaultTextTrack = options.defaultTextTrack, enableFastSwitching = options.enableFastSwitching, initialManifest = options.initialManifest, keySystems = options.keySystems, lowLatencyMode = options.lowLatencyMode, manualBitrateSwitchingMode = options.manualBitrateSwitchingMode, minimumManifestUpdateInterval = options.minimumManifestUpdateInterval, networkConfig = options.networkConfig, onCodecSwitch = options.onCodecSwitch, startAt = options.startAt, transport = options.transport, transportOptions = options.transportOptions, url = options.url;
297
342
  // Perform multiple checks on the given options
298
343
  if (this.videoElement === null) {
299
344
  throw new Error("the attached video element is disposed");
@@ -303,7 +348,7 @@ var Player = /** @class */ (function (_super) {
303
348
  var currentContentCanceller = new TaskCanceller();
304
349
  var videoElement = this.videoElement;
305
350
  var initializer;
306
- var mediaElementTracksStore = null;
351
+ var mediaElementTrackChoiceManager = null;
307
352
  if (!isDirectFile) {
308
353
  var transportFn = features.transports[transport];
309
354
  if (typeof transportFn !== "function") {
@@ -315,13 +360,27 @@ var Player = /** @class */ (function (_super) {
315
360
  if (features.mediaSourceInit === null) {
316
361
  throw new Error("MediaSource streaming not supported");
317
362
  }
318
- var transportPipelines = transportFn({ lowLatencyMode: lowLatencyMode, checkMediaSegmentIntegrity: checkMediaSegmentIntegrity, manifestLoader: manifestLoader, manifestUpdateUrl: manifestUpdateUrl, referenceDateTime: referenceDateTime, representationFilter: representationFilter, segmentLoader: segmentLoader, serverSyncInfos: serverSyncInfos, __priv_patchLastSegmentInSidx: __priv_patchLastSegmentInSidx });
363
+ var transportPipelines = transportFn(transportOptions);
364
+ var offlineRetry = networkConfig.offlineRetry, segmentRetry = networkConfig.segmentRetry, manifestRetry = networkConfig.manifestRetry, manifestRequestTimeout = networkConfig.manifestRequestTimeout, segmentRequestTimeout = networkConfig.segmentRequestTimeout;
319
365
  /** Interface used to load and refresh the Manifest. */
320
- var manifestRequestSettings = { lowLatencyMode: lowLatencyMode, maxRetry: (_a = requestConfig.manifest) === null || _a === void 0 ? void 0 : _a.maxRetry,
321
- requestTimeout: (_b = requestConfig.manifest) === null || _b === void 0 ? void 0 : _b.timeout, minimumManifestUpdateInterval: minimumManifestUpdateInterval, initialManifest: initialManifest };
366
+ var manifestRequestSettings = { lowLatencyMode: lowLatencyMode, maxRetryRegular: manifestRetry,
367
+ maxRetryOffline: offlineRetry,
368
+ requestTimeout: manifestRequestTimeout, minimumManifestUpdateInterval: minimumManifestUpdateInterval, initialManifest: initialManifest };
322
369
  var relyOnVideoVisibilityAndSize = canRelyOnVideoVisibilityAndSize();
323
- var throttlers = { throttleBitrate: {},
370
+ var throttlers = { throttle: {},
371
+ throttleBitrate: {},
324
372
  limitWidth: {} };
373
+ if (this._priv_throttleWhenHidden) {
374
+ if (!relyOnVideoVisibilityAndSize) {
375
+ log.warn("API: Can't apply throttleWhenHidden because " +
376
+ "browser can't be trusted for visibility.");
377
+ }
378
+ else {
379
+ throttlers.throttle = {
380
+ video: createMappedReference(getPageActivityRef(currentContentCanceller.signal), function (isActive) { return isActive ? Infinity : 0; }, currentContentCanceller.signal),
381
+ };
382
+ }
383
+ }
325
384
  if (this._priv_throttleVideoBitrateWhenHidden) {
326
385
  if (!relyOnVideoVisibilityAndSize) {
327
386
  log.warn("API: Can't apply throttleVideoBitrateWhenHidden because " +
@@ -348,16 +407,21 @@ var Player = /** @class */ (function (_super) {
348
407
  var adaptiveOptions = {
349
408
  initialBitrates: this._priv_bitrateInfos.lastBitrates,
350
409
  lowLatencyMode: lowLatencyMode,
410
+ manualBitrates: this._priv_bitrateInfos.manualBitrates,
411
+ minAutoBitrates: this._priv_bitrateInfos.minAutoBitrates,
412
+ maxAutoBitrates: this._priv_bitrateInfos.maxAutoBitrates,
351
413
  throttlers: throttlers,
352
414
  };
353
415
  /** Options used by the TextTrack SegmentBuffer. */
354
416
  var textTrackOptions = options.textTrackMode === "native" ?
355
- { textTrackMode: "native" } :
417
+ { textTrackMode: "native",
418
+ hideNativeSubtitle: options.hideNativeSubtitle } :
356
419
  { textTrackMode: "html",
357
420
  textTrackElement: options.textTrackElement };
358
- var bufferOptions = objectAssign({ enableFastSwitching: enableFastSwitching, onCodecSwitch: onCodecSwitch }, this._priv_bufferOptions);
359
- var segmentRequestOptions = { lowLatencyMode: lowLatencyMode, maxRetry: (_c = requestConfig.segment) === null || _c === void 0 ? void 0 : _c.maxRetry,
360
- requestTimeout: (_d = requestConfig.segment) === null || _d === void 0 ? void 0 : _d.timeout };
421
+ var bufferOptions = objectAssign({ audioTrackSwitchingMode: audioTrackSwitchingMode, enableFastSwitching: enableFastSwitching, manualBitrateSwitchingMode: manualBitrateSwitchingMode, onCodecSwitch: onCodecSwitch }, this._priv_bufferOptions);
422
+ var segmentRequestOptions = { lowLatencyMode: lowLatencyMode, maxRetryRegular: segmentRetry,
423
+ requestTimeout: segmentRequestTimeout,
424
+ maxRetryOffline: offlineRetry };
361
425
  initializer = new features.mediaSourceInit({
362
426
  adaptiveOptions: adaptiveOptions,
363
427
  autoPlay: autoPlay,
@@ -382,8 +446,8 @@ var Player = /** @class */ (function (_super) {
382
446
  else if (isNullOrUndefined(url)) {
383
447
  throw new Error("No URL for a DirectFile content");
384
448
  }
385
- mediaElementTracksStore =
386
- this._priv_initializeMediaElementTracksStore(currentContentCanceller.signal);
449
+ mediaElementTrackChoiceManager =
450
+ this._priv_initializeMediaElementTrackChoiceManager(defaultAudioTrack, defaultTextTrack, currentContentCanceller.signal);
387
451
  if (currentContentCanceller.isUsed()) {
388
452
  return;
389
453
  }
@@ -394,16 +458,18 @@ var Player = /** @class */ (function (_super) {
394
458
  contentId: generateContentId(),
395
459
  originalUrl: url,
396
460
  currentContentCanceller: currentContentCanceller,
397
- defaultAudioTrackSwitchingMode: defaultAudioTrackSwitchingMode,
398
461
  initializer: initializer,
399
462
  isDirectFile: isDirectFile,
400
463
  segmentBuffersStore: null,
464
+ thumbnails: null,
401
465
  manifest: null,
402
466
  currentPeriod: null,
403
467
  activeAdaptations: null,
404
468
  activeRepresentations: null,
405
- tracksStore: null,
406
- mediaElementTracksStore: mediaElementTracksStore,
469
+ initialAudioTrack: defaultAudioTrack,
470
+ initialTextTrack: defaultTextTrack,
471
+ trackChoiceManager: null,
472
+ mediaElementTrackChoiceManager: mediaElementTrackChoiceManager,
407
473
  };
408
474
  // Bind events
409
475
  initializer.addEventListener("error", function (error) {
@@ -435,8 +501,8 @@ var Player = /** @class */ (function (_super) {
435
501
  });
436
502
  initializer.addEventListener("reloadingMediaSource", function (payload) {
437
503
  contentInfos.segmentBuffersStore = null;
438
- if (contentInfos.tracksStore !== null) {
439
- contentInfos.tracksStore.resetPeriodObjects();
504
+ if (contentInfos.trackChoiceManager !== null) {
505
+ contentInfos.trackChoiceManager.resetPeriods();
440
506
  }
441
507
  _this._priv_lastAutoPlay = payload.autoPlay;
442
508
  });
@@ -449,6 +515,9 @@ var Player = /** @class */ (function (_super) {
449
515
  initializer.addEventListener("streamEventSkip", function (streamEventSkip) {
450
516
  return _this.trigger("streamEventSkip", streamEventSkip);
451
517
  });
518
+ initializer.addEventListener("decipherabilityUpdate", function (decipherabilityUpdate) {
519
+ return _this.trigger("decipherabilityUpdate", decipherabilityUpdate);
520
+ });
452
521
  initializer.addEventListener("activePeriodChanged", function (periodInfo) {
453
522
  return _this._priv_onActivePeriodChanged(contentInfos, periodInfo);
454
523
  });
@@ -464,8 +533,8 @@ var Player = /** @class */ (function (_super) {
464
533
  initializer.addEventListener("adaptationChange", function (adaptationInfo) {
465
534
  return _this._priv_onAdaptationChange(contentInfos, adaptationInfo);
466
535
  });
467
- initializer.addEventListener("bitrateEstimateChange", function (bitrateEstimateInfo) {
468
- return _this._priv_onBitrateEstimateChange(bitrateEstimateInfo);
536
+ initializer.addEventListener("bitrateEstimationChange", function (bitrateEstimationInfo) {
537
+ return _this._priv_onBitrateEstimationChange(bitrateEstimationInfo);
469
538
  });
470
539
  initializer.addEventListener("manifestReady", function (manifest) {
471
540
  return _this._priv_onManifestReady(contentInfos, manifest);
@@ -473,6 +542,21 @@ var Player = /** @class */ (function (_super) {
473
542
  initializer.addEventListener("loaded", function (evt) {
474
543
  contentInfos.segmentBuffersStore = evt.segmentBuffersStore;
475
544
  });
545
+ initializer.addEventListener("addedSegment", function (evt) {
546
+ // Manage image tracks
547
+ // @deprecated
548
+ var content = evt.content, segmentData = evt.segmentData;
549
+ if (content.adaptation.type === "image") {
550
+ if (!isNullOrUndefined(segmentData) &&
551
+ segmentData.type === "bif") {
552
+ var imageData = segmentData.data;
553
+ /* eslint-disable import/no-deprecated */
554
+ contentInfos.thumbnails = imageData;
555
+ _this.trigger("imageTrackUpdate", { data: contentInfos.thumbnails });
556
+ /* eslint-enable import/no-deprecated */
557
+ }
558
+ }
559
+ });
476
560
  // Now, that most events are linked, prepare the next content.
477
561
  initializer.prepare();
478
562
  // Now that the content is prepared, stop previous content and reset state
@@ -588,6 +672,11 @@ var Player = /** @class */ (function (_super) {
588
672
  seekEventsCanceller.linkToSignal(currentContentCanceller.signal);
589
673
  emitSeekEvents(videoElement, playbackObserver, function () { return _this.trigger("seeking", null); }, function () { return _this.trigger("seeked", null); }, seekEventsCanceller.signal);
590
674
  }
675
+ // Previous call could have performed all kind of side-effects, thus,
676
+ // we re-check the current state associated to the RxPlayer
677
+ if (_this.state === "ENDED" /* PLAYER_STATES.ENDED */ && _this._priv_stopAtEnd) {
678
+ _this.stop();
679
+ }
591
680
  }, { emitCurrentValue: true, clearSignal: currentContentCanceller.signal });
592
681
  // React to playback conditions change
593
682
  playbackObserver.listen(function (observation) {
@@ -616,6 +705,53 @@ var Player = /** @class */ (function (_super) {
616
705
  Player.prototype.getError = function () {
617
706
  return this._priv_currentError;
618
707
  };
708
+ /**
709
+ * Returns manifest/playlist object.
710
+ * null if the player is STOPPED.
711
+ * @deprecated
712
+ * @returns {Manifest|null} - The current Manifest (`null` when not known).
713
+ */
714
+ Player.prototype.getManifest = function () {
715
+ warnOnce("getManifest is deprecated." +
716
+ " Please open an issue if you used this API.");
717
+ if (this._priv_contentInfos === null) {
718
+ return null;
719
+ }
720
+ return this._priv_contentInfos.manifest;
721
+ };
722
+ /**
723
+ * Returns Adaptations (tracks) for every currently playing type
724
+ * (audio/video/text...).
725
+ * @deprecated
726
+ * @returns {Object|null} - The current Adaptation objects, per type (`null`
727
+ * when none is known for now.
728
+ */
729
+ Player.prototype.getCurrentAdaptations = function () {
730
+ warnOnce("getCurrentAdaptations is deprecated." +
731
+ " Please open an issue if you used this API.");
732
+ if (this._priv_contentInfos === null) {
733
+ return null;
734
+ }
735
+ var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, activeAdaptations = _a.activeAdaptations;
736
+ if (currentPeriod === null ||
737
+ activeAdaptations === null ||
738
+ isNullOrUndefined(activeAdaptations[currentPeriod.id])) {
739
+ return null;
740
+ }
741
+ return activeAdaptations[currentPeriod.id];
742
+ };
743
+ /**
744
+ * Returns representations (qualities) for every currently playing type
745
+ * (audio/video/text...).
746
+ * @deprecated
747
+ * @returns {Object|null} - The current Representation objects, per type
748
+ * (`null` when none is known for now.
749
+ */
750
+ Player.prototype.getCurrentRepresentations = function () {
751
+ warnOnce("getCurrentRepresentations is deprecated." +
752
+ " Please open an issue if you used this API.");
753
+ return this._priv_getCurrentRepresentations();
754
+ };
619
755
  /**
620
756
  * Returns the media DOM element used by the player.
621
757
  * You should not its HTML5 API directly and use the player's method instead,
@@ -626,6 +762,26 @@ var Player = /** @class */ (function (_super) {
626
762
  Player.prototype.getVideoElement = function () {
627
763
  return this.videoElement;
628
764
  };
765
+ /**
766
+ * If one returns the first native text-track element attached to the media element.
767
+ * @deprecated
768
+ * @returns {TextTrack} - The native TextTrack attached (`null` when none)
769
+ */
770
+ Player.prototype.getNativeTextTrack = function () {
771
+ warnOnce("getNativeTextTrack is deprecated." +
772
+ " Please open an issue if you used this API.");
773
+ if (this.videoElement === null) {
774
+ throw new Error("Disposed player");
775
+ }
776
+ var videoElement = this.videoElement;
777
+ var textTracks = videoElement.textTracks;
778
+ if (textTracks.length > 0) {
779
+ return videoElement.textTracks[0];
780
+ }
781
+ else {
782
+ return null;
783
+ }
784
+ };
629
785
  /**
630
786
  * Returns the player's current state.
631
787
  * @returns {string} - The current Player's state
@@ -693,22 +849,21 @@ var Player = /** @class */ (function (_super) {
693
849
  return this._priv_preferTrickModeTracks;
694
850
  };
695
851
  /**
696
- * Returns the URL(s) of the currently considered Manifest, or of the content for
852
+ * Returns the url of the currently considered Manifest, or of the content for
697
853
  * directfile content.
698
- * @returns {Array.<string>|undefined} - Current URL. `undefined` if not known
699
- * or no URL yet.
854
+ * @returns {string|undefined} - Current URL. `undefined` if not known or no
855
+ * URL yet.
700
856
  */
701
- Player.prototype.getContentUrls = function () {
857
+ Player.prototype.getUrl = function () {
702
858
  if (this._priv_contentInfos === null) {
703
859
  return undefined;
704
860
  }
705
861
  var _a = this._priv_contentInfos, isDirectFile = _a.isDirectFile, manifest = _a.manifest, originalUrl = _a.originalUrl;
706
862
  if (isDirectFile) {
707
- return originalUrl === undefined ? undefined :
708
- [originalUrl];
863
+ return originalUrl;
709
864
  }
710
865
  if (manifest !== null) {
711
- return manifest.getUrls();
866
+ return manifest.getUrl();
712
867
  }
713
868
  return undefined;
714
869
  };
@@ -732,7 +887,7 @@ var Player = /** @class */ (function (_super) {
732
887
  * NaN if no video is playing.
733
888
  * @returns {Number}
734
889
  */
735
- Player.prototype.getMediaDuration = function () {
890
+ Player.prototype.getVideoDuration = function () {
736
891
  if (this.videoElement === null) {
737
892
  throw new Error("Disposed player");
738
893
  }
@@ -744,13 +899,43 @@ var Player = /** @class */ (function (_super) {
744
899
  * - the current time
745
900
  * @returns {Number}
746
901
  */
747
- Player.prototype.getCurrentBufferGap = function () {
902
+ Player.prototype.getVideoBufferGap = function () {
748
903
  if (this.videoElement === null) {
749
904
  throw new Error("Disposed player");
750
905
  }
751
906
  var videoElement = this.videoElement;
752
907
  return getLeftSizeOfRange(videoElement.buffered, videoElement.currentTime);
753
908
  };
909
+ /**
910
+ * Returns in seconds the difference between:
911
+ * - the end of the current contiguous loaded range.
912
+ * - the start of the current contiguous loaded range.
913
+ * @returns {Number}
914
+ */
915
+ Player.prototype.getVideoLoadedTime = function () {
916
+ warnOnce("`getVideoLoadedTime` is deprecated and won't be present in the " +
917
+ "next major version");
918
+ if (this.videoElement === null) {
919
+ throw new Error("Disposed player");
920
+ }
921
+ var videoElement = this.videoElement;
922
+ return getSizeOfRange(videoElement.buffered, videoElement.currentTime);
923
+ };
924
+ /**
925
+ * Returns in seconds the difference between:
926
+ * - the current time.
927
+ * - the start of the current contiguous loaded range.
928
+ * @returns {Number}
929
+ */
930
+ Player.prototype.getVideoPlayedTime = function () {
931
+ warnOnce("`getVideoPlayedTime` is deprecated and won't be present in the " +
932
+ "next major version");
933
+ if (this.videoElement === null) {
934
+ throw new Error("Disposed player");
935
+ }
936
+ var videoElement = this.videoElement;
937
+ return getPlayedSizeOfRange(videoElement.buffered, videoElement.currentTime);
938
+ };
754
939
  /**
755
940
  * Get the current position, in s, in wall-clock time.
756
941
  * That is:
@@ -884,47 +1069,115 @@ var Player = /** @class */ (function (_super) {
884
1069
  return;
885
1070
  }
886
1071
  this._priv_preferTrickModeTracks = preferTrickModeTracks;
887
- var tracksStore = (_a = this._priv_contentInfos) === null || _a === void 0 ? void 0 : _a.tracksStore;
888
- if (!isNullOrUndefined(tracksStore)) {
889
- if (preferTrickModeTracks && !tracksStore.isTrickModeEnabled()) {
890
- tracksStore.enableVideoTrickModeTracks();
1072
+ var trackChoiceManager = (_a = this._priv_contentInfos) === null || _a === void 0 ? void 0 : _a.trackChoiceManager;
1073
+ if (!isNullOrUndefined(trackChoiceManager)) {
1074
+ if (preferTrickModeTracks && !trackChoiceManager.isTrickModeEnabled()) {
1075
+ trackChoiceManager.enableVideoTrickModeTracks();
891
1076
  }
892
- else if (!preferTrickModeTracks && tracksStore.isTrickModeEnabled()) {
893
- tracksStore.disableVideoTrickModeTracks();
1077
+ else if (!preferTrickModeTracks && trackChoiceManager.isTrickModeEnabled()) {
1078
+ trackChoiceManager.disableVideoTrickModeTracks();
894
1079
  }
895
1080
  }
896
1081
  };
897
1082
  /**
898
- * Returns video Representation currently considered for the current Period.
899
- *
900
- * Returns `null` if no video track is playing for the current Period.
901
- *
902
- * Returns `undefined` either when are not currently playing any Period or
903
- * when we don't know which Representation is playing.
904
- * @returns {Object|null|undefined}
1083
+ * Returns all available bitrates for the current video Adaptation.
1084
+ * @returns {Array.<Number>}
905
1085
  */
906
- Player.prototype.getVideoRepresentation = function () {
907
- var representations = this.__priv_getCurrentRepresentations();
908
- if (representations === null) {
1086
+ Player.prototype.getAvailableVideoBitrates = function () {
1087
+ if (this._priv_contentInfos === null) {
1088
+ return [];
1089
+ }
1090
+ var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, activeAdaptations = _a.activeAdaptations;
1091
+ if (currentPeriod === null || activeAdaptations === null) {
1092
+ return [];
1093
+ }
1094
+ var adaptations = activeAdaptations[currentPeriod.id];
1095
+ if (adaptations === undefined || isNullOrUndefined(adaptations.video)) {
1096
+ return [];
1097
+ }
1098
+ return adaptations.video.getAvailableBitrates();
1099
+ };
1100
+ /**
1101
+ * Returns all available bitrates for the current audio Adaptation.
1102
+ * @returns {Array.<Number>}
1103
+ */
1104
+ Player.prototype.getAvailableAudioBitrates = function () {
1105
+ if (this._priv_contentInfos === null) {
1106
+ return [];
1107
+ }
1108
+ var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, activeAdaptations = _a.activeAdaptations;
1109
+ if (currentPeriod === null || activeAdaptations === null) {
1110
+ return [];
1111
+ }
1112
+ var adaptations = activeAdaptations[currentPeriod.id];
1113
+ if (adaptations === undefined || isNullOrUndefined(adaptations.audio)) {
1114
+ return [];
1115
+ }
1116
+ return adaptations.audio.getAvailableBitrates();
1117
+ };
1118
+ /**
1119
+ * Returns the manual audio bitrate set. -1 if in AUTO mode.
1120
+ * @returns {Number}
1121
+ */
1122
+ Player.prototype.getManualAudioBitrate = function () {
1123
+ return this._priv_bitrateInfos.manualBitrates.audio.getValue();
1124
+ };
1125
+ /**
1126
+ * Returns the manual video bitrate set. -1 if in AUTO mode.
1127
+ * @returns {Number}
1128
+ */
1129
+ Player.prototype.getManualVideoBitrate = function () {
1130
+ return this._priv_bitrateInfos.manualBitrates.video.getValue();
1131
+ };
1132
+ /**
1133
+ * Returns currently considered bitrate for video segments.
1134
+ * @returns {Number|undefined}
1135
+ */
1136
+ Player.prototype.getVideoBitrate = function () {
1137
+ var representations = this._priv_getCurrentRepresentations();
1138
+ if (representations === null || isNullOrUndefined(representations.video)) {
909
1139
  return undefined;
910
1140
  }
911
- return representations.video;
1141
+ return representations.video.bitrate;
912
1142
  };
913
1143
  /**
914
- * Returns audio Representation currently considered for the current Period.
915
- *
916
- * Returns `null` if no audio track is playing for the current Period.
917
- *
918
- * Returns `undefined` either when are not currently playing any Period or
919
- * when we don't know which Representation is playing.
920
- * @returns {Object|null|undefined}
1144
+ * Returns currently considered bitrate for audio segments.
1145
+ * @returns {Number|undefined}
921
1146
  */
922
- Player.prototype.getAudioRepresentation = function () {
923
- var representations = this.__priv_getCurrentRepresentations();
924
- if (representations === null) {
1147
+ Player.prototype.getAudioBitrate = function () {
1148
+ var representations = this._priv_getCurrentRepresentations();
1149
+ if (representations === null || isNullOrUndefined(representations.audio)) {
925
1150
  return undefined;
926
1151
  }
927
- return representations.audio;
1152
+ return representations.audio.bitrate;
1153
+ };
1154
+ /**
1155
+ * Returns minimum wanted video bitrate currently set.
1156
+ * @returns {Number}
1157
+ */
1158
+ Player.prototype.getMinVideoBitrate = function () {
1159
+ return this._priv_bitrateInfos.minAutoBitrates.video.getValue();
1160
+ };
1161
+ /**
1162
+ * Returns minimum wanted audio bitrate currently set.
1163
+ * @returns {Number}
1164
+ */
1165
+ Player.prototype.getMinAudioBitrate = function () {
1166
+ return this._priv_bitrateInfos.minAutoBitrates.audio.getValue();
1167
+ };
1168
+ /**
1169
+ * Returns maximum wanted video bitrate currently set.
1170
+ * @returns {Number}
1171
+ */
1172
+ Player.prototype.getMaxVideoBitrate = function () {
1173
+ return this._priv_bitrateInfos.maxAutoBitrates.video.getValue();
1174
+ };
1175
+ /**
1176
+ * Returns maximum wanted audio bitrate currently set.
1177
+ * @returns {Number}
1178
+ */
1179
+ Player.prototype.getMaxAudioBitrate = function () {
1180
+ return this._priv_bitrateInfos.maxAutoBitrates.audio.getValue();
928
1181
  };
929
1182
  /**
930
1183
  * Play/Resume the current video.
@@ -1015,6 +1268,44 @@ var Player = /** @class */ (function (_super) {
1015
1268
  this.videoElement.currentTime = positionWanted;
1016
1269
  return positionWanted;
1017
1270
  };
1271
+ /**
1272
+ * Returns true if the media element is full screen.
1273
+ * @deprecated
1274
+ * @returns {Boolean}
1275
+ */
1276
+ Player.prototype.isFullscreen = function () {
1277
+ warnOnce("isFullscreen is deprecated." +
1278
+ " Fullscreen management should now be managed by the application");
1279
+ return isFullscreen();
1280
+ };
1281
+ /**
1282
+ * Set/exit fullScreen.
1283
+ * @deprecated
1284
+ * @param {Boolean} [goFull=true] - if false, exit full screen.
1285
+ */
1286
+ Player.prototype.setFullscreen = function (goFull) {
1287
+ if (goFull === void 0) { goFull = true; }
1288
+ warnOnce("setFullscreen is deprecated." +
1289
+ " Fullscreen management should now be managed by the application");
1290
+ if (this.videoElement === null) {
1291
+ throw new Error("Disposed player");
1292
+ }
1293
+ if (goFull) {
1294
+ requestFullscreen(this.videoElement);
1295
+ }
1296
+ else {
1297
+ exitFullscreen();
1298
+ }
1299
+ };
1300
+ /**
1301
+ * Exit from full screen mode.
1302
+ * @deprecated
1303
+ */
1304
+ Player.prototype.exitFullscreen = function () {
1305
+ warnOnce("exitFullscreen is deprecated." +
1306
+ " Fullscreen management should now be managed by the application");
1307
+ exitFullscreen();
1308
+ };
1018
1309
  /**
1019
1310
  * Returns the current player's audio volume on the media element.
1020
1311
  * From 0 (no audio) to 1 (maximum volume).
@@ -1066,6 +1357,74 @@ var Player = /** @class */ (function (_super) {
1066
1357
  this._priv_mutedMemory);
1067
1358
  }
1068
1359
  };
1360
+ /**
1361
+ * Force the video bitrate to a given value. Act as a ceil.
1362
+ * -1 to set it on AUTO Mode
1363
+ * @param {Number} btr
1364
+ */
1365
+ Player.prototype.setVideoBitrate = function (btr) {
1366
+ this._priv_bitrateInfos.manualBitrates.video.setValue(btr);
1367
+ };
1368
+ /**
1369
+ * Force the audio bitrate to a given value. Act as a ceil.
1370
+ * -1 to set it on AUTO Mode
1371
+ * @param {Number} btr
1372
+ */
1373
+ Player.prototype.setAudioBitrate = function (btr) {
1374
+ this._priv_bitrateInfos.manualBitrates.audio.setValue(btr);
1375
+ };
1376
+ /**
1377
+ * Update the minimum video bitrate the user can switch to.
1378
+ * @param {Number} btr
1379
+ */
1380
+ Player.prototype.setMinVideoBitrate = function (btr) {
1381
+ var maxVideoBitrate = this._priv_bitrateInfos.maxAutoBitrates.video.getValue();
1382
+ if (btr > maxVideoBitrate) {
1383
+ throw new Error("Invalid minimum video bitrate given. " +
1384
+ "Its value, \"".concat(btr, "\" is superior the current maximum ") +
1385
+ "video birate, \"".concat(maxVideoBitrate, "\"."));
1386
+ }
1387
+ this._priv_bitrateInfos.minAutoBitrates.video.setValue(btr);
1388
+ };
1389
+ /**
1390
+ * Update the minimum audio bitrate the user can switch to.
1391
+ * @param {Number} btr
1392
+ */
1393
+ Player.prototype.setMinAudioBitrate = function (btr) {
1394
+ var maxAudioBitrate = this._priv_bitrateInfos.maxAutoBitrates.audio.getValue();
1395
+ if (btr > maxAudioBitrate) {
1396
+ throw new Error("Invalid minimum audio bitrate given. " +
1397
+ "Its value, \"".concat(btr, "\" is superior the current maximum ") +
1398
+ "audio birate, \"".concat(maxAudioBitrate, "\"."));
1399
+ }
1400
+ this._priv_bitrateInfos.minAutoBitrates.audio.setValue(btr);
1401
+ };
1402
+ /**
1403
+ * Update the maximum video bitrate the user can switch to.
1404
+ * @param {Number} btr
1405
+ */
1406
+ Player.prototype.setMaxVideoBitrate = function (btr) {
1407
+ var minVideoBitrate = this._priv_bitrateInfos.minAutoBitrates.video.getValue();
1408
+ if (btr < minVideoBitrate) {
1409
+ throw new Error("Invalid maximum video bitrate given. " +
1410
+ "Its value, \"".concat(btr, "\" is inferior the current minimum ") +
1411
+ "video birate, \"".concat(minVideoBitrate, "\"."));
1412
+ }
1413
+ this._priv_bitrateInfos.maxAutoBitrates.video.setValue(btr);
1414
+ };
1415
+ /**
1416
+ * Update the maximum audio bitrate the user can switch to.
1417
+ * @param {Number} btr
1418
+ */
1419
+ Player.prototype.setMaxAudioBitrate = function (btr) {
1420
+ var minAudioBitrate = this._priv_bitrateInfos.minAutoBitrates.audio.getValue();
1421
+ if (btr < minAudioBitrate) {
1422
+ throw new Error("Invalid maximum audio bitrate given. " +
1423
+ "Its value, \"".concat(btr, "\" is inferior the current minimum ") +
1424
+ "audio birate, \"".concat(minAudioBitrate, "\"."));
1425
+ }
1426
+ this._priv_bitrateInfos.maxAutoBitrates.audio.setValue(btr);
1427
+ };
1069
1428
  /**
1070
1429
  * Set the max buffer size for the buffer behind the current position.
1071
1430
  * Every buffer data before will be removed.
@@ -1140,14 +1499,6 @@ var Player = /** @class */ (function (_super) {
1140
1499
  }
1141
1500
  return getCurrentKeySystem(this.videoElement);
1142
1501
  };
1143
- Player.prototype.getCurrentPeriod = function () {
1144
- var _a;
1145
- var currentPeriod = (_a = this._priv_contentInfos) === null || _a === void 0 ? void 0 : _a.currentPeriod;
1146
- if (isNullOrUndefined(currentPeriod)) {
1147
- return null;
1148
- }
1149
- return { id: currentPeriod.id, start: currentPeriod.start, end: currentPeriod.end };
1150
- };
1151
1502
  /**
1152
1503
  * Returns both the name of the key system (e.g. `"com.widevine.alpha"`) and
1153
1504
  * the `MediaKeySystemConfiguration` currently associated to the
@@ -1167,356 +1518,342 @@ var Player = /** @class */ (function (_super) {
1167
1518
  return { keySystem: values[0], configuration: values[1] };
1168
1519
  };
1169
1520
  /**
1170
- * Returns the list of available Periods for which the current audio, video or
1171
- * text track can now be changed.
1172
- * @returns {Array.<Object>}
1521
+ * Returns every available audio tracks for the current Period.
1522
+ * @returns {Array.<Object>|null}
1173
1523
  */
1174
- Player.prototype.getAvailablePeriods = function () {
1524
+ Player.prototype.getAvailableAudioTracks = function () {
1525
+ var _a;
1175
1526
  if (this._priv_contentInfos === null) {
1176
1527
  return [];
1177
1528
  }
1178
- var _a = this._priv_contentInfos, isDirectFile = _a.isDirectFile, tracksStore = _a.tracksStore;
1529
+ var _b = this._priv_contentInfos, currentPeriod = _b.currentPeriod, isDirectFile = _b.isDirectFile, trackChoiceManager = _b.trackChoiceManager, mediaElementTrackChoiceManager = _b.mediaElementTrackChoiceManager;
1179
1530
  if (isDirectFile) {
1180
- return [];
1531
+ return (_a = mediaElementTrackChoiceManager === null || mediaElementTrackChoiceManager === void 0 ? void 0 : mediaElementTrackChoiceManager.getAvailableAudioTracks()) !== null && _a !== void 0 ? _a : [];
1181
1532
  }
1182
- if (tracksStore === null) {
1533
+ if (trackChoiceManager === null || currentPeriod === null) {
1183
1534
  return [];
1184
1535
  }
1185
- return tracksStore.getAvailablePeriods().slice();
1536
+ return trackChoiceManager.getAvailableAudioTracks(currentPeriod);
1186
1537
  };
1187
1538
  /**
1188
- * Returns every available audio tracks for a given Period - or the current
1189
- * one if no `periodId` is given.
1190
- * @param {string|undefined} [periodId]
1191
- * @returns {Array.<Object>}
1539
+ * Returns every available text tracks for the current Period.
1540
+ * @returns {Array.<Object>|null}
1192
1541
  */
1193
- Player.prototype.getAvailableAudioTracks = function (periodId) {
1542
+ Player.prototype.getAvailableTextTracks = function () {
1194
1543
  var _a;
1195
1544
  if (this._priv_contentInfos === null) {
1196
1545
  return [];
1197
1546
  }
1198
- var _b = this._priv_contentInfos, isDirectFile = _b.isDirectFile, mediaElementTracksStore = _b.mediaElementTracksStore;
1547
+ var _b = this._priv_contentInfos, currentPeriod = _b.currentPeriod, isDirectFile = _b.isDirectFile, trackChoiceManager = _b.trackChoiceManager, mediaElementTrackChoiceManager = _b.mediaElementTrackChoiceManager;
1199
1548
  if (isDirectFile) {
1200
- return (_a = mediaElementTracksStore === null || mediaElementTracksStore === void 0 ? void 0 : mediaElementTracksStore.getAvailableAudioTracks()) !== null && _a !== void 0 ? _a : [];
1549
+ return (_a = mediaElementTrackChoiceManager === null || mediaElementTrackChoiceManager === void 0 ? void 0 : mediaElementTrackChoiceManager.getAvailableTextTracks()) !== null && _a !== void 0 ? _a : [];
1201
1550
  }
1202
- return this._priv_callTracksStoreGetterSetter(periodId, [], function (tcm, periodRef) { var _a; return (_a = tcm.getAvailableAudioTracks(periodRef)) !== null && _a !== void 0 ? _a : []; });
1203
- };
1204
- /**
1205
- * Returns every available text tracks for a given Period - or the current
1206
- * one if no `periodId` is given.
1207
- * @param {string|undefined} [periodId]
1208
- * @returns {Array.<Object>}
1209
- */
1210
- Player.prototype.getAvailableTextTracks = function (periodId) {
1211
- var _a;
1212
- if (this._priv_contentInfos === null) {
1551
+ if (trackChoiceManager === null || currentPeriod === null) {
1213
1552
  return [];
1214
1553
  }
1215
- var _b = this._priv_contentInfos, isDirectFile = _b.isDirectFile, mediaElementTracksStore = _b.mediaElementTracksStore;
1216
- if (isDirectFile) {
1217
- return (_a = mediaElementTracksStore === null || mediaElementTracksStore === void 0 ? void 0 : mediaElementTracksStore.getAvailableTextTracks()) !== null && _a !== void 0 ? _a : [];
1218
- }
1219
- return this._priv_callTracksStoreGetterSetter(periodId, [], function (tcm, periodRef) { var _a; return (_a = tcm.getAvailableTextTracks(periodRef)) !== null && _a !== void 0 ? _a : []; });
1554
+ return trackChoiceManager.getAvailableTextTracks(currentPeriod);
1220
1555
  };
1221
1556
  /**
1222
1557
  * Returns every available video tracks for the current Period.
1223
- * @param {string|undefined} [periodId]
1224
- * @returns {Array.<Object>}
1558
+ * @returns {Array.<Object>|null}
1225
1559
  */
1226
- Player.prototype.getAvailableVideoTracks = function (periodId) {
1560
+ Player.prototype.getAvailableVideoTracks = function () {
1227
1561
  var _a;
1228
1562
  if (this._priv_contentInfos === null) {
1229
1563
  return [];
1230
1564
  }
1231
- var _b = this._priv_contentInfos, isDirectFile = _b.isDirectFile, mediaElementTracksStore = _b.mediaElementTracksStore;
1565
+ var _b = this._priv_contentInfos, currentPeriod = _b.currentPeriod, isDirectFile = _b.isDirectFile, trackChoiceManager = _b.trackChoiceManager, mediaElementTrackChoiceManager = _b.mediaElementTrackChoiceManager;
1232
1566
  if (isDirectFile) {
1233
- return (_a = mediaElementTracksStore === null || mediaElementTracksStore === void 0 ? void 0 : mediaElementTracksStore.getAvailableVideoTracks()) !== null && _a !== void 0 ? _a : [];
1567
+ return (_a = mediaElementTrackChoiceManager === null || mediaElementTrackChoiceManager === void 0 ? void 0 : mediaElementTrackChoiceManager.getAvailableVideoTracks()) !== null && _a !== void 0 ? _a : [];
1568
+ }
1569
+ if (trackChoiceManager === null || currentPeriod === null) {
1570
+ return [];
1234
1571
  }
1235
- return this._priv_callTracksStoreGetterSetter(periodId, [], function (tcm, periodRef) { var _a; return (_a = tcm.getAvailableVideoTracks(periodRef)) !== null && _a !== void 0 ? _a : []; });
1572
+ return trackChoiceManager.getAvailableVideoTracks(currentPeriod);
1236
1573
  };
1237
1574
  /**
1238
1575
  * Returns currently chosen audio language for the current Period.
1239
- * @param {string|undefined} [periodId]
1240
- * @returns {Object|null|undefined}
1576
+ * @returns {string}
1241
1577
  */
1242
- Player.prototype.getAudioTrack = function (periodId) {
1578
+ Player.prototype.getAudioTrack = function () {
1243
1579
  if (this._priv_contentInfos === null) {
1244
1580
  return undefined;
1245
1581
  }
1246
- var _a = this._priv_contentInfos, isDirectFile = _a.isDirectFile, mediaElementTracksStore = _a.mediaElementTracksStore;
1582
+ var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile, trackChoiceManager = _a.trackChoiceManager, mediaElementTrackChoiceManager = _a.mediaElementTrackChoiceManager;
1247
1583
  if (isDirectFile) {
1248
- if (mediaElementTracksStore === null) {
1584
+ if (mediaElementTrackChoiceManager === null) {
1249
1585
  return undefined;
1250
1586
  }
1251
- return mediaElementTracksStore.getChosenAudioTrack();
1587
+ return mediaElementTrackChoiceManager.getChosenAudioTrack();
1588
+ }
1589
+ if (trackChoiceManager === null || currentPeriod === null) {
1590
+ return undefined;
1252
1591
  }
1253
- return this._priv_callTracksStoreGetterSetter(periodId, undefined, function (tcm, periodRef) { return tcm.getChosenAudioTrack(periodRef); });
1592
+ return trackChoiceManager.getChosenAudioTrack(currentPeriod);
1254
1593
  };
1255
1594
  /**
1256
1595
  * Returns currently chosen subtitle for the current Period.
1257
- * @param {string|undefined} [periodId]
1258
- * @returns {Object|null|undefined}
1596
+ * @returns {string}
1259
1597
  */
1260
- Player.prototype.getTextTrack = function (periodId) {
1598
+ Player.prototype.getTextTrack = function () {
1261
1599
  if (this._priv_contentInfos === null) {
1262
1600
  return undefined;
1263
1601
  }
1264
- var _a = this._priv_contentInfos, isDirectFile = _a.isDirectFile, mediaElementTracksStore = _a.mediaElementTracksStore;
1602
+ var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile, trackChoiceManager = _a.trackChoiceManager, mediaElementTrackChoiceManager = _a.mediaElementTrackChoiceManager;
1265
1603
  if (isDirectFile) {
1266
- if (mediaElementTracksStore === null) {
1604
+ if (mediaElementTrackChoiceManager === null) {
1267
1605
  return undefined;
1268
1606
  }
1269
- return mediaElementTracksStore.getChosenTextTrack();
1607
+ return mediaElementTrackChoiceManager.getChosenTextTrack();
1270
1608
  }
1271
- return this._priv_callTracksStoreGetterSetter(periodId, undefined, function (tcm, periodRef) { return tcm.getChosenTextTrack(periodRef); });
1609
+ if (trackChoiceManager === null || currentPeriod === null) {
1610
+ return undefined;
1611
+ }
1612
+ return trackChoiceManager.getChosenTextTrack(currentPeriod);
1272
1613
  };
1273
1614
  /**
1274
1615
  * Returns currently chosen video track for the current Period.
1275
- * @param {string|undefined} [periodId]
1276
- * @returns {Object|null|undefined}
1616
+ * @returns {string}
1277
1617
  */
1278
- Player.prototype.getVideoTrack = function (periodId) {
1618
+ Player.prototype.getVideoTrack = function () {
1279
1619
  if (this._priv_contentInfos === null) {
1280
1620
  return undefined;
1281
1621
  }
1282
- var _a = this._priv_contentInfos, isDirectFile = _a.isDirectFile, mediaElementTracksStore = _a.mediaElementTracksStore;
1622
+ var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile, trackChoiceManager = _a.trackChoiceManager, mediaElementTrackChoiceManager = _a.mediaElementTrackChoiceManager;
1283
1623
  if (isDirectFile) {
1284
- if (mediaElementTracksStore === null) {
1624
+ if (mediaElementTrackChoiceManager === null) {
1285
1625
  return undefined;
1286
1626
  }
1287
- return mediaElementTracksStore.getChosenVideoTrack();
1627
+ return mediaElementTrackChoiceManager.getChosenVideoTrack();
1288
1628
  }
1289
- return this._priv_callTracksStoreGetterSetter(periodId, undefined, function (tcm, periodRef) { return tcm.getChosenVideoTrack(periodRef); });
1629
+ if (trackChoiceManager === null || currentPeriod === null) {
1630
+ return undefined;
1631
+ }
1632
+ return trackChoiceManager.getChosenVideoTrack(currentPeriod);
1290
1633
  };
1291
1634
  /**
1292
1635
  * Update the audio language for the current Period.
1293
- * @param {string | object} arg
1294
- * @throws Error - the current content has no TracksStore.
1636
+ * @param {string} audioId
1637
+ * @throws Error - the current content has no TrackChoiceManager.
1295
1638
  * @throws Error - the given id is linked to no audio track.
1296
1639
  */
1297
- Player.prototype.setAudioTrack = function (arg) {
1298
- var _a;
1640
+ Player.prototype.setAudioTrack = function (audioId) {
1299
1641
  if (this._priv_contentInfos === null) {
1300
1642
  throw new Error("No content loaded");
1301
1643
  }
1302
- var _b = this._priv_contentInfos, isDirectFile = _b.isDirectFile, mediaElementTracksStore = _b.mediaElementTracksStore;
1644
+ var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile, trackChoiceManager = _a.trackChoiceManager, mediaElementTrackChoiceManager = _a.mediaElementTrackChoiceManager;
1303
1645
  if (isDirectFile) {
1304
1646
  try {
1305
- var audioId = typeof arg === "string" ? arg :
1306
- arg.trackId;
1307
- mediaElementTracksStore === null || mediaElementTracksStore === void 0 ? void 0 : mediaElementTracksStore.setAudioTrackById(audioId);
1647
+ mediaElementTrackChoiceManager === null || mediaElementTrackChoiceManager === void 0 ? void 0 : mediaElementTrackChoiceManager.setAudioTrackById(audioId);
1308
1648
  return;
1309
1649
  }
1310
1650
  catch (e) {
1311
1651
  throw new Error("player: unknown audio track");
1312
1652
  }
1313
1653
  }
1314
- var periodId;
1315
- var trackId;
1316
- var switchingMode;
1317
- var reprsToLock = null;
1318
- if (typeof arg === "string") {
1319
- trackId = arg;
1654
+ if (trackChoiceManager === null || currentPeriod === null) {
1655
+ throw new Error("No compatible content launched.");
1320
1656
  }
1321
- else {
1322
- trackId = arg.trackId;
1323
- periodId = arg.periodId;
1324
- switchingMode = arg.switchingMode;
1325
- reprsToLock = (_a = arg.lockedRepresentations) !== null && _a !== void 0 ? _a : null;
1657
+ try {
1658
+ trackChoiceManager.setAudioTrackByID(currentPeriod, audioId);
1659
+ }
1660
+ catch (e) {
1661
+ throw new Error("player: unknown audio track");
1326
1662
  }
1327
- return this._priv_callTracksStoreGetterSetter(periodId, undefined, function (tcm, periodRef) {
1328
- return tcm.setAudioTrack(periodRef, trackId, switchingMode, reprsToLock);
1329
- });
1330
1663
  };
1331
1664
  /**
1332
1665
  * Update the text language for the current Period.
1333
- * @param {string | Object} arg
1334
- * @throws Error - the current content has no TracksStore.
1666
+ * @param {string} sub
1667
+ * @throws Error - the current content has no TrackChoiceManager.
1335
1668
  * @throws Error - the given id is linked to no text track.
1336
1669
  */
1337
- Player.prototype.setTextTrack = function (arg) {
1670
+ Player.prototype.setTextTrack = function (textId) {
1338
1671
  if (this._priv_contentInfos === null) {
1339
1672
  throw new Error("No content loaded");
1340
1673
  }
1341
- var _a = this._priv_contentInfos, isDirectFile = _a.isDirectFile, mediaElementTracksStore = _a.mediaElementTracksStore;
1674
+ var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile, trackChoiceManager = _a.trackChoiceManager, mediaElementTrackChoiceManager = _a.mediaElementTrackChoiceManager;
1342
1675
  if (isDirectFile) {
1343
1676
  try {
1344
- var textId = typeof arg === "string" ? arg :
1345
- arg.trackId;
1346
- mediaElementTracksStore === null || mediaElementTracksStore === void 0 ? void 0 : mediaElementTracksStore.setTextTrackById(textId);
1677
+ mediaElementTrackChoiceManager === null || mediaElementTrackChoiceManager === void 0 ? void 0 : mediaElementTrackChoiceManager.setTextTrackById(textId);
1347
1678
  return;
1348
1679
  }
1349
1680
  catch (e) {
1350
1681
  throw new Error("player: unknown text track");
1351
1682
  }
1352
1683
  }
1353
- var periodId;
1354
- var trackId;
1355
- if (typeof arg === "string") {
1356
- trackId = arg;
1684
+ if (trackChoiceManager === null || currentPeriod === null) {
1685
+ throw new Error("No compatible content launched.");
1357
1686
  }
1358
- else {
1359
- trackId = arg.trackId;
1360
- periodId = arg.periodId;
1687
+ try {
1688
+ trackChoiceManager.setTextTrackByID(currentPeriod, textId);
1689
+ }
1690
+ catch (e) {
1691
+ throw new Error("player: unknown text track");
1361
1692
  }
1362
- return this._priv_callTracksStoreGetterSetter(periodId, undefined, function (tcm, periodRef) { return tcm.setTextTrack(periodRef, trackId); });
1363
1693
  };
1364
1694
  /**
1365
1695
  * Disable subtitles for the current content.
1366
- * @param {string|undefined} [periodId]
1367
1696
  */
1368
- Player.prototype.disableTextTrack = function (periodId) {
1697
+ Player.prototype.disableTextTrack = function () {
1369
1698
  if (this._priv_contentInfos === null) {
1370
1699
  return;
1371
1700
  }
1372
- var _a = this._priv_contentInfos, isDirectFile = _a.isDirectFile, mediaElementTracksStore = _a.mediaElementTracksStore;
1701
+ var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile, trackChoiceManager = _a.trackChoiceManager, mediaElementTrackChoiceManager = _a.mediaElementTrackChoiceManager;
1373
1702
  if (isDirectFile) {
1374
- mediaElementTracksStore === null || mediaElementTracksStore === void 0 ? void 0 : mediaElementTracksStore.disableTextTrack();
1703
+ mediaElementTrackChoiceManager === null || mediaElementTrackChoiceManager === void 0 ? void 0 : mediaElementTrackChoiceManager.disableTextTrack();
1704
+ return;
1705
+ }
1706
+ if (trackChoiceManager === null || currentPeriod === null) {
1375
1707
  return;
1376
1708
  }
1377
- return this._priv_callTracksStoreGetterSetter(periodId, undefined, function (tcm, periodRef) { return tcm.disableTrack(periodRef, "text"); });
1709
+ return trackChoiceManager.disableTextTrack(currentPeriod);
1378
1710
  };
1379
1711
  /**
1380
1712
  * Update the video track for the current Period.
1381
- * @param {string | Object} arg
1382
- * @throws Error - the current content has no TracksStore.
1713
+ * @param {string} videoId
1714
+ * @throws Error - the current content has no TrackChoiceManager.
1383
1715
  * @throws Error - the given id is linked to no video track.
1384
1716
  */
1385
- Player.prototype.setVideoTrack = function (arg) {
1386
- var _a;
1717
+ Player.prototype.setVideoTrack = function (videoId) {
1387
1718
  if (this._priv_contentInfos === null) {
1388
1719
  throw new Error("No content loaded");
1389
1720
  }
1390
- var _b = this._priv_contentInfos, isDirectFile = _b.isDirectFile, mediaElementTracksStore = _b.mediaElementTracksStore;
1721
+ var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile, trackChoiceManager = _a.trackChoiceManager, mediaElementTrackChoiceManager = _a.mediaElementTrackChoiceManager;
1391
1722
  if (isDirectFile) {
1392
1723
  try {
1393
- var videoId = typeof arg === "string" ? arg :
1394
- arg.trackId;
1395
- mediaElementTracksStore === null || mediaElementTracksStore === void 0 ? void 0 : mediaElementTracksStore.setVideoTrackById(videoId);
1724
+ mediaElementTrackChoiceManager === null || mediaElementTrackChoiceManager === void 0 ? void 0 : mediaElementTrackChoiceManager.setVideoTrackById(videoId);
1396
1725
  return;
1397
1726
  }
1398
1727
  catch (e) {
1399
1728
  throw new Error("player: unknown video track");
1400
1729
  }
1401
1730
  }
1402
- var periodId;
1403
- var trackId;
1404
- var switchingMode;
1405
- var reprsToLock = null;
1406
- if (typeof arg === "string") {
1407
- trackId = arg;
1731
+ if (trackChoiceManager === null || currentPeriod === null) {
1732
+ throw new Error("No compatible content launched.");
1408
1733
  }
1409
- else {
1410
- trackId = arg.trackId;
1411
- periodId = arg.periodId;
1412
- switchingMode = arg.switchingMode;
1413
- reprsToLock = (_a = arg.lockedRepresentations) !== null && _a !== void 0 ? _a : null;
1734
+ try {
1735
+ trackChoiceManager.setVideoTrackByID(currentPeriod, videoId);
1736
+ }
1737
+ catch (e) {
1738
+ throw new Error("player: unknown video track");
1414
1739
  }
1415
- return this._priv_callTracksStoreGetterSetter(periodId, undefined, function (tcm, periodRef) {
1416
- return tcm.setVideoTrack(periodRef, trackId, switchingMode, reprsToLock);
1417
- });
1418
1740
  };
1419
1741
  /**
1420
1742
  * Disable video track for the current content.
1421
- * @param {string|undefined} [periodId]
1422
1743
  */
1423
- Player.prototype.disableVideoTrack = function (periodId) {
1744
+ Player.prototype.disableVideoTrack = function () {
1424
1745
  if (this._priv_contentInfos === null) {
1425
1746
  return;
1426
1747
  }
1427
- var _a = this._priv_contentInfos, isDirectFile = _a.isDirectFile, mediaElementTracksStore = _a.mediaElementTracksStore;
1428
- if (isDirectFile && mediaElementTracksStore !== null) {
1429
- return mediaElementTracksStore.disableVideoTrack();
1748
+ var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, isDirectFile = _a.isDirectFile, trackChoiceManager = _a.trackChoiceManager, mediaElementTrackChoiceManager = _a.mediaElementTrackChoiceManager;
1749
+ if (isDirectFile && mediaElementTrackChoiceManager !== null) {
1750
+ return mediaElementTrackChoiceManager.disableVideoTrack();
1430
1751
  }
1431
- return this._priv_callTracksStoreGetterSetter(periodId, undefined, function (tcm, periodRef) { return tcm.disableTrack(periodRef, "video"); });
1432
- };
1433
- Player.prototype.lockVideoRepresentations = function (arg) {
1434
- if (this._priv_contentInfos === null) {
1435
- throw new Error("No content loaded");
1436
- }
1437
- var isDirectFile = this._priv_contentInfos.isDirectFile;
1438
- if (isDirectFile) {
1439
- throw new Error("Cannot lock video Representations in directfile mode.");
1440
- }
1441
- var repsId;
1442
- var periodId;
1443
- var switchingMode;
1444
- if (Array.isArray(arg)) {
1445
- repsId = arg;
1446
- periodId = undefined;
1447
- }
1448
- else {
1449
- repsId = arg.representations;
1450
- periodId = arg.periodId;
1451
- switchingMode = arg.switchingMode;
1752
+ if (trackChoiceManager === null || currentPeriod === null) {
1753
+ return;
1452
1754
  }
1453
- return this._priv_callTracksStoreGetterSetter(periodId, undefined, function (tcm, periodRef) {
1454
- return tcm.lockVideoRepresentations(periodRef, { representations: repsId, switchingMode: switchingMode });
1455
- });
1755
+ return trackChoiceManager.disableVideoTrack(currentPeriod);
1456
1756
  };
1457
- Player.prototype.lockAudioRepresentations = function (arg) {
1458
- if (this._priv_contentInfos === null) {
1459
- throw new Error("No content loaded");
1460
- }
1461
- var isDirectFile = this._priv_contentInfos.isDirectFile;
1462
- if (isDirectFile) {
1463
- throw new Error("Cannot lock audio Representations in directfile mode.");
1757
+ /**
1758
+ * Returns the current list of preferred audio tracks, in preference order.
1759
+ * @returns {Array.<Object>}
1760
+ */
1761
+ Player.prototype.getPreferredAudioTracks = function () {
1762
+ return this._priv_preferredAudioTracks;
1763
+ };
1764
+ /**
1765
+ * Returns the current list of preferred text tracks, in preference order.
1766
+ * @returns {Array.<Object>}
1767
+ */
1768
+ Player.prototype.getPreferredTextTracks = function () {
1769
+ return this._priv_preferredTextTracks;
1770
+ };
1771
+ /**
1772
+ * Returns the current list of preferred text tracks, in preference order.
1773
+ * @returns {Array.<Object>}
1774
+ */
1775
+ Player.prototype.getPreferredVideoTracks = function () {
1776
+ return this._priv_preferredVideoTracks;
1777
+ };
1778
+ /**
1779
+ * Set the list of preferred audio tracks, in preference order.
1780
+ * @param {Array.<Object>} tracks
1781
+ * @param {boolean} shouldApply - `true` if those preferences should be
1782
+ * applied on the currently loaded Period. `false` if it should only
1783
+ * be applied to new content.
1784
+ */
1785
+ Player.prototype.setPreferredAudioTracks = function (tracks, shouldApply) {
1786
+ if (shouldApply === void 0) { shouldApply = false; }
1787
+ if (!Array.isArray(tracks)) {
1788
+ throw new Error("Invalid `setPreferredAudioTracks` argument. " +
1789
+ "Should have been an Array.");
1464
1790
  }
1465
- var repsId;
1466
- var periodId;
1467
- var switchingMode;
1468
- if (Array.isArray(arg)) {
1469
- repsId = arg;
1470
- periodId = undefined;
1791
+ this._priv_preferredAudioTracks = tracks;
1792
+ var contentInfos = this._priv_contentInfos;
1793
+ if (!isNullOrUndefined(contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.trackChoiceManager)) {
1794
+ contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.trackChoiceManager.setPreferredAudioTracks(tracks, shouldApply);
1471
1795
  }
1472
- else {
1473
- repsId = arg.representations;
1474
- periodId = arg.periodId;
1475
- switchingMode = arg.switchingMode;
1796
+ else if (!isNullOrUndefined(contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.mediaElementTrackChoiceManager)) {
1797
+ contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.mediaElementTrackChoiceManager.setPreferredAudioTracks(tracks, shouldApply);
1476
1798
  }
1477
- return this._priv_callTracksStoreGetterSetter(periodId, undefined, function (tcm, periodRef) {
1478
- return tcm.lockAudioRepresentations(periodRef, { representations: repsId, switchingMode: switchingMode });
1479
- });
1480
1799
  };
1481
- Player.prototype.getLockedVideoRepresentations = function (periodId) {
1482
- if (this._priv_contentInfos === null) {
1483
- return null;
1484
- }
1485
- var isDirectFile = this._priv_contentInfos.isDirectFile;
1486
- if (isDirectFile) {
1487
- return null;
1800
+ /**
1801
+ * Set the list of preferred text tracks, in preference order.
1802
+ * @param {Array.<Object>} tracks
1803
+ * @param {boolean} shouldApply - `true` if those preferences should be
1804
+ * applied on the currently loaded Periods. `false` if it should only
1805
+ * be applied to new content.
1806
+ */
1807
+ Player.prototype.setPreferredTextTracks = function (tracks, shouldApply) {
1808
+ if (shouldApply === void 0) { shouldApply = false; }
1809
+ if (!Array.isArray(tracks)) {
1810
+ throw new Error("Invalid `setPreferredTextTracks` argument. " +
1811
+ "Should have been an Array.");
1488
1812
  }
1489
- return this._priv_callTracksStoreGetterSetter(periodId, null, function (tcm, periodRef) { return tcm.getLockedVideoRepresentations(periodRef); });
1490
- };
1491
- Player.prototype.getLockedAudioRepresentations = function (periodId) {
1492
- if (this._priv_contentInfos === null) {
1493
- return null;
1813
+ this._priv_preferredTextTracks = tracks;
1814
+ var contentInfos = this._priv_contentInfos;
1815
+ if (!isNullOrUndefined(contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.trackChoiceManager)) {
1816
+ contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.trackChoiceManager.setPreferredTextTracks(tracks, shouldApply);
1494
1817
  }
1495
- var isDirectFile = this._priv_contentInfos.isDirectFile;
1496
- if (isDirectFile) {
1497
- return null;
1818
+ else if (!isNullOrUndefined(contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.mediaElementTrackChoiceManager)) {
1819
+ contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.mediaElementTrackChoiceManager.setPreferredTextTracks(tracks, shouldApply);
1498
1820
  }
1499
- return this._priv_callTracksStoreGetterSetter(periodId, null, function (tcm, periodRef) { return tcm.getLockedAudioRepresentations(periodRef); });
1500
1821
  };
1501
- Player.prototype.unlockVideoRepresentations = function (periodId) {
1502
- if (this._priv_contentInfos === null) {
1503
- return;
1822
+ /**
1823
+ * Set the list of preferred text tracks, in preference order.
1824
+ * @param {Array.<Object>} tracks
1825
+ * @param {boolean} shouldApply - `true` if those preferences should be
1826
+ * applied on the currently loaded Period. `false` if it should only
1827
+ * be applied to new content.
1828
+ */
1829
+ Player.prototype.setPreferredVideoTracks = function (tracks, shouldApply) {
1830
+ if (shouldApply === void 0) { shouldApply = false; }
1831
+ if (!Array.isArray(tracks)) {
1832
+ throw new Error("Invalid `setPreferredVideoTracks` argument. " +
1833
+ "Should have been an Array.");
1504
1834
  }
1505
- var isDirectFile = this._priv_contentInfos.isDirectFile;
1506
- if (isDirectFile) {
1507
- return;
1835
+ this._priv_preferredVideoTracks = tracks;
1836
+ var contentInfos = this._priv_contentInfos;
1837
+ if (!isNullOrUndefined(contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.trackChoiceManager)) {
1838
+ contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.trackChoiceManager.setPreferredVideoTracks(tracks, shouldApply);
1839
+ }
1840
+ else if (!isNullOrUndefined(contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.mediaElementTrackChoiceManager)) {
1841
+ contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.mediaElementTrackChoiceManager.setPreferredVideoTracks(tracks, shouldApply);
1508
1842
  }
1509
- return this._priv_callTracksStoreGetterSetter(periodId, undefined, function (tcm, periodRef) { return tcm.unlockVideoRepresentations(periodRef); });
1510
1843
  };
1511
- Player.prototype.unlockAudioRepresentations = function (periodId) {
1844
+ /**
1845
+ * @returns {Array.<Object>|null}
1846
+ * @deprecated
1847
+ */
1848
+ Player.prototype.getImageTrackData = function () {
1849
+ warnOnce("`getImageTrackData` is deprecated." +
1850
+ "Please use the `parseBifThumbnails` tool instead.");
1512
1851
  if (this._priv_contentInfos === null) {
1513
- return;
1514
- }
1515
- var isDirectFile = this._priv_contentInfos.isDirectFile;
1516
- if (isDirectFile) {
1517
- return;
1852
+ return null;
1518
1853
  }
1519
- return this._priv_callTracksStoreGetterSetter(periodId, undefined, function (tcm, periodRef) { return tcm.unlockAudioRepresentations(periodRef); });
1854
+ /* eslint-disable import/no-deprecated */
1855
+ return this._priv_contentInfos.thumbnails;
1856
+ /* eslint-enable import/no-deprecated */
1520
1857
  };
1521
1858
  /**
1522
1859
  * Get minimum seek-able position.
@@ -1558,12 +1895,6 @@ var Player = /** @class */ (function (_super) {
1558
1895
  }
1559
1896
  return null;
1560
1897
  };
1561
- // ---- Undocumented Private methods. ----
1562
- //
1563
- // Those methods are just here either to allow some tools relying on the
1564
- // RxPlayer instance to work or to improve the RxPlayer's demo.
1565
- //
1566
- // They should not be used by any external code.
1567
1898
  /**
1568
1899
  * /!\ For demo use only! Do not touch!
1569
1900
  *
@@ -1585,58 +1916,16 @@ var Player = /** @class */ (function (_super) {
1585
1916
  }
1586
1917
  return null;
1587
1918
  };
1588
- /**
1589
- * /!\ For tools use only! Do not touch!
1590
- *
1591
- * Returns manifest/playlist object.
1592
- * null if the player is STOPPED.
1593
- * @returns {Manifest|null} - The current Manifest (`null` when not known).
1594
- */
1595
- // TODO remove the need for that public method
1596
- Player.prototype.__priv_getManifest = function () {
1597
- if (this._priv_contentInfos === null) {
1598
- return null;
1599
- }
1600
- return this._priv_contentInfos.manifest;
1601
- };
1602
- // TODO remove the need for that public method
1603
- Player.prototype.__priv_getCurrentAdaptation = function () {
1604
- if (this._priv_contentInfos === null) {
1605
- return null;
1606
- }
1607
- var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, activeAdaptations = _a.activeAdaptations;
1608
- if (currentPeriod === null ||
1609
- activeAdaptations === null ||
1610
- isNullOrUndefined(activeAdaptations[currentPeriod.id])) {
1611
- return null;
1612
- }
1613
- return activeAdaptations[currentPeriod.id];
1614
- };
1615
- // TODO remove the need for that public method
1616
- Player.prototype.__priv_getCurrentRepresentations = function () {
1617
- if (this._priv_contentInfos === null) {
1618
- return null;
1619
- }
1620
- var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, activeRepresentations = _a.activeRepresentations;
1621
- if (currentPeriod === null ||
1622
- activeRepresentations === null ||
1623
- isNullOrUndefined(activeRepresentations[currentPeriod.id])) {
1624
- return null;
1625
- }
1626
- return activeRepresentations[currentPeriod.id];
1627
- };
1628
- // ---- Private methods ----
1629
1919
  /**
1630
1920
  * Reset all state properties relative to a playing content.
1631
1921
  */
1632
1922
  Player.prototype._priv_cleanUpCurrentContentState = function () {
1633
1923
  var _this = this;
1634
- var _a, _b, _c, _d;
1924
+ var _a, _b;
1635
1925
  log.debug("Locking `contentLock` to clean-up the current content.");
1636
1926
  // lock playback of new contents while cleaning up is pending
1637
1927
  this._priv_contentLock.setValue(true);
1638
- (_b = (_a = this._priv_contentInfos) === null || _a === void 0 ? void 0 : _a.tracksStore) === null || _b === void 0 ? void 0 : _b.dispose();
1639
- (_d = (_c = this._priv_contentInfos) === null || _c === void 0 ? void 0 : _c.mediaElementTracksStore) === null || _d === void 0 ? void 0 : _d.dispose();
1928
+ (_b = (_a = this._priv_contentInfos) === null || _a === void 0 ? void 0 : _a.mediaElementTrackChoiceManager) === null || _b === void 0 ? void 0 : _b.dispose();
1640
1929
  this._priv_contentInfos = null;
1641
1930
  this._priv_contentEventsMemory = {};
1642
1931
  // DRM-related clean-up
@@ -1676,29 +1965,29 @@ var Player = /** @class */ (function (_super) {
1676
1965
  contentInfos.manifest = manifest;
1677
1966
  var cancelSignal = contentInfos.currentContentCanceller.signal;
1678
1967
  this._priv_reloadingMetadata.manifest = manifest;
1679
- contentInfos.tracksStore = new TracksStore({
1968
+ var initialAudioTrack = contentInfos.initialAudioTrack, initialTextTrack = contentInfos.initialTextTrack;
1969
+ contentInfos.trackChoiceManager = new TrackChoiceManager({
1680
1970
  preferTrickModeTracks: this._priv_preferTrickModeTracks,
1681
- defaultAudioTrackSwitchingMode: contentInfos.defaultAudioTrackSwitchingMode,
1682
- });
1683
- contentInfos.tracksStore.addEventListener("newAvailablePeriods", function (p) {
1684
- _this.trigger("newAvailablePeriods", p);
1685
1971
  });
1686
- contentInfos.tracksStore.addEventListener("brokenRepresentationsLock", function (e) {
1687
- _this.trigger("brokenRepresentationsLock", e);
1688
- });
1689
- contentInfos.tracksStore.addEventListener("trackUpdate", function (e) {
1690
- _this.trigger("trackUpdate", e);
1691
- });
1692
- contentInfos.tracksStore.updatePeriodList(manifest);
1972
+ var preferredAudioTracks = initialAudioTrack === undefined ?
1973
+ this._priv_preferredAudioTracks :
1974
+ [initialAudioTrack];
1975
+ contentInfos.trackChoiceManager.setPreferredAudioTracks(preferredAudioTracks, true);
1976
+ var preferredTextTracks = initialTextTrack === undefined ?
1977
+ this._priv_preferredTextTracks :
1978
+ [initialTextTrack];
1979
+ contentInfos.trackChoiceManager.setPreferredTextTracks(preferredTextTracks, true);
1980
+ contentInfos.trackChoiceManager
1981
+ .setPreferredVideoTracks(this._priv_preferredVideoTracks, true);
1693
1982
  manifest.addEventListener("manifestUpdate", function (updates) {
1694
1983
  var _a, _b, _c;
1695
1984
  // Update the tracks chosen if it changed
1696
- if (!isNullOrUndefined(contentInfos === null || contentInfos === void 0 ? void 0 : contentInfos.tracksStore)) {
1697
- contentInfos.tracksStore.updatePeriodList(manifest);
1985
+ if (contentInfos.trackChoiceManager !== null) {
1986
+ contentInfos.trackChoiceManager.update();
1698
1987
  }
1699
1988
  var currentPeriod = (_b = (_a = _this._priv_contentInfos) === null || _a === void 0 ? void 0 : _a.currentPeriod) !== null && _b !== void 0 ? _b : undefined;
1700
- var tracksStore = (_c = _this._priv_contentInfos) === null || _c === void 0 ? void 0 : _c.tracksStore;
1701
- if (currentPeriod === undefined || isNullOrUndefined(tracksStore)) {
1989
+ var trackChoiceManager = (_c = _this._priv_contentInfos) === null || _c === void 0 ? void 0 : _c.trackChoiceManager;
1990
+ if (currentPeriod === undefined || isNullOrUndefined(trackChoiceManager)) {
1702
1991
  return;
1703
1992
  }
1704
1993
  for (var _i = 0, _d = updates.updatedPeriods; _i < _d.length; _i++) {
@@ -1707,15 +1996,11 @@ var Player = /** @class */ (function (_super) {
1707
1996
  if (update.result.addedAdaptations.length > 0 ||
1708
1997
  update.result.removedAdaptations.length > 0) {
1709
1998
  // We might have new (or less) tracks, send events just to be sure
1710
- var periodRef = tracksStore.getPeriodObjectFromPeriod(currentPeriod);
1711
- if (periodRef === undefined) {
1712
- return;
1713
- }
1714
- var audioTracks = tracksStore.getAvailableAudioTracks(periodRef);
1999
+ var audioTracks = trackChoiceManager.getAvailableAudioTracks(currentPeriod);
1715
2000
  _this._priv_triggerEventIfNotStopped("availableAudioTracksChange", audioTracks !== null && audioTracks !== void 0 ? audioTracks : [], cancelSignal);
1716
- var textTracks = tracksStore.getAvailableTextTracks(periodRef);
2001
+ var textTracks = trackChoiceManager.getAvailableTextTracks(currentPeriod);
1717
2002
  _this._priv_triggerEventIfNotStopped("availableTextTracksChange", textTracks !== null && textTracks !== void 0 ? textTracks : [], cancelSignal);
1718
- var videoTracks = tracksStore.getAvailableVideoTracks(periodRef);
2003
+ var videoTracks = trackChoiceManager.getAvailableVideoTracks(currentPeriod);
1719
2004
  _this._priv_triggerEventIfNotStopped("availableVideoTracksChange", videoTracks !== null && videoTracks !== void 0 ? videoTracks : [], cancelSignal);
1720
2005
  }
1721
2006
  }
@@ -1731,7 +2016,7 @@ var Player = /** @class */ (function (_super) {
1731
2016
  * @param {Object} periodInfo
1732
2017
  */
1733
2018
  Player.prototype._priv_onActivePeriodChanged = function (contentInfos, _a) {
1734
- var _b, _c, _d, _e, _f, _g;
2019
+ var _b, _c, _d, _e, _f, _g, _h, _j;
1735
2020
  var period = _a.period;
1736
2021
  if (contentInfos.contentId !== ((_b = this._priv_contentInfos) === null || _b === void 0 ? void 0 : _b.contentId)) {
1737
2022
  return; // Event for another content
@@ -1740,35 +2025,41 @@ var Player = /** @class */ (function (_super) {
1740
2025
  var cancelSignal = contentInfos.currentContentCanceller.signal;
1741
2026
  if (this._priv_contentEventsMemory.periodChange !== period) {
1742
2027
  this._priv_contentEventsMemory.periodChange = period;
1743
- this._priv_triggerEventIfNotStopped("periodChange", { start: period.start,
1744
- end: period.end,
1745
- id: period.id }, cancelSignal);
2028
+ this._priv_triggerEventIfNotStopped("periodChange", period, cancelSignal);
1746
2029
  }
1747
2030
  this._priv_triggerEventIfNotStopped("availableAudioTracksChange", this.getAvailableAudioTracks(), cancelSignal);
1748
2031
  this._priv_triggerEventIfNotStopped("availableTextTracksChange", this.getAvailableTextTracks(), cancelSignal);
1749
2032
  this._priv_triggerEventIfNotStopped("availableVideoTracksChange", this.getAvailableVideoTracks(), cancelSignal);
1750
- var tracksStore = (_c = this._priv_contentInfos) === null || _c === void 0 ? void 0 : _c.tracksStore;
1751
- // Emit initial events for the Period
1752
- if (!isNullOrUndefined(tracksStore)) {
1753
- var periodRef = tracksStore.getPeriodObjectFromPeriod(period);
1754
- if (periodRef) {
1755
- var audioTrack = tracksStore.getChosenAudioTrack(periodRef);
1756
- this._priv_triggerEventIfNotStopped("audioTrackChange", audioTrack, cancelSignal);
1757
- var textTrack = tracksStore.getChosenTextTrack(periodRef);
1758
- this._priv_triggerEventIfNotStopped("textTrackChange", textTrack, cancelSignal);
1759
- var videoTrack = tracksStore.getChosenVideoTrack(periodRef);
1760
- this._priv_triggerEventIfNotStopped("videoTrackChange", videoTrack, cancelSignal);
1761
- }
2033
+ var trackChoiceManager = (_c = this._priv_contentInfos) === null || _c === void 0 ? void 0 : _c.trackChoiceManager;
2034
+ // Emit intial events for the Period
2035
+ if (!isNullOrUndefined(trackChoiceManager)) {
2036
+ var audioTrack = trackChoiceManager.getChosenAudioTrack(period);
2037
+ this._priv_triggerEventIfNotStopped("audioTrackChange", audioTrack, cancelSignal);
2038
+ var textTrack = trackChoiceManager.getChosenTextTrack(period);
2039
+ this._priv_triggerEventIfNotStopped("textTrackChange", textTrack, cancelSignal);
2040
+ var videoTrack = trackChoiceManager.getChosenVideoTrack(period);
2041
+ this._priv_triggerEventIfNotStopped("videoTrackChange", videoTrack, cancelSignal);
1762
2042
  }
1763
2043
  else {
1764
2044
  this._priv_triggerEventIfNotStopped("audioTrackChange", null, cancelSignal);
1765
2045
  this._priv_triggerEventIfNotStopped("textTrackChange", null, cancelSignal);
1766
2046
  this._priv_triggerEventIfNotStopped("videoTrackChange", null, cancelSignal);
1767
2047
  }
1768
- var audioRepresentation = (_e = (_d = this.__priv_getCurrentRepresentations()) === null || _d === void 0 ? void 0 : _d.audio) !== null && _e !== void 0 ? _e : null;
1769
- this._priv_triggerEventIfNotStopped("audioRepresentationChange", audioRepresentation, cancelSignal);
1770
- var videoRepresentation = (_g = (_f = this.__priv_getCurrentRepresentations()) === null || _f === void 0 ? void 0 : _f.video) !== null && _g !== void 0 ? _g : null;
1771
- this._priv_triggerEventIfNotStopped("videoRepresentationChange", videoRepresentation, cancelSignal);
2048
+ this._priv_triggerAvailableBitratesChangeEvent("availableAudioBitratesChange", this.getAvailableAudioBitrates(), cancelSignal);
2049
+ if (contentInfos.currentContentCanceller.isUsed()) {
2050
+ return;
2051
+ }
2052
+ this._priv_triggerAvailableBitratesChangeEvent("availableVideoBitratesChange", this.getAvailableVideoBitrates(), cancelSignal);
2053
+ if (contentInfos.currentContentCanceller.isUsed()) {
2054
+ return;
2055
+ }
2056
+ var audioBitrate = (_f = (_e = (_d = this._priv_getCurrentRepresentations()) === null || _d === void 0 ? void 0 : _d.audio) === null || _e === void 0 ? void 0 : _e.bitrate) !== null && _f !== void 0 ? _f : -1;
2057
+ this._priv_triggerCurrentBitrateChangeEvent("audioBitrateChange", audioBitrate, cancelSignal);
2058
+ if (contentInfos.currentContentCanceller.isUsed()) {
2059
+ return;
2060
+ }
2061
+ var videoBitrate = (_j = (_h = (_g = this._priv_getCurrentRepresentations()) === null || _g === void 0 ? void 0 : _g.video) === null || _h === void 0 ? void 0 : _h.bitrate) !== null && _j !== void 0 ? _j : -1;
2062
+ this._priv_triggerCurrentBitrateChangeEvent("videoBitrateChange", videoBitrate, cancelSignal);
1772
2063
  };
1773
2064
  /**
1774
2065
  * Triggered each times a new "PeriodStream" is ready.
@@ -1781,22 +2072,48 @@ var Player = /** @class */ (function (_super) {
1781
2072
  if (contentInfos.contentId !== ((_a = this._priv_contentInfos) === null || _a === void 0 ? void 0 : _a.contentId)) {
1782
2073
  return; // Event for another content
1783
2074
  }
1784
- var type = value.type, manifest = value.manifest, period = value.period, adaptationRef = value.adaptationRef;
1785
- var tracksStore = contentInfos.tracksStore;
2075
+ var type = value.type, period = value.period, adaptationRef = value.adaptationRef;
2076
+ var trackChoiceManager = contentInfos.trackChoiceManager;
1786
2077
  switch (type) {
1787
2078
  case "video":
2079
+ if (isNullOrUndefined(trackChoiceManager)) {
2080
+ log.error("API: TrackChoiceManager not instanciated for a new video period");
2081
+ adaptationRef.setValue(null);
2082
+ }
2083
+ else {
2084
+ trackChoiceManager.addPeriod(type, period, adaptationRef);
2085
+ trackChoiceManager.setInitialVideoTrack(period);
2086
+ }
2087
+ break;
1788
2088
  case "audio":
2089
+ if (isNullOrUndefined(trackChoiceManager)) {
2090
+ log.error("API: TrackChoiceManager not instanciated for a new ".concat(type, " period"));
2091
+ adaptationRef.setValue(null);
2092
+ }
2093
+ else {
2094
+ trackChoiceManager.addPeriod(type, period, adaptationRef);
2095
+ trackChoiceManager.setInitialAudioTrack(period);
2096
+ }
2097
+ break;
1789
2098
  case "text":
1790
- if (isNullOrUndefined(tracksStore)) {
1791
- log.error("API: TracksStore not instanciated for a new ".concat(type, " period"));
2099
+ if (isNullOrUndefined(trackChoiceManager)) {
2100
+ log.error("API: TrackChoiceManager not instanciated for a new ".concat(type, " period"));
1792
2101
  adaptationRef.setValue(null);
1793
2102
  }
1794
2103
  else {
1795
- tracksStore.addTrackReference(type, manifest, period, adaptationRef);
2104
+ trackChoiceManager.addPeriod(type, period, adaptationRef);
2105
+ trackChoiceManager.setInitialTextTrack(period);
1796
2106
  }
1797
2107
  break;
1798
2108
  default:
1799
- assertUnreachable(type);
2109
+ var adaptations = period.adaptations[type];
2110
+ if (!isNullOrUndefined(adaptations) && adaptations.length > 0) {
2111
+ adaptationRef.setValue(adaptations[0]);
2112
+ }
2113
+ else {
2114
+ adaptationRef.setValue(null);
2115
+ }
2116
+ break;
1800
2117
  }
1801
2118
  };
1802
2119
  /**
@@ -1810,14 +2127,14 @@ var Player = /** @class */ (function (_super) {
1810
2127
  return; // Event for another content
1811
2128
  }
1812
2129
  var type = value.type, period = value.period;
1813
- var tracksStore = contentInfos.tracksStore;
1814
- // Clean-up track choices from TracksStore
2130
+ var trackChoiceManager = contentInfos.trackChoiceManager;
2131
+ // Clean-up track choice from TrackChoiceManager
1815
2132
  switch (type) {
1816
2133
  case "audio":
1817
2134
  case "text":
1818
2135
  case "video":
1819
- if (!isNullOrUndefined(tracksStore)) {
1820
- tracksStore.removeTrackReference(type, period);
2136
+ if (!isNullOrUndefined(trackChoiceManager)) {
2137
+ trackChoiceManager.removePeriod(type, period);
1821
2138
  }
1822
2139
  break;
1823
2140
  }
@@ -1866,27 +2183,27 @@ var Player = /** @class */ (function (_super) {
1866
2183
  else {
1867
2184
  activePeriodAdaptations[type] = adaptation;
1868
2185
  }
1869
- var tracksStore = contentInfos.tracksStore;
2186
+ var trackChoiceManager = contentInfos.trackChoiceManager;
1870
2187
  var cancelSignal = contentInfos.currentContentCanceller.signal;
1871
- if (tracksStore !== null &&
2188
+ if (trackChoiceManager !== null &&
1872
2189
  currentPeriod !== null && !isNullOrUndefined(period) &&
1873
2190
  period.id === currentPeriod.id) {
1874
- var periodRef = tracksStore.getPeriodObjectFromPeriod(period);
1875
- if (periodRef === undefined) {
1876
- return;
1877
- }
1878
2191
  switch (type) {
1879
2192
  case "audio":
1880
- var audioTrack = tracksStore.getChosenAudioTrack(periodRef);
2193
+ var audioTrack = trackChoiceManager.getChosenAudioTrack(currentPeriod);
1881
2194
  this._priv_triggerEventIfNotStopped("audioTrackChange", audioTrack, cancelSignal);
2195
+ var availableAudioBitrates = this.getAvailableAudioBitrates();
2196
+ this._priv_triggerAvailableBitratesChangeEvent("availableAudioBitratesChange", availableAudioBitrates, cancelSignal);
1882
2197
  break;
1883
2198
  case "text":
1884
- var textTrack = tracksStore.getChosenTextTrack(periodRef);
2199
+ var textTrack = trackChoiceManager.getChosenTextTrack(currentPeriod);
1885
2200
  this._priv_triggerEventIfNotStopped("textTrackChange", textTrack, cancelSignal);
1886
2201
  break;
1887
2202
  case "video":
1888
- var videoTrack = tracksStore.getChosenVideoTrack(periodRef);
2203
+ var videoTrack = trackChoiceManager.getChosenVideoTrack(currentPeriod);
1889
2204
  this._priv_triggerEventIfNotStopped("videoTrackChange", videoTrack, cancelSignal);
2205
+ var availableVideoBitrates = this.getAvailableVideoBitrates();
2206
+ this._priv_triggerAvailableBitratesChangeEvent("availableVideoBitratesChange", availableVideoBitrates, cancelSignal);
1890
2207
  break;
1891
2208
  }
1892
2209
  }
@@ -1901,7 +2218,7 @@ var Player = /** @class */ (function (_super) {
1901
2218
  */
1902
2219
  Player.prototype._priv_onRepresentationChange = function (contentInfos, _a) {
1903
2220
  var _b;
1904
- var _c;
2221
+ var _c, _d;
1905
2222
  var type = _a.type, period = _a.period, representation = _a.representation;
1906
2223
  if (contentInfos.contentId !== ((_c = this._priv_contentInfos) === null || _c === void 0 ? void 0 : _c.contentId)) {
1907
2224
  return; // Event for another content
@@ -1918,15 +2235,16 @@ var Player = /** @class */ (function (_super) {
1918
2235
  else {
1919
2236
  activePeriodRepresentations[type] = representation;
1920
2237
  }
2238
+ var bitrate = (_d = representation === null || representation === void 0 ? void 0 : representation.bitrate) !== null && _d !== void 0 ? _d : -1;
1921
2239
  if (!isNullOrUndefined(period) &&
1922
2240
  currentPeriod !== null &&
1923
2241
  currentPeriod.id === period.id) {
1924
2242
  var cancelSignal = this._priv_contentInfos.currentContentCanceller.signal;
1925
2243
  if (type === "video") {
1926
- this._priv_triggerEventIfNotStopped("videoRepresentationChange", representation, cancelSignal);
2244
+ this._priv_triggerCurrentBitrateChangeEvent("videoBitrateChange", bitrate, cancelSignal);
1927
2245
  }
1928
2246
  else if (type === "audio") {
1929
- this._priv_triggerEventIfNotStopped("audioRepresentationChange", representation, cancelSignal);
2247
+ this._priv_triggerCurrentBitrateChangeEvent("audioBitrateChange", bitrate, cancelSignal);
1930
2248
  }
1931
2249
  }
1932
2250
  };
@@ -1937,14 +2255,22 @@ var Player = /** @class */ (function (_super) {
1937
2255
  *
1938
2256
  * @param {Object} value
1939
2257
  */
1940
- Player.prototype._priv_onBitrateEstimateChange = function (_a) {
2258
+ Player.prototype._priv_onBitrateEstimationChange = function (_a) {
1941
2259
  var type = _a.type, bitrate = _a.bitrate;
1942
2260
  if (bitrate !== undefined) {
1943
2261
  this._priv_bitrateInfos.lastBitrates[type] = bitrate;
1944
2262
  }
1945
- // !!! undocumented API :O !!!
1946
- /* eslint-disable-next-line */
1947
- this.trigger("__priv_bitrateEstimateChange", { type: type, bitrate: bitrate });
2263
+ this.trigger("bitrateEstimationChange", { type: type, bitrate: bitrate });
2264
+ };
2265
+ /**
2266
+ * Triggered each time a textTrack is added to the video DOM Element.
2267
+ *
2268
+ * Trigger the right Player Event.
2269
+ *
2270
+ * @param {Array.<TextTrackElement>} tracks
2271
+ */
2272
+ Player.prototype._priv_onNativeTextTracksNext = function (tracks) {
2273
+ this.trigger("nativeTextTracksChange", tracks);
1948
2274
  };
1949
2275
  /**
1950
2276
  * Triggered each time the player state updates.
@@ -1983,7 +2309,7 @@ var Player = /** @class */ (function (_super) {
1983
2309
  position: observation.position,
1984
2310
  duration: observation.duration,
1985
2311
  playbackRate: observation.playbackRate,
1986
- maximumPosition: maximumPosition,
2312
+ maximumBufferTime: maximumPosition,
1987
2313
  // TODO bufferGap may be undefined
1988
2314
  bufferGap: observation.bufferGap === undefined ||
1989
2315
  !isFinite(observation.bufferGap) ?
@@ -2008,6 +2334,47 @@ var Player = /** @class */ (function (_super) {
2008
2334
  }
2009
2335
  this.trigger("positionUpdate", positionData);
2010
2336
  };
2337
+ /**
2338
+ * Trigger one of the "availableBitratesChange" event only if it changed from
2339
+ * the previously stored value.
2340
+ * @param {string} event
2341
+ * @param {Array.<number>} newVal
2342
+ * @param {Object} currentContentCancelSignal
2343
+ */
2344
+ Player.prototype._priv_triggerAvailableBitratesChangeEvent = function (event, newVal, currentContentCancelSignal) {
2345
+ var prevVal = this._priv_contentEventsMemory[event];
2346
+ if (!currentContentCancelSignal.isCancelled() &&
2347
+ (prevVal === undefined || !areArraysOfNumbersEqual(newVal, prevVal))) {
2348
+ this._priv_contentEventsMemory[event] = newVal;
2349
+ this.trigger(event, newVal);
2350
+ }
2351
+ };
2352
+ /**
2353
+ * Trigger one of the "bitrateChange" event only if it changed from the
2354
+ * previously stored value.
2355
+ * @param {string} event
2356
+ * @param {number} newVal
2357
+ * @param {Object} currentContentCancelSignal
2358
+ */
2359
+ Player.prototype._priv_triggerCurrentBitrateChangeEvent = function (event, newVal, currentContentCancelSignal) {
2360
+ if (!currentContentCancelSignal.isCancelled() &&
2361
+ newVal !== this._priv_contentEventsMemory[event]) {
2362
+ this._priv_contentEventsMemory[event] = newVal;
2363
+ this.trigger(event, newVal);
2364
+ }
2365
+ };
2366
+ Player.prototype._priv_getCurrentRepresentations = function () {
2367
+ if (this._priv_contentInfos === null) {
2368
+ return null;
2369
+ }
2370
+ var _a = this._priv_contentInfos, currentPeriod = _a.currentPeriod, activeRepresentations = _a.activeRepresentations;
2371
+ if (currentPeriod === null ||
2372
+ activeRepresentations === null ||
2373
+ isNullOrUndefined(activeRepresentations[currentPeriod.id])) {
2374
+ return null;
2375
+ }
2376
+ return activeRepresentations[currentPeriod.id];
2377
+ };
2011
2378
  /**
2012
2379
  * @param {string} evt
2013
2380
  * @param {*} arg
@@ -2019,67 +2386,58 @@ var Player = /** @class */ (function (_super) {
2019
2386
  }
2020
2387
  };
2021
2388
  /**
2389
+ * @param {Object} defaultAudioTrack
2390
+ * @param {Object} defaultTextTrack
2022
2391
  * @param {Object} cancelSignal
2023
2392
  * @returns {Object}
2024
2393
  */
2025
- Player.prototype._priv_initializeMediaElementTracksStore = function (cancelSignal) {
2394
+ Player.prototype._priv_initializeMediaElementTrackChoiceManager = function (defaultAudioTrack, defaultTextTrack, cancelSignal) {
2026
2395
  var _this = this;
2027
2396
  var _a, _b, _c;
2028
- assert(features.directfile !== null, "Initializing `MediaElementTracksStore` without Directfile feature");
2029
- assert(this.videoElement !== null, "Initializing `MediaElementTracksStore` on a disposed RxPlayer");
2030
- var mediaElementTracksStore = new features.directfile.mediaElementTracksStore(this.videoElement);
2031
- this._priv_triggerEventIfNotStopped("availableAudioTracksChange", mediaElementTracksStore.getAvailableAudioTracks(), cancelSignal);
2032
- this._priv_triggerEventIfNotStopped("availableVideoTracksChange", mediaElementTracksStore.getAvailableVideoTracks(), cancelSignal);
2033
- this._priv_triggerEventIfNotStopped("availableTextTracksChange", mediaElementTracksStore.getAvailableTextTracks(), cancelSignal);
2034
- this._priv_triggerEventIfNotStopped("audioTrackChange", (_a = mediaElementTracksStore.getChosenAudioTrack()) !== null && _a !== void 0 ? _a : null, cancelSignal);
2035
- this._priv_triggerEventIfNotStopped("textTrackChange", (_b = mediaElementTracksStore.getChosenTextTrack()) !== null && _b !== void 0 ? _b : null, cancelSignal);
2036
- this._priv_triggerEventIfNotStopped("videoTrackChange", (_c = mediaElementTracksStore.getChosenVideoTrack()) !== null && _c !== void 0 ? _c : null, cancelSignal);
2037
- mediaElementTracksStore
2397
+ assert(features.directfile !== null, "Initializing `MediaElementTrackChoiceManager` without Directfile feature");
2398
+ assert(this.videoElement !== null, "Initializing `MediaElementTrackChoiceManager` on a disposed RxPlayer");
2399
+ var mediaElementTrackChoiceManager = new features.directfile.mediaElementTrackChoiceManager(this.videoElement);
2400
+ var preferredAudioTracks = defaultAudioTrack === undefined ?
2401
+ this._priv_preferredAudioTracks :
2402
+ [defaultAudioTrack];
2403
+ mediaElementTrackChoiceManager.setPreferredAudioTracks(preferredAudioTracks, true);
2404
+ var preferredTextTracks = defaultTextTrack === undefined ?
2405
+ this._priv_preferredTextTracks :
2406
+ [defaultTextTrack];
2407
+ mediaElementTrackChoiceManager.setPreferredTextTracks(preferredTextTracks, true);
2408
+ mediaElementTrackChoiceManager
2409
+ .setPreferredVideoTracks(this._priv_preferredVideoTracks, true);
2410
+ this._priv_triggerEventIfNotStopped("availableAudioTracksChange", mediaElementTrackChoiceManager.getAvailableAudioTracks(), cancelSignal);
2411
+ this._priv_triggerEventIfNotStopped("availableVideoTracksChange", mediaElementTrackChoiceManager.getAvailableVideoTracks(), cancelSignal);
2412
+ this._priv_triggerEventIfNotStopped("availableTextTracksChange", mediaElementTrackChoiceManager.getAvailableTextTracks(), cancelSignal);
2413
+ this._priv_triggerEventIfNotStopped("audioTrackChange", (_a = mediaElementTrackChoiceManager.getChosenAudioTrack()) !== null && _a !== void 0 ? _a : null, cancelSignal);
2414
+ this._priv_triggerEventIfNotStopped("textTrackChange", (_b = mediaElementTrackChoiceManager.getChosenTextTrack()) !== null && _b !== void 0 ? _b : null, cancelSignal);
2415
+ this._priv_triggerEventIfNotStopped("videoTrackChange", (_c = mediaElementTrackChoiceManager.getChosenVideoTrack()) !== null && _c !== void 0 ? _c : null, cancelSignal);
2416
+ mediaElementTrackChoiceManager
2038
2417
  .addEventListener("availableVideoTracksChange", function (val) {
2039
2418
  return _this.trigger("availableVideoTracksChange", val);
2040
2419
  });
2041
- mediaElementTracksStore
2420
+ mediaElementTrackChoiceManager
2042
2421
  .addEventListener("availableAudioTracksChange", function (val) {
2043
2422
  return _this.trigger("availableAudioTracksChange", val);
2044
2423
  });
2045
- mediaElementTracksStore
2424
+ mediaElementTrackChoiceManager
2046
2425
  .addEventListener("availableTextTracksChange", function (val) {
2047
2426
  return _this.trigger("availableTextTracksChange", val);
2048
2427
  });
2049
- mediaElementTracksStore
2428
+ mediaElementTrackChoiceManager
2050
2429
  .addEventListener("audioTrackChange", function (val) {
2051
2430
  return _this.trigger("audioTrackChange", val);
2052
2431
  });
2053
- mediaElementTracksStore
2432
+ mediaElementTrackChoiceManager
2054
2433
  .addEventListener("videoTrackChange", function (val) {
2055
2434
  return _this.trigger("videoTrackChange", val);
2056
2435
  });
2057
- mediaElementTracksStore
2436
+ mediaElementTrackChoiceManager
2058
2437
  .addEventListener("textTrackChange", function (val) {
2059
2438
  return _this.trigger("textTrackChange", val);
2060
2439
  });
2061
- return mediaElementTracksStore;
2062
- };
2063
- Player.prototype._priv_callTracksStoreGetterSetter = function (periodId, defaultValue, cb) {
2064
- var _a, _b;
2065
- if (this._priv_contentInfos === null ||
2066
- this._priv_contentInfos.tracksStore === null) {
2067
- log.warn("API: Trying to call track API too soon");
2068
- return defaultValue;
2069
- }
2070
- var tracksStore = this._priv_contentInfos.tracksStore;
2071
- var currentPeriod = (_b = (_a = this._priv_contentInfos) === null || _a === void 0 ? void 0 : _a.currentPeriod) !== null && _b !== void 0 ? _b : undefined;
2072
- var wantedPeriodId = periodId !== null && periodId !== void 0 ? periodId : currentPeriod === null || currentPeriod === void 0 ? void 0 : currentPeriod.id;
2073
- if (wantedPeriodId === undefined) {
2074
- return defaultValue;
2075
- }
2076
- var periodRef = wantedPeriodId === (currentPeriod === null || currentPeriod === void 0 ? void 0 : currentPeriod.id) ?
2077
- tracksStore.getPeriodObjectFromPeriod(currentPeriod) :
2078
- tracksStore.getPeriodObjectFromId(wantedPeriodId);
2079
- if (periodRef === undefined) {
2080
- return defaultValue;
2081
- }
2082
- return cb(tracksStore, periodRef);
2440
+ return mediaElementTrackChoiceManager;
2083
2441
  };
2084
2442
  return Player;
2085
2443
  }(EventEmitter));