@editframe/elements 0.17.6-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.
Files changed (218) hide show
  1. package/dist/EF_FRAMEGEN.js +1 -1
  2. package/dist/ScrubTrackManager.d.ts +2 -2
  3. package/dist/elements/EFAudio.d.ts +21 -2
  4. package/dist/elements/EFAudio.js +41 -11
  5. package/dist/elements/EFImage.d.ts +1 -0
  6. package/dist/elements/EFImage.js +11 -3
  7. package/dist/elements/EFMedia/AssetIdMediaEngine.d.ts +18 -0
  8. package/dist/elements/EFMedia/AssetIdMediaEngine.js +41 -0
  9. package/dist/elements/EFMedia/AssetMediaEngine.d.ts +47 -0
  10. package/dist/elements/EFMedia/AssetMediaEngine.js +116 -0
  11. package/dist/elements/EFMedia/BaseMediaEngine.d.ts +55 -0
  12. package/dist/elements/EFMedia/BaseMediaEngine.js +96 -0
  13. package/dist/elements/EFMedia/BufferedSeekingInput.d.ts +43 -0
  14. package/dist/elements/EFMedia/BufferedSeekingInput.js +159 -0
  15. package/dist/elements/EFMedia/JitMediaEngine.browsertest.d.ts +0 -0
  16. package/dist/elements/EFMedia/JitMediaEngine.d.ts +31 -0
  17. package/dist/elements/EFMedia/JitMediaEngine.js +62 -0
  18. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.browsertest.d.ts +9 -0
  19. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.d.ts +16 -0
  20. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.js +48 -0
  21. package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.d.ts +3 -0
  22. package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.js +138 -0
  23. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.browsertest.d.ts +9 -0
  24. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.d.ts +4 -0
  25. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.js +16 -0
  26. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.browsertest.d.ts +9 -0
  27. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.d.ts +3 -0
  28. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.js +22 -0
  29. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.d.ts +7 -0
  30. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js +24 -0
  31. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.d.ts +4 -0
  32. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.js +18 -0
  33. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.d.ts +4 -0
  34. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.js +16 -0
  35. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.d.ts +3 -0
  36. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js +104 -0
  37. package/dist/elements/EFMedia/services/AudioElementFactory.d.ts +22 -0
  38. package/dist/elements/EFMedia/services/AudioElementFactory.js +72 -0
  39. package/dist/elements/EFMedia/services/MediaSourceService.browsertest.d.ts +1 -0
  40. package/dist/elements/EFMedia/services/MediaSourceService.d.ts +47 -0
  41. package/dist/elements/EFMedia/services/MediaSourceService.js +73 -0
  42. package/dist/elements/EFMedia/shared/AudioSpanUtils.d.ts +7 -0
  43. package/dist/elements/EFMedia/shared/AudioSpanUtils.js +54 -0
  44. package/dist/elements/EFMedia/shared/BufferUtils.d.ts +70 -0
  45. package/dist/elements/EFMedia/shared/BufferUtils.js +89 -0
  46. package/dist/elements/EFMedia/shared/MediaTaskUtils.d.ts +23 -0
  47. package/dist/elements/EFMedia/shared/RenditionHelpers.browsertest.d.ts +1 -0
  48. package/dist/elements/EFMedia/shared/RenditionHelpers.d.ts +19 -0
  49. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.browsertest.d.ts +1 -0
  50. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.d.ts +18 -0
  51. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.js +60 -0
  52. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.test.d.ts +1 -0
  53. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.browsertest.d.ts +9 -0
  54. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.d.ts +16 -0
  55. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.js +46 -0
  56. package/dist/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.browsertest.d.ts +9 -0
  57. package/dist/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.d.ts +4 -0
  58. package/dist/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.js +16 -0
  59. package/dist/elements/EFMedia/videoTasks/makeVideoInputTask.browsertest.d.ts +9 -0
  60. package/dist/elements/EFMedia/videoTasks/makeVideoInputTask.d.ts +3 -0
  61. package/dist/elements/EFMedia/videoTasks/makeVideoInputTask.js +27 -0
  62. package/dist/elements/EFMedia/videoTasks/makeVideoSeekTask.d.ts +7 -0
  63. package/dist/elements/EFMedia/videoTasks/makeVideoSeekTask.js +25 -0
  64. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.browsertest.d.ts +9 -0
  65. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.d.ts +4 -0
  66. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.js +18 -0
  67. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.browsertest.d.ts +9 -0
  68. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.d.ts +4 -0
  69. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.js +16 -0
  70. package/dist/elements/EFMedia.browsertest.d.ts +1 -0
  71. package/dist/elements/EFMedia.d.ts +75 -111
  72. package/dist/elements/EFMedia.js +141 -1111
  73. package/dist/elements/EFTemporal.d.ts +1 -1
  74. package/dist/elements/EFTemporal.js +1 -1
  75. package/dist/elements/EFTimegroup.d.ts +11 -0
  76. package/dist/elements/EFTimegroup.js +88 -13
  77. package/dist/elements/EFVideo.d.ts +60 -29
  78. package/dist/elements/EFVideo.js +103 -203
  79. package/dist/elements/EFWaveform.js +2 -2
  80. package/dist/elements/SampleBuffer.d.ts +14 -0
  81. package/dist/elements/SampleBuffer.js +52 -0
  82. package/dist/getRenderInfo.d.ts +2 -2
  83. package/dist/getRenderInfo.js +2 -1
  84. package/dist/gui/ContextMixin.js +17 -70
  85. package/dist/gui/EFFilmstrip.d.ts +3 -3
  86. package/dist/gui/EFFilmstrip.js +1 -1
  87. package/dist/gui/EFFitScale.d.ts +2 -2
  88. package/dist/gui/TWMixin.js +1 -1
  89. package/dist/gui/services/ElementConnectionManager.browsertest.d.ts +1 -0
  90. package/dist/gui/services/ElementConnectionManager.d.ts +59 -0
  91. package/dist/gui/services/ElementConnectionManager.js +128 -0
  92. package/dist/gui/services/PlaybackController.browsertest.d.ts +1 -0
  93. package/dist/gui/services/PlaybackController.d.ts +103 -0
  94. package/dist/gui/services/PlaybackController.js +290 -0
  95. package/dist/services/MediaSourceManager.d.ts +62 -0
  96. package/dist/services/MediaSourceManager.js +211 -0
  97. package/dist/style.css +1 -1
  98. package/dist/transcoding/cache/CacheManager.d.ts +73 -0
  99. package/dist/transcoding/cache/RequestDeduplicator.d.ts +29 -0
  100. package/dist/transcoding/cache/RequestDeduplicator.js +53 -0
  101. package/dist/transcoding/cache/RequestDeduplicator.test.d.ts +1 -0
  102. package/dist/transcoding/types/index.d.ts +242 -0
  103. package/dist/transcoding/utils/MediaUtils.d.ts +9 -0
  104. package/dist/transcoding/utils/UrlGenerator.d.ts +26 -0
  105. package/dist/transcoding/utils/UrlGenerator.js +45 -0
  106. package/dist/transcoding/utils/constants.d.ts +27 -0
  107. package/dist/utils/LRUCache.d.ts +34 -0
  108. package/dist/utils/LRUCache.js +115 -0
  109. package/package.json +3 -2
  110. package/src/elements/EFAudio.browsertest.ts +183 -43
  111. package/src/elements/EFAudio.ts +59 -13
  112. package/src/elements/EFImage.browsertest.ts +42 -0
  113. package/src/elements/EFImage.ts +23 -3
  114. package/src/elements/EFMedia/AssetIdMediaEngine.test.ts +222 -0
  115. package/src/elements/EFMedia/AssetIdMediaEngine.ts +70 -0
  116. package/src/elements/EFMedia/AssetMediaEngine.ts +210 -0
  117. package/src/elements/EFMedia/BaseMediaEngine.test.ts +164 -0
  118. package/src/elements/EFMedia/BaseMediaEngine.ts +170 -0
  119. package/src/elements/EFMedia/BufferedSeekingInput.browsertest.ts +400 -0
  120. package/src/elements/EFMedia/BufferedSeekingInput.ts +267 -0
  121. package/src/elements/EFMedia/JitMediaEngine.browsertest.ts +165 -0
  122. package/src/elements/EFMedia/JitMediaEngine.ts +110 -0
  123. package/src/elements/EFMedia/audioTasks/makeAudioBufferTask.browsertest.ts +554 -0
  124. package/src/elements/EFMedia/audioTasks/makeAudioBufferTask.ts +81 -0
  125. package/src/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.ts +241 -0
  126. package/src/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.browsertest.ts +59 -0
  127. package/src/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.ts +23 -0
  128. package/src/elements/EFMedia/audioTasks/makeAudioInputTask.browsertest.ts +55 -0
  129. package/src/elements/EFMedia/audioTasks/makeAudioInputTask.ts +35 -0
  130. package/src/elements/EFMedia/audioTasks/makeAudioSeekTask.ts +42 -0
  131. package/src/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.ts +34 -0
  132. package/src/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.ts +23 -0
  133. package/src/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.ts +174 -0
  134. package/src/elements/EFMedia/services/AudioElementFactory.browsertest.ts +325 -0
  135. package/src/elements/EFMedia/services/AudioElementFactory.ts +119 -0
  136. package/src/elements/EFMedia/services/MediaSourceService.browsertest.ts +257 -0
  137. package/src/elements/EFMedia/services/MediaSourceService.ts +102 -0
  138. package/src/elements/EFMedia/shared/AudioSpanUtils.ts +128 -0
  139. package/src/elements/EFMedia/shared/BufferUtils.ts +310 -0
  140. package/src/elements/EFMedia/shared/MediaTaskUtils.ts +44 -0
  141. package/src/elements/EFMedia/shared/RenditionHelpers.browsertest.ts +247 -0
  142. package/src/elements/EFMedia/shared/RenditionHelpers.ts +79 -0
  143. package/src/elements/EFMedia/tasks/makeMediaEngineTask.browsertest.ts +128 -0
  144. package/src/elements/EFMedia/tasks/makeMediaEngineTask.test.ts +233 -0
  145. package/src/elements/EFMedia/tasks/makeMediaEngineTask.ts +89 -0
  146. package/src/elements/EFMedia/videoTasks/makeVideoBufferTask.browsertest.ts +555 -0
  147. package/src/elements/EFMedia/videoTasks/makeVideoBufferTask.ts +79 -0
  148. package/src/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.browsertest.ts +59 -0
  149. package/src/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.ts +23 -0
  150. package/src/elements/EFMedia/videoTasks/makeVideoInputTask.browsertest.ts +55 -0
  151. package/src/elements/EFMedia/videoTasks/makeVideoInputTask.ts +45 -0
  152. package/src/elements/EFMedia/videoTasks/makeVideoSeekTask.ts +44 -0
  153. package/src/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.browsertest.ts +57 -0
  154. package/src/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.ts +32 -0
  155. package/src/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.browsertest.ts +56 -0
  156. package/src/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.ts +23 -0
  157. package/src/elements/EFMedia.browsertest.ts +658 -265
  158. package/src/elements/EFMedia.ts +173 -1763
  159. package/src/elements/EFTemporal.ts +3 -4
  160. package/src/elements/EFTimegroup.browsertest.ts +6 -3
  161. package/src/elements/EFTimegroup.ts +152 -21
  162. package/src/elements/EFVideo.browsertest.ts +115 -37
  163. package/src/elements/EFVideo.ts +123 -452
  164. package/src/elements/EFWaveform.ts +1 -1
  165. package/src/elements/MediaController.ts +2 -12
  166. package/src/elements/SampleBuffer.ts +97 -0
  167. package/src/gui/ContextMixin.ts +23 -104
  168. package/src/gui/services/ElementConnectionManager.browsertest.ts +263 -0
  169. package/src/gui/services/ElementConnectionManager.ts +224 -0
  170. package/src/gui/services/PlaybackController.browsertest.ts +437 -0
  171. package/src/gui/services/PlaybackController.ts +521 -0
  172. package/src/services/MediaSourceManager.ts +333 -0
  173. package/src/transcoding/cache/CacheManager.ts +208 -0
  174. package/src/transcoding/cache/RequestDeduplicator.test.ts +170 -0
  175. package/src/transcoding/cache/RequestDeduplicator.ts +65 -0
  176. package/src/transcoding/types/index.ts +265 -0
  177. package/src/transcoding/utils/MediaUtils.ts +63 -0
  178. package/src/transcoding/utils/UrlGenerator.ts +68 -0
  179. package/src/transcoding/utils/constants.ts +36 -0
  180. package/src/utils/LRUCache.ts +153 -0
  181. package/test/EFVideo.framegen.browsertest.ts +38 -29
  182. 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
  183. 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
  184. 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
  185. 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
  186. 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
  187. 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
  188. 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
  189. 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
  190. 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
  191. 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
  192. 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
  193. 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
  194. 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
  195. 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
  196. 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
  197. 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
  198. 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
  199. 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
  200. 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
  201. 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
  202. package/test/__cache__/GET__api_v1_transcode_manifest_json_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__3be92a0437de726b431ed5af2369158a/data.bin +1 -0
  203. package/test/__cache__/GET__api_v1_transcode_manifest_json_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__3be92a0437de726b431ed5af2369158a/metadata.json +19 -0
  204. package/test/createJitTestClips.ts +320 -188
  205. package/test/recordReplayProxyPlugin.js +302 -0
  206. package/test/useAssetMSW.ts +1 -1
  207. package/test/useMSW.ts +35 -22
  208. package/types.json +1 -1
  209. package/dist/JitTranscodingClient.d.ts +0 -167
  210. package/dist/JitTranscodingClient.js +0 -373
  211. package/dist/ScrubTrackManager.js +0 -216
  212. package/dist/elements/printTaskStatus.js +0 -11
  213. package/src/elements/__screenshots__/EFMedia.browsertest.ts/EFMedia-JIT-audio-playback-audioBufferTask-should-work-in-JIT-mode-without-URL-errors-1.png +0 -0
  214. package/test/EFVideo.frame-tasks.browsertest.ts +0 -524
  215. /package/dist/{JitTranscodingClient.browsertest.d.ts → elements/EFMedia/AssetIdMediaEngine.test.d.ts} +0 -0
  216. /package/dist/{JitTranscodingClient.test.d.ts → elements/EFMedia/BaseMediaEngine.test.d.ts} +0 -0
  217. /package/dist/{ScrubTrackIntegration.test.d.ts → elements/EFMedia/BufferedSeekingInput.browsertest.d.ts} +0 -0
  218. /package/dist/{SegmentSwitchLoading.test.d.ts → elements/EFMedia/services/AudioElementFactory.browsertest.d.ts} +0 -0
