shaka-player 3.1.4 → 3.1.7

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 (332) hide show
  1. package/.csslintrc +11 -1
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  3. package/.github/workflows/build-and-test.yaml +130 -0
  4. package/.github/workflows/custom-actions/prep-for-appspot/action.yaml +56 -0
  5. package/.github/workflows/custom-actions/set-commit-status/action.yaml +41 -0
  6. package/.github/workflows/demo-version-index.yaml +29 -0
  7. package/.github/workflows/nightly-demo.yaml +42 -0
  8. package/.github/workflows/release-please.yaml +145 -0
  9. package/.github/workflows/safari-homedir-launcher.sh +18 -0
  10. package/.github/workflows/selenium-lab-tests.yaml +93 -0
  11. package/AUTHORS +2 -0
  12. package/CHANGELOG.md +1540 -1474
  13. package/CONTRIBUTING.md +2 -2
  14. package/CONTRIBUTORS +2 -0
  15. package/README.md +7 -7
  16. package/app-engine/README.md +9 -0
  17. package/app-engine/demo-version-index/README.md +14 -0
  18. package/app-engine/demo-version-index/app.yaml +2 -0
  19. package/app-engine/demo-version-index/main.py +162 -0
  20. package/app-engine/demo-version-index/requirements.txt +6 -0
  21. package/app-engine/demo-version-index/templates/index.html +114 -0
  22. package/app-engine/shaka-player-demo/README.md +18 -0
  23. package/app-engine/shaka-player-demo/app.yaml +61 -0
  24. package/app-engine/shaka-player-demo/main.py +95 -0
  25. package/app-engine/shaka-player-demo/posters/10yo.png +0 -0
  26. package/app-engine/shaka-player-demo/posters/10yo.xcf +0 -0
  27. package/app-engine/shaka-player-demo/posters/1yo.jpg +0 -0
  28. package/app-engine/shaka-player-demo/posters/2yo.png +0 -0
  29. package/app-engine/shaka-player-demo/posters/2yo.xcf +0 -0
  30. package/app-engine/shaka-player-demo/posters/3yo.png +0 -0
  31. package/app-engine/shaka-player-demo/posters/3yo.xcf +0 -0
  32. package/app-engine/shaka-player-demo/posters/4yo.png +0 -0
  33. package/app-engine/shaka-player-demo/posters/4yo.xcf +0 -0
  34. package/app-engine/shaka-player-demo/posters/5yo.png +0 -0
  35. package/app-engine/shaka-player-demo/posters/5yo.xcf +0 -0
  36. package/app-engine/shaka-player-demo/posters/6yo.png +0 -0
  37. package/app-engine/shaka-player-demo/posters/6yo.xcf +0 -0
  38. package/app-engine/shaka-player-demo/posters/7yo.png +0 -0
  39. package/app-engine/shaka-player-demo/posters/7yo.xcf +0 -0
  40. package/app-engine/shaka-player-demo/posters/8yo.png +0 -0
  41. package/app-engine/shaka-player-demo/posters/8yo.xcf +0 -0
  42. package/app-engine/shaka-player-demo/posters/9yo.png +0 -0
  43. package/app-engine/shaka-player-demo/posters/9yo.xcf +0 -0
  44. package/app-engine/shaka-player-demo/posters/audioOnly.gif +0 -0
  45. package/app-engine/shaka-player-demo/posters/audioRickRoll.gif +0 -0
  46. package/app-engine/shaka-player-demo/posters/colorbars.gif +0 -0
  47. package/app-engine/shaka-player-demo/posters/fireworks.jpg +0 -0
  48. package/app-engine/shaka-player-demo/posters/party-hat.png +0 -0
  49. package/app-engine/shaka-player-demo/posters/sources.txt +46 -0
  50. package/app-engine/shaka-player-demo/posters/standard.png +0 -0
  51. package/app-engine/shaka-player-demo/posters/trek.jpg +0 -0
  52. package/app-engine/shaka-player-demo/posters/valentines.png +0 -0
  53. package/app-engine/shaka-player-demo/posters/zombie.jpg +0 -0
  54. package/app-engine/shaka-player-demo/posters.py +110 -0
  55. package/app-engine/shaka-player-demo/requirements.txt +5 -0
  56. package/app-engine/shaka-player-demo/time.txt +1 -0
  57. package/build/README.md +1 -1
  58. package/build/checkversion.py +1 -1
  59. package/build/conformance.textproto +13 -0
  60. package/build/docker/Dockerfile +20 -0
  61. package/build/docker/docker-compose.yml +10 -0
  62. package/build/gendeps.py +18 -15
  63. package/build/shaka-lab.yaml +163 -0
  64. package/build/shakaBuildHelpers.py +4 -29
  65. package/build/test.py +93 -28
  66. package/build/wrapper.template.js +2 -2
  67. package/demo/TengwarTelcontar.woff2 +0 -0
  68. package/demo/asset_card.js +1 -2
  69. package/demo/cast_receiver/index.html +1 -1
  70. package/demo/cast_receiver/receiver_app.css +14 -14
  71. package/demo/common/assets.js +2 -0
  72. package/demo/config.js +0 -1
  73. package/demo/custom.js +0 -1
  74. package/demo/customWarning.txt +2 -2
  75. package/demo/demo.less +29 -18
  76. package/demo/demo_uncompiled.js +1 -13
  77. package/demo/index.html +1 -1
  78. package/demo/main.js +3 -3
  79. package/dist/controls.css +2 -2
  80. package/dist/controls.css.map +1 -1
  81. package/dist/demo.compiled.debug.js +191 -194
  82. package/dist/demo.compiled.debug.map +4 -4
  83. package/dist/demo.compiled.js +191 -194
  84. package/dist/demo.compiled.map +4 -4
  85. package/dist/demo.css +1 -1
  86. package/dist/demo.css.map +1 -1
  87. package/dist/deps.js +224 -218
  88. package/dist/locales.js +30 -30
  89. package/dist/receiver.compiled.debug.js +43 -45
  90. package/dist/receiver.compiled.debug.map +4 -4
  91. package/dist/receiver.compiled.js +43 -45
  92. package/dist/receiver.compiled.map +4 -4
  93. package/dist/shaka-player.compiled.d.ts +237 -222
  94. package/dist/shaka-player.compiled.debug.d.ts +237 -222
  95. package/dist/shaka-player.compiled.debug.externs.js +20 -3
  96. package/dist/shaka-player.compiled.debug.js +361 -365
  97. package/dist/shaka-player.compiled.debug.map +4 -4
  98. package/dist/shaka-player.compiled.externs.js +20 -3
  99. package/dist/shaka-player.compiled.js +811 -815
  100. package/dist/shaka-player.compiled.map +4 -4
  101. package/dist/shaka-player.ui.d.ts +281 -275
  102. package/dist/shaka-player.ui.debug.d.ts +281 -275
  103. package/dist/shaka-player.ui.debug.externs.js +34 -26
  104. package/dist/shaka-player.ui.debug.js +384 -389
  105. package/dist/shaka-player.ui.debug.map +4 -4
  106. package/dist/shaka-player.ui.externs.js +34 -26
  107. package/dist/shaka-player.ui.js +945 -950
  108. package/dist/shaka-player.ui.map +4 -4
  109. package/docs/design/REDESIGN.md +33 -33
  110. package/docs/design/codec_preferences.md +1 -1
  111. package/docs/design/dash-audio-channels.md +3 -3
  112. package/docs/design/dash-manifests.md +1 -1
  113. package/docs/design/gap-jumping.md +3 -3
  114. package/docs/design/preload.md +2 -2
  115. package/docs/tutorials/faq.md +8 -8
  116. package/docs/tutorials/index.json +1 -0
  117. package/docs/tutorials/plugins.md +3 -3
  118. package/docs/tutorials/selenium-grid-config.md +122 -0
  119. package/docs/tutorials/welcome.md +10 -2
  120. package/externs/shaka/text.js +10 -0
  121. package/karma.conf.js +156 -45
  122. package/lib/abr/simple_abr_manager.js +12 -6
  123. package/lib/ads/ad_manager.js +1 -0
  124. package/lib/cast/cast_proxy.js +6 -4
  125. package/lib/cast/cast_receiver.js +3 -0
  126. package/lib/cea/cea608_data_channel.js +3 -3
  127. package/lib/cea/cea608_memory.js +1 -1
  128. package/lib/cea/cea708_service.js +6 -5
  129. package/lib/cea/cea_decoder.js +1 -1
  130. package/lib/cea/i_caption_decoder.js +2 -3
  131. package/lib/cea/mp4_cea_parser.js +11 -5
  132. package/lib/cea/sei_processor.js +6 -3
  133. package/lib/dash/dash_parser.js +43 -31
  134. package/lib/dash/mpd_utils.js +4 -5
  135. package/lib/dash/segment_list.js +1 -2
  136. package/lib/dash/segment_template.js +3 -3
  137. package/lib/hls/hls_parser.js +11 -9
  138. package/lib/hls/manifest_text_parser.js +4 -3
  139. package/lib/media/adaptation_set.js +1 -2
  140. package/lib/media/closed_caption_parser.js +0 -1
  141. package/lib/media/content_workarounds.js +2 -2
  142. package/lib/media/drm_engine.js +3 -2
  143. package/lib/media/media_source_engine.js +3 -2
  144. package/lib/media/mp4_segment_index_parser.js +1 -4
  145. package/lib/media/playhead.js +2 -2
  146. package/lib/media/presentation_timeline.js +18 -8
  147. package/lib/media/region_observer.js +39 -33
  148. package/lib/media/region_timeline.js +17 -19
  149. package/lib/media/streaming_engine.js +12 -9
  150. package/lib/media/time_ranges_utils.js +1 -3
  151. package/lib/media/video_wrapper.js +1 -1
  152. package/lib/net/networking_engine.js +5 -1
  153. package/lib/offline/storage.js +14 -15
  154. package/lib/player.js +52 -22
  155. package/lib/polyfill/all.js +2 -3
  156. package/lib/polyfill/encryption_scheme.js +1 -1
  157. package/lib/polyfill/media_capabilities.js +32 -17
  158. package/lib/polyfill/mediasource.js +1 -1
  159. package/lib/routing/walker.js +2 -3
  160. package/lib/text/cue.js +7 -1
  161. package/lib/text/simple_text_displayer.js +2 -1
  162. package/lib/text/text_engine.js +1 -1
  163. package/lib/text/ttml_text_parser.js +92 -63
  164. package/lib/text/ui_text_displayer.js +18 -12
  165. package/lib/util/buffer_utils.js +1 -3
  166. package/lib/util/ebml_parser.js +3 -3
  167. package/lib/util/error.js +1 -1
  168. package/lib/util/fake_event_target.js +21 -1
  169. package/lib/util/iterables.js +0 -46
  170. package/lib/util/mp4_box_parsers.js +1 -4
  171. package/lib/util/mp4_parser.js +5 -7
  172. package/lib/util/periods.js +8 -9
  173. package/lib/util/platform.js +3 -3
  174. package/lib/util/pssh.js +1 -4
  175. package/lib/util/stream_utils.js +60 -8
  176. package/lib/util/string_utils.js +3 -5
  177. package/lib/util/uint8array_utils.js +3 -5
  178. package/lib/util/xml_utils.js +34 -7
  179. package/package.json +62 -40
  180. package/roadmap.md +17 -17
  181. package/test/abr/simple_abr_manager_unit.js +3 -8
  182. package/test/ads/ad_manager_unit.js +0 -6
  183. package/test/cast/cast_proxy_unit.js +0 -8
  184. package/test/cast/cast_receiver_integration.js +1 -18
  185. package/test/cast/cast_receiver_unit.js +1 -9
  186. package/test/cast/cast_sender_unit.js +0 -6
  187. package/test/cast/cast_utils_unit.js +0 -13
  188. package/test/cea/cea608_memory_unit.js +0 -5
  189. package/test/cea/cea708_service_unit.js +0 -7
  190. package/test/cea/cea708_window_unit.js +0 -5
  191. package/test/cea/cea_decoder_unit.js +0 -6
  192. package/test/cea/dtvcc_packet_builder_unit.js +0 -3
  193. package/test/cea/dtvcc_packet_unit.js +0 -5
  194. package/test/cea/mp4_cea_parser_unit.js +0 -4
  195. package/test/dash/dash_parser_content_protection_unit.js +1 -10
  196. package/test/dash/dash_parser_live_unit.js +45 -15
  197. package/test/dash/dash_parser_manifest_unit.js +37 -18
  198. package/test/dash/dash_parser_segment_base_unit.js +1 -8
  199. package/test/dash/dash_parser_segment_list_unit.js +1 -7
  200. package/test/dash/dash_parser_segment_template_unit.js +0 -9
  201. package/test/dash/mpd_utils_unit.js +3 -11
  202. package/test/demo/demo_unit.js +0 -5
  203. package/test/deprecate/enforcer_unit.js +0 -4
  204. package/test/deprecate/version_unit.js +0 -2
  205. package/test/hls/hls_live_unit.js +2 -14
  206. package/test/hls/hls_parser_unit.js +76 -15
  207. package/test/hls/manifest_text_parser_unit.js +0 -10
  208. package/test/media/adaptation_set_criteria_unit.js +3 -7
  209. package/test/media/adaptation_set_unit.js +0 -2
  210. package/test/media/buffering_observer_unit.js +1 -4
  211. package/test/media/closed_caption_parser_unit.js +0 -3
  212. package/test/media/drm_engine_integration.js +3 -17
  213. package/test/media/drm_engine_unit.js +7 -26
  214. package/test/media/manifest_parser_unit.js +0 -4
  215. package/test/media/media_source_engine_integration.js +0 -7
  216. package/test/media/media_source_engine_unit.js +1 -14
  217. package/test/media/mp4_segment_index_parser_unit.js +0 -4
  218. package/test/media/play_rate_controller_unit.js +0 -4
  219. package/test/media/playhead_unit.js +8 -16
  220. package/test/media/presentation_timeline_unit.js +4 -7
  221. package/test/media/region_observer_unit.js +40 -10
  222. package/test/media/region_timeline_unit.js +40 -25
  223. package/test/media/segment_index_unit.js +0 -6
  224. package/test/media/segment_reference_unit.js +0 -3
  225. package/test/media/stall_detector_unit.js +0 -5
  226. package/test/media/streaming_engine_integration.js +11 -37
  227. package/test/media/streaming_engine_unit.js +155 -34
  228. package/test/media/time_ranges_utils_unit.js +0 -2
  229. package/test/media/transmuxer_integration.js +0 -6
  230. package/test/media/webm_segment_index_parser_unit.js +0 -4
  231. package/test/net/data_uri_plugin_unit.js +0 -7
  232. package/test/net/http_plugin_unit.js +0 -9
  233. package/test/net/networking_engine_unit.js +0 -11
  234. package/test/offline/download_progress_estimator_unit.js +0 -2
  235. package/test/offline/indexeddb_storage_unit.js +0 -6
  236. package/test/offline/manifest_convert_unit.js +0 -8
  237. package/test/offline/offline_integration.js +1 -10
  238. package/test/offline/offline_manifest_parser_unit.js +0 -6
  239. package/test/offline/offline_scheme_unit.js +0 -8
  240. package/test/offline/offline_uri_unit.js +0 -2
  241. package/test/offline/storage_compatibility_unit.js +1 -14
  242. package/test/offline/storage_integration.js +1 -25
  243. package/test/player_external.js +2 -10
  244. package/test/player_integration.js +21 -28
  245. package/test/player_load_graph_integration.js +1 -6
  246. package/test/player_src_equals_external.js +3 -9
  247. package/test/player_src_equals_integration.js +0 -7
  248. package/test/player_unit.js +57 -42
  249. package/test/routing/walker_unit.js +0 -8
  250. package/test/test/assets/large_file.mpd +1 -1
  251. package/test/test/boot.js +75 -22
  252. package/test/test/externs/jasmine.js +2 -2
  253. package/test/test/externs/karma.js +4 -0
  254. package/test/test/namespace.js +10 -0
  255. package/test/test/util/canned_idb.js +0 -8
  256. package/test/test/util/cea_utils.js +0 -6
  257. package/test/test/util/dash_parser_util.js +0 -13
  258. package/test/test/util/fake_ad.js +0 -3
  259. package/test/test/util/fake_ad_manager.js +0 -9
  260. package/test/test/util/fake_demo_main.js +0 -5
  261. package/test/test/util/fake_drm_engine.js +0 -6
  262. package/test/test/util/fake_media_source_engine.js +0 -7
  263. package/test/test/util/fake_networking_engine.js +0 -5
  264. package/test/test/util/fake_text_displayer.js +0 -5
  265. package/test/test/util/indexeddb_utils.js +1 -10
  266. package/test/test/util/jasmine_fetch.js +0 -1
  267. package/test/test/util/loader.js +0 -18
  268. package/test/test/util/manifest_generator.js +9 -14
  269. package/test/test/util/manifest_parser_util.js +0 -6
  270. package/test/test/util/offline_utils.js +0 -5
  271. package/test/test/util/simple_fakes.js +9 -26
  272. package/test/test/util/stream_generator.js +0 -14
  273. package/test/test/util/streaming_engine_util.js +0 -15
  274. package/test/test/util/test_scheme.js +1 -19
  275. package/test/test/util/ttml_utils.js +79 -0
  276. package/test/test/util/ui_utils.js +0 -9
  277. package/test/test/util/util.js +15 -26
  278. package/test/test/util/waiter.js +84 -43
  279. package/test/text/cue_integration.js +0 -4
  280. package/test/text/lrc_text_parser_unit.js +0 -4
  281. package/test/text/mp4_ttml_parser_unit.js +10 -23
  282. package/test/text/mp4_vtt_parser_unit.js +1 -7
  283. package/test/text/sbv_text_parser_unit.js +0 -4
  284. package/test/text/simple_text_displayer_unit.js +1 -8
  285. package/test/text/srt_text_parser_unit.js +0 -4
  286. package/test/text/ssa_text_parser_unit.js +0 -5
  287. package/test/text/text_engine_unit.js +2 -7
  288. package/test/text/text_track_integration.js +0 -2
  289. package/test/text/ttml_text_parser_unit.js +495 -237
  290. package/test/text/ui_text_displayer_unit.js +44 -41
  291. package/test/text/vtt_text_parser_unit.js +0 -9
  292. package/test/text/web_vtt_generator_unit.js +0 -3
  293. package/test/ui/ad_ui_unit.js +0 -11
  294. package/test/ui/localization_unit.js +0 -3
  295. package/test/ui/text_displayer_layout_unit.js +9 -19
  296. package/test/ui/ui_customization_unit.js +0 -6
  297. package/test/ui/ui_integration.js +0 -16
  298. package/test/ui/ui_unit.js +1 -17
  299. package/test/util/abortable_operation_unit.js +4 -9
  300. package/test/util/array_utils_unit.js +0 -2
  301. package/test/util/buffer_utils_unit.js +0 -2
  302. package/test/util/data_view_reader_unit.js +0 -4
  303. package/test/util/ebml_parser_unit.js +0 -4
  304. package/test/util/event_manager_unit.js +0 -3
  305. package/test/util/fake_event_target_unit.js +0 -5
  306. package/test/util/functional_unit.js +1 -1
  307. package/test/util/iterables_unit.js +0 -64
  308. package/test/util/language_utils_unit.js +0 -3
  309. package/test/util/manifest_parser_utils_unit.js +0 -2
  310. package/test/util/mp4_box_parsers_unit.js +0 -5
  311. package/test/util/mp4_parser_unit.js +0 -4
  312. package/test/util/multi_map_unit.js +0 -3
  313. package/test/util/object_utils_unit.js +0 -2
  314. package/test/util/periods_unit.js +14 -7
  315. package/test/util/pssh_unit.js +0 -5
  316. package/test/util/state_history_unit.js +0 -2
  317. package/test/util/stream_utils_unit.js +38 -37
  318. package/test/util/string_utils_unit.js +0 -6
  319. package/test/util/text_parser_unit.js +0 -2
  320. package/test/util/xml_utils_unit.js +0 -4
  321. package/ui/controls.js +3 -0
  322. package/ui/less/ad_controls.less +4 -4
  323. package/ui/less/buttons.less +5 -9
  324. package/ui/less/containers.less +5 -7
  325. package/ui/less/overflow_menu.less +4 -4
  326. package/ui/less/range_elements.less +5 -0
  327. package/ui/locales/sjn-translations.yaml +257 -0
  328. package/ui/locales/sjn.json +42 -0
  329. package/ui/localization.js +12 -36
  330. package/ui/text_selection.js +1 -0
  331. package/externs/media_capabilities.js +0 -16
  332. package/externs/svgelement.js +0 -18
