shaka-player 4.3.10 → 4.4.0

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 (316) hide show
  1. package/.github/workflows/release-please.yaml +7 -0
  2. package/AUTHORS +9 -0
  3. package/CHANGELOG.md +295 -200
  4. package/CONTRIBUTORS +8 -0
  5. package/LICENSE +32 -0
  6. package/README.md +63 -10
  7. package/demo/autoTemplate.txt +40 -5
  8. package/demo/close_button.js +11 -0
  9. package/demo/common/asset.js +13 -1
  10. package/demo/common/assets.js +53 -3
  11. package/demo/common/message_ids.js +25 -1
  12. package/demo/config.js +69 -10
  13. package/demo/customWarning.txt +2 -2
  14. package/demo/index.html +3 -1
  15. package/demo/locales/en.json +26 -2
  16. package/demo/locales/source.json +105 -9
  17. package/demo/main.js +52 -9
  18. package/demo/search.js +3 -1
  19. package/demo/service_worker.js +3 -0
  20. package/dist/controls.css +1 -1
  21. package/dist/controls.css.map +1 -1
  22. package/dist/demo.compiled.debug.js +124 -112
  23. package/dist/demo.compiled.debug.map +3 -3
  24. package/dist/demo.compiled.js +124 -112
  25. package/dist/demo.compiled.map +3 -3
  26. package/dist/deps.js +46 -28
  27. package/dist/locales.js +28 -28
  28. package/dist/receiver.compiled.debug.js +52 -46
  29. package/dist/receiver.compiled.debug.map +3 -3
  30. package/dist/receiver.compiled.js +52 -46
  31. package/dist/receiver.compiled.map +3 -3
  32. package/dist/shaka-player.compiled.d.ts +676 -391
  33. package/dist/shaka-player.compiled.debug.d.ts +676 -391
  34. package/dist/shaka-player.compiled.debug.externs.js +1188 -616
  35. package/dist/shaka-player.compiled.debug.js +1045 -700
  36. package/dist/shaka-player.compiled.debug.map +4 -4
  37. package/dist/shaka-player.compiled.externs.js +1188 -616
  38. package/dist/shaka-player.compiled.js +1094 -933
  39. package/dist/shaka-player.compiled.map +4 -4
  40. package/dist/shaka-player.ui.d.ts +677 -392
  41. package/dist/shaka-player.ui.debug.d.ts +677 -392
  42. package/dist/shaka-player.ui.debug.externs.js +1023 -451
  43. package/dist/shaka-player.ui.debug.js +1100 -739
  44. package/dist/shaka-player.ui.debug.map +4 -4
  45. package/dist/shaka-player.ui.externs.js +1023 -451
  46. package/dist/shaka-player.ui.js +1244 -1071
  47. package/dist/shaka-player.ui.map +4 -4
  48. package/docs/tutorials/ad_monetization.md +15 -1
  49. package/docs/tutorials/application-level-redirects.md +1 -1
  50. package/docs/tutorials/config.md +9 -5
  51. package/docs/tutorials/drm-config.md +61 -0
  52. package/docs/tutorials/fairplay.md +19 -4
  53. package/docs/tutorials/license-server-auth.md +4 -4
  54. package/docs/tutorials/license-wrapping.md +2 -2
  55. package/docs/tutorials/ui-customization.md +7 -3
  56. package/docs/tutorials/ui.md +7 -7
  57. package/docs/tutorials/upgrade.md +3 -0
  58. package/externs/ima.js +123 -2
  59. package/externs/isoboxer.js +217 -0
  60. package/externs/mediakeys.js +18 -0
  61. package/externs/mux.js +1 -105
  62. package/externs/pictureinpicture.js +48 -0
  63. package/externs/shaka/ads.js +61 -1
  64. package/externs/shaka/cea.js +110 -0
  65. package/externs/shaka/codecs.js +32 -0
  66. package/externs/shaka/manifest.js +101 -1
  67. package/externs/shaka/manifest_parser.js +0 -10
  68. package/externs/shaka/net.js +36 -7
  69. package/externs/shaka/offline.js +8 -1
  70. package/externs/shaka/player.js +220 -21
  71. package/externs/shaka/text.js +1 -382
  72. package/externs/shaka/transmuxer.js +59 -0
  73. package/karma.conf.js +13 -0
  74. package/lib/abr/simple_abr_manager.js +6 -3
  75. package/lib/ads/ad_manager.js +60 -2
  76. package/lib/ads/client_side_ad.js +86 -0
  77. package/lib/ads/client_side_ad_manager.js +79 -3
  78. package/lib/ads/server_side_ad.js +86 -0
  79. package/lib/ads/server_side_ad_manager.js +13 -0
  80. package/lib/cast/cast_utils.js +1 -0
  81. package/lib/cea/cea608_data_channel.js +24 -14
  82. package/lib/cea/cea608_memory.js +5 -2
  83. package/lib/cea/cea708_service.js +8 -9
  84. package/lib/cea/cea708_window.js +1 -2
  85. package/lib/cea/cea_decoder.js +23 -6
  86. package/lib/cea/cea_utils.js +25 -2
  87. package/lib/cea/dummy_caption_decoder.js +21 -0
  88. package/lib/cea/dummy_cea_parser.js +1 -3
  89. package/lib/cea/mp4_cea_parser.js +15 -10
  90. package/lib/cea/ts_cea_parser.js +69 -0
  91. package/lib/dash/content_protection.js +32 -2
  92. package/lib/dash/dash_parser.js +93 -31
  93. package/lib/dash/mpd_utils.js +6 -25
  94. package/lib/dash/segment_base.js +12 -14
  95. package/lib/dash/segment_list.js +10 -6
  96. package/lib/dash/segment_template.js +349 -32
  97. package/lib/dependencies/all.js +8 -0
  98. package/lib/hls/hls_classes.js +33 -8
  99. package/lib/hls/hls_parser.js +805 -191
  100. package/lib/hls/manifest_text_parser.js +4 -14
  101. package/lib/media/adaptation_set_criteria.js +43 -3
  102. package/lib/media/closed_caption_parser.js +74 -12
  103. package/lib/media/drm_engine.js +189 -49
  104. package/lib/media/gap_jumping_controller.js +1 -1
  105. package/lib/media/manifest_parser.js +34 -0
  106. package/lib/media/media_source_capabilities.js +10 -0
  107. package/lib/media/media_source_engine.js +475 -231
  108. package/lib/media/playhead.js +1 -1
  109. package/lib/media/presentation_timeline.js +62 -0
  110. package/lib/media/segment_index.js +50 -14
  111. package/lib/media/segment_prefetch.js +277 -0
  112. package/lib/media/segment_reference.js +70 -4
  113. package/lib/media/streaming_engine.js +258 -81
  114. package/lib/media/video_wrapper.js +15 -7
  115. package/lib/mss/content_protection.js +353 -0
  116. package/lib/mss/mss_parser.js +1081 -0
  117. package/lib/net/networking_engine.js +60 -10
  118. package/lib/offline/indexeddb/v1_storage_cell.js +1 -0
  119. package/lib/offline/indexeddb/v2_storage_cell.js +1 -0
  120. package/lib/offline/manifest_converter.js +6 -0
  121. package/lib/offline/storage.js +2 -4
  122. package/lib/player.js +309 -105
  123. package/lib/polyfill/media_capabilities.js +43 -3
  124. package/lib/polyfill/patchedmediakeys_apple.js +5 -0
  125. package/lib/polyfill/patchedmediakeys_nop.js +5 -0
  126. package/lib/polyfill/patchedmediakeys_webkit.js +5 -0
  127. package/lib/text/cue.js +208 -130
  128. package/lib/text/lrc_text_parser.js +2 -2
  129. package/lib/text/mp4_vtt_parser.js +2 -2
  130. package/lib/text/sbv_text_parser.js +1 -1
  131. package/lib/text/simple_text_displayer.js +2 -1
  132. package/lib/text/srt_text_parser.js +9 -1
  133. package/lib/text/ssa_text_parser.js +2 -2
  134. package/lib/text/text_engine.js +3 -21
  135. package/lib/text/text_utils.js +71 -20
  136. package/lib/text/ui_text_displayer.js +14 -14
  137. package/lib/text/vtt_text_parser.js +22 -14
  138. package/lib/transmuxer/aac_transmuxer.js +224 -0
  139. package/lib/transmuxer/ac3.js +142 -0
  140. package/lib/transmuxer/ac3_transmuxer.js +212 -0
  141. package/lib/transmuxer/adts.js +232 -0
  142. package/lib/transmuxer/ec3.js +103 -0
  143. package/lib/transmuxer/ec3_transmuxer.js +212 -0
  144. package/lib/transmuxer/h264.js +324 -0
  145. package/lib/transmuxer/mp3_transmuxer.js +204 -0
  146. package/lib/transmuxer/mpeg_audio.js +196 -0
  147. package/lib/transmuxer/mpeg_ts_transmuxer.js +182 -0
  148. package/lib/transmuxer/mss_transmuxer.js +389 -0
  149. package/lib/{media/transmuxer.js → transmuxer/muxjs_transmuxer.js} +34 -80
  150. package/lib/transmuxer/transmuxer_engine.js +161 -0
  151. package/lib/transmuxer/ts_transmuxer.js +738 -0
  152. package/lib/util/cmcd_manager.js +131 -71
  153. package/lib/util/error.js +62 -26
  154. package/lib/util/exp_golomb.js +220 -0
  155. package/lib/util/fairplay_utils.js +64 -13
  156. package/lib/util/id3_utils.js +56 -3
  157. package/lib/util/language_utils.js +11 -8
  158. package/lib/util/manifest_parser_utils.js +3 -0
  159. package/lib/util/mime_utils.js +44 -7
  160. package/lib/util/mp4_box_parsers.js +233 -5
  161. package/lib/util/mp4_generator.js +1381 -0
  162. package/lib/util/periods.js +40 -34
  163. package/lib/util/platform.js +17 -3
  164. package/lib/util/player_configuration.js +38 -1
  165. package/lib/util/stream_utils.js +138 -27
  166. package/lib/util/text_parser.js +1 -1
  167. package/lib/util/ts_parser.js +470 -47
  168. package/lib/util/xml_utils.js +16 -3
  169. package/maintained-branches.md +2 -2
  170. package/package.json +3 -1
  171. package/roadmap.md +21 -6
  172. package/shaka-player.uncompiled.js +18 -0
  173. package/test/abr/simple_abr_manager_unit.js +32 -4
  174. package/test/ads/ad_manager_unit.js +18 -2
  175. package/test/cast/cast_utils_unit.js +7 -2
  176. package/test/cea/cea608_memory_unit.js +24 -0
  177. package/test/cea/cea_decoder_unit.js +33 -0
  178. package/test/dash/dash_parser_content_protection_unit.js +93 -3
  179. package/test/dash/dash_parser_live_unit.js +56 -13
  180. package/test/dash/dash_parser_manifest_unit.js +70 -2
  181. package/test/dash/dash_parser_segment_base_unit.js +14 -9
  182. package/test/dash/dash_parser_segment_template_unit.js +286 -6
  183. package/test/demo/demo_unit.js +5 -1
  184. package/test/hls/hls_live_unit.js +188 -28
  185. package/test/hls/hls_parser_unit.js +250 -109
  186. package/test/hls/manifest_text_parser_unit.js +18 -13
  187. package/test/media/adaptation_set_criteria_unit.js +46 -14
  188. package/test/media/adaptation_set_unit.js +2 -0
  189. package/test/media/drm_engine_integration.js +11 -8
  190. package/test/media/drm_engine_unit.js +220 -7
  191. package/test/media/media_source_engine_integration.js +122 -38
  192. package/test/media/media_source_engine_unit.js +133 -153
  193. package/test/media/playhead_unit.js +3 -0
  194. package/test/media/presentation_timeline_unit.js +51 -0
  195. package/test/media/segment_index_unit.js +52 -0
  196. package/test/media/segment_prefetch_unit.js +243 -0
  197. package/test/media/streaming_engine_integration.js +9 -3
  198. package/test/media/streaming_engine_unit.js +440 -59
  199. package/test/mss/mss_parser_content_protection_unit.js +49 -0
  200. package/test/mss/mss_parser_unit.js +472 -0
  201. package/test/mss/mss_player_integration.js +123 -0
  202. package/test/offline/manifest_convert_unit.js +9 -0
  203. package/test/offline/storage_integration.js +6 -1
  204. package/test/player_unit.js +386 -133
  205. package/test/polyfill/media_capabilities_unit.js +18 -0
  206. package/test/test/assets/hls-raw-aac/fileSequence0.aac +0 -0
  207. package/test/test/assets/hls-raw-aac/fileSequence1.aac +0 -0
  208. package/test/test/assets/hls-raw-aac/fileSequence2.aac +0 -0
  209. package/test/test/assets/hls-raw-aac/fileSequence3.aac +0 -0
  210. package/test/test/assets/hls-raw-aac/manifest.m3u8 +4 -0
  211. package/test/test/assets/hls-raw-aac/stream.m4a.m3u8 +14 -0
  212. package/test/test/assets/hls-raw-ac3/fileSequence0.ac3 +0 -0
  213. package/test/test/assets/hls-raw-ac3/fileSequence1.ac3 +0 -0
  214. package/test/test/assets/hls-raw-ac3/fileSequence2.ac3 +0 -0
  215. package/test/test/assets/hls-raw-ac3/fileSequence3.ac3 +0 -0
  216. package/test/test/assets/hls-raw-ac3/fileSequence4.ac3 +0 -0
  217. package/test/test/assets/hls-raw-ac3/fileSequence5.ac3 +0 -0
  218. package/test/test/assets/hls-raw-ac3/fileSequence6.ac3 +0 -0
  219. package/test/test/assets/hls-raw-ac3/fileSequence7.ac3 +0 -0
  220. package/test/test/assets/hls-raw-ac3/prog_index.m3u8 +31 -0
  221. package/test/test/assets/hls-raw-ec3/fileSequence0.ec3 +0 -0
  222. package/test/test/assets/hls-raw-ec3/fileSequence1.ec3 +0 -0
  223. package/test/test/assets/hls-raw-ec3/fileSequence2.ec3 +0 -0
  224. package/test/test/assets/hls-raw-ec3/fileSequence3.ec3 +0 -0
  225. package/test/test/assets/hls-raw-ec3/fileSequence4.ec3 +0 -0
  226. package/test/test/assets/hls-raw-ec3/fileSequence5.ec3 +0 -0
  227. package/test/test/assets/hls-raw-ec3/fileSequence6.ec3 +0 -0
  228. package/test/test/assets/hls-raw-ec3/fileSequence7.ec3 +0 -0
  229. package/test/test/assets/hls-raw-ec3/prog_index.m3u8 +31 -0
  230. package/test/test/assets/hls-raw-mp3/chunklist_w905519204.m3u8 +13 -0
  231. package/test/test/assets/hls-raw-mp3/media_w905519204_0.mp3 +0 -0
  232. package/test/test/assets/hls-raw-mp3/media_w905519204_1.mp3 +0 -0
  233. package/test/test/assets/hls-raw-mp3/media_w905519204_2.mp3 +0 -0
  234. package/test/test/assets/hls-raw-mp3/media_w905519204_3.mp3 +0 -0
  235. package/test/test/assets/hls-raw-mp3/playlist.m3u8 +4 -0
  236. package/test/test/assets/hls-ts-aac/playlist.m3u8 +23 -0
  237. package/test/test/assets/hls-ts-aac/segment_0.ts +0 -0
  238. package/test/test/assets/hls-ts-aac/segment_1.ts +0 -0
  239. package/test/test/assets/hls-ts-aac/segment_2.ts +0 -0
  240. package/test/test/assets/hls-ts-aac/segment_3.ts +0 -0
  241. package/test/test/assets/hls-ts-aac/segment_4.ts +0 -0
  242. package/test/test/assets/hls-ts-aac/segment_5.ts +0 -0
  243. package/test/test/assets/hls-ts-aac/segment_6.ts +0 -0
  244. package/test/test/assets/hls-ts-aac/segment_7.ts +0 -0
  245. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0000.ts +0 -0
  246. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0001.ts +0 -0
  247. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0002.ts +0 -0
  248. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0003.ts +0 -0
  249. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0004.ts +0 -0
  250. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0005.ts +0 -0
  251. package/test/test/assets/hls-ts-ac3/prog_index.m3u8 +19 -0
  252. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0000.ts +0 -0
  253. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0001.ts +0 -0
  254. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0002.ts +0 -0
  255. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0003.ts +0 -0
  256. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0004.ts +0 -0
  257. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0005.ts +0 -0
  258. package/test/test/assets/hls-ts-ec3/prog_index.m3u8 +19 -0
  259. package/test/test/assets/hls-ts-h264/fileSequence0.ts +0 -0
  260. package/test/test/assets/hls-ts-h264/fileSequence1.ts +0 -0
  261. package/test/test/assets/hls-ts-h264/fileSequence2.ts +0 -0
  262. package/test/test/assets/hls-ts-h264/fileSequence3.ts +0 -0
  263. package/test/test/assets/hls-ts-h264/fileSequence4.ts +0 -0
  264. package/test/test/assets/hls-ts-h264/fileSequence5.ts +0 -0
  265. package/test/test/assets/hls-ts-h264/prog_index.m3u8 +25 -0
  266. package/test/test/assets/hls-ts-mp3/manifest.m3u8 +13 -0
  267. package/test/test/assets/hls-ts-mp3/media_w239891843_0.ts +0 -0
  268. package/test/test/assets/hls-ts-mp3/media_w239891843_1.ts +0 -0
  269. package/test/test/assets/hls-ts-mp3/media_w239891843_2.ts +0 -0
  270. package/test/test/assets/hls-ts-mp3/media_w239891843_3.ts +0 -0
  271. package/test/test/assets/hls-ts-muxed-aac-h264/chunk.m3u8 +17 -0
  272. package/test/test/assets/hls-ts-muxed-aac-h264/n_0_0_0.ts +0 -0
  273. package/test/test/assets/hls-ts-muxed-aac-h264/n_1_0_0.ts +0 -0
  274. package/test/test/assets/hls-ts-muxed-aac-h264/n_2_0_0.ts +0 -0
  275. package/test/test/assets/hls-ts-muxed-aac-h264/n_3_0_0.ts +0 -0
  276. package/test/test/assets/hls-ts-muxed-aac-h264/n_4_0_0.ts +0 -0
  277. package/test/test/assets/hls-ts-muxed-aac-h264/n_5_0_0.ts +0 -0
  278. package/test/test/assets/hls-ts-muxed-aac-h264/playlist.m3u8 +4 -0
  279. package/test/test/boot.js +7 -2
  280. package/test/test/util/fake_ad.js +99 -0
  281. package/test/test/util/fake_ad_manager.js +7 -1
  282. package/test/test/util/fake_networking_engine.js +41 -14
  283. package/test/test/util/fake_segment_prefetch.js +81 -0
  284. package/test/test/util/manifest_generator.js +19 -5
  285. package/test/test/util/mss_parser_util.js +115 -0
  286. package/test/test/util/offline_utils.js +1 -0
  287. package/test/test/util/simple_fakes.js +12 -3
  288. package/test/test/util/streaming_engine_util.js +14 -4
  289. package/test/test/util/ttml_utils.js +2 -2
  290. package/test/text/cue_integration.js +1 -1
  291. package/test/text/srt_text_parser_unit.js +78 -0
  292. package/test/text/text_engine_unit.js +17 -8
  293. package/test/text/ui_text_displayer_unit.js +4 -4
  294. package/test/text/vtt_text_parser_unit.js +59 -40
  295. package/test/text/web_vtt_generator_unit.js +9 -3
  296. package/test/{media/transmuxer_integration.js → transmuxer/muxjs_transmuxer_integration.js} +30 -33
  297. package/test/transmuxer/transmuxer_engine_integration.js +60 -0
  298. package/test/transmuxer/transmuxer_integration.js +296 -0
  299. package/test/util/cmcd_manager_unit.js +162 -13
  300. package/test/util/language_utils_unit.js +9 -2
  301. package/test/util/mp4_box_parsers_unit.js +39 -4
  302. package/test/util/periods_unit.js +34 -26
  303. package/test/util/stream_utils_unit.js +60 -107
  304. package/ui/controls.js +19 -1
  305. package/ui/controls.less +1 -0
  306. package/ui/externs/ui.js +11 -1
  307. package/ui/language_utils.js +15 -0
  308. package/ui/less/thumbnails.less +26 -0
  309. package/ui/locales/oc.json +42 -0
  310. package/ui/pip_button.js +83 -2
  311. package/ui/range_element.js +15 -0
  312. package/ui/resolution_selection.js +9 -2
  313. package/ui/seek_bar.js +223 -0
  314. package/ui/ui.js +5 -0
  315. package/lib/cea/i_caption_decoder.js +0 -51
  316. package/lib/cea/i_cea_parser.js +0 -68
