@editframe/elements 0.17.6-beta.0 → 0.18.7-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/dist/EF_FRAMEGEN.js +1 -1
  2. package/dist/elements/EFAudio.d.ts +21 -2
  3. package/dist/elements/EFAudio.js +41 -11
  4. package/dist/elements/EFImage.d.ts +1 -0
  5. package/dist/elements/EFImage.js +11 -3
  6. package/dist/elements/EFMedia/AssetIdMediaEngine.d.ts +18 -0
  7. package/dist/elements/EFMedia/AssetIdMediaEngine.js +41 -0
  8. package/dist/elements/EFMedia/AssetMediaEngine.browsertest.d.ts +0 -0
  9. package/dist/elements/EFMedia/AssetMediaEngine.d.ts +45 -0
  10. package/dist/elements/EFMedia/AssetMediaEngine.js +135 -0
  11. package/dist/elements/EFMedia/BaseMediaEngine.d.ts +55 -0
  12. package/dist/elements/EFMedia/BaseMediaEngine.js +115 -0
  13. package/dist/elements/EFMedia/BufferedSeekingInput.d.ts +43 -0
  14. package/dist/elements/EFMedia/BufferedSeekingInput.js +179 -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 +81 -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 +141 -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 +30 -0
  29. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.chunkboundary.regression.browsertest.d.ts +0 -0
  30. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.d.ts +7 -0
  31. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js +32 -0
  32. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.d.ts +4 -0
  33. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.js +28 -0
  34. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.d.ts +4 -0
  35. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.js +17 -0
  36. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.d.ts +3 -0
  37. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js +107 -0
  38. package/dist/elements/EFMedia/shared/AudioSpanUtils.d.ts +7 -0
  39. package/dist/elements/EFMedia/shared/AudioSpanUtils.js +54 -0
  40. package/dist/elements/EFMedia/shared/BufferUtils.d.ts +70 -0
  41. package/dist/elements/EFMedia/shared/BufferUtils.js +89 -0
  42. package/dist/elements/EFMedia/shared/MediaTaskUtils.d.ts +23 -0
  43. package/dist/elements/EFMedia/shared/PrecisionUtils.d.ts +28 -0
  44. package/dist/elements/EFMedia/shared/PrecisionUtils.js +29 -0
  45. package/dist/elements/EFMedia/shared/RenditionHelpers.d.ts +19 -0
  46. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.d.ts +18 -0
  47. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.js +60 -0
  48. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.browsertest.d.ts +9 -0
  49. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.d.ts +16 -0
  50. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.js +46 -0
  51. package/dist/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.browsertest.d.ts +9 -0
  52. package/dist/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.d.ts +4 -0
  53. package/dist/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.js +16 -0
  54. package/dist/elements/EFMedia/videoTasks/makeVideoInputTask.browsertest.d.ts +9 -0
  55. package/dist/elements/EFMedia/videoTasks/makeVideoInputTask.d.ts +3 -0
  56. package/dist/elements/EFMedia/videoTasks/makeVideoInputTask.js +27 -0
  57. package/dist/elements/EFMedia/videoTasks/makeVideoSeekTask.d.ts +7 -0
  58. package/dist/elements/EFMedia/videoTasks/makeVideoSeekTask.js +34 -0
  59. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.browsertest.d.ts +9 -0
  60. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.d.ts +4 -0
  61. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.js +28 -0
  62. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.browsertest.d.ts +9 -0
  63. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.d.ts +4 -0
  64. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.js +17 -0
  65. package/dist/elements/EFMedia.browsertest.d.ts +1 -0
  66. package/dist/elements/EFMedia.d.ts +63 -111
  67. package/dist/elements/EFMedia.js +117 -1113
  68. package/dist/elements/EFTemporal.d.ts +1 -1
  69. package/dist/elements/EFTemporal.js +1 -1
  70. package/dist/elements/EFTimegroup.d.ts +11 -0
  71. package/dist/elements/EFTimegroup.js +83 -13
  72. package/dist/elements/EFVideo.d.ts +54 -32
  73. package/dist/elements/EFVideo.js +100 -207
  74. package/dist/elements/EFWaveform.js +2 -2
  75. package/dist/elements/SampleBuffer.d.ts +14 -0
  76. package/dist/elements/SampleBuffer.js +52 -0
  77. package/dist/getRenderInfo.js +2 -1
  78. package/dist/gui/ContextMixin.js +3 -2
  79. package/dist/gui/EFFilmstrip.d.ts +3 -3
  80. package/dist/gui/EFFilmstrip.js +1 -1
  81. package/dist/gui/EFFitScale.d.ts +2 -2
  82. package/dist/gui/TWMixin.js +1 -1
  83. package/dist/style.css +1 -1
  84. package/dist/transcoding/cache/CacheManager.d.ts +73 -0
  85. package/dist/transcoding/cache/RequestDeduplicator.d.ts +29 -0
  86. package/dist/transcoding/cache/RequestDeduplicator.js +53 -0
  87. package/dist/transcoding/cache/RequestDeduplicator.test.d.ts +1 -0
  88. package/dist/transcoding/types/index.d.ts +242 -0
  89. package/dist/transcoding/utils/MediaUtils.d.ts +9 -0
  90. package/dist/transcoding/utils/UrlGenerator.d.ts +26 -0
  91. package/dist/transcoding/utils/UrlGenerator.js +45 -0
  92. package/dist/transcoding/utils/constants.d.ts +27 -0
  93. package/dist/utils/LRUCache.d.ts +34 -0
  94. package/dist/utils/LRUCache.js +115 -0
  95. package/package.json +3 -3
  96. package/src/elements/EFAudio.browsertest.ts +189 -49
  97. package/src/elements/EFAudio.ts +59 -13
  98. package/src/elements/EFImage.browsertest.ts +42 -0
  99. package/src/elements/EFImage.ts +23 -3
  100. package/src/elements/EFMedia/AssetIdMediaEngine.test.ts +222 -0
  101. package/src/elements/EFMedia/AssetIdMediaEngine.ts +70 -0
  102. package/src/elements/EFMedia/AssetMediaEngine.browsertest.ts +100 -0
  103. package/src/elements/EFMedia/AssetMediaEngine.ts +255 -0
  104. package/src/elements/EFMedia/BaseMediaEngine.test.ts +164 -0
  105. package/src/elements/EFMedia/BaseMediaEngine.ts +219 -0
  106. package/src/elements/EFMedia/BufferedSeekingInput.browsertest.ts +481 -0
  107. package/src/elements/EFMedia/BufferedSeekingInput.ts +324 -0
  108. package/src/elements/EFMedia/JitMediaEngine.browsertest.ts +165 -0
  109. package/src/elements/EFMedia/JitMediaEngine.ts +166 -0
  110. package/src/elements/EFMedia/audioTasks/makeAudioBufferTask.browsertest.ts +554 -0
  111. package/src/elements/EFMedia/audioTasks/makeAudioBufferTask.ts +81 -0
  112. package/src/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.ts +250 -0
  113. package/src/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.browsertest.ts +59 -0
  114. package/src/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.ts +23 -0
  115. package/src/elements/EFMedia/audioTasks/makeAudioInputTask.browsertest.ts +55 -0
  116. package/src/elements/EFMedia/audioTasks/makeAudioInputTask.ts +43 -0
  117. package/src/elements/EFMedia/audioTasks/makeAudioSeekTask.chunkboundary.regression.browsertest.ts +199 -0
  118. package/src/elements/EFMedia/audioTasks/makeAudioSeekTask.ts +64 -0
  119. package/src/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.ts +45 -0
  120. package/src/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.ts +24 -0
  121. package/src/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.ts +183 -0
  122. package/src/elements/EFMedia/shared/AudioSpanUtils.ts +128 -0
  123. package/src/elements/EFMedia/shared/BufferUtils.ts +310 -0
  124. package/src/elements/EFMedia/shared/MediaTaskUtils.ts +44 -0
  125. package/src/elements/EFMedia/shared/PrecisionUtils.ts +46 -0
  126. package/src/elements/EFMedia/shared/RenditionHelpers.browsertest.ts +247 -0
  127. package/src/elements/EFMedia/shared/RenditionHelpers.ts +79 -0
  128. package/src/elements/EFMedia/tasks/makeMediaEngineTask.browsertest.ts +128 -0
  129. package/src/elements/EFMedia/tasks/makeMediaEngineTask.test.ts +233 -0
  130. package/src/elements/EFMedia/tasks/makeMediaEngineTask.ts +89 -0
  131. package/src/elements/EFMedia/videoTasks/makeVideoBufferTask.browsertest.ts +555 -0
  132. package/src/elements/EFMedia/videoTasks/makeVideoBufferTask.ts +79 -0
  133. package/src/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.browsertest.ts +59 -0
  134. package/src/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.ts +23 -0
  135. package/src/elements/EFMedia/videoTasks/makeVideoInputTask.browsertest.ts +55 -0
  136. package/src/elements/EFMedia/videoTasks/makeVideoInputTask.ts +45 -0
  137. package/src/elements/EFMedia/videoTasks/makeVideoSeekTask.ts +68 -0
  138. package/src/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.browsertest.ts +57 -0
  139. package/src/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.ts +43 -0
  140. package/src/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.browsertest.ts +56 -0
  141. package/src/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.ts +24 -0
  142. package/src/elements/EFMedia.browsertest.ts +706 -273
  143. package/src/elements/EFMedia.ts +136 -1769
  144. package/src/elements/EFTemporal.ts +3 -4
  145. package/src/elements/EFTimegroup.browsertest.ts +6 -3
  146. package/src/elements/EFTimegroup.ts +147 -21
  147. package/src/elements/EFVideo.browsertest.ts +980 -169
  148. package/src/elements/EFVideo.ts +113 -458
  149. package/src/elements/EFWaveform.ts +1 -1
  150. package/src/elements/MediaController.ts +2 -12
  151. package/src/elements/SampleBuffer.ts +95 -0
  152. package/src/gui/ContextMixin.ts +3 -6
  153. package/src/transcoding/cache/CacheManager.ts +208 -0
  154. package/src/transcoding/cache/RequestDeduplicator.test.ts +170 -0
  155. package/src/transcoding/cache/RequestDeduplicator.ts +65 -0
  156. package/src/transcoding/types/index.ts +269 -0
  157. package/src/transcoding/utils/MediaUtils.ts +63 -0
  158. package/src/transcoding/utils/UrlGenerator.ts +68 -0
  159. package/src/transcoding/utils/constants.ts +36 -0
  160. package/src/utils/LRUCache.ts +153 -0
  161. package/test/EFVideo.framegen.browsertest.ts +39 -30
  162. 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
  163. 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
  164. package/test/__cache__/GET__api_v1_transcode_audio_1_mp4_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4_bytes_0__9ed2d25c675aa6bb6ff5b3ae23887c71/data.bin +0 -0
  165. package/test/__cache__/GET__api_v1_transcode_audio_1_mp4_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4_bytes_0__9ed2d25c675aa6bb6ff5b3ae23887c71/metadata.json +22 -0
  166. 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
  167. 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
  168. package/test/__cache__/GET__api_v1_transcode_audio_2_mp4_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4_bytes_0__d5a3309a2bf756dd6e304807eb402f56/data.bin +0 -0
  169. package/test/__cache__/GET__api_v1_transcode_audio_2_mp4_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4_bytes_0__d5a3309a2bf756dd6e304807eb402f56/metadata.json +22 -0
  170. 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
  171. 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
  172. package/test/__cache__/GET__api_v1_transcode_audio_3_mp4_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4_bytes_0__773254bb671e3466fca8677139fb239e/data.bin +0 -0
  173. package/test/__cache__/GET__api_v1_transcode_audio_3_mp4_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4_bytes_0__773254bb671e3466fca8677139fb239e/metadata.json +22 -0
  174. 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
  175. 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
  176. 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
  177. 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
  178. 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
  179. 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
  180. 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
  181. 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
  182. 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
  183. 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
  184. 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
  185. 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
  186. package/test/__cache__/GET__api_v1_transcode_high_4_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a6fb05a22b18d850f7f2950bbcdbdeed/data.bin +0 -0
  187. package/test/__cache__/GET__api_v1_transcode_high_4_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a6fb05a22b18d850f7f2950bbcdbdeed/metadata.json +21 -0
  188. package/test/__cache__/GET__api_v1_transcode_high_5_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a50058c7c3602e90879fe3428ed891f4/data.bin +0 -0
  189. package/test/__cache__/GET__api_v1_transcode_high_5_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a50058c7c3602e90879fe3428ed891f4/metadata.json +21 -0
  190. 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
  191. 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
  192. package/test/__cache__/GET__api_v1_transcode_manifest_json_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__3be92a0437de726b431ed5af2369158a/data.bin +1 -0
  193. package/test/__cache__/GET__api_v1_transcode_manifest_json_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__3be92a0437de726b431ed5af2369158a/metadata.json +19 -0
  194. package/test/createJitTestClips.ts +320 -188
  195. package/test/recordReplayProxyPlugin.js +352 -0
  196. package/test/useAssetMSW.ts +1 -1
  197. package/test/useMSW.ts +35 -22
  198. package/types.json +1 -1
  199. package/dist/JitTranscodingClient.d.ts +0 -167
  200. package/dist/JitTranscodingClient.js +0 -373
  201. package/dist/ScrubTrackManager.d.ts +0 -96
  202. package/dist/ScrubTrackManager.js +0 -216
  203. package/dist/elements/printTaskStatus.js +0 -11
  204. package/src/elements/__screenshots__/EFMedia.browsertest.ts/EFMedia-JIT-audio-playback-audioBufferTask-should-work-in-JIT-mode-without-URL-errors-1.png +0 -0
  205. package/test/EFVideo.frame-tasks.browsertest.ts +0 -524
  206. /package/dist/{DecoderResetFrequency.test.d.ts → elements/EFMedia/AssetIdMediaEngine.test.d.ts} +0 -0
  207. /package/dist/{DecoderResetRecovery.test.d.ts → elements/EFMedia/BaseMediaEngine.test.d.ts} +0 -0
  208. /package/dist/{JitTranscodingClient.browsertest.d.ts → elements/EFMedia/BufferedSeekingInput.browsertest.d.ts} +0 -0
  209. /package/dist/{JitTranscodingClient.test.d.ts → elements/EFMedia/shared/RenditionHelpers.browsertest.d.ts} +0 -0
  210. /package/dist/{ScrubTrackIntegration.test.d.ts → elements/EFMedia/tasks/makeMediaEngineTask.browsertest.d.ts} +0 -0
  211. /package/dist/{SegmentSwitchLoading.test.d.ts → elements/EFMedia/tasks/makeMediaEngineTask.test.d.ts} +0 -0
