@editframe/elements 0.47.2 → 0.48.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 (405) hide show
  1. package/dist/DelayedLoadingState.js +1 -1
  2. package/dist/DelayedLoadingState.js.map +1 -1
  3. package/dist/EF_FRAMEGEN.js +1 -2
  4. package/dist/EF_FRAMEGEN.js.map +1 -1
  5. package/dist/EF_RENDERING.js +1 -1
  6. package/dist/EF_RENDERING.js.map +1 -1
  7. package/dist/_virtual/{_@oxc-project_runtime@0.95.0 → _@oxc-project_runtime@0.122.0}/helpers/decorate.js +2 -3
  8. package/dist/attachContextRoot.js +1 -2
  9. package/dist/attachContextRoot.js.map +1 -1
  10. package/dist/canvas/EFCanvas.d.ts +4 -7
  11. package/dist/canvas/EFCanvas.js +20 -21
  12. package/dist/canvas/EFCanvas.js.map +1 -1
  13. package/dist/canvas/EFCanvasItem.d.ts +4 -5
  14. package/dist/canvas/EFCanvasItem.js +3 -4
  15. package/dist/canvas/EFCanvasItem.js.map +1 -1
  16. package/dist/canvas/api/CanvasAPI.d.ts +0 -1
  17. package/dist/canvas/api/CanvasAPI.js +1 -1
  18. package/dist/canvas/api/CanvasAPI.js.map +1 -1
  19. package/dist/canvas/coordinateTransform.js +1 -1
  20. package/dist/canvas/coordinateTransform.js.map +1 -1
  21. package/dist/canvas/getElementBounds.js +1 -1
  22. package/dist/canvas/getElementBounds.js.map +1 -1
  23. package/dist/canvas/overlays/SelectionOverlay.d.ts +4 -4
  24. package/dist/canvas/overlays/SelectionOverlay.js +6 -7
  25. package/dist/canvas/overlays/SelectionOverlay.js.map +1 -1
  26. package/dist/canvas/overlays/overlayState.js +1 -2
  27. package/dist/canvas/overlays/overlayState.js.map +1 -1
  28. package/dist/canvas/selection/SelectionController.js +1 -2
  29. package/dist/canvas/selection/SelectionController.js.map +1 -1
  30. package/dist/canvas/selection/SelectionModel.d.ts +0 -1
  31. package/dist/canvas/selection/SelectionModel.js +1 -1
  32. package/dist/canvas/selection/SelectionModel.js.map +1 -1
  33. package/dist/canvas/selection/selectionContext.d.ts +0 -1
  34. package/dist/canvas/selection/selectionContext.js +1 -2
  35. package/dist/canvas/selection/selectionContext.js.map +1 -1
  36. package/dist/elements/ContainerInfo.js +1 -1
  37. package/dist/elements/ContainerInfo.js.map +1 -1
  38. package/dist/elements/CrossUpdateController.js +1 -1
  39. package/dist/elements/CrossUpdateController.js.map +1 -1
  40. package/dist/elements/EFAudio.d.ts +4 -4
  41. package/dist/elements/EFAudio.js +4 -6
  42. package/dist/elements/EFAudio.js.map +1 -1
  43. package/dist/elements/EFCaptions.d.ts +4 -4
  44. package/dist/elements/EFCaptions.js +8 -10
  45. package/dist/elements/EFCaptions.js.map +1 -1
  46. package/dist/elements/EFImage.d.ts +7 -7
  47. package/dist/elements/EFImage.js +4 -6
  48. package/dist/elements/EFImage.js.map +1 -1
  49. package/dist/elements/EFMedia/BufferedSeekingInput.d.ts +2 -2
  50. package/dist/elements/EFMedia/BufferedSeekingInput.js +8 -9
  51. package/dist/elements/EFMedia/BufferedSeekingInput.js.map +1 -1
  52. package/dist/elements/EFMedia/CachedFetcher.js +1 -2
  53. package/dist/elements/EFMedia/CachedFetcher.js.map +1 -1
  54. package/dist/elements/EFMedia/MediaEngine.d.ts +0 -2
  55. package/dist/elements/EFMedia/MediaEngine.js +1 -2
  56. package/dist/elements/EFMedia/MediaEngine.js.map +1 -1
  57. package/dist/elements/EFMedia/SegmentIndex.d.ts +0 -3
  58. package/dist/elements/EFMedia/SegmentIndex.js +1 -2
  59. package/dist/elements/EFMedia/SegmentIndex.js.map +1 -1
  60. package/dist/elements/EFMedia/SegmentTransport.d.ts +0 -2
  61. package/dist/elements/EFMedia/SegmentTransport.js +1 -1
  62. package/dist/elements/EFMedia/SegmentTransport.js.map +1 -1
  63. package/dist/elements/EFMedia/TimingModel.d.ts +0 -2
  64. package/dist/elements/EFMedia/TimingModel.js +1 -1
  65. package/dist/elements/EFMedia/TimingModel.js.map +1 -1
  66. package/dist/elements/EFMedia/shared/AudioSpanUtils.js +1 -1
  67. package/dist/elements/EFMedia/shared/AudioSpanUtils.js.map +1 -1
  68. package/dist/elements/EFMedia/shared/GlobalInputCache.js +1 -2
  69. package/dist/elements/EFMedia/shared/GlobalInputCache.js.map +1 -1
  70. package/dist/elements/EFMedia/shared/PrecisionUtils.js +1 -1
  71. package/dist/elements/EFMedia/shared/PrecisionUtils.js.map +1 -1
  72. package/dist/elements/EFMedia/shared/ThumbnailExtractor.js +1 -2
  73. package/dist/elements/EFMedia/shared/ThumbnailExtractor.js.map +1 -1
  74. package/dist/elements/EFMedia/shared/timeoutUtils.js +1 -2
  75. package/dist/elements/EFMedia/shared/timeoutUtils.js.map +1 -1
  76. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js +1 -1
  77. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js.map +1 -1
  78. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.d.ts +0 -1
  79. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js +12 -12
  80. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js.map +1 -1
  81. package/dist/elements/EFMedia.d.ts +2 -2
  82. package/dist/elements/EFMedia.js +2 -3
  83. package/dist/elements/EFMedia.js.map +1 -1
  84. package/dist/elements/EFMotionBlur.d.ts +0 -1
  85. package/dist/elements/EFMotionBlur.js +8 -15
  86. package/dist/elements/EFMotionBlur.js.map +1 -1
  87. package/dist/elements/EFPanZoom.d.ts +4 -4
  88. package/dist/elements/EFPanZoom.js +3 -4
  89. package/dist/elements/EFPanZoom.js.map +1 -1
  90. package/dist/elements/EFSourceMixin.js +2 -3
  91. package/dist/elements/EFSourceMixin.js.map +1 -1
  92. package/dist/elements/EFSurface.d.ts +6 -6
  93. package/dist/elements/EFSurface.js +3 -4
  94. package/dist/elements/EFSurface.js.map +1 -1
  95. package/dist/elements/EFTemporal.d.ts +0 -1
  96. package/dist/elements/EFTemporal.js +6 -7
  97. package/dist/elements/EFTemporal.js.map +1 -1
  98. package/dist/elements/EFText.d.ts +4 -4
  99. package/dist/elements/EFText.js +6 -7
  100. package/dist/elements/EFText.js.map +1 -1
  101. package/dist/elements/EFTextSegment.d.ts +4 -4
  102. package/dist/elements/EFTextSegment.js +3 -4
  103. package/dist/elements/EFTextSegment.js.map +1 -1
  104. package/dist/elements/EFTimegroup.d.ts +4 -10
  105. package/dist/elements/EFTimegroup.js +11 -12
  106. package/dist/elements/EFTimegroup.js.map +1 -1
  107. package/dist/elements/EFVideo.d.ts +6 -7
  108. package/dist/elements/EFVideo.js +7 -9
  109. package/dist/elements/EFVideo.js.map +1 -1
  110. package/dist/elements/EFWaveform.d.ts +4 -4
  111. package/dist/elements/EFWaveform.js +4 -6
  112. package/dist/elements/EFWaveform.js.map +1 -1
  113. package/dist/elements/ElementPositionInfo.js +1 -1
  114. package/dist/elements/ElementPositionInfo.js.map +1 -1
  115. package/dist/elements/FetchMixin.js +1 -1
  116. package/dist/elements/FetchMixin.js.map +1 -1
  117. package/dist/elements/SampleBuffer.js +1 -2
  118. package/dist/elements/SampleBuffer.js.map +1 -1
  119. package/dist/elements/TargetController.d.ts +0 -1
  120. package/dist/elements/TargetController.js +1 -1
  121. package/dist/elements/TargetController.js.map +1 -1
  122. package/dist/elements/TimegroupController.js +1 -1
  123. package/dist/elements/TimegroupController.js.map +1 -1
  124. package/dist/elements/cloneFactoryRegistry.js +1 -1
  125. package/dist/elements/cloneFactoryRegistry.js.map +1 -1
  126. package/dist/elements/durationConverter.js +4 -5
  127. package/dist/elements/durationConverter.js.map +1 -1
  128. package/dist/elements/easingUtils.js +1 -1
  129. package/dist/elements/easingUtils.js.map +1 -1
  130. package/dist/elements/findRootTemporal.js +1 -2
  131. package/dist/elements/findRootTemporal.js.map +1 -1
  132. package/dist/elements/parseTimeToMs.js +1 -1
  133. package/dist/elements/parseTimeToMs.js.map +1 -1
  134. package/dist/elements/renderTemporalAudio.js +1 -2
  135. package/dist/elements/renderTemporalAudio.js.map +1 -1
  136. package/dist/elements/setupTemporalHierarchy.js +1 -1
  137. package/dist/elements/setupTemporalHierarchy.js.map +1 -1
  138. package/dist/elements/updateAnimations.js +1 -2
  139. package/dist/elements/updateAnimations.js.map +1 -1
  140. package/dist/getRenderInfo.d.ts +0 -1
  141. package/dist/getRenderInfo.js +1 -2
  142. package/dist/getRenderInfo.js.map +1 -1
  143. package/dist/gui/ContextMixin.d.ts +0 -1
  144. package/dist/gui/ContextMixin.js +2 -3
  145. package/dist/gui/ContextMixin.js.map +1 -1
  146. package/dist/gui/Controllable.d.ts +0 -2
  147. package/dist/gui/Controllable.js +1 -2
  148. package/dist/gui/Controllable.js.map +1 -1
  149. package/dist/gui/EFActiveRootTemporal.d.ts +4 -5
  150. package/dist/gui/EFActiveRootTemporal.js +3 -4
  151. package/dist/gui/EFActiveRootTemporal.js.map +1 -1
  152. package/dist/gui/EFConfiguration.d.ts +4 -4
  153. package/dist/gui/EFConfiguration.js +3 -4
  154. package/dist/gui/EFConfiguration.js.map +1 -1
  155. package/dist/gui/EFControls.d.ts +2 -3
  156. package/dist/gui/EFControls.js +4 -5
  157. package/dist/gui/EFControls.js.map +1 -1
  158. package/dist/gui/EFDial.d.ts +4 -4
  159. package/dist/gui/EFDial.js +3 -4
  160. package/dist/gui/EFDial.js.map +1 -1
  161. package/dist/gui/EFFilmstrip.d.ts +6 -7
  162. package/dist/gui/EFFilmstrip.js +3 -4
  163. package/dist/gui/EFFilmstrip.js.map +1 -1
  164. package/dist/gui/EFFitScale.d.ts +3 -3
  165. package/dist/gui/EFFitScale.js +6 -7
  166. package/dist/gui/EFFitScale.js.map +1 -1
  167. package/dist/gui/EFFocusOverlay.d.ts +6 -6
  168. package/dist/gui/EFFocusOverlay.js +3 -4
  169. package/dist/gui/EFFocusOverlay.js.map +1 -1
  170. package/dist/gui/EFOverlayItem.d.ts +4 -4
  171. package/dist/gui/EFOverlayItem.js +3 -4
  172. package/dist/gui/EFOverlayItem.js.map +1 -1
  173. package/dist/gui/EFOverlayLayer.d.ts +4 -5
  174. package/dist/gui/EFOverlayLayer.js +3 -4
  175. package/dist/gui/EFOverlayLayer.js.map +1 -1
  176. package/dist/gui/EFPause.d.ts +4 -4
  177. package/dist/gui/EFPause.js +3 -4
  178. package/dist/gui/EFPause.js.map +1 -1
  179. package/dist/gui/EFPlay.d.ts +4 -4
  180. package/dist/gui/EFPlay.js +3 -4
  181. package/dist/gui/EFPlay.js.map +1 -1
  182. package/dist/gui/EFPreview.d.ts +4 -4
  183. package/dist/gui/EFPreview.js +3 -4
  184. package/dist/gui/EFPreview.js.map +1 -1
  185. package/dist/gui/EFResizableBox.d.ts +4 -4
  186. package/dist/gui/EFResizableBox.js +3 -4
  187. package/dist/gui/EFResizableBox.js.map +1 -1
  188. package/dist/gui/EFScrubber.d.ts +4 -4
  189. package/dist/gui/EFScrubber.js +3 -4
  190. package/dist/gui/EFScrubber.js.map +1 -1
  191. package/dist/gui/EFTimeDisplay.d.ts +4 -4
  192. package/dist/gui/EFTimeDisplay.js +3 -4
  193. package/dist/gui/EFTimeDisplay.js.map +1 -1
  194. package/dist/gui/EFTimelineRuler.d.ts +4 -4
  195. package/dist/gui/EFTimelineRuler.js +5 -6
  196. package/dist/gui/EFTimelineRuler.js.map +1 -1
  197. package/dist/gui/EFToggleLoop.d.ts +4 -4
  198. package/dist/gui/EFToggleLoop.js +3 -4
  199. package/dist/gui/EFToggleLoop.js.map +1 -1
  200. package/dist/gui/EFTogglePlay.d.ts +4 -4
  201. package/dist/gui/EFTogglePlay.js +3 -4
  202. package/dist/gui/EFTogglePlay.js.map +1 -1
  203. package/dist/gui/EFTransformHandles.d.ts +4 -4
  204. package/dist/gui/EFTransformHandles.js +3 -4
  205. package/dist/gui/EFTransformHandles.js.map +1 -1
  206. package/dist/gui/EFWorkbench.d.ts +6 -7
  207. package/dist/gui/EFWorkbench.js +13 -15
  208. package/dist/gui/EFWorkbench.js.map +1 -1
  209. package/dist/gui/EFWorkbench.spacebar.js +1 -1
  210. package/dist/gui/EFWorkbench.spacebar.js.map +1 -1
  211. package/dist/gui/FitScaleHelpers.js +1 -2
  212. package/dist/gui/FitScaleHelpers.js.map +1 -1
  213. package/dist/gui/PlaybackController.js +3 -4
  214. package/dist/gui/PlaybackController.js.map +1 -1
  215. package/dist/gui/TWMixin.js +1 -1
  216. package/dist/gui/TWMixin.js.map +1 -1
  217. package/dist/gui/TWMixin2.js +1 -2
  218. package/dist/gui/TWMixin2.js.map +1 -1
  219. package/dist/gui/TargetOrContextMixin.js +2 -3
  220. package/dist/gui/TargetOrContextMixin.js.map +1 -1
  221. package/dist/gui/currentTimeContext.js +1 -2
  222. package/dist/gui/currentTimeContext.js.map +1 -1
  223. package/dist/gui/durationContext.js +1 -2
  224. package/dist/gui/durationContext.js.map +1 -1
  225. package/dist/gui/efContext.js +1 -2
  226. package/dist/gui/efContext.js.map +1 -1
  227. package/dist/gui/fetchContext.js +1 -2
  228. package/dist/gui/fetchContext.js.map +1 -1
  229. package/dist/gui/focusContext.js +1 -2
  230. package/dist/gui/focusContext.js.map +1 -1
  231. package/dist/gui/focusedElementContext.js +1 -2
  232. package/dist/gui/focusedElementContext.js.map +1 -1
  233. package/dist/gui/hierarchy/EFHierarchy.d.ts +4 -4
  234. package/dist/gui/hierarchy/EFHierarchy.js +3 -4
  235. package/dist/gui/hierarchy/EFHierarchy.js.map +1 -1
  236. package/dist/gui/hierarchy/EFHierarchyItem.d.ts +2 -2
  237. package/dist/gui/hierarchy/EFHierarchyItem.js +13 -14
  238. package/dist/gui/hierarchy/EFHierarchyItem.js.map +1 -1
  239. package/dist/gui/hierarchy/hierarchyContext.js +1 -2
  240. package/dist/gui/hierarchy/hierarchyContext.js.map +1 -1
  241. package/dist/gui/icons.js +1 -2
  242. package/dist/gui/icons.js.map +1 -1
  243. package/dist/gui/panZoomTransformContext.js +1 -2
  244. package/dist/gui/panZoomTransformContext.js.map +1 -1
  245. package/dist/gui/playingContext.js +1 -2
  246. package/dist/gui/playingContext.js.map +1 -1
  247. package/dist/gui/previewSettingsContext.d.ts +0 -1
  248. package/dist/gui/previewSettingsContext.js +1 -2
  249. package/dist/gui/previewSettingsContext.js.map +1 -1
  250. package/dist/gui/shouldSignUrl.js +1 -1
  251. package/dist/gui/shouldSignUrl.js.map +1 -1
  252. package/dist/gui/theme.js +1 -1
  253. package/dist/gui/theme.js.map +1 -1
  254. package/dist/gui/timeline/EFTimeline.d.ts +2 -5
  255. package/dist/gui/timeline/EFTimeline.js +19 -20
  256. package/dist/gui/timeline/EFTimeline.js.map +1 -1
  257. package/dist/gui/timeline/EFTimelineRow.d.ts +2 -2
  258. package/dist/gui/timeline/EFTimelineRow.js +3 -4
  259. package/dist/gui/timeline/EFTimelineRow.js.map +1 -1
  260. package/dist/gui/timeline/TrimHandles.d.ts +4 -4
  261. package/dist/gui/timeline/TrimHandles.js +3 -4
  262. package/dist/gui/timeline/TrimHandles.js.map +1 -1
  263. package/dist/gui/timeline/flattenHierarchy.js +1 -2
  264. package/dist/gui/timeline/flattenHierarchy.js.map +1 -1
  265. package/dist/gui/timeline/timelineEditingContext.js +1 -2
  266. package/dist/gui/timeline/timelineEditingContext.js.map +1 -1
  267. package/dist/gui/timeline/timelineStateContext.js +1 -14
  268. package/dist/gui/timeline/timelineStateContext.js.map +1 -1
  269. package/dist/gui/timeline/tracks/AudioTrack.d.ts +0 -1
  270. package/dist/gui/timeline/tracks/AudioTrack.js +3 -4
  271. package/dist/gui/timeline/tracks/AudioTrack.js.map +1 -1
  272. package/dist/gui/timeline/tracks/CaptionsTrack.d.ts +2 -2
  273. package/dist/gui/timeline/tracks/CaptionsTrack.js +9 -9
  274. package/dist/gui/timeline/tracks/CaptionsTrack.js.map +1 -1
  275. package/dist/gui/timeline/tracks/EFThumbnailStrip.d.ts +4 -4
  276. package/dist/gui/timeline/tracks/EFThumbnailStrip.js +3 -4
  277. package/dist/gui/timeline/tracks/EFThumbnailStrip.js.map +1 -1
  278. package/dist/gui/timeline/tracks/HTMLTrack.d.ts +2 -2
  279. package/dist/gui/timeline/tracks/HTMLTrack.js +3 -4
  280. package/dist/gui/timeline/tracks/HTMLTrack.js.map +1 -1
  281. package/dist/gui/timeline/tracks/ImageTrack.d.ts +2 -2
  282. package/dist/gui/timeline/tracks/ImageTrack.js +3 -4
  283. package/dist/gui/timeline/tracks/ImageTrack.js.map +1 -1
  284. package/dist/gui/timeline/tracks/TextTrack.d.ts +2 -2
  285. package/dist/gui/timeline/tracks/TextTrack.js +4 -5
  286. package/dist/gui/timeline/tracks/TextTrack.js.map +1 -1
  287. package/dist/gui/timeline/tracks/TimegroupTrack.d.ts +5 -6
  288. package/dist/gui/timeline/tracks/TimegroupTrack.js +3 -4
  289. package/dist/gui/timeline/tracks/TimegroupTrack.js.map +1 -1
  290. package/dist/gui/timeline/tracks/TrackItem.d.ts +2 -2
  291. package/dist/gui/timeline/tracks/TrackItem.js +3 -4
  292. package/dist/gui/timeline/tracks/TrackItem.js.map +1 -1
  293. package/dist/gui/timeline/tracks/VideoTrack.d.ts +6 -7
  294. package/dist/gui/timeline/tracks/VideoTrack.js +3 -4
  295. package/dist/gui/timeline/tracks/VideoTrack.js.map +1 -1
  296. package/dist/gui/timeline/tracks/WaveformTrack.js +3 -4
  297. package/dist/gui/timeline/tracks/WaveformTrack.js.map +1 -1
  298. package/dist/gui/timeline/tracks/ensureTrackItemInit.js +1 -1
  299. package/dist/gui/timeline/tracks/preloadTracks.d.ts +1 -9
  300. package/dist/gui/timeline/tracks/renderTrackChildren.js +1 -2
  301. package/dist/gui/timeline/tracks/renderTrackChildren.js.map +1 -1
  302. package/dist/gui/timeline/tracks/waveformUtils.js +3 -6
  303. package/dist/gui/timeline/tracks/waveformUtils.js.map +1 -1
  304. package/dist/gui/transformCalculations.js +1 -2
  305. package/dist/gui/transformCalculations.js.map +1 -1
  306. package/dist/gui/transformUtils.js +1 -1
  307. package/dist/gui/transformUtils.js.map +1 -1
  308. package/dist/gui/tree/EFTree.d.ts +4 -6
  309. package/dist/gui/tree/EFTree.js +3 -4
  310. package/dist/gui/tree/EFTree.js.map +1 -1
  311. package/dist/gui/tree/EFTreeItem.d.ts +4 -5
  312. package/dist/gui/tree/EFTreeItem.js +3 -4
  313. package/dist/gui/tree/EFTreeItem.js.map +1 -1
  314. package/dist/gui/tree/treeContext.d.ts +0 -1
  315. package/dist/gui/tree/treeContext.js +1 -2
  316. package/dist/gui/tree/treeContext.js.map +1 -1
  317. package/dist/index.d.ts +0 -2
  318. package/dist/index.js +1 -2
  319. package/dist/index.js.map +1 -1
  320. package/dist/node.js +1 -2
  321. package/dist/node_modules/lit-html/development/directives/ref.d.ts +14 -0
  322. package/dist/node_modules/lit-html/development/lit-html.d.ts +46 -0
  323. package/dist/otel/BridgeSpanExporter.js +1 -2
  324. package/dist/otel/BridgeSpanExporter.js.map +1 -1
  325. package/dist/otel/setupBrowserTracing.js +1 -2
  326. package/dist/otel/setupBrowserTracing.js.map +1 -1
  327. package/dist/otel/tracingHelpers.d.ts +0 -2
  328. package/dist/otel/tracingHelpers.js +1 -2
  329. package/dist/otel/tracingHelpers.js.map +1 -1
  330. package/dist/preview/AdaptiveResolutionTracker.js +11 -2
  331. package/dist/preview/AdaptiveResolutionTracker.js.map +1 -1
  332. package/dist/preview/FrameController.d.ts +0 -1
  333. package/dist/preview/FrameController.js +2 -32
  334. package/dist/preview/FrameController.js.map +1 -1
  335. package/dist/preview/QualityUpgradeScheduler.js +1 -1
  336. package/dist/preview/QualityUpgradeScheduler.js.map +1 -1
  337. package/dist/preview/RenderContext.d.ts +0 -1
  338. package/dist/preview/RenderContext.js +11 -2
  339. package/dist/preview/RenderContext.js.map +1 -1
  340. package/dist/preview/RenderProfiler.js +1 -1
  341. package/dist/preview/RenderProfiler.js.map +1 -1
  342. package/dist/preview/RenderStats.js +1 -1
  343. package/dist/preview/RenderStats.js.map +1 -1
  344. package/dist/preview/encoding/canvasEncoder.js +7 -2
  345. package/dist/preview/encoding/canvasEncoder.js.map +1 -1
  346. package/dist/preview/encoding/mainThreadEncoder.js +1 -1
  347. package/dist/preview/encoding/mainThreadEncoder.js.map +1 -1
  348. package/dist/preview/encoding/workerEncoder.js +1 -1
  349. package/dist/preview/encoding/workerEncoder.js.map +1 -1
  350. package/dist/preview/logger.js +1 -1
  351. package/dist/preview/logger.js.map +1 -1
  352. package/dist/preview/previewSettings.js +1 -1
  353. package/dist/preview/previewSettings.js.map +1 -1
  354. package/dist/preview/previewTypes.js +1 -1
  355. package/dist/preview/previewTypes.js.map +1 -1
  356. package/dist/preview/renderElementToCanvas.d.ts +0 -1
  357. package/dist/preview/renderElementToCanvas.js +12 -5
  358. package/dist/preview/renderElementToCanvas.js.map +1 -1
  359. package/dist/preview/renderTimegroupToCanvas.d.ts +0 -1
  360. package/dist/preview/renderTimegroupToCanvas.js +6 -7
  361. package/dist/preview/renderTimegroupToCanvas.js.map +1 -1
  362. package/dist/preview/renderTimegroupToVideo.d.ts +0 -1
  363. package/dist/preview/renderTimegroupToVideo.js +20 -8
  364. package/dist/preview/renderTimegroupToVideo.js.map +1 -1
  365. package/dist/preview/renderVideoToVideo.js +11 -2
  366. package/dist/preview/renderVideoToVideo.js.map +1 -1
  367. package/dist/preview/renderers.d.ts +0 -1
  368. package/dist/preview/renderers.js +5 -2
  369. package/dist/preview/renderers.js.map +1 -1
  370. package/dist/preview/rendering/ScaleConfig.js +2 -3
  371. package/dist/preview/rendering/ScaleConfig.js.map +1 -1
  372. package/dist/preview/rendering/inlineImages.d.ts +0 -1
  373. package/dist/preview/rendering/inlineImages.js +1 -1
  374. package/dist/preview/rendering/inlineImages.js.map +1 -1
  375. package/dist/preview/rendering/loadImage.js +1 -2
  376. package/dist/preview/rendering/loadImage.js.map +1 -1
  377. package/dist/preview/rendering/renderToImageNative.js +4 -5
  378. package/dist/preview/rendering/renderToImageNative.js.map +1 -1
  379. package/dist/preview/rendering/serializeTimelineDirect.js +16 -4
  380. package/dist/preview/rendering/serializeTimelineDirect.js.map +1 -1
  381. package/dist/preview/statsTrackingStrategy.js +1 -1
  382. package/dist/preview/statsTrackingStrategy.js.map +1 -1
  383. package/dist/preview/workers/WorkerPool.js +5 -2
  384. package/dist/preview/workers/WorkerPool.js.map +1 -1
  385. package/dist/preview/workers/encoderWorkerInline.js +1 -1
  386. package/dist/preview/workers/encoderWorkerInline.js.map +1 -1
  387. package/dist/render/EFRenderAPI.d.ts +0 -1
  388. package/dist/render/EFRenderAPI.js +1 -2
  389. package/dist/render/EFRenderAPI.js.map +1 -1
  390. package/dist/render/getRenderData.js +1 -1
  391. package/dist/render/getRenderData.js.map +1 -1
  392. package/dist/transcoding/cache/RequestDeduplicator.js +1 -1
  393. package/dist/transcoding/cache/RequestDeduplicator.js.map +1 -1
  394. package/dist/transcoding/cache/URLTokenDeduplicator.js +1 -1
  395. package/dist/transcoding/cache/URLTokenDeduplicator.js.map +1 -1
  396. package/dist/transcoding/types/index.d.ts +0 -1
  397. package/dist/transcoding/utils/UrlGenerator.js +1 -1
  398. package/dist/transcoding/utils/UrlGenerator.js.map +1 -1
  399. package/dist/utils/LRUCache.js +1 -1
  400. package/dist/utils/LRUCache.js.map +1 -1
  401. package/dist/utils/frameTime.js +2 -9
  402. package/dist/utils/frameTime.js.map +1 -1
  403. package/dist/version.js +2 -2
  404. package/dist/version.js.map +1 -1
  405. package/package.json +5 -4