@@ -10,6 +10,10 @@ describe('HlsParser', () => {
10
10
  const Util = shaka.test.Util;
11
11
  const originalAlwaysWarn = shaka.log.alwaysWarn;
12
12
 
13
+ const videoInitSegmentUri = '/base/test/test/assets/sintel-video-init.mp4';
14
+ const videoSegmentUri = '/base/test/test/assets/sintel-video-segment.mp4';
15
+ const videoTsSegmentUri = '/base/test/test/assets/video.ts';
16
+
13
17
  const vttText = [
14
18
  'WEBVTT\n',
15
19
  '\n',
@@ -34,52 +38,33 @@ describe('HlsParser', () => {
34
38
  /** @type {!Uint8Array} */
35
39
  let segmentData;
36
40
  /** @type {!Uint8Array} */
41
+ let tsSegmentData;
42
+ /** @type {!Uint8Array} */
37
43
  let selfInitializingSegmentData;
38
44
  /** @type {!Uint8Array} */
39
45
  let aes128Key;
46
+ /** @type {!boolean} */
47
+ let sequenceMode;
40
48
 
41
49
  afterEach(() => {
42
50
  shaka.log.alwaysWarn = originalAlwaysWarn;
43
51
  parser.stop();
44
52
  });
45
53
 
46
- beforeEach(() => {
47
- // TODO: use StreamGenerator?
48
- initSegmentData = new Uint8Array([
49
- 0x00, 0x00, 0x00, 0x30, // size (48)
50
- 0x6D, 0x6F, 0x6F, 0x76, // type (moov)
51
- 0x00, 0x00, 0x00, 0x28, // trak size (40)
52
- 0x74, 0x72, 0x61, 0x6B, // type (trak)
53
- 0x00, 0x00, 0x00, 0x20, // mdia size (32)
54
- 0x6D, 0x64, 0x69, 0x61, // type (mdia)
55
-
56
- 0x00, 0x00, 0x00, 0x18, // mdhd size (24)
57
- 0x6D, 0x64, 0x68, 0x64, // type (mdhd)
58
- 0x00, 0x00, 0x00, 0x00, // version and flags
59
-
60
- 0x00, 0x00, 0x00, 0x00, // creation time (0)
61
- 0x00, 0x00, 0x00, 0x00, // modification time (0)
62
- 0x00, 0x00, 0x03, 0xe8, // timescale (1000)
54
+ beforeEach(async () => {
55
+ const responses = await Promise.all([
56
+ shaka.test.Util.fetch(videoInitSegmentUri),
57
+ shaka.test.Util.fetch(videoSegmentUri),
58
+ shaka.test.Util.fetch(videoTsSegmentUri),
63
59
  ]);
64
-
65
- segmentData = new Uint8Array([
66
- 0x00, 0x00, 0x00, 0x24, // size (36)
67
- 0x6D, 0x6F, 0x6F, 0x66, // type (moof)
68
- 0x00, 0x00, 0x00, 0x1C, // traf size (28)
69
- 0x74, 0x72, 0x61, 0x66, // type (traf)
70
-
71
- 0x00, 0x00, 0x00, 0x14, // tfdt size (20)
72
- 0x74, 0x66, 0x64, 0x74, // type (tfdt)
73
- 0x01, 0x00, 0x00, 0x00, // version and flags
74
-
75
- 0x00, 0x00, 0x00, 0x00, // baseMediaDecodeTime first 4 bytes (0)
76
- 0x00, 0x00, 0x00, 0x00, // baseMediaDecodeTime last 4 bytes (0)
77
- ]);
78
- // segment starts at 0s.
60
+ initSegmentData = responses[0];
61
+ segmentData = responses[1];
79
62
 
80
63
  selfInitializingSegmentData =
81
64
  shaka.util.Uint8ArrayUtils.concat(initSegmentData, segmentData);
82
65
 
66
+ tsSegmentData = responses[2];
67
+
83
68
  aes128Key = new Uint8Array([
84
69
  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
85
70
  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
@@ -88,6 +73,7 @@ describe('HlsParser', () => {
88
73
  fakeNetEngine = new shaka.test.FakeNetworkingEngine();
89
74
 
90
75
  config = shaka.util.PlayerConfiguration.createDefault().manifest;
76
+ sequenceMode = config.hls.sequenceMode;
91
77
  onEventSpy = jasmine.createSpy('onEvent');
92
78
  newDrmInfoSpy = jasmine.createSpy('newDrmInfo');
93
79
  playerInterface = {
@@ -129,6 +115,7 @@ describe('HlsParser', () => {
129
115
  .setResponseText('test:/main.vtt', vttText)
130
116
  .setResponseValue('test:/init.mp4', initSegmentData)
131
117
  .setResponseValue('test:/init2.mp4', initSegmentData)
118
+ .setResponseValue('test:/init.test', initSegmentData)
132
119
  .setResponseValue('test:/main.mp4', segmentData)
133
120
  .setResponseValue('test:/main2.mp4', segmentData)
134
121
  .setResponseValue('test:/main.test', segmentData)
@@ -163,7 +150,7 @@ describe('HlsParser', () => {
163
150
  const master = [
164
151
  '#EXTM3U\n',
165
152
  '#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aud1",LANGUAGE="eng",',
166
- 'CHANNELS="16/JOC",URI="audio"\n',
153
+ 'CHANNELS="16/JOC",SAMPLE-RATE="48000",URI="audio"\n',
167
154
  '#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="sub1",LANGUAGE="eng",',
168
155
  'URI="text"\n',
169
156
  '#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="sub2",LANGUAGE="es",',
@@ -191,7 +178,8 @@ describe('HlsParser', () => {
191
178
  ].join('');
192
179
 
193
180
  const manifest = shaka.test.ManifestGenerator.generate((manifest) => {
194
- manifest.sequenceMode = true;
181
+ manifest.sequenceMode = sequenceMode;
182
+ manifest.type = shaka.media.ManifestParser.HLS;
195
183
  manifest.anyTimeline();
196
184
  manifest.addPartialVariant((variant) => {
197
185
  variant.language = 'en';
@@ -203,18 +191,22 @@ describe('HlsParser', () => {
203
191
  });
204
192
  variant.addPartialStream(ContentType.AUDIO, (stream) => {
205
193
  stream.language = 'en';
194
+ stream.originalLanguage = 'eng';
206
195
  stream.channelsCount = 16;
196
+ stream.audioSamplingRate = 48000;
207
197
  stream.spatialAudio = true;
208
198
  stream.mime('audio/mp4', 'mp4a');
209
199
  });
210
200
  });
211
201
  manifest.addPartialTextStream((stream) => {
212
202
  stream.language = 'en';
203
+ stream.originalLanguage = 'eng';
213
204
  stream.kind = TextStreamKind.SUBTITLE;
214
205
  stream.mime('text/vtt', '');
215
206
  });
216
207
  manifest.addPartialTextStream((stream) => {
217
208
  stream.language = 'es';
209
+ stream.originalLanguage = 'es';
218
210
  stream.kind = TextStreamKind.SUBTITLE;
219
211
  stream.mime('text/vtt', '');
220
212
  });
@@ -267,7 +259,8 @@ describe('HlsParser', () => {
267
259
  ].join('');
268
260
 
269
261
  const manifest = shaka.test.ManifestGenerator.generate((manifest) => {
270
- manifest.sequenceMode = true;
262
+ manifest.sequenceMode = sequenceMode;
263
+ manifest.type = shaka.media.ManifestParser.HLS;
271
264
  manifest.anyTimeline();
272
265
  manifest.addPartialVariant((variant) => {
273
266
  variant.language = 'en';
@@ -279,6 +272,7 @@ describe('HlsParser', () => {
279
272
  });
280
273
  variant.addPartialStream(ContentType.AUDIO, (stream) => {
281
274
  stream.language = 'en';
275
+ stream.originalLanguage = 'eng';
282
276
  stream.channelsCount = 16;
283
277
  stream.spatialAudio = true;
284
278
  stream.mime('audio/mp4', 'mp4a');
@@ -286,11 +280,13 @@ describe('HlsParser', () => {
286
280
  });
287
281
  manifest.addPartialTextStream((stream) => {
288
282
  stream.language = 'en';
283
+ stream.originalLanguage = 'eng';
289
284
  stream.kind = TextStreamKind.SUBTITLE;
290
285
  stream.mime('text/vtt', '');
291
286
  });
292
287
  manifest.addPartialTextStream((stream) => {
293
288
  stream.language = 'es';
289
+ stream.originalLanguage = 'es';
294
290
  stream.kind = TextStreamKind.SUBTITLE;
295
291
  stream.mime('text/vtt', '');
296
292
  });
@@ -339,7 +335,8 @@ describe('HlsParser', () => {
339
335
  stream.size(960, 540);
340
336
  });
341
337
  });
342
- manifest.sequenceMode = true;
338
+ manifest.sequenceMode = sequenceMode;
339
+ manifest.type = shaka.media.ManifestParser.HLS;
343
340
  });
344
341
 
345
342
  fakeNetEngine
@@ -377,7 +374,8 @@ describe('HlsParser', () => {
377
374
  stream.mime('video/mp4', 'avc1.4d001e');
378
375
  });
379
376
  });
380
- manifest.sequenceMode = true;
377
+ manifest.sequenceMode = sequenceMode;
378
+ manifest.type = shaka.media.ManifestParser.HLS;
381
379
  });
382
380
 
383
381
  await testHlsParser(master, media, manifest);
@@ -407,7 +405,8 @@ describe('HlsParser', () => {
407
405
  stream.mime('video/mp4', 'avc1');
408
406
  });
409
407
  });
410
- manifest.sequenceMode = true;
408
+ manifest.sequenceMode = sequenceMode;
409
+ manifest.type = shaka.media.ManifestParser.HLS;
411
410
  });
412
411
 
413
412
  await testHlsParser(master, media, manifest);
@@ -436,7 +435,8 @@ describe('HlsParser', () => {
436
435
  stream.mime('video/mp4', 'avc1');
437
436
  });
438
437
  });
439
- manifest.sequenceMode = true;
438
+ manifest.sequenceMode = sequenceMode;
439
+ manifest.type = shaka.media.ManifestParser.HLS;
440
440
  });
441
441
 
442
442
  await testHlsParser(master, media, manifest);
@@ -468,7 +468,8 @@ describe('HlsParser', () => {
468
468
  stream.mime('video/mp4', 'avc1');
469
469
  });
470
470
  });
471
- manifest.sequenceMode = true;
471
+ manifest.sequenceMode = sequenceMode;
472
+ manifest.type = shaka.media.ManifestParser.HLS;
472
473
  });
473
474
 
474
475
  await testHlsParser(master, media, manifest);
@@ -497,7 +498,8 @@ describe('HlsParser', () => {
497
498
  stream.mime('audio/mp4', 'mp4a');
498
499
  });
499
500
  });
500
- manifest.sequenceMode = true;
501
+ manifest.sequenceMode = sequenceMode;
502
+ manifest.type = shaka.media.ManifestParser.HLS;
501
503
  });
502
504
 
503
505
  await testHlsParser(master, media, manifest);
@@ -532,7 +534,8 @@ describe('HlsParser', () => {
532
534
  stream.mime('audio/mp4', 'mp4a');
533
535
  });
534
536
  });
535
- manifest.sequenceMode = true;
537
+ manifest.sequenceMode = sequenceMode;
538
+ manifest.type = shaka.media.ManifestParser.HLS;
536
539
  });
537
540
 
538
541
  await testHlsParser(master, media, manifest);
@@ -564,10 +567,11 @@ describe('HlsParser', () => {
564
567
  stream.mime('video/mp4', 'avc1');
565
568
  });
566
569
  variant.addPartialStream(ContentType.AUDIO, (stream) => {
567
- stream.mime('audio/mp4', '');
570
+ stream.mime('audio/mp4', 'mp4a.40.34');
568
571
  });
569
572
  });
570
- manifest.sequenceMode = true;
573
+ manifest.sequenceMode = sequenceMode;
574
+ manifest.type = shaka.media.ManifestParser.HLS;
571
575
  });
