shaka-player 4.4.3 → 4.5.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.
- package/.github/workflows/release-please.yaml +2 -27
- package/CHANGELOG.md +64 -45
- package/README.md +16 -10
- package/demo/asset_card.js +18 -21
- package/demo/cast_receiver/index.html +0 -1
- package/demo/close_button.js +0 -3
- package/demo/common/asset.js +22 -5
- package/demo/common/assets.js +132 -49
- package/demo/config.js +192 -253
- package/demo/custom.js +39 -98
- package/demo/front.js +7 -10
- package/demo/index.html +19 -22
- package/demo/input.js +6 -11
- package/demo/input_container.js +8 -9
- package/demo/main.js +51 -123
- package/demo/search.js +22 -34
- package/demo/service_worker.js +0 -3
- package/demo/tooltip.js +3 -5
- package/demo/visualizer.js +3 -5
- package/demo/visualizer_button.js +1 -20
- package/dist/demo.compiled.debug.js +152 -178
- package/dist/demo.compiled.debug.map +4 -4
- package/dist/demo.compiled.js +152 -178
- package/dist/demo.compiled.map +4 -4
- package/dist/deps.js +27 -24
- package/dist/locales.js +31 -31
- package/dist/receiver.compiled.debug.js +22 -43
- package/dist/receiver.compiled.debug.map +4 -4
- package/dist/receiver.compiled.js +22 -43
- package/dist/receiver.compiled.map +4 -4
- package/dist/shaka-player.compiled.d.ts +507 -365
- package/dist/shaka-player.compiled.debug.d.ts +507 -365
- package/dist/shaka-player.compiled.debug.externs.js +205 -51
- package/dist/shaka-player.compiled.debug.js +541 -450
- package/dist/shaka-player.compiled.debug.map +4 -4
- package/dist/shaka-player.compiled.externs.js +205 -51
- package/dist/shaka-player.compiled.js +1120 -1066
- package/dist/shaka-player.compiled.map +4 -4
- package/dist/shaka-player.ui.d.ts +562 -410
- package/dist/shaka-player.ui.debug.d.ts +562 -410
- package/dist/shaka-player.ui.debug.externs.js +226 -51
- package/dist/shaka-player.ui.debug.js +606 -506
- package/dist/shaka-player.ui.debug.map +4 -4
- package/dist/shaka-player.ui.externs.js +226 -51
- package/dist/shaka-player.ui.js +1266 -1207
- package/dist/shaka-player.ui.map +4 -4
- package/docs/design/lcevc-integration.md +14 -14
- package/docs/tutorials/faq.md +27 -55
- package/docs/tutorials/index.json +2 -1
- package/docs/tutorials/lcevc.md +118 -0
- package/docs/tutorials/ui-customization.md +4 -0
- package/externs/css_style_declaration.js +19 -0
- package/externs/lcevc.js +37 -13
- package/externs/media_remote.js +68 -0
- package/externs/mediatailor.js +193 -0
- package/externs/pictureinpicture.js +11 -0
- package/externs/shaka/ads.js +27 -0
- package/externs/shaka/manifest.js +10 -5
- package/externs/shaka/manifest_parser.js +7 -1
- package/externs/shaka/offline.js +4 -0
- package/externs/shaka/player.js +12 -1
- package/karma.conf.js +7 -3
- package/lib/abr/simple_abr_manager.js +43 -3
- package/lib/ads/ad_manager.js +104 -50
- package/lib/ads/media_tailor_ad.js +297 -0
- package/lib/ads/media_tailor_ad_manager.js +828 -0
- package/lib/cea/ts_cea_parser.js +15 -2
- package/lib/config/codec_switching_strategy.js +24 -0
- package/lib/dash/content_protection.js +120 -2
- package/lib/dash/dash_parser.js +75 -12
- package/lib/dash/mpd_utils.js +10 -6
- package/lib/dash/segment_base.js +13 -5
- package/lib/dash/segment_list.js +13 -5
- package/lib/dash/segment_template.js +43 -85
- package/lib/dependencies/all.js +8 -7
- package/lib/hls/hls_parser.js +44 -16
- package/lib/lcevc/lcevc_dec.js +220 -0
- package/lib/media/adaptation_set.js +22 -11
- package/lib/media/adaptation_set_criteria.js +25 -7
- package/lib/media/media_source_engine.js +215 -27
- package/lib/media/segment_index.js +1 -1
- package/lib/media/segment_reference.js +7 -7
- package/lib/media/streaming_engine.js +33 -18
- package/lib/mss/mss_parser.js +1 -0
- package/lib/net/networking_engine.js +1 -0
- 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 +1 -0
- package/lib/offline/storage.js +3 -0
- package/lib/player.js +142 -72
- package/lib/routing/payload.js +5 -1
- package/lib/text/cue.js +15 -0
- package/lib/text/ttml_text_parser.js +17 -0
- package/lib/text/ui_text_displayer.js +4 -0
- package/lib/text/vtt_text_parser.js +33 -20
- package/lib/transmuxer/h265.js +862 -0
- package/lib/transmuxer/mpeg_ts_transmuxer.js +3 -2
- package/lib/transmuxer/ts_transmuxer.js +160 -15
- package/lib/util/error.js +28 -9
- package/lib/util/exp_golomb.js +30 -2
- package/lib/util/fake_event.js +3 -0
- package/lib/util/mp4_generator.js +4 -4
- package/lib/util/periods.js +2 -0
- package/lib/util/platform.js +40 -0
- package/lib/util/player_configuration.js +8 -0
- package/lib/util/state_history.js +6 -2
- package/lib/util/stream_utils.js +133 -217
- package/lib/util/ts_parser.js +226 -40
- package/maintained-branches.md +3 -2
- package/package.json +4 -6
- package/roadmap.md +15 -5
- package/shaka-player.uncompiled.js +2 -1
- package/support.html +0 -1
- package/test/cast/cast_receiver_integration.js +47 -0
- package/test/codec_switching/codec_switching_integration.js +181 -0
- package/test/dash/dash_parser_content_protection_unit.js +2 -0
- package/test/dash/dash_parser_integration.js +73 -0
- package/test/dash/dash_parser_live_unit.js +2 -0
- package/test/dash/dash_parser_manifest_unit.js +42 -0
- package/test/dash/dash_parser_segment_base_unit.js +2 -0
- package/test/dash/dash_parser_segment_list_unit.js +2 -0
- package/test/dash/dash_parser_segment_template_unit.js +2 -0
- package/test/demo/demo_unit.js +0 -16
- package/test/hls/hls_live_unit.js +2 -0
- package/test/hls/hls_parser_unit.js +8 -6
- package/test/media/adaptation_set_criteria_unit.js +118 -0
- package/test/media/adaptation_set_unit.js +1 -0
- package/test/media/media_source_engine_unit.js +165 -1
- package/test/media/segment_index_unit.js +4 -4
- package/test/media/segment_prefetch_unit.js +1 -1
- package/test/media/streaming_engine_unit.js +17 -17
- package/test/mss/mss_parser_unit.js +2 -0
- package/test/offline/manifest_convert_unit.js +5 -0
- package/test/offline/storage_integration.js +1 -4
- package/test/player_unit.js +102 -131
- package/test/routing/walker_unit.js +1 -0
- package/test/test/assets/dash-aes-128/Fragments(video=0,format=mpd-time-csf) +0 -0
- package/test/test/assets/dash-aes-128/Fragments(video=20000000,format=mpd-time-csf) +0 -0
- package/test/test/assets/dash-aes-128/Fragments(video=40000000,format=mpd-time-csf) +0 -0
- package/test/test/assets/dash-aes-128/Fragments(video=60000000,format=mpd-time-csf) +0 -0
- package/test/test/assets/dash-aes-128/Fragments(video=i,format=mpd-time-csf) +0 -0
- package/test/test/assets/dash-aes-128/dash.mpd +18 -0
- package/test/test/assets/dash-aes-128/license +1 -0
- package/test/test/assets/dash-multi-codec/audio_en_2c_128k_aac.mp4 +0 -0
- package/test/test/assets/dash-multi-codec/audio_es_2c_64k_opus.webm +0 -0
- package/test/test/assets/dash-multi-codec/dash.mpd +32 -0
- package/test/test/assets/dash-multi-codec/video_144p_108k_h264.mp4 +0 -0
- package/test/test/assets/hls-ts-h265/0.ts +0 -0
- package/test/test/assets/hls-ts-h265/hevc.m3u8 +6 -0
- package/test/test/assets/hls-ts-h265/index.m3u8 +7 -0
- package/test/test/assets/hls-ts-muxed-aac-h265/0.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h265/1.ts +0 -0
- package/test/test/assets/hls-ts-muxed-aac-h265/media.m3u8 +9 -0
- package/test/test/assets/hls-ts-muxed-ac3-h264/media.m3u8 +24 -0
- package/test/test/assets/hls-ts-muxed-ac3-h264/s_00000.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ac3-h264/s_00001.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ac3-h264/s_00002.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ac3-h264/s_00003.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ac3-h264/s_00004.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ac3-h264/s_00005.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0000.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0001.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0002.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0003.ts +0 -0
- package/test/test/assets/hls-ts-muxed-ec3-h264/prog_index.m3u8 +14 -0
- package/test/test/assets/hls-ts-muxed-mp3-h264/index.m3u8 +23 -0
- package/test/test/assets/hls-ts-muxed-mp3-h264/seg-1-v1-a1.ts +0 -0
- package/test/test/assets/hls-ts-muxed-mp3-h264/seg-2-v1-a1.ts +0 -0
- package/test/test/assets/hls-ts-muxed-mp3-h264/seg-3-v1-a1.ts +0 -0
- package/test/test/assets/hls-ts-muxed-mp3-h264/seg-4-v1-a1.ts +0 -0
- package/test/test/assets/hls-ts-muxed-mp3-h264/seg-5-v1-a1.ts +0 -0
- package/test/test/assets/hls-ts-muxed-mp3-h264/seg-6-v1-a1.ts +0 -0
- package/test/test/assets/hls-ts-muxed-mp3-h264/seg-7-v1-a1.ts +0 -0
- package/test/test/assets/hls-ts-muxed-mp3-h264/seg-8-v1-a1.ts +0 -0
- package/test/test/util/dash_parser_util.js +4 -0
- package/test/test/util/fake_ad_manager.js +20 -0
- package/test/test/util/fake_media_source_engine.js +8 -2
- package/test/test/util/manifest_generator.js +7 -3
- package/test/test/util/mss_parser_util.js +4 -0
- package/test/test/util/offline_utils.js +1 -0
- package/test/test/util/streaming_engine_util.js +7 -4
- package/test/text/ttml_text_parser_unit.js +52 -0
- package/test/text/vtt_text_parser_unit.js +103 -31
- package/test/transmuxer/transmuxer_integration.js +117 -0
- package/test/ui/ui_unit.js +3 -10
- package/test/util/stream_utils_unit.js +208 -74
- package/ui/controls.js +125 -0
- package/ui/externs/ui.js +8 -1
- package/ui/pip_button.js +22 -120
- package/ui/remote_button.js +201 -0
- package/ui/ui.js +5 -2
- package/demo/common/message_ids.js +0 -309
- package/demo/locales/en.json +0 -288
- package/demo/locales/source.json +0 -1146
- package/externs/mux.js +0 -69
- package/lib/lcevc/lcevc_dil.js +0 -152
- package/lib/transmuxer/muxjs_transmuxer.js +0 -242
- package/test/transmuxer/muxjs_transmuxer_integration.js +0 -177
|
@@ -32,7 +32,7 @@ shaka.media.InitSegmentReference = class {
|
|
|
32
32
|
* the quality of the media associated with this init segment.
|
|
33
33
|
* @param {(null|number)=} timescale
|
|
34
34
|
* @param {(null|BufferSource)=} segmentData
|
|
35
|
-
* @param {?shaka.extern.
|
|
35
|
+
* @param {?shaka.extern.aes128Key=} aes128Key
|
|
36
36
|
* The segment's AES-128-CBC full segment encryption key and iv.
|
|
37
37
|
*/
|
|
38
38
|
constructor(uris, startByte, endByte, mediaQuality = null, timescale = null,
|
|
@@ -55,8 +55,8 @@ shaka.media.InitSegmentReference = class {
|
|
|
55
55
|
/** @type {BufferSource|null} */
|
|
56
56
|
this.segmentData = segmentData;
|
|
57
57
|
|
|
58
|
-
/** @type {?shaka.extern.
|
|
59
|
-
this.
|
|
58
|
+
/** @type {?shaka.extern.aes128Key} */
|
|
59
|
+
this.aes128Key = aes128Key;
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
/**
|
|
@@ -196,7 +196,7 @@ shaka.media.SegmentReference = class {
|
|
|
196
196
|
* @param {shaka.media.SegmentReference.Status=} status
|
|
197
197
|
* The segment status is used to indicate that a segment does not exist or is
|
|
198
198
|
* not available.
|
|
199
|
-
* @param {?shaka.extern.
|
|
199
|
+
* @param {?shaka.extern.aes128Key=} aes128Key
|
|
200
200
|
* The segment's AES-128-CBC full segment encryption key and iv.
|
|
201
201
|
*/
|
|
202
202
|
constructor(
|
|
@@ -204,7 +204,7 @@ shaka.media.SegmentReference = class {
|
|
|
204
204
|
timestampOffset, appendWindowStart, appendWindowEnd,
|
|
205
205
|
partialReferences = [], tilesLayout = '', tileDuration = null,
|
|
206
206
|
syncTime = null, status = shaka.media.SegmentReference.Status.AVAILABLE,
|
|
207
|
-
|
|
207
|
+
aes128Key = null) {
|
|
208
208
|
// A preload hinted Partial Segment has the same startTime and endTime.
|
|
209
209
|
goog.asserts.assert(startTime <= endTime,
|
|
210
210
|
'startTime must be less than or equal to endTime');
|
|
@@ -276,8 +276,8 @@ shaka.media.SegmentReference = class {
|
|
|
276
276
|
/** @type {boolean} */
|
|
277
277
|
this.byterangeOptimization = false;
|
|
278
278
|
|
|
279
|
-
/** @type {?shaka.extern.
|
|
280
|
-
this.
|
|
279
|
+
/** @type {?shaka.extern.aes128Key} */
|
|
280
|
+
this.aes128Key = aes128Key;
|
|
281
281
|
|
|
282
282
|
/** @type {?shaka.media.SegmentReference.ThumbnailSprite} */
|
|
283
283
|
this.thumbnailSprite = null;
|
|
@@ -1498,7 +1498,7 @@ shaka.media.StreamingEngine = class {
|
|
|
1498
1498
|
|
|
1499
1499
|
/**
|
|
1500
1500
|
* @param {!BufferSource} rawResult
|
|
1501
|
-
* @param {shaka.extern.
|
|
1501
|
+
* @param {shaka.extern.aes128Key} aes128Key
|
|
1502
1502
|
* @param {!shaka.media.SegmentIterator} iter
|
|
1503
1503
|
* @return {!Promise.<!BufferSource>} finalResult
|
|
1504
1504
|
* @private
|
|
@@ -1684,22 +1684,21 @@ shaka.media.StreamingEngine = class {
|
|
|
1684
1684
|
shaka.log.v1(logPrefix,
|
|
1685
1685
|
'setting append window end to ' + appendWindowEnd);
|
|
1686
1686
|
|
|
1687
|
-
|
|
1688
|
-
|
|
1687
|
+
const isResetMediaSourceNecessary =
|
|
1688
|
+
mediaState.lastCodecs && mediaState.lastMimeType &&
|
|
1689
|
+
this.playerInterface_.mediaSourceEngine.isResetMediaSourceNecessary(
|
|
1690
|
+
mediaState.type, mediaState.stream);
|
|
1691
|
+
if (isResetMediaSourceNecessary) {
|
|
1692
|
+
let otherState = null;
|
|
1689
1693
|
if (mediaState.type === ContentType.VIDEO) {
|
|
1690
|
-
|
|
1691
|
-
const audioState = this.mediaStates_.get(ContentType.AUDIO);
|
|
1692
|
-
if (audioState) {
|
|
1693
|
-
audioState.lastInitSegmentReference = null;
|
|
1694
|
-
this.abortOperations_(audioState);
|
|
1695
|
-
}
|
|
1694
|
+
otherState = this.mediaStates_.get(ContentType.AUDIO);
|
|
1696
1695
|
} else if (mediaState.type === ContentType.AUDIO) {
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
}
|
|
1696
|
+
otherState = this.mediaStates_.get(ContentType.VIDEO);
|
|
1697
|
+
}
|
|
1698
|
+
if (otherState) {
|
|
1699
|
+
otherState.lastInitSegmentReference = null;
|
|
1700
|
+
this.forceClearBuffer_(otherState);
|
|
1701
|
+
this.abortOperations_(otherState).catch(() => {});
|
|
1703
1702
|
}
|
|
1704
1703
|
}
|
|
1705
1704
|
|
|
@@ -1729,6 +1728,19 @@ shaka.media.StreamingEngine = class {
|
|
|
1729
1728
|
mediaState.type, timestampOffset, appendWindowStart,
|
|
1730
1729
|
appendWindowEnd, ignoreTimestampOffset,
|
|
1731
1730
|
mediaState.stream, streamsByType);
|
|
1731
|
+
if (isResetMediaSourceNecessary) {
|
|
1732
|
+
let otherState = null;
|
|
1733
|
+
if (mediaState.type === ContentType.VIDEO) {
|
|
1734
|
+
otherState = this.mediaStates_.get(ContentType.AUDIO);
|
|
1735
|
+
} else if (mediaState.type === ContentType.AUDIO) {
|
|
1736
|
+
otherState = this.mediaStates_.get(ContentType.VIDEO);
|
|
1737
|
+
}
|
|
1738
|
+
if (otherState) {
|
|
1739
|
+
otherState.waitingToClearBuffer = false;
|
|
1740
|
+
otherState.performingUpdate = false;
|
|
1741
|
+
this.forceClearBuffer_(otherState);
|
|
1742
|
+
}
|
|
1743
|
+
}
|
|
1732
1744
|
} catch (error) {
|
|
1733
1745
|
mediaState.lastAppendWindowStart = null;
|
|
1734
1746
|
mediaState.lastAppendWindowEnd = null;
|
|
@@ -1738,7 +1750,10 @@ shaka.media.StreamingEngine = class {
|
|
|
1738
1750
|
throw error;
|
|
1739
1751
|
}
|
|
1740
1752
|
};
|
|
1741
|
-
|
|
1753
|
+
// Dispatching init asynchronously causes the sourceBuffers in
|
|
1754
|
+
// the MediaSourceEngine to become detached do to race conditions
|
|
1755
|
+
// with mediaSource and sourceBuffers being created simultaneously.
|
|
1756
|
+
await setProperties();
|
|
1742
1757
|
}
|
|
1743
1758
|
|
|
1744
1759
|
if (!shaka.media.InitSegmentReference.equal(
|
|
@@ -2185,10 +2200,10 @@ shaka.media.StreamingEngine = class {
|
|
|
2185
2200
|
const response = await op.promise;
|
|
2186
2201
|
mediaState.operation = null;
|
|
2187
2202
|
let result = response.data;
|
|
2188
|
-
if (reference.
|
|
2203
|
+
if (reference.aes128Key) {
|
|
2189
2204
|
const iter = mediaState.segmentIterator;
|
|
2190
2205
|
goog.asserts.assert(iter, 'mediaState.segmentIterator should exist');
|
|
2191
|
-
result = await this.aes128Decrypt_(result, reference.
|
|
2206
|
+
result = await this.aes128Decrypt_(result, reference.aes128Key, iter);
|
|
2192
2207
|
}
|
|
2193
2208
|
return result;
|
|
2194
2209
|
}
|
package/lib/mss/mss_parser.js
CHANGED
|
@@ -500,6 +500,7 @@ shaka.mss.MssParser = class {
|
|
|
500
500
|
const stream = {
|
|
501
501
|
id: id,
|
|
502
502
|
originalId: streamIndex.getAttribute('Name') || String(id),
|
|
503
|
+
groupId: null,
|
|
503
504
|
createSegmentIndex: () => Promise.resolve(),
|
|
504
505
|
closeSegmentIndex: () => Promise.resolve(),
|
|
505
506
|
segmentIndex: null,
|
package/lib/offline/storage.js
CHANGED
|
@@ -1168,6 +1168,8 @@ shaka.offline.Storage = class {
|
|
|
1168
1168
|
enableLowLatencyMode: () => {},
|
|
1169
1169
|
updateDuration: () => {},
|
|
1170
1170
|
newDrmInfo: (stream) => {},
|
|
1171
|
+
onManifestUpdated: () => {},
|
|
1172
|
+
getBandwidthEstimate: () => config.abr.defaultBandwidthEstimate,
|
|
1171
1173
|
};
|
|
1172
1174
|
|
|
1173
1175
|
parser.configure(config.manifest);
|
|
@@ -1299,6 +1301,7 @@ shaka.offline.Storage = class {
|
|
|
1299
1301
|
const streamDb = {
|
|
1300
1302
|
id: stream.id,
|
|
1301
1303
|
originalId: stream.originalId,
|
|
1304
|
+
groupId: stream.groupId,
|
|
1302
1305
|
primary: stream.primary,
|
|
1303
1306
|
type: stream.type,
|
|
1304
1307
|
mimeType: stream.mimeType,
|