@@ -1,6 +1,3 @@
1
- import "../../transcoding/types/index.js";
2
- import "@editframe/assets";
3
-
4
1
  //#region src/elements/EFMedia/SegmentIndex.d.ts
5
2
  type TrackRole = "video" | "audio" | "scrub";
6
3
  interface TrackRef {
@@ -1,5 +1,4 @@
1
1
  import { convertToScaledTime, roundToMilliseconds } from "./shared/PrecisionUtils.js";
2
-
3
2
  //#region src/elements/EFMedia/SegmentIndex.ts
4
3
  function createFragmentIndex(data, src) {
5
4
  const durationMs = Object.values(data).reduce((max, fragment) => Math.max(max, fragment.duration / fragment.timescale), 0) * 1e3;
@@ -187,7 +186,7 @@ function createManifestIndex(manifest) {
187
186
  }
188
187
  };
189
188
  }
190
-
191
189
  //#endregion
192
190
  export { createFragmentIndex, createManifestIndex };
191
+
193
192
  //# sourceMappingURL=SegmentIndex.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SegmentIndex.js","names":["tracks: TrackSet","distance: number","ranges: SegmentTimeRange[]","segments: SegmentTimeRange[]"],"sources":["../../../src/elements/EFMedia/SegmentIndex.ts"],"sourcesContent":["import type { TrackFragmentIndex } from \"@editframe/assets\";\nimport type { ManifestResponse } from \"../../transcoding/types/index.js\";\nimport { convertToScaledTime, roundToMilliseconds } from \"./shared/PrecisionUtils.js\";\n\nexport type TrackRole = \"video\" | \"audio\" | \"scrub\";\n\nexport interface TrackRef {\n readonly role: TrackRole;\n readonly id: string | number;\n readonly src: string;\n readonly segmentDurationMs?: number;\n readonly segmentDurationsMs?: number[];\n readonly startTimeOffsetMs?: number;\n}\n\nexport interface TrackSet {\n video?: TrackRef;\n audio?: TrackRef;\n scrub?: TrackRef;\n /** Alpha matte track — grayscale H264, paired with `video`. */\n alpha?: TrackRef;\n}\n\nexport interface SegmentTimeRange {\n segmentId: number;\n startMs: number;\n endMs: number;\n}\n\nexport interface SegmentIndex {\n readonly durationMs: number;\n readonly tracks: TrackSet;\n segmentAt(timeMs: number, track: TrackRef): number | undefined;\n segmentsInRange(fromMs: number, toMs: number, track: TrackRef): SegmentTimeRange[];\n}\n\n// ---------------------------------------------------------------------------\n// FragmentIndex — backed by TrackFragmentIndex (local and file-id files)\n// ---------------------------------------------------------------------------\n\nexport function createFragmentIndex(\n data: Record<number, TrackFragmentIndex>,\n src: string,\n): SegmentIndex {\n const longestFragment = Object.values(data).reduce(\n (max, fragment) => Math.max(max, fragment.duration / fragment.timescale),\n 0,\n );\n const durationMs = longestFragment * 1000;\n\n const audioTrack = Object.values(data).find((t) => t.type === \"audio\");\n // Primary video track = lowest positive track number (track 2 is the alpha matte).\n const videoTrack = Object.values(data)\n .filter((t) => t.type === \"video\" && (t.track ?? 0) > 0)\n .sort((a, b) => (a.track ?? 0) - (b.track ?? 0))[0];\n const alphaTrackId = videoTrack?.type === \"video\" ? videoTrack.alphaTrackId : undefined;\n const alphaTrack = alphaTrackId !== undefined ? data[alphaTrackId] : undefined;\n const scrubTrack = data[-1];\n\n const tracks: TrackSet = {};\n\n if (videoTrack && videoTrack.track !== undefined) {\n tracks.video = {\n role: \"video\",\n id: videoTrack.track,\n src,\n startTimeOffsetMs: videoTrack.startTimeOffsetMs,\n };\n }\n\n if (alphaTrack && alphaTrack.track !== undefined) {\n tracks.alpha = {\n role: \"video\",\n id: alphaTrack.track,\n src,\n startTimeOffsetMs: alphaTrack.startTimeOffsetMs,\n };\n }\n\n if (audioTrack && audioTrack.track !== undefined) {\n tracks.audio = {\n role: \"audio\",\n id: audioTrack.track,\n src,\n };\n }\n\n if (scrubTrack && scrubTrack.track !== undefined) {\n const segmentDurationsMs =\n scrubTrack.segments.length > 0\n ? scrubTrack.segments.map((s) => (s.duration / scrubTrack.timescale) * 1000)\n : undefined;\n tracks.scrub = {\n role: \"scrub\",\n id: scrubTrack.track,\n src,\n segmentDurationMs: 30000,\n segmentDurationsMs,\n startTimeOffsetMs: scrubTrack.startTimeOffsetMs,\n };\n }\n\n return {\n durationMs,\n tracks,\n\n segmentAt(timeMs: number, track: TrackRef): number | undefined {\n const trackId = typeof track.id === \"number\" ? track.id : Number.parseInt(track.id, 10);\n const trackData = data[trackId];\n if (!trackData) {\n throw new Error(`Track ${trackId} not found`);\n }\n const { timescale, segments } = trackData;\n\n const startTimeOffsetMs = track.startTimeOffsetMs || 0;\n const offsetSeekTimeMs = roundToMilliseconds(timeMs + startTimeOffsetMs);\n const scaledSeekTime = convertToScaledTime(offsetSeekTimeMs, timescale);\n\n for (let i = segments.length - 1; i >= 0; i--) {\n const segment = segments[i]!;\n const segmentEndTime = segment.cts + segment.duration;\n if (segment.cts <= scaledSeekTime && scaledSeekTime < segmentEndTime) {\n return i;\n }\n }\n\n // Gap handling: find nearest segment\n let nearestSegmentIndex = 0;\n let nearestDistance = Number.MAX_SAFE_INTEGER;\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i]!;\n const segmentEndTime = segment.cts + segment.duration;\n\n let distance: number;\n if (scaledSeekTime < segment.cts) {\n distance = segment.cts - scaledSeekTime;\n } else if (scaledSeekTime >= segmentEndTime) {\n distance = scaledSeekTime - segmentEndTime;\n } else {\n return i;\n }\n\n if (distance < nearestDistance) {\n nearestDistance = distance;\n nearestSegmentIndex = i;\n }\n }\n\n return nearestSegmentIndex;\n },\n\n segmentsInRange(fromMs: number, toMs: number, track: TrackRef): SegmentTimeRange[] {\n if (fromMs >= toMs) return [];\n\n const trackId = typeof track.id === \"number\" ? track.id : Number.parseInt(track.id, 10);\n const trackData = data[trackId];\n if (!trackData) return [];\n\n const { timescale, segments } = trackData;\n const ranges: SegmentTimeRange[] = [];\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i]!;\n const segmentStartMs = (segment.cts / timescale) * 1000;\n const segmentEndMs = ((segment.cts + segment.duration) / timescale) * 1000;\n\n if (segmentStartMs < toMs && segmentEndMs > fromMs) {\n ranges.push({\n segmentId: i,\n startMs: segmentStartMs,\n endMs: segmentEndMs,\n });\n }\n }\n\n return ranges;\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// ManifestIndex — backed by ManifestResponse (JIT transcoding)\n// ---------------------------------------------------------------------------\n\nexport function createManifestIndex(manifest: ManifestResponse): SegmentIndex {\n const durationMs = manifest.durationMs;\n const tracks: TrackSet = {};\n\n if (manifest.videoRenditions && manifest.videoRenditions.length > 0) {\n const r = manifest.videoRenditions[0]!;\n tracks.video = {\n role: \"video\",\n id: r.id,\n src: manifest.sourceUrl,\n segmentDurationMs: r.segmentDurationMs,\n segmentDurationsMs: r.segmentDurationsMs,\n startTimeOffsetMs: r.startTimeOffsetMs,\n };\n\n const scrubRendition = manifest.videoRenditions.find((v) => v.id === \"scrub\");\n if (scrubRendition) {\n tracks.scrub = {\n role: \"scrub\",\n id: scrubRendition.id,\n src: manifest.sourceUrl,\n segmentDurationMs: scrubRendition.segmentDurationMs,\n segmentDurationsMs: scrubRendition.segmentDurationsMs,\n startTimeOffsetMs: scrubRendition.startTimeOffsetMs,\n };\n }\n }\n\n if (manifest.audioRenditions && manifest.audioRenditions.length > 0) {\n const r = manifest.audioRenditions[0]!;\n tracks.audio = {\n role: \"audio\",\n id: r.id,\n src: manifest.sourceUrl,\n segmentDurationMs: r.segmentDurationMs,\n segmentDurationsMs: r.segmentDurationsMs,\n startTimeOffsetMs: r.startTimeOffsetMs,\n };\n }\n\n function computeSegmentIdForTrack(\n desiredSeekTimeMs: number,\n track: TrackRef,\n ): number | undefined {\n if (desiredSeekTimeMs > durationMs) {\n return undefined;\n }\n\n if (track.segmentDurationsMs && track.segmentDurationsMs.length > 0) {\n let cumulativeTime = 0;\n for (let i = 0; i < track.segmentDurationsMs.length; i++) {\n const segmentDuration = track.segmentDurationsMs[i];\n if (segmentDuration === undefined) {\n throw new Error(\"Segment duration is required for JIT metadata\");\n }\n const segmentStartMs = cumulativeTime;\n const segmentEndMs = cumulativeTime + segmentDuration;\n\n const isLastSegment = i === track.segmentDurationsMs.length - 1;\n const includesEndTime = isLastSegment && desiredSeekTimeMs === durationMs;\n\n if (\n desiredSeekTimeMs >= segmentStartMs &&\n (desiredSeekTimeMs < segmentEndMs || includesEndTime)\n ) {\n return i + 1;\n }\n\n cumulativeTime += segmentDuration;\n if (cumulativeTime >= durationMs) break;\n }\n return undefined;\n }\n\n if (!track.segmentDurationMs) {\n throw new Error(\"Segment duration is required for JIT metadata\");\n }\n\n const segmentIndex = Math.floor(desiredSeekTimeMs / track.segmentDurationMs);\n const segmentStartMs = segmentIndex * track.segmentDurationMs;\n if (segmentStartMs >= durationMs) {\n return undefined;\n }\n return segmentIndex + 1;\n }\n\n return {\n durationMs,\n tracks,\n\n segmentAt(timeMs: number, track: TrackRef): number | undefined {\n return computeSegmentIdForTrack(timeMs, track);\n },\n\n segmentsInRange(fromMs: number, toMs: number, track: TrackRef): SegmentTimeRange[] {\n if (fromMs >= toMs) return [];\n\n const segments: SegmentTimeRange[] = [];\n\n if (track.segmentDurationsMs && track.segmentDurationsMs.length > 0) {\n let cumulativeTime = 0;\n for (let i = 0; i < track.segmentDurationsMs.length; i++) {\n const segmentDuration = track.segmentDurationsMs[i];\n if (segmentDuration === undefined) continue;\n const segmentStartMs = cumulativeTime;\n const segmentEndMs = Math.min(cumulativeTime + segmentDuration, durationMs);\n\n if (segmentStartMs >= durationMs) break;\n\n if (segmentStartMs < toMs && segmentEndMs > fromMs) {\n segments.push({\n segmentId: i + 1,\n startMs: segmentStartMs,\n endMs: segmentEndMs,\n });\n }\n\n cumulativeTime += segmentDuration;\n if (cumulativeTime >= durationMs) break;\n }\n return segments;\n }\n\n const segmentDurationMs = track.segmentDurationMs || 1000;\n const startSegmentIndex = Math.floor(fromMs / segmentDurationMs);\n const endSegmentIndex = Math.floor(toMs / segmentDurationMs);\n\n for (let i = startSegmentIndex; i <= endSegmentIndex; i++) {\n const segmentId = i + 1;\n const segmentStartMs = i * segmentDurationMs;\n const segmentEndMs = Math.min((i + 1) * segmentDurationMs, durationMs);\n\n if (segmentStartMs >= durationMs) break;\n if (segmentStartMs < toMs && segmentEndMs > fromMs) {\n segments.push({\n segmentId,\n startMs: segmentStartMs,\n endMs: segmentEndMs,\n });\n }\n }\n\n return segments;\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SegmentIndex.js","names":[],"sources":["../../../src/elements/EFMedia/SegmentIndex.ts"],"mappings":"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"}