572
576
 
573
577
  await testHlsParser(master, media, manifest);
@@ -592,10 +596,11 @@ describe('HlsParser', () => {
592
596
  manifest.anyTimeline();
593
597
  manifest.addPartialVariant((variant) => {
594
598
  variant.addPartialStream(ContentType.AUDIO, (stream) => {
595
- stream.mime('audio/aac', '');
599
+ stream.mime('audio/aac', 'mp4a.40.2');
596
600
  });
597
601
  });
598
- manifest.sequenceMode = true;
602
+ manifest.sequenceMode = sequenceMode;
603
+ manifest.type = shaka.media.ManifestParser.HLS;
599
604
  });
600
605
 
601
606
  await testHlsParser(master, media, manifest);
@@ -619,10 +624,11 @@ describe('HlsParser', () => {
619
624
  manifest.anyTimeline();
620
625
  manifest.addPartialVariant((variant) => {
621
626
  variant.addPartialStream(ContentType.AUDIO, (stream) => {
622
- stream.mime('audio/mpeg', '');
627
+ stream.mime('audio/mpeg', 'mp4a.40.34');
623
628
  });
624
629
  });
625
- manifest.sequenceMode = true;
630
+ manifest.sequenceMode = sequenceMode;
631
+ manifest.type = shaka.media.ManifestParser.HLS;
626
632
  });
