@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
@@ -0,0 +1,159 @@
1
+ import { SampleBuffer } from "../SampleBuffer.js";
2
+ import { AudioSampleSink, BufferSource, Input, MP4, VideoSampleSink } from "mediabunny";
3
+ const defaultOptions = {
4
+ videoBufferSize: 30,
5
+ audioBufferSize: 100,
6
+ startTimeOffsetMs: 0
7
+ };
8
+ var NoSample = class extends RangeError {};
9
+ var BufferedSeekingInput = class {
10
+ constructor(arrayBuffer, options) {
11
+ this.trackIterators = /* @__PURE__ */ new Map();
12
+ this.trackBuffers = /* @__PURE__ */ new Map();
13
+ this.trackIteratorCreationPromises = /* @__PURE__ */ new Map();
14
+ this.trackSeekPromises = /* @__PURE__ */ new Map();
15
+ const bufferSource = new BufferSource(arrayBuffer);
16
+ const input = new Input({
17
+ source: bufferSource,
18
+ formats: [MP4]
19
+ });
20
+ this.input = input;
21
+ this.options = {
22
+ ...defaultOptions,
23
+ ...options
24
+ };
25
+ this.startTimeOffsetMs = this.options.startTimeOffsetMs ?? 0;
26
+ }
27
+ getBufferSize(trackId) {
28
+ const buffer = this.trackBuffers.get(trackId);
29
+ return buffer ? buffer.length : 0;
30
+ }
31
+ getBufferContents(trackId) {
32
+ const buffer = this.trackBuffers.get(trackId);
33
+ return buffer ? Object.freeze([...buffer.getContents()]) : [];
34
+ }
35
+ getBufferTimestamps(trackId) {
36
+ const contents = this.getBufferContents(trackId);
37
+ return contents.map((sample) => sample.timestamp || 0);
38
+ }
39
+ clearBuffer(trackId) {
40
+ const buffer = this.trackBuffers.get(trackId);
41
+ if (buffer) buffer.clear();
42
+ }
43
+ computeDuration() {
44
+ return this.input.computeDuration();
45
+ }
46
+ async getTrack(trackId) {
47
+ const tracks = await this.input.getTracks();
48
+ const track = tracks.find((track$1) => track$1.id === trackId);
49
+ if (!track) throw new Error(`Track ${trackId} not found`);
50
+ return track;
51
+ }
52
+ async getAudioTrack(trackId) {
53
+ const tracks = await this.input.getAudioTracks();
54
+ const track = tracks.find((track$1) => track$1.id === trackId && track$1.type === "audio");
55
+ if (!track) throw new Error(`Track ${trackId} not found`);
56
+ return track;
57
+ }
58
+ async getVideoTrack(trackId) {
59
+ const tracks = await this.input.getVideoTracks();
60
+ const track = tracks.find((track$1) => track$1.id === trackId && track$1.type === "video");
61
+ if (!track) throw new Error(`Track ${trackId} not found`);
62
+ return track;
63
+ }
64
+ async getFirstVideoTrack() {
65
+ const tracks = await this.input.getVideoTracks();
66
+ return tracks[0];
67
+ }
68
+ async getFirstAudioTrack() {
69
+ const tracks = await this.input.getAudioTracks();
70
+ return tracks[0];
71
+ }
72
+ async getTrackIterator(trackId) {
73
+ if (this.trackIterators.has(trackId)) return this.trackIterators.get(trackId);
74
+ const existingIteratorCreation = this.trackIteratorCreationPromises.get(trackId);
75
+ if (existingIteratorCreation) {
76
+ await existingIteratorCreation;
77
+ if (this.trackIterators.has(trackId)) return this.trackIterators.get(trackId);
78
+ }
79
+ const creationPromise = this.createIteratorSafe(trackId);
80
+ this.trackIteratorCreationPromises.set(trackId, creationPromise);
81
+ try {
82
+ const iterator = await creationPromise;
83
+ return iterator;
84
+ } finally {
85
+ this.trackIteratorCreationPromises.delete(trackId);
86
+ }
87
+ }
88
+ async createIteratorSafe(trackId) {
89
+ const track = await this.getTrack(trackId);
90
+ if (track.type === "audio") {
91
+ const track$1 = await this.getAudioTrack(trackId);
92
+ const sampleSink = new AudioSampleSink(track$1);
93
+ const iterator = sampleSink.samples();
94
+ this.trackIterators.set(trackId, iterator);
95
+ return iterator;
96
+ }
97
+ {
98
+ const track$1 = await this.getVideoTrack(trackId);
99
+ const sampleSink = new VideoSampleSink(track$1);
100
+ const iterator = sampleSink.samples();
101
+ this.trackIterators.set(trackId, iterator);
102
+ return iterator;
103
+ }
104
+ }
105
+ async createTrackBuffer(trackId) {
106
+ const track = await this.getTrack(trackId);
107
+ if (track.type === "audio") {
108
+ const bufferSize = this.options.audioBufferSize;
109
+ this.trackBuffers.set(trackId, new SampleBuffer(bufferSize));
110
+ } else {
111
+ const bufferSize = this.options.videoBufferSize;
112
+ this.trackBuffers.set(trackId, new SampleBuffer(bufferSize));
113
+ }
114
+ }
115
+ async seek(trackId, timeMs) {
116
+ const correctedTimeMs = timeMs + this.startTimeOffsetMs;
117
+ const existingSeek = this.trackSeekPromises.get(trackId);
118
+ if (existingSeek) await existingSeek;
119
+ const seekPromise = this.seekSafe(trackId, correctedTimeMs);
120
+ this.trackSeekPromises.set(trackId, seekPromise);
121
+ try {
122
+ return await seekPromise;
123
+ } finally {
124
+ this.trackSeekPromises.delete(trackId);
125
+ }
126
+ }
127
+ async resetIterator(trackId) {
128
+ const trackBuffer = this.trackBuffers.get(trackId);
129
+ trackBuffer?.clear();
130
+ const ongoingIteratorCreation = this.trackIteratorCreationPromises.get(trackId);
131
+ if (ongoingIteratorCreation) await ongoingIteratorCreation;
132
+ const iterator = this.trackIterators.get(trackId);
133
+ if (iterator) try {
134
+ await iterator.return?.();
135
+ } catch (_error) {}
136
+ this.trackIterators.delete(trackId);
137
+ }
138
+ async seekSafe(trackId, timeMs) {
139
+ if (!this.trackBuffers.has(trackId)) await this.createTrackBuffer(trackId);
140
+ const trackBuffer = this.trackBuffers.get(trackId);
141
+ if (timeMs < trackBuffer.firstTimestamp * 1e3) await this.resetIterator(trackId);
142
+ const alreadyInBuffer = trackBuffer.find(timeMs);
143
+ const track = await this.getTrack(trackId);
144
+ const firstTimestampMs = await track.getFirstTimestamp() * 1e3;
145
+ const lastSampleEndMs = await track.computeDuration() * 1e3;
146
+ if (timeMs < firstTimestampMs || timeMs >= lastSampleEndMs) throw new NoSample(`Seek time ${timeMs}ms is outside track range [${firstTimestampMs}ms, ${lastSampleEndMs}ms]`);
147
+ if (alreadyInBuffer) return alreadyInBuffer;
148
+ const iterator = await this.getTrackIterator(trackId);
149
+ while (true) {
150
+ const { done, value: decodedSample } = await iterator.next();
151
+ if (decodedSample) trackBuffer.push(decodedSample);
152
+ const foundSample = trackBuffer.find(timeMs);
153
+ if (foundSample) return foundSample;
154
+ if (done) break;
155
+ }
156
+ throw new NoSample(`Sample not found for time ${timeMs} in ${track.type} track ${trackId}`);
157
+ }
158
+ };
159
+ export { BufferedSeekingInput };
@@ -0,0 +1,31 @@
1
+ import { AudioRendition, MediaEngine, RenditionId, VideoRendition } from '../../transcoding/types';
2
+ import { ManifestResponse } from '../../transcoding/types/index.js';
3
+ import { UrlGenerator } from '../../transcoding/utils/UrlGenerator';
4
+ import { EFMedia } from '../EFMedia.js';
5
+ import { BaseMediaEngine } from './BaseMediaEngine';
6
+ export declare class JitMediaEngine extends BaseMediaEngine implements MediaEngine {
7
+ host: EFMedia;
8
+ private urlGenerator;
9
+ private data;
10
+ static fetch(host: EFMedia, urlGenerator: UrlGenerator, url: string): Promise<JitMediaEngine>;
11
+ constructor(host: EFMedia, urlGenerator: UrlGenerator, data: ManifestResponse);
12
+ get durationMs(): number;
13
+ get src(): string;
14
+ get audioRendition(): AudioRendition | undefined;
15
+ get videoRendition(): VideoRendition | undefined;
16
+ get templates(): {
17
+ initSegment: string;
18
+ mediaSegment: string;
19
+ };
20
+ fetchInitSegment(rendition: {
21
+ id?: RenditionId;
22
+ trackId: number | undefined;
23
+ src: string;
24
+ }, signal: AbortSignal): Promise<ArrayBuffer>;
25
+ fetchMediaSegmentImpl(segmentId: number, rendition: {
26
+ id?: RenditionId;
27
+ trackId: number | undefined;
28
+ src: string;
29
+ }): Promise<ArrayBuffer>;
30
+ computeSegmentId(desiredSeekTimeMs: number, rendition: VideoRendition | AudioRendition): number;
31
+ }
@@ -0,0 +1,62 @@
1
+ import { BaseMediaEngine } from "./BaseMediaEngine.js";
2
+ var JitMediaEngine = class JitMediaEngine extends BaseMediaEngine {
3
+ static async fetch(host, urlGenerator, url) {
4
+ const response = await host.fetch(url);
5
+ const data = await response.json();
6
+ return new JitMediaEngine(host, urlGenerator, data);
7
+ }
8
+ constructor(host, urlGenerator, data) {
9
+ super();
10
+ this.host = host;
11
+ this.urlGenerator = urlGenerator;
12
+ this.data = data;
13
+ }
14
+ get durationMs() {
15
+ return this.data.durationMs;
16
+ }
17
+ get src() {
18
+ return this.data.sourceUrl;
19
+ }
20
+ get audioRendition() {
21
+ const rendition = this.data.audioRenditions[0];
22
+ if (!rendition) return void 0;
23
+ return {
24
+ id: rendition.id,
25
+ trackId: void 0,
26
+ src: this.data.sourceUrl,
27
+ segmentDurationMs: rendition.segmentDurationMs
28
+ };
29
+ }
30
+ get videoRendition() {
31
+ const rendition = this.data.videoRenditions[0];
32
+ if (!rendition) return void 0;
33
+ return {
34
+ id: rendition.id,
35
+ trackId: void 0,
36
+ src: this.data.sourceUrl,
37
+ segmentDurationMs: rendition.segmentDurationMs
38
+ };
39
+ }
40
+ get templates() {
41
+ return this.data.endpoints;
42
+ }
43
+ async fetchInitSegment(rendition, signal) {
44
+ if (!rendition.id) throw new Error("Rendition ID is required for JIT metadata");
45
+ const url = this.urlGenerator.generateSegmentUrl("init", rendition.id, this);
46
+ const response = await this.host.fetch(url, { signal });
47
+ const arrayBuffer = await response.arrayBuffer();
48
+ return arrayBuffer;
49
+ }
50
+ async fetchMediaSegmentImpl(segmentId, rendition) {
51
+ if (!rendition.id) throw new Error("Rendition ID is required for JIT metadata");
52
+ const url = this.urlGenerator.generateSegmentUrl(segmentId, rendition.id, this);
53
+ return this.fetchMediaCache(url);
54
+ }
55
+ computeSegmentId(desiredSeekTimeMs, rendition) {
56
+ if (!rendition.segmentDurationMs) throw new Error("Segment duration is required for JIT metadata");
57
+ const segmentIndex = Math.floor(desiredSeekTimeMs / rendition.segmentDurationMs);
58
+ if (segmentIndex * rendition.segmentDurationMs >= this.durationMs) return segmentIndex;
59
+ return segmentIndex + 1;
60
+ }
61
+ };
62
+ export { JitMediaEngine };
@@ -0,0 +1,9 @@
1
+ import { EFMedia } from '../../EFMedia';
2
+ declare class TestMediaAudioBuffer extends EFMedia {
3
+ }
4
+ declare global {
5
+ interface HTMLElementTagNameMap {
6
+ "test-media-audio-buffer": TestMediaAudioBuffer;
7
+ }
8
+ }
9
+ export {};
@@ -0,0 +1,16 @@
1
+ import { Task } from '@lit/task';
2
+ import { EFMedia } from '../../EFMedia';
3
+ import { MediaBufferConfig, MediaBufferState } from '../shared/BufferUtils';
4
+ /**
5
+ * Configuration for audio buffering - extends the generic interface
6
+ */
7
+ export interface AudioBufferConfig extends MediaBufferConfig {
8
+ }
9
+ /**
10
+ * State of the audio buffer - uses the generic interface
11
+ */
12
+ export interface AudioBufferState extends MediaBufferState {
13
+ }
14
+ type AudioBufferTask = Task<readonly [number], AudioBufferState>;
15
+ export declare const makeAudioBufferTask: (host: EFMedia) => AudioBufferTask;
16
+ export {};
@@ -0,0 +1,48 @@
1
+ import { EF_INTERACTIVE } from "../../../EF_INTERACTIVE.js";
2
+ import { EF_RENDERING } from "../../../EF_RENDERING.js";
3
+ import { manageMediaBuffer } from "../shared/BufferUtils.js";
4
+ import { getLatestMediaEngine } from "../tasks/makeMediaEngineTask.js";
5
+ import { Task } from "@lit/task";
6
+ const makeAudioBufferTask = (host) => {
7
+ let currentState = {
8
+ currentSeekTimeMs: 0,
9
+ activeRequests: /* @__PURE__ */ new Set(),
10
+ cachedSegments: /* @__PURE__ */ new Set(),
11
+ requestQueue: []
12
+ };
13
+ return new Task(host, {
14
+ autoRun: EF_INTERACTIVE,
15
+ args: () => [host.desiredSeekTimeMs],
16
+ onError: (error) => {
17
+ console.error("audioBufferTask error", error);
18
+ },
19
+ onComplete: (value) => {
20
+ currentState = value;
21
+ },
22
+ task: async ([seekTimeMs], { signal }) => {
23
+ const currentConfig = {
24
+ bufferDurationMs: host.audioBufferDurationMs,
25
+ maxParallelFetches: host.maxAudioBufferFetches,
26
+ enableBuffering: host.enableAudioBuffering && !EF_RENDERING
27
+ };
28
+ return manageMediaBuffer(seekTimeMs, currentConfig, currentState, host.intrinsicDurationMs || 1e4, signal, {
29
+ computeSegmentId: async (timeMs, rendition) => {
30
+ const mediaEngine = await getLatestMediaEngine(host, signal);
31
+ return mediaEngine.computeSegmentId(timeMs, rendition);
32
+ },
33
+ fetchSegment: async (segmentId, rendition) => {
34
+ const mediaEngine = await getLatestMediaEngine(host, signal);
35
+ return mediaEngine.fetchMediaSegment(segmentId, rendition);
36
+ },
37
+ getRendition: async () => {
38
+ const mediaEngine = await getLatestMediaEngine(host, signal);
39
+ const audioRendition = mediaEngine.audioRendition;
40
+ if (!audioRendition) throw new Error("Audio rendition not available");
41
+ return audioRendition;
42
+ },
43
+ logError: console.error
44
+ });
45
+ }
46
+ });
47
+ };
48
+ export { makeAudioBufferTask };
@@ -0,0 +1,3 @@
1
+ import { Task } from '@lit/task';
2
+ import { EFMedia } from '../../EFMedia.js';
3
+ export declare function makeAudioFrequencyAnalysisTask(element: EFMedia): Task<readonly [import('@lit/task').TaskStatus, number, number, number, number, boolean], Uint8Array | null>;
@@ -0,0 +1,138 @@
1
+ import { EF_INTERACTIVE } from "../../../EF_INTERACTIVE.js";
2
+ import { LRUCache } from "../../../utils/LRUCache.js";
3
+ import { Task } from "@lit/task";
4
+ const DECAY_WEIGHT = .8;
5
+ function processFFTData(fftData, zeroThresholdPercent = .1) {
6
+ const totalBins = fftData.length;
7
+ const zeroThresholdCount = Math.floor(totalBins * zeroThresholdPercent);
8
+ let zeroCount = 0;
9
+ let cutoffIndex = totalBins;
10
+ for (let i = totalBins - 1; i >= 0; i--) if (fftData[i] ?? true) zeroCount++;
11
+ else if (zeroCount >= zeroThresholdCount) {
12
+ cutoffIndex = i + 1;
13
+ break;
14
+ }
15
+ if (cutoffIndex < zeroThresholdCount) return fftData;
16
+ const goodData = fftData.slice(0, cutoffIndex);
17
+ const resampledData = interpolateData(goodData, fftData.length);
18
+ const attenuationStartIndex = Math.floor(totalBins * .9);
19
+ for (let i = attenuationStartIndex; i < totalBins; i++) {
20
+ const attenuationProgress = (i - attenuationStartIndex) / (totalBins - attenuationStartIndex) + .2;
21
+ const attenuationFactor = Math.max(0, 1 - attenuationProgress);
22
+ resampledData[i] = Math.floor((resampledData[i] ?? 0) * attenuationFactor);
23
+ }
24
+ return resampledData;
25
+ }
26
+ function interpolateData(data, targetSize) {
27
+ const resampled = new Uint8Array(targetSize);
28
+ const dataLength = data.length;
29
+ for (let i = 0; i < targetSize; i++) {
30
+ const ratio = i / (targetSize - 1) * (dataLength - 1);
31
+ const index = Math.floor(ratio);
32
+ const fraction = ratio - index;
33
+ if (index >= dataLength - 1) resampled[i] = data[dataLength - 1] ?? 0;
34
+ else resampled[i] = Math.round((data[index] ?? 0) * (1 - fraction) + (data[index + 1] ?? 0) * fraction);
35
+ }
36
+ return resampled;
37
+ }
38
+ function makeAudioFrequencyAnalysisTask(element) {
39
+ const cache = new LRUCache(100);
40
+ return new Task(element, {
41
+ autoRun: EF_INTERACTIVE,
42
+ onError: (error) => {
43
+ console.error("frequencyDataTask error", error);
44
+ },
45
+ args: () => [
46
+ element.audioBufferTask.status,
47
+ element.currentSourceTimeMs,
48
+ element.fftSize,
49
+ element.fftDecay,
50
+ element.fftGain,
51
+ element.shouldInterpolateFrequencies
52
+ ],
53
+ task: async () => {
54
+ await element.audioBufferTask.taskComplete;
55
+ if (!element.audioBufferTask.value) return null;
56
+ if (element.currentSourceTimeMs < 0) return null;
57
+ const currentTimeMs = element.currentSourceTimeMs;
58
+ const analysisWindowMs = 5e3;
59
+ const fromMs = Math.max(0, currentTimeMs);
60
+ const toMs = fromMs + analysisWindowMs;
61
+ const { fetchAudioSpanningTime: fetchAudioSpan } = await import("../shared/AudioSpanUtils.js");
62
+ const audioSpan = await fetchAudioSpan(element, fromMs, toMs, new AbortController().signal);
63
+ if (!audioSpan || !audioSpan.blob) {
64
+ console.warn("Frequency analysis skipped: no audio data available");
65
+ return null;
66
+ }
67
+ const tempAudioContext = new OfflineAudioContext(2, 48e3, 48e3);
68
+ const arrayBuffer = await audioSpan.blob.arrayBuffer();
69
+ const audioBuffer = await tempAudioContext.decodeAudioData(arrayBuffer);
70
+ const startOffsetMs = audioSpan.startMs;
71
+ const smoothedKey = `${element.shouldInterpolateFrequencies}:${element.fftSize}:${element.fftDecay}:${element.fftGain}:${startOffsetMs}:${currentTimeMs}`;
72
+ const cachedSmoothedData = cache.get(smoothedKey);
73
+ if (cachedSmoothedData) return cachedSmoothedData;
74
+ const framesData = await Promise.all(Array.from({ length: element.fftDecay }, async (_, i) => {
75
+ const frameOffset = i * (1e3 / 30);
76
+ const startTime = Math.max(0, (currentTimeMs - frameOffset - startOffsetMs) / 1e3);
77
+ const cacheKey = `${element.shouldInterpolateFrequencies}:${element.fftSize}:${element.fftGain}:${startOffsetMs}:${startTime}`;
78
+ const cachedFrame = cache.get(cacheKey);
79
+ if (cachedFrame) return cachedFrame;
80
+ const SIZE = 48e3 / 30;
81
+ let audioContext;
82
+ try {
83
+ audioContext = new OfflineAudioContext(2, SIZE, 48e3);
84
+ } catch (error) {
85
+ throw new Error(`[EFMedia.frequencyDataTask] Failed to create OfflineAudioContext(2, ${SIZE}, 48000) for frame ${i} at time ${startTime}s: ${error instanceof Error ? error.message : String(error)}. This is for audio frequency analysis.`);
86
+ }
87
+ const analyser = audioContext.createAnalyser();
88
+ analyser.fftSize = element.fftSize;
89
+ analyser.minDecibels = -90;
90
+ analyser.maxDecibels = -10;
91
+ const gainNode = audioContext.createGain();
92
+ gainNode.gain.value = element.fftGain;
93
+ const filter = audioContext.createBiquadFilter();
94
+ filter.type = "bandpass";
95
+ filter.frequency.value = 15e3;
96
+ filter.Q.value = .05;
97
+ const audioBufferSource = audioContext.createBufferSource();
98
+ audioBufferSource.buffer = audioBuffer;
99
+ audioBufferSource.connect(filter);
100
+ filter.connect(gainNode);
101
+ gainNode.connect(analyser);
102
+ analyser.connect(audioContext.destination);
103
+ audioBufferSource.start(0, startTime, 1 / 30);
104
+ try {
105
+ await audioContext.startRendering();
106
+ const frameData = new Uint8Array(element.fftSize / 2);
107
+ analyser.getByteFrequencyData(frameData);
108
+ cache.set(cacheKey, frameData);
109
+ return frameData;
110
+ } finally {
111
+ audioBufferSource.disconnect();
112
+ analyser.disconnect();
113
+ }
114
+ }));
115
+ const frameLength = framesData[0]?.length ?? 0;
116
+ const smoothedData = new Uint8Array(frameLength);
117
+ for (let i = 0; i < frameLength; i++) {
118
+ let weightedSum = 0;
119
+ let weightSum = 0;
120
+ framesData.forEach((frame, frameIndex) => {
121
+ const decayWeight = DECAY_WEIGHT ** frameIndex;
122
+ weightedSum += (frame[i] ?? 0) * decayWeight;
123
+ weightSum += decayWeight;
124
+ });
125
+ smoothedData[i] = Math.min(255, Math.round(weightedSum / weightSum));
126
+ }
127
+ smoothedData.forEach((value, i) => {
128
+ const freqWeight = element.FREQ_WEIGHTS[i] ?? 0;
129
+ smoothedData[i] = Math.min(255, Math.round(value * freqWeight));
130
+ });
131
+ const slicedData = smoothedData.slice(0, Math.floor(smoothedData.length / 2));
132
+ const processedData = element.shouldInterpolateFrequencies ? processFFTData(slicedData) : slicedData;
133
+ cache.set(smoothedKey, processedData);
134
+ return processedData;
135
+ }
136
+ });
137
+ }
138
+ export { makeAudioFrequencyAnalysisTask };
@@ -0,0 +1,9 @@
1
+ import { EFAudio } from '../../EFAudio';
2
+ declare class TestMediaAudioInitSegmentFetch extends EFAudio {
3
+ }
4
+ declare global {
5
+ interface HTMLElementTagNameMap {
6
+ "test-media-audio-init-segment-fetch": TestMediaAudioInitSegmentFetch;
7
+ }
8
+ }
9
+ export {};
@@ -0,0 +1,4 @@
1
+ import { Task } from '@lit/task';
2
+ import { MediaEngine } from '../../../transcoding/types';
3
+ import { EFMedia } from '../../EFMedia';
4
+ export declare const makeAudioInitSegmentFetchTask: (host: EFMedia) => Task<readonly [MediaEngine | undefined], ArrayBuffer>;
@@ -0,0 +1,16 @@
1
+ import { getLatestMediaEngine } from "../tasks/makeMediaEngineTask.js";
2
+ import { Task } from "@lit/task";
3
+ const makeAudioInitSegmentFetchTask = (host) => {
4
+ return new Task(host, {
5
+ args: () => [host.mediaEngineTask.value],
6
+ onError: (error) => {
7
+ console.error("audioInitSegmentFetchTask error", error);
8
+ },
9
+ onComplete: (_value) => {},
10
+ task: async ([_mediaEngine], { signal }) => {
11
+ const mediaEngine = await getLatestMediaEngine(host, signal);
12
+ return mediaEngine.fetchInitSegment(mediaEngine.getAudioRendition(), signal);
13
+ }
14
+ });
15
+ };
16
+ export { makeAudioInitSegmentFetchTask };
@@ -0,0 +1,9 @@
1
+ import { EFAudio } from '../../EFAudio';
2
+ declare class TestMediaAudioInput extends EFAudio {
3
+ }
4
+ declare global {
5
+ interface HTMLElementTagNameMap {
6
+ "test-media-audio-input": TestMediaAudioInput;
7
+ }
8
+ }
9
+ export {};
@@ -0,0 +1,3 @@
1
+ import { EFMedia } from '../../EFMedia';
2
+ import { InputTask } from '../shared/MediaTaskUtils';
3
+ export declare const makeAudioInputTask: (host: EFMedia) => InputTask;
@@ -0,0 +1,22 @@
1
+ import { BufferedSeekingInput } from "../BufferedSeekingInput.js";
2
+ import { EFMedia } from "../../EFMedia.js";
3
+ import { Task } from "@lit/task";
4
+ const makeAudioInputTask = (host) => {
5
+ return new Task(host, {
6
+ args: () => [host.audioInitSegmentFetchTask.value, host.audioSegmentFetchTask.value],
7
+ onError: (error) => {
8
+ console.error("audioInputTask error", error);
9
+ },
10
+ onComplete: (_value) => {},
11
+ task: async () => {
12
+ const initSegment = await host.audioInitSegmentFetchTask.taskComplete;
13
+ const segment = await host.audioSegmentFetchTask.taskComplete;
14
+ if (!initSegment || !segment) throw new Error("Init segment or segment is not available");
15
+ return new BufferedSeekingInput(await new Blob([initSegment, segment]).arrayBuffer(), {
16
+ videoBufferSize: EFMedia.VIDEO_SAMPLE_BUFFER_SIZE,
17
+ audioBufferSize: EFMedia.AUDIO_SAMPLE_BUFFER_SIZE
18
+ });
19
+ }
20
+ });
21
+ };
22
+ export { makeAudioInputTask };
@@ -0,0 +1,7 @@
1
+ import { Task } from '@lit/task';
2
+ import { VideoSample } from 'mediabunny';
3
+ import { EFMedia } from '../../EFMedia';
4
+ import { BufferedSeekingInput } from '../BufferedSeekingInput';
5
+ type AudioSeekTask = Task<readonly [number, BufferedSeekingInput | undefined], VideoSample | undefined>;
6
+ export declare const makeAudioSeekTask: (host: EFMedia) => AudioSeekTask;
7
+ export {};
@@ -0,0 +1,24 @@
1
+ import { IgnorableError } from "../../EFMedia.js";
2
+ import { Task } from "@lit/task";
3
+ const makeAudioSeekTask = (host) => {
4
+ return new Task(host, {
5
+ args: () => [host.desiredSeekTimeMs, host.audioInputTask.value],
6
+ onError: (error) => {
7
+ if (error instanceof IgnorableError) console.info("audioSeekTask aborted");
8
+ console.error("audioSeekTask error", error);
9
+ },
10
+ onComplete: (_value) => {},
11
+ task: async (_) => {
12
+ await host.audioSegmentIdTask.taskComplete;
13
+ await host.audioSegmentFetchTask.taskComplete;
14
+ await host.audioInitSegmentFetchTask.taskComplete;
15
+ const audioInput = await host.audioInputTask.taskComplete;
16
+ if (!audioInput) throw new Error("Audio input is not available");
17
+ const audioTrack = await audioInput.getFirstAudioTrack();
18
+ if (!audioTrack) throw new Error("Audio track is not available");
19
+ const sample = await audioInput.seek(audioTrack.id, host.desiredSeekTimeMs);
20
+ return sample;
21
+ }
22
+ });
23
+ };
24
+ export { makeAudioSeekTask };
@@ -0,0 +1,4 @@
1
+ import { Task } from '@lit/task';
2
+ import { MediaEngine } from '../../../transcoding/types';
3
+ import { EFMedia } from '../../EFMedia';
4
+ export declare const makeAudioSegmentFetchTask: (host: EFMedia) => Task<readonly [MediaEngine | undefined, number | undefined], ArrayBuffer>;
@@ -0,0 +1,18 @@
1
+ import { getLatestMediaEngine } from "../tasks/makeMediaEngineTask.js";
2
+ import { Task } from "@lit/task";
3
+ const makeAudioSegmentFetchTask = (host) => {
4
+ return new Task(host, {
5
+ args: () => [host.mediaEngineTask.value, host.audioSegmentIdTask.value],
6
+ onError: (error) => {
7
+ console.error("audioSegmentFetchTask error", error);
8
+ },
9
+ onComplete: (_value) => {},
10
+ task: async (_, { signal }) => {
11
+ const mediaEngine = await getLatestMediaEngine(host, signal);
12
+ const segmentId = await host.audioSegmentIdTask.taskComplete;
13
+ if (segmentId === void 0) throw new Error("Segment ID is not available");
14
+ return mediaEngine.fetchMediaSegment(segmentId, mediaEngine.getAudioRendition(), signal);
15
+ }
16
+ });
17
+ };
18
+ export { makeAudioSegmentFetchTask };
@@ -0,0 +1,4 @@
1
+ import { Task } from '@lit/task';
2
+ import { MediaEngine } from '../../../transcoding/types';
3
+ import { EFMedia } from '../../EFMedia';
4
+ export declare const makeAudioSegmentIdTask: (host: EFMedia) => Task<readonly [MediaEngine | undefined, number], number | undefined>;
@@ -0,0 +1,16 @@
1
+ import { getLatestMediaEngine } from "../tasks/makeMediaEngineTask.js";
2
+ import { Task } from "@lit/task";
3
+ const makeAudioSegmentIdTask = (host) => {
4
+ return new Task(host, {
5
+ args: () => [host.mediaEngineTask.value, host.desiredSeekTimeMs],
6
+ onError: (error) => {
7
+ console.error("audioSegmentIdTask error", error);
8
+ },
9
+ onComplete: (_value) => {},
10
+ task: async (_, { signal }) => {
11
+ const mediaEngine = await getLatestMediaEngine(host, signal);
12
+ return mediaEngine.computeSegmentId(host.desiredSeekTimeMs, mediaEngine.getAudioRendition());
13
+ }
14
+ });
15
+ };
16
+ export { makeAudioSegmentIdTask };
@@ -0,0 +1,3 @@
1
+ import { Task } from '@lit/task';
2
+ import { EFMedia } from '../../EFMedia.js';
3
+ export declare function makeAudioTimeDomainAnalysisTask(element: EFMedia): Task<readonly [import('@lit/task').TaskStatus, number, number, number, number, boolean], Uint8Array | null>;