@editframe/elements 0.17.6-beta.0 → 0.18.7-beta.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/dist/EF_FRAMEGEN.js +1 -1
- package/dist/elements/EFAudio.d.ts +21 -2
- package/dist/elements/EFAudio.js +41 -11
- package/dist/elements/EFImage.d.ts +1 -0
- package/dist/elements/EFImage.js +11 -3
- package/dist/elements/EFMedia/AssetIdMediaEngine.d.ts +18 -0
- package/dist/elements/EFMedia/AssetIdMediaEngine.js +41 -0
- package/dist/elements/EFMedia/AssetMediaEngine.browsertest.d.ts +0 -0
- package/dist/elements/EFMedia/AssetMediaEngine.d.ts +45 -0
- package/dist/elements/EFMedia/AssetMediaEngine.js +135 -0
- package/dist/elements/EFMedia/BaseMediaEngine.d.ts +55 -0
- package/dist/elements/EFMedia/BaseMediaEngine.js +115 -0
- package/dist/elements/EFMedia/BufferedSeekingInput.d.ts +43 -0
- package/dist/elements/EFMedia/BufferedSeekingInput.js +179 -0
- package/dist/elements/EFMedia/JitMediaEngine.browsertest.d.ts +0 -0
- package/dist/elements/EFMedia/JitMediaEngine.d.ts +31 -0
- package/dist/elements/EFMedia/JitMediaEngine.js +81 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.browsertest.d.ts +9 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.d.ts +16 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.js +48 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.d.ts +3 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.js +141 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.browsertest.d.ts +9 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.d.ts +4 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.js +16 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.browsertest.d.ts +9 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.d.ts +3 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.js +30 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.chunkboundary.regression.browsertest.d.ts +0 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.d.ts +7 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js +32 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.d.ts +4 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.js +28 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.d.ts +4 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.js +17 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.d.ts +3 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js +107 -0
- package/dist/elements/EFMedia/shared/AudioSpanUtils.d.ts +7 -0
- package/dist/elements/EFMedia/shared/AudioSpanUtils.js +54 -0
- package/dist/elements/EFMedia/shared/BufferUtils.d.ts +70 -0
- package/dist/elements/EFMedia/shared/BufferUtils.js +89 -0
- package/dist/elements/EFMedia/shared/MediaTaskUtils.d.ts +23 -0
- package/dist/elements/EFMedia/shared/PrecisionUtils.d.ts +28 -0
- package/dist/elements/EFMedia/shared/PrecisionUtils.js +29 -0
- package/dist/elements/EFMedia/shared/RenditionHelpers.d.ts +19 -0
- package/dist/elements/EFMedia/tasks/makeMediaEngineTask.d.ts +18 -0
- package/dist/elements/EFMedia/tasks/makeMediaEngineTask.js +60 -0
- package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.browsertest.d.ts +9 -0
- package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.d.ts +16 -0
- package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.js +46 -0
- package/dist/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.browsertest.d.ts +9 -0
- package/dist/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.d.ts +4 -0
- package/dist/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.js +16 -0
- package/dist/elements/EFMedia/videoTasks/makeVideoInputTask.browsertest.d.ts +9 -0
- package/dist/elements/EFMedia/videoTasks/makeVideoInputTask.d.ts +3 -0
- package/dist/elements/EFMedia/videoTasks/makeVideoInputTask.js +27 -0
- package/dist/elements/EFMedia/videoTasks/makeVideoSeekTask.d.ts +7 -0
- package/dist/elements/EFMedia/videoTasks/makeVideoSeekTask.js +34 -0
- package/dist/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.browsertest.d.ts +9 -0
- package/dist/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.d.ts +4 -0
- package/dist/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.js +28 -0
- package/dist/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.browsertest.d.ts +9 -0
- package/dist/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.d.ts +4 -0
- package/dist/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.js +17 -0
- package/dist/elements/EFMedia.browsertest.d.ts +1 -0
- package/dist/elements/EFMedia.d.ts +63 -111
- package/dist/elements/EFMedia.js +117 -1113
- package/dist/elements/EFTemporal.d.ts +1 -1
- package/dist/elements/EFTemporal.js +1 -1
- package/dist/elements/EFTimegroup.d.ts +11 -0
- package/dist/elements/EFTimegroup.js +83 -13
- package/dist/elements/EFVideo.d.ts +54 -32
- package/dist/elements/EFVideo.js +100 -207
- package/dist/elements/EFWaveform.js +2 -2
- package/dist/elements/SampleBuffer.d.ts +14 -0
- package/dist/elements/SampleBuffer.js +52 -0
- package/dist/getRenderInfo.js +2 -1
- package/dist/gui/ContextMixin.js +3 -2
- package/dist/gui/EFFilmstrip.d.ts +3 -3
- package/dist/gui/EFFilmstrip.js +1 -1
- package/dist/gui/EFFitScale.d.ts +2 -2
- package/dist/gui/TWMixin.js +1 -1
- package/dist/style.css +1 -1
- package/dist/transcoding/cache/CacheManager.d.ts +73 -0
- package/dist/transcoding/cache/RequestDeduplicator.d.ts +29 -0
- package/dist/transcoding/cache/RequestDeduplicator.js +53 -0
- package/dist/transcoding/cache/RequestDeduplicator.test.d.ts +1 -0
- package/dist/transcoding/types/index.d.ts +242 -0
- package/dist/transcoding/utils/MediaUtils.d.ts +9 -0
- package/dist/transcoding/utils/UrlGenerator.d.ts +26 -0
- package/dist/transcoding/utils/UrlGenerator.js +45 -0
- package/dist/transcoding/utils/constants.d.ts +27 -0
- package/dist/utils/LRUCache.d.ts +34 -0
- package/dist/utils/LRUCache.js +115 -0
- package/package.json +3 -3
- package/src/elements/EFAudio.browsertest.ts +189 -49
- package/src/elements/EFAudio.ts +59 -13
- package/src/elements/EFImage.browsertest.ts +42 -0
- package/src/elements/EFImage.ts +23 -3
- package/src/elements/EFMedia/AssetIdMediaEngine.test.ts +222 -0
- package/src/elements/EFMedia/AssetIdMediaEngine.ts +70 -0
- package/src/elements/EFMedia/AssetMediaEngine.browsertest.ts +100 -0
- package/src/elements/EFMedia/AssetMediaEngine.ts +255 -0
- package/src/elements/EFMedia/BaseMediaEngine.test.ts +164 -0
- package/src/elements/EFMedia/BaseMediaEngine.ts +219 -0
- package/src/elements/EFMedia/BufferedSeekingInput.browsertest.ts +481 -0
- package/src/elements/EFMedia/BufferedSeekingInput.ts +324 -0
- package/src/elements/EFMedia/JitMediaEngine.browsertest.ts +165 -0
- package/src/elements/EFMedia/JitMediaEngine.ts +166 -0
- package/src/elements/EFMedia/audioTasks/makeAudioBufferTask.browsertest.ts +554 -0
- package/src/elements/EFMedia/audioTasks/makeAudioBufferTask.ts +81 -0
- package/src/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.ts +250 -0
- package/src/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.browsertest.ts +59 -0
- package/src/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.ts +23 -0
- package/src/elements/EFMedia/audioTasks/makeAudioInputTask.browsertest.ts +55 -0
- package/src/elements/EFMedia/audioTasks/makeAudioInputTask.ts +43 -0
- package/src/elements/EFMedia/audioTasks/makeAudioSeekTask.chunkboundary.regression.browsertest.ts +199 -0
- package/src/elements/EFMedia/audioTasks/makeAudioSeekTask.ts +64 -0
- package/src/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.ts +45 -0
- package/src/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.ts +24 -0
- package/src/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.ts +183 -0
- package/src/elements/EFMedia/shared/AudioSpanUtils.ts +128 -0
- package/src/elements/EFMedia/shared/BufferUtils.ts +310 -0
- package/src/elements/EFMedia/shared/MediaTaskUtils.ts +44 -0
- package/src/elements/EFMedia/shared/PrecisionUtils.ts +46 -0
- package/src/elements/EFMedia/shared/RenditionHelpers.browsertest.ts +247 -0
- package/src/elements/EFMedia/shared/RenditionHelpers.ts +79 -0
- package/src/elements/EFMedia/tasks/makeMediaEngineTask.browsertest.ts +128 -0
- package/src/elements/EFMedia/tasks/makeMediaEngineTask.test.ts +233 -0
- package/src/elements/EFMedia/tasks/makeMediaEngineTask.ts +89 -0
- package/src/elements/EFMedia/videoTasks/makeVideoBufferTask.browsertest.ts +555 -0
- package/src/elements/EFMedia/videoTasks/makeVideoBufferTask.ts +79 -0
- package/src/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.browsertest.ts +59 -0
- package/src/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.ts +23 -0
- package/src/elements/EFMedia/videoTasks/makeVideoInputTask.browsertest.ts +55 -0
- package/src/elements/EFMedia/videoTasks/makeVideoInputTask.ts +45 -0
- package/src/elements/EFMedia/videoTasks/makeVideoSeekTask.ts +68 -0
- package/src/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.browsertest.ts +57 -0
- package/src/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.ts +43 -0
- package/src/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.browsertest.ts +56 -0
- package/src/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.ts +24 -0
- package/src/elements/EFMedia.browsertest.ts +706 -273
- package/src/elements/EFMedia.ts +136 -1769
- package/src/elements/EFTemporal.ts +3 -4
- package/src/elements/EFTimegroup.browsertest.ts +6 -3
- package/src/elements/EFTimegroup.ts +147 -21
- package/src/elements/EFVideo.browsertest.ts +980 -169
- package/src/elements/EFVideo.ts +113 -458
- package/src/elements/EFWaveform.ts +1 -1
- package/src/elements/MediaController.ts +2 -12
- package/src/elements/SampleBuffer.ts +95 -0
- package/src/gui/ContextMixin.ts +3 -6
- package/src/transcoding/cache/CacheManager.ts +208 -0
- package/src/transcoding/cache/RequestDeduplicator.test.ts +170 -0
- package/src/transcoding/cache/RequestDeduplicator.ts +65 -0
- package/src/transcoding/types/index.ts +269 -0
- package/src/transcoding/utils/MediaUtils.ts +63 -0
- package/src/transcoding/utils/UrlGenerator.ts +68 -0
- package/src/transcoding/utils/constants.ts +36 -0
- package/src/utils/LRUCache.ts +153 -0
- package/test/EFVideo.framegen.browsertest.ts +39 -30
- package/test/__cache__/GET__api_v1_transcode_audio_1_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__32da3954ba60c96ad732020c65a08ebc/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_audio_1_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__32da3954ba60c96ad732020c65a08ebc/metadata.json +21 -0
- package/test/__cache__/GET__api_v1_transcode_audio_1_mp4_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4_bytes_0__9ed2d25c675aa6bb6ff5b3ae23887c71/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_audio_1_mp4_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4_bytes_0__9ed2d25c675aa6bb6ff5b3ae23887c71/metadata.json +22 -0
- package/test/__cache__/GET__api_v1_transcode_audio_2_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__b0b2b07efcf607de8ee0f650328c32f7/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_audio_2_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__b0b2b07efcf607de8ee0f650328c32f7/metadata.json +21 -0
- package/test/__cache__/GET__api_v1_transcode_audio_2_mp4_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4_bytes_0__d5a3309a2bf756dd6e304807eb402f56/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_audio_2_mp4_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4_bytes_0__d5a3309a2bf756dd6e304807eb402f56/metadata.json +22 -0
- package/test/__cache__/GET__api_v1_transcode_audio_3_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a75c2252b542e0c152c780e9a8d7b154/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_audio_3_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a75c2252b542e0c152c780e9a8d7b154/metadata.json +21 -0
- package/test/__cache__/GET__api_v1_transcode_audio_3_mp4_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4_bytes_0__773254bb671e3466fca8677139fb239e/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_audio_3_mp4_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4_bytes_0__773254bb671e3466fca8677139fb239e/metadata.json +22 -0
- package/test/__cache__/GET__api_v1_transcode_audio_4_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a64ff1cfb1b52cae14df4b5dfa1e222b/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_audio_4_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a64ff1cfb1b52cae14df4b5dfa1e222b/metadata.json +21 -0
- package/test/__cache__/GET__api_v1_transcode_audio_5_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__91e8a522f950809b9f09f4173113b4b0/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_audio_5_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__91e8a522f950809b9f09f4173113b4b0/metadata.json +21 -0
- package/test/__cache__/GET__api_v1_transcode_audio_init_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__e66d2c831d951e74ad0aeaa6489795d0/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_audio_init_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__e66d2c831d951e74ad0aeaa6489795d0/metadata.json +21 -0
- package/test/__cache__/GET__api_v1_transcode_high_1_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__26197f6f7c46cacb0a71134131c3f775/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_high_1_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__26197f6f7c46cacb0a71134131c3f775/metadata.json +21 -0
- package/test/__cache__/GET__api_v1_transcode_high_2_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__4cb6774cd3650ccf59c8f8dc6678c0b9/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_high_2_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__4cb6774cd3650ccf59c8f8dc6678c0b9/metadata.json +21 -0
- package/test/__cache__/GET__api_v1_transcode_high_3_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__0b3b2b1c8933f7fcf8a9ecaa88d58b41/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_high_3_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__0b3b2b1c8933f7fcf8a9ecaa88d58b41/metadata.json +21 -0
- package/test/__cache__/GET__api_v1_transcode_high_4_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a6fb05a22b18d850f7f2950bbcdbdeed/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_high_4_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a6fb05a22b18d850f7f2950bbcdbdeed/metadata.json +21 -0
- package/test/__cache__/GET__api_v1_transcode_high_5_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a50058c7c3602e90879fe3428ed891f4/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_high_5_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a50058c7c3602e90879fe3428ed891f4/metadata.json +21 -0
- package/test/__cache__/GET__api_v1_transcode_high_init_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__0798c479b44aaeef850609a430f6e613/data.bin +0 -0
- package/test/__cache__/GET__api_v1_transcode_high_init_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__0798c479b44aaeef850609a430f6e613/metadata.json +21 -0
- package/test/__cache__/GET__api_v1_transcode_manifest_json_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__3be92a0437de726b431ed5af2369158a/data.bin +1 -0
- package/test/__cache__/GET__api_v1_transcode_manifest_json_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__3be92a0437de726b431ed5af2369158a/metadata.json +19 -0
- package/test/createJitTestClips.ts +320 -188
- package/test/recordReplayProxyPlugin.js +352 -0
- package/test/useAssetMSW.ts +1 -1
- package/test/useMSW.ts +35 -22
- package/types.json +1 -1
- package/dist/JitTranscodingClient.d.ts +0 -167
- package/dist/JitTranscodingClient.js +0 -373
- package/dist/ScrubTrackManager.d.ts +0 -96
- package/dist/ScrubTrackManager.js +0 -216
- package/dist/elements/printTaskStatus.js +0 -11
- package/src/elements/__screenshots__/EFMedia.browsertest.ts/EFMedia-JIT-audio-playback-audioBufferTask-should-work-in-JIT-mode-without-URL-errors-1.png +0 -0
- package/test/EFVideo.frame-tasks.browsertest.ts +0 -524
- /package/dist/{DecoderResetFrequency.test.d.ts → elements/EFMedia/AssetIdMediaEngine.test.d.ts} +0 -0
- /package/dist/{DecoderResetRecovery.test.d.ts → elements/EFMedia/BaseMediaEngine.test.d.ts} +0 -0
- /package/dist/{JitTranscodingClient.browsertest.d.ts → elements/EFMedia/BufferedSeekingInput.browsertest.d.ts} +0 -0
- /package/dist/{JitTranscodingClient.test.d.ts → elements/EFMedia/shared/RenditionHelpers.browsertest.d.ts} +0 -0
- /package/dist/{ScrubTrackIntegration.test.d.ts → elements/EFMedia/tasks/makeMediaEngineTask.browsertest.d.ts} +0 -0
- /package/dist/{SegmentSwitchLoading.test.d.ts → elements/EFMedia/tasks/makeMediaEngineTask.test.d.ts} +0 -0
|
@@ -190,7 +190,7 @@ const EFTemporal = (superClass) => {
|
|
|
190
190
|
}
|
|
191
191
|
const previous = siblingTemorals?.[(ownIndex ?? 0) - 1];
|
|
192
192
|
if (!previous) {
|
|
193
|
-
console.
|
|
193
|
+
console.error("Previous temporal element not found", {
|
|
194
194
|
ownIndex,
|
|
195
195
|
siblingTemorals
|
|
196
196
|
});
|
|
@@ -6,6 +6,8 @@ export declare class EFTimegroup extends EFTimegroup_base {
|
|
|
6
6
|
#private;
|
|
7
7
|
static styles: import('lit').CSSResult;
|
|
8
8
|
_timeGroupContext: this;
|
|
9
|
+
private isFrameUpdateInProgress;
|
|
10
|
+
private queuedTimeUpdate;
|
|
9
11
|
mode: "fit" | "fixed" | "sequence" | "contain";
|
|
10
12
|
overlapMs: number;
|
|
11
13
|
fit: "none" | "contain" | "cover";
|
|
@@ -13,6 +15,10 @@ export declare class EFTimegroup extends EFTimegroup_base {
|
|
|
13
15
|
get currentTime(): number;
|
|
14
16
|
get currentTimeMs(): number;
|
|
15
17
|
set currentTimeMs(ms: number);
|
|
18
|
+
/**
|
|
19
|
+
* Determines if this is a root timegroup (no parent timegroups)
|
|
20
|
+
*/
|
|
21
|
+
get isRootTimegroup(): boolean;
|
|
16
22
|
render(): import('lit-html').TemplateResult<1>;
|
|
17
23
|
maybeLoadTimeFromLocalStorage(): number;
|
|
18
24
|
connectedCallback(): void;
|
|
@@ -47,6 +53,11 @@ export declare class EFTimegroup extends EFTimegroup_base {
|
|
|
47
53
|
wrapWithWorkbench(): void;
|
|
48
54
|
get efElements(): Element[];
|
|
49
55
|
renderAudio(fromMs: number, toMs: number): Promise<AudioBuffer>;
|
|
56
|
+
/**
|
|
57
|
+
* TEMPORARY TEST METHOD: Renders audio and immediately plays it back
|
|
58
|
+
* Usage: timegroup.testPlayAudio(0, 5000) // Play first 5 seconds
|
|
59
|
+
*/
|
|
60
|
+
testPlayAudio(fromMs: number, toMs: number): Promise<void>;
|
|
50
61
|
loadMd5Sums(): Promise<void>;
|
|
51
62
|
frameTask: Task<readonly [number, number], void>;
|
|
52
63
|
}
|
|
@@ -25,6 +25,8 @@ let EFTimegroup = class EFTimegroup$1 extends EFTemporal(LitElement) {
|
|
|
25
25
|
constructor(..._args) {
|
|
26
26
|
super(..._args);
|
|
27
27
|
this._timeGroupContext = this;
|
|
28
|
+
this.isFrameUpdateInProgress = false;
|
|
29
|
+
this.queuedTimeUpdate = null;
|
|
28
30
|
this.mode = "contain";
|
|
29
31
|
this.overlapMs = 0;
|
|
30
32
|
this.fit = "none";
|
|
@@ -52,13 +54,15 @@ let EFTimegroup = class EFTimegroup$1 extends EFTemporal(LitElement) {
|
|
|
52
54
|
#currentTime = 0;
|
|
53
55
|
#resizeObserver;
|
|
54
56
|
set currentTime(time) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
57
|
+
const newTime = Math.max(0, Math.min(time, this.durationMs / 1e3));
|
|
58
|
+
if (this.isRootTimegroup && this.isFrameUpdateInProgress) {
|
|
59
|
+
this.queuedTimeUpdate = newTime;
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (this.isRootTimegroup) this.#executeTimeUpdate(newTime);
|
|
63
|
+
else {
|
|
64
|
+
this.#currentTime = newTime;
|
|
65
|
+
this.#saveTimeToLocalStorage(newTime);
|
|
62
66
|
}
|
|
63
67
|
}
|
|
64
68
|
get currentTime() {
|
|
@@ -70,6 +74,42 @@ let EFTimegroup = class EFTimegroup$1 extends EFTemporal(LitElement) {
|
|
|
70
74
|
set currentTimeMs(ms) {
|
|
71
75
|
this.currentTime = ms / 1e3;
|
|
72
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Determines if this is a root timegroup (no parent timegroups)
|
|
79
|
+
*/
|
|
80
|
+
get isRootTimegroup() {
|
|
81
|
+
return this.closest("ef-timegroup") === this;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Executes time update with frame locking for root timegroups
|
|
85
|
+
*/
|
|
86
|
+
async #executeTimeUpdate(time) {
|
|
87
|
+
this.isFrameUpdateInProgress = true;
|
|
88
|
+
this.#currentTime = time;
|
|
89
|
+
try {
|
|
90
|
+
this.#saveTimeToLocalStorage(time);
|
|
91
|
+
await this.waitForFrameTasks();
|
|
92
|
+
} catch (error) {
|
|
93
|
+
console.error("⚠️ [TIME_UPDATE_ERROR] Error during frame update:", error);
|
|
94
|
+
} finally {
|
|
95
|
+
this.isFrameUpdateInProgress = false;
|
|
96
|
+
if (this.queuedTimeUpdate !== null && this.queuedTimeUpdate !== time) {
|
|
97
|
+
const nextTime = this.queuedTimeUpdate;
|
|
98
|
+
this.queuedTimeUpdate = null;
|
|
99
|
+
setTimeout(() => this.#executeTimeUpdate(nextTime), 0);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Saves time to localStorage (extracted for reuse)
|
|
105
|
+
*/
|
|
106
|
+
#saveTimeToLocalStorage(time) {
|
|
107
|
+
try {
|
|
108
|
+
if (this.id && this.isConnected) localStorage.setItem(this.storageKey, time.toString());
|
|
109
|
+
} catch (error) {
|
|
110
|
+
log("Failed to save time to localStorage", error);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
73
113
|
render() {
|
|
74
114
|
return html`<slot></slot> `;
|
|
75
115
|
}
|
|
@@ -162,7 +202,7 @@ let EFTimegroup = class EFTimegroup$1 extends EFTemporal(LitElement) {
|
|
|
162
202
|
async waitForMediaDurations() {
|
|
163
203
|
await this.updateComplete;
|
|
164
204
|
const mediaElements = deepGetMediaElements(this);
|
|
165
|
-
await Promise.all(mediaElements.map((m) => m.
|
|
205
|
+
await Promise.all(mediaElements.map((m) => m.mediaEngineTask.taskComplete));
|
|
166
206
|
flushStartTimeMsCache();
|
|
167
207
|
this.requestUpdate("currentTime");
|
|
168
208
|
await this.updateComplete;
|
|
@@ -213,12 +253,17 @@ let EFTimegroup = class EFTimegroup$1 extends EFTemporal(LitElement) {
|
|
|
213
253
|
}
|
|
214
254
|
async #addAudioToContext(audioContext, fromMs, toMs) {
|
|
215
255
|
await this.waitForMediaDurations();
|
|
256
|
+
const abortController = new AbortController();
|
|
216
257
|
await Promise.all(deepGetMediaElements(this).map(async (mediaElement) => {
|
|
258
|
+
if (mediaElement.mute) return;
|
|
217
259
|
const mediaStartsBeforeEnd = mediaElement.startTimeMs <= toMs;
|
|
218
260
|
const mediaEndsAfterStart = mediaElement.endTimeMs >= fromMs;
|
|
219
261
|
const mediaOverlaps = mediaStartsBeforeEnd && mediaEndsAfterStart;
|
|
220
|
-
if (!mediaOverlaps
|
|
221
|
-
const
|
|
262
|
+
if (!mediaOverlaps) return;
|
|
263
|
+
const mediaLocalFromMs = Math.max(0, fromMs - mediaElement.startTimeMs);
|
|
264
|
+
const mediaLocalToMs = Math.min(mediaElement.endTimeMs - mediaElement.startTimeMs, toMs - mediaElement.startTimeMs);
|
|
265
|
+
if (mediaLocalFromMs >= mediaLocalToMs) return;
|
|
266
|
+
const audio = await mediaElement.fetchAudioSpanningTime(mediaLocalFromMs, mediaLocalToMs, abortController.signal);
|
|
222
267
|
if (!audio) throw new Error("Failed to fetch audio");
|
|
223
268
|
const bufferSource = audioContext.createBufferSource();
|
|
224
269
|
bufferSource.buffer = await audioContext.decodeAudioData(await audio.blob.arrayBuffer());
|
|
@@ -226,13 +271,20 @@ let EFTimegroup = class EFTimegroup$1 extends EFTemporal(LitElement) {
|
|
|
226
271
|
const ctxStartMs = Math.max(0, mediaElement.startTimeMs - fromMs);
|
|
227
272
|
const ctxEndMs = mediaElement.endTimeMs - fromMs;
|
|
228
273
|
const ctxDurationMs = ctxEndMs - ctxStartMs;
|
|
229
|
-
const
|
|
230
|
-
|
|
274
|
+
const requestedOffsetInMedia = mediaLocalFromMs;
|
|
275
|
+
const actualOffsetInBuffer = requestedOffsetInMedia - audio.startMs;
|
|
276
|
+
const safeOffset = Math.max(0, actualOffsetInBuffer);
|
|
277
|
+
if (safeOffset !== actualOffsetInBuffer) {}
|
|
278
|
+
bufferSource.start(ctxStartMs / 1e3, safeOffset / 1e3, ctxDurationMs / 1e3);
|
|
231
279
|
}));
|
|
232
280
|
}
|
|
233
281
|
async renderAudio(fromMs, toMs) {
|
|
234
282
|
const durationMs = toMs - fromMs;
|
|
235
|
-
const
|
|
283
|
+
const duration = durationMs / 1e3;
|
|
284
|
+
const exactSamples = 48e3 * duration;
|
|
285
|
+
const aacFrames = exactSamples / 1024;
|
|
286
|
+
const alignedFrames = Math.round(aacFrames);
|
|
287
|
+
const contextSize = alignedFrames * 1024;
|
|
236
288
|
if (contextSize <= 0) throw new Error(`Duration must be greater than 0 when rendering audio. ${contextSize}ms`);
|
|
237
289
|
let audioContext;
|
|
238
290
|
try {
|
|
@@ -244,6 +296,24 @@ let EFTimegroup = class EFTimegroup$1 extends EFTemporal(LitElement) {
|
|
|
244
296
|
const renderedBuffer = await audioContext.startRendering();
|
|
245
297
|
return renderedBuffer;
|
|
246
298
|
}
|
|
299
|
+
/**
|
|
300
|
+
* TEMPORARY TEST METHOD: Renders audio and immediately plays it back
|
|
301
|
+
* Usage: timegroup.testPlayAudio(0, 5000) // Play first 5 seconds
|
|
302
|
+
*/
|
|
303
|
+
async testPlayAudio(fromMs, toMs) {
|
|
304
|
+
const renderedBuffer = await this.renderAudio(fromMs, toMs);
|
|
305
|
+
const playbackContext = new AudioContext();
|
|
306
|
+
const bufferSource = playbackContext.createBufferSource();
|
|
307
|
+
bufferSource.buffer = renderedBuffer;
|
|
308
|
+
bufferSource.connect(playbackContext.destination);
|
|
309
|
+
bufferSource.start(0);
|
|
310
|
+
return new Promise((resolve) => {
|
|
311
|
+
bufferSource.onended = () => {
|
|
312
|
+
playbackContext.close();
|
|
313
|
+
resolve();
|
|
314
|
+
};
|
|
315
|
+
});
|
|
316
|
+
}
|
|
247
317
|
async loadMd5Sums() {
|
|
248
318
|
const efElements = this.efElements;
|
|
249
319
|
const loaderTasks = [];
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import { VideoAsset } from '../../../assets/src/EncodedAsset.ts';
|
|
2
1
|
import { Task } from '@lit/task';
|
|
3
2
|
import { PropertyValueMap } from 'lit';
|
|
4
|
-
import { CacheStats, ScrubTrackManager } from '../ScrubTrackManager.js';
|
|
5
3
|
import { EFMedia } from './EFMedia.js';
|
|
6
4
|
declare global {
|
|
7
5
|
var EF_FRAMEGEN: import("../EF_FRAMEGEN.js").EFFramegen;
|
|
@@ -13,17 +11,30 @@ interface LoadingState {
|
|
|
13
11
|
}
|
|
14
12
|
declare const EFVideo_base: typeof EFMedia;
|
|
15
13
|
export declare class EFVideo extends EFVideo_base {
|
|
16
|
-
|
|
14
|
+
static get observedAttributes(): string[];
|
|
17
15
|
static styles: import('lit').CSSResult[];
|
|
18
|
-
canvasRef: import('lit-html/directives/ref
|
|
16
|
+
canvasRef: import('lit-html/directives/ref').Ref<HTMLCanvasElement>;
|
|
19
17
|
/**
|
|
20
|
-
*
|
|
18
|
+
* Duration in milliseconds for video buffering ahead of current time
|
|
19
|
+
* @domAttribute "video-buffer-duration"
|
|
21
20
|
*/
|
|
22
|
-
|
|
21
|
+
videoBufferDurationMs: number;
|
|
23
22
|
/**
|
|
24
|
-
*
|
|
23
|
+
* Maximum number of concurrent video segment fetches for buffering
|
|
24
|
+
* @domAttribute "max-video-buffer-fetches"
|
|
25
25
|
*/
|
|
26
|
-
|
|
26
|
+
maxVideoBufferFetches: number;
|
|
27
|
+
/**
|
|
28
|
+
* Enable/disable video buffering system
|
|
29
|
+
* @domAttribute "enable-video-buffering"
|
|
30
|
+
*/
|
|
31
|
+
enableVideoBuffering: boolean;
|
|
32
|
+
videoSegmentIdTask: Task<readonly [import('../transcoding/types/index.ts').MediaEngine | undefined, number], number | undefined>;
|
|
33
|
+
videoInitSegmentFetchTask: Task<readonly [import('../transcoding/types/index.ts').MediaEngine | undefined], ArrayBuffer>;
|
|
34
|
+
videoSegmentFetchTask: Task<readonly [import('../transcoding/types/index.ts').MediaEngine | undefined, number | undefined], ArrayBuffer>;
|
|
35
|
+
videoInputTask: import('./EFMedia/shared/MediaTaskUtils.ts').InputTask;
|
|
36
|
+
videoSeekTask: Task<readonly [number, import('./EFMedia/BufferedSeekingInput.ts').BufferedSeekingInput | undefined], import('mediabunny').VideoSample | undefined>;
|
|
37
|
+
videoBufferTask: Task<readonly [number], import('./EFMedia/videoTasks/makeVideoBufferTask.ts').VideoBufferState>;
|
|
27
38
|
/**
|
|
28
39
|
* Delayed loading state manager for user feedback
|
|
29
40
|
*/
|
|
@@ -40,23 +51,7 @@ export declare class EFVideo extends EFVideo_base {
|
|
|
40
51
|
render(): import('lit-html').TemplateResult<1>;
|
|
41
52
|
get canvasElement(): HTMLCanvasElement | undefined;
|
|
42
53
|
frameTask: Task<readonly [number], void>;
|
|
43
|
-
get frameTaskStatus(): {
|
|
44
|
-
desiredSeekTimeMs: number;
|
|
45
|
-
fragmentIndexTask: string;
|
|
46
|
-
seekTask: string;
|
|
47
|
-
mediaSegmentsTask: string;
|
|
48
|
-
assetSegmentLoader: string;
|
|
49
|
-
assetSegmentKeysTask: string;
|
|
50
|
-
assetInitSegmentsTask: string;
|
|
51
|
-
videoAssetTask: string;
|
|
52
|
-
paintTask: string;
|
|
53
|
-
frameTask: string;
|
|
54
|
-
};
|
|
55
54
|
protected updated(changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void;
|
|
56
|
-
/**
|
|
57
|
-
* Initialize scrub track manager if needed
|
|
58
|
-
*/
|
|
59
|
-
private initializeScrubTrackManager;
|
|
60
55
|
/**
|
|
61
56
|
* Start a delayed loading operation for testing
|
|
62
57
|
*/
|
|
@@ -71,12 +66,7 @@ export declare class EFVideo extends EFVideo_base {
|
|
|
71
66
|
* Set loading state for user feedback
|
|
72
67
|
*/
|
|
73
68
|
private setLoadingState;
|
|
74
|
-
|
|
75
|
-
paintTask: Task<readonly [number], number | undefined>;
|
|
76
|
-
/**
|
|
77
|
-
* Render normal video using existing logic
|
|
78
|
-
*/
|
|
79
|
-
private renderNormalVideo;
|
|
69
|
+
paintTask: Task<readonly [number], void>;
|
|
80
70
|
/**
|
|
81
71
|
* Display a video frame on the canvas
|
|
82
72
|
*/
|
|
@@ -90,9 +80,41 @@ export declare class EFVideo extends EFVideo_base {
|
|
|
90
80
|
*/
|
|
91
81
|
private isFrameRenderingActive;
|
|
92
82
|
/**
|
|
93
|
-
*
|
|
83
|
+
* Effective mode - always returns "asset" for EFVideo
|
|
84
|
+
*/
|
|
85
|
+
get effectiveMode(): string;
|
|
86
|
+
/**
|
|
87
|
+
* Legacy getter for asset index loader (maps to mediaEngine task)
|
|
88
|
+
*/
|
|
89
|
+
get assetIndexLoader(): Task<readonly [string, string | null], import('../transcoding/types/index.ts').MediaEngine>;
|
|
90
|
+
/**
|
|
91
|
+
* Legacy getter for fragment index task (maps to videoSegmentIdTask)
|
|
92
|
+
*/
|
|
93
|
+
get fragmentIndexTask(): Task<readonly [import('../transcoding/types/index.ts').MediaEngine | undefined, number], number | undefined>;
|
|
94
|
+
/**
|
|
95
|
+
* Legacy getter for seek task (maps to videoSeekTask)
|
|
96
|
+
*/
|
|
97
|
+
get seekTask(): Task<readonly [number, import('./EFMedia/BufferedSeekingInput.ts').BufferedSeekingInput | undefined], import('mediabunny').VideoSample | undefined>;
|
|
98
|
+
/**
|
|
99
|
+
* Legacy getter for media segments task (maps to videoSegmentFetchTask)
|
|
100
|
+
*/
|
|
101
|
+
get mediaSegmentsTask(): Task<readonly [import('../transcoding/types/index.ts').MediaEngine | undefined, number | undefined], ArrayBuffer>;
|
|
102
|
+
/**
|
|
103
|
+
* Legacy getter for asset segment keys task (maps to videoSegmentIdTask)
|
|
104
|
+
*/
|
|
105
|
+
get assetSegmentKeysTask(): Task<readonly [import('../transcoding/types/index.ts').MediaEngine | undefined, number], number | undefined>;
|
|
106
|
+
/**
|
|
107
|
+
* Legacy getter for asset init segments task (maps to videoInitSegmentFetchTask)
|
|
108
|
+
*/
|
|
109
|
+
get assetInitSegmentsTask(): Task<readonly [import('../transcoding/types/index.ts').MediaEngine | undefined], ArrayBuffer>;
|
|
110
|
+
/**
|
|
111
|
+
* Legacy getter for asset segment loader (maps to videoSegmentFetchTask)
|
|
112
|
+
*/
|
|
113
|
+
get assetSegmentLoader(): Task<readonly [import('../transcoding/types/index.ts').MediaEngine | undefined, number | undefined], ArrayBuffer>;
|
|
114
|
+
/**
|
|
115
|
+
* Legacy getter for video asset task (maps to videoBufferTask)
|
|
94
116
|
*/
|
|
95
|
-
|
|
117
|
+
get videoAssetTask(): Task<readonly [number], import('./EFMedia/videoTasks/makeVideoBufferTask.ts').VideoBufferState>;
|
|
96
118
|
/**
|
|
97
119
|
* Clean up resources when component is disconnected
|
|
98
120
|
*/
|