@editframe/elements 0.16.8-beta.0 → 0.18.3-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/README.md +30 -0
- package/dist/DecoderResetFrequency.test.d.ts +1 -0
- package/dist/DecoderResetRecovery.test.d.ts +1 -0
- package/dist/DelayedLoadingState.d.ts +48 -0
- package/dist/DelayedLoadingState.integration.test.d.ts +1 -0
- package/dist/DelayedLoadingState.js +113 -0
- package/dist/DelayedLoadingState.test.d.ts +1 -0
- package/dist/EF_FRAMEGEN.d.ts +10 -1
- package/dist/EF_FRAMEGEN.js +199 -179
- package/dist/EF_INTERACTIVE.js +2 -6
- package/dist/EF_RENDERING.js +1 -3
- package/dist/LoadingDebounce.test.d.ts +1 -0
- package/dist/LoadingIndicator.browsertest.d.ts +0 -0
- package/dist/ManualScrubTest.test.d.ts +1 -0
- package/dist/ScrubResolvedFlashing.test.d.ts +1 -0
- package/dist/ScrubTrackManager.d.ts +96 -0
- package/dist/ScrubTrackManager.test.d.ts +1 -0
- package/dist/VideoSeekFlashing.browsertest.d.ts +0 -0
- package/dist/VideoStuckDiagnostic.test.d.ts +1 -0
- package/dist/elements/CrossUpdateController.js +13 -15
- package/dist/elements/EFAudio.browsertest.d.ts +0 -0
- package/dist/elements/EFAudio.d.ts +22 -3
- package/dist/elements/EFAudio.js +60 -43
- package/dist/elements/EFCaptions.js +337 -373
- package/dist/elements/EFImage.d.ts +1 -0
- package/dist/elements/EFImage.js +73 -91
- package/dist/elements/EFMedia/AssetIdMediaEngine.d.ts +18 -0
- package/dist/elements/EFMedia/AssetIdMediaEngine.js +41 -0
- package/dist/elements/EFMedia/AssetIdMediaEngine.test.d.ts +1 -0
- package/dist/elements/EFMedia/AssetMediaEngine.d.ts +47 -0
- package/dist/elements/EFMedia/AssetMediaEngine.js +116 -0
- package/dist/elements/EFMedia/BaseMediaEngine.d.ts +55 -0
- package/dist/elements/EFMedia/BaseMediaEngine.js +96 -0
- package/dist/elements/EFMedia/BaseMediaEngine.test.d.ts +1 -0
- package/dist/elements/EFMedia/BufferedSeekingInput.browsertest.d.ts +1 -0
- package/dist/elements/EFMedia/BufferedSeekingInput.d.ts +43 -0
- package/dist/elements/EFMedia/BufferedSeekingInput.js +159 -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 +62 -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 +138 -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 +22 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.d.ts +7 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js +24 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.d.ts +4 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.js +18 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.d.ts +4 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.js +16 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.d.ts +3 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js +104 -0
- package/dist/elements/EFMedia/services/AudioElementFactory.browsertest.d.ts +1 -0
- package/dist/elements/EFMedia/services/AudioElementFactory.d.ts +22 -0
- package/dist/elements/EFMedia/services/AudioElementFactory.js +72 -0
- package/dist/elements/EFMedia/services/MediaSourceService.browsertest.d.ts +1 -0
- package/dist/elements/EFMedia/services/MediaSourceService.d.ts +47 -0
- package/dist/elements/EFMedia/services/MediaSourceService.js +73 -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/RenditionHelpers.browsertest.d.ts +1 -0
- package/dist/elements/EFMedia/shared/RenditionHelpers.d.ts +19 -0
- package/dist/elements/EFMedia/tasks/makeMediaEngineTask.browsertest.d.ts +1 -0
- package/dist/elements/EFMedia/tasks/makeMediaEngineTask.d.ts +18 -0
- package/dist/elements/EFMedia/tasks/makeMediaEngineTask.js +60 -0
- package/dist/elements/EFMedia/tasks/makeMediaEngineTask.test.d.ts +1 -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 +25 -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 +18 -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 +16 -0
- package/dist/elements/EFMedia.browsertest.d.ts +1 -0
- package/dist/elements/EFMedia.d.ts +95 -66
- package/dist/elements/EFMedia.js +204 -683
- package/dist/elements/EFSourceMixin.js +31 -48
- package/dist/elements/EFTemporal.d.ts +2 -1
- package/dist/elements/EFTemporal.js +266 -360
- package/dist/elements/EFTimegroup.d.ts +14 -1
- package/dist/elements/EFTimegroup.js +337 -323
- package/dist/elements/EFVideo.browsertest.d.ts +0 -0
- package/dist/elements/EFVideo.d.ts +123 -4
- package/dist/elements/EFVideo.js +308 -111
- package/dist/elements/EFWaveform.js +375 -411
- package/dist/elements/FetchMixin.js +14 -24
- package/dist/elements/MediaController.d.ts +30 -0
- package/dist/elements/SampleBuffer.d.ts +14 -0
- package/dist/elements/SampleBuffer.js +52 -0
- package/dist/elements/TargetController.js +130 -156
- package/dist/elements/TimegroupController.js +17 -19
- package/dist/elements/durationConverter.js +15 -4
- package/dist/elements/parseTimeToMs.js +4 -10
- package/dist/elements/printTaskStatus.d.ts +2 -0
- package/dist/elements/updateAnimations.js +39 -59
- package/dist/getRenderInfo.d.ts +2 -2
- package/dist/getRenderInfo.js +59 -67
- package/dist/gui/ContextMixin.js +150 -288
- package/dist/gui/EFConfiguration.js +27 -43
- package/dist/gui/EFFilmstrip.d.ts +3 -3
- package/dist/gui/EFFilmstrip.js +440 -620
- package/dist/gui/EFFitScale.d.ts +2 -2
- package/dist/gui/EFFitScale.js +112 -135
- package/dist/gui/EFFocusOverlay.js +45 -61
- package/dist/gui/EFPreview.js +30 -49
- package/dist/gui/EFScrubber.js +78 -99
- package/dist/gui/EFTimeDisplay.js +49 -70
- package/dist/gui/EFToggleLoop.js +17 -34
- package/dist/gui/EFTogglePlay.js +37 -58
- package/dist/gui/EFWorkbench.js +66 -88
- package/dist/gui/TWMixin.js +2 -48
- package/dist/gui/TWMixin2.js +31 -0
- package/dist/gui/efContext.js +2 -6
- package/dist/gui/fetchContext.js +1 -3
- package/dist/gui/focusContext.js +1 -3
- package/dist/gui/focusedElementContext.js +2 -6
- package/dist/gui/playingContext.js +1 -4
- package/dist/gui/services/ElementConnectionManager.browsertest.d.ts +1 -0
- package/dist/gui/services/ElementConnectionManager.d.ts +59 -0
- package/dist/gui/services/ElementConnectionManager.js +128 -0
- package/dist/gui/services/PlaybackController.browsertest.d.ts +1 -0
- package/dist/gui/services/PlaybackController.d.ts +103 -0
- package/dist/gui/services/PlaybackController.js +290 -0
- package/dist/index.js +5 -30
- package/dist/msToTimeCode.js +11 -13
- package/dist/services/MediaSourceManager.d.ts +62 -0
- package/dist/services/MediaSourceManager.js +211 -0
- package/dist/style.css +2 -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 +4 -3
- package/src/elements/EFAudio.browsertest.ts +709 -0
- package/src/elements/EFAudio.ts +59 -15
- package/src/elements/EFCaptions.browsertest.ts +0 -1
- package/src/elements/EFImage.browsertest.ts +42 -1
- 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.ts +210 -0
- package/src/elements/EFMedia/BaseMediaEngine.test.ts +164 -0
- package/src/elements/EFMedia/BaseMediaEngine.ts +170 -0
- package/src/elements/EFMedia/BufferedSeekingInput.browsertest.ts +400 -0
- package/src/elements/EFMedia/BufferedSeekingInput.ts +267 -0
- package/src/elements/EFMedia/JitMediaEngine.browsertest.ts +165 -0
- package/src/elements/EFMedia/JitMediaEngine.ts +110 -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 +241 -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 +35 -0
- package/src/elements/EFMedia/audioTasks/makeAudioSeekTask.ts +42 -0
- package/src/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.ts +34 -0
- package/src/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.ts +23 -0
- package/src/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.ts +174 -0
- package/src/elements/EFMedia/services/AudioElementFactory.browsertest.ts +325 -0
- package/src/elements/EFMedia/services/AudioElementFactory.ts +119 -0
- package/src/elements/EFMedia/services/MediaSourceService.browsertest.ts +257 -0
- package/src/elements/EFMedia/services/MediaSourceService.ts +102 -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/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 +44 -0
- package/src/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.browsertest.ts +57 -0
- package/src/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.ts +32 -0
- package/src/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.browsertest.ts +56 -0
- package/src/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.ts +23 -0
- package/src/elements/EFMedia.browsertest.ts +696 -271
- package/src/elements/EFMedia.ts +218 -776
- package/src/elements/EFTemporal.browsertest.ts +0 -1
- package/src/elements/EFTemporal.ts +13 -3
- package/src/elements/EFTimegroup.browsertest.ts +6 -3
- package/src/elements/EFTimegroup.ts +221 -27
- package/src/elements/EFVideo.browsertest.ts +758 -0
- package/src/elements/EFVideo.ts +418 -68
- package/src/elements/EFWaveform.ts +5 -5
- package/src/elements/MediaController.ts +98 -0
- package/src/elements/SampleBuffer.ts +97 -0
- package/src/elements/printTaskStatus.ts +16 -0
- package/src/elements/updateAnimations.ts +6 -0
- package/src/gui/ContextMixin.ts +23 -104
- package/src/gui/TWMixin.ts +10 -3
- package/src/gui/services/ElementConnectionManager.browsertest.ts +263 -0
- package/src/gui/services/ElementConnectionManager.ts +224 -0
- package/src/gui/services/PlaybackController.browsertest.ts +437 -0
- package/src/gui/services/PlaybackController.ts +521 -0
- package/src/services/MediaSourceManager.ts +333 -0
- 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 +265 -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 +127 -0
- 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_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_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_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_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 +425 -0
- package/test/recordReplayProxyPlugin.js +302 -0
- package/test/useAssetMSW.ts +49 -0
- package/test/useMSW.ts +44 -0
- package/types.json +1 -1
- package/dist/gui/TWMixin.css.js +0 -4
- /package/dist/elements/{TargetController.test.d.ts → TargetController.browsertest.d.ts} +0 -0
- /package/src/elements/{TargetController.test.ts → TargetController.browsertest.ts} +0 -0
|
@@ -1,14 +1,133 @@
|
|
|
1
1
|
import { Task } from '@lit/task';
|
|
2
|
+
import { PropertyValueMap } from 'lit';
|
|
3
|
+
import { CacheStats, ScrubTrackManager } from '../ScrubTrackManager.js';
|
|
2
4
|
import { EFMedia } from './EFMedia.js';
|
|
5
|
+
declare global {
|
|
6
|
+
var EF_FRAMEGEN: import("../EF_FRAMEGEN.js").EFFramegen;
|
|
7
|
+
}
|
|
8
|
+
interface LoadingState {
|
|
9
|
+
isLoading: boolean;
|
|
10
|
+
operation: "scrub-segment" | "video-segment" | "seeking" | "decoding" | null;
|
|
11
|
+
message: string;
|
|
12
|
+
}
|
|
3
13
|
declare const EFVideo_base: typeof EFMedia;
|
|
4
14
|
export declare class EFVideo extends EFVideo_base {
|
|
5
|
-
|
|
15
|
+
static get observedAttributes(): string[];
|
|
6
16
|
static styles: import('lit').CSSResult[];
|
|
7
|
-
canvasRef: import('lit-html/directives/ref
|
|
17
|
+
canvasRef: import('lit-html/directives/ref').Ref<HTMLCanvasElement>;
|
|
18
|
+
/**
|
|
19
|
+
* Duration in milliseconds for video buffering ahead of current time
|
|
20
|
+
* @domAttribute "video-buffer-duration"
|
|
21
|
+
*/
|
|
22
|
+
videoBufferDurationMs: number;
|
|
23
|
+
/**
|
|
24
|
+
* Maximum number of concurrent video segment fetches for buffering
|
|
25
|
+
* @domAttribute "max-video-buffer-fetches"
|
|
26
|
+
*/
|
|
27
|
+
maxVideoBufferFetches: number;
|
|
28
|
+
/**
|
|
29
|
+
* Enable/disable video buffering system
|
|
30
|
+
* @domAttribute "enable-video-buffering"
|
|
31
|
+
*/
|
|
32
|
+
enableVideoBuffering: boolean;
|
|
33
|
+
videoSegmentIdTask: Task<readonly [import('../transcoding/types/index.ts').MediaEngine | undefined, number], number | undefined>;
|
|
34
|
+
videoInitSegmentFetchTask: Task<readonly [import('../transcoding/types/index.ts').MediaEngine | undefined], ArrayBuffer>;
|
|
35
|
+
videoSegmentFetchTask: Task<readonly [import('../transcoding/types/index.ts').MediaEngine | undefined, number | undefined], ArrayBuffer>;
|
|
36
|
+
videoInputTask: import('./EFMedia/shared/MediaTaskUtils.ts').InputTask;
|
|
37
|
+
videoSeekTask: Task<readonly [number, import('./EFMedia/BufferedSeekingInput.ts').BufferedSeekingInput | undefined], import('mediabunny').VideoSample | undefined>;
|
|
38
|
+
videoBufferTask: Task<readonly [number], import('./EFMedia/videoTasks/makeVideoBufferTask.ts').VideoBufferState>;
|
|
39
|
+
/**
|
|
40
|
+
* Scrub track manager for fast timeline navigation
|
|
41
|
+
*/
|
|
42
|
+
scrubTrackManager?: ScrubTrackManager;
|
|
43
|
+
/**
|
|
44
|
+
* Delayed loading state manager for user feedback
|
|
45
|
+
*/
|
|
46
|
+
private delayedLoadingState;
|
|
47
|
+
/**
|
|
48
|
+
* Loading state for user feedback
|
|
49
|
+
*/
|
|
50
|
+
loadingState: {
|
|
51
|
+
isLoading: boolean;
|
|
52
|
+
operation: LoadingState["operation"];
|
|
53
|
+
message: string;
|
|
54
|
+
};
|
|
55
|
+
constructor();
|
|
8
56
|
render(): import('lit-html').TemplateResult<1>;
|
|
9
57
|
get canvasElement(): HTMLCanvasElement | undefined;
|
|
10
|
-
frameTask: Task<readonly [
|
|
11
|
-
|
|
58
|
+
frameTask: Task<readonly [number], void>;
|
|
59
|
+
protected updated(changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void;
|
|
60
|
+
/**
|
|
61
|
+
* Start a delayed loading operation for testing
|
|
62
|
+
*/
|
|
63
|
+
startDelayedLoading(operationId: string, message: string, options?: {
|
|
64
|
+
background?: boolean;
|
|
65
|
+
}): void;
|
|
66
|
+
/**
|
|
67
|
+
* Clear a delayed loading operation for testing
|
|
68
|
+
*/
|
|
69
|
+
clearDelayedLoading(operationId: string): void;
|
|
70
|
+
/**
|
|
71
|
+
* Set loading state for user feedback
|
|
72
|
+
*/
|
|
73
|
+
private setLoadingState;
|
|
74
|
+
paintTask: Task<readonly [number], void>;
|
|
75
|
+
/**
|
|
76
|
+
* Display a video frame on the canvas
|
|
77
|
+
*/
|
|
78
|
+
private displayFrame;
|
|
79
|
+
/**
|
|
80
|
+
* Check if we're in production rendering mode (EF_FRAMEGEN active) vs preview mode
|
|
81
|
+
*/
|
|
82
|
+
private isInProductionRenderingMode;
|
|
83
|
+
/**
|
|
84
|
+
* Check if EF_FRAMEGEN has explicitly started frame rendering (not just initialization)
|
|
85
|
+
*/
|
|
86
|
+
private isFrameRenderingActive;
|
|
87
|
+
/**
|
|
88
|
+
* Get scrub track performance statistics
|
|
89
|
+
*/
|
|
90
|
+
getScrubTrackStats(): CacheStats | null;
|
|
91
|
+
/**
|
|
92
|
+
* Effective mode - always returns "asset" for EFVideo
|
|
93
|
+
*/
|
|
94
|
+
get effectiveMode(): string;
|
|
95
|
+
/**
|
|
96
|
+
* Legacy getter for asset index loader (maps to mediaEngine task)
|
|
97
|
+
*/
|
|
98
|
+
get assetIndexLoader(): Task<readonly [string, string | null], import('../transcoding/types/index.ts').MediaEngine>;
|
|
99
|
+
/**
|
|
100
|
+
* Legacy getter for fragment index task (maps to videoSegmentIdTask)
|
|
101
|
+
*/
|
|
102
|
+
get fragmentIndexTask(): Task<readonly [import('../transcoding/types/index.ts').MediaEngine | undefined, number], number | undefined>;
|
|
103
|
+
/**
|
|
104
|
+
* Legacy getter for seek task (maps to videoSeekTask)
|
|
105
|
+
*/
|
|
106
|
+
get seekTask(): Task<readonly [number, import('./EFMedia/BufferedSeekingInput.ts').BufferedSeekingInput | undefined], import('mediabunny').VideoSample | undefined>;
|
|
107
|
+
/**
|
|
108
|
+
* Legacy getter for media segments task (maps to videoSegmentFetchTask)
|
|
109
|
+
*/
|
|
110
|
+
get mediaSegmentsTask(): Task<readonly [import('../transcoding/types/index.ts').MediaEngine | undefined, number | undefined], ArrayBuffer>;
|
|
111
|
+
/**
|
|
112
|
+
* Legacy getter for asset segment keys task (maps to videoSegmentIdTask)
|
|
113
|
+
*/
|
|
114
|
+
get assetSegmentKeysTask(): Task<readonly [import('../transcoding/types/index.ts').MediaEngine | undefined, number], number | undefined>;
|
|
115
|
+
/**
|
|
116
|
+
* Legacy getter for asset init segments task (maps to videoInitSegmentFetchTask)
|
|
117
|
+
*/
|
|
118
|
+
get assetInitSegmentsTask(): Task<readonly [import('../transcoding/types/index.ts').MediaEngine | undefined], ArrayBuffer>;
|
|
119
|
+
/**
|
|
120
|
+
* Legacy getter for asset segment loader (maps to videoSegmentFetchTask)
|
|
121
|
+
*/
|
|
122
|
+
get assetSegmentLoader(): Task<readonly [import('../transcoding/types/index.ts').MediaEngine | undefined, number | undefined], ArrayBuffer>;
|
|
123
|
+
/**
|
|
124
|
+
* Legacy getter for video asset task (maps to videoBufferTask)
|
|
125
|
+
*/
|
|
126
|
+
get videoAssetTask(): Task<readonly [number], import('./EFMedia/videoTasks/makeVideoBufferTask.ts').VideoBufferState>;
|
|
127
|
+
/**
|
|
128
|
+
* Clean up resources when component is disconnected
|
|
129
|
+
*/
|
|
130
|
+
disconnectedCallback(): void;
|
|
12
131
|
}
|
|
13
132
|
declare global {
|
|
14
133
|
interface HTMLElementTagNameMap {
|
package/dist/elements/EFVideo.js
CHANGED
|
@@ -1,112 +1,34 @@
|
|
|
1
|
+
import { EFMedia } from "./EFMedia.js";
|
|
2
|
+
import { TWMixin } from "../gui/TWMixin2.js";
|
|
3
|
+
import { DelayedLoadingState } from "../DelayedLoadingState.js";
|
|
4
|
+
import { makeVideoBufferTask } from "./EFMedia/videoTasks/makeVideoBufferTask.js";
|
|
5
|
+
import { makeVideoInitSegmentFetchTask } from "./EFMedia/videoTasks/makeVideoInitSegmentFetchTask.js";
|
|
6
|
+
import { makeVideoInputTask } from "./EFMedia/videoTasks/makeVideoInputTask.js";
|
|
7
|
+
import { makeVideoSeekTask } from "./EFMedia/videoTasks/makeVideoSeekTask.js";
|
|
8
|
+
import { makeVideoSegmentFetchTask } from "./EFMedia/videoTasks/makeVideoSegmentFetchTask.js";
|
|
9
|
+
import { makeVideoSegmentIdTask } from "./EFMedia/videoTasks/makeVideoSegmentIdTask.js";
|
|
1
10
|
import { Task } from "@lit/task";
|
|
11
|
+
import debug from "debug";
|
|
2
12
|
import { css, html } from "lit";
|
|
3
|
-
import { customElement } from "lit/decorators.js";
|
|
13
|
+
import { customElement, property, state } from "lit/decorators.js";
|
|
14
|
+
import _decorate from "@oxc-project/runtime/helpers/decorate";
|
|
4
15
|
import { createRef, ref } from "lit/directives/ref.js";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
19
|
-
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), member.get(obj));
|
|
20
|
-
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
21
|
-
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
|
|
22
|
-
var _decoderLock;
|
|
23
|
-
let EFVideo = class extends TWMixin(EFMedia) {
|
|
24
|
-
constructor() {
|
|
25
|
-
super(...arguments);
|
|
26
|
-
this.canvasRef = createRef();
|
|
27
|
-
__privateAdd(this, _decoderLock, false);
|
|
28
|
-
this.frameTask = new Task(this, {
|
|
29
|
-
args: () => [
|
|
30
|
-
this.trackFragmentIndexLoader.status,
|
|
31
|
-
this.initSegmentsLoader.status,
|
|
32
|
-
this.seekTask.status,
|
|
33
|
-
this.fetchSeekTask.status,
|
|
34
|
-
this.videoAssetTask.status,
|
|
35
|
-
this.paintTask.status
|
|
36
|
-
],
|
|
37
|
-
task: async () => {
|
|
38
|
-
await this.trackFragmentIndexLoader.taskComplete;
|
|
39
|
-
await this.initSegmentsLoader.taskComplete;
|
|
40
|
-
await this.seekTask.taskComplete;
|
|
41
|
-
await this.fetchSeekTask.taskComplete;
|
|
42
|
-
await this.videoAssetTask.taskComplete;
|
|
43
|
-
await this.paintTask.taskComplete;
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
this.paintTask = new Task(this, {
|
|
47
|
-
args: () => [this.videoAssetTask.value, this.desiredSeekTimeMs],
|
|
48
|
-
task: async ([videoAsset, seekToMs], {
|
|
49
|
-
signal: _signal
|
|
50
|
-
}) => {
|
|
51
|
-
if (!videoAsset) {
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
if (__privateGet(this, _decoderLock)) {
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
try {
|
|
58
|
-
__privateSet(this, _decoderLock, true);
|
|
59
|
-
const frame = await videoAsset.seekToTime(seekToMs / 1e3);
|
|
60
|
-
if (!this.canvasElement) {
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
const ctx = this.canvasElement.getContext("2d");
|
|
64
|
-
if (!(frame && ctx)) {
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
if (frame?.codedWidth && frame?.codedHeight) {
|
|
68
|
-
if (this.canvasElement.width !== frame.codedWidth || this.canvasElement.height !== frame.codedHeight) {
|
|
69
|
-
this.canvasElement.width = frame.codedWidth;
|
|
70
|
-
this.canvasElement.height = frame.codedHeight;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
if (frame.format === null) {
|
|
74
|
-
console.warn("Frame format is null", frame);
|
|
75
|
-
return seekToMs;
|
|
76
|
-
}
|
|
77
|
-
ctx.drawImage(
|
|
78
|
-
frame,
|
|
79
|
-
0,
|
|
80
|
-
0,
|
|
81
|
-
this.canvasElement.width,
|
|
82
|
-
this.canvasElement.height
|
|
83
|
-
);
|
|
84
|
-
return seekToMs;
|
|
85
|
-
} catch (error) {
|
|
86
|
-
console.trace("Unexpected error while seeking video", error);
|
|
87
|
-
} finally {
|
|
88
|
-
__privateSet(this, _decoderLock, false);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
render() {
|
|
94
|
-
return html`
|
|
95
|
-
<canvas ${ref(this.canvasRef)}></canvas>
|
|
96
|
-
`;
|
|
97
|
-
}
|
|
98
|
-
get canvasElement() {
|
|
99
|
-
return this.canvasRef.value;
|
|
100
|
-
}
|
|
101
|
-
};
|
|
102
|
-
_decoderLock = /* @__PURE__ */ new WeakMap();
|
|
103
|
-
EFVideo.styles = [
|
|
104
|
-
/**
|
|
105
|
-
*
|
|
106
|
-
*/
|
|
107
|
-
css`
|
|
16
|
+
const log = debug("ef:elements:EFVideo");
|
|
17
|
+
let EFVideo = class EFVideo$1 extends TWMixin(EFMedia) {
|
|
18
|
+
static get observedAttributes() {
|
|
19
|
+
const parentAttributes = EFMedia.observedAttributes || [];
|
|
20
|
+
return [
|
|
21
|
+
...parentAttributes,
|
|
22
|
+
"video-buffer-duration",
|
|
23
|
+
"max-video-buffer-fetches",
|
|
24
|
+
"enable-video-buffering"
|
|
25
|
+
];
|
|
26
|
+
}
|
|
27
|
+
static {
|
|
28
|
+
this.styles = [css`
|
|
108
29
|
:host {
|
|
109
30
|
display: block;
|
|
31
|
+
position: relative;
|
|
110
32
|
}
|
|
111
33
|
canvas {
|
|
112
34
|
all: inherit;
|
|
@@ -121,11 +43,286 @@ EFVideo.styles = [
|
|
|
121
43
|
outline: none;
|
|
122
44
|
box-shadow: none;
|
|
123
45
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
46
|
+
.loading-overlay {
|
|
47
|
+
position: absolute;
|
|
48
|
+
top: 0;
|
|
49
|
+
left: 0;
|
|
50
|
+
right: 0;
|
|
51
|
+
bottom: 0;
|
|
52
|
+
background: rgba(0, 0, 0, 0.6);
|
|
53
|
+
display: flex;
|
|
54
|
+
align-items: center;
|
|
55
|
+
justify-content: center;
|
|
56
|
+
z-index: 10;
|
|
57
|
+
backdrop-filter: blur(2px);
|
|
58
|
+
}
|
|
59
|
+
.loading-content {
|
|
60
|
+
background: rgba(0, 0, 0, 0.8);
|
|
61
|
+
border-radius: 8px;
|
|
62
|
+
padding: 16px 24px;
|
|
63
|
+
display: flex;
|
|
64
|
+
align-items: center;
|
|
65
|
+
gap: 12px;
|
|
66
|
+
color: white;
|
|
67
|
+
font-size: 14px;
|
|
68
|
+
font-weight: 500;
|
|
69
|
+
}
|
|
70
|
+
.loading-spinner {
|
|
71
|
+
width: 20px;
|
|
72
|
+
height: 20px;
|
|
73
|
+
border: 2px solid rgba(255, 255, 255, 0.2);
|
|
74
|
+
border-left: 2px solid #fff;
|
|
75
|
+
border-radius: 50%;
|
|
76
|
+
animation: spin 1s linear infinite;
|
|
77
|
+
}
|
|
78
|
+
@keyframes spin {
|
|
79
|
+
0% { transform: rotate(0deg); }
|
|
80
|
+
100% { transform: rotate(360deg); }
|
|
81
|
+
}
|
|
82
|
+
.loading-message {
|
|
83
|
+
font-size: 12px;
|
|
84
|
+
opacity: 0.8;
|
|
85
|
+
}
|
|
86
|
+
`];
|
|
87
|
+
}
|
|
88
|
+
constructor() {
|
|
89
|
+
super();
|
|
90
|
+
this.canvasRef = createRef();
|
|
91
|
+
this.videoBufferDurationMs = 6e4;
|
|
92
|
+
this.maxVideoBufferFetches = 2;
|
|
93
|
+
this.enableVideoBuffering = true;
|
|
94
|
+
this.videoSegmentIdTask = makeVideoSegmentIdTask(this);
|
|
95
|
+
this.videoInitSegmentFetchTask = makeVideoInitSegmentFetchTask(this);
|
|
96
|
+
this.videoSegmentFetchTask = makeVideoSegmentFetchTask(this);
|
|
97
|
+
this.videoInputTask = makeVideoInputTask(this);
|
|
98
|
+
this.videoSeekTask = makeVideoSeekTask(this);
|
|
99
|
+
this.videoBufferTask = makeVideoBufferTask(this);
|
|
100
|
+
this.loadingState = {
|
|
101
|
+
isLoading: false,
|
|
102
|
+
operation: null,
|
|
103
|
+
message: ""
|
|
104
|
+
};
|
|
105
|
+
this.frameTask = new Task(this, {
|
|
106
|
+
args: () => [this.desiredSeekTimeMs],
|
|
107
|
+
onError: (error) => {
|
|
108
|
+
console.error("frameTask error", error);
|
|
109
|
+
},
|
|
110
|
+
onComplete: () => {},
|
|
111
|
+
task: async ([_desiredSeekTimeMs], { signal }) => {
|
|
112
|
+
await this.videoSeekTask.taskComplete;
|
|
113
|
+
await this.paintTask.taskComplete;
|
|
114
|
+
if (signal.aborted) return;
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
this.paintTask = new Task(this, {
|
|
118
|
+
args: () => [this.desiredSeekTimeMs],
|
|
119
|
+
onError: (error) => {
|
|
120
|
+
console.error("paintTask error", error);
|
|
121
|
+
},
|
|
122
|
+
onComplete: () => {},
|
|
123
|
+
task: async ([_seekToMs], { signal }) => {
|
|
124
|
+
await this.videoSeekTask.taskComplete;
|
|
125
|
+
const isProductionRendering = this.isInProductionRenderingMode();
|
|
126
|
+
const sample = this.videoSeekTask.value;
|
|
127
|
+
if (sample) {
|
|
128
|
+
const videoFrame = sample.toVideoFrame();
|
|
129
|
+
this.displayFrame(videoFrame, _seekToMs);
|
|
130
|
+
videoFrame.close();
|
|
131
|
+
}
|
|
132
|
+
if (!isProductionRendering) {
|
|
133
|
+
if (!this.rootTimegroup || this.rootTimegroup.currentTimeMs === 0 && this.desiredSeekTimeMs === 0) return;
|
|
134
|
+
} else {
|
|
135
|
+
if (!this.rootTimegroup) return;
|
|
136
|
+
if (!this.isFrameRenderingActive()) return;
|
|
137
|
+
}
|
|
138
|
+
if (signal.aborted) return;
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
this.delayedLoadingState = new DelayedLoadingState(250, (isLoading, message) => {
|
|
142
|
+
this.setLoadingState(isLoading, null, message);
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
render() {
|
|
146
|
+
return html`
|
|
147
|
+
<canvas ${ref(this.canvasRef)}></canvas>
|
|
148
|
+
${this.loadingState.isLoading ? html`
|
|
149
|
+
<div class="loading-overlay">
|
|
150
|
+
<div class="loading-content">
|
|
151
|
+
<div class="loading-spinner"></div>
|
|
152
|
+
<div>
|
|
153
|
+
<div>Loading Video...</div>
|
|
154
|
+
<div class="loading-message">${this.loadingState.message}</div>
|
|
155
|
+
</div>
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
` : ""}
|
|
159
|
+
`;
|
|
160
|
+
}
|
|
161
|
+
get canvasElement() {
|
|
162
|
+
return this.canvasRef.value;
|
|
163
|
+
}
|
|
164
|
+
updated(changedProperties) {
|
|
165
|
+
super.updated(changedProperties);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Start a delayed loading operation for testing
|
|
169
|
+
*/
|
|
170
|
+
startDelayedLoading(operationId, message, options = {}) {
|
|
171
|
+
this.delayedLoadingState.startLoading(operationId, message, options);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Clear a delayed loading operation for testing
|
|
175
|
+
*/
|
|
176
|
+
clearDelayedLoading(operationId) {
|
|
177
|
+
this.delayedLoadingState.clearLoading(operationId);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Set loading state for user feedback
|
|
181
|
+
*/
|
|
182
|
+
setLoadingState(isLoading, operation = null, message = "") {
|
|
183
|
+
this.loadingState = {
|
|
184
|
+
isLoading,
|
|
185
|
+
operation,
|
|
186
|
+
message
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Display a video frame on the canvas
|
|
191
|
+
*/
|
|
192
|
+
displayFrame(frame, seekToMs) {
|
|
193
|
+
log("trace: displayFrame start", {
|
|
194
|
+
seekToMs,
|
|
195
|
+
frameFormat: frame.format
|
|
196
|
+
});
|
|
197
|
+
if (!this.canvasElement) {
|
|
198
|
+
log("trace: displayFrame aborted - no canvas element");
|
|
199
|
+
throw new Error(`Frame display failed: Canvas element is not available at time ${seekToMs}ms. The video component may not be properly initialized.`);
|
|
200
|
+
}
|
|
201
|
+
const ctx = this.canvasElement.getContext("2d");
|
|
202
|
+
if (!ctx) {
|
|
203
|
+
log("trace: displayFrame aborted - no canvas context");
|
|
204
|
+
throw new Error(`Frame display failed: Unable to get 2D canvas context at time ${seekToMs}ms. This may indicate a browser compatibility issue or canvas corruption.`);
|
|
205
|
+
}
|
|
206
|
+
if (frame?.codedWidth && frame?.codedHeight) {
|
|
207
|
+
if (this.canvasElement.width !== frame.codedWidth || this.canvasElement.height !== frame.codedHeight) {
|
|
208
|
+
log("trace: updating canvas dimensions", {
|
|
209
|
+
width: frame.codedWidth,
|
|
210
|
+
height: frame.codedHeight
|
|
211
|
+
});
|
|
212
|
+
this.canvasElement.width = frame.codedWidth;
|
|
213
|
+
this.canvasElement.height = frame.codedHeight;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
if (frame.format === null) {
|
|
217
|
+
log("trace: displayFrame aborted - null frame format");
|
|
218
|
+
throw new Error(`Frame display failed: Video frame has null format at time ${seekToMs}ms. This indicates corrupted or incompatible video data.`);
|
|
219
|
+
}
|
|
220
|
+
log("trace: drawing frame to canvas", frame.timestamp / 1e3);
|
|
221
|
+
ctx.drawImage(frame, 0, 0, this.canvasElement.width, this.canvasElement.height);
|
|
222
|
+
log("trace: frame drawn to canvas", { seekToMs });
|
|
223
|
+
return seekToMs;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Check if we're in production rendering mode (EF_FRAMEGEN active) vs preview mode
|
|
227
|
+
*/
|
|
228
|
+
isInProductionRenderingMode() {
|
|
229
|
+
if (typeof window.EF_RENDERING === "function") return window.EF_RENDERING();
|
|
230
|
+
const workbench = document.querySelector("ef-workbench");
|
|
231
|
+
if (workbench?.rendering) return true;
|
|
232
|
+
if (window.EF_FRAMEGEN?.renderOptions) return true;
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Check if EF_FRAMEGEN has explicitly started frame rendering (not just initialization)
|
|
237
|
+
*/
|
|
238
|
+
isFrameRenderingActive() {
|
|
239
|
+
if (!window.EF_FRAMEGEN?.renderOptions) return false;
|
|
240
|
+
const renderOptions = window.EF_FRAMEGEN.renderOptions;
|
|
241
|
+
const renderStartTime = renderOptions.encoderOptions.fromMs;
|
|
242
|
+
const currentTime = this.rootTimegroup?.currentTimeMs || 0;
|
|
243
|
+
return currentTime >= renderStartTime;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Get scrub track performance statistics
|
|
247
|
+
*/
|
|
248
|
+
getScrubTrackStats() {
|
|
249
|
+
return this.scrubTrackManager?.getCacheStats() || null;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Effective mode - always returns "asset" for EFVideo
|
|
253
|
+
*/
|
|
254
|
+
get effectiveMode() {
|
|
255
|
+
return "asset";
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Legacy getter for asset index loader (maps to mediaEngine task)
|
|
259
|
+
*/
|
|
260
|
+
get assetIndexLoader() {
|
|
261
|
+
return this.mediaEngineTask;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Legacy getter for fragment index task (maps to videoSegmentIdTask)
|
|
265
|
+
*/
|
|
266
|
+
get fragmentIndexTask() {
|
|
267
|
+
return this.videoSegmentIdTask;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Legacy getter for seek task (maps to videoSeekTask)
|
|
271
|
+
*/
|
|
272
|
+
get seekTask() {
|
|
273
|
+
return this.videoSeekTask;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Legacy getter for media segments task (maps to videoSegmentFetchTask)
|
|
277
|
+
*/
|
|
278
|
+
get mediaSegmentsTask() {
|
|
279
|
+
return this.videoSegmentFetchTask;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Legacy getter for asset segment keys task (maps to videoSegmentIdTask)
|
|
283
|
+
*/
|
|
284
|
+
get assetSegmentKeysTask() {
|
|
285
|
+
return this.videoSegmentIdTask;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Legacy getter for asset init segments task (maps to videoInitSegmentFetchTask)
|
|
289
|
+
*/
|
|
290
|
+
get assetInitSegmentsTask() {
|
|
291
|
+
return this.videoInitSegmentFetchTask;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Legacy getter for asset segment loader (maps to videoSegmentFetchTask)
|
|
295
|
+
*/
|
|
296
|
+
get assetSegmentLoader() {
|
|
297
|
+
return this.videoSegmentFetchTask;
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Legacy getter for video asset task (maps to videoBufferTask)
|
|
301
|
+
*/
|
|
302
|
+
get videoAssetTask() {
|
|
303
|
+
return this.videoBufferTask;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Clean up resources when component is disconnected
|
|
307
|
+
*/
|
|
308
|
+
disconnectedCallback() {
|
|
309
|
+
super.disconnectedCallback();
|
|
310
|
+
this.scrubTrackManager?.cleanup();
|
|
311
|
+
this.delayedLoadingState.clearAllLoading();
|
|
312
|
+
}
|
|
131
313
|
};
|
|
314
|
+
_decorate([property({
|
|
315
|
+
type: Number,
|
|
316
|
+
attribute: "video-buffer-duration"
|
|
317
|
+
})], EFVideo.prototype, "videoBufferDurationMs", void 0);
|
|
318
|
+
_decorate([property({
|
|
319
|
+
type: Number,
|
|
320
|
+
attribute: "max-video-buffer-fetches"
|
|
321
|
+
})], EFVideo.prototype, "maxVideoBufferFetches", void 0);
|
|
322
|
+
_decorate([property({
|
|
323
|
+
type: Boolean,
|
|
324
|
+
attribute: "enable-video-buffering"
|
|
325
|
+
})], EFVideo.prototype, "enableVideoBuffering", void 0);
|
|
326
|
+
_decorate([state()], EFVideo.prototype, "loadingState", void 0);
|
|
327
|
+
EFVideo = _decorate([customElement("ef-video")], EFVideo);
|
|
328
|
+
export { EFVideo };
|