@@ -1,6 +1,4 @@
1
1
  import { TrackRef } from "./SegmentIndex.js";
2
- import "@editframe/assets";
3
-
4
2
  //#region src/elements/EFMedia/SegmentTransport.d.ts
5
3
  interface SegmentTransport {
6
4
  fetchInitSegment(track: TrackRef, signal?: AbortSignal): Promise<ArrayBuffer>;
@@ -63,7 +63,7 @@ function createByteRangeTransport(data, fileId, apiHost, fetcher) {
63
63
  }
64
64
  };
65
65
  }
66
-
67
66
  //#endregion
68
67
  export { createByteRangeTransport, createUrlTransport };
68
+
69
69
  //# sourceMappingURL=SegmentTransport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SegmentTransport.js","names":[],"sources":["../../../src/elements/EFMedia/SegmentTransport.ts"],"sourcesContent":["import type { TrackFragmentIndex } from \"@editframe/assets\";\nimport type { RenditionId } from \"../../transcoding/types/index.js\";\nimport type { TrackRef } from \"./SegmentIndex.js\";\nimport type { CachedFetcher } from \"./CachedFetcher.js\";\n\nexport interface SegmentTransport {\n fetchInitSegment(track: TrackRef, signal?: AbortSignal): Promise<ArrayBuffer>;\n fetchMediaSegment(segmentId: number, track: TrackRef, signal?: AbortSignal): Promise<ArrayBuffer>;\n isCached(segmentId: number, track: TrackRef): boolean;\n}\n\n// ---------------------------------------------------------------------------\n// UrlTransport — each segment has its own URL\n// Used by AssetMediaEngine (via JIT URLs) and JitMediaEngine natively.\n// ---------------------------------------------------------------------------\n\ninterface UrlTransportOptions {\n fetcher: CachedFetcher;\n src: string;\n templates: { initSegment: string; mediaSegment: string };\n audioTrackId: number | undefined;\n videoTrackId: number | undefined;\n}\n\nfunction resolveRenditionId(track: TrackRef): RenditionId {\n if (track.role === \"audio\") return \"audio\";\n if (track.role === \"scrub\") return \"scrub\";\n if (typeof track.id === \"string\") return track.id as RenditionId;\n // For numeric IDs (fragment-based), map to JIT rendition names\n if (track.id === -1) return \"scrub\";\n if (track.id === 2) return \"audio\";\n return \"high\";\n}\n\nexport function createUrlTransport(opts: UrlTransportOptions): SegmentTransport {\n const { fetcher, src, templates, audioTrackId, videoTrackId } = opts;\n\n function buildSegmentUrl(segmentId: \"init\" | number, track: TrackRef): string {\n const renditionId = resolveRenditionId(track);\n const template = segmentId === \"init\" ? templates.initSegment : templates.mediaSegment;\n const trackId =\n typeof track.id === \"number\"\n ? track.id\n : track.role === \"audio\"\n ? audioTrackId\n : videoTrackId;\n return template\n .replace(\"{rendition}\", renditionId)\n .replace(\"{segmentId}\", segmentId.toString())\n .replace(\"{src}\", src)\n .replace(\"{trackId}\", trackId?.toString() ?? \"\");\n }\n\n return {\n async fetchInitSegment(track: TrackRef, signal?: AbortSignal): Promise<ArrayBuffer> {\n const url = buildSegmentUrl(\"init\", track);\n return fetcher.fetchArrayBuffer(url, signal);\n },\n\n async fetchMediaSegment(\n segmentId: number,\n track: TrackRef,\n signal?: AbortSignal,\n ): Promise<ArrayBuffer> {\n const url = buildSegmentUrl(segmentId, track);\n return fetcher.fetchArrayBuffer(url, signal);\n },\n\n isCached(segmentId: number, track: TrackRef): boolean {\n const url = buildSegmentUrl(segmentId, track);\n return fetcher.has(url);\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// ByteRangeTransport — fetches full track binary, slices segments\n// Used by FileMediaEngine.\n// ---------------------------------------------------------------------------\n\nexport function createByteRangeTransport(\n data: Record<number, TrackFragmentIndex>,\n fileId: string,\n apiHost: string,\n fetcher: CachedFetcher,\n): SegmentTransport {\n function buildTrackUrl(trackId: number): string {\n return `${apiHost}/api/v1/files/${fileId}/tracks/${trackId}`;\n }\n\n function getTrackId(track: TrackRef): number {\n const trackId = typeof track.id === \"number\" ? track.id : Number.parseInt(track.id, 10);\n if (Number.isNaN(trackId)) {\n throw new Error(`Invalid track ID: ${track.id}`);\n }\n return trackId;\n }\n\n return {\n async fetchInitSegment(track: TrackRef, signal?: AbortSignal): Promise<ArrayBuffer> {\n const trackId = getTrackId(track);\n const trackData = data[trackId];\n if (!trackData) throw new Error(`Track ${trackId} not found`);\n\n const { offset, size } = trackData.initSegment;\n const url = buildTrackUrl(trackId);\n const fullTrack = await fetcher.fetchArrayBuffer(url, signal);\n return fullTrack.slice(offset, offset + size);\n },\n\n async fetchMediaSegment(\n segmentId: number,\n track: TrackRef,\n signal?: AbortSignal,\n ): Promise<ArrayBuffer> {\n const trackId = getTrackId(track);\n const trackData = data[trackId];\n if (!trackData) throw new Error(`Track ${trackId} not found`);\n\n const segment = trackData.segments[segmentId];\n if (!segment) {\n throw new Error(`Segment ${segmentId} not found for track ${trackId}`);\n }\n\n const url = buildTrackUrl(trackId);\n const fullTrack = await fetcher.fetchArrayBuffer(url, signal);\n return fullTrack.slice(segment.offset, segment.offset + segment.size);\n },\n\n isCached(_segmentId: number, track: TrackRef): boolean {\n const trackId = getTrackId(track);\n const url = buildTrackUrl(trackId);\n return fetcher.has(url);\n },\n };\n}\n"],"mappings":";AAwBA,SAAS,mBAAmB,OAA8B;AACxD,KAAI,MAAM,SAAS,QAAS,QAAO;AACnC,KAAI,MAAM,SAAS,QAAS,QAAO;AACnC,KAAI,OAAO,MAAM,OAAO,SAAU,QAAO,MAAM;AAE/C,KAAI,MAAM,OAAO,GAAI,QAAO;AAC5B,KAAI,MAAM,OAAO,EAAG,QAAO;AAC3B,QAAO;;AAGT,SAAgB,mBAAmB,MAA6C;CAC9E,MAAM,EAAE,SAAS,KAAK,WAAW,cAAc,iBAAiB;CAEhE,SAAS,gBAAgB,WAA4B,OAAyB;EAC5E,MAAM,cAAc,mBAAmB,MAAM;EAC7C,MAAM,WAAW,cAAc,SAAS,UAAU,cAAc,UAAU;EAC1E,MAAM,UACJ,OAAO,MAAM,OAAO,WAChB,MAAM,KACN,MAAM,SAAS,UACb,eACA;AACR,SAAO,SACJ,QAAQ,eAAe,YAAY,CACnC,QAAQ,eAAe,UAAU,UAAU,CAAC,CAC5C,QAAQ,SAAS,IAAI,CACrB,QAAQ,aAAa,SAAS,UAAU,IAAI,GAAG;;AAGpD,QAAO;EACL,MAAM,iBAAiB,OAAiB,QAA4C;GAClF,MAAM,MAAM,gBAAgB,QAAQ,MAAM;AAC1C,UAAO,QAAQ,iBAAiB,KAAK,OAAO;;EAG9C,MAAM,kBACJ,WACA,OACA,QACsB;GACtB,MAAM,MAAM,gBAAgB,WAAW,MAAM;AAC7C,UAAO,QAAQ,iBAAiB,KAAK,OAAO;;EAG9C,SAAS,WAAmB,OAA0B;GACpD,MAAM,MAAM,gBAAgB,WAAW,MAAM;AAC7C,UAAO,QAAQ,IAAI,IAAI;;EAE1B;;AAQH,SAAgB,yBACd,MACA,QACA,SACA,SACkB;CAClB,SAAS,cAAc,SAAyB;AAC9C,SAAO,GAAG,QAAQ,gBAAgB,OAAO,UAAU;;CAGrD,SAAS,WAAW,OAAyB;EAC3C,MAAM,UAAU,OAAO,MAAM,OAAO,WAAW,MAAM,KAAK,OAAO,SAAS,MAAM,IAAI,GAAG;AACvF,MAAI,OAAO,MAAM,QAAQ,CACvB,OAAM,IAAI,MAAM,qBAAqB,MAAM,KAAK;AAElD,SAAO;;AAGT,QAAO;EACL,MAAM,iBAAiB,OAAiB,QAA4C;GAClF,MAAM,UAAU,WAAW,MAAM;GACjC,MAAM,YAAY,KAAK;AACvB,OAAI,CAAC,UAAW,OAAM,IAAI,MAAM,SAAS,QAAQ,YAAY;GAE7D,MAAM,EAAE,QAAQ,SAAS,UAAU;GACnC,MAAM,MAAM,cAAc,QAAQ;AAElC,WADkB,MAAM,QAAQ,iBAAiB,KAAK,OAAO,EAC5C,MAAM,QAAQ,SAAS,KAAK;;EAG/C,MAAM,kBACJ,WACA,OACA,QACsB;GACtB,MAAM,UAAU,WAAW,MAAM;GACjC,MAAM,YAAY,KAAK;AACvB,OAAI,CAAC,UAAW,OAAM,IAAI,MAAM,SAAS,QAAQ,YAAY;GAE7D,MAAM,UAAU,UAAU,SAAS;AACnC,OAAI,CAAC,QACH,OAAM,IAAI,MAAM,WAAW,UAAU,uBAAuB,UAAU;GAGxE,MAAM,MAAM,cAAc,QAAQ;AAElC,WADkB,MAAM,QAAQ,iBAAiB,KAAK,OAAO,EAC5C,MAAM,QAAQ,QAAQ,QAAQ,SAAS,QAAQ,KAAK;;EAGvE,SAAS,YAAoB,OAA0B;GAErD,MAAM,MAAM,cADI,WAAW,MAAM,CACC;AAClC,UAAO,QAAQ,IAAI,IAAI;;EAE1B"}