627
633
 
628
634
  await testHlsParser(master, media, manifest);
@@ -658,7 +664,8 @@ describe('HlsParser', () => {
658
664
  stream.mime('audio/mp4', 'flac');
659
665
  });
660
666
  });
661
- manifest.sequenceMode = true;
667
+ manifest.sequenceMode = sequenceMode;
668
+ manifest.type = shaka.media.ManifestParser.HLS;
662
669
  });
663
670
 
664
671
  await testHlsParser(master, media, manifest);
@@ -694,7 +701,8 @@ describe('HlsParser', () => {
694
701
  stream.mime('audio/mp4', 'opus');
695
702
  });
696
703
  });
697
- manifest.sequenceMode = true;
704
+ manifest.sequenceMode = sequenceMode;
705
+ manifest.type = shaka.media.ManifestParser.HLS;
698
706
  });
699
707
 
700
708
  await testHlsParser(master, media, manifest);
@@ -733,7 +741,8 @@ describe('HlsParser', () => {
733
741
  stream.mime('audio/mp4', 'mp4a');
734
742
  });
735
743
  });
736
- manifest.sequenceMode = true;
744
+ manifest.sequenceMode = sequenceMode;
745
+ manifest.type = shaka.media.ManifestParser.HLS;
737
746
  });