@@ -1,6 +1,6 @@
1
+ import { Task } from '@lit/task';
1
2
  import { LitElement, ReactiveController } from 'lit';
2
3
  import { EFTimegroup } from './EFTimegroup.js';
3
- import { Task } from '@lit/task';
4
4
  export declare const timegroupContext: {
5
5
  __context__: EFTimegroup;
6
6
  };
@@ -190,7 +190,7 @@ const EFTemporal = (superClass) => {
190
190
  }
191
191
  const previous = siblingTemorals?.[(ownIndex ?? 0) - 1];
192
192
  if (!previous) {
193
- console.log("Previous temporal element not found", {
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
- this.#currentTime = Math.max(0, Math.min(time, this.durationMs / 1e3));
56
- try {
57
- if (this.id) {
58
- if (this.isConnected) localStorage.setItem(this.storageKey, time.toString());
59
- }
60
- } catch (error) {
61
- log("Failed to save time to localStorage", error);
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.fragmentIndexTask.taskComplete));
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 || mediaElement.defaultAudioTrackId === void 0) return;
221
- const audio = await mediaElement.fetchAudioSpanningTime(fromMs, toMs);
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 offset = Math.max(0, fromMs - mediaElement.startTimeMs) - audio.startMs;
230
- bufferSource.start(ctxStartMs / 1e3, offset / 1e3, ctxDurationMs / 1e3);
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 contextSize = Math.round(48e3 * durationMs / 1e3);
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,29 @@ 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
+ try {
305
+ const renderedBuffer = await this.renderAudio(fromMs, toMs);
306
+ const playbackContext = new AudioContext();
307
+ const bufferSource = playbackContext.createBufferSource();
308
+ bufferSource.buffer = renderedBuffer;
309
+ bufferSource.connect(playbackContext.destination);
310
+ bufferSource.start(0);
311
+ return new Promise((resolve) => {
312
+ bufferSource.onended = () => {
313
+ playbackContext.close();
314
+ resolve();
315
+ };
316
+ });
317
+ } catch (error) {
318
+ console.error("🎵 [TEST_PLAY_AUDIO] Error:", error);
319
+ throw error;
320
+ }
321
+ }
247
322
  async loadMd5Sums() {
248
323
  const efElements = this.efElements;
249
324
  const loaderTasks = [];
@@ -1,4 +1,3 @@
1
- import { VideoAsset } from '../../../assets/src/EncodedAsset.ts';
2
1
  import { Task } from '@lit/task';
3
2
  import { PropertyValueMap } from 'lit';
4
3
  import { CacheStats, ScrubTrackManager } from '../ScrubTrackManager.js';
@@ -13,17 +12,34 @@ interface LoadingState {
13
12
  }
14
13
  declare const EFVideo_base: typeof EFMedia;
15
14
  export declare class EFVideo extends EFVideo_base {
16
- #private;
15
+ static get observedAttributes(): string[];
17
16
  static styles: import('lit').CSSResult[];
18
- canvasRef: import('lit-html/directives/ref.js').Ref<HTMLCanvasElement>;
17
+ canvasRef: import('lit-html/directives/ref').Ref<HTMLCanvasElement>;
19
18
  /**
20
- * Scrub track manager for fast timeline navigation
19
+ * Duration in milliseconds for video buffering ahead of current time
20
+ * @domAttribute "video-buffer-duration"
21
21
  */
22
- scrubTrackManager?: ScrubTrackManager;
22
+ videoBufferDurationMs: number;
23
+ /**
24
+ * Maximum number of concurrent video segment fetches for buffering
25
+ * @domAttribute "max-video-buffer-fetches"
26
+ */
27
+ maxVideoBufferFetches: number;
23
28
  /**
24
- * Track last seek time for fast seeking detection
29
+ * Enable/disable video buffering system
30
+ * @domAttribute "enable-video-buffering"
25
31
  */
26
- private lastSeekTimeMs;
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;
27
43
  /**
28
44
  * Delayed loading state manager for user feedback
29
45
  */
@@ -40,23 +56,7 @@ export declare class EFVideo extends EFVideo_base {
40
56
  render(): import('lit-html').TemplateResult<1>;
41
57
  get canvasElement(): HTMLCanvasElement | undefined;
42
58
  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
59
  protected updated(changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void;
56
- /**
57
- * Initialize scrub track manager if needed
58
- */
59
- private initializeScrubTrackManager;
60
60
  /**
61
61
  * Start a delayed loading operation for testing
62
62
  */
@@ -71,12 +71,7 @@ export declare class EFVideo extends EFVideo_base {
71
71
  * Set loading state for user feedback
72
72
  */
73
73
  private setLoadingState;
74
- videoAssetTask: Task<readonly ["asset" | "jit-transcode", Record<string, File> | null | undefined], VideoAsset | undefined>;
75
- paintTask: Task<readonly [number], number | undefined>;
76
- /**
77
- * Render normal video using existing logic
78
- */
79
- private renderNormalVideo;
74
+ paintTask: Task<readonly [number], void>;
80
75
  /**
81
76
  * Display a video frame on the canvas
82
77
  */
@@ -93,6 +88,42 @@ export declare class EFVideo extends EFVideo_base {
93
88
  * Get scrub track performance statistics
94
89
  */
95
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>;
96
127
  /**
97
128
  * Clean up resources when component is disconnected
98
129
  */