shaka-player 4.4.3 → 4.6.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 (307) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  2. package/.github/workflows/release-please.yaml +2 -27
  3. package/AUTHORS +2 -0
  4. package/CHANGELOG.md +156 -39
  5. package/CODE_OF_CONDUCT.md +1 -1
  6. package/CONTRIBUTORS +2 -0
  7. package/README.md +54 -42
  8. package/demo/asset_card.js +18 -21
  9. package/demo/cast_receiver/index.html +0 -1
  10. package/demo/close_button.js +0 -3
  11. package/demo/common/asset.js +33 -22
  12. package/demo/common/assets.js +249 -60
  13. package/demo/config.js +219 -253
  14. package/demo/custom.js +88 -133
  15. package/demo/front.js +7 -10
  16. package/demo/index.html +19 -22
  17. package/demo/input.js +6 -11
  18. package/demo/input_container.js +8 -9
  19. package/demo/main.js +62 -126
  20. package/demo/search.js +29 -34
  21. package/demo/service_worker.js +0 -3
  22. package/demo/tooltip.js +3 -5
  23. package/demo/visualizer.js +3 -5
  24. package/demo/visualizer_button.js +1 -20
  25. package/dist/controls.css +1 -1
  26. package/dist/controls.css.map +1 -1
  27. package/dist/demo.compiled.debug.js +211 -228
  28. package/dist/demo.compiled.debug.map +4 -4
  29. package/dist/demo.compiled.js +211 -228
  30. package/dist/demo.compiled.map +4 -4
  31. package/dist/deps.js +42 -37
  32. package/dist/locales.js +34 -30
  33. package/dist/receiver.compiled.debug.js +64 -77
  34. package/dist/receiver.compiled.debug.map +4 -4
  35. package/dist/receiver.compiled.js +64 -77
  36. package/dist/receiver.compiled.map +4 -4
  37. package/dist/shaka-player.compiled.d.ts +343 -151
  38. package/dist/shaka-player.compiled.debug.d.ts +343 -151
  39. package/dist/shaka-player.compiled.debug.externs.js +356 -117
  40. package/dist/shaka-player.compiled.debug.js +952 -811
  41. package/dist/shaka-player.compiled.debug.map +4 -4
  42. package/dist/shaka-player.compiled.externs.js +356 -117
  43. package/dist/shaka-player.compiled.js +1165 -1078
  44. package/dist/shaka-player.compiled.map +4 -4
  45. package/dist/shaka-player.ui.d.ts +359 -153
  46. package/dist/shaka-player.ui.debug.d.ts +359 -153
  47. package/dist/shaka-player.ui.debug.externs.js +382 -117
  48. package/dist/shaka-player.ui.debug.js +1084 -918
  49. package/dist/shaka-player.ui.debug.map +4 -4
  50. package/dist/shaka-player.ui.externs.js +382 -117
  51. package/dist/shaka-player.ui.js +1377 -1274
  52. package/dist/shaka-player.ui.map +4 -4
  53. package/docs/design/lcevc-integration.md +14 -14
  54. package/docs/tutorials/ad_monetization.md +54 -0
  55. package/docs/tutorials/basic-usage.md +2 -1
  56. package/docs/tutorials/errors.md +2 -1
  57. package/docs/tutorials/faq.md +27 -55
  58. package/docs/tutorials/index.json +2 -1
  59. package/docs/tutorials/lcevc.md +118 -0
  60. package/docs/tutorials/offline.md +10 -8
  61. package/docs/tutorials/plugins.md +5 -0
  62. package/docs/tutorials/ui-customization.md +17 -0
  63. package/docs/tutorials/ui.md +2 -1
  64. package/docs/tutorials/upgrade.md +3 -0
  65. package/externs/css_style_declaration.js +19 -0
  66. package/externs/lcevc.js +37 -13
  67. package/externs/managedmediasource.js +24 -0
  68. package/externs/media_remote.js +68 -0
  69. package/externs/mediatailor.js +193 -0
  70. package/externs/pictureinpicture.js +11 -0
  71. package/externs/shaka/abr_manager.js +6 -2
  72. package/externs/shaka/ads.js +27 -0
  73. package/externs/shaka/cea.js +7 -0
  74. package/externs/shaka/codecs.js +5 -3
  75. package/externs/shaka/manifest.js +31 -10
  76. package/externs/shaka/manifest_parser.js +24 -1
  77. package/externs/shaka/net.js +2 -2
  78. package/externs/shaka/offline.js +13 -2
  79. package/externs/shaka/player.js +65 -8
  80. package/externs/shaka/text.js +3 -1
  81. package/externs/shaka/transmuxer.js +1 -1
  82. package/karma.conf.js +7 -3
  83. package/lib/abr/simple_abr_manager.js +66 -9
  84. package/lib/ads/ad_manager.js +104 -50
  85. package/lib/ads/media_tailor_ad.js +297 -0
  86. package/lib/ads/media_tailor_ad_manager.js +839 -0
  87. package/lib/cast/cast_receiver.js +1 -1
  88. package/lib/cea/cea_decoder.js +28 -0
  89. package/lib/cea/dummy_caption_decoder.js +5 -0
  90. package/lib/cea/ts_cea_parser.js +15 -2
  91. package/lib/config/codec_switching_strategy.js +24 -0
  92. package/lib/dash/content_protection.js +120 -2
  93. package/lib/dash/dash_parser.js +322 -93
  94. package/lib/dash/mpd_utils.js +62 -37
  95. package/lib/dash/segment_base.js +17 -10
  96. package/lib/dash/segment_list.js +18 -9
  97. package/lib/dash/segment_template.js +122 -107
  98. package/lib/dependencies/all.js +8 -7
  99. package/lib/hls/hls_classes.js +28 -43
  100. package/lib/hls/hls_parser.js +798 -658
  101. package/lib/hls/hls_utils.js +64 -5
  102. package/lib/hls/manifest_text_parser.js +7 -11
  103. package/lib/lcevc/lcevc_dec.js +220 -0
  104. package/lib/media/adaptation_set.js +32 -14
  105. package/lib/media/adaptation_set_criteria.js +86 -16
  106. package/lib/media/closed_caption_parser.js +13 -0
  107. package/lib/media/content_workarounds.js +6 -0
  108. package/lib/media/drm_engine.js +8 -13
  109. package/lib/media/manifest_parser.js +8 -113
  110. package/lib/media/media_source_capabilities.js +10 -3
  111. package/lib/media/media_source_engine.js +286 -44
  112. package/lib/media/play_rate_controller.js +8 -38
  113. package/lib/media/presentation_timeline.js +7 -1
  114. package/lib/media/quality_observer.js +1 -1
  115. package/lib/media/segment_index.js +6 -6
  116. package/lib/media/segment_prefetch.js +92 -24
  117. package/lib/media/segment_reference.js +73 -7
  118. package/lib/media/segment_utils.js +343 -0
  119. package/lib/media/stall_detector.js +0 -3
  120. package/lib/media/streaming_engine.js +73 -38
  121. package/lib/mss/mss_parser.js +19 -2
  122. package/lib/net/networking_engine.js +67 -12
  123. package/lib/net/networking_utils.js +95 -0
  124. package/lib/offline/indexeddb/v1_storage_cell.js +3 -0
  125. package/lib/offline/indexeddb/v2_storage_cell.js +3 -0
  126. package/lib/offline/manifest_converter.js +3 -0
  127. package/lib/offline/offline_manifest_parser.js +10 -0
  128. package/lib/offline/storage.js +14 -7
  129. package/lib/player.js +1098 -1537
  130. package/lib/polyfill/mediasource.js +22 -1
  131. package/lib/text/cue.js +15 -0
  132. package/lib/text/mp4_ttml_parser.js +2 -2
  133. package/lib/text/srt_text_parser.js +2 -2
  134. package/lib/text/stub_text_displayer.js +51 -0
  135. package/lib/text/text_engine.js +3 -2
  136. package/lib/text/ttml_text_parser.js +45 -5
  137. package/lib/text/ui_text_displayer.js +8 -0
  138. package/lib/text/vtt_text_parser.js +40 -22
  139. package/lib/transmuxer/aac_transmuxer.js +1 -1
  140. package/lib/transmuxer/ac3_transmuxer.js +1 -1
  141. package/lib/transmuxer/ec3_transmuxer.js +1 -1
  142. package/lib/transmuxer/h264.js +5 -4
  143. package/lib/transmuxer/h265.js +863 -0
  144. package/lib/transmuxer/mp3_transmuxer.js +1 -1
  145. package/lib/transmuxer/mpeg_ts_transmuxer.js +4 -3
  146. package/lib/transmuxer/mss_transmuxer.js +1 -1
  147. package/lib/transmuxer/ts_transmuxer.js +187 -22
  148. package/lib/util/buffer_utils.js +26 -4
  149. package/lib/util/content_steering_manager.js +358 -0
  150. package/lib/util/error.js +30 -15
  151. package/lib/util/exp_golomb.js +30 -2
  152. package/lib/util/fairplay_utils.js +1 -1
  153. package/lib/util/fake_event.js +8 -1
  154. package/lib/util/id3_utils.js +50 -1
  155. package/lib/util/manifest_parser_utils.js +12 -8
  156. package/lib/util/mp4_generator.js +6 -8
  157. package/lib/util/mutex.js +59 -0
  158. package/lib/util/object_utils.js +1 -1
  159. package/lib/util/periods.js +156 -179
  160. package/lib/util/platform.js +44 -3
  161. package/lib/util/player_configuration.js +43 -6
  162. package/lib/util/state_history.js +6 -2
  163. package/lib/util/stream_utils.js +206 -283
  164. package/lib/util/ts_parser.js +335 -98
  165. package/lib/util/uint8array_utils.js +5 -1
  166. package/lib/util/xml_utils.js +5 -0
  167. package/maintained-branches.md +3 -2
  168. package/package.json +4 -6
  169. package/roadmap.md +25 -5
  170. package/shaka-player.uncompiled.js +2 -2
  171. package/support.html +0 -1
  172. package/test/abr/simple_abr_manager_unit.js +33 -33
  173. package/test/ads/ad_manager_unit.js +3 -2
  174. package/test/cast/cast_receiver_integration.js +50 -4
  175. package/test/cast/cast_utils_unit.js +2 -0
  176. package/test/cea/cea_decoder_unit.js +7 -0
  177. package/test/codec_switching/codec_switching_integration.js +182 -0
  178. package/test/dash/dash_parser_content_protection_unit.js +2 -0
  179. package/test/dash/dash_parser_integration.js +74 -0
  180. package/test/dash/dash_parser_live_unit.js +2 -19
  181. package/test/dash/dash_parser_manifest_unit.js +536 -2
  182. package/test/dash/dash_parser_segment_base_unit.js +2 -0
  183. package/test/dash/dash_parser_segment_list_unit.js +2 -0
  184. package/test/dash/dash_parser_segment_template_unit.js +2 -0
  185. package/test/dash/mpd_utils_unit.js +61 -30
  186. package/test/demo/demo_unit.js +0 -16
  187. package/test/hls/hls_live_unit.js +14 -3
  188. package/test/hls/hls_parser_unit.js +385 -33
  189. package/test/hls/manifest_text_parser_unit.js +32 -99
  190. package/test/media/adaptation_set_criteria_unit.js +284 -15
  191. package/test/media/adaptation_set_unit.js +2 -0
  192. package/test/media/content_workarounds_unit.js +1 -1
  193. package/test/media/drm_engine_unit.js +3 -3
  194. package/test/media/media_source_engine_unit.js +166 -2
  195. package/test/media/play_rate_controller_unit.js +0 -48
  196. package/test/media/segment_index_unit.js +5 -4
  197. package/test/media/segment_prefetch_unit.js +1 -1
  198. package/test/media/streaming_engine_unit.js +17 -17
  199. package/test/mss/mss_parser_unit.js +2 -0
  200. package/test/mss/mss_player_integration.js +3 -2
  201. package/test/net/networking_engine_unit.js +3 -3
  202. package/test/{media/manifest_parser_unit.js → net/networking_utils_unit.js} +2 -2
  203. package/test/offline/manifest_convert_unit.js +14 -0
  204. package/test/offline/offline_integration.js +2 -1
  205. package/test/offline/storage_integration.js +22 -13
  206. package/test/player_external.js +4 -2
  207. package/test/player_integration.js +15 -4
  208. package/test/player_load_graph_integration.js +47 -151
  209. package/test/player_src_equals_external.js +1 -0
  210. package/test/player_src_equals_integration.js +71 -4
  211. package/test/player_unit.js +182 -158
  212. package/test/test/assets/dash-aes-128/Fragments(video=0,format=mpd-time-csf) +0 -0
  213. package/test/test/assets/dash-aes-128/Fragments(video=20000000,format=mpd-time-csf) +0 -0
  214. package/test/test/assets/dash-aes-128/Fragments(video=40000000,format=mpd-time-csf) +0 -0
  215. package/test/test/assets/dash-aes-128/Fragments(video=60000000,format=mpd-time-csf) +0 -0
  216. package/test/test/assets/dash-aes-128/Fragments(video=i,format=mpd-time-csf) +0 -0
  217. package/test/test/assets/dash-aes-128/dash.mpd +18 -0
  218. package/test/test/assets/dash-aes-128/license +1 -0
  219. package/test/test/assets/dash-multi-codec/audio_en_2c_128k_aac.mp4 +0 -0
  220. package/test/test/assets/dash-multi-codec/audio_es_2c_64k_opus.webm +0 -0
  221. package/test/test/assets/dash-multi-codec/dash.mpd +32 -0
  222. package/test/test/assets/dash-multi-codec/video_144p_108k_h264.mp4 +0 -0
  223. package/test/test/assets/hls-ts-h265/0.ts +0 -0
  224. package/test/test/assets/hls-ts-h265/hevc.m3u8 +6 -0
  225. package/test/test/assets/hls-ts-h265/index.m3u8 +7 -0
  226. package/test/test/assets/hls-ts-muxed-aac-h265/0.ts +0 -0
  227. package/test/test/assets/hls-ts-muxed-aac-h265/1.ts +0 -0
  228. package/test/test/assets/hls-ts-muxed-aac-h265/media.m3u8 +9 -0
  229. package/test/test/assets/hls-ts-muxed-ac3-h264/media.m3u8 +24 -0
  230. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00000.ts +0 -0
  231. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00001.ts +0 -0
  232. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00002.ts +0 -0
  233. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00003.ts +0 -0
  234. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00004.ts +0 -0
  235. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00005.ts +0 -0
  236. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0000.ts +0 -0
  237. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0001.ts +0 -0
  238. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0002.ts +0 -0
  239. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0003.ts +0 -0
  240. package/test/test/assets/hls-ts-muxed-ec3-h264/prog_index.m3u8 +14 -0
  241. package/test/test/assets/hls-ts-muxed-mp3-h264/index.m3u8 +23 -0
  242. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-1-v1-a1.ts +0 -0
  243. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-2-v1-a1.ts +0 -0
  244. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-3-v1-a1.ts +0 -0
  245. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-4-v1-a1.ts +0 -0
  246. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-5-v1-a1.ts +0 -0
  247. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-6-v1-a1.ts +0 -0
  248. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-7-v1-a1.ts +0 -0
  249. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-8-v1-a1.ts +0 -0
  250. package/test/test/util/dash_parser_util.js +4 -0
  251. package/test/test/util/fake_ad_manager.js +20 -0
  252. package/test/test/util/fake_media_source_engine.js +13 -2
  253. package/test/test/util/fake_networking_engine.js +9 -1
  254. package/test/test/util/fake_segment_prefetch.js +3 -0
  255. package/test/test/util/manifest_generator.js +11 -3
  256. package/test/test/util/manifest_parser_util.js +14 -2
  257. package/test/test/util/mss_parser_util.js +4 -0
  258. package/test/test/util/offline_utils.js +2 -0
  259. package/test/test/util/simple_fakes.js +2 -2
  260. package/test/test/util/streaming_engine_util.js +10 -4
  261. package/test/test/util/test_scheme.js +6 -0
  262. package/test/test/util/ui_utils.js +4 -3
  263. package/test/text/mp4_ttml_parser_unit.js +4 -4
  264. package/test/text/srt_text_parser_unit.js +1 -1
  265. package/test/text/text_displayer_layout_unit.js +1 -1
  266. package/test/text/text_engine_unit.js +6 -0
  267. package/test/text/ttml_text_parser_unit.js +85 -2
  268. package/test/text/vtt_text_parser_unit.js +103 -31
  269. package/test/transmuxer/transmuxer_engine_integration.js +9 -0
  270. package/test/transmuxer/transmuxer_integration.js +150 -3
  271. package/test/ui/ad_ui_unit.js +2 -2
  272. package/test/ui/ui_customization_unit.js +17 -16
  273. package/test/ui/ui_integration.js +30 -20
  274. package/test/ui/ui_unit.js +28 -29
  275. package/test/util/buffer_utils_unit.js +1 -1
  276. package/test/util/content_steering_manager_unit.js +427 -0
  277. package/test/util/id3_utils_unit.js +52 -0
  278. package/test/util/stream_utils_unit.js +207 -169
  279. package/test/util/ts_parser_unit.js +3 -3
  280. package/third_party/closure-uri/uri.js +13 -1
  281. package/ui/audio_language_selection.js +9 -2
  282. package/ui/controls.js +125 -0
  283. package/ui/externs/ui.js +24 -2
  284. package/ui/language_utils.js +43 -8
  285. package/ui/less/range_elements.less +33 -0
  286. package/ui/locales/en.json +1 -0
  287. package/ui/locales/es-419.json +1 -0
  288. package/ui/locales/es.json +1 -0
  289. package/ui/locales/source.json +4 -0
  290. package/ui/localization.js +10 -0
  291. package/ui/pip_button.js +22 -120
  292. package/ui/remote_button.js +203 -0
  293. package/ui/resolution_selection.js +47 -10
  294. package/ui/seek_bar.js +296 -3
  295. package/ui/text_selection.js +2 -1
  296. package/ui/ui.js +11 -4
  297. package/demo/common/message_ids.js +0 -309
  298. package/demo/locales/en.json +0 -288
  299. package/demo/locales/source.json +0 -1146
  300. package/externs/mux.js +0 -69
  301. package/lib/lcevc/lcevc_dil.js +0 -152
  302. package/lib/routing/node.js +0 -23
  303. package/lib/routing/payload.js +0 -43
  304. package/lib/routing/walker.js +0 -587
  305. package/lib/transmuxer/muxjs_transmuxer.js +0 -242
  306. package/test/routing/walker_unit.js +0 -504
  307. package/test/transmuxer/muxjs_transmuxer_integration.js +0 -177