738
747
 
739
748
  await testHlsParser(master, media, manifest);
@@ -770,7 +779,8 @@ describe('HlsParser', () => {
770
779
  stream.mime('audio/mp4', 'mp4a');
771
780
  });
772
781
  });
773
- manifest.sequenceMode = true;
782
+ manifest.sequenceMode = sequenceMode;
783
+ manifest.type = shaka.media.ManifestParser.HLS;
774
784
  });
775
785
 
776
786
  await testHlsParser(master, media, manifest);
@@ -801,7 +811,8 @@ describe('HlsParser', () => {
801
811
  stream.mime('audio/mp4', 'mp4a');
802
812
  });
803
813
  });
804
- manifest.sequenceMode = true;
814
+ manifest.sequenceMode = sequenceMode;
815
+ manifest.type = shaka.media.ManifestParser.HLS;
805
816
  });
806
817
 
807
818
  await testHlsParser(master, media, manifest);
@@ -831,7 +842,8 @@ describe('HlsParser', () => {
831
842
  stream.mime('video/mp4', 'avc1,mp4a');
832
843
  });
833
844
  });
834
- manifest.sequenceMode = true;
845
+ manifest.sequenceMode = sequenceMode;
846
+ manifest.type = shaka.media.ManifestParser.HLS;
835
847
  });
836
848
 
837
849
  await testHlsParser(master, media, manifest);
@@ -861,7 +873,8 @@ describe('HlsParser', () => {
861
873
  stream.mime('video/mp4', /** @type {?} */ (jasmine.any(String)));
862
874
  });
863
875
  });
864
- manifest.sequenceMode = true;
876
+ manifest.sequenceMode = sequenceMode;
877
+ manifest.type = shaka.media.ManifestParser.HLS;
865
878
  });
866
879
 
867
880
  await testHlsParser(master, media, manifest);
@@ -896,7 +909,8 @@ describe('HlsParser', () => {
896
909
  stream.mime('audio/mp4', /** @type {?} */ (jasmine.any(String)));
897
910
  });
898
911
  });
899
- manifest.sequenceMode = true;
912
+ manifest.sequenceMode = sequenceMode;
913
+ manifest.type = shaka.media.ManifestParser.HLS;
900
914
  });
901
915
 
902
916
  await testHlsParser(master, media, manifest);
@@ -927,7 +941,8 @@ describe('HlsParser', () => {
927
941
  stream.mime('video/mp4', /** @type {?} */ (jasmine.any(String)));
928
942
  });
929
943
  });
930
- manifest.sequenceMode = true;
944
+ manifest.sequenceMode = sequenceMode;
945
+ manifest.type = shaka.media.ManifestParser.HLS;
931
946
  });
932
947
 
933
948
  await testHlsParser(master, media, manifest);
@@ -958,7 +973,8 @@ describe('HlsParser', () => {
958
973
  stream.mime('audio/mp4', /** @type {?} */ (jasmine.any(String)));
959
974
  });
960
975
  });
961
- manifest.sequenceMode = true;
976
+ manifest.sequenceMode = sequenceMode;
977
+ manifest.type = shaka.media.ManifestParser.HLS;
962
978
  });
963
979
 
964
980
  await testHlsParser(master, media, manifest);
@@ -998,6 +1014,7 @@ describe('HlsParser', () => {
998
1014
  });
999
1015
  variant.addPartialStream(ContentType.AUDIO, (stream) => {
1000
1016
  stream.language = 'en';
1017
+ stream.originalLanguage = 'eng';
1001
1018
  });
1002
1019
  });
1003
1020
  manifest.addPartialVariant((variant) => {
@@ -1008,9 +1025,11 @@ describe('HlsParser', () => {
1008
1025
  });
1009
1026
  variant.addPartialStream(ContentType.AUDIO, (stream) => {
1010
1027
  stream.language = 'fr';
1028
+ stream.originalLanguage = 'fr';
1011
1029
  });
1012
1030
  });
1013
- manifest.sequenceMode = true;
1031
+ manifest.sequenceMode = sequenceMode;
1032
+ manifest.type = shaka.media.ManifestParser.HLS;
1014
1033
  });
1015
1034
 
1016
1035
  await testHlsParser(master, media, manifest);
@@ -1044,6 +1063,7 @@ describe('HlsParser', () => {
1044
1063
  variant.addPartialStream(ContentType.VIDEO);
1045
1064
  variant.addPartialStream(ContentType.AUDIO, (stream) => {
1046
1065
  stream.language = 'en';
1066
+ stream.originalLanguage = 'en';
1047
1067
  });
1048
1068
  });
1049
1069
  manifest.addPartialVariant((variant) => {
@@ -1051,9 +1071,11 @@ describe('HlsParser', () => {
1051
1071
  variant.addPartialStream(ContentType.VIDEO);
1052
1072
  variant.addPartialStream(ContentType.AUDIO, (stream) => {
1053
1073
  stream.language = 'fr';
1074
+ stream.originalLanguage = 'fr';
1054
1075
  });
1055
1076
  });
1056
- manifest.sequenceMode = true;
1077
+ manifest.sequenceMode = sequenceMode;
1078
+ manifest.type = shaka.media.ManifestParser.HLS;
1057
1079
  });
1058
1080
 
1059
1081
  await testHlsParser(master, media, manifest);
@@ -1203,6 +1225,7 @@ describe('HlsParser', () => {
1203
1225
  variant.addPartialStream(ContentType.VIDEO);
1204
1226
  variant.addPartialStream(ContentType.AUDIO, (stream) => {
1205
1227
  stream.language = 'en';
1228
+ stream.originalLanguage = 'en';
1206
1229
  });
1207
1230
  });
1208
1231
  manifest.addPartialVariant((variant) => {
@@ -1210,13 +1233,15 @@ describe('HlsParser', () => {
1210
1233
  variant.addPartialStream(ContentType.VIDEO);
1211
1234
  variant.addPartialStream(ContentType.AUDIO, (stream) => {
1212
1235
  stream.language = 'en';
1236
+ stream.originalLanguage = 'en';
1213
1237
  stream.roles = [
1214
1238
  'public.accessibility.describes-video',
1215
1239
  'public.accessibility.describes-music-and-sound',
1216
1240
  ];
1217
1241
  });
1218
1242
  });
1219
- manifest.sequenceMode = true;
1243
+ manifest.sequenceMode = sequenceMode;
1244
+ manifest.type = shaka.media.ManifestParser.HLS;
1220
1245
  });
1221
1246
 
1222
1247
  await testHlsParser(master, media, manifest);
@@ -1281,7 +1306,8 @@ describe('HlsParser', () => {
1281
1306
  'public.accessibility.describes-music-and-sound',
1282
1307
  ];
1283
1308
  });
1284
- manifest.sequenceMode = true;
1309
+ manifest.sequenceMode = sequenceMode;
1310
+ manifest.type = shaka.media.ManifestParser.HLS;
1285
1311
  });
1286
1312
 
1287
1313
  fakeNetEngine.setResponseText('test:/master', master);
@@ -1336,7 +1362,8 @@ describe('HlsParser', () => {
1336
1362
  'public.accessibility.describes-music-and-sound',
1337
1363
  ];
1338
1364
  });
1339
- manifest.sequenceMode = true;
1365
+ manifest.sequenceMode = sequenceMode;
1366
+ manifest.type = shaka.media.ManifestParser.HLS;
1340
1367
  });
1341
1368
 
1342
1369
  await testHlsParser(master, media, manifest);
@@ -1401,7 +1428,8 @@ describe('HlsParser', () => {
1401
1428
  'public.accessibility.describes-music-and-sound',
1402
1429
  ];
1403
1430
  });
1404
- manifest.sequenceMode = true;
1431
+ manifest.sequenceMode = sequenceMode;
1432
+ manifest.type = shaka.media.ManifestParser.HLS;
1405
1433
  });
1406
1434
 
1407
1435
  fakeNetEngine.setResponseText('test:/master', master);
@@ -1437,7 +1465,8 @@ describe('HlsParser', () => {
1437
1465
  stream.mime('video/mp4', 'avc1');
1438
1466
  });
1439
1467
  });
1440
- manifest.sequenceMode = true;
1468
+ manifest.sequenceMode = sequenceMode;
1469
+ manifest.type = shaka.media.ManifestParser.HLS;
1441
1470
  });
1442
1471
 
1443
1472
  // The extra parameters should be stripped by the parser.
@@ -1491,11 +1520,13 @@ describe('HlsParser', () => {
1491
1520
  });
1492
1521
  manifest.addPartialTextStream((stream) => {
1493
1522
  stream.language = 'en';
1523
+ stream.originalLanguage = 'eng';
1494
1524
  stream.forced = true;
1495
1525
  stream.kind = TextStreamKind.SUBTITLE;
1496
1526
  stream.mime('text/vtt', '');
1497
1527
  });