1
+ {"version":3,"file":"SegmentTransport.js","names":[],"sources":["../../../src/elements/EFMedia/SegmentTransport.ts"],"mappings":";AAwBA,SAAS,mBAAmB,OAA8B;AACxD,KAAI,MAAM,SAAS,QAAS,QAAO;AACnC,KAAI,MAAM,SAAS,QAAS,QAAO;AACnC,KAAI,OAAO,MAAM,OAAO,SAAU,QAAO,MAAM;AAE/C,KAAI,MAAM,OAAO,GAAI,QAAO;AAC5B,KAAI,MAAM,OAAO,EAAG,QAAO;AAC3B,QAAO;;AAGT,SAAgB,mBAAmB,MAA6C;CAC9E,MAAM,EAAE,SAAS,KAAK,WAAW,cAAc,iBAAiB;CAEhE,SAAS,gBAAgB,WAA4B,OAAyB;EAC5E,MAAM,cAAc,mBAAmB,MAAM;EAC7C,MAAM,WAAW,cAAc,SAAS,UAAU,cAAc,UAAU;EAC1E,MAAM,UACJ,OAAO,MAAM,OAAO,WAChB,MAAM,KACN,MAAM,SAAS,UACb,eACA;AACR,SAAO,SACJ,QAAQ,eAAe,YAAY,CACnC,QAAQ,eAAe,UAAU,UAAU,CAAC,CAC5C,QAAQ,SAAS,IAAI,CACrB,QAAQ,aAAa,SAAS,UAAU,IAAI,GAAG;;AAGpD,QAAO;EACL,MAAM,iBAAiB,OAAiB,QAA4C;GAClF,MAAM,MAAM,gBAAgB,QAAQ,MAAM;AAC1C,UAAO,QAAQ,iBAAiB,KAAK,OAAO;;EAG9C,MAAM,kBACJ,WACA,OACA,QACsB;GACtB,MAAM,MAAM,gBAAgB,WAAW,MAAM;AAC7C,UAAO,QAAQ,iBAAiB,KAAK,OAAO;;EAG9C,SAAS,WAAmB,OAA0B;GACpD,MAAM,MAAM,gBAAgB,WAAW,MAAM;AAC7C,UAAO,QAAQ,IAAI,IAAI;;EAE1B;;AAQH,SAAgB,yBACd,MACA,QACA,SACA,SACkB;CAClB,SAAS,cAAc,SAAyB;AAC9C,SAAO,GAAG,QAAQ,gBAAgB,OAAO,UAAU;;CAGrD,SAAS,WAAW,OAAyB;EAC3C,MAAM,UAAU,OAAO,MAAM,OAAO,WAAW,MAAM,KAAK,OAAO,SAAS,MAAM,IAAI,GAAG;AACvF,MAAI,OAAO,MAAM,QAAQ,CACvB,OAAM,IAAI,MAAM,qBAAqB,MAAM,KAAK;AAElD,SAAO;;AAGT,QAAO;EACL,MAAM,iBAAiB,OAAiB,QAA4C;GAClF,MAAM,UAAU,WAAW,MAAM;GACjC,MAAM,YAAY,KAAK;AACvB,OAAI,CAAC,UAAW,OAAM,IAAI,MAAM,SAAS,QAAQ,YAAY;GAE7D,MAAM,EAAE,QAAQ,SAAS,UAAU;GACnC,MAAM,MAAM,cAAc,QAAQ;AAElC,WADkB,MAAM,QAAQ,iBAAiB,KAAK,OAAO,EAC5C,MAAM,QAAQ,SAAS,KAAK;;EAG/C,MAAM,kBACJ,WACA,OACA,QACsB;GACtB,MAAM,UAAU,WAAW,MAAM;GACjC,MAAM,YAAY,KAAK;AACvB,OAAI,CAAC,UAAW,OAAM,IAAI,MAAM,SAAS,QAAQ,YAAY;GAE7D,MAAM,UAAU,UAAU,SAAS;AACnC,OAAI,CAAC,QACH,OAAM,IAAI,MAAM,WAAW,UAAU,uBAAuB,UAAU;GAGxE,MAAM,MAAM,cAAc,QAAQ;AAElC,WADkB,MAAM,QAAQ,iBAAiB,KAAK,OAAO,EAC5C,MAAM,QAAQ,QAAQ,QAAQ,SAAS,QAAQ,KAAK;;EAGvE,SAAS,YAAoB,OAA0B;GAErD,MAAM,MAAM,cADI,WAAW,MAAM,CACC;AAClC,UAAO,QAAQ,IAAI,IAAI;;EAE1B"}
@@ -1,6 +1,4 @@
1
1
  import { TrackRef } from "./SegmentIndex.js";
2
- import "@editframe/assets";
3
-
4
2
  //#region src/elements/EFMedia/TimingModel.d.ts
5
3
  interface TimingModel {
6
4
  toContainerSeconds(timeMs: number, segmentId: number, track: TrackRef): number;
@@ -22,7 +22,7 @@ function createJitTiming() {
22
22
  return timeMs / 1e3;
23
23
  } };
24
24
  }
25
-
26
25
  //#endregion
27
26
  export { createByteRangeTiming, createJitTiming };
27
+
28
28
  //# sourceMappingURL=TimingModel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimingModel.js","names":[],"sources":["../../../src/elements/EFMedia/TimingModel.ts"],"sourcesContent":["import type { TrackFragmentIndex } from \"@editframe/assets\";\nimport type { TrackRef } from \"./SegmentIndex.js\";\n\nexport interface TimingModel {\n toContainerSeconds(timeMs: number, segmentId: number, track: TrackRef): number;\n}\n\n/**\n * For byte-range sliced segments from full track files (FileMediaEngine).\n * mediabunny sees segment-relative timestamps since we sliced at segment boundaries,\n * so we subtract the segment's CTS to get relative time.\n */\nexport function createByteRangeTiming(data: Record<number, TrackFragmentIndex>): TimingModel {\n return {\n toContainerSeconds(timeMs: number, segmentId: number, track: TrackRef): number {\n const trackId = typeof track.id === \"number\" ? track.id : Number.parseInt(track.id, 10);\n const trackData = data[trackId];\n if (!trackData) throw new Error(\"Track not found\");\n\n const segment = trackData.segments[segmentId];\n if (!segment) throw new Error(\"Segment not found\");\n\n const segmentStartMs = (segment.cts / trackData.timescale) * 1000;\n return (timeMs - segmentStartMs) / 1000;\n },\n };\n}\n\n/**\n * For JIT transcoded segments (JitMediaEngine).\n * Segments are self-contained — just convert ms to seconds.\n */\nexport function createJitTiming(): TimingModel {\n return {\n toContainerSeconds(timeMs: number, _segmentId: number, _track: TrackRef): number {\n return timeMs / 1000;\n },\n };\n}\n"],"mappings":";;;;;;AAYA,SAAgB,sBAAsB,MAAuD;AAC3F,QAAO,EACL,mBAAmB,QAAgB,WAAmB,OAAyB;EAE7E,MAAM,YAAY,KADF,OAAO,MAAM,OAAO,WAAW,MAAM,KAAK,OAAO,SAAS,MAAM,IAAI,GAAG;AAEvF,MAAI,CAAC,UAAW,OAAM,IAAI,MAAM,kBAAkB;EAElD,MAAM,UAAU,UAAU,SAAS;AACnC,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,oBAAoB;AAGlD,UAAQ,SADgB,QAAQ,MAAM,UAAU,YAAa,OAC1B;IAEtC;;;;;;AAOH,SAAgB,kBAA+B;AAC7C,QAAO,EACL,mBAAmB,QAAgB,YAAoB,QAA0B;AAC/E,SAAO,SAAS;IAEnB"}
1
+ {"version":3,"file":"TimingModel.js","names":[],"sources":["../../../src/elements/EFMedia/TimingModel.ts"],"mappings":";;;;;;AAYA,SAAgB,sBAAsB,MAAuD;AAC3F,QAAO,EACL,mBAAmB,QAAgB,WAAmB,OAAyB;EAE7E,MAAM,YAAY,KADF,OAAO,MAAM,OAAO,WAAW,MAAM,KAAK,OAAO,SAAS,MAAM,IAAI,GAAG;AAEvF,MAAI,CAAC,UAAW,OAAM,IAAI,MAAM,kBAAkB;EAElD,MAAM,UAAU,UAAU,SAAS;AACnC,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,oBAAoB;AAGlD,UAAQ,SADgB,QAAQ,MAAM,UAAU,YAAa,OAC1B;IAEtC;;;;;;AAOH,SAAgB,kBAA+B;AAC7C,QAAO,EACL,mBAAmB,QAAgB,YAAoB,QAA0B;AAC/E,SAAO,SAAS;IAEnB"}
@@ -51,7 +51,7 @@ const fetchAudioSpanningTime = async (host, fromMs, toMs, signal) => {
51
51
  blob
52
52
  };
53
53
  };
54
-
55
54
  //#endregion
56
55
  export { fetchAudioSpanningTime };
