shaka-player 4.3.11 → 4.4.1
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.
- package/AUTHORS +9 -0
- package/CHANGELOG.md +303 -202
- package/CONTRIBUTORS +8 -0
- package/LICENSE +32 -0
- package/README.md +63 -10
- package/demo/autoTemplate.txt +40 -5
- package/demo/close_button.js +11 -0
- package/demo/common/asset.js +13 -1
- package/demo/common/assets.js +53 -3
- package/demo/common/message_ids.js +25 -1
- package/demo/config.js +69 -10
- package/demo/customWarning.txt +2 -2
- package/demo/index.html +3 -1
- package/demo/locales/en.json +26 -2
- package/demo/locales/source.json +105 -9
- package/demo/main.js +52 -9
- package/demo/search.js +3 -1
- package/demo/service_worker.js +3 -0
- package/dist/controls.css +1 -1
- package/dist/controls.css.map +1 -1
- package/dist/demo.compiled.debug.js +124 -112
- package/dist/demo.compiled.debug.map +3 -3
- package/dist/demo.compiled.js +124 -112
- package/dist/demo.compiled.map +3 -3
- package/dist/deps.js +46 -28
- package/dist/locales.js +33 -33
- package/dist/receiver.compiled.debug.js +52 -46
- package/dist/receiver.compiled.debug.map +3 -3
- package/dist/receiver.compiled.js +52 -46
- package/dist/receiver.compiled.map +3 -3
- package/dist/shaka-player.compiled.d.ts +676 -391
- package/dist/shaka-player.compiled.debug.d.ts +676 -391
- package/dist/shaka-player.compiled.debug.externs.js +1188 -616
- package/dist/shaka-player.compiled.debug.js +1043 -699
- package/dist/shaka-player.compiled.debug.map +4 -4
- package/dist/shaka-player.compiled.externs.js +1188 -616
- package/dist/shaka-player.compiled.js +1091 -929
- package/dist/shaka-player.compiled.map +4 -4
- package/dist/shaka-player.ui.d.ts +677 -392
- package/dist/shaka-player.ui.debug.d.ts +677 -392
- package/dist/shaka-player.ui.debug.externs.js +1023 -451
- package/dist/shaka-player.ui.debug.js +1098 -737
- package/dist/shaka-player.ui.debug.map +4 -4
- package/dist/shaka-player.ui.externs.js +1023 -451
- package/dist/shaka-player.ui.js +1246 -1071
- package/dist/shaka-player.ui.map +4 -4
- package/docs/tutorials/ad_monetization.md +15 -1
- package/docs/tutorials/application-level-redirects.md +1 -1
- package/docs/tutorials/config.md +9 -5
- package/docs/tutorials/drm-config.md +61 -0
- package/docs/tutorials/fairplay.md +19 -4
- package/docs/tutorials/license-server-auth.md +4 -4
- package/docs/tutorials/license-wrapping.md +2 -2
- package/docs/tutorials/ui-customization.md +7 -3
- package/docs/tutorials/ui.md +7 -7
- package/docs/tutorials/upgrade.md +3 -0
- package/externs/ima.js +123 -2
- package/externs/isoboxer.js +217 -0
- package/externs/mediakeys.js +18 -0
- package/externs/mux.js +1 -105
- package/externs/pictureinpicture.js +48 -0
- package/externs/shaka/ads.js +61 -1
- package/externs/shaka/cea.js +110 -0
- package/externs/shaka/codecs.js +32 -0
- package/externs/shaka/manifest.js +101 -1
- package/externs/shaka/manifest_parser.js +0 -10
- package/externs/shaka/net.js +36 -7
- package/externs/shaka/offline.js +8 -1
- package/externs/shaka/player.js +220 -21
- package/externs/shaka/text.js +1 -382
- package/externs/shaka/transmuxer.js +60 -0
- package/karma.conf.js +13 -0
- package/lib/abr/simple_abr_manager.js +6 -3
- package/lib/ads/ad_manager.js +60 -2
- package/lib/ads/client_side_ad.js +86 -0
- package/lib/ads/client_side_ad_manager.js +79 -3
- package/lib/ads/server_side_ad.js +86 -0
- package/lib/ads/server_side_ad_manager.js +13 -0
- package/lib/cast/cast_utils.js +1 -0
- package/lib/cea/cea608_data_channel.js +24 -14
- package/lib/cea/cea608_memory.js +5 -2
- package/lib/cea/cea708_service.js +8 -9
- package/lib/cea/cea708_window.js +1 -2
- package/lib/cea/cea_decoder.js +23 -6
- package/lib/cea/cea_utils.js +25 -2
- package/lib/cea/dummy_caption_decoder.js +21 -0
- package/lib/cea/dummy_cea_parser.js +1 -3
- package/lib/cea/mp4_cea_parser.js +15 -10
- package/lib/cea/ts_cea_parser.js +69 -0
- package/lib/dash/content_protection.js +32 -2
- package/lib/dash/dash_parser.js +93 -31
- package/lib/dash/mpd_utils.js +6 -25
- package/lib/dash/segment_base.js +12 -14
- package/lib/dash/segment_list.js +10 -6
- package/lib/dash/segment_template.js +349 -32
- package/lib/dependencies/all.js +8 -0
- package/lib/hls/hls_classes.js +33 -8
- package/lib/hls/hls_parser.js +805 -191
- package/lib/hls/manifest_text_parser.js +4 -14
- package/lib/media/adaptation_set_criteria.js +43 -3
- package/lib/media/closed_caption_parser.js +74 -12
- package/lib/media/drm_engine.js +189 -49
- package/lib/media/gap_jumping_controller.js +1 -1
- package/lib/media/manifest_parser.js +34 -0
- package/lib/media/media_source_capabilities.js +10 -0
- package/lib/media/media_source_engine.js +495 -231
- package/lib/media/playhead.js +1 -1
- package/lib/media/presentation_timeline.js +62 -0
- package/lib/media/segment_index.js +50 -14
- package/lib/media/segment_prefetch.js +277 -0
- package/lib/media/segment_reference.js +70 -4
- package/lib/media/streaming_engine.js +258 -81
- package/lib/media/video_wrapper.js +15 -7
- package/lib/mss/content_protection.js +353 -0
- package/lib/mss/mss_parser.js +1082 -0
- package/lib/net/networking_engine.js +60 -10
- package/lib/offline/indexeddb/v1_storage_cell.js +1 -0
- package/lib/offline/indexeddb/v2_storage_cell.js +1 -0
- package/lib/offline/manifest_converter.js +6 -0
- package/lib/offline/storage.js +2 -4
- package/lib/player.js +309 -105
- package/lib/polyfill/media_capabilities.js +43 -3
- package/lib/polyfill/patchedmediakeys_apple.js +5 -0
- package/lib/polyfill/patchedmediakeys_nop.js +5 -0
- package/lib/polyfill/patchedmediakeys_webkit.js +5 -0
- package/lib/text/cue.js +208 -130
- package/lib/text/lrc_text_parser.js +2 -2
- package/lib/text/mp4_vtt_parser.js +2 -2
- package/lib/text/sbv_text_parser.js +1 -1
- package/lib/text/simple_text_displayer.js +1 -1
- package/lib/text/srt_text_parser.js +9 -1
- package/lib/text/ssa_text_parser.js +2 -2
- package/lib/text/text_engine.js +3 -21
- package/lib/text/text_utils.js +71 -20
- package/lib/text/ui_text_displayer.js +14 -14
- package/lib/text/vtt_text_parser.js +22 -14
- package/lib/transmuxer/aac_transmuxer.js +224 -0
- package/lib/transmuxer/ac3.js +142 -0
- package/lib/transmuxer/ac3_transmuxer.js +213 -0
- package/lib/transmuxer/adts.js +232 -0
- package/lib/transmuxer/ec3.js +103 -0
- package/lib/transmuxer/ec3_transmuxer.js +213 -0
- package/lib/transmuxer/h264.js +324 -0
- package/lib/transmuxer/mp3_transmuxer.js +205 -0
- package/lib/transmuxer/mpeg_audio.js +196 -0
- package/lib/transmuxer/mpeg_ts_transmuxer.js +182 -0
- package/lib/transmuxer/mss_transmuxer.js +389 -0
- package/lib/{media/transmuxer.js → transmuxer/muxjs_transmuxer.js} +34 -80
- package/lib/transmuxer/transmuxer_engine.js +161 -0
- package/lib/transmuxer/ts_transmuxer.js +721 -0
- package/lib/util/cmcd_manager.js +131 -71
- package/lib/util/error.js +62 -26
- package/lib/util/exp_golomb.js +220 -0
- package/lib/util/fairplay_utils.js +64 -13
- package/lib/util/id3_utils.js +56 -3
- package/lib/util/language_utils.js +11 -8
- package/lib/util/manifest_parser_utils.js +3 -0
- package/lib/util/mime_utils.js +44 -7
- package/lib/util/mp4_box_parsers.js +233 -5
- package/lib/util/mp4_generator.js +1388 -0
- package/lib/util/periods.js +40 -34
- package/lib/util/platform.js +17 -3
- package/lib/util/player_configuration.js +38 -1
- package/lib/util/stream_utils.js +138 -27
- package/lib/util/text_parser.js +1 -1
- package/lib/util/ts_parser.js +460 -74
- package/lib/util/xml_utils.js +16 -3
- package/maintained-branches.md +2 -2
- package/package.json +3 -1
- package/roadmap.md +21 -6
- package/shaka-player.uncompiled.js +18 -0
- package/test/abr/simple_abr_manager_unit.js +32 -4
- package/test/ads/ad_manager_unit.js +18 -2
- package/test/cast/cast_utils_unit.js +7 -2
- package/test/cea/cea608_memory_unit.js +24 -0
- package/test/cea/cea_decoder_unit.js +33 -0
- package/test/dash/dash_parser_content_protection_unit.js +93 -3
- package/test/dash/dash_parser_live_unit.js +56 -13
- package/test/dash/dash_parser_manifest_unit.js +70 -2
- package/test/dash/dash_parser_segment_base_unit.js +14 -9
- package/test/dash/dash_parser_segment_template_unit.js +286 -6
- package/test/demo/demo_unit.js +5 -1
- package/test/hls/hls_live_unit.js +188 -28
- package/test/hls/hls_parser_unit.js +250 -109
- package/test/hls/manifest_text_parser_unit.js +18 -13
- package/test/media/adaptation_set_criteria_unit.js +46 -14
- package/test/media/adaptation_set_unit.js +2 -0
- package/test/media/drm_engine_integration.js +11 -8
- package/test/media/drm_engine_unit.js +220 -7
- package/test/media/media_source_engine_integration.js +124 -40
- package/test/media/media_source_engine_unit.js +133 -153
- package/test/media/playhead_unit.js +3 -0
- package/test/media/presentation_timeline_unit.js +51 -0
- package/test/media/segment_index_unit.js +52 -0
- package/test/media/segment_prefetch_unit.js +243 -0
- package/test/media/streaming_engine_integration.js +9 -3
- package/test/media/streaming_engine_unit.js +440 -59
- package/test/mss/mss_parser_content_protection_unit.js +49 -0
- package/test/mss/mss_parser_unit.js +472 -0
- package/test/mss/mss_player_integration.js +123 -0
- package/test/offline/manifest_convert_unit.js +9 -0
- package/test/offline/storage_integration.js +6 -1
- package/test/player_unit.js +386 -133
- package/test/polyfill/media_capabilities_unit.js +18 -0
- package/test/test/assets/hls-raw-aac/fileSequence0.aac +0 -0
- package/test/test/assets/hls-raw-aac/fileSequence1.aac +0 -0
- package/test/test/assets/hls-raw-aac/fileSequence2.aac +0 -0
- package/test/test/assets/hls-raw-aac/fileSequence3.aac +0 -0
- package/test/test/assets/hls-raw-aac/manifest.m3u8 +4 -0
- package/test/test/assets/hls-raw-aac/stream.m4a.m3u8 +14 -0
- package/test/test/assets/hls-raw-ac3/fileSequence0.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence1.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence2.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence3.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence4.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence5.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence6.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/fileSequence7.ac3 +0 -0
- package/test/test/assets/hls-raw-ac3/prog_index.m3u8 +31 -0
- package/test/test/assets/hls-raw-ec3/fileSequence0.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence1.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence2.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence3.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence4.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence5.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence6.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/fileSequence7.ec3 +0 -0
- package/test/test/assets/hls-raw-ec3/prog_index.m3u8 +31 -0
- package/test/test/assets/hls-raw-mp3/chunklist_w905519204.m3u8 +13 -0
- package/test/test/assets/hls-raw-mp3/media_w905519204_0.mp3 +0 -0
- package/test/test/assets/hls-raw-mp3/media_w905519204_1.mp3 +0 -0
- package/test/test/assets/hls-raw-mp3/media_w905519204_2.mp3 +0 -0
- package/test/test/assets/hls-raw-mp3/media_w905519204_3.mp3 +0 -0
- package/test/test/assets/hls-raw-mp3/playlist.m3u8 +4 -0
- package/test/test/assets/hls-ts-aac/playlist.m3u8 +23 -0
- package/test/test/assets/hls-ts-aac/segment_0.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_1.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_2.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_3.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_4.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_5.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_6.ts +0 -0
- package/test/test/assets/hls-ts-aac/segment_7.ts +0 -0
- package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0000.ts +0 -0
- package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0001.ts +0 -0
- package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0002.ts +0 -0
- package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0003.ts +0 -0
- package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0004.ts +0 -0
- package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0005.ts +0 -0
- package/test/test/assets/hls-ts-ac3/prog_index.m3u8 +19 -0
- package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0000.ts +0 -0
- package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0001.ts +0 -0
- package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0002.ts +0 -0
- package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0003.ts +0 -0
- package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0004.ts +0 -0
- package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0005.ts +0 -0
- package/test/test/assets/hls-ts-ec3/prog_index.m3u8 +19 -0
- package/test/test/assets/hls-ts-h264/fileSequence0.ts +0 -0
- package/test/test/assets/hls-ts-h264/fileSequence1.ts +0 -0
- package/test/test/assets/hls-ts-h264/fileSequence2.ts +0 -0
- package/test/test/assets/hls-ts-h264/fileSequence3.ts +0 -0
- package/test/test/assets/hls-ts-h264/fileSequence4.ts +0 -0
- package/test/test/assets/hls-ts-h264/fileSequence5.ts +0 -0
- package/test/test/assets/hls-ts-h264/prog_index.m3u8 +25 -0
- package/test/test/assets/hls-ts-mp3/manifest.m3u8 +13 -0
- package/test/test/assets/hls-ts-mp3/media_w239891843_0.ts +0 -0
- package/test/test/assets/hls-ts-mp3/media_w239891843_1.ts +0 -0
- package/test/test/assets/hls-ts-mp3/media_w239891843_2.ts +0 -0
- package/test/test/assets/hls-ts-mp3/media_w239891843_3.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/chunk.m3u8 +17 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/n_0_0_0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/n_1_0_0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/n_2_0_0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/n_3_0_0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/n_4_0_0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/n_5_0_0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h264/playlist.m3u8 +4 -0
- package/test/test/boot.js +7 -2
- package/test/test/util/fake_ad.js +99 -0
- package/test/test/util/fake_ad_manager.js +7 -1
- package/test/test/util/fake_networking_engine.js +41 -14
- package/test/test/util/fake_segment_prefetch.js +81 -0
- package/test/test/util/manifest_generator.js +19 -5
- package/test/test/util/mss_parser_util.js +115 -0
- package/test/test/util/offline_utils.js +1 -0
- package/test/test/util/simple_fakes.js +12 -3
- package/test/test/util/streaming_engine_util.js +14 -4
- package/test/test/util/ttml_utils.js +2 -2
- package/test/text/cue_integration.js +1 -1
- package/test/text/srt_text_parser_unit.js +78 -0
- package/test/text/text_engine_unit.js +17 -8
- package/test/text/ui_text_displayer_unit.js +4 -4
- package/test/text/vtt_text_parser_unit.js +59 -40
- package/test/text/web_vtt_generator_unit.js +9 -3
- package/test/{media/transmuxer_integration.js → transmuxer/muxjs_transmuxer_integration.js} +30 -33
- package/test/transmuxer/transmuxer_engine_integration.js +60 -0
- package/test/transmuxer/transmuxer_integration.js +296 -0
- package/test/util/cmcd_manager_unit.js +162 -13
- package/test/util/language_utils_unit.js +9 -2
- package/test/util/mp4_box_parsers_unit.js +39 -4
- package/test/util/periods_unit.js +34 -26
- package/test/util/stream_utils_unit.js +60 -107
- package/ui/controls.js +19 -1
- package/ui/controls.less +1 -0
- package/ui/externs/ui.js +11 -1
- package/ui/language_utils.js +15 -0
- package/ui/less/thumbnails.less +26 -0
- package/ui/locales/oc.json +42 -0
- package/ui/pip_button.js +83 -2
- package/ui/range_element.js +15 -0
- package/ui/resolution_selection.js +9 -2
- package/ui/seek_bar.js +223 -0
- package/ui/ui.js +5 -0
- package/lib/cea/i_caption_decoder.js +0 -51
- package/lib/cea/i_cea_parser.js +0 -68
|
@@ -8,7 +8,6 @@ describe('VttTextParser', () => {
|
|
|
8
8
|
const Cue = shaka.text.Cue;
|
|
9
9
|
const CueRegion = shaka.text.CueRegion;
|
|
10
10
|
const originalLogWarning = shaka.log.warning;
|
|
11
|
-
const anyString = jasmine.any(String);
|
|
12
11
|
|
|
13
12
|
/** @type {!jasmine.Spy} */
|
|
14
13
|
let logWarningSpy;
|
|
@@ -161,38 +160,30 @@ describe('VttTextParser', () => {
|
|
|
161
160
|
});
|
|
162
161
|
|
|
163
162
|
it('rejects invalid time values', () => {
|
|
164
|
-
|
|
163
|
+
verifyHelper([],
|
|
165
164
|
'WEBVTT\n\n00.020 --> 0:00.040\nTest',
|
|
166
|
-
{periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0}
|
|
167
|
-
|
|
168
|
-
errorHelper(shaka.util.Error.Code.INVALID_TEXT_CUE,
|
|
165
|
+
{periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
|
|
166
|
+
verifyHelper([],
|
|
169
167
|
'WEBVTT\n\n0:00.020 --> 0:00.040\nTest',
|
|
170
|
-
{periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0}
|
|
171
|
-
|
|
172
|
-
errorHelper(shaka.util.Error.Code.INVALID_TEXT_CUE,
|
|
168
|
+
{periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
|
|
169
|
+
verifyHelper([],
|
|
173
170
|
'WEBVTT\n\n00:00.20 --> 0:00.040\nTest',
|
|
174
|
-
{periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0}
|
|
175
|
-
|
|
176
|
-
errorHelper(shaka.util.Error.Code.INVALID_TEXT_CUE,
|
|
171
|
+
{periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
|
|
172
|
+
verifyHelper([],
|
|
177
173
|
'WEBVTT\n\n00:100.20 --> 0:00.040\nTest',
|
|
178
|
-
{periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0}
|
|
179
|
-
|
|
180
|
-
errorHelper(shaka.util.Error.Code.INVALID_TEXT_CUE,
|
|
174
|
+
{periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
|
|
175
|
+
verifyHelper([],
|
|
181
176
|
'WEBVTT\n\n00:00.020 --> 0:00.040\nTest',
|
|
182
|
-
{periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0}
|
|
183
|
-
|
|
184
|
-
errorHelper(shaka.util.Error.Code.INVALID_TEXT_CUE,
|
|
177
|
+
{periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
|
|
178
|
+
verifyHelper([],
|
|
185
179
|
'WEBVTT\n\n00:00:00:00.020 --> 0:00.040\nTest',
|
|
186
|
-
{periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0}
|
|
187
|
-
|
|
188
|
-
errorHelper(shaka.util.Error.Code.INVALID_TEXT_CUE,
|
|
180
|
+
{periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
|
|
181
|
+
verifyHelper([],
|
|
189
182
|
'WEBVTT\n\n00:61.020 --> 0:00.040\nTest',
|
|
190
|
-
{periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0}
|
|
191
|
-
|
|
192
|
-
errorHelper(shaka.util.Error.Code.INVALID_TEXT_CUE,
|
|
183
|
+
{periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
|
|
184
|
+
verifyHelper([],
|
|
193
185
|
'WEBVTT\n\n61:00.020 --> 0:00.040\nTest',
|
|
194
|
-
{periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0}
|
|
195
|
-
anyString);
|
|
186
|
+
{periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
|
|
196
187
|
});
|
|
197
188
|
|
|
198
189
|
it('supports vertical setting', () => {
|
|
@@ -934,7 +925,7 @@ describe('VttTextParser', () => {
|
|
|
934
925
|
startTime: 20,
|
|
935
926
|
endTime: 40,
|
|
936
927
|
payload: 'Test',
|
|
937
|
-
color: '
|
|
928
|
+
color: 'yellow',
|
|
938
929
|
},
|
|
939
930
|
],
|
|
940
931
|
},
|
|
@@ -946,8 +937,8 @@ describe('VttTextParser', () => {
|
|
|
946
937
|
startTime: 40,
|
|
947
938
|
endTime: 50,
|
|
948
939
|
payload: 'Test2',
|
|
949
|
-
color: '
|
|
950
|
-
backgroundColor: '
|
|
940
|
+
color: 'cyan',
|
|
941
|
+
backgroundColor: 'blue',
|
|
951
942
|
},
|
|
952
943
|
],
|
|
953
944
|
},
|
|
@@ -959,8 +950,8 @@ describe('VttTextParser', () => {
|
|
|
959
950
|
startTime: 50,
|
|
960
951
|
endTime: 60,
|
|
961
952
|
payload: 'Test 3',
|
|
962
|
-
color: '
|
|
963
|
-
backgroundColor: '
|
|
953
|
+
color: 'magenta',
|
|
954
|
+
backgroundColor: 'black',
|
|
964
955
|
},
|
|
965
956
|
],
|
|
966
957
|
},
|
|
@@ -978,7 +969,7 @@ describe('VttTextParser', () => {
|
|
|
978
969
|
startTime: 60,
|
|
979
970
|
endTime: 70,
|
|
980
971
|
payload: 'Test4.1',
|
|
981
|
-
color: '
|
|
972
|
+
color: 'yellow',
|
|
982
973
|
},
|
|
983
974
|
{
|
|
984
975
|
startTime: 60,
|
|
@@ -995,7 +986,7 @@ describe('VttTextParser', () => {
|
|
|
995
986
|
startTime: 60,
|
|
996
987
|
endTime: 70,
|
|
997
988
|
payload: 'Test4.2',
|
|
998
|
-
color: '
|
|
989
|
+
color: 'blue',
|
|
999
990
|
},
|
|
1000
991
|
],
|
|
1001
992
|
},
|
|
@@ -1008,13 +999,13 @@ describe('VttTextParser', () => {
|
|
|
1008
999
|
startTime: 70,
|
|
1009
1000
|
endTime: 80,
|
|
1010
1001
|
payload: 'Test5.1',
|
|
1011
|
-
color: '
|
|
1002
|
+
color: 'red',
|
|
1012
1003
|
},
|
|
1013
1004
|
{
|
|
1014
1005
|
startTime: 70,
|
|
1015
1006
|
endTime: 80,
|
|
1016
1007
|
payload: 'Test5.2',
|
|
1017
|
-
color: '
|
|
1008
|
+
color: 'lime',
|
|
1018
1009
|
},
|
|
1019
1010
|
],
|
|
1020
1011
|
},
|
|
@@ -1039,7 +1030,7 @@ describe('VttTextParser', () => {
|
|
|
1039
1030
|
startTime: 100,
|
|
1040
1031
|
endTime: 110,
|
|
1041
1032
|
payload: 'forward slash 1/2 in text',
|
|
1042
|
-
color: '
|
|
1033
|
+
color: 'lime',
|
|
1043
1034
|
},
|
|
1044
1035
|
],
|
|
1045
1036
|
},
|
|
@@ -1156,8 +1147,8 @@ describe('VttTextParser', () => {
|
|
|
1156
1147
|
startTime: 10,
|
|
1157
1148
|
endTime: 20,
|
|
1158
1149
|
payload: 'Example 1',
|
|
1159
|
-
color: '
|
|
1160
|
-
backgroundColor: '
|
|
1150
|
+
color: 'red',
|
|
1151
|
+
backgroundColor: 'yellow',
|
|
1161
1152
|
fontSize: '10px',
|
|
1162
1153
|
},
|
|
1163
1154
|
],
|
|
@@ -1165,7 +1156,7 @@ describe('VttTextParser', () => {
|
|
|
1165
1156
|
],
|
|
1166
1157
|
'WEBVTT\n\n' +
|
|
1167
1158
|
'STYLE\n' +
|
|
1168
|
-
'::cue(.bg_blue) { font-size: 10px; background-color:
|
|
1159
|
+
'::cue(.bg_blue) { font-size: 10px; background-color: yellow }\n\n' +
|
|
1169
1160
|
'00:00:10.000 --> 00:00:20.000\n' +
|
|
1170
1161
|
'<c.red.bg_blue>Example 1</c>\n\n',
|
|
1171
1162
|
{periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
|
|
@@ -1183,7 +1174,7 @@ describe('VttTextParser', () => {
|
|
|
1183
1174
|
startTime: 10,
|
|
1184
1175
|
endTime: 20,
|
|
1185
1176
|
payload: '1',
|
|
1186
|
-
color: '
|
|
1177
|
+
color: 'magenta',
|
|
1187
1178
|
},
|
|
1188
1179
|
{
|
|
1189
1180
|
startTime: 10,
|
|
@@ -1195,7 +1186,7 @@ describe('VttTextParser', () => {
|
|
|
1195
1186
|
startTime: 10,
|
|
1196
1187
|
endTime: 20,
|
|
1197
1188
|
payload: '2',
|
|
1198
|
-
color: '
|
|
1189
|
+
color: 'magenta',
|
|
1199
1190
|
fontStyle: Cue.fontStyle.ITALIC,
|
|
1200
1191
|
},
|
|
1201
1192
|
],
|
|
@@ -1223,6 +1214,34 @@ describe('VttTextParser', () => {
|
|
|
1223
1214
|
{periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
|
|
1224
1215
|
});
|
|
1225
1216
|
|
|
1217
|
+
it('supports an extra newline inside the cue body', () => {
|
|
1218
|
+
verifyHelper(
|
|
1219
|
+
[
|
|
1220
|
+
{startTime: 20, endTime: 40, payload: 'Test'},
|
|
1221
|
+
{startTime: 40, endTime: 50, payload: 'Test2'},
|
|
1222
|
+
],
|
|
1223
|
+
'WEBVTT\n\n' +
|
|
1224
|
+
'00:00:20.000 --> 00:00:40.000\n' +
|
|
1225
|
+
'Test\n\nExtra line\n\n' +
|
|
1226
|
+
'00:00:40.000 --> 00:00:50.000\n' +
|
|
1227
|
+
'Test2',
|
|
1228
|
+
{periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
|
|
1229
|
+
});
|
|
1230
|
+
|
|
1231
|
+
it('supports an extra newline before the cue body', () => {
|
|
1232
|
+
verifyHelper(
|
|
1233
|
+
[
|
|
1234
|
+
{startTime: 20, endTime: 40, payload: ''},
|
|
1235
|
+
{startTime: 40, endTime: 50, payload: 'Test2'},
|
|
1236
|
+
],
|
|
1237
|
+
'WEBVTT\n\n' +
|
|
1238
|
+
'00:00:20.000 --> 00:00:40.000\n' +
|
|
1239
|
+
'\nTest\n\n' +
|
|
1240
|
+
'00:00:40.000 --> 00:00:50.000\n' +
|
|
1241
|
+
'Test2',
|
|
1242
|
+
{periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
|
|
1243
|
+
});
|
|
1244
|
+
|
|
1226
1245
|
/**
|
|
1227
1246
|
* @param {!Array} cues
|
|
1228
1247
|
* @param {string} text
|
|
@@ -13,11 +13,17 @@ describe('WebVttGenerator', () => {
|
|
|
13
13
|
const shakaCue1 = new shaka.text.Cue(20, 40, 'Test');
|
|
14
14
|
shakaCue1.textAlign = shaka.text.Cue.textAlign.LEFT;
|
|
15
15
|
shakaCue1.writingMode = shaka.text.Cue.writingMode.VERTICAL_LEFT_TO_RIGHT;
|
|
16
|
+
shakaCue1.color = 'red';
|
|
17
|
+
shakaCue1.backgroundColor = '#f0f';
|
|
16
18
|
const shakaCue2 = new shaka.text.Cue(40, 50, 'Test2');
|
|
17
19
|
shakaCue2.textAlign = shaka.text.Cue.textAlign.RIGHT;
|
|
18
20
|
shakaCue2.writingMode = shaka.text.Cue.writingMode.VERTICAL_RIGHT_TO_LEFT;
|
|
21
|
+
shakaCue2.color = '#0f0';
|
|
22
|
+
shakaCue2.backgroundColor = 'lime';
|
|
19
23
|
const shakaCue3 = new shaka.text.Cue(50, 51, 'Test3');
|
|
20
24
|
shakaCue3.textAlign = shaka.text.Cue.textAlign.CENTER;
|
|
25
|
+
shakaCue3.color = '#ffff00';
|
|
26
|
+
shakaCue3.backgroundColor = '#00ffff';
|
|
21
27
|
const shakaCue4 = new shaka.text.Cue(52, 53, 'Test4');
|
|
22
28
|
shakaCue4.textAlign = shaka.text.Cue.textAlign.START;
|
|
23
29
|
const shakaCue5 = new shaka.text.Cue(53, 54, 'Test5');
|
|
@@ -36,11 +42,11 @@ describe('WebVttGenerator', () => {
|
|
|
36
42
|
adCuePoints,
|
|
37
43
|
'WEBVTT\n\n' +
|
|
38
44
|
'00:00:20.000 --> 00:00:40.000 align:left vertical:lr\n' +
|
|
39
|
-
'Test
|
|
45
|
+
'<c.red.bg_magenta>Test</c>\n\n' +
|
|
40
46
|
'00:00:40.000 --> 00:00:50.000 align:right vertical:rl\n' +
|
|
41
|
-
'Test2
|
|
47
|
+
'<c.lime.bg_lime>Test2</c>\n\n' +
|
|
42
48
|
'00:00:50.000 --> 00:00:51.000 align:middle\n' +
|
|
43
|
-
'Test3
|
|
49
|
+
'<c.yellow.bg_cyan>Test3</c>\n\n' +
|
|
44
50
|
'00:00:52.000 --> 00:00:53.000 align:start\n' +
|
|
45
51
|
'Test4\n\n' +
|
|
46
52
|
'00:00:53.000 --> 00:00:54.000 align:end\n' +
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
describe('
|
|
7
|
+
describe('MuxjsTransmuxer', () => {
|
|
8
8
|
const ContentType = shaka.util.ManifestParserUtils.ContentType;
|
|
9
9
|
|
|
10
10
|
const videoSegmentUri = '/base/test/test/assets/video.ts';
|
|
@@ -12,9 +12,6 @@ describe('Transmuxer', () => {
|
|
|
12
12
|
const mp4MimeType = 'video/mp4; codecs="avc1.42E01E"';
|
|
13
13
|
const transportStreamVideoMimeType = 'video/mp2t; codecs="avc1.42E01E"';
|
|
14
14
|
const transportStreamAudioMimeType = 'video/mp2t; codecs="mp4a.40.2"';
|
|
15
|
-
const aacAudioMimeType = 'audio/aac';
|
|
16
|
-
|
|
17
|
-
const transmuxerMimeType = 'fake/mimeType';
|
|
18
15
|
|
|
19
16
|
/** @type {!ArrayBuffer} */
|
|
20
17
|
let videoSegment;
|
|
@@ -23,9 +20,12 @@ describe('Transmuxer', () => {
|
|
|
23
20
|
/** @type {!ArrayBuffer} */
|
|
24
21
|
let emptySegment;
|
|
25
22
|
|
|
26
|
-
/** @type {
|
|
23
|
+
/** @type {?shaka.transmuxer.MuxjsTransmuxer} */
|
|
27
24
|
let transmuxer;
|
|
28
25
|
|
|
26
|
+
function useTsTransmuxer() {
|
|
27
|
+
transmuxer = new shaka.transmuxer.MuxjsTransmuxer('video/mp2t');
|
|
28
|
+
}
|
|
29
29
|
|
|
30
30
|
beforeAll(async () => {
|
|
31
31
|
const responses = await Promise.all([
|
|
@@ -38,7 +38,7 @@ describe('Transmuxer', () => {
|
|
|
38
38
|
});
|
|
39
39
|
|
|
40
40
|
beforeEach(() => {
|
|
41
|
-
transmuxer =
|
|
41
|
+
transmuxer = null;
|
|
42
42
|
});
|
|
43
43
|
|
|
44
44
|
afterEach(async () => {
|
|
@@ -46,42 +46,41 @@ describe('Transmuxer', () => {
|
|
|
46
46
|
});
|
|
47
47
|
|
|
48
48
|
describe('isSupported', () => {
|
|
49
|
-
const Transmuxer = shaka.media.Transmuxer;
|
|
50
|
-
|
|
51
49
|
it('returns whether the content type is supported', () => {
|
|
52
|
-
|
|
50
|
+
useTsTransmuxer();
|
|
51
|
+
expect(transmuxer.isSupported(
|
|
53
52
|
mp4MimeType, ContentType.VIDEO)).toBe(false);
|
|
54
|
-
expect(
|
|
53
|
+
expect(transmuxer.isSupported(
|
|
55
54
|
transportStreamVideoMimeType, ContentType.VIDEO)).toBe(true);
|
|
56
55
|
});
|
|
57
56
|
|
|
58
57
|
// Issue #1991
|
|
59
58
|
it('handles upper-case MIME types', () => {
|
|
59
|
+
useTsTransmuxer();
|
|
60
60
|
const mimeType = transportStreamVideoMimeType.replace('mp2t', 'MP2T');
|
|
61
|
-
expect(
|
|
61
|
+
expect(transmuxer.isSupported(
|
|
62
|
+
mimeType, ContentType.VIDEO)).toBe(true);
|
|
62
63
|
});
|
|
63
64
|
});
|
|
64
65
|
|
|
65
66
|
describe('convertCodecs', () => {
|
|
66
67
|
const convertCodecs =
|
|
67
|
-
(type, codecs) =>
|
|
68
|
+
(type, codecs) => transmuxer.convertCodecs(type, codecs);
|
|
68
69
|
|
|
69
|
-
it('returns converted codecs', () => {
|
|
70
|
+
it('returns converted codecs for TS', () => {
|
|
71
|
+
useTsTransmuxer();
|
|
70
72
|
const convertedVideoCodecs =
|
|
71
73
|
convertCodecs(ContentType.VIDEO, transportStreamVideoMimeType);
|
|
72
74
|
const convertedAudioCodecs =
|
|
73
75
|
convertCodecs(ContentType.AUDIO, transportStreamAudioMimeType);
|
|
74
|
-
const convertedAacCodecs =
|
|
75
|
-
convertCodecs(ContentType.AUDIO, aacAudioMimeType);
|
|
76
76
|
const expectedVideoCodecs = 'video/mp4; codecs="avc1.42E01E"';
|
|
77
77
|
const expectedAudioCodecs = 'audio/mp4; codecs="mp4a.40.2"';
|
|
78
|
-
const expectedAacCodecs = 'audio/mp4; codecs="mp4a.40.2"';
|
|
79
78
|
expect(convertedVideoCodecs).toBe(expectedVideoCodecs);
|
|
80
79
|
expect(convertedAudioCodecs).toBe(expectedAudioCodecs);
|
|
81
|
-
expect(convertedAacCodecs).toBe(expectedAacCodecs);
|
|
82
80
|
});
|
|
83
81
|
|
|
84
82
|
it('converts legacy avc1 codec strings', () => {
|
|
83
|
+
useTsTransmuxer();
|
|
85
84
|
expect(
|
|
86
85
|
convertCodecs(
|
|
87
86
|
ContentType.VIDEO, 'video/mp2t; codecs="avc1.100.42"'))
|
|
@@ -96,62 +95,60 @@ describe('Transmuxer', () => {
|
|
|
96
95
|
|
|
97
96
|
// Issue #1991
|
|
98
97
|
it('handles upper-case MIME types', () => {
|
|
98
|
+
useTsTransmuxer();
|
|
99
99
|
expect(convertCodecs(
|
|
100
100
|
ContentType.VIDEO, 'video/MP2T; codecs="avc1.420001"'))
|
|
101
101
|
.toBe('video/mp4; codecs="avc1.420001"');
|
|
102
102
|
});
|
|
103
103
|
});
|
|
104
104
|
|
|
105
|
-
it('getOrginalMimeType returns the correct mimeType', () => {
|
|
106
|
-
expect(transmuxer.getOrginalMimeType()).toBe(transmuxerMimeType);
|
|
107
|
-
});
|
|
108
|
-
|
|
109
105
|
describe('transmuxing', () => {
|
|
110
106
|
it('transmux video from TS to MP4', async () => {
|
|
107
|
+
useTsTransmuxer();
|
|
111
108
|
let sawMDAT = false;
|
|
112
109
|
|
|
113
110
|
const transmuxedData = await transmuxer.transmux(videoSegment);
|
|
114
|
-
expect(transmuxedData
|
|
115
|
-
expect(transmuxedData.
|
|
116
|
-
expect(transmuxedData.captions).toEqual(jasmine.any(Array));
|
|
111
|
+
expect(transmuxedData).toEqual(jasmine.any(Uint8Array));
|
|
112
|
+
expect(transmuxedData.length).toBeGreaterThan(0);
|
|
117
113
|
new shaka.util.Mp4Parser()
|
|
118
114
|
.box('mdat', shaka.util.Mp4Parser.allData((data) => {
|
|
119
115
|
sawMDAT = true;
|
|
120
116
|
expect(data.byteLength).toBeGreaterThan(0);
|
|
121
117
|
}))
|
|
122
|
-
.parse(transmuxedData
|
|
118
|
+
.parse(transmuxedData);
|
|
123
119
|
expect(sawMDAT).toBeTruthy();
|
|
124
120
|
});
|
|
125
121
|
|
|
126
122
|
it('transmux audio from TS to MP4', async () => {
|
|
123
|
+
useTsTransmuxer();
|
|
127
124
|
let sawMDAT = false;
|
|
128
125
|
const transmuxedData = await transmuxer.transmux(audioSegment);
|
|
129
|
-
expect(transmuxedData
|
|
130
|
-
expect(transmuxedData.
|
|
131
|
-
expect(transmuxedData.captions).toEqual(jasmine.any(Array));
|
|
126
|
+
expect(transmuxedData).toEqual(jasmine.any(Uint8Array));
|
|
127
|
+
expect(transmuxedData.length).toBeGreaterThan(0);
|
|
132
128
|
new shaka.util.Mp4Parser()
|
|
133
129
|
.box('mdat', shaka.util.Mp4Parser.allData((data) => {
|
|
134
130
|
sawMDAT = true;
|
|
135
131
|
expect(data.byteLength).toBeGreaterThan(0);
|
|
136
132
|
}))
|
|
137
|
-
.parse(transmuxedData
|
|
133
|
+
.parse(transmuxedData);
|
|
138
134
|
expect(sawMDAT).toBeTruthy();
|
|
139
135
|
});
|
|
140
136
|
|
|
141
137
|
it('transmux empty video from TS to MP4', async () => {
|
|
138
|
+
useTsTransmuxer();
|
|
142
139
|
let sawMDAT = false;
|
|
143
140
|
const transmuxedData = await transmuxer.transmux(emptySegment);
|
|
144
|
-
expect(transmuxedData
|
|
145
|
-
expect(transmuxedData.captions).toEqual([]);
|
|
141
|
+
expect(transmuxedData).toEqual(jasmine.any(Uint8Array));
|
|
146
142
|
new shaka.util.Mp4Parser()
|
|
147
143
|
.box('mdat', shaka.util.Mp4Parser.allData((data) => {
|
|
148
144
|
sawMDAT = true;
|
|
149
145
|
}))
|
|
150
|
-
.parse(transmuxedData
|
|
146
|
+
.parse(transmuxedData);
|
|
151
147
|
expect(sawMDAT).toBeFalsy();
|
|
152
148
|
});
|
|
153
149
|
|
|
154
150
|
it('passes through true timestamps', async () => {
|
|
151
|
+
useTsTransmuxer();
|
|
155
152
|
let parsed = false;
|
|
156
153
|
const expectedMp4Timestamp = 5166000; // in timescale units
|
|
157
154
|
let mp4Timestamp;
|
|
@@ -171,7 +168,7 @@ describe('Transmuxer', () => {
|
|
|
171
168
|
mp4Timestamp = parsedTFDTBox.baseMediaDecodeTime;
|
|
172
169
|
parsed = true;
|
|
173
170
|
})
|
|
174
|
-
.parse(transmuxedData
|
|
171
|
+
.parse(transmuxedData);
|
|
175
172
|
|
|
176
173
|
expect(parsed).toBe(true);
|
|
177
174
|
expect(mp4Timestamp).toBe(expectedMp4Timestamp);
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/*! @license
|
|
2
|
+
* Shaka Player
|
|
3
|
+
* Copyright 2016 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
describe('TransmuxerEngine', () => {
|
|
8
|
+
const ContentType = shaka.util.ManifestParserUtils.ContentType;
|
|
9
|
+
|
|
10
|
+
const mp4MimeType = 'video/mp4; codecs="avc1.42E01E"';
|
|
11
|
+
const transportStreamVideoMimeType = 'video/mp2t; codecs="avc1.42E01E"';
|
|
12
|
+
const transportStreamAudioMimeType = 'video/mp2t; codecs="mp4a.40.2"';
|
|
13
|
+
const aacAudioMimeType = 'audio/aac';
|
|
14
|
+
|
|
15
|
+
describe('isSupported', () => {
|
|
16
|
+
const TransmuxerEngine = shaka.transmuxer.TransmuxerEngine;
|
|
17
|
+
|
|
18
|
+
it('returns whether the content type is supported', () => {
|
|
19
|
+
expect(TransmuxerEngine.isSupported(
|
|
20
|
+
mp4MimeType, ContentType.VIDEO)).toBe(false);
|
|
21
|
+
expect(TransmuxerEngine.isSupported(
|
|
22
|
+
transportStreamVideoMimeType, ContentType.VIDEO)).toBe(true);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
// Issue #1991
|
|
26
|
+
it('handles upper-case MIME types', () => {
|
|
27
|
+
const mimeType = transportStreamVideoMimeType.replace('mp2t', 'MP2T');
|
|
28
|
+
expect(TransmuxerEngine.isSupported(
|
|
29
|
+
mimeType, ContentType.VIDEO)).toBe(true);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
describe('convertCodecs', () => {
|
|
34
|
+
const TransmuxerEngine = shaka.transmuxer.TransmuxerEngine;
|
|
35
|
+
const convertCodecs =
|
|
36
|
+
(type, codecs) => TransmuxerEngine.convertCodecs(type, codecs);
|
|
37
|
+
|
|
38
|
+
it('returns converted codecs', () => {
|
|
39
|
+
const convertedVideoCodecs =
|
|
40
|
+
convertCodecs(ContentType.VIDEO, transportStreamVideoMimeType);
|
|
41
|
+
const convertedAudioCodecs =
|
|
42
|
+
convertCodecs(ContentType.AUDIO, transportStreamAudioMimeType);
|
|
43
|
+
const convertedAacCodecs =
|
|
44
|
+
convertCodecs(ContentType.AUDIO, aacAudioMimeType);
|
|
45
|
+
const expectedVideoCodecs = 'video/mp4; codecs="avc1.42E01E"';
|
|
46
|
+
const expectedAudioCodecs = 'audio/mp4; codecs="mp4a.40.2"';
|
|
47
|
+
const expectedAacCodecs = 'audio/mp4; codecs="mp4a.40.2"';
|
|
48
|
+
expect(convertedVideoCodecs).toBe(expectedVideoCodecs);
|
|
49
|
+
expect(convertedAudioCodecs).toBe(expectedAudioCodecs);
|
|
50
|
+
expect(convertedAacCodecs).toBe(expectedAacCodecs);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// Issue #1991
|
|
54
|
+
it('handles upper-case MIME types', () => {
|
|
55
|
+
expect(convertCodecs(
|
|
56
|
+
ContentType.VIDEO, 'video/MP2T; codecs="avc1.420001"'))
|
|
57
|
+
.toBe('video/mp4; codecs="avc1.420001"');
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
});
|