1498
- manifest.sequenceMode = true;
1528
+ manifest.sequenceMode = sequenceMode;
1529
+ manifest.type = shaka.media.ManifestParser.HLS;
1499
1530
  });
1500
1531
 
1501
1532
  fakeNetEngine
@@ -1558,15 +1589,18 @@ describe('HlsParser', () => {
1558
1589
  });
1559
1590
  manifest.addPartialTextStream((stream) => {
1560
1591
  stream.language = 'en';
1592
+ stream.originalLanguage = 'eng';
1561
1593
  stream.kind = TextStreamKind.SUBTITLE;
1562
1594
  stream.mime('text/vtt', '');
1563
1595
  });
1564
1596
  manifest.addPartialTextStream((stream) => {
1565
1597
  stream.language = 'es';
1598
+ stream.originalLanguage = 'es';
1566
1599
  stream.kind = TextStreamKind.SUBTITLE;
1567
1600
  stream.mime('text/vtt', '');
1568
1601
  });
1569
- manifest.sequenceMode = true;
1602
+ manifest.sequenceMode = sequenceMode;
1603
+ manifest.type = shaka.media.ManifestParser.HLS;
1570
1604
  });
1571
1605
 
1572
1606
  fakeNetEngine
@@ -1628,7 +1662,8 @@ describe('HlsParser', () => {
1628
1662
  stream.kind = TextStreamKind.SUBTITLE;
1629
1663
  stream.mime('application/mp4', '');
1630
1664
  });
1631
- manifest.sequenceMode = true;
1665
+ manifest.sequenceMode = sequenceMode;
1666
+ manifest.type = shaka.media.ManifestParser.HLS;
1632
1667
  });
1633
1668
 
1634
1669
  fakeNetEngine
@@ -1689,11 +1724,13 @@ describe('HlsParser', () => {
1689
1724
  });
1690
1725
  manifest.addPartialTextStream((stream) => {
1691
1726
  stream.language = 'en';
1727
+ stream.originalLanguage = 'eng';
1692
1728
  stream.forced = true;
1693
1729
  stream.kind = TextStreamKind.SUBTITLE;
1694
1730
  stream.mime('text/vtt', '');
1695
1731
  });
1696
- manifest.sequenceMode = true;
1732
+ manifest.sequenceMode = sequenceMode;
1733
+ manifest.type = shaka.media.ManifestParser.HLS;
1697
1734
  });
1698
1735
 
1699
1736
  fakeNetEngine
@@ -1756,7 +1793,8 @@ describe('HlsParser', () => {
1756
1793
  stream.kind = TextStreamKind.SUBTITLE;
1757
1794
  stream.mime('text/vtt', '');
1758
1795
  });
1759
- manifest.sequenceMode = true;
1796
+ manifest.sequenceMode = sequenceMode;
1797
+ manifest.type = shaka.media.ManifestParser.HLS;
1760
1798
  });
1761
1799
 
1762
1800
  fakeNetEngine
@@ -2442,9 +2480,11 @@ describe('HlsParser', () => {
2442
2480
  });
2443
2481
  manifest.addPartialTextStream((stream) => {
2444
2482
  stream.language = 'en';
2483
+ stream.originalLanguage = 'eng';
2445
2484
  stream.mime('application/mp4', 'stpp.ttml.im1t');
2446
2485
  });
2447
- manifest.sequenceMode = true;
2486
+ manifest.sequenceMode = sequenceMode;
2487
+ manifest.type = shaka.media.ManifestParser.HLS;
2448
2488
  });
2449
2489
 
2450
2490
  fakeNetEngine
@@ -2488,7 +2528,8 @@ describe('HlsParser', () => {
2488
2528
  stream.language = 'en';
2489
2529
  stream.mime('application/mp4', 'wvtt');
2490
2530
  });
2491
- manifest.sequenceMode = true;
2531
+ manifest.sequenceMode = sequenceMode;
2532
+ manifest.type = shaka.media.ManifestParser.HLS;
2492
2533
  });
2493
2534
 
2494
2535
  fakeNetEngine
@@ -2539,7 +2580,8 @@ describe('HlsParser', () => {
2539
2580
  manifest.addPartialTextStream((stream) => {
2540
2581
  stream.mime('text/vtt', 'vtt');
2541
2582
  });
2542
- manifest.sequenceMode = true;
2583
+ manifest.sequenceMode = sequenceMode;
2584
+ manifest.type = shaka.media.ManifestParser.HLS;
2543
2585
  });
2544
2586
 
2545
2587
  fakeNetEngine
@@ -2583,7 +2625,8 @@ describe('HlsParser', () => {
2583
2625
  manifest.addPartialTextStream((stream) => {
2584
2626
  stream.kind = TextStreamKind.SUBTITLE;
2585
2627
  });
2586
- manifest.sequenceMode = true;
2628
+ manifest.sequenceMode = sequenceMode;
2629
+ manifest.type = shaka.media.ManifestParser.HLS;
2587
2630
  });
2588
2631
 
2589
2632
  fakeNetEngine
@@ -2652,7 +2695,8 @@ describe('HlsParser', () => {
2652
2695
  stream.segmentIndex = new shaka.media.SegmentIndex(segments);
2653
2696
  });
2654
2697
  });
2655
- manifest.sequenceMode = true;
2698
+ manifest.sequenceMode = sequenceMode;
2699
+ manifest.type = shaka.media.ManifestParser.HLS;
2656
2700
  });
2657
2701
 
2658
2702
  fakeNetEngine
@@ -2752,8 +2796,8 @@ describe('HlsParser', () => {
2752
2796
  '#EXTINF:5,\n',
2753
2797
  'main.mp4\n',
2754
2798
  '#EXT-X-PROGRAM-DATE-TIME:2000-01-01T00:00:15.00Z\n',
2755
- '#EXT-X-PART:DURATION=2.5,URI="main.mp4"\n',
2756
- '#EXT-X-PART:DURATION=2.5,URI="main.mp4"\n',
2799
+ '#EXT-X-PART:DURATION=2.5,URI="main.mp4",INDEPENDENT=YES\n',
2800
+ '#EXT-X-PART:DURATION=2.5,URI="main.mp4",INDEPENDENT=YES\n',
2757
2801
  '#EXTINF:5,\n',
2758
2802
  'main.mp4\n',
2759
2803
  '#EXT-X-PROGRAM-DATE-TIME:2000-01-01T00:00:20.00Z\n',
@@ -2796,7 +2840,8 @@ describe('HlsParser', () => {
2796
2840
  manifest.addPartialVariant((variant) => {
2797
2841
  variant.addPartialStream(ContentType.VIDEO);
2798
2842
  });
2799
- manifest.sequenceMode = true;
2843
+ manifest.sequenceMode = sequenceMode;
2844
+ manifest.type = shaka.media.ManifestParser.HLS;
2800
2845
  });
2801
2846
 
2802
2847
  fakeNetEngine
@@ -2835,7 +2880,8 @@ describe('HlsParser', () => {
2835
2880
  manifest.addPartialVariant((variant) => {
2836
2881
  variant.addPartialStream(ContentType.VIDEO);
2837
2882
  });
2838
- manifest.sequenceMode = true;
2883
+ manifest.sequenceMode = sequenceMode;
2884
+ manifest.type = shaka.media.ManifestParser.HLS;
2839
2885
  });
2840
2886
 
2841
2887
  fakeNetEngine
@@ -2879,7 +2925,8 @@ describe('HlsParser', () => {
2879
2925
  });
2880
2926
  variant.addPartialStream(ContentType.AUDIO);
2881
2927
  });
2882
- manifest.sequenceMode = true;
2928
+ manifest.sequenceMode = sequenceMode;
2929
+ manifest.type = shaka.media.ManifestParser.HLS;
2883
2930
  });
2884
2931
 
2885
2932
  await testHlsParser(master, media, manifest);
@@ -2965,7 +3012,8 @@ describe('HlsParser', () => {
2965
3012
  stream.mime('audio/mp4', 'mp4a');
2966
3013
  });
2967
3014
  });
2968
- manifest.sequenceMode = true;
3015
+ manifest.sequenceMode = sequenceMode;
3016
+ manifest.type = shaka.media.ManifestParser.HLS;
2969
3017
  });
2970
3018
 
2971
3019
  await testHlsParser(master, media, manifest);
@@ -3083,6 +3131,7 @@ describe('HlsParser', () => {
3083
3131
  });
3084
3132
  variant.addPartialStream(ContentType.AUDIO, (stream) => {
3085
3133
  stream.language = 'en';
3134
+ stream.originalLanguage = 'eng';
3086
3135
  });
3087
3136
  });
3088
3137
  manifest.addPartialVariant((variant) => {
@@ -3103,7 +3152,8 @@ describe('HlsParser', () => {
3103
3152
  stream.language = 'de';
3104
3153
  });
3105
3154
  });
3106
- manifest.sequenceMode = true;
3155
+ manifest.sequenceMode = sequenceMode;
3156
+ manifest.type = shaka.media.ManifestParser.HLS;
3107
3157
  });