56
+
57
57
  //# sourceMappingURL=AudioSpanUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AudioSpanUtils.js","names":[],"sources":["../../../../src/elements/EFMedia/shared/AudioSpanUtils.ts"],"sourcesContent":["import type { AudioSpan, MediaEngine, SegmentTimeRange } from \"../../../transcoding/types\";\nimport type { EFMedia } from \"../../EFMedia\";\n\n/**\n * Fetch audio segment data using MediaEngine\n * Pure function with explicit dependencies\n */\nconst fetchAudioSegmentData = async (\n segmentIds: number[],\n mediaEngine: MediaEngine,\n signal: AbortSignal,\n): Promise<Map<number, ArrayBuffer>> => {\n const audioTrack = mediaEngine.tracks.audio;\n if (!audioTrack) {\n throw new Error(\"Audio track not available\");\n }\n\n const segmentData = new Map<number, ArrayBuffer>();\n\n const fetchPromises = segmentIds.map(async (segmentId) => {\n const arrayBuffer = await mediaEngine.transport.fetchMediaSegment(\n segmentId,\n audioTrack,\n signal,\n );\n return [segmentId, arrayBuffer] as [number, ArrayBuffer];\n });\n\n const fetchedSegments = await Promise.all(fetchPromises);\n signal.throwIfAborted();\n\n for (const [segmentId, arrayBuffer] of fetchedSegments) {\n segmentData.set(segmentId, arrayBuffer);\n }\n\n return segmentData;\n};\n\n/**\n * Create audio span blob from init segment and media segments\n * Pure function for blob creation\n */\nconst createAudioSpanBlob = (initSegment: ArrayBuffer, mediaSegments: ArrayBuffer[]): Blob => {\n const chunks = [initSegment, ...mediaSegments];\n return new Blob(chunks, { type: \"audio/mp4\" });\n};\n\n/**\n * Fetch audio spanning a time range\n * Main function that orchestrates segment calculation, fetching, and blob creation\n */\nexport const fetchAudioSpanningTime = async (\n host: EFMedia,\n fromMs: number,\n toMs: number,\n signal: AbortSignal,\n): Promise<AudioSpan | undefined> => {\n // Validate inputs\n if (fromMs >= toMs || fromMs < 0) {\n throw new Error(`Invalid time range: fromMs=${fromMs}, toMs=${toMs}`);\n }\n\n // Get media engine using the new async method\n const mediaEngine = await host.getMediaEngine(signal);\n signal.throwIfAborted();\n\n const audioTrack = mediaEngine?.tracks.audio;\n if (!audioTrack) {\n return undefined;\n }\n\n // Fetch the init segment\n const initSegment = await mediaEngine.transport.fetchInitSegment(audioTrack, signal);\n signal.throwIfAborted();\n\n if (!initSegment) {\n return undefined;\n }\n\n // Calculate segments needed\n const segmentRanges = mediaEngine.index.segmentsInRange(fromMs, toMs, audioTrack);\n\n if (segmentRanges.length === 0) {\n throw new Error(`No segments found for time range ${fromMs}-${toMs}ms`);\n }\n\n // Fetch segment data\n const segmentIds = segmentRanges.map((r: SegmentTimeRange) => r.segmentId);\n const segmentData = await fetchAudioSegmentData(segmentIds, mediaEngine, signal);\n\n // Create ordered array of segments\n const orderedSegments = segmentIds.map((id: number) => {\n const segment = segmentData.get(id);\n if (!segment) {\n throw new Error(`Missing segment data for segment ID ${id}`);\n }\n return segment;\n });\n\n // Create blob\n const blob = createAudioSpanBlob(initSegment, orderedSegments);\n\n // Calculate actual time boundaries\n const actualStartMs = Math.min(...segmentRanges.map((r: SegmentTimeRange) => r.startMs));\n const actualEndMs = Math.max(...segmentRanges.map((r: SegmentTimeRange) => r.endMs));\n\n return {\n startMs: actualStartMs,\n endMs: actualEndMs,\n blob,\n };\n};\n"],"mappings":";;;;;AAOA,MAAM,wBAAwB,OAC5B,YACA,aACA,WACsC;CACtC,MAAM,aAAa,YAAY,OAAO;AACtC,KAAI,CAAC,WACH,OAAM,IAAI,MAAM,4BAA4B;CAG9C,MAAM,8BAAc,IAAI,KAA0B;CAElD,MAAM,gBAAgB,WAAW,IAAI,OAAO,cAAc;AAMxD,SAAO,CAAC,WALY,MAAM,YAAY,UAAU,kBAC9C,WACA,YACA,OACD,CAC8B;GAC/B;CAEF,MAAM,kBAAkB,MAAM,QAAQ,IAAI,cAAc;AACxD,QAAO,gBAAgB;AAEvB,MAAK,MAAM,CAAC,WAAW,gBAAgB,gBACrC,aAAY,IAAI,WAAW,YAAY;AAGzC,QAAO;;;;;;AAOT,MAAM,uBAAuB,aAA0B,kBAAuC;CAC5F,MAAM,SAAS,CAAC,aAAa,GAAG,cAAc;AAC9C,QAAO,IAAI,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;;;;;;AAOhD,MAAa,yBAAyB,OACpC,MACA,QACA,MACA,WACmC;AAEnC,KAAI,UAAU,QAAQ,SAAS,EAC7B,OAAM,IAAI,MAAM,8BAA8B,OAAO,SAAS,OAAO;CAIvE,MAAM,cAAc,MAAM,KAAK,eAAe,OAAO;AACrD,QAAO,gBAAgB;CAEvB,MAAM,aAAa,aAAa,OAAO;AACvC,KAAI,CAAC,WACH;CAIF,MAAM,cAAc,MAAM,YAAY,UAAU,iBAAiB,YAAY,OAAO;AACpF,QAAO,gBAAgB;AAEvB,KAAI,CAAC,YACH;CAIF,MAAM,gBAAgB,YAAY,MAAM,gBAAgB,QAAQ,MAAM,WAAW;AAEjF,KAAI,cAAc,WAAW,EAC3B,OAAM,IAAI,MAAM,oCAAoC,OAAO,GAAG,KAAK,IAAI;CAIzE,MAAM,aAAa,cAAc,KAAK,MAAwB,EAAE,UAAU;CAC1E,MAAM,cAAc,MAAM,sBAAsB,YAAY,aAAa,OAAO;CAYhF,MAAM,OAAO,oBAAoB,aATT,WAAW,KAAK,OAAe;EACrD,MAAM,UAAU,YAAY,IAAI,GAAG;AACnC,MAAI,CAAC,QACH,OAAM,IAAI,MAAM,uCAAuC,KAAK;AAE9D,SAAO;GACP,CAG4D;AAM9D,QAAO;EACL,SAJoB,KAAK,IAAI,GAAG,cAAc,KAAK,MAAwB,EAAE,QAAQ,CAAC;EAKtF,OAJkB,KAAK,IAAI,GAAG,cAAc,KAAK,MAAwB,EAAE,MAAM,CAAC;EAKlF;EACD"}
1
+ {"version":3,"file":"AudioSpanUtils.js","names":[],"sources":["../../../../src/elements/EFMedia/shared/AudioSpanUtils.ts"],"mappings":";;;;;AAOA,MAAM,wBAAwB,OAC5B,YACA,aACA,WACsC;CACtC,MAAM,aAAa,YAAY,OAAO;AACtC,KAAI,CAAC,WACH,OAAM,IAAI,MAAM,4BAA4B;CAG9C,MAAM,8BAAc,IAAI,KAA0B;CAElD,MAAM,gBAAgB,WAAW,IAAI,OAAO,cAAc;AAMxD,SAAO,CAAC,WALY,MAAM,YAAY,UAAU,kBAC9C,WACA,YACA,OACD,CAC8B;GAC/B;CAEF,MAAM,kBAAkB,MAAM,QAAQ,IAAI,cAAc;AACxD,QAAO,gBAAgB;AAEvB,MAAK,MAAM,CAAC,WAAW,gBAAgB,gBACrC,aAAY,IAAI,WAAW,YAAY;AAGzC,QAAO;;;;;;AAOT,MAAM,uBAAuB,aAA0B,kBAAuC;CAC5F,MAAM,SAAS,CAAC,aAAa,GAAG,cAAc;AAC9C,QAAO,IAAI,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;;;;;;AAOhD,MAAa,yBAAyB,OACpC,MACA,QACA,MACA,WACmC;AAEnC,KAAI,UAAU,QAAQ,SAAS,EAC7B,OAAM,IAAI,MAAM,8BAA8B,OAAO,SAAS,OAAO;CAIvE,MAAM,cAAc,MAAM,KAAK,eAAe,OAAO;AACrD,QAAO,gBAAgB;CAEvB,MAAM,aAAa,aAAa,OAAO;AACvC,KAAI,CAAC,WACH;CAIF,MAAM,cAAc,MAAM,YAAY,UAAU,iBAAiB,YAAY,OAAO;AACpF,QAAO,gBAAgB;AAEvB,KAAI,CAAC,YACH;CAIF,MAAM,gBAAgB,YAAY,MAAM,gBAAgB,QAAQ,MAAM,WAAW;AAEjF,KAAI,cAAc,WAAW,EAC3B,OAAM,IAAI,MAAM,oCAAoC,OAAO,GAAG,KAAK,IAAI;CAIzE,MAAM,aAAa,cAAc,KAAK,MAAwB,EAAE,UAAU;CAC1E,MAAM,cAAc,MAAM,sBAAsB,YAAY,aAAa,OAAO;CAYhF,MAAM,OAAO,oBAAoB,aATT,WAAW,KAAK,OAAe;EACrD,MAAM,UAAU,YAAY,IAAI,GAAG;AACnC,MAAI,CAAC,QACH,OAAM,IAAI,MAAM,uCAAuC,KAAK;AAE9D,SAAO;GACP,CAG4D;AAM9D,QAAO;EACL,SAJoB,KAAK,IAAI,GAAG,cAAc,KAAK,MAAwB,EAAE,QAAQ,CAAC;EAKtF,OAJkB,KAAK,IAAI,GAAG,cAAc,KAAK,MAAwB,EAAE,MAAM,CAAC;EAKlF;EACD"}
@@ -1,5 +1,4 @@
1
1
  import { LRUCache } from "../../../utils/LRUCache.js";
2
-
3
2
  //#region src/elements/EFMedia/shared/GlobalInputCache.ts
