rx-player 3.26.3-dev.2022021400 → 3.27.0-dev.20220317

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 (340) hide show
  1. package/CHANGELOG.md +15 -1
  2. package/FILES.md +5 -4
  3. package/VERSION +1 -1
  4. package/dist/_esm5.processed/compat/browser_detection.d.ts +4 -2
  5. package/dist/_esm5.processed/compat/browser_detection.js +4 -2
  6. package/dist/_esm5.processed/compat/eme/close_session.d.ts +11 -5
  7. package/dist/_esm5.processed/compat/eme/close_session.js +144 -36
  8. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.d.ts +3 -5
  9. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.js +21 -22
  10. package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +53 -34
  11. package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +43 -41
  12. package/dist/_esm5.processed/compat/eme/generate_key_request.d.ts +2 -3
  13. package/dist/_esm5.processed/compat/eme/generate_key_request.js +22 -26
  14. package/dist/_esm5.processed/compat/eme/load_session.d.ts +1 -2
  15. package/dist/_esm5.processed/compat/eme/load_session.js +68 -17
  16. package/dist/_esm5.processed/compat/event_listeners.js +2 -1
  17. package/dist/_esm5.processed/compat/should_favour_custom_safari_EME.js +2 -2
  18. package/dist/_esm5.processed/config.d.ts +166 -1080
  19. package/dist/_esm5.processed/config.js +17 -1119
  20. package/dist/_esm5.processed/core/abr/bandwidth_estimator.js +4 -1
  21. package/dist/_esm5.processed/core/abr/network_analyzer.js +2 -1
  22. package/dist/_esm5.processed/core/api/get_player_state.js +1 -1
  23. package/dist/_esm5.processed/core/api/index.d.ts +2 -1
  24. package/dist/_esm5.processed/core/api/media_element_track_choice_manager.js +2 -1
  25. package/dist/_esm5.processed/core/api/option_utils.d.ts +3 -1
  26. package/dist/_esm5.processed/core/api/option_utils.js +19 -6
  27. package/dist/_esm5.processed/core/api/playback_observer.js +5 -1
  28. package/dist/_esm5.processed/core/api/public_api.d.ts +82 -71
  29. package/dist/_esm5.processed/core/api/public_api.js +72 -33
  30. package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.d.ts +7 -49
  31. package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.js +25 -65
  32. package/dist/_esm5.processed/core/{eme → decrypt}/attach_media_keys.d.ts +12 -12
  33. package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +104 -0
  34. package/dist/_esm5.processed/core/{eme/clear_eme_session.d.ts → decrypt/clear_on_stop.d.ts} +3 -4
  35. package/dist/_esm5.processed/core/decrypt/clear_on_stop.js +41 -0
  36. package/dist/_esm5.processed/core/decrypt/content_decryptor.d.ts +216 -0
  37. package/dist/_esm5.processed/core/decrypt/content_decryptor.js +866 -0
  38. package/dist/_esm5.processed/core/{eme/get_session.d.ts → decrypt/create_or_load_session.d.ts} +28 -26
  39. package/dist/_esm5.processed/core/decrypt/create_or_load_session.js +124 -0
  40. package/dist/_esm5.processed/core/{eme → decrypt}/create_session.d.ts +22 -19
  41. package/dist/_esm5.processed/core/decrypt/create_session.js +174 -0
  42. package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.d.ts +21 -0
  43. package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.js +81 -0
  44. package/dist/_esm5.processed/core/{eme → decrypt}/find_key_system.d.ts +11 -14
  45. package/dist/_esm5.processed/core/decrypt/find_key_system.js +300 -0
  46. package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.d.ts +0 -0
  47. package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.js +1 -1
  48. package/dist/_esm5.processed/core/{eme → decrypt}/get_media_keys.d.ts +13 -5
  49. package/dist/_esm5.processed/core/decrypt/get_media_keys.js +153 -0
  50. package/dist/_esm5.processed/core/{eme → decrypt}/index.d.ts +5 -6
  51. package/dist/_esm5.processed/core/{eme → decrypt}/index.js +5 -5
  52. package/dist/_esm5.processed/core/{eme → decrypt}/init_media_keys.d.ts +6 -4
  53. package/dist/_esm5.processed/core/decrypt/init_media_keys.js +82 -0
  54. package/dist/_esm5.processed/core/decrypt/session_events_listener.d.ts +77 -0
  55. package/dist/_esm5.processed/core/{eme → decrypt}/session_events_listener.js +25 -24
  56. package/dist/_esm5.processed/core/{eme → decrypt}/set_server_certificate.d.ts +15 -6
  57. package/dist/_esm5.processed/core/decrypt/set_server_certificate.js +141 -0
  58. package/dist/_esm5.processed/core/{eme → decrypt}/types.d.ts +119 -241
  59. package/dist/_esm5.processed/core/{eme → decrypt}/types.js +0 -0
  60. package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.d.ts +3 -3
  61. package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.js +5 -5
  62. package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.d.ts +2 -2
  63. package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.js +4 -3
  64. package/dist/_esm5.processed/core/{eme/utils/close_session.d.ts → decrypt/utils/clean_old_loaded_sessions.d.ts} +8 -7
  65. package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +85 -0
  66. package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.d.ts +1 -1
  67. package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.js +2 -2
  68. package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.d.ts +0 -0
  69. package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.js +1 -1
  70. package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.d.ts +69 -0
  71. package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.js +99 -0
  72. package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.d.ts +0 -1
  73. package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.js +4 -5
  74. package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.d.ts +44 -0
  75. package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.js +77 -0
  76. package/dist/_esm5.processed/core/decrypt/utils/key_session_record.d.ts +104 -0
  77. package/dist/_esm5.processed/core/decrypt/utils/key_session_record.js +155 -0
  78. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.d.ts +108 -0
  79. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +303 -0
  80. package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.d.ts +4 -4
  81. package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.js +0 -0
  82. package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.d.ts +8 -18
  83. package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.js +119 -97
  84. package/dist/_esm5.processed/core/{eme/utils/init_data_container.d.ts → decrypt/utils/serializable_bytes.d.ts} +8 -5
  85. package/dist/_esm5.processed/core/{eme/utils/init_data_container.js → decrypt/utils/serializable_bytes.js} +9 -9
  86. package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.d.ts +1 -1
  87. package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.js +1 -1
  88. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +2 -2
  89. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +1 -1
  90. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +1 -1
  91. package/dist/_esm5.processed/core/init/get_initial_time.js +1 -1
  92. package/dist/_esm5.processed/core/init/initialize_directfile.d.ts +1 -1
  93. package/dist/_esm5.processed/core/init/initialize_directfile.js +11 -17
  94. package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +4 -2
  95. package/dist/_esm5.processed/core/init/initialize_media_source.js +18 -69
  96. package/dist/_esm5.processed/core/init/link_drm_and_content.d.ts +61 -0
  97. package/dist/_esm5.processed/core/init/link_drm_and_content.js +94 -0
  98. package/dist/_esm5.processed/core/init/manifest_update_scheduler.js +2 -1
  99. package/dist/_esm5.processed/core/init/stall_avoider.js +1 -1
  100. package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +1 -1
  101. package/dist/_esm5.processed/core/init/types.d.ts +2 -4
  102. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +1 -1
  103. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +3 -1
  104. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +17 -1
  105. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +22 -5
  106. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +2 -1
  107. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +6 -3
  108. package/dist/_esm5.processed/core/stream/events_generators.d.ts +8 -3
  109. package/dist/_esm5.processed/core/stream/events_generators.js +3 -2
  110. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +1 -0
  111. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +3 -3
  112. package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +2 -1
  113. package/dist/_esm5.processed/core/stream/period/get_adaptation_switch_strategy.js +1 -1
  114. package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +2 -1
  115. package/dist/_esm5.processed/core/stream/period/period_stream.js +3 -3
  116. package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +2 -2
  117. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.d.ts +6 -1
  118. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +12 -9
  119. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.d.ts +19 -14
  120. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.js +86 -10
  121. package/dist/_esm5.processed/core/stream/representation/get_segment_priority.js +1 -1
  122. package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +3 -3
  123. package/dist/_esm5.processed/core/stream/representation/representation_stream.d.ts +6 -0
  124. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +19 -8
  125. package/dist/_esm5.processed/core/stream/types.d.ts +1 -1
  126. package/dist/_esm5.processed/default_config.d.ts +1114 -0
  127. package/dist/_esm5.processed/default_config.js +1145 -0
  128. package/dist/_esm5.processed/experimental/index.d.ts +2 -0
  129. package/dist/_esm5.processed/experimental/index.js +2 -0
  130. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.d.ts +1 -0
  131. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +1 -1
  132. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.js +1 -2
  133. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.js +1 -2
  134. package/dist/_esm5.processed/features/features_object.js +1 -1
  135. package/dist/_esm5.processed/features/initialize_features.js +1 -1
  136. package/dist/_esm5.processed/features/list/eme.d.ts +3 -3
  137. package/dist/_esm5.processed/features/list/eme.js +5 -5
  138. package/dist/_esm5.processed/features/types.d.ts +3 -3
  139. package/dist/_esm5.processed/manifest/manifest.d.ts +1 -14
  140. package/dist/_esm5.processed/manifest/manifest.js +10 -74
  141. package/dist/_esm5.processed/manifest/representation.d.ts +35 -3
  142. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/is_period_fulfilled.js +1 -2
  143. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +1 -2
  144. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +1 -1
  145. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +87 -75
  146. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +1 -2
  147. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +1 -0
  148. package/dist/_esm5.processed/public_types.d.ts +2 -2
  149. package/dist/_esm5.processed/transports/dash/image_pipelines.js +3 -0
  150. package/dist/_esm5.processed/transports/dash/segment_parser.js +6 -3
  151. package/dist/_esm5.processed/transports/dash/text_parser.js +8 -2
  152. package/dist/_esm5.processed/transports/local/segment_parser.js +4 -1
  153. package/dist/_esm5.processed/transports/local/text_parser.js +8 -2
  154. package/dist/_esm5.processed/transports/smooth/pipelines.js +68 -10
  155. package/dist/_esm5.processed/transports/types.d.ts +22 -0
  156. package/dist/_esm5.processed/utils/deep_merge.d.ts +12 -0
  157. package/dist/_esm5.processed/utils/deep_merge.js +53 -0
  158. package/dist/_esm5.processed/utils/reference.d.ts +29 -0
  159. package/dist/_esm5.processed/utils/reference.js +72 -24
  160. package/dist/_esm5.processed/utils/request/fetch.js +1 -2
  161. package/dist/_esm5.processed/utils/request/xhr.js +1 -1
  162. package/dist/_esm5.processed/utils/rx-from_cancellable_promise.js +7 -2
  163. package/dist/_esm5.processed/utils/task_canceller.d.ts +5 -3
  164. package/dist/_esm5.processed/utils/task_canceller.js +3 -3
  165. package/dist/rx-player.js +5002 -3033
  166. package/dist/rx-player.min.js +1 -1
  167. package/dummy +1 -0
  168. package/{dist/_esm5.processed/core/eme/dispose_eme.d.ts → experimental/index.d.ts} +1 -4
  169. package/{dist/_esm5.processed/core/eme/dispose_media_keys.d.ts → experimental/index.js} +1 -6
  170. package/package.json +32 -34
  171. package/scripts/build/templates/experimental/index.d.ts +16 -0
  172. package/scripts/build/templates/experimental/index.js +16 -0
  173. package/sonar-project.properties +1 -1
  174. package/src/README.md +6 -6
  175. package/src/compat/__tests__/should_favour_custom_safari_EME.test.ts +45 -5
  176. package/src/compat/browser_detection.ts +4 -2
  177. package/src/compat/eme/close_session.ts +90 -56
  178. package/src/compat/eme/custom_media_keys/index.ts +21 -38
  179. package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +63 -46
  180. package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +51 -49
  181. package/src/compat/eme/generate_key_request.ts +25 -33
  182. package/src/compat/eme/load_session.ts +29 -31
  183. package/src/compat/event_listeners.ts +2 -1
  184. package/src/compat/should_favour_custom_safari_EME.ts +5 -2
  185. package/src/config.ts +17 -1210
  186. package/src/core/README.md +1 -1
  187. package/src/core/abr/bandwidth_estimator.ts +4 -4
  188. package/src/core/abr/network_analyzer.ts +5 -6
  189. package/src/core/api/__tests__/get_player_state.test.ts +3 -3
  190. package/src/core/api/__tests__/option_utils.test.ts +17 -17
  191. package/src/core/api/get_player_state.ts +1 -1
  192. package/src/core/api/index.ts +3 -0
  193. package/src/core/api/option_utils.ts +37 -20
  194. package/src/core/api/playback_observer.ts +12 -8
  195. package/src/core/api/public_api.ts +151 -111
  196. package/src/core/decrypt/README.md +22 -0
  197. package/src/core/decrypt/__tests__/__global__/get_license.test.ts +418 -0
  198. package/src/core/decrypt/__tests__/__global__/init_data.test.ts +675 -0
  199. package/src/core/{eme → decrypt}/__tests__/__global__/media_key_system_access.test.ts +99 -92
  200. package/src/core/decrypt/__tests__/__global__/media_keys.test.ts +156 -0
  201. package/src/core/decrypt/__tests__/__global__/server_certificate.test.ts +262 -0
  202. package/src/core/{eme → decrypt}/__tests__/__global__/utils.ts +31 -93
  203. package/src/core/{eme → decrypt}/attach_media_keys.ts +49 -56
  204. package/src/core/decrypt/clear_on_stop.ts +48 -0
  205. package/src/core/decrypt/content_decryptor.ts +1158 -0
  206. package/src/core/decrypt/create_or_load_session.ts +130 -0
  207. package/src/core/decrypt/create_session.ts +175 -0
  208. package/src/core/decrypt/dispose_decryption_resources.ts +39 -0
  209. package/src/core/{eme → decrypt}/find_key_system.ts +112 -122
  210. package/src/core/{eme → decrypt}/get_current_key_system.ts +1 -1
  211. package/src/core/decrypt/get_media_keys.ts +145 -0
  212. package/src/core/{eme → decrypt}/index.ts +11 -8
  213. package/src/core/decrypt/init_media_keys.ts +51 -0
  214. package/src/core/{eme → decrypt}/session_events_listener.ts +93 -55
  215. package/src/core/decrypt/set_server_certificate.ts +104 -0
  216. package/src/core/{eme → decrypt}/types.ts +128 -258
  217. package/src/core/{eme → decrypt}/utils/__tests__/are_init_values_compatible.test.ts +1 -1
  218. package/src/core/{eme → decrypt/utils}/__tests__/clean_old_loaded_sessions.test.ts +29 -71
  219. package/src/core/{eme → decrypt/utils}/__tests__/clean_old_stored_persistent_info.test.ts +6 -6
  220. package/src/core/{eme → decrypt}/utils/are_init_values_compatible.ts +9 -9
  221. package/src/core/{eme → decrypt/utils}/check_key_statuses.ts +6 -5
  222. package/{dist/_esm5.processed/core/eme/clean_old_loaded_sessions.js → src/core/decrypt/utils/clean_old_loaded_sessions.ts} +20 -20
  223. package/src/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.ts +3 -3
  224. package/src/core/{eme → decrypt/utils}/get_drm_system_id.ts +1 -1
  225. package/src/core/decrypt/utils/init_data_values_container.ts +119 -0
  226. package/src/core/{eme → decrypt}/utils/is_session_usable.ts +4 -5
  227. package/src/core/decrypt/utils/key_id_comparison.ts +82 -0
  228. package/src/core/decrypt/utils/key_session_record.ts +175 -0
  229. package/src/core/decrypt/utils/loaded_sessions_store.ts +318 -0
  230. package/src/core/{eme → decrypt/utils}/media_keys_infos_store.ts +4 -4
  231. package/src/core/{eme → decrypt}/utils/persistent_sessions_store.ts +122 -104
  232. package/src/core/{eme/utils/init_data_container.ts → decrypt/utils/serializable_bytes.ts} +8 -5
  233. package/src/core/{eme → decrypt/utils}/server_certificate_store.ts +2 -2
  234. package/src/core/fetchers/manifest/manifest_fetcher.ts +4 -4
  235. package/src/core/fetchers/segment/segment_fetcher.ts +4 -4
  236. package/src/core/fetchers/segment/segment_fetcher_creator.ts +2 -2
  237. package/src/core/init/.initialize_media_source.ts.un~ +0 -0
  238. package/src/core/init/get_initial_time.ts +2 -1
  239. package/src/core/init/initialize_directfile.ts +17 -20
  240. package/src/core/init/initialize_media_source.ts +42 -105
  241. package/src/core/init/link_drm_and_content.ts +176 -0
  242. package/src/core/init/manifest_update_scheduler.ts +5 -3
  243. package/src/core/init/stall_avoider.ts +6 -5
  244. package/src/core/init/stream_events_emitter/stream_events_emitter.ts +2 -1
  245. package/src/core/init/types.ts +1 -39
  246. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +2 -1
  247. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +3 -4
  248. package/src/core/segment_buffers/inventory/segment_inventory.ts +42 -8
  249. package/src/core/stream/adaptation/adaptation_stream.ts +7 -1
  250. package/src/core/stream/events_generators.ts +9 -4
  251. package/src/core/stream/orchestrator/stream_orchestrator.ts +9 -4
  252. package/src/core/stream/period/create_empty_adaptation_stream.ts +2 -1
  253. package/src/core/stream/period/get_adaptation_switch_strategy.ts +1 -1
  254. package/src/core/stream/period/period_stream.ts +5 -2
  255. package/src/core/stream/representation/force_garbage_collection.ts +2 -2
  256. package/src/core/stream/representation/get_buffer_status.ts +28 -16
  257. package/src/core/stream/representation/get_needed_segments.ts +124 -28
  258. package/src/core/stream/representation/get_segment_priority.ts +1 -2
  259. package/src/core/stream/representation/push_media_segment.ts +3 -2
  260. package/src/core/stream/representation/representation_stream.ts +30 -7
  261. package/src/core/stream/types.ts +1 -1
  262. package/src/default_config.ts +1241 -0
  263. package/src/experimental/index.ts +5 -0
  264. package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +1 -0
  265. package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +2 -1
  266. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +3 -10
  267. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/HDCPPolicy.test.ts +4 -4
  268. package/src/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.ts +1 -2
  269. package/src/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.ts +1 -2
  270. package/src/features/__tests__/initialize_features.test.ts +2 -2
  271. package/src/features/features_object.ts +1 -1
  272. package/src/features/initialize_features.ts +1 -1
  273. package/src/features/list/__tests__/eme.test.ts +5 -5
  274. package/src/features/list/eme.ts +5 -5
  275. package/src/features/types.ts +3 -10
  276. package/src/manifest/manifest.ts +6 -76
  277. package/src/manifest/representation.ts +36 -3
  278. package/src/parsers/manifest/dash/common/indexes/is_period_fulfilled.ts +1 -2
  279. package/src/parsers/manifest/dash/common/indexes/template.ts +1 -2
  280. package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +1 -1
  281. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +109 -64
  282. package/src/parsers/manifest/dash/common/parse_mpd.ts +1 -2
  283. package/src/parsers/manifest/smooth/create_parser.ts +1 -0
  284. package/src/parsers/texttracks/webvtt/html/__tests__/create_styled_element.test.ts +1 -0
  285. package/src/public_types.ts +5 -1
  286. package/src/transports/dash/image_pipelines.ts +3 -0
  287. package/src/transports/dash/segment_parser.ts +5 -0
  288. package/src/transports/dash/text_parser.ts +8 -0
  289. package/src/transports/local/segment_parser.ts +4 -0
  290. package/src/transports/local/text_parser.ts +8 -0
  291. package/src/transports/smooth/pipelines.ts +22 -9
  292. package/src/transports/types.ts +22 -0
  293. package/src/utils/__tests__/deep_merge.test.ts +48 -0
  294. package/src/utils/deep_merge.ts +46 -0
  295. package/src/utils/reference.ts +116 -23
  296. package/src/utils/request/fetch.ts +1 -2
  297. package/src/utils/request/xhr.ts +2 -1
  298. package/src/utils/rx-from_cancellable_promise.ts +7 -2
  299. package/src/utils/task_canceller.ts +6 -4
  300. package/dist/_esm5.processed/core/eme/attach_media_keys.js +0 -57
  301. package/dist/_esm5.processed/core/eme/clean_old_loaded_sessions.d.ts +0 -59
  302. package/dist/_esm5.processed/core/eme/clear_eme_session.js +0 -50
  303. package/dist/_esm5.processed/core/eme/create_session.js +0 -126
  304. package/dist/_esm5.processed/core/eme/dispose_eme.js +0 -23
  305. package/dist/_esm5.processed/core/eme/dispose_media_keys.js +0 -36
  306. package/dist/_esm5.processed/core/eme/eme_manager.d.ts +0 -31
  307. package/dist/_esm5.processed/core/eme/eme_manager.js +0 -278
  308. package/dist/_esm5.processed/core/eme/find_key_system.js +0 -253
  309. package/dist/_esm5.processed/core/eme/get_media_keys.js +0 -85
  310. package/dist/_esm5.processed/core/eme/get_session.js +0 -68
  311. package/dist/_esm5.processed/core/eme/init_media_keys.js +0 -66
  312. package/dist/_esm5.processed/core/eme/session_events_listener.d.ts +0 -41
  313. package/dist/_esm5.processed/core/eme/set_server_certificate.js +0 -85
  314. package/dist/_esm5.processed/core/eme/utils/close_session.js +0 -81
  315. package/dist/_esm5.processed/core/eme/utils/init_data_store.d.ts +0 -115
  316. package/dist/_esm5.processed/core/eme/utils/init_data_store.js +0 -181
  317. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.d.ts +0 -123
  318. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.js +0 -173
  319. package/dist/_esm5.processed/core/init/create_eme_manager.d.ts +0 -34
  320. package/dist/_esm5.processed/core/init/create_eme_manager.js +0 -52
  321. package/src/core/eme/README.md +0 -26
  322. package/src/core/eme/__tests__/__global__/get_license.test.ts +0 -414
  323. package/src/core/eme/__tests__/__global__/init_data.test.ts +0 -908
  324. package/src/core/eme/__tests__/__global__/media_keys.test.ts +0 -266
  325. package/src/core/eme/__tests__/__global__/server_certificate.test.ts +0 -364
  326. package/src/core/eme/__tests__/init_media_keys.test.ts +0 -182
  327. package/src/core/eme/clean_old_loaded_sessions.ts +0 -96
  328. package/src/core/eme/clear_eme_session.ts +0 -62
  329. package/src/core/eme/create_session.ts +0 -187
  330. package/src/core/eme/dispose_eme.ts +0 -25
  331. package/src/core/eme/dispose_media_keys.ts +0 -46
  332. package/src/core/eme/eme_manager.ts +0 -387
  333. package/src/core/eme/get_media_keys.ts +0 -141
  334. package/src/core/eme/get_session.ts +0 -135
  335. package/src/core/eme/init_media_keys.ts +0 -106
  336. package/src/core/eme/set_server_certificate.ts +0 -115
  337. package/src/core/eme/utils/close_session.ts +0 -113
  338. package/src/core/eme/utils/init_data_store.ts +0 -234
  339. package/src/core/eme/utils/loaded_sessions_store.ts +0 -235
  340. package/src/core/init/create_eme_manager.ts +0 -95