3108
3158
 
3109
3159
  fakeNetEngine
@@ -3237,7 +3287,8 @@ describe('HlsParser', () => {
3237
3287
  });
3238
3288
  });
3239
3289
  });
3240
- manifest.sequenceMode = true;
3290
+ manifest.sequenceMode = sequenceMode;
3291
+ manifest.type = shaka.media.ManifestParser.HLS;
3241
3292
  });
3242
3293
 
3243
3294
  await testHlsParser(master, media, manifest);
@@ -3278,7 +3329,8 @@ describe('HlsParser', () => {
3278
3329
  });
3279
3330
  });
3280
3331
  });
3281
- manifest.sequenceMode = true;
3332
+ manifest.sequenceMode = sequenceMode;
3333
+ manifest.type = shaka.media.ManifestParser.HLS;
3282
3334
  });
3283
3335
 
3284
3336
  await testHlsParser(master, media, manifest);
@@ -3316,7 +3368,8 @@ describe('HlsParser', () => {
3316
3368
  });
3317
3369
  });
3318
3370
  });
3319
- manifest.sequenceMode = true;
3371
+ manifest.sequenceMode = sequenceMode;
3372
+ manifest.type = shaka.media.ManifestParser.HLS;
3320
3373
  });
3321
3374
 
3322
3375
  await testHlsParser(master, media, manifest);
@@ -3351,7 +3404,8 @@ describe('HlsParser', () => {
3351
3404
  stream.addDrmInfo('org.w3.clearkey');
3352
3405
  });
3353
3406
  });
3354
- manifest.sequenceMode = true;
3407
+ manifest.sequenceMode = sequenceMode;
3408
+ manifest.type = shaka.media.ManifestParser.HLS;
3355
3409
  });
3356
3410
 
3357
3411
  await testHlsParser(master, media, manifest);
@@ -3385,7 +3439,8 @@ describe('HlsParser', () => {
3385
3439
  stream.addDrmInfo('org.w3.clearkey');
3386
3440
  });
3387
3441
  });
3388
- manifest.sequenceMode = true;
3442
+ manifest.sequenceMode = sequenceMode;
3443
+ manifest.type = shaka.media.ManifestParser.HLS;
3389
3444
  });
3390
3445
 
3391
3446
  await testHlsParser(master, media, manifest);
@@ -3421,7 +3476,8 @@ describe('HlsParser', () => {
3421
3476
  });
3422
3477
  });
3423
3478
  });
3424
- manifest.sequenceMode = true;
3479
+ manifest.sequenceMode = sequenceMode;
3480
+ manifest.type = shaka.media.ManifestParser.HLS;
3425
3481
  });
3426
3482
 
3427
3483
  fakeNetEngine.setResponseText('test:/master', master);
@@ -3453,7 +3509,8 @@ describe('HlsParser', () => {
3453
3509
  });
3454
3510
  });
3455
3511
  });
3456
- manifest.sequenceMode = true;
3512
+ manifest.sequenceMode = sequenceMode;
3513
+ manifest.type = shaka.media.ManifestParser.HLS;
3457
3514
  });
3458
3515
 
3459
3516
  fakeNetEngine.setResponseText('test:/master', master);
@@ -3482,7 +3539,8 @@ describe('HlsParser', () => {
3482
3539
  });
3483
3540
  });
3484
3541
  });
3485
- manifest.sequenceMode = true;
3542
+ manifest.sequenceMode = sequenceMode;
3543
+ manifest.type = shaka.media.ManifestParser.HLS;
3486
3544
  });
3487
3545
 
3488
3546
  fakeNetEngine.setResponseText('test:/master', master);
@@ -3509,7 +3567,8 @@ describe('HlsParser', () => {
3509
3567
  stream.addDrmInfo('org.w3.clearkey');
3510
3568
  });
3511
3569
  });
3512
- manifest.sequenceMode = true;
3570
+ manifest.sequenceMode = sequenceMode;
3571
+ manifest.type = shaka.media.ManifestParser.HLS;
3513
3572
  });
3514
3573
 
3515
3574
  fakeNetEngine.setResponseText('test:/master', master);
@@ -3535,7 +3594,8 @@ describe('HlsParser', () => {
3535
3594
  stream.addDrmInfo('org.w3.clearkey');
3536
3595
  });
3537
3596
  });
3538
- manifest.sequenceMode = true;
3597
+ manifest.sequenceMode = sequenceMode;
3598
+ manifest.type = shaka.media.ManifestParser.HLS;
3539
3599
  });
3540
3600
 
3541
3601
  fakeNetEngine.setResponseText('test:/master', master);
@@ -3573,7 +3633,8 @@ describe('HlsParser', () => {
3573
3633
  stream.mime('audio/mp4', 'mp4a');
3574
3634
  });
3575
3635
  });
3576
- manifest.sequenceMode = true;
3636
+ manifest.sequenceMode = sequenceMode;
3637
+ manifest.type = shaka.media.ManifestParser.HLS;
3577
3638
  });
3578
3639
 
3579
3640
  fakeNetEngine.setHeaders(
@@ -4017,6 +4078,7 @@ describe('HlsParser', () => {
4017
4078
  });
4018
4079
  variant.addPartialStream(ContentType.AUDIO, (stream) => {
4019
4080
  stream.language = 'en';
4081
+ stream.originalLanguage = 'en';
4020
4082
  });
4021
4083
  });
4022
4084
  manifest.addPartialVariant((variant) => {
@@ -4026,6 +4088,7 @@ describe('HlsParser', () => {
4026
4088
  });
4027
4089
  variant.addPartialStream(ContentType.AUDIO, (stream) => {
4028
4090
  stream.language = 'fr';
4091
+ stream.originalLanguage = 'fr';
4029
4092
  });
4030
4093
  });
4031
4094
  manifest.addPartialVariant((variant) => {
@@ -4035,6 +4098,7 @@ describe('HlsParser', () => {
4035
4098
  });
4036
4099
  variant.addPartialStream(ContentType.AUDIO, (stream) => {
4037
4100
  stream.language = 'en';
4101
+ stream.originalLanguage = 'en';
4038
4102
  });
4039
4103
  });
4040
4104
  manifest.addPartialVariant((variant) => {
@@ -4044,9 +4108,11 @@ describe('HlsParser', () => {
4044
4108
  });
4045
4109
  variant.addPartialStream(ContentType.AUDIO, (stream) => {
4046
4110
  stream.language = 'fr';
4111
+ stream.originalLanguage = 'fr';
4047
4112
  });
4048
4113
  });
4049
- manifest.sequenceMode = true;
4114
+ manifest.sequenceMode = sequenceMode;
4115
+ manifest.type = shaka.media.ManifestParser.HLS;
4050
4116
  });
4051
4117
 
4052
4118
  await testHlsParser(master, media, manifest);
@@ -4096,7 +4162,8 @@ describe('HlsParser', () => {
4096
4162
  stream.size(1920, 1080);
4097
4163
  });
4098
4164
  });
4099
- manifest.sequenceMode = true;
4165
+ manifest.sequenceMode = sequenceMode;
4166
+ manifest.type = shaka.media.ManifestParser.HLS;
4100
4167
  });
4101
4168
 
4102
4169
  const actual = await testHlsParser(master, media, manifest, media2);
@@ -4148,7 +4215,8 @@ describe('HlsParser', () => {
4148
4215
  stream.mime('audio/mp4', 'mp4a');
4149
4216
  });
4150
4217
  });
4151
- manifest.sequenceMode = true;
4218
+ manifest.sequenceMode = sequenceMode;
4219
+ manifest.type = shaka.media.ManifestParser.HLS;
4152
4220
  });
4153
4221
 
4154
4222
  fakeNetEngine
@@ -4335,7 +4403,8 @@ describe('HlsParser', () => {
4335
4403
  stream.mime('audio/mp4', 'mp4a');
4336
4404
  });
4337
4405
  });
4338
- manifest.sequenceMode = true;
4406
+ manifest.sequenceMode = sequenceMode;
4407
+ manifest.type = shaka.media.ManifestParser.HLS;
4339
4408
  });
4340
4409
 
4341
4410
  await testHlsParser(master, media, manifest);
@@ -4373,7 +4442,8 @@ describe('HlsParser', () => {
4373
4442
  stream.mime('audio/mp4', 'mp4a');
4374
4443
  });
4375
4444
  });
4376
- manifest.sequenceMode = true;
4445
+ manifest.sequenceMode = sequenceMode;
4446
+ manifest.type = shaka.media.ManifestParser.HLS;
4377
4447
  });
4378
4448
 
4379
4449
  await testHlsParser(master, media, manifest);
@@ -4412,7 +4482,8 @@ describe('HlsParser', () => {
4412
4482
  stream.mime('audio/mp4', 'mp4a');
4413
4483
  });
4414
4484
  });