@@ -1,167 +0,0 @@
1
- /**
2
- * JIT Transcoding Client for Elements
3
- * Handles communication with the JIT transcoding service for real-time video streaming
4
- */
5
- export interface QualityPreset {
6
- name: string;
7
- width: number;
8
- height: number;
9
- videoBitrate: number;
10
- audioBitrate: number;
11
- audioChannels: number;
12
- audioSampleRate: number;
13
- audioCodec: "aac";
14
- }
15
- export interface VideoMetadata {
16
- url: string;
17
- durationMs: number;
18
- streams: Array<{
19
- index: number;
20
- type: "video" | "audio" | "subtitle" | "other";
21
- codecName: string;
22
- duration: number;
23
- durationMs: number;
24
- width?: number;
25
- height?: number;
26
- frameRate?: {
27
- num: number;
28
- den: number;
29
- };
30
- channels?: number;
31
- sampleRate?: number;
32
- }>;
33
- presets: string[];
34
- segmentDuration: number;
35
- supportedFormats: string[];
36
- extractedAt: string;
37
- }
38
- export interface JitTranscodingConfig {
39
- baseUrl: string;
40
- defaultQuality: keyof QualityPresets;
41
- segmentCacheSize: number;
42
- enableNetworkAdaptation: boolean;
43
- enablePrefetch: boolean;
44
- prefetchSegments: number;
45
- }
46
- export interface QualityPresets {
47
- low: QualityPreset;
48
- medium: QualityPreset;
49
- high: QualityPreset;
50
- }
51
- export interface NetworkCondition {
52
- bandwidth: number;
53
- rtt: number;
54
- connectionType: string;
55
- }
56
- export interface SegmentInfo {
57
- url: string;
58
- startTimeMs: number;
59
- durationMs: number;
60
- quality: string;
61
- cached: boolean;
62
- }
63
- export declare class JitTranscodingClient {
64
- private config;
65
- private segmentCache;
66
- private metadataCache;
67
- private qualityPresets;
68
- private currentQuality;
69
- private networkMonitor;
70
- private pendingRequests;
71
- private cacheHits;
72
- private cacheMisses;
73
- private totalRequests;
74
- private cacheAccessOrder;
75
- constructor(config?: Partial<JitTranscodingConfig>);
76
- /**
77
- * Check if a URL is eligible for JIT transcoding
78
- */
79
- static isJitTranscodeEligible(url: string): boolean;
80
- /**
81
- * Instance method to check if a URL is eligible for JIT transcoding
82
- */
83
- isJitTranscodeEligible(url: string): boolean;
84
- /**
85
- * Load quality presets from the JIT transcoding service
86
- */
87
- loadQualityPresets(): Promise<QualityPresets>;
88
- /**
89
- * Internal method to actually fetch quality presets
90
- */
91
- private fetchQualityPresets;
92
- /**
93
- * Load video metadata from the JIT transcoding service
94
- */
95
- loadVideoMetadata(url: string): Promise<VideoMetadata>;
96
- /**
97
- * Internal method to actually fetch video metadata
98
- */
99
- private fetchVideoMetadata;
100
- /**
101
- * Get the appropriate quality based on network conditions
102
- */
103
- getAdaptiveQuality(): Promise<keyof QualityPresets>;
104
- /**
105
- * Generate segment URL for JIT transcoding
106
- */
107
- generateSegmentUrl(videoUrl: string, startTimeMs: number, quality?: keyof QualityPresets): string;
108
- /**
109
- * Fetch a video segment with caching
110
- */
111
- fetchSegment(videoUrl: string, startTimeMs: number, quality?: keyof QualityPresets): Promise<ArrayBuffer>;
112
- /**
113
- * Internal method to actually fetch a video segment
114
- */
115
- private fetchVideoSegment;
116
- /**
117
- * Prefetch upcoming segments
118
- */
119
- prefetchSegments(videoUrl: string, currentTimeMs: number, quality?: keyof QualityPresets): Promise<void>;
120
- /**
121
- * Cache a segment with LRU eviction
122
- */
123
- private cacheSegment;
124
- /**
125
- * Get comprehensive cache statistics
126
- */
127
- getCacheStats(): {
128
- size: number;
129
- maxSize: number;
130
- hitRate: number;
131
- efficiency: number;
132
- totalRequests: number;
133
- recentKeys: string[];
134
- };
135
- /**
136
- * Clear all caches
137
- */
138
- clearCache(): void;
139
- /**
140
- * Set manual quality override
141
- */
142
- setQuality(quality: keyof QualityPresets): void;
143
- /**
144
- * Get current quality setting
145
- */
146
- getCurrentQuality(): keyof QualityPresets;
147
- /**
148
- * Load a video segment for any quality preset including scrub
149
- */
150
- loadSegment(videoUrl: string, quality: string, startTimeMs: number): Promise<ArrayBuffer>;
151
- /**
152
- * Load a scrub track segment (30s duration)
153
- */
154
- private loadScrubSegment;
155
- /**
156
- * Internal method to fetch scrub segment
157
- */
158
- private fetchScrubSegment;
159
- /**
160
- * Check if a segment is cached for a given quality
161
- */
162
- hasSegmentInCache(videoUrl: string, quality: string, timeMs: number): boolean;
163
- /**
164
- * Get video metadata
165
- */
166
- getMetadata(videoUrl: string): Promise<VideoMetadata>;
167
- }
@@ -1,373 +0,0 @@
1
- var JitTranscodingClient = class JitTranscodingClient {
2
- constructor(config = {}) {
3
- this.segmentCache = /* @__PURE__ */ new Map();
4
- this.metadataCache = /* @__PURE__ */ new Map();
5
- this.qualityPresets = null;
6
- this.pendingRequests = /* @__PURE__ */ new Map();
7
- this.cacheHits = 0;
8
- this.cacheMisses = 0;
9
- this.totalRequests = 0;
10
- this.cacheAccessOrder = [];
11
- this.config = {
12
- baseUrl: "http://localhost:3000",
13
- defaultQuality: "medium",
14
- segmentCacheSize: 50,
15
- enableNetworkAdaptation: true,
16
- enablePrefetch: true,
17
- prefetchSegments: 3,
18
- ...config
19
- };
20
- this.currentQuality = this.config.defaultQuality;
21
- this.networkMonitor = new NetworkMonitor();
22
- }
23
- /**
24
- * Check if a URL is eligible for JIT transcoding
25
- */
26
- static isJitTranscodeEligible(url) {
27
- return url.startsWith("http://") || url.startsWith("https://");
28
- }
29
- /**
30
- * Instance method to check if a URL is eligible for JIT transcoding
31
- */
32
- isJitTranscodeEligible(url) {
33
- return JitTranscodingClient.isJitTranscodeEligible(url);
34
- }
35
- /**
36
- * Load quality presets from the JIT transcoding service
37
- */
38
- async loadQualityPresets() {
39
- if (this.qualityPresets) return this.qualityPresets;
40
- const requestKey = "quality-presets";
41
- const pendingRequest = this.pendingRequests.get(requestKey);
42
- if (pendingRequest) return pendingRequest;
43
- const requestPromise = this.fetchQualityPresets();
44
- this.pendingRequests.set(requestKey, requestPromise);
45
- try {
46
- const result = await requestPromise;
47
- this.pendingRequests.delete(requestKey);
48
- return result;
49
- } catch (error) {
50
- this.pendingRequests.delete(requestKey);
51
- throw error;
52
- }
53
- }
54
- /**
55
- * Internal method to actually fetch quality presets
56
- */
57
- async fetchQualityPresets() {
58
- try {
59
- const response = await fetch(`${this.config.baseUrl}/api/v1/transcode/presets`);
60
- if (!response.ok) throw new Error(`Failed to load quality presets: ${response.status}`);
61
- const data = await response.json();
62
- this.qualityPresets = data.presets;
63
- if (!this.qualityPresets) throw new Error("No quality presets found");
64
- return this.qualityPresets;
65
- } catch (error) {
66
- console.error("Failed to load quality presets:", error);
67
- this.qualityPresets = {
68
- low: {
69
- name: "low",
70
- width: 480,
71
- height: 270,
72
- videoBitrate: 4e5,
73
- audioBitrate: 64e3,
74
- audioChannels: 2,
75
- audioSampleRate: 48e3,
76
- audioCodec: "aac"
77
- },
78
- medium: {
79
- name: "medium",
80
- width: 854,
81
- height: 480,
82
- videoBitrate: 1e6,
83
- audioBitrate: 128e3,
84
- audioChannels: 2,
85
- audioSampleRate: 48e3,
86
- audioCodec: "aac"
87
- },
88
- high: {
89
- name: "high",
90
- width: 1280,
91
- height: 720,
92
- videoBitrate: 25e5,
93
- audioBitrate: 192e3,
94
- audioChannels: 2,
95
- audioSampleRate: 48e3,
96
- audioCodec: "aac"
97
- }
98
- };
99
- return this.qualityPresets;
100
- }
101
- }
102
- /**
103
- * Load video metadata from the JIT transcoding service
104
- */
105
- async loadVideoMetadata(url) {
106
- const cached = this.metadataCache.get(url);
107
- if (cached) return cached;
108
- const requestKey = `metadata:${url}`;
109
- const pendingRequest = this.pendingRequests.get(requestKey);
110
- if (pendingRequest) return pendingRequest;
111
- const requestPromise = this.fetchVideoMetadata(url);
112
- this.pendingRequests.set(requestKey, requestPromise);
113
- try {
114
- const result = await requestPromise;
115
- this.pendingRequests.delete(requestKey);
116
- return result;
117
- } catch (error) {
118
- this.pendingRequests.delete(requestKey);
119
- throw error;
120
- }
121
- }
122
- /**
123
- * Internal method to actually fetch video metadata
124
- */
125
- async fetchVideoMetadata(url) {
126
- try {
127
- const response = await fetch(`${this.config.baseUrl}/api/v1/transcode/metadata?url=${encodeURIComponent(url)}`);
128
- if (!response.ok) throw new Error(`Failed to load video metadata: ${response.status}`);
129
- const metadata = await response.json();
130
- this.metadataCache.set(url, metadata);
131
- return metadata;
132
- } catch (error) {
133
- console.error("Failed to load video metadata:", error);
134
- throw error;
135
- }
136
- }
137
- /**
138
- * Get the appropriate quality based on network conditions
139
- */
140
- async getAdaptiveQuality() {
141
- if (!this.config.enableNetworkAdaptation) return this.currentQuality;
142
- const networkCondition = await this.networkMonitor.getCurrentCondition();
143
- if (networkCondition.bandwidth < 8e5) return "low";
144
- if (networkCondition.bandwidth < 2e6) return "medium";
145
- return "high";
146
- }
147
- /**
148
- * Generate segment URL for JIT transcoding
149
- */
150
- generateSegmentUrl(videoUrl, startTimeMs, quality = this.currentQuality) {
151
- const alignedStartTime = Math.floor(startTimeMs / 2e3) * 2e3;
152
- return `${this.config.baseUrl}/api/v1/transcode/${quality}?url=${encodeURIComponent(videoUrl)}&start=${alignedStartTime}`;
153
- }
154
- /**
155
- * Fetch a video segment with caching
156
- */
157
- async fetchSegment(videoUrl, startTimeMs, quality) {
158
- const effectiveQuality = quality || await this.getAdaptiveQuality();
159
- const segmentUrl = this.generateSegmentUrl(videoUrl, startTimeMs, effectiveQuality);
160
- const cacheKey = `${videoUrl}:${startTimeMs}:${effectiveQuality}`;
161
- const cached = this.segmentCache.get(cacheKey);
162
- if (cached) {
163
- this.cacheHits++;
164
- return cached;
165
- }
166
- const requestKey = `segment:${cacheKey}`;
167
- const pendingRequest = this.pendingRequests.get(requestKey);
168
- if (pendingRequest) return pendingRequest;
169
- const requestPromise = this.fetchVideoSegment(segmentUrl, cacheKey, effectiveQuality);
170
- this.pendingRequests.set(requestKey, requestPromise);
171
- try {
172
- const result = await requestPromise;
173
- this.pendingRequests.delete(requestKey);
174
- return result;
175
- } catch (error) {
176
- this.pendingRequests.delete(requestKey);
177
- throw error;
178
- }
179
- }
180
- /**
181
- * Internal method to actually fetch a video segment
182
- */
183
- async fetchVideoSegment(segmentUrl, cacheKey, effectiveQuality) {
184
- try {
185
- const response = await fetch(segmentUrl);
186
- if (!response.ok) throw new Error(`Failed to fetch segment: ${response.status}`);
187
- const buffer = await response.arrayBuffer();
188
- this.cacheSegment(cacheKey, buffer);
189
- this.currentQuality = effectiveQuality;
190
- this.cacheMisses++;
191
- return buffer;
192
- } catch (error) {
193
- console.error("Failed to fetch segment:", error);
194
- throw error;
195
- }
196
- }
197
- /**
198
- * Prefetch upcoming segments
199
- */
200
- async prefetchSegments(videoUrl, currentTimeMs, quality) {
201
- if (!this.config.enablePrefetch) return;
202
- const effectiveQuality = quality || this.currentQuality;
203
- const segmentDuration = 2e3;
204
- const prefetchPromises = [];
205
- for (let i = 1; i <= this.config.prefetchSegments; i++) {
206
- const nextSegmentStart = currentTimeMs + i * segmentDuration;
207
- const cacheKey = `${videoUrl}:${nextSegmentStart}:${effectiveQuality}`;
208
- if (!this.segmentCache.has(cacheKey)) prefetchPromises.push(this.fetchSegment(videoUrl, nextSegmentStart, effectiveQuality).catch((error) => {
209
- console.warn(`Failed to prefetch segment at ${nextSegmentStart}ms:`, error);
210
- return /* @__PURE__ */ new ArrayBuffer(0);
211
- }));
212
- }
213
- Promise.allSettled(prefetchPromises).then(() => {
214
- console.debug(`Prefetched ${prefetchPromises.length} segments`);
215
- });
216
- }
217
- /**
218
- * Cache a segment with LRU eviction
219
- */
220
- cacheSegment(cacheKey, buffer) {
221
- if (this.segmentCache.size >= this.config.segmentCacheSize) {
222
- const firstKey = this.segmentCache.keys().next().value;
223
- if (firstKey) {
224
- this.segmentCache.delete(firstKey);
225
- const index = this.cacheAccessOrder.indexOf(firstKey);
226
- if (index > -1) this.cacheAccessOrder.splice(index, 1);
227
- }
228
- }
229
- this.segmentCache.set(cacheKey, buffer);
230
- const existingIndex = this.cacheAccessOrder.indexOf(cacheKey);
231
- if (existingIndex > -1) this.cacheAccessOrder.splice(existingIndex, 1);
232
- this.cacheAccessOrder.push(cacheKey);
233
- }
234
- /**
235
- * Get comprehensive cache statistics
236
- */
237
- getCacheStats() {
238
- this.totalRequests = this.cacheHits + this.cacheMisses;
239
- const hitRate = this.totalRequests > 0 ? this.cacheHits / this.totalRequests : 0;
240
- const efficiency = this.segmentCache.size > 0 ? this.cacheHits / this.segmentCache.size : 0;
241
- return {
242
- size: this.segmentCache.size,
243
- maxSize: this.config.segmentCacheSize,
244
- hitRate,
245
- efficiency,
246
- totalRequests: this.totalRequests,
247
- recentKeys: this.cacheAccessOrder.slice(-5)
248
- };
249
- }
250
- /**
251
- * Clear all caches
252
- */
253
- clearCache() {
254
- this.segmentCache.clear();
255
- this.metadataCache.clear();
256
- this.pendingRequests.clear();
257
- }
258
- /**
259
- * Set manual quality override
260
- */
261
- setQuality(quality) {
262
- this.currentQuality = quality;
263
- }
264
- /**
265
- * Get current quality setting
266
- */
267
- getCurrentQuality() {
268
- return this.currentQuality;
269
- }
270
- /**
271
- * Load a video segment for any quality preset including scrub
272
- */
273
- async loadSegment(videoUrl, quality, startTimeMs) {
274
- if (quality === "scrub") return this.loadScrubSegment(videoUrl, startTimeMs);
275
- return this.fetchSegment(videoUrl, startTimeMs, quality);
276
- }
277
- /**
278
- * Load a scrub track segment (30s duration)
279
- */
280
- async loadScrubSegment(videoUrl, startTimeMs) {
281
- const alignedStartTime = Math.floor(startTimeMs / 3e4) * 3e4;
282
- const segmentUrl = `${this.config.baseUrl}/api/v1/transcode/scrub?url=${encodeURIComponent(videoUrl)}&start=${alignedStartTime}`;
283
- const cacheKey = `${videoUrl}:${alignedStartTime}:scrub`;
284
- const cached = this.segmentCache.get(cacheKey);
285
- if (cached) {
286
- this.cacheHits++;
287
- return cached;
288
- }
289
- const requestKey = `scrub:${cacheKey}`;
290
- const pendingRequest = this.pendingRequests.get(requestKey);
291
- if (pendingRequest) return pendingRequest;
292
- const requestPromise = this.fetchScrubSegment(segmentUrl, cacheKey);
293
- this.pendingRequests.set(requestKey, requestPromise);
294
- try {
295
- const result = await requestPromise;
296
- this.pendingRequests.delete(requestKey);
297
- return result;
298
- } catch (error) {
299
- this.pendingRequests.delete(requestKey);
300
- throw error;
301
- }
302
- }
303
- /**
304
- * Internal method to fetch scrub segment
305
- */
306
- async fetchScrubSegment(segmentUrl, cacheKey) {
307
- try {
308
- const response = await fetch(segmentUrl);
309
- if (!response.ok) throw new Error(`Failed to fetch scrub segment: ${response.status}`);
310
- const buffer = await response.arrayBuffer();
311
- this.cacheSegment(cacheKey, buffer);
312
- this.cacheMisses++;
313
- return buffer;
314
- } catch (error) {
315
- console.error("Failed to fetch scrub segment:", error);
316
- throw error;
317
- }
318
- }
319
- /**
320
- * Check if a segment is cached for a given quality
321
- */
322
- hasSegmentInCache(videoUrl, quality, timeMs) {
323
- let alignedTime;
324
- let cacheKey;
325
- if (quality === "scrub") {
326
- alignedTime = Math.floor(timeMs / 3e4) * 3e4;
327
- cacheKey = `${videoUrl}:${alignedTime}:scrub`;
328
- } else {
329
- alignedTime = Math.floor(timeMs / 2e3) * 2e3;
330
- cacheKey = `${videoUrl}:${alignedTime}:${quality}`;
331
- }
332
- return this.segmentCache.has(cacheKey);
333
- }
334
- /**
335
- * Get video metadata
336
- */
337
- async getMetadata(videoUrl) {
338
- return this.loadVideoMetadata(videoUrl);
339
- }
340
- };
341
- /**
342
- * Network condition monitoring
343
- */
344
- var NetworkMonitor = class {
345
- constructor() {
346
- this.measurementHistory = [];
347
- }
348
- async getCurrentCondition() {
349
- const connection = navigator.connection || navigator.mozConnection || navigator.webkitConnection;
350
- if (connection) return {
351
- bandwidth: (connection.downlink || 1) * 1e6,
352
- rtt: connection.rtt || 100,
353
- connectionType: connection.effectiveType || "unknown"
354
- };
355
- const estimatedBandwidth = this.estimateBandwidth();
356
- return {
357
- bandwidth: estimatedBandwidth,
358
- rtt: 100,
359
- connectionType: "unknown"
360
- };
361
- }
362
- estimateBandwidth() {
363
- if (this.measurementHistory.length === 0) return 1e6;
364
- const average = this.measurementHistory.reduce((a, b) => a + b, 0) / this.measurementHistory.length;
365
- return Math.max(average, 4e5);
366
- }
367
- measureBandwidth(bytes, timeMs) {
368
- const bandwidth = bytes * 8 / (timeMs / 1e3);
369
- this.measurementHistory.push(bandwidth);
370
- if (this.measurementHistory.length > 10) this.measurementHistory.shift();
371
- }
372
- };
373
- export { JitTranscodingClient };
@@ -1,96 +0,0 @@
1
- import { JitTranscodingClient } from './JitTranscodingClient.js';
2
- export interface ScrubTrackConfig {
3
- maxScrubCacheSegments?: number;
4
- prefetchCount?: number;
5
- fastSeekThresholdMs?: number;
6
- onLoadingStateChange?: (isLoading: boolean, message?: string) => void;
7
- }
8
- export interface CacheStats {
9
- hits: number;
10
- misses: number;
11
- hitRate: number;
12
- }
13
- export declare class ScrubTrackManager {
14
- readonly videoUrl: string;
15
- private jitClient;
16
- private config;
17
- private scrubCache;
18
- private metadata;
19
- private cacheHits;
20
- private cacheMisses;
21
- private isInitialized;
22
- private preloadingSegments;
23
- constructor(videoUrl: string, jitClient: JitTranscodingClient, config?: ScrubTrackConfig);
24
- /**
25
- * Initialize scrub track manager and start preloading
26
- */
27
- initialize(): Promise<void>;
28
- /**
29
- * Determine if scrub track should be used instead of normal video
30
- */
31
- shouldUseScrubTrack(seekTimeMs: number): boolean;
32
- /**
33
- * Detect if this is a fast seeking operation
34
- */
35
- isFastSeeking(currentTimeMs: number, seekTimeMs: number): boolean;
36
- /**
37
- * Align seek time to 30s scrub segment boundary
38
- */
39
- alignToScrubBoundary(timeMs: number): number;
40
- /**
41
- * Get scrub frame for the given seek time
42
- */
43
- getScrubFrame(seekTimeMs: number): Promise<VideoFrame | null>;
44
- /**
45
- * Record cache hit for statistics
46
- */
47
- recordCacheHit(): void;
48
- /**
49
- * Record cache miss for statistics
50
- */
51
- recordCacheMiss(): void;
52
- /**
53
- * Get cache performance statistics
54
- */
55
- getCacheStats(): CacheStats;
56
- /**
57
- * Check if scrub segment is cached for the given time
58
- */
59
- isScrubSegmentCached(seekTimeMs: number): boolean;
60
- /**
61
- * Get current scrub cache size
62
- */
63
- getScrubCacheSize(): number;
64
- /**
65
- * Get total number of scrub segments for video
66
- */
67
- getTotalScrubSegments(): number;
68
- /**
69
- * Update metadata (e.g., when video duration changes)
70
- */
71
- updateMetadata(): Promise<void>;
72
- /**
73
- * Preload initial scrub segments
74
- */
75
- private preloadInitialSegments;
76
- /**
77
- * Preload nearby segments around a given time
78
- */
79
- private preloadNearbySegments;
80
- /**
81
- * Preload a single scrub segment (background operation)
82
- */
83
- private preloadSegment;
84
- /**
85
- * Cache a scrub segment with LRU eviction
86
- */
87
- private cacheSegment;
88
- /**
89
- * Clear cache and reset state
90
- */
91
- reset(): void;
92
- /**
93
- * Clean up resources and cancel any pending operations
94
- */
95
- cleanup(): void;
96
- }