@@ -0,0 +1,863 @@
1
+ /*! @license
2
+ * Shaka Player
3
+ * Copyright 2016 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ goog.provide('shaka.transmuxer.H265');
8
+
9
+ goog.require('shaka.util.ExpGolomb');
10
+ goog.require('shaka.util.Uint8ArrayUtils');
11
+
12
+
13
+ /**
14
+ * H.265 utils
15
+ */
16
+ shaka.transmuxer.H265 = class {
17
+ /**
18
+ * Read a sequence parameter set and return some interesting video
19
+ * properties. A sequence parameter set is the H265 metadata that
20
+ * describes the properties of upcoming video frames.
21
+ *
22
+ * @param {!Array.<shaka.extern.VideoNalu>} nalus
23
+ * @return {?{height: number, width: number, videoConfig: !Uint8Array}}
24
+ */
25
+ static parseInfo(nalus) {
26
+ const H265 = shaka.transmuxer.H265;
27
+ if (!nalus.length) {
28
+ return null;
29
+ }
30
+ const vpsNalu = nalus.find((nalu) => {
31
+ return nalu.type == H265.NALU_TYPE_VPS_;
32
+ });
33
+ const spsNalu = nalus.find((nalu) => {
34
+ return nalu.type == H265.NALU_TYPE_SPS_;
35
+ });
36
+ const ppsNalu = nalus.find((nalu) => {
37
+ return nalu.type == H265.NALU_TYPE_PPS_;
38
+ });
39
+ if (!vpsNalu || !spsNalu || !ppsNalu) {
40
+ return null;
41
+ }
42
+
43
+ const vpsConfiguration = H265.parseVPS_(vpsNalu.fullData);
44
+ const spsConfiguration = H265.parseSPS_(spsNalu.fullData);
45
+ const ppsConfiguration = H265.parsePPS_(ppsNalu.fullData);
46
+
47
+ /** @type {shaka.transmuxer.H265.DecoderConfigurationRecordType} */
48
+ const detail = {
49
+ numTemporalLayers: vpsConfiguration.numTemporalLayers,
50
+ temporalIdNested: vpsConfiguration.temporalIdNested,
51
+ generalProfileSpace: spsConfiguration.generalProfileSpace,
52
+ generalTierFlag: spsConfiguration.generalTierFlag,
53
+ generalLevelIdc: spsConfiguration.generalLevelIdc,
54
+ generalProfileIdc: spsConfiguration.generalProfileIdc,
55
+ generalProfileCompatibilityFlags1:
56
+ spsConfiguration.generalProfileCompatibilityFlags1,
57
+ generalProfileCompatibilityFlags2:
58
+ spsConfiguration.generalProfileCompatibilityFlags2,
59
+ generalProfileCompatibilityFlags3:
60
+ spsConfiguration.generalProfileCompatibilityFlags3,
61
+ generalProfileCompatibilityFlags4:
62
+ spsConfiguration.generalProfileCompatibilityFlags4,
63
+ generalConstraintIndicatorFlags1:
64
+ spsConfiguration.generalConstraintIndicatorFlags1,
65
+ generalConstraintIndicatorFlags2:
66
+ spsConfiguration.generalConstraintIndicatorFlags2,
67
+ generalConstraintIndicatorFlags3:
68
+ spsConfiguration.generalConstraintIndicatorFlags3,
69
+ generalConstraintIndicatorFlags4:
70
+ spsConfiguration.generalConstraintIndicatorFlags4,
71
+ generalConstraintIndicatorFlags5:
72
+ spsConfiguration.generalConstraintIndicatorFlags5,
73
+ generalConstraintIndicatorFlags6:
74
+ spsConfiguration.generalConstraintIndicatorFlags6,
75
+ constantFrameRate: spsConfiguration.constantFrameRate,
76
+ minSpatialSegmentationIdc: spsConfiguration.minSpatialSegmentationIdc,
77
+ chromaFormatIdc: spsConfiguration.chromaFormatIdc,
78
+ bitDepthLumaMinus8: spsConfiguration.bitDepthLumaMinus8,
79
+ bitDepthChromaMinus8: spsConfiguration.bitDepthChromaMinus8,
80
+ parallelismType: ppsConfiguration.parallelismType,
81
+ };
82
+
83
+ const videoConfig = H265.getVideoConfiguration_(
84
+ vpsNalu.fullData, spsNalu.fullData, ppsNalu.fullData, detail);
85
+
86
+ return {
87
+ height: spsConfiguration.height,
88
+ width: spsConfiguration.width,
89
+ videoConfig,
90
+ };
91
+ }
92
+
93
+ /**
94
+ * @param {!Uint8Array} data
95
+ * @return {shaka.transmuxer.H265.VPSConfiguration}
96
+ * @private
97
+ */
98
+ static parseVPS_(data) {
99
+ const gb = new shaka.util.ExpGolomb(data, /* convertEbsp2rbsp= */ true);
100
+
101
+ // remove NALu Header
102
+ gb.readUnsignedByte();
103
+ gb.readUnsignedByte();
104
+
105
+ // VPS
106
+ gb.readBits(4); // video_parameter_set_id
107
+ gb.readBits(2);
108
+ gb.readBits(6); // max_layers_minus1
109
+ const maxSubLayersMinus1 = gb.readBits(3);
110
+ const temporalIdNestingFlag = gb.readBoolean();
111
+
112
+ return {
113
+ numTemporalLayers: maxSubLayersMinus1 + 1,
114
+ temporalIdNested: temporalIdNestingFlag,
115
+ };
116
+ }
117
+
118
+ /**
119
+ * The code is based on mpegts.js
120
+ * https://github.com/xqq/mpegts.js/blob/master/src/demux/h265-parser.js#L65
121
+ *
122
+ * @param {!Uint8Array} data
123
+ * @return {shaka.transmuxer.H265.SPSConfiguration}
124
+ * @private
125
+ */
126
+ static parseSPS_(data) {
127
+ const gb = new shaka.util.ExpGolomb(data, /* convertEbsp2rbsp= */ true);
128
+
129
+ // remove NALu Header
130
+ gb.readUnsignedByte();
131
+ gb.readUnsignedByte();
132
+
133
+ let leftOffset = 0;
134
+ let rightOffset = 0;
135
+ let topOffset = 0;
136
+ let bottomOffset = 0;
137
+
138
+ // SPS
139
+ gb.readBits(4); // video_paramter_set_id
140
+ const maxSubLayersMinus1 = gb.readBits(3);
141
+ gb.readBoolean(); // temporal_id_nesting_flag
142
+
143
+ // profile_tier_level begin
144
+ const generalProfileSpace = gb.readBits(2);
145
+ const generalTierFlag = gb.readBits(1);
146
+ const generalProfileIdc = gb.readBits(5);
147
+ const generalProfileCompatibilityFlags1 = gb.readUnsignedByte();
148
+ const generalProfileCompatibilityFlags2 = gb.readUnsignedByte();
149
+ const generalProfileCompatibilityFlags3 = gb.readUnsignedByte();
150
+ const generalProfileCompatibilityFlags4 = gb.readUnsignedByte();
151
+ const generalConstraintIndicatorFlags1 = gb.readUnsignedByte();
152
+ const generalConstraintIndicatorFlags2 = gb.readUnsignedByte();
153
+ const generalConstraintIndicatorFlags3 = gb.readUnsignedByte();
154
+ const generalConstraintIndicatorFlags4 = gb.readUnsignedByte();
155
+ const generalConstraintIndicatorFlags5 = gb.readUnsignedByte();
156
+ const generalConstraintIndicatorFlags6 = gb.readUnsignedByte();
157
+ const generalLevelIdc = gb.readUnsignedByte();
158
+ const subLayerProfilePresentFlag = [];
159
+ const subLayerLevelPresentFlag = [];
160
+ for (let i = 0; i < maxSubLayersMinus1; i++) {
161
+ subLayerProfilePresentFlag.push(gb.readBoolean());
162
+ subLayerLevelPresentFlag.push(gb.readBoolean());
163
+ }
164
+ if (maxSubLayersMinus1 > 0) {
165
+ for (let i = maxSubLayersMinus1; i < 8; i++) {
166
+ gb.readBits(2);
167
+ }
168
+ }
169
+ for (let i = 0; i < maxSubLayersMinus1; i++) {
170
+ if (subLayerProfilePresentFlag[i]) {
171
+ gb.readBits(88);
172
+ }
173
+ if (subLayerLevelPresentFlag[i]) {
174
+ gb.readUnsignedByte();
175
+ }
176
+ }
177
+ // profile_tier_level end
178
+
179
+ gb.readUnsignedExpGolomb(); // seq_parameter_set_id
180
+ const chromaFormatIdc = gb.readUnsignedExpGolomb();
181
+ if (chromaFormatIdc == 3) {
182
+ gb.readBits(1); // separate_colour_plane_flag
183
+ }
184
+ const picWidthInLumaSamples = gb.readUnsignedExpGolomb();
185
+ const picHeightInLumaSamples = gb.readUnsignedExpGolomb();
186
+ const conformanceWindowFlag = gb.readBoolean();
187
+ if (conformanceWindowFlag) {
188
+ leftOffset += gb.readUnsignedExpGolomb();
189
+ rightOffset += gb.readUnsignedExpGolomb();
190
+ topOffset += gb.readUnsignedExpGolomb();
191
+ bottomOffset += gb.readUnsignedExpGolomb();
192
+ }
193
+ const bitDepthLumaMinus8 = gb.readUnsignedExpGolomb();
194
+ const bitDepthChromaMinus8 = gb.readUnsignedExpGolomb();
195
+ const log2MaxPicOrderCntLsbMinus4 = gb.readUnsignedExpGolomb();
196
+ const subLayerOrderingInfoPresentFlag = gb.readBoolean();
197
+ if (subLayerOrderingInfoPresentFlag) {
198
+ // Skip each layer
199
+ for (let i = 0; i <= maxSubLayersMinus1; i++) {
200
+ gb.readUnsignedExpGolomb(); // max_dec_pic_buffering_minus1[i]
201
+ gb.readUnsignedExpGolomb(); // max_num_reorder_pics[i]
202
+ gb.readUnsignedExpGolomb(); // max_latency_increase_plus1[i]
203
+ }
204
+ } else {
205
+ // Skip one layer
206
+ gb.readUnsignedExpGolomb(); // max_dec_pic_buffering_minus1[i]
207
+ gb.readUnsignedExpGolomb(); // max_num_reorder_pics[i]
208
+ gb.readUnsignedExpGolomb(); // max_latency_increase_plus1[i]
209
+ }
210
+ gb.readUnsignedExpGolomb(); // log2_min_luma_coding_block_size_minus3
211
+ gb.readUnsignedExpGolomb(); // log2_diff_max_min_luma_coding_block_size
212
+ gb.readUnsignedExpGolomb(); // log2_min_transform_block_size_minus2
213
+ gb.readUnsignedExpGolomb(); // log2_diff_max_min_transform_block_size
214
+ gb.readUnsignedExpGolomb(); // max_transform_hierarchy_depth_inter
215
+ gb.readUnsignedExpGolomb(); // max_transform_hierarchy_depth_intra
216
+ const scalingListEnabledFlag = gb.readBoolean();
217
+ if (scalingListEnabledFlag) {
218
+ const spsScalingListDataPresentFlag = gb.readBoolean();
219
+ if (spsScalingListDataPresentFlag) {
220
+ for (let sizeId = 0; sizeId < 4; sizeId++) {
221
+ for (
222
+ let matrixId = 0;
223
+ matrixId < (sizeId === 3 ? 2 : 6);
224
+ matrixId++
225
+ ) {
226
+ const scalingListPredModeFlag = gb.readBoolean();
227
+ if (!scalingListPredModeFlag) {
228
+ gb.readUnsignedExpGolomb(); // scaling_list_pred_matrix_id_delta
229
+ } else {
230
+ const coefNum = Math.min(64, 1 << (4 + (sizeId << 1)));
231
+ if (sizeId > 1) {
232
+ gb.readExpGolomb();
233
+ }
234
+ for (let i = 0; i < coefNum; i++) {
235
+ gb.readExpGolomb();
236
+ }
237
+ }
238
+ }
239
+ }
240
+ }
241
+ }
242
+ gb.readBoolean(); // amp_enabled_flag
243
+ gb.readBoolean(); // sample_adaptive_offset_enabled_flag
244
+ const pcmEnabledFlag = gb.readBoolean();
245
+ if (pcmEnabledFlag) {
246
+ gb.readUnsignedByte();
247
+ gb.readUnsignedExpGolomb();
248
+ gb.readUnsignedExpGolomb();
249
+ gb.readBoolean();
250
+ }
251
+ const numShortTermRefPicSets = gb.readUnsignedExpGolomb();
252
+ let numDeltaPocs = 0;
253
+ for (let i = 0; i < numShortTermRefPicSets; i++) {
254
+ let interRefPicSetPredictionFlag = false;
255
+ if (i !== 0) {
256
+ interRefPicSetPredictionFlag = gb.readBoolean();
257
+ }
258
+ if (interRefPicSetPredictionFlag) {
259
+ if (i === numShortTermRefPicSets) {
260
+ gb.readUnsignedExpGolomb();
261
+ }
262
+ gb.readBoolean();
263
+ gb.readUnsignedExpGolomb();
264
+ let nextNumDeltaPocs = 0;
265
+ for (let j = 0; j <= numDeltaPocs; j++) {
266
+ const usedByCurrPicFlag = gb.readBoolean();
267
+ let useDeltaFlag = false;
268
+ if (!usedByCurrPicFlag) {
269
+ useDeltaFlag = gb.readBoolean();
270
+ }
271
+ if (usedByCurrPicFlag || useDeltaFlag) {
272
+ nextNumDeltaPocs++;
273
+ }
274
+ }
275
+ numDeltaPocs = nextNumDeltaPocs;
276
+ } else {
277
+ const numNegativePics = gb.readUnsignedExpGolomb();
278
+ const numPositivePics = gb.readUnsignedExpGolomb();
279
+ numDeltaPocs = numNegativePics + numPositivePics;
280
+ for (let j = 0; j < numNegativePics; j++) {
281
+ gb.readUnsignedExpGolomb();
282
+ gb.readBoolean();
283
+ }
284
+ for (let j = 0; j < numPositivePics; j++) {
285
+ gb.readUnsignedExpGolomb();
286
+ gb.readBoolean();
287
+ }
288
+ }
289
+ }
290
+ const longTermRefPicsPresentFlag = gb.readBoolean();
291
+ if (longTermRefPicsPresentFlag) {
292
+ const numLongTermRefPicsSps = gb.readUnsignedExpGolomb();
293
+ for (let i = 0; i < numLongTermRefPicsSps; i++) {
294
+ for (let j = 0; j < log2MaxPicOrderCntLsbMinus4 + 4; j++) {
295
+ gb.readBits(1);
296
+ }
297
+ gb.readBits(1);
298
+ }
299
+ }
300
+ let defaultDisplayWindowFlag = false; // for calc offset
301
+ let minSpatialSegmentationIdc = 0; // for hvcC
302
+ gb.readBoolean(); // sps_temporal_mvp_enabled_flag
303
+ gb.readBoolean(); // strong_intra_smoothing_enabled_flag
304
+ const vuiParametersPresentFlag = gb.readBoolean();
305
+ if (vuiParametersPresentFlag) {
306
+ const aspectRatioInfoPresentFlag = gb.readBoolean();
307
+ if (aspectRatioInfoPresentFlag) {
308
+ const aspectRatioIdc = gb.readUnsignedByte();
309
+ if (aspectRatioIdc === 255) {
310
+ gb.readBits(16); // sar_width
311
+ gb.readBits(16); // sar_height
312
+ }
313
+ }
314
+ const overscanInfoPresentFlag = gb.readBoolean();
315
+ if (overscanInfoPresentFlag) {
316
+ gb.readBoolean();
317
+ }
318
+ const videoSignalTypePresentFlag = gb.readBoolean();
319
+ if (videoSignalTypePresentFlag) {
320
+ gb.readBits(3);
321
+ gb.readBoolean();
322
+ const colourDescriptionPresentFlag = gb.readBoolean();
323
+ if (colourDescriptionPresentFlag) {
324
+ gb.readUnsignedByte();
325
+ gb.readUnsignedByte();
326
+ gb.readUnsignedByte();
327
+ }
328
+ }
329
+ const chromaLocInfoPresentFlag = gb.readBoolean();
330
+ if (chromaLocInfoPresentFlag) {
331
+ gb.readUnsignedExpGolomb();
332
+ gb.readUnsignedExpGolomb();
333
+ }
334
+ gb.readBoolean(); // neutral_chroma_indication_flag
335
+ gb.readBoolean(); // field_seq_flag
336
+ gb.readBoolean(); // frame_field_info_present_flag
337
+ defaultDisplayWindowFlag = gb.readBoolean();
338
+ if (defaultDisplayWindowFlag) {
339
+ gb.readUnsignedExpGolomb();
340
+ gb.readUnsignedExpGolomb();
341
+ gb.readUnsignedExpGolomb();
342
+ gb.readUnsignedExpGolomb();
343
+ }
344
+ const vuiTimingInfoPresentFlag = gb.readBoolean();
345
+ if (vuiTimingInfoPresentFlag) {
346
+ gb.readBits(32); // fps_den
347
+ gb.readBits(32); // fps_num
348
+ const vuiPocProportionalToTimingFlag = gb.readBoolean();
349
+ if (vuiPocProportionalToTimingFlag) {
350
+ gb.readUnsignedExpGolomb();
351
+ }
352
+ const vuiHrdParametersPresentFlag = gb.readBoolean();
353
+ if (vuiHrdParametersPresentFlag) {
354
+ const commonInfPresentFlag = 1;
355
+ let nalHrdParametersPresentFlag = false;
356
+ let vclHrdParametersPresentFlag = false;
357
+ let subPicHrdParamsPresentFlag = false;
358
+ if (commonInfPresentFlag) {
359
+ nalHrdParametersPresentFlag = gb.readBoolean();
360
+ vclHrdParametersPresentFlag = gb.readBoolean();
361
+ if (nalHrdParametersPresentFlag || vclHrdParametersPresentFlag) {
362
+ subPicHrdParamsPresentFlag = gb.readBoolean();
363
+ if (subPicHrdParamsPresentFlag) {
364
+ gb.readUnsignedByte();
365
+ gb.readBits(5);
366
+ gb.readBoolean();
367
+ gb.readBits(5);
368
+ }
369
+ gb.readBits(4); // bit_rate_scale
370
+ gb.readBits(4); // cpb_size_scale
371
+ if (subPicHrdParamsPresentFlag) {
372
+ gb.readBits(4);
373
+ }
374
+ gb.readBits(5);
375
+ gb.readBits(5);
376
+ gb.readBits(5);
377
+ }
378
+ }
379
+ for (let i = 0; i <= maxSubLayersMinus1; i++) {
380
+ const fixedPicRateGeneralFlag = gb.readBoolean();
381
+ let fixedPicRateWithinCvsFlag = true;
382
+ let cpbCnt = 1;
383
+ if (!fixedPicRateGeneralFlag) {
384
+ fixedPicRateWithinCvsFlag = gb.readBoolean();
385
+ }
386
+ let lowDelayHrdFlag = false;
387
+ if (fixedPicRateWithinCvsFlag) {
388
+ gb.readUnsignedExpGolomb();
389
+ } else {
390
+ lowDelayHrdFlag = gb.readBoolean();
391
+ }
392
+ if (!lowDelayHrdFlag) {
393
+ cpbCnt = gb.readUnsignedExpGolomb() + 1;
394
+ }
395
+ if (nalHrdParametersPresentFlag) {
396
+ for (let j = 0; j < cpbCnt; j++) {
397
+ gb.readUnsignedExpGolomb();
398
+ gb.readUnsignedExpGolomb();
399
+ if (subPicHrdParamsPresentFlag) {
400
+ gb.readUnsignedExpGolomb();
401
+ gb.readUnsignedExpGolomb();
402
+ }
403
+ }
404
+ gb.readBoolean();
405
+ }
406
+ if (vclHrdParametersPresentFlag) {
407
+ for (let j = 0; j < cpbCnt; j++) {
408
+ gb.readUnsignedExpGolomb();
409
+ gb.readUnsignedExpGolomb();
410
+ if (subPicHrdParamsPresentFlag) {
411
+ gb.readUnsignedExpGolomb();
412
+ gb.readUnsignedExpGolomb();
413
+ }
414
+ }
415
+ gb.readBoolean();
416
+ }
417
+ }
418
+ }
419
+ }
420
+ const bitstreamRestrictionFlag = gb.readBoolean();
421
+ if (bitstreamRestrictionFlag) {
422
+ gb.readBoolean(); // tiles_fixed_structure_flag
423
+ gb.readBoolean(); // motion_vectors_over_pic_boundaries_flag
424
+ gb.readBoolean(); // restricted_ref_pic_lists_flag
425
+ minSpatialSegmentationIdc = gb.readUnsignedExpGolomb();
426
+ gb.readUnsignedExpGolomb(); // max_bytes_per_pic_denom
427
+ gb.readUnsignedExpGolomb(); // max_bits_per_min_cu_denom
428
+ gb.readUnsignedExpGolomb(); // log2_max_mv_length_horizontal
429
+ gb.readUnsignedExpGolomb(); // log2_max_mv_length_vertical
430
+ }
431
+ }
432
+
433
+ const subWc = chromaFormatIdc === 1 || chromaFormatIdc === 2 ? 2 : 1;
434
+ const subHc = chromaFormatIdc === 1 ? 2 : 1;
435
+ const codecWidth =
436
+ picWidthInLumaSamples - (leftOffset + rightOffset) * subWc;
437
+ const codecHeight =
438
+ picHeightInLumaSamples - (topOffset + bottomOffset) * subHc;
439
+
440
+ return {
441
+ generalLevelIdc,
442
+ generalProfileSpace,
443
+ generalTierFlag,
444
+ generalProfileIdc,
445
+ generalProfileCompatibilityFlags1,
446
+ generalProfileCompatibilityFlags2,
447
+ generalProfileCompatibilityFlags3,
448
+ generalProfileCompatibilityFlags4,
449
+ generalConstraintIndicatorFlags1,
450
+ generalConstraintIndicatorFlags2,
451
+ generalConstraintIndicatorFlags3,
452
+ generalConstraintIndicatorFlags4,
453
+ generalConstraintIndicatorFlags5,
454
+ generalConstraintIndicatorFlags6,
455
+ minSpatialSegmentationIdc,
456
+ constantFrameRate: 0, // FIXME!!!
457
+ chromaFormatIdc,
458
+ bitDepthLumaMinus8,
459
+ bitDepthChromaMinus8,
460
+ width: codecWidth,
461
+ height: codecHeight,
462
+ };
463
+ }
464
+
465
+ /**
466
+ * @param {!Uint8Array} data
467
+ * @return {shaka.transmuxer.H265.PPSConfiguration}
468
+ * @private
469
+ */
470
+ static parsePPS_(data) {
471
+ const gb = new shaka.util.ExpGolomb(data, /* convertEbsp2rbsp= */ true);
472
+
473
+ // remove NALu Header
474
+ gb.readUnsignedByte();
475
+ gb.readUnsignedByte();
476
+
477
+ // PPS
478
+ gb.readUnsignedExpGolomb(); // pic_parameter_set_id
479
+ gb.readUnsignedExpGolomb(); // seq_parameter_set_id
480
+ gb.readBoolean(); // dependent_slice_segments_enabled_flag
481
+ gb.readBoolean(); // output_flag_present_flag
482
+ gb.readBits(3); // num_extra_slice_header_bits
483
+ gb.readBoolean(); // sign_data_hiding_enabled_flag
484
+ gb.readBoolean(); // cabac_init_present_flag
485
+ gb.readUnsignedExpGolomb(); // num_ref_idx_l0_default_active_minus1
486
+ gb.readUnsignedExpGolomb(); // num_ref_idx_l1_default_active_minus1
487
+ gb.readExpGolomb(); // init_qp_minus26
488
+ gb.readBoolean(); // constrained_intra_pred_flag
489
+ gb.readBoolean(); // transform_skip_enabled_flag
490
+ const cuQpDeltaEnabledFlag = gb.readBoolean();
491
+ if (cuQpDeltaEnabledFlag) {
492
+ gb.readUnsignedExpGolomb(); // diff_cu_qp_delta_depth
493
+ }
494
+ gb.readExpGolomb(); // cb_qp_offset
495
+ gb.readExpGolomb(); // cr_qp_offset
496
+ gb.readBoolean(); // pps_slice_chroma_qp_offsets_present_flag
497
+ gb.readBoolean(); // weighted_pred_flag
498
+ gb.readBoolean(); // weighted_bipred_flag
499
+ gb.readBoolean(); // transquant_bypass_enabled_flag
500
+ const tilesEnabledFlag = gb.readBoolean();
501
+ const entropyCodingSyncEnabledFlag = gb.readBoolean();
502
+
503
+ // needs hvcC
504
+ let parallelismType = 1; // slice-based parallel decoding
505
+ if (entropyCodingSyncEnabledFlag && tilesEnabledFlag) {
506
+ parallelismType = 0; // mixed-type parallel decoding
507
+ } else if (entropyCodingSyncEnabledFlag) {
508
+ parallelismType = 3; // wavefront-based parallel decoding
509
+ } else if (tilesEnabledFlag) {
510
+ parallelismType = 2; // tile-based parallel decoding
511
+ }
512
+
513
+ return {
514
+ parallelismType,
515
+ };
516
+ }
517
+
518
+ /**
519
+ * @param {!Uint8Array} vps
520
+ * @param {!Uint8Array} sps
521
+ * @param {!Uint8Array} pps
522
+ * @param {shaka.transmuxer.H265.DecoderConfigurationRecordType} detail
523
+ * @return {!Uint8Array}
524
+ * @private
525
+ */
526
+ static getVideoConfiguration_(vps, sps, pps, detail) {
527
+ const H265 = shaka.transmuxer.H265;
528
+
529
+ const length = 23 + (3 + 2 + vps.byteLength) +
530
+ (3 + 2 + sps.byteLength) + (3 + 2 + pps.byteLength);
531
+ const data = new Uint8Array(length);
532
+
533
+ data[0] = 0x01; // configurationVersion
534
+ data[1] = ((detail.generalProfileSpace & 0x03) << 6) |
535
+ ((detail.generalTierFlag ? 1 : 0) << 5) |
536
+ ((detail.generalProfileIdc & 0x1F));
537
+ data[2] = detail.generalProfileCompatibilityFlags1;
538
+ data[3] = detail.generalProfileCompatibilityFlags2;
539
+ data[4] = detail.generalProfileCompatibilityFlags3;
540
+ data[5] = detail.generalProfileCompatibilityFlags4;
541
+ data[6] = detail.generalConstraintIndicatorFlags1;
542
+ data[7] = detail.generalConstraintIndicatorFlags2;
543
+ data[8] = detail.generalConstraintIndicatorFlags3;
544
+ data[9] = detail.generalConstraintIndicatorFlags4;
545
+ data[10] = detail.generalConstraintIndicatorFlags5;
546
+ data[11] = detail.generalConstraintIndicatorFlags6;
547
+ data[12] = detail.generalLevelIdc;
548
+ data[13] = 0xF0 |
549
+ ((detail.minSpatialSegmentationIdc & 0x0F00) >> 8);
550
+ data[14] = (detail.minSpatialSegmentationIdc & 0xFF);
551
+ data[15] = 0xFC | (detail.parallelismType & 0x03);
552
+ data[16] = 0xFC | (detail.chromaFormatIdc & 0x03);
553
+ data[17] = 0xF8 | (detail.bitDepthLumaMinus8 & 0x07);
554
+ data[18] = 0xF8 | (detail.bitDepthChromaMinus8 & 0x07);
555
+ data[19] = 0;
556
+ data[20] = 0;
557
+ data[21] = ((detail.constantFrameRate & 0x03) << 6) |
558
+ ((detail.numTemporalLayers & 0x07) << 3) |
559
+ ((detail.temporalIdNested ? 1 : 0) << 2) | 3;
560
+ data[22] = 3;
561
+ data[23 + 0 + 0] = 0x80 | H265.NALU_TYPE_VPS_;
562
+ data[23 + 0 + 1] = 0;
563
+ data[23 + 0 + 2] = 1;
564
+ data[23 + 0 + 3] = (vps.byteLength & 0xFF00) >> 8;
565
+ data[23 + 0 + 4] = (vps.byteLength & 0x00FF) >> 0;
566
+ data.set(vps, 23 + 0 + 5);
567
+ data[23 + (5 + vps.byteLength) + 0] =
568
+ 0x80 | H265.NALU_TYPE_SPS_;
569
+ data[23 + (5 + vps.byteLength) + 1] = 0;
570
+ data[23 + (5 + vps.byteLength) + 2] = 1;
571
+ data[23 + (5 + vps.byteLength) + 3] = (sps.byteLength & 0xFF00) >> 8;
572
+ data[23 + (5 + vps.byteLength) + 4] = (sps.byteLength & 0x00FF) >> 0;
573
+ data.set(sps, 23 + (5 + vps.byteLength) + 5);
574
+ data[23 + (5 + vps.byteLength + 5 + sps.byteLength) + 0] =
575
+ 0x80 | H265.NALU_TYPE_PPS_;
576
+ data[23 + (5 + vps.byteLength + 5 + sps.byteLength) + 1] = 0;
577
+ data[23 + (5 + vps.byteLength + 5 + sps.byteLength) + 2] = 1;
578
+ data[23 + (5 + vps.byteLength + 5 + sps.byteLength) + 3] =
579
+ (pps.byteLength & 0xFF00) >> 8;
580
+ data[23 + (5 + vps.byteLength + 5 + sps.byteLength) + 4] =
581
+ (pps.byteLength & 0x00FF) >> 0;
582
+ data.set(pps, 23 + (5 + vps.byteLength + 5 + sps.byteLength) + 5);
583
+ return data;
584
+ }
585
+
586
+ /**
587
+ * @param {!Array.<shaka.extern.VideoNalu>} nalus
588
+ * @return {?{data: !Uint8Array, isKeyframe: boolean}}
589
+ */
590
+ static parseFrame(nalus) {
591
+ const H265 = shaka.transmuxer.H265;
592
+ let isKeyframe = false;
593
+ const nalusData = [];
594
+ let hvcSample = false;
595
+ for (const nalu of nalus) {
596
+ let push = false;
597
+ switch (nalu.type) {
598
+ case H265.NALU_TYPE_TRAIL_N_:
599
+ case H265.NALU_TYPE_TRAIL_R_: {
600
+ hvcSample = true;
601
+ push = true;
602
+ break;
603
+ }
604
+ case H265.NALU_TYPE_IDR_W_RADL_:
605
+ case H265.NALU_TYPE_IDR_N_LP_:
606
+ case H265.NALU_TYPE_CRA_NUT_:
607
+ hvcSample = true;
608
+ push = true;
609
+ isKeyframe = true;
610
+ break;
611
+ case H265.NALU_TYPE_VPS_:
612
+ push = true;
613
+ break;
614
+ case H265.NALU_TYPE_SPS_:
615
+ push = true;
616
+ break;
617
+ case H265.NALU_TYPE_PPS_:
618
+ push = true;
619
+ break;
620
+ case H265.NALU_TYPE_AUD_:
621
+ push = true;
622
+ hvcSample = true;
623
+ break;
624
+ case H265.NALU_TYPE_SEI_PREFIX_:
625
+ case H265.NALU_TYPE_SEI_SUFFIX_:
626
+ push = true;
627
+ break;
628
+ default:
629
+ push = false;
630
+ break;
631
+ }
632
+ if (hvcSample && push) {
633
+ const size = nalu.fullData.byteLength;
634
+ const naluLength = new Uint8Array(4);
635
+ naluLength[0] = (size >> 24) & 0xff;
636
+ naluLength[1] = (size >> 16) & 0xff;
637
+ naluLength[2] = (size >> 8) & 0xff;
638
+ naluLength[3] = size & 0xff;
639
+ nalusData.push(shaka.util.Uint8ArrayUtils.concat(
640
+ naluLength, nalu.fullData));
641
+ }
642
+ }
643
+ if (!nalusData.length) {
644
+ return null;
645
+ }
646
+ const data = shaka.util.Uint8ArrayUtils.concat(...nalusData);
647
+ return {
648
+ data,
649
+ isKeyframe,
650
+ };
651
+ }
652
+ };
653
+
654
+
655
+ /**
656
+ * NALU type for non-reference trailing picture for H.265.
657
+ * @const {number}
658
+ * @private
659
+ */
660
+ shaka.transmuxer.H265.NALU_TYPE_TRAIL_N_ = 0x01;
661
+
662
+
663
+ /**
664
+ * NALU type for reference trailing picture for H.265.
665
+ * @const {number}
666
+ * @private
667
+ */
668
+ shaka.transmuxer.H265.NALU_TYPE_TRAIL_R_ = 0x00;
669
+
670
+
671
+ /**
672
+ * NALU type for Instantaneous Decoder Refresh (IDR) for H.265.
673
+ * @const {number}
674
+ * @private
675
+ */
676
+ shaka.transmuxer.H265.NALU_TYPE_IDR_W_RADL_ = 0x13;
677
+
678
+
679
+ /**
680
+ * NALU type for Instantaneous Decoder Refresh (IDR) for H.265.
681
+ * @const {number}
682
+ * @private
683
+ */
684
+ shaka.transmuxer.H265.NALU_TYPE_IDR_N_LP_ = 0x14;
685
+
686
+ /**
687
+ * NALU type for Clean Random Access (CRA) for H.265.
688
+ * @const {number}
689
+ * @private
690
+ */
691
+ shaka.transmuxer.H265.NALU_TYPE_CRA_NUT_ = 0x15;
692
+
693
+
694
+ /**
695
+ * NALU type for Video Parameter Set (VPS) for H.265.
696
+ * @const {number}
697
+ * @private
698
+ */
699
+ shaka.transmuxer.H265.NALU_TYPE_VPS_ = 0x20;
700
+
701
+
702
+ /**
703
+ * NALU type for Sequence Parameter Set (SPS) for H.265.
704
+ * @const {number}
705
+ * @private
706
+ */
707
+ shaka.transmuxer.H265.NALU_TYPE_SPS_ = 0x21;
708
+
709
+
710
+ /**
711
+ * NALU type for Picture Parameter Set (PPS) for H.265.
712
+ * @const {number}
713
+ * @private
714
+ */
715
+ shaka.transmuxer.H265.NALU_TYPE_PPS_ = 0x22;
716
+
717
+
718
+ /**
719
+ * NALU type for Access Unit Delimiter (AUD) for H.265.
720
+ * @const {number}
721
+ * @private
722
+ */
723
+ shaka.transmuxer.H265.NALU_TYPE_AUD_ = 0x23;
724
+
725
+
726
+ /**
727
+ * NALU type for Supplemental Enhancement Information (SEI) for H.265.
728
+ * @const {number}
729
+ * @private
730
+ */
731
+ shaka.transmuxer.H265.NALU_TYPE_SEI_PREFIX_ = 0x27;
732
+
733
+
734
+ /**
735
+ * NALU type for Supplemental Enhancement Information (SEI) for H.265.
736
+ * @const {number}
737
+ * @private
738
+ */
739
+ shaka.transmuxer.H265.NALU_TYPE_SEI_SUFFIX_ = 0x28;
740
+
741
+
742
+ /**
743
+ * @typedef {{
744
+ * numTemporalLayers: number,
745
+ * temporalIdNested: boolean
746
+ * }}
747
+ *
748
+ * @property {number} numTemporalLayers
749
+ * @property {boolean} temporalIdNested
750
+ */
751
+ shaka.transmuxer.H265.VPSConfiguration;
752
+
753
+
754
+ /**
755
+ * @typedef {{
756
+ * generalProfileSpace: number,
757
+ * generalTierFlag: number,
758
+ * generalLevelIdc: number,
759
+ * generalProfileIdc: number,
760
+ * generalProfileCompatibilityFlags1: number,
761
+ * generalProfileCompatibilityFlags2: number,
762
+ * generalProfileCompatibilityFlags3: number,
763
+ * generalProfileCompatibilityFlags4: number,
764
+ * generalConstraintIndicatorFlags1: number,
765
+ * generalConstraintIndicatorFlags2: number,
766
+ * generalConstraintIndicatorFlags3: number,
767
+ * generalConstraintIndicatorFlags4: number,
768
+ * generalConstraintIndicatorFlags5: number,
769
+ * generalConstraintIndicatorFlags6: number,
770
+ * constantFrameRate: number,
771
+ * minSpatialSegmentationIdc: number,
772
+ * chromaFormatIdc: number,
773
+ * bitDepthLumaMinus8: number,
774
+ * bitDepthChromaMinus8: number,
775
+ * width: number,
776
+ * height: number
777
+ * }}
778
+ *
779
+ * @property {number} generalProfileSpace
780
+ * @property {number} generalTierFlag
781
+ * @property {number} generalLevelIdc
782
+ * @property {number} generalProfileIdc
783
+ * @property {number} generalProfileCompatibilityFlags1
784
+ * @property {number} generalProfileCompatibilityFlags2
785
+ * @property {number} generalProfileCompatibilityFlags3
786
+ * @property {number} generalProfileCompatibilityFlags4
787
+ * @property {number} generalConstraintIndicatorFlags1
788
+ * @property {number} generalConstraintIndicatorFlags2
789
+ * @property {number} generalConstraintIndicatorFlags3
790
+ * @property {number} generalConstraintIndicatorFlags4
791
+ * @property {number} generalConstraintIndicatorFlags5
792
+ * @property {number} generalConstraintIndicatorFlags6
793
+ * @property {number} constantFrameRate
794
+ * @property {number} minSpatialSegmentationIdc
795
+ * @property {number} chromaFormatIdc
796
+ * @property {number} bitDepthLumaMinus8
797
+ * @property {number} bitDepthChromaMinus8
798
+ * @property {number} width
799
+ * @property {number} height
800
+ */
801
+ shaka.transmuxer.H265.SPSConfiguration;
802
+
803
+
804
+ /**
805
+ * @typedef {{
806
+ * parallelismType: number
807
+ * }}
808
+ *
809
+ * @property {number} parallelismType
810
+ */
811
+ shaka.transmuxer.H265.PPSConfiguration;
812
+
813
+
814
+ /**
815
+ * @typedef {{
816
+ * numTemporalLayers: number,
817
+ * temporalIdNested: boolean,
818
+ * generalProfileSpace: number,
819
+ * generalTierFlag: number,
820
+ * generalLevelIdc: number,
821
+ * generalProfileIdc: number,
822
+ * generalProfileCompatibilityFlags1: number,
823
+ * generalProfileCompatibilityFlags2: number,
824
+ * generalProfileCompatibilityFlags3: number,
825
+ * generalProfileCompatibilityFlags4: number,
826
+ * generalConstraintIndicatorFlags1: number,
827
+ * generalConstraintIndicatorFlags2: number,
828
+ * generalConstraintIndicatorFlags3: number,
829
+ * generalConstraintIndicatorFlags4: number,
830
+ * generalConstraintIndicatorFlags5: number,
831
+ * generalConstraintIndicatorFlags6: number,
832
+ * constantFrameRate: number,
833
+ * minSpatialSegmentationIdc: number,
834
+ * chromaFormatIdc: number,
835
+ * bitDepthLumaMinus8: number,
836
+ * bitDepthChromaMinus8: number,
837
+ * parallelismType: number
838
+ * }}
839
+ *
840
+ * @property {number} numTemporalLayers
841
+ * @property {boolean} temporalIdNested
842
+ * @property {number} generalProfileSpace
843
+ * @property {number} generalTierFlag
844
+ * @property {number} generalLevelIdc
845
+ * @property {number} generalProfileIdc
846
+ * @property {number} generalProfileCompatibilityFlags1
847
+ * @property {number} generalProfileCompatibilityFlags2
848
+ * @property {number} generalProfileCompatibilityFlags3
849
+ * @property {number} generalProfileCompatibilityFlags4
850
+ * @property {number} generalConstraintIndicatorFlags1
851
+ * @property {number} generalConstraintIndicatorFlags2
852
+ * @property {number} generalConstraintIndicatorFlags3
853
+ * @property {number} generalConstraintIndicatorFlags4
854
+ * @property {number} generalConstraintIndicatorFlags5
855
+ * @property {number} generalConstraintIndicatorFlags6
856
+ * @property {number} constantFrameRate
857
+ * @property {number} minSpatialSegmentationIdc
858
+ * @property {number} chromaFormatIdc
859
+ * @property {number} bitDepthLumaMinus8
860
+ * @property {number} bitDepthChromaMinus8
861
+ * @property {number} parallelismType
862
+ */
863
+ shaka.transmuxer.H265.DecoderConfigurationRecordType;