@@ -75,50 +75,4 @@ shaka.util.Iterables = class {
75
75
  }
76
76
  return out;
77
77
  }
78
-
79
- /**
80
- * Returns an iterable that contains numbers in the range [0, end).
81
- *
82
- * @param {number} end The exclusive end of the list.
83
- * @return {!Iterable.<number>}
84
- */
85
- static* range(end) {
86
- for (let i = 0; i < end; i++) {
87
- yield i;
88
- }
89
- }
90
-
91
- /**
92
- * Iterates over an iterable object and includes additional info about each
93
- * item:
94
- * - The zero-based index of the element.
95
- * - The next item in the list, if it exists.
96
- * - The previous item in the list, if it exists.
97
- *
98
- * @param {!Iterable.<T>} iterable
99
- * @return {!Iterable.<
100
- * {i: number, item: T, prev: (T|undefined), next: (T|undefined)}>}
101
- * @template T
102
- */
103
- static* enumerate(iterable) {
104
- // Since we want the "next" item, we need to skip the first item and return
105
- // elements one in the past. So as we iterate, we are getting the "next"
106
- // element and yielding the one from the previous iteration.
107
- let i = -1;
108
- let prev = undefined;
109
- let item = undefined;
110
- for (const next of iterable) {
111
- if (i >= 0) {
112
- yield {i, item, prev, next};
113
- }
114
- i++;
115
- prev = item;
116
- item = next;
117
- }
118
- if (i != -1) {
119
- // If it's still -1, there were no items. Otherwise we need to yield
120
- // the last item.
121
- yield {i, prev, item, next: undefined};
122
- }
123
- }
124
78
  };