4
3
  /**
5
4
  * Global cache for MediaBunny Input instances
@@ -56,7 +55,7 @@ var GlobalInputCache = class {
56
55
  };
57
56
  const globalInputCache = new GlobalInputCache();
58
57
  globalThis.debugInputCache = globalInputCache;
59
-
60
58
  //#endregion
61
59
  export { globalInputCache };
60
+
62
61
  //# sourceMappingURL=GlobalInputCache.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GlobalInputCache.js","names":[],"sources":["../../../../src/elements/EFMedia/shared/GlobalInputCache.ts"],"sourcesContent":["import type { Input } from \"mediabunny\";\nimport { LRUCache } from \"../../../utils/LRUCache.js\";\n\n/**\n * Global cache for MediaBunny Input instances\n * Shared across all MediaEngine instances to prevent duplicate decoding\n * of the same segment data\n */\nclass GlobalInputCache {\n private cache = new LRUCache<string, Input>(50); // 50 Input instances max\n\n /**\n * Generate standardized cache key for Input objects\n * Format: \"input:{src}:{segmentId}:{renditionId}\"\n */\n private generateKey(src: string, segmentId: number, renditionId?: string): string {\n return `input:${src}:${segmentId}:${renditionId || \"default\"}`;\n }\n\n /**\n * Get cached Input object\n */\n get(src: string, segmentId: number, renditionId?: string): Input | undefined {\n const key = this.generateKey(src, segmentId, renditionId);\n return this.cache.get(key);\n }\n\n /**\n * Cache Input object\n */\n set(src: string, segmentId: number, input: Input, renditionId?: string): void {\n const key = this.generateKey(src, segmentId, renditionId);\n this.cache.set(key, input);\n }\n\n /**\n * Check if Input is cached\n */\n has(src: string, segmentId: number, renditionId?: string): boolean {\n const key = this.generateKey(src, segmentId, renditionId);\n return this.cache.has(key);\n }\n\n /**\n * Clear all cached Input objects\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * Get cache statistics for debugging\n */\n getStats() {\n return {\n size: this.cache.size,\n cachedKeys: Array.from((this.cache as any).cache.keys()),\n };\n }\n}\n\n// Single global instance shared across all MediaEngine instances\nexport const globalInputCache = new GlobalInputCache();\n\n// Export for debugging (works in both browser and server)\n(globalThis as typeof globalThis & { debugInputCache: typeof globalInputCache }).debugInputCache =\n globalInputCache;\n"],"mappings":";;;;;;;;AAQA,IAAM,mBAAN,MAAuB;;eACL,IAAI,SAAwB,GAAG;;;;;;CAM/C,AAAQ,YAAY,KAAa,WAAmB,aAA8B;AAChF,SAAO,SAAS,IAAI,GAAG,UAAU,GAAG,eAAe;;;;;CAMrD,IAAI,KAAa,WAAmB,aAAyC;EAC3E,MAAM,MAAM,KAAK,YAAY,KAAK,WAAW,YAAY;AACzD,SAAO,KAAK,MAAM,IAAI,IAAI;;;;;CAM5B,IAAI,KAAa,WAAmB,OAAc,aAA4B;EAC5E,MAAM,MAAM,KAAK,YAAY,KAAK,WAAW,YAAY;AACzD,OAAK,MAAM,IAAI,KAAK,MAAM;;;;;CAM5B,IAAI,KAAa,WAAmB,aAA+B;EACjE,MAAM,MAAM,KAAK,YAAY,KAAK,WAAW,YAAY;AACzD,SAAO,KAAK,MAAM,IAAI,IAAI;;;;;CAM5B,QAAc;AACZ,OAAK,MAAM,OAAO;;;;;CAMpB,WAAW;AACT,SAAO;GACL,MAAM,KAAK,MAAM;GACjB,YAAY,MAAM,KAAM,KAAK,MAAc,MAAM,MAAM,CAAC;GACzD;;;AAKL,MAAa,mBAAmB,IAAI,kBAAkB;AAGtD,AAAC,WAAgF,kBAC/E"}
1
+ {"version":3,"file":"GlobalInputCache.js","names":[],"sources":["../../../../src/elements/EFMedia/shared/GlobalInputCache.ts"],"mappings":";;;;;;;AAQA,IAAM,mBAAN,MAAuB;;eACL,IAAI,SAAwB,GAAG;;;;;;CAM/C,YAAoB,KAAa,WAAmB,aAA8B;AAChF,SAAO,SAAS,IAAI,GAAG,UAAU,GAAG,eAAe;;;;;CAMrD,IAAI,KAAa,WAAmB,aAAyC;EAC3E,MAAM,MAAM,KAAK,YAAY,KAAK,WAAW,YAAY;AACzD,SAAO,KAAK,MAAM,IAAI,IAAI;;;;;CAM5B,IAAI,KAAa,WAAmB,OAAc,aAA4B;EAC5E,MAAM,MAAM,KAAK,YAAY,KAAK,WAAW,YAAY;AACzD,OAAK,MAAM,IAAI,KAAK,MAAM;;;;;CAM5B,IAAI,KAAa,WAAmB,aAA+B;EACjE,MAAM,MAAM,KAAK,YAAY,KAAK,WAAW,YAAY;AACzD,SAAO,KAAK,MAAM,IAAI,IAAI;;;;;CAM5B,QAAc;AACZ,OAAK,MAAM,OAAO;;;;;CAMpB,WAAW;AACT,SAAO;GACL,MAAM,KAAK,MAAM;GACjB,YAAY,MAAM,KAAM,KAAK,MAAc,MAAM,MAAM,CAAC;GACzD;;;AAKL,MAAa,mBAAmB,IAAI,kBAAkB;AAGtD,WAAiF,kBAC/E"}
@@ -27,7 +27,7 @@ const convertToScaledTime = (timeMs, timescale) => {
27
27
  const scaledTime = timeMs / 1e3 * timescale;
28
28
  return Math.round(scaledTime);
29
29
  };
30
-
31
30
  //#endregion
32
31
  export { convertToScaledTime, roundToMilliseconds };
32
+
33
33
  //# sourceMappingURL=PrecisionUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PrecisionUtils.js","names":[],"sources":["../../../../src/elements/EFMedia/shared/PrecisionUtils.ts"],"sourcesContent":["/**\n * Centralized precision utilities for consistent timing calculations across the media pipeline.\n *\n * The key insight is that floating-point precision errors can cause inconsistencies between:\n * 1. Segment selection logic (in AssetMediaEngine.computeSegmentId)\n * 2. Sample finding logic (in SampleBuffer.find)\n * 3. Timeline mapping (in BufferedSeekingInput.seek)\n *\n * All timing calculations must use the same rounding strategy to ensure consistency.\n */\n\n/**\n * Round time to millisecond precision to handle floating-point precision issues.\n * Uses Math.round for consistent behavior across the entire pipeline.\n *\n * This function should be used for ALL time-related calculations that need to be\n * compared between different parts of the system.\n */\nexport const roundToMilliseconds = (timeMs: number): number => {\n // Round to 3 decimal places (microsecond precision)\n return Math.round(timeMs * 1000) / 1000;\n};\n\n/**\n * Convert media time (in seconds) to scaled time units using consistent rounding.\n * This is used in segment selection to convert from milliseconds to timescale units.\n */\nexport const convertToScaledTime = (timeMs: number, timescale: number): number => {\n const scaledTime = (timeMs / 1000) * timescale;\n return Math.round(scaledTime);\n};\n\n/**\n * Convert scaled time units back to media time (in milliseconds) using consistent rounding.\n * This is the inverse of convertToScaledTime.\n */\nexport const convertFromScaledTime = (scaledTime: number, timescale: number): number => {\n const timeMs = (scaledTime / timescale) * 1000;\n return roundToMilliseconds(timeMs);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAkBA,MAAa,uBAAuB,WAA2B;AAE7D,QAAO,KAAK,MAAM,SAAS,IAAK,GAAG;;;;;;AAOrC,MAAa,uBAAuB,QAAgB,cAA8B;CAChF,MAAM,aAAc,SAAS,MAAQ;AACrC,QAAO,KAAK,MAAM,WAAW"}
1
+ {"version":3,"file":"PrecisionUtils.js","names":[],"sources":["../../../../src/elements/EFMedia/shared/PrecisionUtils.ts"],"mappings":";;;;;;;;;;;;;;;;;;AAkBA,MAAa,uBAAuB,WAA2B;AAE7D,QAAO,KAAK,MAAM,SAAS,IAAK,GAAG;;;;;;AAOrC,MAAa,uBAAuB,QAAgB,cAA8B;CAChF,MAAM,aAAc,SAAS,MAAQ;AACrC,QAAO,KAAK,MAAM,WAAW"}
@@ -1,7 +1,6 @@
1
1
  import { globalInputCache } from "./GlobalInputCache.js";
2
2
  import { DEFAULT_MEDIABUNNY_TIMEOUT_MS, withTimeout } from "./timeoutUtils.js";
3
3
  import { ALL_FORMATS, BlobSource, CanvasSink, Input } from "mediabunny";
4
-
5
4
  //#region src/elements/EFMedia/shared/ThumbnailExtractor.ts
6
5
  /**
7
6
  * Maximum number of segment extract operations that may run concurrently across
@@ -153,7 +152,7 @@ var ThumbnailExtractor = class {
153
152
  return results;
154
153
  }
155
154
  };
156
-
157
155
  //#endregion
158
156
  export { ThumbnailExtractor };
157
+
159
158
  //# sourceMappingURL=ThumbnailExtractor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ThumbnailExtractor.js","names":["#max","#active","#release","#queue","mediaEngine: MediaEngine"],"sources":["../../../../src/elements/EFMedia/shared/ThumbnailExtractor.ts"],"sourcesContent":["import { ALL_FORMATS, BlobSource, CanvasSink, Input } from \"mediabunny\";\nimport type { ThumbnailResult } from \"../../../transcoding/types/index.js\";\nimport type { MediaEngine } from \"../MediaEngine.js\";\nimport type { TrackRef } from \"../SegmentIndex.js\";\nimport { globalInputCache } from \"./GlobalInputCache.js\";\nimport { withTimeout, DEFAULT_MEDIABUNNY_TIMEOUT_MS } from \"./timeoutUtils.js\";\n\n/**\n * Maximum number of segment extract operations that may run concurrently across\n * all ThumbnailExtractor instances. Each operation fetches one init+media pair\n * and decodes frames via mediabunny. Without this cap, N strips mounting\n * simultaneously would fire N×M concurrent requests (N strips × M segments).\n */\nconst THUMBNAIL_SEGMENT_FETCH_CONCURRENCY = 4;\n\n/**\n * Counting semaphore shared across all ThumbnailExtractor instances.\n * Exported so tests can call reset() between test cases to prevent state bleed.\n */\nexport class Semaphore {\n #active = 0;\n #queue: Array<() => void> = [];\n readonly #max: number;\n\n constructor(max: number) {\n this.#max = max;\n }\n\n acquire(signal?: AbortSignal): Promise<() => void> {\n if (signal?.aborted) {\n return Promise.reject(new DOMException(\"Aborted\", \"AbortError\"));\n }\n if (this.#active < this.#max) {\n this.#active++;\n return Promise.resolve(() => this.#release());\n }\n return new Promise<() => void>((resolve, reject) => {\n const entry = () => {\n this.#active++;\n resolve(() => this.#release());\n };\n this.#queue.push(entry);\n signal?.addEventListener(\n \"abort\",\n () => {\n const idx = this.#queue.indexOf(entry);\n if (idx !== -1) this.#queue.splice(idx, 1);\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n },\n { once: true },\n );\n });\n }\n\n #release(): void {\n this.#active--;\n const next = this.#queue.shift();\n if (next) next();\n }\n\n /** Reset to empty state. For test isolation only. */\n reset(): void {\n this.#active = 0;\n this.#queue.length = 0;\n }\n}\n\nexport const thumbnailSemaphore = new Semaphore(THUMBNAIL_SEGMENT_FETCH_CONCURRENCY);\n\nexport class ThumbnailExtractor {\n constructor(private mediaEngine: MediaEngine) {}\n\n async extractThumbnails(\n timestamps: number[],\n track: TrackRef,\n durationMs: number,\n signal?: AbortSignal,\n ): Promise<(ThumbnailResult | null)[]> {\n if (timestamps.length === 0) {\n return [];\n }\n\n const validTimestamps = timestamps.filter((timeMs) => timeMs >= 0 && timeMs <= durationMs);\n\n if (validTimestamps.length === 0) {\n console.warn(`ThumbnailExtractor: All timestamps out of bounds (0-${durationMs}ms)`);\n return timestamps.map(() => null);\n }\n\n const segmentGroups = this.groupTimestampsBySegment(validTimestamps, track);\n const results = new Map<number, ThumbnailResult | null>();\n\n for (const [segmentId, segmentTimestamps] of segmentGroups) {\n signal?.throwIfAborted();\n\n try {\n const segmentResults = await this.extractSegmentThumbnails(\n segmentId,\n segmentTimestamps,\n track,\n signal,\n );\n\n for (const [timestamp, thumbnail] of segmentResults) {\n results.set(timestamp, thumbnail);\n }\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n throw error;\n }\n console.warn(\n `ThumbnailExtractor: Failed to extract thumbnails for segment ${segmentId}:`,\n error,\n );\n for (const timestamp of segmentTimestamps) {\n results.set(timestamp, null);\n }\n }\n }\n\n return timestamps.map((t) => {\n if (t < 0 || t > durationMs) {\n return null;\n }\n return results.get(t) || null;\n });\n }\n\n private groupTimestampsBySegment(timestamps: number[], track: TrackRef): Map<number, number[]> {\n const segmentGroups = new Map<number, number[]>();\n\n for (const timeMs of timestamps) {\n try {\n const segmentId = this.mediaEngine.index.segmentAt(timeMs, track);\n if (segmentId !== undefined) {\n if (!segmentGroups.has(segmentId)) {\n segmentGroups.set(segmentId, []);\n }\n const segmentGroup = segmentGroups.get(segmentId)!;\n segmentGroup.push(timeMs);\n }\n } catch (error) {\n console.warn(\n `ThumbnailExtractor: Could not compute segment for timestamp ${timeMs}:`,\n error,\n );\n }\n }\n\n return segmentGroups;\n }\n\n private async extractSegmentThumbnails(\n segmentId: number,\n timestamps: number[],\n track: TrackRef,\n signal?: AbortSignal,\n ): Promise<Map<number, ThumbnailResult | null>> {\n const results = new Map<number, ThumbnailResult | null>();\n\n signal?.throwIfAborted();\n const release = await thumbnailSemaphore.acquire(signal);\n\n try {\n signal?.throwIfAborted();\n\n const initP = this.mediaEngine.transport.fetchInitSegment(track, signal);\n const mediaP = this.mediaEngine.transport.fetchMediaSegment(segmentId, track, signal);\n initP.catch(() => {});\n mediaP.catch(() => {});\n const [initSegment, mediaSegment] = await Promise.all([initP, mediaP]);\n\n signal?.throwIfAborted();\n\n const segmentBlob = new Blob([initSegment, mediaSegment]);\n const renditionId = typeof track.id === \"string\" ? track.id : undefined;\n\n let input = globalInputCache.get(track.src, segmentId, renditionId);\n if (!input) {\n input = new Input({\n formats: ALL_FORMATS,\n source: new BlobSource(segmentBlob),\n });\n globalInputCache.set(track.src, segmentId, input, renditionId);\n }\n\n const videoTrack = await withTimeout(\n input.getPrimaryVideoTrack(),\n 5000,\n \"ThumbnailExtractor.getPrimaryVideoTrack\",\n signal,\n );\n if (!videoTrack) {\n for (const timestamp of timestamps) {\n results.set(timestamp, null);\n }\n return results;\n }\n\n const sink = new CanvasSink(videoTrack);\n const sortedTimestamps = [...timestamps].sort((a, b) => a - b);\n\n const relativeTimestamps = sortedTimestamps.map((ms) =>\n this.mediaEngine.timing.toContainerSeconds(ms, segmentId, track),\n );\n\n const timestampResults = [];\n const canvasIterator = sink.canvasesAtTimestamps(relativeTimestamps);\n for await (const result of canvasIterator) {\n const canvasResult = await withTimeout(\n Promise.resolve(result),\n DEFAULT_MEDIABUNNY_TIMEOUT_MS,\n \"ThumbnailExtractor canvasesAtTimestamps iteration\",\n signal,\n );\n timestampResults.push(canvasResult);\n }\n\n for (let i = 0; i < sortedTimestamps.length; i++) {\n const globalTimestamp = sortedTimestamps[i];\n if (globalTimestamp === undefined) {\n continue;\n }\n\n const result = timestampResults[i];\n\n if (result?.canvas) {\n const canvas = result.canvas;\n if (canvas instanceof HTMLCanvasElement || canvas instanceof OffscreenCanvas) {\n results.set(globalTimestamp, {\n timestamp: globalTimestamp,\n thumbnail: canvas,\n });\n } else {\n results.set(globalTimestamp, null);\n }\n } else {\n results.set(globalTimestamp, null);\n }\n }\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n throw error;\n }\n console.warn(\n `ThumbnailExtractor: Failed to extract thumbnails for segment ${segmentId}:`,\n error,\n );\n for (const timestamp of timestamps) {\n results.set(timestamp, null);\n }\n } finally {\n release();\n }\n\n return results;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ThumbnailExtractor.js","names":["#max","#active","#release","#queue"],"sources":["../../../../src/elements/EFMedia/shared/ThumbnailExtractor.ts"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import opentelemetry, { SpanStatusCode } from "@opentelemetry/api";
2
-
3
2
  //#region src/elements/EFMedia/shared/timeoutUtils.ts
4
3
  const DEFAULT_MEDIABUNNY_TIMEOUT_MS = 1e4;
5
4
  /**
@@ -38,7 +37,7 @@ async function withTimeout(promise, timeoutMs, operationName, signal) {
38
37
  throw error;
39
38
  }
40
39
  }
41
-
42
40
  //#endregion
43
41
  export { DEFAULT_MEDIABUNNY_TIMEOUT_MS, withTimeout };
42
+
44
43
  //# sourceMappingURL=timeoutUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"timeoutUtils.js","names":[],"sources":["../../../../src/elements/EFMedia/shared/timeoutUtils.ts"],"sourcesContent":["import opentelemetry, { SpanStatusCode } from \"@opentelemetry/api\";\n\nexport const DEFAULT_MEDIABUNNY_TIMEOUT_MS = 10000; // 10s for decode operations\n\n/**\n * Wraps a promise with a timeout and optional AbortSignal support.\n * Records errors in OpenTelemetry spans for observability.\n *\n * @param promise - The promise to wrap with timeout protection\n * @param timeoutMs - Timeout duration in milliseconds\n * @param operationName - Name of the operation for error messages and telemetry\n * @param signal - Optional AbortSignal for cancellation support\n * @returns The result of the promise if it completes before timeout\n * @throws Error if timeout is reached or operation is aborted\n */\nexport async function withTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n operationName: string,\n signal?: AbortSignal,\n): Promise<T> {\n if (signal?.aborted) {\n throw new DOMException(\"Aborted\", \"AbortError\");\n }\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n const timeoutId = setTimeout(() => {\n const error = new Error(\n `${operationName} timeout after ${timeoutMs}ms. ` +\n `This may indicate a mediabunny decoding issue or missing codec configuration. ` +\n `Check video codec configuration, try different quality, or contact support.`,\n );\n reject(error);\n }, timeoutMs);\n\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timeoutId);\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n },\n { once: true },\n );\n });\n\n try {\n return await Promise.race([promise, timeoutPromise]);\n } catch (error) {\n // Record in active span if available\n const span = opentelemetry.trace.getActiveSpan();\n if (span && error instanceof Error) {\n span.recordException(error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n }\n throw error;\n }\n}\n"],"mappings":";;;AAEA,MAAa,gCAAgC;;;;;;;;;;;;AAa7C,eAAsB,YACpB,SACA,WACA,eACA,QACY;AACZ,KAAI,QAAQ,QACV,OAAM,IAAI,aAAa,WAAW,aAAa;CAGjD,MAAM,iBAAiB,IAAI,SAAgB,GAAG,WAAW;EACvD,MAAM,YAAY,iBAAiB;AAMjC,0BALc,IAAI,MAChB,GAAG,cAAc,iBAAiB,UAAU,+JAG7C,CACY;KACZ,UAAU;AAEb,UAAQ,iBACN,eACM;AACJ,gBAAa,UAAU;AACvB,UAAO,IAAI,aAAa,WAAW,aAAa,CAAC;KAEnD,EAAE,MAAM,MAAM,CACf;GACD;AAEF,KAAI;AACF,SAAO,MAAM,QAAQ,KAAK,CAAC,SAAS,eAAe,CAAC;UAC7C,OAAO;EAEd,MAAM,OAAO,cAAc,MAAM,eAAe;AAChD,MAAI,QAAQ,iBAAiB,OAAO;AAClC,QAAK,gBAAgB,MAAM;AAC3B,QAAK,UAAU;IACb,MAAM,eAAe;IACrB,SAAS,MAAM;IAChB,CAAC;;AAEJ,QAAM"}
1
+ {"version":3,"file":"timeoutUtils.js","names":[],"sources":["../../../../src/elements/EFMedia/shared/timeoutUtils.ts"],"mappings":";;AAEA,MAAa,gCAAgC;;;;;;;;;;;;AAa7C,eAAsB,YACpB,SACA,WACA,eACA,QACY;AACZ,KAAI,QAAQ,QACV,OAAM,IAAI,aAAa,WAAW,aAAa;CAGjD,MAAM,iBAAiB,IAAI,SAAgB,GAAG,WAAW;EACvD,MAAM,YAAY,iBAAiB;AAMjC,0BALc,IAAI,MAChB,GAAG,cAAc,iBAAiB,UAAU,+JAG7C,CACY;KACZ,UAAU;AAEb,UAAQ,iBACN,eACM;AACJ,gBAAa,UAAU;AACvB,UAAO,IAAI,aAAa,WAAW,aAAa,CAAC;KAEnD,EAAE,MAAM,MAAM,CACf;GACD;AAEF,KAAI;AACF,SAAO,MAAM,QAAQ,KAAK,CAAC,SAAS,eAAe,CAAC;UAC7C,OAAO;EAEd,MAAM,OAAO,cAAc,MAAM,eAAe;AAChD,MAAI,QAAQ,iBAAiB,OAAO;AAClC,QAAK,gBAAgB,MAAM;AAC3B,QAAK,UAAU;IACb,MAAM,eAAe;IACrB,SAAS,MAAM;IAChB,CAAC;;AAEJ,QAAM"}
@@ -80,7 +80,7 @@ var MainVideoInputCache = class {
80
80
  };
81
81
  }
82
82
  };