@@ -0,0 +1,2 @@
1
+ import configHandler from "../config";
2
+ export { configHandler as config, };
@@ -0,0 +1,2 @@
1
+ import configHandler from "../config";
2
+ export { configHandler as config, };
@@ -16,6 +16,7 @@ export default function pushData(inventoryInfos: {
16
16
  adaptation: Adaptation;
17
17
  representation: Representation;
18
18
  segment: ISegment;
19
+ chunkSize: number | undefined;
19
20
  start: number;
20
21
  end: number;
21
22
  }, parsed: ISegmentParserParsedMediaChunk<Uint8Array | ArrayBuffer>, videoSourceBuffer: AudioVideoSegmentBuffer): Observable<void>;
@@ -166,7 +166,7 @@ var VideoThumbnailLoader = /** @class */ (function () {
166
166
  if (end === undefined) {
167
167
  end = start + (segment.duration / segment.timescale);
168
168
  }
169
- var inventoryInfos = objectAssign({ segment: segment, start: start, end: end }, contentInfos);
169
+ var inventoryInfos = objectAssign({ chunkSize: data.chunkSize, segment: segment, start: start, end: end }, contentInfos);
170
170
  return pushData(inventoryInfos, data, videoSourceBuffer)
171
171
  .pipe(tap(function () {
172
172
  freeRequest(getCompleteSegmentId(inventoryInfos, segment));
@@ -13,7 +13,6 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { lastValueFrom } from "rxjs";
17
16
  import { requestMediaKeySystemAccess } from "../../../../compat";
18
17
  import PPromise from "../../../../utils/promise";
19
18
  import log from "../log";
@@ -39,7 +38,7 @@ export default function probeDRMInfos(mediaConfig) {
39
38
  // So, the DRM configuration is not supported.
40
39
  return PPromise.resolve([ProberStatus.NotSupported, result]);
41
40
  }
42
- return lastValueFrom(requestMediaKeySystemAccess(type, [configuration]))
41
+ return requestMediaKeySystemAccess(type, [configuration])
43
42
  .then(function (keySystemAccess) {
44
43
  result.compatibleConfiguration = keySystemAccess.getConfiguration();
45
44
  var status = [ProberStatus.Supported, result];
@@ -13,7 +13,6 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { lastValueFrom } from "rxjs";
17
16
  import { requestMediaKeySystemAccess } from "../../../../compat";
18
17
  import PPromise from "../../../../utils/promise";
19
18
  import { ProberStatus, } from "../types";
@@ -42,7 +41,7 @@ export default function probeHDCPPolicy(config) {
42
41
  contentType: "video/mp4;codecs=\"avc1.42E01E\"",
43
42
  }],
44
43
  };
45
- return lastValueFrom(requestMediaKeySystemAccess(keySystem, [drmConfig]))
44
+ return requestMediaKeySystemAccess(keySystem, [drmConfig])
46
45
  .then(function (mediaKeysSystemAccess) {
47
46
  return mediaKeysSystemAccess.createMediaKeys().then(function (mediaKeys) {
48
47
  if (!("getStatusForPolicy" in mediaKeys)) {
@@ -20,7 +20,7 @@
20
20
  var features = { dashParsers: { wasm: null,
21
21
  js: null },
22
22
  directfile: null,
23
- emeManager: null,
23
+ ContentDecryptor: null,
24
24
  htmlTextTracksBuffer: null,
25
25
  htmlTextTracksParsers: {},
26
26
  imageBuffer: null,
@@ -24,7 +24,7 @@ import features from "./features_object";
24
24
  */
25
25
  export default function initializeFeaturesObject() {
26
26
  if (0 /* EME */ === 1 /* IS_ENABLED */) {
27
- features.emeManager = require("../core/eme/index.ts").default;
27
+ features.ContentDecryptor = require("../core/decrypt/index.ts").default;
28
28
  }
29
29
  if (0 /* BIF_PARSER */ === 1 /* IS_ENABLED */) {
30
30
  features.imageBuffer =
@@ -18,6 +18,6 @@ import { IFeaturesObject } from "../types";
18
18
  * Add ability to play encrypted contents
19
19
  * @param {Object} features
20
20
  */
21
- declare function addEMEManagerFeature(features: IFeaturesObject): void;
22
- export { addEMEManagerFeature as EME };
23
- export default addEMEManagerFeature;
21
+ declare function addEMEFeature(features: IFeaturesObject): void;
22
+ export { addEMEFeature as EME };
23
+ export default addEMEFeature;
@@ -13,13 +13,13 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import EMEManager from "../../core/eme";
16
+ import ContentDecryptor from "../../core/decrypt";
17
17
  /**
18
18
  * Add ability to play encrypted contents
19
19
  * @param {Object} features
20
20
  */
21
- function addEMEManagerFeature(features) {
22
- features.emeManager = EMEManager;
21
+ function addEMEFeature(features) {
22
+ features.ContentDecryptor = ContentDecryptor;
23
23
  }
24
- export { addEMEManagerFeature as EME };
25
- export default addEMEManagerFeature;
24
+ export { addEMEFeature as EME };
25
+ export default addEMEFeature;
@@ -15,7 +15,7 @@
15
15
  */
16
16
  import { Observable } from "rxjs";
17
17
  import MediaElementTrackChoiceManager from "../core/api/media_element_track_choice_manager";
18
- import { IContentProtection, IEMEManagerEvent, IKeySystemOption } from "../core/eme";
18
+ import type ContentDecryptor from "../core/decrypt";
19
19
  import { IDirectfileEvent, IDirectFileOptions } from "../core/init/initialize_directfile";
20
20
  import { SegmentBuffer } from "../core/segment_buffers";
21
21
  import { IDashParserResponse, IMPDParserArguments } from "../parsers/manifest/dash/parsers_types";
@@ -23,7 +23,7 @@ import DashWasmParser from "../parsers/manifest/dash/wasm-parser";
23
23
  import { IHTMLTextTracksParserFn, INativeTextTracksParserFn } from "../parsers/texttracks";
24
24
  import { ITransportFunction } from "../transports";
25
25
  export declare type IDirectFileInit = (args: IDirectFileOptions) => Observable<IDirectfileEvent>;
26
- export declare type IEMEManager = (mediaElement: HTMLMediaElement, keySystems: IKeySystemOption[], contentProtections$: Observable<IContentProtection>) => Observable<IEMEManagerEvent>;
26
+ export declare type IContentDecryptorClass = typeof ContentDecryptor;
27
27
  export declare type IHTMLTextTracksBuffer = new (mediaElement: HTMLMediaElement, textTrackElement: HTMLElement) => SegmentBuffer;
28
28
  export declare type INativeTextTracksBuffer = new (mediaElement: HTMLMediaElement, hideNativeSubtitle: boolean) => SegmentBuffer;
29
29
  export declare type IMediaElementTrackChoiceManager = typeof MediaElementTrackChoiceManager;
@@ -53,7 +53,7 @@ export interface IFeaturesObject {
53
53
  initDirectFile: IDirectFileInit;
54
54
  mediaElementTrackChoiceManager: IMediaElementTrackChoiceManager;
55
55
  } | null;
56
- emeManager: IEMEManager | null;
56
+ ContentDecryptor: IContentDecryptorClass | null;
57
57
  htmlTextTracksBuffer: IHTMLTextTracksBuffer | null;
58
58
  htmlTextTracksParsers: Partial<Record<string, IHTMLTextTracksParserFn>>;
59
59
  imageBuffer: IImageBuffer | null;
@@ -13,7 +13,6 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { IInitializationDataInfo } from "../core/eme";
17
16
  import { ICustomError } from "../errors";
18
17
  import { IParsedManifest } from "../parsers/manifest";
19
18
  import EventEmitter from "../utils/event_emitter";
@@ -271,19 +270,7 @@ export default class Manifest extends EventEmitter<IManifestEvents> {
271
270
  * changes performed.
272
271
  * @param {Object} keyUpdates
273
272
  */
274
- updateDeciperabilitiesBasedOnKeyIds({ whitelistedKeyIds, blacklistedKeyIDs }: {
275
- whitelistedKeyIds: Uint8Array[];
276
- blacklistedKeyIDs: Uint8Array[];
277
- }): void;
278
- /**
279
- * Look in the Manifest for Representations linked to the given content
280
- * protection initialization data and mark them as being impossible to
281
- * decrypt.
282
- * Then trigger a "decipherabilityUpdate" event to notify everyone of the
283
- * changes performed.
284
- * @param {Object} initData
285
- */
286
- addUndecipherableProtectionData(initData: IInitializationDataInfo): void;
273
+ updateRepresentationsDeciperability(isDecipherableCb: (rep: Representation) => boolean | undefined): void;
287
274
  /**
288
275
  * @deprecated only returns adaptations for the first period
289
276
  * @returns {Array.<Object>}
@@ -29,7 +29,6 @@ var __extends = (this && this.__extends) || (function () {
29
29
  };
30
30
  })();
31
31
  import { MediaError, } from "../errors";
32
- import areArraysOfNumbersEqual from "../utils/are_arrays_of_numbers_equal";
33
32
  import arrayFind from "../utils/array_find";
34
33
  import EventEmitter from "../utils/event_emitter";
35
34
  import idGenerator from "../utils/id_generator";
@@ -72,8 +71,9 @@ var Manifest = /** @class */ (function (_super) {
72
71
  * @param {Object} options
73
72
  */
74
73
  function Manifest(parsedManifest, options) {
74
+ var _this = this;
75
75
  var _a;
76
- var _this = _super.call(this) || this;
76
+ _this = _super.call(this) || this;
77
77
  var _b = options.supplementaryTextTracks, supplementaryTextTracks = _b === void 0 ? [] : _b, _c = options.supplementaryImageTracks, supplementaryImageTracks = _c === void 0 ? [] : _c, representationFilter = options.representationFilter, manifestUpdateUrl = options.manifestUpdateUrl;
78
78
  _this.contentWarnings = [];
79
79
  _this.id = generateNewManifestId();
@@ -234,70 +234,8 @@ var Manifest = /** @class */ (function (_super) {
234
234
  * changes performed.
235
235
  * @param {Object} keyUpdates
236
236
  */
237
- Manifest.prototype.updateDeciperabilitiesBasedOnKeyIds = function (_a) {
238
- var whitelistedKeyIds = _a.whitelistedKeyIds, blacklistedKeyIDs = _a.blacklistedKeyIDs;
239
- var updates = updateDeciperability(this, function (representation) {
240
- if (representation.decipherable === false ||
241
- representation.contentProtections === undefined) {
242
- return representation.decipherable;
243
- }
244
- var contentKIDs = representation.contentProtections.keyIds;
245
- for (var i = 0; i < contentKIDs.length; i++) {
246
- var elt = contentKIDs[i];
247
- for (var j = 0; j < blacklistedKeyIDs.length; j++) {
248
- if (areArraysOfNumbersEqual(blacklistedKeyIDs[j], elt.keyId)) {
249
- return false;
250
- }
251
- }
252
- for (var j = 0; j < whitelistedKeyIds.length; j++) {
253
- if (areArraysOfNumbersEqual(whitelistedKeyIds[j], elt.keyId)) {
254
- return true;
255
- }
256
- }
257
- }
258
- return representation.decipherable;
259
- });
260
- if (updates.length > 0) {
261
- this.trigger("decipherabilityUpdate", updates);
262
- }
263
- };
264
- /**
265
- * Look in the Manifest for Representations linked to the given content
266
- * protection initialization data and mark them as being impossible to
267
- * decrypt.
268
- * Then trigger a "decipherabilityUpdate" event to notify everyone of the
269
- * changes performed.
270
- * @param {Object} initData
271
- */
272
- Manifest.prototype.addUndecipherableProtectionData = function (initData) {
273
- var updates = updateDeciperability(this, function (representation) {
274
- var _a, _b;
275
- if (representation.decipherable === false) {
276
- return false;
277
- }
278
- var segmentProtections = (_b = (_a = representation.contentProtections) === null || _a === void 0 ? void 0 : _a.initData) !== null && _b !== void 0 ? _b : [];
279
- var _loop_1 = function (i) {
280
- if (initData.type === undefined ||
281
- segmentProtections[i].type === initData.type) {
282
- var containedInitData = initData.values.every(function (undecipherableVal) {
283
- return segmentProtections[i].values.some(function (currVal) {
284
- return (undecipherableVal.systemId === undefined ||
285
- currVal.systemId === undecipherableVal.systemId) &&
286
- areArraysOfNumbersEqual(currVal.data, undecipherableVal.data);
287
- });
288
- });
289
- if (containedInitData) {
290
- return { value: false };
291
- }
292
- }
293
- };
294
- for (var i = 0; i < segmentProtections.length; i++) {
295
- var state_1 = _loop_1(i);
296
- if (typeof state_1 === "object")
297
- return state_1.value;
298
- }
299
- return representation.decipherable;
300
- });
237
+ Manifest.prototype.updateRepresentationsDeciperability = function (isDecipherableCb) {
238
+ var updates = updateDeciperability(this, isDecipherableCb);
301
239
  if (updates.length > 0) {
302
240
  this.trigger("decipherabilityUpdate", updates);
303
241
  }
@@ -501,14 +439,12 @@ export default Manifest;
501
439
  */
502
440
  function updateDeciperability(manifest, isDecipherable) {
503
441
  var updates = [];
504
- for (var i = 0; i < manifest.periods.length; i++) {
505
- var period = manifest.periods[i];
506
- var adaptations = period.getAdaptations();
507
- for (var j = 0; j < adaptations.length; j++) {
508
- var adaptation = adaptations[j];
509
- var representations = adaptation.representations;
510
- for (var k = 0; k < representations.length; k++) {
511
- var representation = representations[k];
442
+ for (var _i = 0, _a = manifest.periods; _i < _a.length; _i++) {
443
+ var period = _a[_i];
444
+ for (var _b = 0, _c = period.getAdaptations(); _b < _c.length; _b++) {
445
+ var adaptation = _c[_b];
446
+ for (var _d = 0, _e = adaptation.representations; _d < _e.length; _d++) {
447
+ var representation = _e[_d];
512
448
  var result = isDecipherable(representation);
513
449
  if (result !== representation.decipherable) {
514
450
  updates.push({ manifest: manifest, period: period, adaptation: adaptation, representation: representation });
@@ -13,7 +13,6 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { IContentProtection } from "../core/eme";
17
16
  import { IContentProtections, IParsedRepresentation } from "../parsers/manifest";
18
17
  import { IRepresentationIndex } from "./representation_index";
19
18
  import { IAdaptationType, IHDRInformation } from "./types";
@@ -107,7 +106,7 @@ declare class Representation {
107
106
  * @param {string} drmSystemId - The hexa-encoded DRM system ID
108
107
  * @returns {Array.<Object>}
109
108
  */
110
- getEncryptionData(drmSystemId: string): IContentProtection[];
109
+ getEncryptionData(drmSystemId: string): IRepresentationProtectionData[];
111
110
  /**
112
111
  * Returns all currently-known encryption initialization data linked to this
113
112
  * Representation.
@@ -134,7 +133,7 @@ declare class Representation {
134
133
  * after parsing this Representation's initialization segment, if one exists.
135
134
  * @returns {Array.<Object>}
136
135
  */
137
- getAllEncryptionData(): IContentProtection[];
136
+ getAllEncryptionData(): IRepresentationProtectionData[];
138
137
  /**
139
138
  * Add new encryption initialization data to this Representation if it was not
140
139
  * already included.
@@ -156,4 +155,37 @@ declare class Representation {
156
155
  data: Uint8Array;
157
156
  }>): boolean;
158
157
  }
158
+ /** Protection data as returned by a Representation. */
159
+ export interface IRepresentationProtectionData {
160
+ /**
161
+ * Initialization data type.
162
+ * String describing the format of the initialization data sent through this
163
+ * event.
164
+ * https://www.w3.org/TR/eme-initdata-registry/
165
+ */
166
+ type: string;
167
+ /**
168
+ * The key ids linked to those initialization data.
169
+ * This should be the key ids for the key concerned by the media which have
170
+ * the present initialization data.
171
+ *
172
+ * `undefined` when not known (different from an empty array - which would
173
+ * just mean that there's no key id involved).
174
+ */
175
+ keyIds: Uint8Array[] | undefined;
176
+ /** Every initialization data for that type. */
177
+ values: Array<{
178
+ /**
179
+ * Hex encoded system id, which identifies the key system.
180
+ * https://dashif.org/identifiers/content_protection/
181
+ */
182
+ systemId: string;
183
+ /**
184
+ * The initialization data itself for that type and systemId.
185
+ * For example, with "cenc" initialization data found in an ISOBMFF file,
186
+ * this will be the whole PSSH box.
187
+ */
188
+ data: Uint8Array;
189
+ }>;
190
+ }
159
191
  export default Representation;
@@ -14,7 +14,6 @@
14
14
  * limitations under the License.
15
15
  */
16
16
  import config from "../../../../../config";
17
- var DEFAULT_MAXIMUM_TIME_ROUNDING_ERROR = config.DEFAULT_MAXIMUM_TIME_ROUNDING_ERROR;
18
17
  /**
19
18
  * In Javascript, numbers are encoded in a way that a floating number may be
20
19
  * represented internally with a rounding error.
@@ -28,6 +27,6 @@ var DEFAULT_MAXIMUM_TIME_ROUNDING_ERROR = config.DEFAULT_MAXIMUM_TIME_ROUNDING_E
28
27
  * @returns {boolean}
29
28
  */
30
29
  export default function isPeriodFulfilled(timescale, lastSegmentEnd, periodEnd) {
31
- var scaledRoundingError = DEFAULT_MAXIMUM_TIME_ROUNDING_ERROR * timescale;
30
+ var scaledRoundingError = config.getCurrent().DEFAULT_MAXIMUM_TIME_ROUNDING_ERROR * timescale;
32
31
  return (lastSegmentEnd + scaledRoundingError) >= periodEnd;
33
32
  }
@@ -17,7 +17,6 @@ import config from "../../../../../config";
17
17
  import getInitSegment from "./get_init_segment";
18
18
  import isPeriodFulfilled from "./is_period_fulfilled";
19
19
  import { createDashUrlDetokenizer, createIndexURLs, } from "./tokens";
20
- var MINIMUM_SEGMENT_SIZE = config.MINIMUM_SEGMENT_SIZE;
21
20
  /**
22
21
  * IRepresentationIndex implementation for DASH' SegmentTemplate without a
23
22
  * SegmentTimeline.
@@ -327,7 +326,7 @@ var TemplateRepresentationIndex = /** @class */ (function () {
327
326
  // segment that there actually is due to a very little difference between
328
327
  // the period's duration and a multiple of a segment's duration.
329
328
  // Check that we're within a good margin
330
- var minimumDuration = MINIMUM_SEGMENT_SIZE * timescale;
329
+ var minimumDuration = config.getCurrent().MINIMUM_SEGMENT_SIZE * timescale;
331
330
  if (maximumTime - regularLastSegmentStart > minimumDuration ||
332
331
  numberIndexedToZero === 0) {
333
332
  return regularLastSegmentStart;
@@ -27,7 +27,6 @@ import { createIndexURLs } from "../tokens";
27
27
  import constructTimelineFromElements from "./construct_timeline_from_elements";
28
28
  // eslint-disable-next-line max-len
29
29
  import constructTimelineFromPreviousTimeline from "./construct_timeline_from_previous_timeline";
30
- var MIN_DASH_S_ELEMENTS_TO_PARSE_UNSAFELY = config.MIN_DASH_S_ELEMENTS_TO_PARSE_UNSAFELY;
31
30
  var TimelineRepresentationIndex = /** @class */ (function () {
32
31
  /**
33
32
  * @param {Object} index
@@ -328,6 +327,7 @@ var TimelineRepresentationIndex = /** @class */ (function () {
328
327
  }
329
328
  var newElements = this._parseTimeline();
330
329
  this._parseTimeline = null; // Free memory
330
+ var MIN_DASH_S_ELEMENTS_TO_PARSE_UNSAFELY = config.getCurrent().MIN_DASH_S_ELEMENTS_TO_PARSE_UNSAFELY;
331
331
  if (this._unsafelyBaseOnPreviousIndex === null ||
332
332
  newElements.length < MIN_DASH_S_ELEMENTS_TO_PARSE_UNSAFELY) {
333
333
  // Just completely parse the current timeline
@@ -14,7 +14,9 @@
14
14
  * limitations under the License.
15
15
  */
16
16
  import log from "../../../../log";
17
+ import { SUPPORTED_ADAPTATIONS_TYPE, } from "../../../../manifest";
17
18
  import arrayFind from "../../../../utils/array_find";
19
+ import arrayFindIndex from "../../../../utils/array_find_index";
18
20
  import arrayIncludes from "../../../../utils/array_includes";
19
21
  import isNonEmptyString from "../../../../utils/is_non_empty_string";
20
22
  import attachTrickModeTrack from "./attach_trickmode_track";
@@ -142,29 +144,24 @@ function getAdaptationSetSwitchingIDs(adaptation) {
142
144
  */
143
145
  export default function parseAdaptationSets(adaptationsIR, context) {
144
146
  var _a;
145
- var _b, _c, _d, _e, _f, _g, _h;
146
- var parsedAdaptations = {};
147
+ var _b, _c, _d, _e, _f, _g, _h, _j;
148
+ var parsedAdaptations = { video: [],
149
+ audio: [],
150
+ text: [],
151
+ image: [] };
147
152
  var trickModeAdaptations = [];
148
153
  var adaptationSwitchingInfos = {};
149
154
  var parsedAdaptationsIDs = [];
150
155
  /**
151
- * Index of the last parsed AdaptationSet with a Role set as "main" in
152
- * `parsedAdaptations` for a given type.
153
- * Not defined for a type with no main Adaptation inside.
154
- * This is used to put main AdaptationSet first in the resulting array of
155
- * Adaptation while still preserving the MPD order among them.
156
+ * Index of the last parsed Video AdaptationSet with a Role set as "main" in
157
+ * `parsedAdaptations.video`.
158
+ * `-1` if not yet encountered.
159
+ * Used as we merge all main video AdaptationSet due to a comprehension of the
160
+ * DASH-IF IOP.
156
161
  */
157
- var lastMainAdaptationIndex = {};
158
- // first sort AdaptationSets by absolute priority.
159
- adaptationsIR.sort(function (a, b) {
160
- var _a, _b;
161
- /* As of DASH-IF 4.3, `1` is the default value. */
162
- var priority1 = (_a = a.attributes.selectionPriority) !== null && _a !== void 0 ? _a : 1;
163
- var priority2 = (_b = b.attributes.selectionPriority) !== null && _b !== void 0 ? _b : 1;
164
- return priority2 - priority1;
165
- });
166
- for (var _i = 0, adaptationsIR_1 = adaptationsIR; _i < adaptationsIR_1.length; _i++) {
167
- var adaptation = adaptationsIR_1[_i];
162
+ var lastMainVideoAdapIdx = -1;
163
+ for (var adaptationIdx = 0; adaptationIdx < adaptationsIR.length; adaptationIdx++) {
164
+ var adaptation = adaptationsIR[adaptationIdx];
168
165
  var adaptationChildren = adaptation.children;
169
166
  var essentialProperties = adaptationChildren.essentialProperties, roles = adaptationChildren.roles;
170
167
  var isMainAdaptation = Array.isArray(roles) &&
@@ -186,6 +183,7 @@ export default function parseAdaptationSets(adaptationsIR, context) {
186
183
  if (type === undefined) {
187
184
  continue;
188
185
  }
186
+ var priority = (_d = adaptation.attributes.selectionPriority) !== null && _d !== void 0 ? _d : 1;
189
187
  var originalID = adaptation.attributes.id;
190
188
  var newID = void 0;
191
189
  var adaptationSetSwitchingIDs = getAdaptationSetSwitchingIDs(adaptation);
@@ -216,19 +214,16 @@ export default function parseAdaptationSets(adaptationsIR, context) {
216
214
  arrayFind(essentialProperties, function (scheme) {
217
215
  return scheme.schemeIdUri === "http://dashif.org/guidelines/trickmode";
218
216
  }) : undefined;
219
- var trickModeAttachedAdaptationIds = (_d = trickModeProperty === null || trickModeProperty === void 0 ? void 0 : trickModeProperty.value) === null || _d === void 0 ? void 0 : _d.split(" ");
217
+ var trickModeAttachedAdaptationIds = (_e = trickModeProperty === null || trickModeProperty === void 0 ? void 0 : trickModeProperty.value) === null || _e === void 0 ? void 0 : _e.split(" ");
220
218
  var isTrickModeTrack = trickModeAttachedAdaptationIds !== undefined;
221
219
  if (type === "video" &&
222
220
  isMainAdaptation &&
223
- parsedAdaptations.video !== undefined &&
224
- parsedAdaptations.video.length > 0 &&
225
- lastMainAdaptationIndex.video !== undefined &&
221
+ lastMainVideoAdapIdx >= 0 &&
222
+ parsedAdaptations.video.length > lastMainVideoAdapIdx &&
226
223
  !isTrickModeTrack) {
227
- // Add to the already existing main video adaptation
228
- // TODO remove that ugly custom logic?
229
- var videoMainAdaptation = parsedAdaptations.video[lastMainAdaptationIndex.video];
230
- reprCtxt.unsafelyBaseOnPreviousAdaptation = (_f = (_e = context
231
- .unsafelyBaseOnPreviousPeriod) === null || _e === void 0 ? void 0 : _e.getAdaptation(videoMainAdaptation.id)) !== null && _f !== void 0 ? _f : null;
224
+ var videoMainAdaptation = parsedAdaptations.video[lastMainVideoAdapIdx][0];
225
+ reprCtxt.unsafelyBaseOnPreviousAdaptation = (_g = (_f = context
226
+ .unsafelyBaseOnPreviousPeriod) === null || _f === void 0 ? void 0 : _f.getAdaptation(videoMainAdaptation.id)) !== null && _g !== void 0 ? _g : null;
232
227
  var representations = parseRepresentations(representationsIR, adaptation, reprCtxt);
233
228
  (_a = videoMainAdaptation.representations).push.apply(_a, representations);
234
229
  newID = videoMainAdaptation.id;
@@ -268,8 +263,8 @@ export default function parseAdaptationSets(adaptationsIR, context) {
268
263
  }
269
264
  newID = adaptationID;
270
265
  parsedAdaptationsIDs.push(adaptationID);
271
- reprCtxt.unsafelyBaseOnPreviousAdaptation = (_h = (_g = context
272
- .unsafelyBaseOnPreviousPeriod) === null || _g === void 0 ? void 0 : _g.getAdaptation(adaptationID)) !== null && _h !== void 0 ? _h : null;
266
+ reprCtxt.unsafelyBaseOnPreviousAdaptation = (_j = (_h = context
267
+ .unsafelyBaseOnPreviousPeriod) === null || _h === void 0 ? void 0 : _h.getAdaptation(adaptationID)) !== null && _j !== void 0 ? _j : null;
273
268
  var representations = parseRepresentations(representationsIR, adaptation, reprCtxt);
274
269
  var parsedAdaptationSet = { id: adaptationID, representations: representations, type: type, isTrickModeTrack: isTrickModeTrack };
275
270
  if (adaptation.attributes.language != null) {
@@ -287,75 +282,92 @@ export default function parseAdaptationSets(adaptationsIR, context) {
287
282
  if (isSignInterpreted === true) {
288
283
  parsedAdaptationSet.isSignInterpreted = true;
289
284
  }
290
- var adaptationsOfTheSameType = parsedAdaptations[type];
291
285
  if (trickModeAttachedAdaptationIds !== undefined) {
292
286
  trickModeAdaptations.push({ adaptation: parsedAdaptationSet, trickModeAttachedAdaptationIds: trickModeAttachedAdaptationIds });
293
287
  }
294
- else if (adaptationsOfTheSameType === undefined) {
295
- parsedAdaptations[type] = [parsedAdaptationSet];
296
- if (isMainAdaptation) {
297
- lastMainAdaptationIndex[type] = 0;
298
- }
299
- }
300
288
  else {
301
- var mergedInto = null;
289
+ // look if we have to merge this into another Adaptation
290
+ var mergedIntoIdx = -1;
302
291
  var _loop_1 = function (id) {
303
292
  var _k;
304
293
  var switchingInfos = adaptationSwitchingInfos[id];
305
- if (switchingInfos != null &&
294
+ if (switchingInfos !== undefined &&
306
295
  switchingInfos.newID !== newID &&
307
296
  arrayIncludes(switchingInfos.adaptationSetSwitchingIDs, originalID)) {
308
- var adaptationToMergeInto = arrayFind(adaptationsOfTheSameType, function (a) { return a.id === id; });
309
- if (adaptationToMergeInto != null &&
310
- adaptationToMergeInto.audioDescription ===
297
+ mergedIntoIdx = arrayFindIndex(parsedAdaptations[type], function (a) { return a[0].id === id; });
298
+ var mergedInto = parsedAdaptations[type][mergedIntoIdx];
299
+ if (mergedInto !== undefined &&
300
+ mergedInto[0].audioDescription ===
311
301
  parsedAdaptationSet.audioDescription &&
312
- adaptationToMergeInto.closedCaption ===
302
+ mergedInto[0].closedCaption ===
313
303
  parsedAdaptationSet.closedCaption &&
314
- adaptationToMergeInto.language === parsedAdaptationSet.language) {
304
+ mergedInto[0].language === parsedAdaptationSet.language) {
315
305
  log.info("DASH Parser: merging \"switchable\" AdaptationSets", originalID, id);
316
- (_k = adaptationToMergeInto.representations)
317
- .push.apply(_k, parsedAdaptationSet.representations);
318
- mergedInto = adaptationToMergeInto;
306
+ (_k = mergedInto[0].representations).push.apply(_k, parsedAdaptationSet.representations);
307
+ if (type === "video" &&
308
+ isMainAdaptation &&
309
+ !mergedInto[1].isMainAdaptation) {
310
+ lastMainVideoAdapIdx = Math.max(lastMainVideoAdapIdx, mergedIntoIdx);
311
+ }
312
+ mergedInto[1] = {
313
+ priority: Math.max(priority, mergedInto[1].priority),
314
+ isMainAdaptation: isMainAdaptation ||
315
+ mergedInto[1].isMainAdaptation,
316
+ indexInMpd: Math.min(adaptationIdx, mergedInto[1].indexInMpd),
317
+ };
319
318
  }
320
319
  }
321
320
  };
322
- // look if we have to merge this into another Adaptation
323
- for (var _j = 0, adaptationSetSwitchingIDs_1 = adaptationSetSwitchingIDs; _j < adaptationSetSwitchingIDs_1.length; _j++) {
324
- var id = adaptationSetSwitchingIDs_1[_j];
321
+ for (var _i = 0, adaptationSetSwitchingIDs_1 = adaptationSetSwitchingIDs; _i < adaptationSetSwitchingIDs_1.length; _i++) {
322
+ var id = adaptationSetSwitchingIDs_1[_i];
325
323
  _loop_1(id);
326
324
  }
327
- if (isMainAdaptation) {
328
- var oldLastMainIdx = lastMainAdaptationIndex[type];
329
- var newLastMainIdx = oldLastMainIdx === undefined ? 0 :
330
- oldLastMainIdx + 1;
331
- if (mergedInto === null) {
332
- // put "main" Adaptation after all other Main Adaptations
333
- adaptationsOfTheSameType.splice(newLastMainIdx, 0, parsedAdaptationSet);
334
- lastMainAdaptationIndex[type] = newLastMainIdx;
335
- }
336
- else {
337
- var indexOf = adaptationsOfTheSameType.indexOf(mergedInto);
338
- if (indexOf < 0) { // Weird, not found
339
- adaptationsOfTheSameType.splice(newLastMainIdx, 0, parsedAdaptationSet);
340
- lastMainAdaptationIndex[type] = newLastMainIdx;
341
- }
342
- else if (oldLastMainIdx === undefined || indexOf > oldLastMainIdx) {
343
- // Found but was not main
344
- adaptationsOfTheSameType.splice(indexOf, 1);
345
- adaptationsOfTheSameType.splice(newLastMainIdx, 0, mergedInto);
346
- lastMainAdaptationIndex[type] = newLastMainIdx;
347
- }
325
+ if (mergedIntoIdx < 0) {
326
+ parsedAdaptations[type].push([parsedAdaptationSet,
327
+ { priority: priority, isMainAdaptation: isMainAdaptation, indexInMpd: adaptationIdx }]);
328
+ if (type === "video" && isMainAdaptation) {
329
+ lastMainVideoAdapIdx = parsedAdaptations.video.length - 1;
348
330
  }
349
331
  }
350
- else if (mergedInto === null) {
351
- adaptationsOfTheSameType.push(parsedAdaptationSet);
352
- }
353
332
  }
354
333
  }
355
334
  if (originalID != null && adaptationSwitchingInfos[originalID] == null) {
356
335
  adaptationSwitchingInfos[originalID] = { newID: newID, adaptationSetSwitchingIDs: adaptationSetSwitchingIDs };
357
336
  }
358
337
  }
359
- attachTrickModeTrack(parsedAdaptations, trickModeAdaptations);
360
- return parsedAdaptations;
338
+ var adaptationsPerType = SUPPORTED_ADAPTATIONS_TYPE
339
+ .reduce(function (acc, adaptationType) {
340
+ var adaptationsParsedForType = parsedAdaptations[adaptationType];
341
+ if (adaptationsParsedForType.length > 0) {
342
+ adaptationsParsedForType.sort(compareAdaptations);
343
+ acc[adaptationType] = adaptationsParsedForType
344
+ .map(function (_a) {
345
+ var parsedAdaptation = _a[0];
346
+ return parsedAdaptation;
347
+ });
348
+ }
349
+ return acc;
350
+ }, {});
351
+ parsedAdaptations.video.sort(compareAdaptations);
352
+ attachTrickModeTrack(adaptationsPerType, trickModeAdaptations);
353
+ return adaptationsPerType;
354
+ }
355
+ /**
356
+ * Compare groups of parsed AdaptationSet, alongside some ordering metadata,
357
+ * allowing to easily sort them through JavaScript's `Array.prototype.sort`
358
+ * method.
359
+ * @param {Array.<Object>} a
360
+ * @param {Array.<Object>} b
361
+ * @returns {number}
362
+ */
363
+ function compareAdaptations(a, b) {
364
+ var priorityDiff = b[1].priority - a[1].priority;
365
+ if (priorityDiff !== 0) {
366
+ return priorityDiff;
367
+ }
368
+ if (a[1].isMainAdaptation !== b[1].isMainAdaptation) {
369
+ return a[1].isMainAdaptation ? -1 :
370
+ 1;
371
+ }
372
+ return a[1].indexInMpd - b[1].indexInMpd;
361
373
  }