@@ -7,8 +7,6 @@
7
7
  goog.provide('shaka.util.Mp4BoxParsers');
8
8
 
9
9
  goog.require('shaka.util.DataViewReader');
10
- goog.require('shaka.util.Functional');
11
- goog.require('shaka.util.Iterables');
12
10
 
13
11
  shaka.util.Mp4BoxParsers = class {
14
12
  /**
@@ -125,8 +123,7 @@ shaka.util.Mp4BoxParsers = class {
125
123
  reader.skip(4);
126
124
  }
127
125
 
128
- for (const _ of shaka.util.Iterables.range(sampleCount)) {
129
- shaka.util.Functional.ignored(_);
126
+ for (let i = 0; i < sampleCount; i++) {
130
127
  /** @type {shaka.util.ParsedTRUNSample} */
131
128
  const sample = {
132
129
  sampleDuration: null,
@@ -9,8 +9,6 @@ goog.provide('shaka.util.Mp4Parser');
9
9
  goog.require('goog.asserts');
10
10
  goog.require('shaka.log');
11
11
  goog.require('shaka.util.DataViewReader');
12
- goog.require('shaka.util.Functional');
13
- goog.require('shaka.util.Iterables');
14
12
 
15
13
 
16
14
  /**
@@ -229,8 +227,7 @@ shaka.util.Mp4Parser = class {
229
227
  // start position. The header size varies.
230
228
  const headerSize = shaka.util.Mp4Parser.headerSize(box);
231
229
  const count = box.reader.readUint32();
232
- for (const _ of shaka.util.Iterables.range(count)) {
233
- shaka.util.Functional.ignored(_);
230
+ for (let i = 0; i < count; i++) {
234
231
  box.parser.parseNext(box.start + headerSize, box.reader, box.partialOkay);
235
232
  if (box.parser.done_) {
236
233
  break;
@@ -302,9 +299,10 @@ shaka.util.Mp4Parser = class {
302
299
  * @export
303
300
  */
304
301
  static headerSize(box) {
305
- return /* basic header */ 8
306
- + /* additional 64-bit size field */ (box.has64BitSize ? 8 : 0)
307
- + /* version and flags for a "full" box */ (box.flags != null ? 4 : 0);
302
+ const basicHeaderSize = 8;
303
+ const _64BitFieldSize = box.has64BitSize ? 8 : 0;
304
+ const versionAndFlagsSize = box.flags != null ? 4 : 0;
305
+ return basicHeaderSize + _64BitFieldSize + versionAndFlagsSize;
308
306
  }
309
307
  };
310
308
 
@@ -14,7 +14,6 @@ goog.require('shaka.media.SegmentIndex');
14
14
  goog.require('shaka.util.ArrayUtils');
15
15
  goog.require('shaka.util.Error');
16
16
  goog.require('shaka.util.IReleasable');
17
- goog.require('shaka.util.Iterables');
18
17
  goog.require('shaka.util.LanguageUtils');
19
18
  goog.require('shaka.util.ManifestParserUtils');
20
19
  goog.require('shaka.util.MapUtils');
@@ -98,7 +97,6 @@ shaka.util.PeriodCombiner = class {
98
97
  */
99
98
  async combinePeriods(periods, isDynamic) {
100
99
  const ContentType = shaka.util.ManifestParserUtils.ContentType;
101
- const Iterables = shaka.util.Iterables;
102
100
 
103
101
  shaka.util.PeriodCombiner.filterOutAudioStreamDuplicates_(periods);
104
102
  shaka.util.PeriodCombiner.filterOutVideoStreamDuplicates_(periods);
@@ -118,7 +116,8 @@ shaka.util.PeriodCombiner = class {
118
116
  // Find the first period we haven't seen before. Tag all the periods we
119
117
  // see now as "used".
120
118
  let firstNewPeriodIndex = -1;
121
- for (const {i, item: period} of Iterables.enumerate(periods)) {
119
+ for (let i = 0; i < periods.length; i++) {
120
+ const period = periods[i];
122
121
  if (this.usedPeriodIds_.has(period.id)) {
123
122
  // This isn't new.
124
123
  } else {
@@ -301,6 +300,7 @@ shaka.util.PeriodCombiner = class {
301
300
  t1.label == t2.label &&
302
301
  t1.codecs == t2.codecs &&
303
302
  t1.mimeType == t2.mimeType &&
303
+ t1.bandwidth == t2.bandwidth &&
304
304
  ArrayUtils.hasSameElements(t1.roles, t2.roles)) {
305
305
  duplicate = true;
306
306
  }
@@ -510,13 +510,12 @@ shaka.util.PeriodCombiner = class {
510
510
  static async combine_(
511
511
  outputStreams, streamsPerPeriod, firstNewPeriodIndex, clone, concat) {
512
512
  const ContentType = shaka.util.ManifestParserUtils.ContentType;
513
- const Iterables = shaka.util.Iterables;
514
513
 
515
514
  const unusedStreamsPerPeriod = [];
516
- for (const {i, item: streams} of Iterables.enumerate(streamsPerPeriod)) {
515
+ for (let i = 0; i < streamsPerPeriod.length; i++) {
517
516
  if (i >= firstNewPeriodIndex) {
518
517
  // This periods streams are all new.
519
- unusedStreamsPerPeriod.push(new Set(streams));
518
+ unusedStreamsPerPeriod.push(new Set(streamsPerPeriod[i]));
520
519
  } else {
521
520
  // This period's streams have all been used already.
522
521
  unusedStreamsPerPeriod.push(new Set());
@@ -747,9 +746,9 @@ shaka.util.PeriodCombiner = class {
747
746
 
748
747
  // Concatenate the new matches onto the stream, starting at the first new
749
748
  // period.
750
- const Iterables = shaka.util.Iterables;
751
- for (const {i, item: match} of Iterables.enumerate(matches)) {
749
+ for (let i = 0; i < matches.length; i++) {
752
750
  if (i >= firstNewPeriodIndex) {
751
+ const match = matches[i];
753
752
  concat(outputStream, match);
754
753
 
755
754
  // We only consider an audio stream "used" if its language is related to
@@ -1176,7 +1175,7 @@ shaka.util.PeriodCombiner = class {
1176
1175
  // [r1, r2, r3, r4].
1177
1176
  // If we match stream1 with stream3 due to the same role overlap,
1178
1177
  // stream2 is likely to be left unmatched and error out later.
1179
- // See https://github.com/google/shaka-player/issues/2542 for
1178
+ // See https://github.com/shaka-project/shaka-player/issues/2542 for
1180
1179
  // more details.
1181
1180
  return candidate.roles.length < best.roles.length;
1182
1181
  }
@@ -174,8 +174,8 @@ shaka.util.Platform = class {
174
174
  * @return {boolean}
175
175
  */
176
176
  static isApple() {
177
- return !!navigator.vendor && navigator.vendor.includes('Apple')
178
- && !shaka.util.Platform.isTizen();
177
+ return !!navigator.vendor && navigator.vendor.includes('Apple') &&
178
+ !shaka.util.Platform.isTizen();
179
179
  }
180
180
 
181
181
  /**
@@ -312,7 +312,7 @@ shaka.util.Platform = class {
312
312
  * initialization segments.
313
313
  *
314
314
  * @return {boolean}
315
- * @see https://github.com/google/shaka-player/issues/2759
315
+ * @see https://github.com/shaka-project/shaka-player/issues/2759
316
316
  */
317
317
  static requiresEncryptionInfoInAllInitSegments() {
318
318
  const Platform = shaka.util.Platform;
package/lib/util/pssh.js CHANGED
@@ -9,8 +9,6 @@ goog.provide('shaka.util.Pssh');
9
9
  goog.require('goog.asserts');
10
10
  goog.require('shaka.log');
11
11
  goog.require('shaka.util.BufferUtils');
12
- goog.require('shaka.util.Functional');
13
- goog.require('shaka.util.Iterables');
14
12
  goog.require('shaka.util.Mp4Parser');
15
13
  goog.require('shaka.util.Uint8ArrayUtils');
16
14
 
@@ -83,8 +81,7 @@ shaka.util.Pssh = class {
83
81
  shaka.util.Uint8ArrayUtils.toHex(box.reader.readBytes(16)));
84
82
  if (box.version > 0) {
85
83
  const numKeyIds = box.reader.readUint32();
86
- for (const _ of shaka.util.Iterables.range(numKeyIds)) {
87
- shaka.util.Functional.ignored(_);
84
+ for (let i = 0; i < numKeyIds; i++) {
88
85
  const keyId =
89
86
  shaka.util.Uint8ArrayUtils.toHex(box.reader.readBytes(16));
90
87
  this.cencKeyIds.push(keyId);
@@ -333,14 +333,49 @@ shaka.util.StreamUtils = class {
333
333
  */
334
334
  static async filterManifestByMediaCapabilities(
335
335
  manifest, usePersistentLicenses) {
336
- goog.asserts.assert(window.shakaMediaCapabilities,
336
+ goog.asserts.assert(navigator.mediaCapabilities,
337
337
  'MediaCapabilities should be valid.');
338
338
 
339
339
  await shaka.util.StreamUtils.getDecodingInfosForVariants(
340
340
  manifest.variants, usePersistentLicenses, /* srcEquals= */ false);
341
341
  manifest.variants = manifest.variants.filter((variant) => {
342
+ // See: https://github.com/shaka-project/shaka-player/issues/3860
342
343
  const video = variant.video;
343
- // See: https://github.com/google/shaka-player/issues/3380
344
+ const ContentType = shaka.util.ManifestParserUtils.ContentType;
345
+ if (video) {
346
+ let videoCodecs = shaka.util.StreamUtils.patchVp9(video.codecs);
347
+ // For multiplexed streams. Here we must check the audio of the
348
+ // stream to see if it is compatible.
349
+ if (video.codecs.includes(',')) {
350
+ const allCodecs = video.codecs.split(',');
351
+ videoCodecs = shaka.util.ManifestParserUtils.guessCodecs(
352
+ ContentType.VIDEO, allCodecs);
353
+ const audioCodecs = shaka.util.ManifestParserUtils.guessCodecs(
354
+ ContentType.AUDIO, allCodecs);
355
+ const audioFullType = shaka.util.MimeUtils.getFullOrConvertedType(
356
+ video.mimeType, audioCodecs, ContentType.AUDIO);
357
+ if (!MediaSource.isTypeSupported(audioFullType)) {
358
+ return false;
359
+ }
360
+ }
361
+ const fullType = shaka.util.MimeUtils.getFullOrConvertedType(
362
+ video.mimeType, videoCodecs, ContentType.VIDEO);
363
+ if (!MediaSource.isTypeSupported(fullType)) {
364
+ return false;
365
+ }
366
+ }
367
+ const audio = variant.audio;
368
+ if (audio) {
369
+ const codecs =
370
+ shaka.util.StreamUtils.getCorrectAudioCodecs_(audio.codecs);
371
+ const fullType = shaka.util.MimeUtils.getFullOrConvertedType(
372
+ audio.mimeType, codecs, ContentType.AUDIO);
373
+ if (!MediaSource.isTypeSupported(fullType)) {
374
+ return false;
375
+ }
376
+ }
377
+
378
+ // See: https://github.com/shaka-project/shaka-player/issues/3380
344
379
  if (shaka.util.Platform.isXboxOne() && video &&
345
380
  ((video.width && video.width > 1920) ||
346
381
  (video.height && video.height > 1080)) &&
@@ -422,7 +457,7 @@ shaka.util.StreamUtils = class {
422
457
  return;
423
458
  }
424
459
 
425
- const mediaCapabilities = window.shakaMediaCapabilities;
460
+ const mediaCapabilities = navigator.mediaCapabilities;
426
461
 
427
462
  const operations = [];
428
463
  const getVariantDecodingInfos = (async (variant, decodingConfig) => {
@@ -516,12 +551,8 @@ shaka.util.StreamUtils = class {
516
551
  }
517
552
  }
518
553
  if (audio) {
519
- // Some Tizen devices seem to misreport AC-3 support, but correctly
520
- // report EC-3 support. So query EC-3 as a fallback for AC-3.
521
- // See https://github.com/google/shaka-player/issues/2989 for details.
522
554
  const codecs =
523
- (audio.codecs.toLowerCase() == 'ac-3' &&
524
- shaka.util.Platform.isTizen()) ? 'ec-3' : audio.codecs;
555
+ shaka.util.StreamUtils.getCorrectAudioCodecs_(audio.codecs);
525
556
  const fullType = shaka.util.MimeUtils.getFullOrConvertedType(
526
557
  audio.mimeType, codecs, ContentType.AUDIO);
527
558
 
@@ -632,6 +663,27 @@ shaka.util.StreamUtils = class {
632
663
  return configs;
633
664
  }
634
665
 
666
+
667
+ /**
668
+ * Generates the correct audio codec for MediaDecodingConfiguration and
669
+ * for MediaSource.isTypeSupported.
670
+ * @param {string} codecs
671
+ * @return {string}
672
+ * @private
673
+ */
674
+ static getCorrectAudioCodecs_(codecs) {
675
+ // Some Tizen devices seem to misreport AC-3 support, but correctly
676
+ // report EC-3 support. So query EC-3 as a fallback for AC-3.
677
+ // See https://github.com/shaka-project/shaka-player/issues/2989 for
678
+ // details.
679
+ if (shaka.util.Platform.isTizen()) {
680
+ return codecs.toLowerCase() == 'ac-3' ? 'ec-3' : codecs;
681
+ } else {
682
+ return codecs;
683
+ }
684
+ }
685
+
686
+
635
687
  /**
636
688
  * MediaCapabilities supports 'vp09...' codecs, but not 'vp9'. Translate vp9
637
689
  * codec strings into 'vp09...', to allow such content to play with
@@ -10,7 +10,6 @@ goog.require('goog.asserts');
10
10
  goog.require('shaka.log');
11
11
  goog.require('shaka.util.BufferUtils');
12
12
  goog.require('shaka.util.Error');
13
- goog.require('shaka.util.Iterables');
14
13
  goog.require('shaka.util.Lazy');
15
14
 
16
15
 
@@ -81,7 +80,7 @@ shaka.util.StringUtils = class {
81
80
  const length = Math.floor(data.byteLength / 2);
82
81
  const arr = new Uint16Array(length);
83
82
  const dataView = shaka.util.BufferUtils.toDataView(data);
84
- for (const i of shaka.util.Iterables.range(length)) {
83
+ for (let i = 0; i < length; i++) {
85
84
  arr[i] = dataView.getUint16(i * 2, littleEndian);
86
85
  }
87
86
  return shaka.util.StringUtils.fromCharCode(arr);
@@ -158,9 +157,8 @@ shaka.util.StringUtils = class {
158
157
  static toUTF16(str, littleEndian) {
159
158
  const result = new ArrayBuffer(str.length * 2);
160
159
  const view = new DataView(result);
161
- const enumerate = (it) => shaka.util.Iterables.enumerate(it);
162
- for (const {i, item} of enumerate(str)) {
163
- const value = item.charCodeAt(0);
160
+ for (let i = 0; i < str.length; ++i) {
161
+ const value = str.charCodeAt(i);
164
162
  view.setUint16(/* position= */ i * 2, value, littleEndian);
165
163
  }
166
164
  return result;
@@ -8,7 +8,6 @@ goog.provide('shaka.util.Uint8ArrayUtils');
8
8
 
9
9
  goog.require('shaka.Deprecate');
10
10
  goog.require('shaka.util.BufferUtils');
11
- goog.require('shaka.util.Iterables');
12
11
  goog.require('shaka.util.StringUtils');
13
12
 
14
13
 
@@ -74,9 +73,8 @@ shaka.util.Uint8ArrayUtils = class {
74
73
  // byte.
75
74
  const bytes = window.atob(str.replace(/-/g, '+').replace(/_/g, '/'));
76
75
  const result = new Uint8Array(bytes.length);
77
- const enumerate = (it) => shaka.util.Iterables.enumerate(it);
78
- for (const {i, item} of enumerate(bytes)) {
79
- result[i] = item.charCodeAt(0);
76
+ for (let i = 0; i < bytes.length; ++i) {
77
+ result[i] = bytes.charCodeAt(i);
80
78
  }
81
79
  return result;
82
80
  }
@@ -91,7 +89,7 @@ shaka.util.Uint8ArrayUtils = class {
91
89
  static fromHex(str) {
92
90
  const size = str.length / 2;
93
91
  const arr = new Uint8Array(size);
94
- for (const i of shaka.util.Iterables.range(size)) {
92
+ for (let i = 0; i < size; i++) {
95
93
  arr[i] = window.parseInt(str.substr(i * 2, 2), 16);
96
94
  }
97
95
  return arr;
@@ -56,9 +56,13 @@ shaka.util.XmlUtils = class {
56
56
  * @return {!Array.<!Element>} The child XML elements.
57
57
  */
58
58
  static findChildren(elem, name) {
59
- return Array.from(elem.childNodes).filter((child) => {
60
- return child instanceof Element && child.tagName == name;
61
- });
59
+ const found = [];
60
+ for (const child of elem.childNodes) {
61
+ if (child instanceof Element && child.tagName == name) {
62
+ found.push(child);
63
+ }
64
+ }
65
+ return found;
62
66
  }
63
67
 
64
68
 
@@ -81,10 +85,14 @@ shaka.util.XmlUtils = class {
81
85
  * @return {!Array.<!Element>} The child XML elements.
82
86
  */
83
87
  static findChildrenNS(elem, ns, name) {
84
- return Array.from(elem.childNodes).filter((child) => {
85
- return child instanceof Element && child.localName == name &&
86
- child.namespaceURI == ns;
87
- });
88
+ const found = [];
89
+ for (const child of elem.childNodes) {
90
+ if (child instanceof Element && child.localName == name &&
91
+ child.namespaceURI == ns) {
92
+ found.push(child);
93
+ }
94
+ }
95
+ return found;
88
96
  }
89
97
 
90
98
 
@@ -102,6 +110,25 @@ shaka.util.XmlUtils = class {
102
110
  }
103
111
 
104
112
 
113
+ /**
114
+ * Gets a namespace-qualified attribute.
115
+ * @param {!Element} elem The element to get from.
116
+ * @param {!Array.<string>} nsList The lis of namespace URIs.
117
+ * @param {string} name The local name of the attribute.
118
+ * @return {?string} The attribute's value, or null if not present.
119
+ */
120
+ static getAttributeNSList(elem, nsList, name) {
121
+ // Some browsers return the empty string when the attribute is missing,
122
+ // so check if it exists first. See: https://mzl.la/2L7F0UK
123
+ for (const ns of nsList) {
124
+ if (elem.hasAttributeNS(ns, name)) {
125
+ return elem.getAttributeNS(ns, name);
126
+ }
127
+ }
128
+ return null;
129
+ }
130
+
131
+
105
132
  /**
106
133
  * Gets the text contents of a node.
107
134
  * @param {!Node} elem The XML element.
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "shaka-player",
3
3
  "description": "DASH/EME video player library",
4
- "version": "3.1.4",
5
- "homepage": "https://github.com/google/shaka-player",
4
+ "version": "3.1.7",
5
+ "homepage": "https://github.com/shaka-project/shaka-player",
6
6
  "author": "Google",
7
7
  "maintainers": [
8
8
  {
@@ -11,63 +11,85 @@
11
11
  }
12
12
  ],
13
13
  "devDependencies": {
14
- "@chiragrupani/karma-chromium-edge-launcher": "^2.1.0",
14
+ "@babel/core": "^7.17.5",
15
+ "@babel/polyfill": "^7.12.1",
16
+ "@babel/preset-env": "^7.16.11",
15
17
  "@teppeis/clutz": "^1.0.29-4c95e12.v20190929",
16
- "awesomplete": "^1.1.4",
17
- "babel-core": "^6.26.3",
18
- "babel-plugin-istanbul": "^4.1.6",
19
- "babel-polyfill": "^6.26.0",
20
- "babel-preset-env": "^1.7.0",
18
+ "awesomplete": "^1.1.5",
19
+ "babel-plugin-istanbul": "^6.1.1",
21
20
  "cajon": "^0.4.4",
22
- "core-js": "^3.6.5",
23
- "dialog-polyfill": "^0.5.0",
21
+ "code-prettify": "^0.1.0",
22
+ "color-themes-for-google-code-prettify": "^2.0.4",
23
+ "core-js": "^3.21.1",
24
+ "dialog-polyfill": "^0.5.6",
24
25
  "es6-promise-polyfill": "^1.2.0",
25
- "eslint": "^7.18.0",
26
- "eslint-config-google": "^0.13.0",
26
+ "eslint": "^8.9.0",
27
+ "eslint-config-google": "^0.14.0",
27
28
  "eslint-plugin-shaka-rules": "file:./build/eslint-plugin-shaka-rules",
28
29
  "esprima": "^4.0.1",
29
30
  "fastestsmallesttextencoderdecoder": "^1.0.22",
30
31
  "fontfaceonload": "^1.0.2",
31
- "google-closure-compiler-java": "^20210505.0.0",
32
- "google-closure-library": "^20210406.0.0",
33
- "htmlhint": "^0.11.0",
32
+ "google-closure-compiler-java": "^20220301.0.0",
33
+ "google-closure-deps": "https://gitpkg.now.sh/google/closure-library/closure-deps?d7736da6",
34
+ "google-closure-library": "^20220301.0.0",
35
+ "htmlhint": "^1.1.3",
34
36
  "jasmine-ajax": "^4.0.0",
35
- "jimp": "^0.11.0",
36
- "jsdoc": "github:joeyparrish/jsdoc#45c271fa",
37
- "karma": "^6.2.0",
38
- "karma-babel-preprocessor": "^7.0.0",
39
- "karma-chrome-launcher": "^2.2.0",
40
- "karma-coverage": "^1.1.2",
41
- "karma-edge-launcher": "^0.4.2",
42
- "karma-firefox-launcher": "^1.1.0",
43
- "karma-ie-launcher": "^1.0.0",
44
- "karma-jasmine": "^3.3.1",
37
+ "jimp": "^0.16.1",
38
+ "js-yaml": "^4.1.0",
39
+ "jsdoc": "github:joeyparrish/jsdoc#2ca85bb6",
40
+ "karma": "^6.3.16",
41
+ "karma-babel-preprocessor": "^8.0.2",
42
+ "karma-coverage": "^2.2.0",
43
+ "karma-jasmine": "^4.0.1",
45
44
  "karma-jasmine-ajax": "^0.1.13",
45
+ "karma-local-wd-launcher": "^1.6.1",
46
46
  "karma-opera-launcher": "^1.0.0",
47
- "karma-safari-launcher": "^1.0.0",
48
- "karma-sourcemap-loader": "^0.3.7",
49
- "karma-spec-reporter": "0.0.32",
47
+ "karma-sourcemap-loader": "^0.3.8",
48
+ "karma-spec-reporter": "^0.0.34",
50
49
  "karma-webdriver-launcher": "^1.0.8",
51
- "less": "^3.13.1",
52
- "less-plugin-clean-css": "^1.5.1",
50
+ "less": "https://gitpkg.now.sh/joeyparrish/less.js/packages/less?28c63a43",
51
+ "less-plugin-clean-css": "github:austingardner/less-plugin-clean-css#4e9e77bf",
53
52
  "material-design-lite": "^1.3.0",
54
- "mux.js": "^5.7.0",
55
- "pwacompat": "^2.0.10",
56
- "rimraf": "^2.6.3",
53
+ "mux.js": "^5.14.1",
54
+ "open-sans-fonts": "^1.6.2",
55
+ "postcss-less": "^6.0.0",
56
+ "pwacompat": "^2.0.17",
57
+ "rimraf": "^3.0.2",
57
58
  "sprintf-js": "^1.1.2",
58
- "stylelint": "^13.8.0",
59
- "stylelint-config-standard": "^20.0.0",
60
- "tippy.js": "^4.3.1",
61
- "ua-parser-js": "^0.7.24",
62
- "which": "^1.3.1"
59
+ "ssim.js": "^3.5.0",
60
+ "stylelint": "^14.5.1",
61
+ "stylelint-config-standard": "^25.0.0",
62
+ "tippy.js": "^4.3.5",
63
+ "which": "^2.0.2"
64
+ },
65
+ "shakaCustom": {
66
+ "purposeOfDemoDeps": "These are the files from node_modules that need to be deployed with the demo app.",
67
+ "demoDeps": [
68
+ "awesomplete/awesomplete.css",
69
+ "awesomplete/awesomplete.min.js",
70
+ "dialog-polyfill/dialog-polyfill.css",
71
+ "dialog-polyfill/dist/dialog-polyfill.js",
72
+ "eme-encryption-scheme-polyfill/index.js",
73
+ "es6-promise-polyfill/promise.min.js",
74
+ "fastestsmallesttextencoderdecoder/EncoderDecoderTogether.min.js",
75
+ "google-closure-library/closure/goog/base.js",
76
+ "less/dist/less.js",
77
+ "material-design-lite/dist/material.indigo-blue.min.css",
78
+ "material-design-lite/dist/material.min.js",
79
+ "mux.js/dist/mux.min.js",
80
+ "popper.js/dist/umd/popper.min.js",
81
+ "pwacompat/pwacompat.min.js",
82
+ "tippy.js/umd/index.min.js",
83
+ "tippy.js/index.css"
84
+ ]
63
85
  },
64
86
  "main": "dist/shaka-player.compiled.js",
65
87
  "repository": {
66
88
  "type": "git",
67
- "url": "https://github.com/google/shaka-player.git"
89
+ "url": "https://github.com/shaka-project/shaka-player.git"
68
90
  },
69
91
  "bugs": {
70
- "url": "https://github.com/google/shaka-player/issues"
92
+ "url": "https://github.com/shaka-project/shaka-player/issues"
71
93
  },
72
94
  "license": "Apache-2.0",
73
95
  "scripts": {
package/roadmap.md CHANGED
@@ -10,45 +10,45 @@ so the exact milestone for future features is not pre-determined.
10
10
 
11
11
  Candidate features for future release cycles
12
12
  - HLS performance improvements
13
- https://github.com/google/shaka-player/issues/3363
13
+ https://github.com/shaka-project/shaka-player/issues/3363
14
14
  - HLS interstitial support
15
- https://github.com/google/shaka-player/issues/3364
15
+ https://github.com/shaka-project/shaka-player/issues/3364
16
16
  - Integration with Google Video ML/Cloud AI
17
17
  - Support containerless formats
18
- https://github.com/google/shaka-player/issues/2337
18
+ https://github.com/shaka-project/shaka-player/issues/2337
19
19
  - Support ID3 tags in mp4
20
- https://github.com/google/shaka-player/issues/3351
20
+ https://github.com/shaka-project/shaka-player/issues/3351
21
21
  - MSE support for FairPlay
22
- https://github.com/google/shaka-player/issues/3346
22
+ https://github.com/shaka-project/shaka-player/issues/3346
23
23
  - Codec-switching and order preference
24
- https://github.com/google/shaka-player/issues/1528
25
- https://github.com/google/shaka-player/issues/2179
24
+ https://github.com/shaka-project/shaka-player/issues/1528
25
+ https://github.com/shaka-project/shaka-player/issues/2179
26
26
  - Configurable key-system priority
27
- https://github.com/google/shaka-player/issues/3002
27
+ https://github.com/shaka-project/shaka-player/issues/3002
28
28
  - Preload API
29
- https://github.com/google/shaka-player/issues/880
29
+ https://github.com/shaka-project/shaka-player/issues/880
30
30
  - Thumbnail tracks
31
- DASH: https://github.com/google/shaka-player/issues/559
32
- HLS: https://github.com/google/shaka-player/issues/2429
31
+ DASH: https://github.com/shaka-project/shaka-player/issues/559
32
+ HLS: https://github.com/shaka-project/shaka-player/issues/2429
33
33
  - Smaller, more modular binary
34
34
  - Official TypeScript defs, generated from source
35
- https://github.com/google/shaka-player/issues/1030
35
+ https://github.com/shaka-project/shaka-player/issues/1030
36
36
 
37
37
  v3.3 - 2021 Q3
38
38
  - Background fetch for offline storage
39
- https://github.com/google/shaka-player/issues/879
39
+ https://github.com/shaka-project/shaka-player/issues/879
40
40
  - Shaka Analytics Component and an integration with BigQuery Analytics
41
- https://github.com/google/shaka-player/issues/3359
41
+ https://github.com/shaka-project/shaka-player/issues/3359
42
42
 
43
43
  v3.2 - 2021 Q2
44
44
  - MediaCapabilities to make performance-based decisions
45
- https://github.com/google/shaka-player/issues/1391
45
+ https://github.com/shaka-project/shaka-player/issues/1391
46
46
 
47
47
  v3.1 - 2021 Q2
48
48
  - Low-latency live (LL-HLS, LL-DASH)
49
- https://github.com/google/shaka-player/issues/1525
49
+ https://github.com/shaka-project/shaka-player/issues/1525
50
50
  - Own CEA parser, use mux.js only for TS
51
- https://github.com/google/shaka-player/issues/2648
51
+ https://github.com/shaka-project/shaka-player/issues/2648
52
52
 
53
53
  =====
54
54