83
-
84
83
  //#endregion
85
84
  export { MainVideoInputCache };
85
+
86
86
  //# sourceMappingURL=MainVideoInputCache.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MainVideoInputCache.js","names":["#maxCacheSize","#getCacheKey","#cache","#pendingPromises","#generation"],"sources":["../../../../src/elements/EFMedia/videoTasks/MainVideoInputCache.ts"],"sourcesContent":["import type { BufferedSeekingInput } from \"../BufferedSeekingInput\";\n\n/**\n * Cache for main video BufferedSeekingInput instances\n * Main video segments are typically 2s long, so we can reuse the same input\n * for multiple frames within that segment (e.g., 60 frames at 30fps)\n */\nexport class MainVideoInputCache {\n #cache = new Map<string, BufferedSeekingInput>();\n #pendingPromises = new Map<string, Promise<BufferedSeekingInput | undefined>>();\n #maxCacheSize: number;\n /** Incremented on clear(). Promises capture the generation at creation time and\n * skip writing back if the generation has advanced (cache was cleared). */\n #generation = 0;\n\n constructor(maxCacheSize = 10) {\n this.#maxCacheSize = maxCacheSize;\n }\n\n /**\n * Create a cache key that uniquely identifies a segment\n */\n #getCacheKey(src: string, segmentId: number, renditionId: string | undefined): string {\n return `${src}:${renditionId || \"default\"}:${segmentId}`;\n }\n\n /**\n * Get or create BufferedSeekingInput for a main video segment.\n *\n * Uses promise deduplication to prevent race conditions when multiple\n * concurrent requests arrive for the same segment. Without this,\n * the first segment often fails when DevTools is closed because:\n * 1. Video display and thumbnail extraction both request segment 0\n * 2. Both find cache empty and start createInputFn()\n * 3. Both create separate instances, causing conflicts\n */\n async getOrCreateInput(\n src: string,\n segmentId: number,\n renditionId: string | undefined,\n createInputFn: () => Promise<BufferedSeekingInput | undefined>,\n ): Promise<BufferedSeekingInput | undefined> {\n const cacheKey = this.#getCacheKey(src, segmentId, renditionId);\n\n // Check if we already have a completed result cached\n const cached = this.#cache.get(cacheKey);\n if (cached) {\n // Move to end (most recently used) for true LRU ordering\n this.#cache.delete(cacheKey);\n this.#cache.set(cacheKey, cached);\n return cached;\n }\n\n // Check if there's already a pending request for this segment (deduplication!)\n // This prevents the race condition where multiple concurrent requests\n // each create their own BufferedSeekingInput instance.\n const pending = this.#pendingPromises.get(cacheKey);\n if (pending) {\n return pending;\n }\n\n // Create the promise and cache it IMMEDIATELY to prevent race conditions.\n // Capture the generation so that if clear() fires while this promise is\n // in-flight, the .then() callback does not repopulate the cache with data\n // from the old source.\n const capturedGeneration = this.#generation;\n const promise = createInputFn()\n .then((input) => {\n // Clean up pending promise\n this.#pendingPromises.delete(cacheKey);\n\n if (input && this.#generation === capturedGeneration) {\n // Add to completed cache\n this.#cache.set(cacheKey, input);\n\n // Evict oldest entries if cache is too large (LRU-like behavior)\n while (this.#cache.size > this.#maxCacheSize) {\n const oldestKey = this.#cache.keys().next().value;\n if (oldestKey !== undefined) {\n this.#cache.delete(oldestKey);\n } else {\n break;\n }\n }\n }\n\n return input;\n })\n .catch((error) => {\n // Clean up pending promise on failure so retry is possible\n this.#pendingPromises.delete(cacheKey);\n throw error;\n });\n\n this.#pendingPromises.set(cacheKey, promise);\n return promise;\n }\n\n /**\n * Clear the entire cache (called when video changes).\n * Increments the generation counter so any in-flight promises resolved after\n * this call do not repopulate the cache with stale data from the old source.\n */\n clear() {\n this.#generation++;\n this.#cache.clear();\n this.#pendingPromises.clear();\n }\n\n /**\n * Get cache statistics\n */\n getStats() {\n return {\n size: this.#cache.size,\n pendingSize: this.#pendingPromises.size,\n cacheKeys: Array.from(this.#cache.keys()),\n };\n }\n}\n"],"mappings":";;;;;;AAOA,IAAa,sBAAb,MAAiC;CAC/B,yBAAS,IAAI,KAAmC;CAChD,mCAAmB,IAAI,KAAwD;CAC/E;;;CAGA,cAAc;CAEd,YAAY,eAAe,IAAI;AAC7B,QAAKA,eAAgB;;;;;CAMvB,aAAa,KAAa,WAAmB,aAAyC;AACpF,SAAO,GAAG,IAAI,GAAG,eAAe,UAAU,GAAG;;;;;;;;;;;;CAa/C,MAAM,iBACJ,KACA,WACA,aACA,eAC2C;EAC3C,MAAM,WAAW,MAAKC,YAAa,KAAK,WAAW,YAAY;EAG/D,MAAM,SAAS,MAAKC,MAAO,IAAI,SAAS;AACxC,MAAI,QAAQ;AAEV,SAAKA,MAAO,OAAO,SAAS;AAC5B,SAAKA,MAAO,IAAI,UAAU,OAAO;AACjC,UAAO;;EAMT,MAAM,UAAU,MAAKC,gBAAiB,IAAI,SAAS;AACnD,MAAI,QACF,QAAO;EAOT,MAAM,qBAAqB,MAAKC;EAChC,MAAM,UAAU,eAAe,CAC5B,MAAM,UAAU;AAEf,SAAKD,gBAAiB,OAAO,SAAS;AAEtC,OAAI,SAAS,MAAKC,eAAgB,oBAAoB;AAEpD,UAAKF,MAAO,IAAI,UAAU,MAAM;AAGhC,WAAO,MAAKA,MAAO,OAAO,MAAKF,cAAe;KAC5C,MAAM,YAAY,MAAKE,MAAO,MAAM,CAAC,MAAM,CAAC;AAC5C,SAAI,cAAc,OAChB,OAAKA,MAAO,OAAO,UAAU;SAE7B;;;AAKN,UAAO;IACP,CACD,OAAO,UAAU;AAEhB,SAAKC,gBAAiB,OAAO,SAAS;AACtC,SAAM;IACN;AAEJ,QAAKA,gBAAiB,IAAI,UAAU,QAAQ;AAC5C,SAAO;;;;;;;CAQT,QAAQ;AACN,QAAKC;AACL,QAAKF,MAAO,OAAO;AACnB,QAAKC,gBAAiB,OAAO;;;;;CAM/B,WAAW;AACT,SAAO;GACL,MAAM,MAAKD,MAAO;GAClB,aAAa,MAAKC,gBAAiB;GACnC,WAAW,MAAM,KAAK,MAAKD,MAAO,MAAM,CAAC;GAC1C"}
1
+ {"version":3,"file":"MainVideoInputCache.js","names":["#maxCacheSize","#getCacheKey","#cache","#pendingPromises","#generation"],"sources":["../../../../src/elements/EFMedia/videoTasks/MainVideoInputCache.ts"],"mappings":";;;;;;AAOA,IAAa,sBAAb,MAAiC;CAC/B,yBAAS,IAAI,KAAmC;CAChD,mCAAmB,IAAI,KAAwD;CAC/E;;;CAGA,cAAc;CAEd,YAAY,eAAe,IAAI;AAC7B,QAAA,eAAqB;;;;;CAMvB,aAAa,KAAa,WAAmB,aAAyC;AACpF,SAAO,GAAG,IAAI,GAAG,eAAe,UAAU,GAAG;;;;;;;;;;;;CAa/C,MAAM,iBACJ,KACA,WACA,aACA,eAC2C;EAC3C,MAAM,WAAW,MAAA,YAAkB,KAAK,WAAW,YAAY;EAG/D,MAAM,SAAS,MAAA,MAAY,IAAI,SAAS;AACxC,MAAI,QAAQ;AAEV,SAAA,MAAY,OAAO,SAAS;AAC5B,SAAA,MAAY,IAAI,UAAU,OAAO;AACjC,UAAO;;EAMT,MAAM,UAAU,MAAA,gBAAsB,IAAI,SAAS;AACnD,MAAI,QACF,QAAO;EAOT,MAAM,qBAAqB,MAAA;EAC3B,MAAM,UAAU,eAAe,CAC5B,MAAM,UAAU;AAEf,SAAA,gBAAsB,OAAO,SAAS;AAEtC,OAAI,SAAS,MAAA,eAAqB,oBAAoB;AAEpD,UAAA,MAAY,IAAI,UAAU,MAAM;AAGhC,WAAO,MAAA,MAAY,OAAO,MAAA,cAAoB;KAC5C,MAAM,YAAY,MAAA,MAAY,MAAM,CAAC,MAAM,CAAC;AAC5C,SAAI,cAAc,KAAA,EAChB,OAAA,MAAY,OAAO,UAAU;SAE7B;;;AAKN,UAAO;IACP,CACD,OAAO,UAAU;AAEhB,SAAA,gBAAsB,OAAO,SAAS;AACtC,SAAM;IACN;AAEJ,QAAA,gBAAsB,IAAI,UAAU,QAAQ;AAC5C,SAAO;;;;;;;CAQT,QAAQ;AACN,QAAA;AACA,QAAA,MAAY,OAAO;AACnB,QAAA,gBAAsB,OAAO;;;;;CAM/B,WAAW;AACT,SAAO;GACL,MAAM,MAAA,MAAY;GAClB,aAAa,MAAA,gBAAsB;GACnC,WAAW,MAAM,KAAK,MAAA,MAAY,MAAM,CAAC;GAC1C"}
@@ -1,7 +1,6 @@
1
1
  import { BufferedSeekingInput } from "../BufferedSeekingInput.js";
2
2
 
3
3
  //#region src/elements/EFMedia/videoTasks/ScrubInputCache.d.ts
4
-
5
4
  /**
6
5
  * Cache for scrub BufferedSeekingInput instances.
7
6
  *
@@ -42,18 +42,18 @@ var ScrubInputCache = class {
42
42
  */