4415
- manifest.sequenceMode = true;
4485
+ manifest.sequenceMode = sequenceMode;
4486
+ manifest.type = shaka.media.ManifestParser.HLS;
4416
4487
  });
4417
4488
 
4418
4489
  await testHlsParser(master, media, manifest);
@@ -4452,7 +4523,8 @@ describe('HlsParser', () => {
4452
4523
  stream.mime('audio/mp4', 'mp4a');
4453
4524
  });
4454
4525
  });
4455
- manifest.sequenceMode = true;
4526
+ manifest.sequenceMode = sequenceMode;
4527
+ manifest.type = shaka.media.ManifestParser.HLS;
4456
4528
  });
4457
4529
 
4458
4530
  await testHlsParser(master, media, manifest);
@@ -4495,11 +4567,12 @@ describe('HlsParser', () => {
4495
4567
  ].join('');
4496
4568
 
4497
4569
  const manifest = shaka.test.ManifestGenerator.generate((manifest) => {
4498
- manifest.sequenceMode = true;
4570
+ manifest.sequenceMode = sequenceMode;
4571
+ manifest.type = shaka.media.ManifestParser.HLS;
4499
4572
  manifest.anyTimeline();
4500
4573
  manifest.addPartialVariant((variant) => {
4501
4574
  variant.addPartialStream(ContentType.VIDEO, (stream) => {
4502
- stream.mime('video/mp2t', 'avc1.42E01E, mp4a.40.2');
4575
+ stream.mime('video/mp4', 'avc1.42C01E');
4503
4576
  });
4504
4577
  });
4505
4578
  });
@@ -4509,22 +4582,64 @@ describe('HlsParser', () => {
4509
4582
  expect(actualManifest.presentationTimeline.getDuration()).toBe(5);
4510
4583
  });
4511
4584
 
4512
- it('honors hls.mediaPlaylistFullMimeType', async () => {
4585
+ it('parses #EXT-X-BITRATE', async () => {
4513
4586
  const media = [
4514
4587
  '#EXTM3U\n',
4515
4588
  '#EXT-X-PLAYLIST-TYPE:VOD\n',
4516
4589
  '#EXT-X-MAP:URI="init.mp4",BYTERANGE="616@0"\n',
4517
4590
  '#EXTINF:5,\n',
4518
4591
  '#EXT-X-BYTERANGE:121090@616\n',
4592
+ '#EXT-X-BITRATE:385\n',
4593
+ 'main.mp4\n',
4594
+ '#EXTINF:5,\n',
4595
+ '#EXT-X-BYTERANGE:121090@616\n',
4596
+ 'main.mp4\n',
4597
+ '#EXTINF:5,\n',
4598
+ '#EXT-X-BYTERANGE:121090@616\n',
4599
+ 'main.mp4\n',
4600
+ '#EXTINF:5,\n',
4601
+ '#EXT-X-BYTERANGE:121090@616\n',
4602
+ '#EXT-X-BITRATE:340\n',
4603
+ 'main.mp4\n',
4604
+ '#EXT-X-BYTERANGE:121090@616\n',
4605
+ '#EXTINF:5,\n',
4606
+ '#EXT-X-BITRATE:300\n',
4519
4607
  'main.mp4',
4520
4608
  ].join('');
4521
4609
 
4610
+ const manifest = shaka.test.ManifestGenerator.generate((manifest) => {
4611
+ manifest.sequenceMode = sequenceMode;
4612
+ manifest.type = shaka.media.ManifestParser.HLS;
4613
+ manifest.anyTimeline();
4614
+ manifest.addPartialVariant((variant) => {
4615
+ variant.bandwidth = 359000;
4616
+ variant.addPartialStream(ContentType.VIDEO, (stream) => {
4617
+ stream.mime('video/mp4', 'avc1.42C01E');
4618
+ stream.bandwidth = 359000;
4619
+ });
4620
+ });
4621
+ });
4622
+
4623
+ await testHlsParser(media, '', manifest);
4624
+ });
4625
+
4626
+ it('honors hls.mediaPlaylistFullMimeType', async () => {
4627
+ const media = [
4628
+ '#EXTM3U\n',
4629
+ '#EXT-X-PLAYLIST-TYPE:VOD\n',
4630
+ '#EXT-X-MAP:URI="init.test",BYTERANGE="616@0"\n',
4631
+ '#EXTINF:5,\n',
4632
+ '#EXT-X-BYTERANGE:121090@616\n',
4633
+ 'main.test',
4634
+ ].join('');
4635
+
4522
4636
  const config = shaka.util.PlayerConfiguration.createDefault().manifest;
4523
4637
  config.hls.mediaPlaylistFullMimeType = 'audio/webm; codecs="vorbis"';
4524
4638
  parser.configure(config);
4525
4639
 
4526
4640
  const manifest = shaka.test.ManifestGenerator.generate((manifest) => {
4527
- manifest.sequenceMode = true;
4641
+ manifest.sequenceMode = sequenceMode;
4642
+ manifest.type = shaka.media.ManifestParser.HLS;
4528
4643
  manifest.anyTimeline();
4529
4644
  manifest.addPartialVariant((variant) => {
4530
4645
  variant.addPartialStream(ContentType.AUDIO, (stream) => {
@@ -4550,7 +4665,8 @@ describe('HlsParser', () => {
4550
4665
  parser.configure(config);
4551
4666
 
4552
4667
  const manifest = shaka.test.ManifestGenerator.generate((manifest) => {
4553
- manifest.sequenceMode = true;
4668
+ manifest.sequenceMode = sequenceMode;
4669
+ manifest.type = shaka.media.ManifestParser.HLS;
4554
4670
  manifest.anyTimeline();
4555
4671
  manifest.addPartialVariant((variant) => {
4556
4672
  variant.addPartialStream(ContentType.AUDIO, (stream) => {
@@ -4576,7 +4692,8 @@ describe('HlsParser', () => {
4576
4692
  parser.configure(config);
4577
4693
 
4578
4694
  const manifest = shaka.test.ManifestGenerator.generate((manifest) => {
4579
- manifest.sequenceMode = true;
4695
+ manifest.sequenceMode = sequenceMode;
4696
+ manifest.type = shaka.media.ManifestParser.HLS;
4580
4697
  manifest.anyTimeline();
4581
4698
  manifest.addPartialVariant((variant) => {
4582
4699
  variant.addPartialStream(ContentType.AUDIO, (stream) => {
@@ -4626,7 +4743,8 @@ describe('HlsParser', () => {
4626
4743
  ].join('');
4627
4744
 
4628
4745
  const manifest = shaka.test.ManifestGenerator.generate((manifest) => {
4629
- manifest.sequenceMode = true;
4746
+ manifest.sequenceMode = sequenceMode;
4747
+ manifest.type = shaka.media.ManifestParser.HLS;
4630
4748
  manifest.anyTimeline();
4631
4749
  manifest.addPartialVariant((variant) => {
4632
4750
  variant.language = 'en';
@@ -4783,7 +4901,9 @@ describe('HlsParser', () => {
4783
4901
 
4784
4902
  // Before loading, all MIME types agree, and are defaulted to audio/mp4.
4785
4903
  expect(actualAudio0.mimeType).toBe('audio/mp4');
4904
+ expect(actualAudio0.codecs).toBe('mp4a');
4786
4905
  expect(actualAudio1.mimeType).toBe('audio/mp4');
4906
+ expect(actualAudio1.codecs).toBe('mp4a');
4787
4907
 
4788
4908
  await actualAudio0.createSegmentIndex();
4789
4909
 
@@ -4792,8 +4912,29 @@ describe('HlsParser', () => {
4792
4912
  // This is how we avoid having the unloaded tracks filtered out during
4793
4913
  // startup.
4794
4914
  expect(actualAudio0.mimeType).toBe('audio/aac');
4795
- expect(actualAudio0.codecs).toBe('');
4915
+ expect(actualAudio0.codecs).toBe('mp4a');
4796
4916
  expect(actualAudio1.mimeType).toBe('audio/aac');
4797
- expect(actualAudio1.codecs).toBe('');
4917
+ expect(actualAudio1.codecs).toBe('mp4a');
4918
+ });
4919
+
4920
+ it('parses media playlists directly', async () => {
4921
+ const mediaPlaylist = [
4922
+ '#EXTM3U\n',
4923
+ '#EXT-X-TARGETDURATION:5\n',
4924
+ '#EXTINF:5,\n',
4925
+ 'video1.ts\n',
4926
+ ].join('');
4927
+
4928
+ fakeNetEngine
4929
+ .setResponseText('test:/master', mediaPlaylist)
4930
+ .setResponseValue('test:/video1.ts', tsSegmentData);
4931
+
4932
+ const actualManifest = await parser.start('test:/master', playerInterface);
4933
+ expect(actualManifest.variants.length).toBe(1);
4934
+
4935
+ const video = actualManifest.variants[0].video;
4936
+
4937
+ expect(video.width).toBe(256);
4938
+ expect(video.height).toBe(110);
4798
4939
  });
4799
4940
  });