43
43
  async getOrCreateInput(src, segmentId, createInputFn, scrubUrl) {
44
44
  if (scrubUrl) {
45
- const cached$1 = this.#urlCache.get(scrubUrl);
46
- if (cached$1) {
45
+ const cached = this.#urlCache.get(scrubUrl);
46
+ if (cached) {
47
47
  this.#urlCache.delete(scrubUrl);
48
- this.#urlCache.set(scrubUrl, cached$1);
49
- return cached$1;
48
+ this.#urlCache.set(scrubUrl, cached);
49
+ return cached;
50
50
  }
51
- const pending$1 = this.#pendingByUrl.get(scrubUrl);
52
- if (pending$1) return pending$1;
53
- const capturedGeneration$1 = this.#generation;
54
- const promise$1 = createInputFn().then((input) => {
51
+ const pending = this.#pendingByUrl.get(scrubUrl);
52
+ if (pending) return pending;
53
+ const capturedGeneration = this.#generation;
54
+ const promise = createInputFn().then((input) => {
55
55
  this.#pendingByUrl.delete(scrubUrl);
56
- if (input && this.#generation === capturedGeneration$1) {
56
+ if (input && this.#generation === capturedGeneration) {
57
57
  this.#urlCache.set(scrubUrl, input);
58
58
  while (this.#urlCache.size > this.#maxUrlCacheSize) {
59
59
  const oldestKey = this.#urlCache.keys().next().value;
@@ -66,8 +66,8 @@ var ScrubInputCache = class {
66
66
  this.#pendingByUrl.delete(scrubUrl);
67
67
  throw error;
68
68
  });
69
- this.#pendingByUrl.set(scrubUrl, promise$1);
70
- return promise$1;
69
+ this.#pendingByUrl.set(scrubUrl, promise);
70
+ return promise;
71
71
  }
72
72
  const cacheKey = this.#getCacheKey(src, segmentId);
73
73
  const cached = this.#cache.get(cacheKey);
@@ -121,7 +121,7 @@ var ScrubInputCache = class {
121
121
  };
122
122
  }
123
123
  };
124
-
125
124
  //#endregion
126
125
  export { ScrubInputCache };
126
+
127
127
  //# sourceMappingURL=ScrubInputCache.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ScrubInputCache.js","names":["#maxCacheSize","#maxUrlCacheSize","cached","#urlCache","pending","#pendingByUrl","capturedGeneration","#generation","promise","#getCacheKey","#cache","#pendingBySegment"],"sources":["../../../../src/elements/EFMedia/videoTasks/ScrubInputCache.ts"],"sourcesContent":["import type { BufferedSeekingInput } from \"../BufferedSeekingInput\";\n\n/**\n * Cache for scrub BufferedSeekingInput instances.\n *\n * For JIT media (segmented scrub tracks), caches by src + segment ID.\n * For Asset media (single-file scrub tracks), caches by URL so all segments\n * share the same BufferedSeekingInput instance.\n *\n * Uses promise deduplication to prevent race conditions when multiple\n * concurrent requests arrive for the same segment.\n */\nexport class ScrubInputCache {\n #cache = new Map<string, BufferedSeekingInput>();\n #urlCache = new Map<string, BufferedSeekingInput>();\n #pendingBySegment = new Map<string, Promise<BufferedSeekingInput | undefined>>();\n #pendingByUrl = new Map<string, Promise<BufferedSeekingInput | undefined>>();\n #maxCacheSize: number;\n #maxUrlCacheSize: number;\n /** Incremented on clear(). Promises capture the generation at creation time and\n * skip writing back if the generation has advanced (cache was cleared). */\n #generation = 0;\n\n constructor(maxCacheSize = 20, maxUrlCacheSize = 5) {\n this.#maxCacheSize = maxCacheSize;\n this.#maxUrlCacheSize = maxUrlCacheSize;\n }\n\n /**\n * Create a cache key that uniquely identifies a segment for a specific video\n */\n #getCacheKey(src: string, segmentId: number): string {\n return `${src}:${segmentId}`;\n }\n\n /**\n * Get or create BufferedSeekingInput for a scrub segment.\n *\n * Uses promise deduplication to prevent race conditions when multiple\n * concurrent requests arrive for the same segment.\n *\n * @param src - The source URL of the video (required to distinguish between videos)\n * @param segmentId - The segment ID\n * @param createInputFn - Factory function to create the input\n * @param scrubUrl - Optional URL for single-file scrub tracks (all segments share same input)\n */\n async getOrCreateInput(\n src: string,\n segmentId: number,\n createInputFn: () => Promise<BufferedSeekingInput | undefined>,\n scrubUrl?: string,\n ): Promise<BufferedSeekingInput | undefined> {\n // For single-file scrub tracks (AssetMediaEngine), use URL-based caching\n // This ensures all segments share the same BufferedSeekingInput\n if (scrubUrl) {\n // Check completed cache\n const cached = this.#urlCache.get(scrubUrl);\n if (cached) {\n // Promote to MRU position so the eviction policy is true LRU\n this.#urlCache.delete(scrubUrl);\n this.#urlCache.set(scrubUrl, cached);\n return cached;\n }\n\n // Check pending requests (deduplication)\n const pending = this.#pendingByUrl.get(scrubUrl);\n if (pending) {\n return pending;\n }\n\n // Create promise and cache immediately. Capture the generation so that\n // if clear() fires while this promise is in-flight, the .then() callback\n // does not repopulate the cache with data from the old source.\n const capturedGeneration = this.#generation;\n const promise = createInputFn()\n .then((input) => {\n this.#pendingByUrl.delete(scrubUrl);\n if (input && this.#generation === capturedGeneration) {\n this.#urlCache.set(scrubUrl, input);\n // Evict oldest URL entries if cache is too large\n while (this.#urlCache.size > this.#maxUrlCacheSize) {\n const oldestKey = this.#urlCache.keys().next().value;\n if (oldestKey !== undefined) {\n this.#urlCache.delete(oldestKey);\n } else {\n break;\n }\n }\n }\n return input;\n })\n .catch((error) => {\n this.#pendingByUrl.delete(scrubUrl);\n throw error;\n });\n\n this.#pendingByUrl.set(scrubUrl, promise);\n return promise;\n }\n\n // For segmented scrub tracks (JIT), use src + segment-based caching\n const cacheKey = this.#getCacheKey(src, segmentId);\n const cached = this.#cache.get(cacheKey);\n if (cached) {\n // Promote to MRU position so the eviction policy is true LRU\n this.#cache.delete(cacheKey);\n this.#cache.set(cacheKey, cached);\n return cached;\n }\n\n // Check pending requests (deduplication)\n const pending = this.#pendingBySegment.get(cacheKey);\n if (pending) {\n return pending;\n }\n\n // Create promise and cache immediately. Capture the generation so that\n // if clear() fires while this promise is in-flight, the .then() callback\n // does not repopulate the cache with data from the old source.\n const capturedGeneration = this.#generation;\n const promise = createInputFn()\n .then((input) => {\n this.#pendingBySegment.delete(cacheKey);\n\n if (input && this.#generation === capturedGeneration) {\n this.#cache.set(cacheKey, input);\n\n // Evict oldest entries if cache is too large\n while (this.#cache.size > this.#maxCacheSize) {\n const oldestKey = this.#cache.keys().next().value;\n if (oldestKey !== undefined) {\n this.#cache.delete(oldestKey);\n } else {\n break;\n }\n }\n }\n\n return input;\n })\n .catch((error) => {\n this.#pendingBySegment.delete(cacheKey);\n throw error;\n });\n\n this.#pendingBySegment.set(cacheKey, promise);\n return promise;\n }\n\n /**\n * Clear the entire cache (called when video changes).\n * Increments the generation counter so any in-flight promises resolved after\n * this call do not repopulate the cache with stale data from the old source.\n */\n clear() {\n this.#generation++;\n this.#cache.clear();\n this.#urlCache.clear();\n this.#pendingBySegment.clear();\n this.#pendingByUrl.clear();\n }\n\n /**\n * Get cache statistics\n */\n getStats() {\n return {\n size: this.#cache.size,\n urlCacheSize: this.#urlCache.size,\n pendingCount: this.#pendingBySegment.size + this.#pendingByUrl.size,\n cacheKeys: Array.from(this.#cache.keys()),\n };\n }\n}\n"],"mappings":";;;;;;;;;;;AAYA,IAAa,kBAAb,MAA6B;CAC3B,yBAAS,IAAI,KAAmC;CAChD,4BAAY,IAAI,KAAmC;CACnD,oCAAoB,IAAI,KAAwD;CAChF,gCAAgB,IAAI,KAAwD;CAC5E;CACA;;;CAGA,cAAc;CAEd,YAAY,eAAe,IAAI,kBAAkB,GAAG;AAClD,QAAKA,eAAgB;AACrB,QAAKC,kBAAmB;;;;;CAM1B,aAAa,KAAa,WAA2B;AACnD,SAAO,GAAG,IAAI,GAAG;;;;;;;;;;;;;CAcnB,MAAM,iBACJ,KACA,WACA,eACA,UAC2C;AAG3C,MAAI,UAAU;GAEZ,MAAMC,WAAS,MAAKC,SAAU,IAAI,SAAS;AAC3C,OAAID,UAAQ;AAEV,UAAKC,SAAU,OAAO,SAAS;AAC/B,UAAKA,SAAU,IAAI,UAAUD,SAAO;AACpC,WAAOA;;GAIT,MAAME,YAAU,MAAKC,aAAc,IAAI,SAAS;AAChD,OAAID,UACF,QAAOA;GAMT,MAAME,uBAAqB,MAAKC;GAChC,MAAMC,YAAU,eAAe,CAC5B,MAAM,UAAU;AACf,UAAKH,aAAc,OAAO,SAAS;AACnC,QAAI,SAAS,MAAKE,eAAgBD,sBAAoB;AACpD,WAAKH,SAAU,IAAI,UAAU,MAAM;AAEnC,YAAO,MAAKA,SAAU,OAAO,MAAKF,iBAAkB;MAClD,MAAM,YAAY,MAAKE,SAAU,MAAM,CAAC,MAAM,CAAC;AAC/C,UAAI,cAAc,OAChB,OAAKA,SAAU,OAAO,UAAU;UAEhC;;;AAIN,WAAO;KACP,CACD,OAAO,UAAU;AAChB,UAAKE,aAAc,OAAO,SAAS;AACnC,UAAM;KACN;AAEJ,SAAKA,aAAc,IAAI,UAAUG,UAAQ;AACzC,UAAOA;;EAIT,MAAM,WAAW,MAAKC,YAAa,KAAK,UAAU;EAClD,MAAM,SAAS,MAAKC,MAAO,IAAI,SAAS;AACxC,MAAI,QAAQ;AAEV,SAAKA,MAAO,OAAO,SAAS;AAC5B,SAAKA,MAAO,IAAI,UAAU,OAAO;AACjC,UAAO;;EAIT,MAAM,UAAU,MAAKC,iBAAkB,IAAI,SAAS;AACpD,MAAI,QACF,QAAO;EAMT,MAAM,qBAAqB,MAAKJ;EAChC,MAAM,UAAU,eAAe,CAC5B,MAAM,UAAU;AACf,SAAKI,iBAAkB,OAAO,SAAS;AAEvC,OAAI,SAAS,MAAKJ,eAAgB,oBAAoB;AACpD,UAAKG,MAAO,IAAI,UAAU,MAAM;AAGhC,WAAO,MAAKA,MAAO,OAAO,MAAKV,cAAe;KAC5C,MAAM,YAAY,MAAKU,MAAO,MAAM,CAAC,MAAM,CAAC;AAC5C,SAAI,cAAc,OAChB,OAAKA,MAAO,OAAO,UAAU;SAE7B;;;AAKN,UAAO;IACP,CACD,OAAO,UAAU;AAChB,SAAKC,iBAAkB,OAAO,SAAS;AACvC,SAAM;IACN;AAEJ,QAAKA,iBAAkB,IAAI,UAAU,QAAQ;AAC7C,SAAO;;;;;;;CAQT,QAAQ;AACN,QAAKJ;AACL,QAAKG,MAAO,OAAO;AACnB,QAAKP,SAAU,OAAO;AACtB,QAAKQ,iBAAkB,OAAO;AAC9B,QAAKN,aAAc,OAAO;;;;;CAM5B,WAAW;AACT,SAAO;GACL,MAAM,MAAKK,MAAO;GAClB,cAAc,MAAKP,SAAU;GAC7B,cAAc,MAAKQ,iBAAkB,OAAO,MAAKN,aAAc;GAC/D,WAAW,MAAM,KAAK,MAAKK,MAAO,MAAM,CAAC;GAC1C"}
1
+ {"version":3,"file":"ScrubInputCache.js","names":["#maxCacheSize","#maxUrlCacheSize","#urlCache","#pendingByUrl","#generation","#getCacheKey","#cache","#pendingBySegment"],"sources":["../../../../src/elements/EFMedia/videoTasks/ScrubInputCache.ts"],"mappings":";;;;;;;;;;;AAYA,IAAa,kBAAb,MAA6B;CAC3B,yBAAS,IAAI,KAAmC;CAChD,4BAAY,IAAI,KAAmC;CACnD,oCAAoB,IAAI,KAAwD;CAChF,gCAAgB,IAAI,KAAwD;CAC5E;CACA;;;CAGA,cAAc;CAEd,YAAY,eAAe,IAAI,kBAAkB,GAAG;AAClD,QAAA,eAAqB;AACrB,QAAA,kBAAwB;;;;;CAM1B,aAAa,KAAa,WAA2B;AACnD,SAAO,GAAG,IAAI,GAAG;;;;;;;;;;;;;CAcnB,MAAM,iBACJ,KACA,WACA,eACA,UAC2C;AAG3C,MAAI,UAAU;GAEZ,MAAM,SAAS,MAAA,SAAe,IAAI,SAAS;AAC3C,OAAI,QAAQ;AAEV,UAAA,SAAe,OAAO,SAAS;AAC/B,UAAA,SAAe,IAAI,UAAU,OAAO;AACpC,WAAO;;GAIT,MAAM,UAAU,MAAA,aAAmB,IAAI,SAAS;AAChD,OAAI,QACF,QAAO;GAMT,MAAM,qBAAqB,MAAA;GAC3B,MAAM,UAAU,eAAe,CAC5B,MAAM,UAAU;AACf,UAAA,aAAmB,OAAO,SAAS;AACnC,QAAI,SAAS,MAAA,eAAqB,oBAAoB;AACpD,WAAA,SAAe,IAAI,UAAU,MAAM;AAEnC,YAAO,MAAA,SAAe,OAAO,MAAA,iBAAuB;MAClD,MAAM,YAAY,MAAA,SAAe,MAAM,CAAC,MAAM,CAAC;AAC/C,UAAI,cAAc,KAAA,EAChB,OAAA,SAAe,OAAO,UAAU;UAEhC;;;AAIN,WAAO;KACP,CACD,OAAO,UAAU;AAChB,UAAA,aAAmB,OAAO,SAAS;AACnC,UAAM;KACN;AAEJ,SAAA,aAAmB,IAAI,UAAU,QAAQ;AACzC,UAAO;;EAIT,MAAM,WAAW,MAAA,YAAkB,KAAK,UAAU;EAClD,MAAM,SAAS,MAAA,MAAY,IAAI,SAAS;AACxC,MAAI,QAAQ;AAEV,SAAA,MAAY,OAAO,SAAS;AAC5B,SAAA,MAAY,IAAI,UAAU,OAAO;AACjC,UAAO;;EAIT,MAAM,UAAU,MAAA,iBAAuB,IAAI,SAAS;AACpD,MAAI,QACF,QAAO;EAMT,MAAM,qBAAqB,MAAA;EAC3B,MAAM,UAAU,eAAe,CAC5B,MAAM,UAAU;AACf,SAAA,iBAAuB,OAAO,SAAS;AAEvC,OAAI,SAAS,MAAA,eAAqB,oBAAoB;AACpD,UAAA,MAAY,IAAI,UAAU,MAAM;AAGhC,WAAO,MAAA,MAAY,OAAO,MAAA,cAAoB;KAC5C,MAAM,YAAY,MAAA,MAAY,MAAM,CAAC,MAAM,CAAC;AAC5C,SAAI,cAAc,KAAA,EAChB,OAAA,MAAY,OAAO,UAAU;SAE7B;;;AAKN,UAAO;IACP,CACD,OAAO,UAAU;AAChB,SAAA,iBAAuB,OAAO,SAAS;AACvC,SAAM;IACN;AAEJ,QAAA,iBAAuB,IAAI,UAAU,QAAQ;AAC7C,SAAO;;;;;;;CAQT,QAAQ;AACN,QAAA;AACA,QAAA,MAAY,OAAO;AACnB,QAAA,SAAe,OAAO;AACtB,QAAA,iBAAuB,OAAO;AAC9B,QAAA,aAAmB,OAAO;;;;;CAM5B,WAAW;AACT,SAAO;GACL,MAAM,MAAA,MAAY;GAClB,cAAc,MAAA,SAAe;GAC7B,cAAc,MAAA,iBAAuB,OAAO,MAAA,aAAmB;GAC/D,WAAW,MAAM,KAAK,MAAA,MAAY,MAAM,CAAC;GAC1C"}
@@ -6,7 +6,7 @@ import { ControllableInterface } from "../gui/Controllable.js";
6
6
  import { UrlGenerator } from "../transcoding/utils/UrlGenerator.js";
7
7
  import { MediaEngine } from "./EFMedia/MediaEngine.js";
8
8
  import { AudioSpan } from "../transcoding/types/index.js";
9
- import * as lit0 from "lit";
9
+ import * as _$lit from "lit";
10
10
  import { LitElement, PropertyValueMap } from "lit";
11
11
 
12
12
  //#region src/elements/EFMedia.d.ts
@@ -59,7 +59,7 @@ declare class EFMedia extends EFMedia_base {
59
59
  */
60
60
  get requiredTracks(): "audio" | "video" | "both";
61
61
  static get observedAttributes(): string[];
62
- static styles: lit0.CSSResult[];
62
+ static styles: _$lit.CSSResult[];
63
63
  attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
64
64
  /**
65
65
  * Duration in milliseconds for audio buffering ahead of current time
@@ -1,6 +1,6 @@
1
1
  import { efContext } from "../gui/efContext.js";
2
2
  import { withSpan } from "../otel/tracingHelpers.js";
3
- import { __decorate } from "../_virtual/_@oxc-project_runtime@0.95.0/helpers/decorate.js";
3
+ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.122.0/helpers/decorate.js";
4
4
  import { EFTemporal } from "./EFTemporal.js";
5
5
  import { isContextMixin } from "../gui/ContextMixin.js";
6
6
  import { LRUCache } from "../utils/LRUCache.js";
@@ -13,7 +13,6 @@ import { EFTargetable } from "./TargetController.js";
13
13
  import { provide } from "@lit/context";
14
14
  import { LitElement, css } from "lit";
15
15
  import { property, state } from "lit/decorators.js";
16
-
17
16
  //#region src/elements/EFMedia.ts
18
17
  const freqWeightsCache = /* @__PURE__ */ new Map();
19
18
  /**
@@ -652,7 +651,7 @@ __decorate([property({
652
651
  reflect: true
653
652
  })], EFMedia.prototype, "fileId", void 0);
654
653
  __decorate([state()], EFMedia.prototype, "_desiredSeekTimeMs", void 0);
655
-
656
654
  //#endregion
657
655
  export { AsyncValue, EFMedia, deepGetMediaElements };
656
+
658
657
  //# sourceMappingURL=EFMedia.js.map