@editframe/elements 0.26.2-beta.0 → 0.26.4-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 (135) hide show
  1. package/dist/elements/EFTimegroup.js +7 -2
  2. package/dist/elements/EFTimegroup.js.map +1 -1
  3. package/package.json +2 -2
  4. package/scripts/build-css.js +3 -3
  5. package/tsdown.config.ts +1 -1
  6. package/types.json +1 -1
  7. package/src/elements/ContextProxiesController.ts +0 -124
  8. package/src/elements/CrossUpdateController.ts +0 -22
  9. package/src/elements/EFAudio.browsertest.ts +0 -706
  10. package/src/elements/EFAudio.ts +0 -56
  11. package/src/elements/EFCaptions.browsertest.ts +0 -1960
  12. package/src/elements/EFCaptions.ts +0 -823
  13. package/src/elements/EFImage.browsertest.ts +0 -120
  14. package/src/elements/EFImage.ts +0 -113
  15. package/src/elements/EFMedia/AssetIdMediaEngine.test.ts +0 -224
  16. package/src/elements/EFMedia/AssetIdMediaEngine.ts +0 -110
  17. package/src/elements/EFMedia/AssetMediaEngine.browsertest.ts +0 -140
  18. package/src/elements/EFMedia/AssetMediaEngine.ts +0 -385
  19. package/src/elements/EFMedia/BaseMediaEngine.browsertest.ts +0 -400
  20. package/src/elements/EFMedia/BaseMediaEngine.ts +0 -505
  21. package/src/elements/EFMedia/BufferedSeekingInput.browsertest.ts +0 -386
  22. package/src/elements/EFMedia/BufferedSeekingInput.ts +0 -430
  23. package/src/elements/EFMedia/JitMediaEngine.browsertest.ts +0 -226
  24. package/src/elements/EFMedia/JitMediaEngine.ts +0 -256
  25. package/src/elements/EFMedia/audioTasks/makeAudioBufferTask.browsertest.ts +0 -679
  26. package/src/elements/EFMedia/audioTasks/makeAudioBufferTask.ts +0 -117
  27. package/src/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.ts +0 -246
  28. package/src/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.browsertest.ts +0 -59
  29. package/src/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.ts +0 -27
  30. package/src/elements/EFMedia/audioTasks/makeAudioInputTask.browsertest.ts +0 -55
  31. package/src/elements/EFMedia/audioTasks/makeAudioInputTask.ts +0 -53
  32. package/src/elements/EFMedia/audioTasks/makeAudioSeekTask.chunkboundary.regression.browsertest.ts +0 -207
  33. package/src/elements/EFMedia/audioTasks/makeAudioSeekTask.ts +0 -72
  34. package/src/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.ts +0 -32
  35. package/src/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.ts +0 -29
  36. package/src/elements/EFMedia/audioTasks/makeAudioTasksVideoOnly.browsertest.ts +0 -95
  37. package/src/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.ts +0 -184
  38. package/src/elements/EFMedia/shared/AudioSpanUtils.ts +0 -129
  39. package/src/elements/EFMedia/shared/BufferUtils.ts +0 -342
  40. package/src/elements/EFMedia/shared/GlobalInputCache.ts +0 -77
  41. package/src/elements/EFMedia/shared/MediaTaskUtils.ts +0 -44
  42. package/src/elements/EFMedia/shared/PrecisionUtils.ts +0 -46
  43. package/src/elements/EFMedia/shared/RenditionHelpers.browsertest.ts +0 -246
  44. package/src/elements/EFMedia/shared/RenditionHelpers.ts +0 -56
  45. package/src/elements/EFMedia/shared/ThumbnailExtractor.ts +0 -227
  46. package/src/elements/EFMedia/tasks/makeMediaEngineTask.browsertest.ts +0 -167
  47. package/src/elements/EFMedia/tasks/makeMediaEngineTask.ts +0 -88
  48. package/src/elements/EFMedia/videoTasks/MainVideoInputCache.ts +0 -76
  49. package/src/elements/EFMedia/videoTasks/ScrubInputCache.ts +0 -61
  50. package/src/elements/EFMedia/videoTasks/makeScrubVideoBufferTask.ts +0 -114
  51. package/src/elements/EFMedia/videoTasks/makeScrubVideoInitSegmentFetchTask.ts +0 -35
  52. package/src/elements/EFMedia/videoTasks/makeScrubVideoInputTask.ts +0 -52
  53. package/src/elements/EFMedia/videoTasks/makeScrubVideoSeekTask.ts +0 -124
  54. package/src/elements/EFMedia/videoTasks/makeScrubVideoSegmentFetchTask.ts +0 -44
  55. package/src/elements/EFMedia/videoTasks/makeScrubVideoSegmentIdTask.ts +0 -32
  56. package/src/elements/EFMedia/videoTasks/makeUnifiedVideoSeekTask.ts +0 -370
  57. package/src/elements/EFMedia/videoTasks/makeVideoBufferTask.ts +0 -109
  58. package/src/elements/EFMedia.browsertest.ts +0 -872
  59. package/src/elements/EFMedia.ts +0 -341
  60. package/src/elements/EFSourceMixin.ts +0 -60
  61. package/src/elements/EFSurface.browsertest.ts +0 -151
  62. package/src/elements/EFSurface.ts +0 -142
  63. package/src/elements/EFTemporal.browsertest.ts +0 -215
  64. package/src/elements/EFTemporal.ts +0 -800
  65. package/src/elements/EFThumbnailStrip.browsertest.ts +0 -585
  66. package/src/elements/EFThumbnailStrip.media-engine.browsertest.ts +0 -714
  67. package/src/elements/EFThumbnailStrip.ts +0 -906
  68. package/src/elements/EFTimegroup.browsertest.ts +0 -870
  69. package/src/elements/EFTimegroup.ts +0 -878
  70. package/src/elements/EFVideo.browsertest.ts +0 -1482
  71. package/src/elements/EFVideo.ts +0 -564
  72. package/src/elements/EFWaveform.ts +0 -547
  73. package/src/elements/FetchContext.browsertest.ts +0 -401
  74. package/src/elements/FetchMixin.ts +0 -38
  75. package/src/elements/SampleBuffer.ts +0 -94
  76. package/src/elements/TargetController.browsertest.ts +0 -230
  77. package/src/elements/TargetController.ts +0 -224
  78. package/src/elements/TimegroupController.ts +0 -26
  79. package/src/elements/durationConverter.ts +0 -35
  80. package/src/elements/parseTimeToMs.ts +0 -9
  81. package/src/elements/printTaskStatus.ts +0 -16
  82. package/src/elements/renderTemporalAudio.ts +0 -108
  83. package/src/elements/updateAnimations.browsertest.ts +0 -1884
  84. package/src/elements/updateAnimations.ts +0 -217
  85. package/src/elements/util.ts +0 -24
  86. package/src/gui/ContextMixin.browsertest.ts +0 -860
  87. package/src/gui/ContextMixin.ts +0 -562
  88. package/src/gui/Controllable.browsertest.ts +0 -258
  89. package/src/gui/Controllable.ts +0 -41
  90. package/src/gui/EFConfiguration.ts +0 -40
  91. package/src/gui/EFControls.browsertest.ts +0 -389
  92. package/src/gui/EFControls.ts +0 -195
  93. package/src/gui/EFDial.browsertest.ts +0 -84
  94. package/src/gui/EFDial.ts +0 -172
  95. package/src/gui/EFFilmstrip.browsertest.ts +0 -712
  96. package/src/gui/EFFilmstrip.ts +0 -1349
  97. package/src/gui/EFFitScale.ts +0 -152
  98. package/src/gui/EFFocusOverlay.ts +0 -79
  99. package/src/gui/EFPause.browsertest.ts +0 -202
  100. package/src/gui/EFPause.ts +0 -73
  101. package/src/gui/EFPlay.browsertest.ts +0 -202
  102. package/src/gui/EFPlay.ts +0 -73
  103. package/src/gui/EFPreview.ts +0 -74
  104. package/src/gui/EFResizableBox.browsertest.ts +0 -79
  105. package/src/gui/EFResizableBox.ts +0 -898
  106. package/src/gui/EFScrubber.ts +0 -151
  107. package/src/gui/EFTimeDisplay.browsertest.ts +0 -237
  108. package/src/gui/EFTimeDisplay.ts +0 -55
  109. package/src/gui/EFToggleLoop.ts +0 -35
  110. package/src/gui/EFTogglePlay.ts +0 -70
  111. package/src/gui/EFWorkbench.ts +0 -115
  112. package/src/gui/PlaybackController.ts +0 -527
  113. package/src/gui/TWMixin.css +0 -6
  114. package/src/gui/TWMixin.ts +0 -61
  115. package/src/gui/TargetOrContextMixin.ts +0 -185
  116. package/src/gui/currentTimeContext.ts +0 -5
  117. package/src/gui/durationContext.ts +0 -3
  118. package/src/gui/efContext.ts +0 -6
  119. package/src/gui/fetchContext.ts +0 -5
  120. package/src/gui/focusContext.ts +0 -7
  121. package/src/gui/focusedElementContext.ts +0 -5
  122. package/src/gui/playingContext.ts +0 -5
  123. package/src/otel/BridgeSpanExporter.ts +0 -150
  124. package/src/otel/setupBrowserTracing.ts +0 -73
  125. package/src/otel/tracingHelpers.ts +0 -251
  126. package/src/transcoding/cache/RequestDeduplicator.test.ts +0 -170
  127. package/src/transcoding/cache/RequestDeduplicator.ts +0 -65
  128. package/src/transcoding/cache/URLTokenDeduplicator.test.ts +0 -182
  129. package/src/transcoding/cache/URLTokenDeduplicator.ts +0 -101
  130. package/src/transcoding/types/index.ts +0 -312
  131. package/src/transcoding/utils/MediaUtils.ts +0 -63
  132. package/src/transcoding/utils/UrlGenerator.ts +0 -68
  133. package/src/transcoding/utils/constants.ts +0 -36
  134. package/src/utils/LRUCache.test.ts +0 -274
  135. package/src/utils/LRUCache.ts +0 -696
@@ -1,386 +0,0 @@
1
- import { test as baseTest, describe } from "vitest";
2
- import { BufferedSeekingInput, NoSample } from "./BufferedSeekingInput";
3
-
4
- const test = baseTest.extend<{
5
- barsNtone: BufferedSeekingInput;
6
- fiveSampleBuffer: BufferedSeekingInput;
7
- inputAtStart: BufferedSeekingInput;
8
- inputAtMiddle: BufferedSeekingInput;
9
- segment2: BufferedSeekingInput;
10
- }>({
11
- barsNtone: async ({}, use) => {
12
- const response = await fetch("/bars-n-tone.mp4");
13
- const arrayBuffer = await response.arrayBuffer();
14
- const input = new BufferedSeekingInput(arrayBuffer);
15
- await use(input);
16
- },
17
- fiveSampleBuffer: async ({}, use) => {
18
- const response = await fetch("/jit-segments/segment-0ms-2s-low.mp4");
19
- const arrayBuffer = await response.arrayBuffer();
20
- const input = new BufferedSeekingInput(arrayBuffer, {
21
- videoBufferSize: 5,
22
- audioBufferSize: 5,
23
- });
24
- await use(input);
25
- },
26
- inputAtStart: async ({}, use) => {
27
- const response = await fetch("/jit-segments/segment-0ms-2s-low.mp4");
28
- const arrayBuffer = await response.arrayBuffer();
29
- const input = new BufferedSeekingInput(arrayBuffer);
30
- await use(input);
31
- },
32
- inputAtMiddle: async ({}, use) => {
33
- const response = await fetch("/jit-segments/segment-6000ms-1s-low.mp4");
34
- const arrayBuffer = await response.arrayBuffer();
35
- const input = new BufferedSeekingInput(arrayBuffer);
36
- await use(input);
37
- },
38
- segment2: async ({}, use) => {
39
- const response = await fetch("/jit-segments/segment-2.mp4");
40
- const arrayBuffer = await response.arrayBuffer();
41
- const input = new BufferedSeekingInput(arrayBuffer);
42
- await use(input);
43
- },
44
- });
45
-
46
- describe("BufferedSeekingInput", () => {
47
- describe("computeDuration", () => {
48
- test("computes duration", async ({
49
- expect,
50
- inputAtStart,
51
- inputAtMiddle,
52
- }) => {
53
- await expect(inputAtStart.computeDuration()).resolves.toBe(2);
54
- await expect(inputAtMiddle.computeDuration()).resolves.toBeCloseTo(0.96);
55
- });
56
- });
57
-
58
- describe("basic seeking", () => {
59
- test("seeks to frame at 0 seconds", async ({ expect, inputAtStart }) => {
60
- const sample = await inputAtStart.seek(1, 0);
61
- expect(sample).toBeDefined();
62
- expect(sample!.timestamp).toBe(0);
63
- });
64
-
65
- test("seeks to frame at 0.02 seconds", async ({ expect, inputAtStart }) => {
66
- const sample = await inputAtStart.seek(1, 20);
67
- expect(sample).toBeDefined();
68
- expect(sample!.timestamp).toBe(0);
69
- });
70
-
71
- test("seeks to frame at 0.04 seconds", async ({ expect, inputAtStart }) => {
72
- const sample = await inputAtStart.seek(1, 40);
73
- expect(sample).toBeDefined();
74
- expect(sample!.timestamp).toBe(0.04);
75
- });
76
- });
77
-
78
- describe("deterministic seeking behavior", () => {
79
- test("seeks to exact sample timestamps", async ({
80
- expect,
81
- inputAtStart,
82
- }) => {
83
- // Updated expectations based on improved mediabunny processing
84
- expect((await inputAtStart.seek(1, 0))!.timestamp).toBe(0);
85
- expect((await inputAtStart.seek(1, 40))!.timestamp).toBe(0.04); // Frame timing shifted due to improvements
86
- expect((await inputAtStart.seek(1, 80))!.timestamp).toBe(0.08);
87
- expect((await inputAtStart.seek(1, 120))!.timestamp).toBe(0.12);
88
- expect((await inputAtStart.seek(1, 160))!.timestamp).toBe(0.16);
89
- });
90
-
91
- test("seeks between samples returns previous sample", async ({
92
- expect,
93
- inputAtStart,
94
- }) => {
95
- expect((await inputAtStart.seek(1, 30))!.timestamp).toBe(0);
96
- expect((await inputAtStart.seek(1, 60))!.timestamp).toBe(0.04);
97
- expect((await inputAtStart.seek(1, 100))!.timestamp).toBe(0.08);
98
- expect((await inputAtStart.seek(1, 140))!.timestamp).toBe(0.12);
99
- });
100
-
101
- test("seeks before first sample", async ({ expect, inputAtStart }) => {
102
- inputAtStart.clearBuffer(1);
103
- expect((await inputAtStart.seek(1, 0))!.timestamp).toBe(0);
104
- });
105
-
106
- test("seeks to later samples in media", async ({
107
- expect,
108
- inputAtStart,
109
- }) => {
110
- const result200 = await inputAtStart.seek(1, 200);
111
- const result1000 = await inputAtStart.seek(1, 1000);
112
-
113
- expect(result200!.timestamp! * 1000).toBeLessThanOrEqual(200);
114
- expect(result1000!.timestamp! * 1000).toBeLessThanOrEqual(1000);
115
- expect(result200!.timestamp).toBeGreaterThanOrEqual(0);
116
- expect(result1000!.timestamp).toBeGreaterThanOrEqual(
117
- result200!.timestamp!,
118
- );
119
- });
120
-
121
- test("never returns future sample", async ({ expect, inputAtStart }) => {
122
- const _0 = await inputAtStart.seek(1, 0);
123
- const _10 = await inputAtStart.seek(1, 10);
124
- const _20 = await inputAtStart.seek(1, 20);
125
- const _30 = await inputAtStart.seek(1, 30);
126
- const _40 = await inputAtStart.seek(1, 40);
127
- const _50 = await inputAtStart.seek(1, 50);
128
- const _60 = await inputAtStart.seek(1, 60);
129
- const _70 = await inputAtStart.seek(1, 70);
130
- const _80 = await inputAtStart.seek(1, 80);
131
- const _90 = await inputAtStart.seek(1, 90);
132
-
133
- expect(_0?.timestamp).toBe(0);
134
- expect(_10?.timestamp).toBe(0);
135
- expect(_20?.timestamp).toBe(0);
136
- expect(_30?.timestamp).toBe(0);
137
- expect(_40?.timestamp).toBe(0.04);
138
- expect(_50?.timestamp).toBe(0.04);
139
- expect(_60?.timestamp).toBe(0.04);
140
- expect(_70?.timestamp).toBe(0.04);
141
- expect(_80?.timestamp).toBe(0.08);
142
- expect(_90?.timestamp).toBe(0.08);
143
- });
144
- });
145
-
146
- describe("buffer state management", () => {
147
- test("starts with empty buffer", async ({ expect, inputAtStart }) => {
148
- expect(inputAtStart.getBufferSize(1)).toBe(0);
149
- expect(inputAtStart.getBufferTimestamps(1)).toEqual([]);
150
- expect(inputAtStart.getBufferContents(1)).toEqual([]);
151
- });
152
-
153
- test("maintains separate buffers per track", async ({
154
- expect,
155
- inputAtStart,
156
- }) => {
157
- await inputAtStart.seek(1, 0);
158
- const track1BufferSize = inputAtStart.getBufferSize(1);
159
- expect(track1BufferSize).toBeGreaterThan(0);
160
-
161
- expect(inputAtStart.getBufferSize(2)).toBe(0);
162
-
163
- await inputAtStart.seek(2, 0);
164
- expect(inputAtStart.getBufferSize(2)).toBeGreaterThan(0);
165
- expect(inputAtStart.getBufferSize(1)).toBe(track1BufferSize);
166
- });
167
-
168
- test("buffer accumulates samples in order", async ({
169
- expect,
170
- inputAtStart,
171
- }) => {
172
- inputAtStart.clearBuffer(1);
173
-
174
- await inputAtStart.seek(1, 0);
175
- await inputAtStart.seek(1, 40);
176
- await inputAtStart.seek(1, 80);
177
-
178
- const timestamps = inputAtStart.getBufferTimestamps(1);
179
- expect(timestamps).toContain(0);
180
- expect(timestamps).toContain(0.04);
181
- // Updated: 0.08 frame no longer available due to improved mediabunny processing
182
- // The buffer now contains [0, 0.04] instead of [0, 0.04, 0.08]
183
- });
184
-
185
- test("buffer extends one sample ahead", async ({
186
- expect,
187
- fiveSampleBuffer,
188
- }) => {
189
- await fiveSampleBuffer.seek(1, 960);
190
- expect(fiveSampleBuffer.getBufferTimestamps(1)).toEqual([
191
- 0.8, 0.84, 0.88, 0.92, 0.96,
192
- ]);
193
- });
194
-
195
- test("buffer resets when seeking back before the buffer", async ({
196
- expect,
197
- fiveSampleBuffer,
198
- }) => {
199
- await fiveSampleBuffer.seek(1, 960);
200
- await fiveSampleBuffer.seek(1, 0);
201
- expect(fiveSampleBuffer.getBufferTimestamps(1)).toEqual([0]);
202
- });
203
-
204
- test("buffer is maintained when seeking forwards within the buffer", async ({
205
- expect,
206
- fiveSampleBuffer,
207
- }) => {
208
- const sample1 = await fiveSampleBuffer.seek(1, 960);
209
- expect(sample1?.timestamp).toBe(0.96);
210
- expect(fiveSampleBuffer.getBufferTimestamps(1)).toEqual([
211
- 0.8, 0.84, 0.88, 0.92, 0.96,
212
- ]);
213
- const sample2 = await fiveSampleBuffer.seek(1, 900);
214
- expect(sample2?.timestamp).toBe(0.88);
215
- expect(fiveSampleBuffer.getBufferTimestamps(1)).toEqual([
216
- 0.8, 0.84, 0.88, 0.92, 0.96,
217
- ]);
218
- const sample3 = await fiveSampleBuffer.seek(1, 920);
219
- expect(sample3?.timestamp).toBe(0.92);
220
- expect(fiveSampleBuffer.getBufferTimestamps(1)).toEqual([
221
- 0.8, 0.84, 0.88, 0.92, 0.96,
222
- ]);
223
- });
224
-
225
- test("buffer is maintained when seeking backwards within the buffer", async ({
226
- expect,
227
- fiveSampleBuffer,
228
- }) => {
229
- const sample1 = await fiveSampleBuffer.seek(1, 960);
230
- expect(sample1?.timestamp).toBe(0.96);
231
- expect(fiveSampleBuffer.getBufferTimestamps(1)).toEqual([
232
- 0.8, 0.84, 0.88, 0.92, 0.96,
233
- ]);
234
- const sample2 = await fiveSampleBuffer.seek(1, 900);
235
- expect(sample2?.timestamp).toBe(0.88);
236
- expect(fiveSampleBuffer.getBufferTimestamps(1)).toEqual([
237
- 0.8, 0.84, 0.88, 0.92, 0.96,
238
- ]);
239
- });
240
-
241
- test("buffer is maintained when seeking backwards to start of buffer", async ({
242
- expect,
243
- fiveSampleBuffer,
244
- }) => {
245
- const sample1 = await fiveSampleBuffer.seek(1, 960);
246
- expect(sample1?.timestamp).toBe(0.96);
247
- expect(fiveSampleBuffer.getBufferTimestamps(1)).toEqual([
248
- 0.8, 0.84, 0.88, 0.92, 0.96,
249
- ]);
250
- const sample2 = await fiveSampleBuffer.seek(1, 800);
251
- expect(sample2?.timestamp).toBe(0.8);
252
- expect(fiveSampleBuffer.getBufferTimestamps(1)).toEqual([
253
- 0.8, 0.84, 0.88, 0.92, 0.96,
254
- ]);
255
- });
256
-
257
- test("buffer is reset when seeking backwards to arbitrary time before buffer", async ({
258
- expect,
259
- fiveSampleBuffer,
260
- }) => {
261
- const sample1 = await fiveSampleBuffer.seek(1, 960);
262
- expect(sample1?.timestamp).toBe(0.96);
263
- expect(fiveSampleBuffer.getBufferTimestamps(1)).toEqual([
264
- 0.8, 0.84, 0.88, 0.92, 0.96,
265
- ]);
266
-
267
- const sample2 = await fiveSampleBuffer.seek(1, 720);
268
- expect(sample2?.timestamp).toBe(0.72);
269
- expect(fiveSampleBuffer.getBufferTimestamps(1)).toEqual([
270
- 0.56, 0.6, 0.64, 0.68, 0.72,
271
- ]);
272
- });
273
-
274
- test("buffer is maintained when seeking forwards to end of buffer", async ({
275
- expect,
276
- fiveSampleBuffer,
277
- }) => {
278
- const sample1 = await fiveSampleBuffer.seek(1, 960);
279
- expect(sample1?.timestamp).toBe(0.96);
280
- expect(fiveSampleBuffer.getBufferTimestamps(1)).toEqual([
281
- 0.8, 0.84, 0.88, 0.92, 0.96,
282
- ]);
283
- const sample2 = await fiveSampleBuffer.seek(1, 900);
284
- expect(sample2?.timestamp).toBe(0.88);
285
- expect(fiveSampleBuffer.getBufferTimestamps(1)).toEqual([
286
- 0.8, 0.84, 0.88, 0.92, 0.96,
287
- ]);
288
- await fiveSampleBuffer.seek(1, 960);
289
- expect(fiveSampleBuffer.getBufferTimestamps(1)).toEqual([
290
- 0.8, 0.84, 0.88, 0.92, 0.96,
291
- ]);
292
- });
293
-
294
- test("buffer is maintained when seeking forwards past the buffer", async ({
295
- expect,
296
- fiveSampleBuffer,
297
- }) => {
298
- const sample1 = await fiveSampleBuffer.seek(1, 960);
299
- expect(sample1?.timestamp).toBe(0.96);
300
- expect(fiveSampleBuffer.getBufferTimestamps(1)).toEqual([
301
- 0.8, 0.84, 0.88, 0.92, 0.96,
302
- ]);
303
- const sample2 = await fiveSampleBuffer.seek(1, 1000);
304
- expect(sample2?.timestamp).toBe(1);
305
- expect(fiveSampleBuffer.getBufferTimestamps(1)).toEqual([
306
- 0.84, 0.88, 0.92, 0.96, 1,
307
- ]);
308
- });
309
- });
310
-
311
- describe("seeing to time not in buffer (time is before buffer)", () => {
312
- test("throws error", async ({ expect, segment2 }) => {
313
- await expect(segment2.seek(1, -100)).rejects.toThrow(NoSample);
314
- });
315
- });
316
-
317
- describe("seeking forward at 1ms intervals", () => {
318
- test("returns all samples in the media", async ({
319
- expect,
320
- inputAtStart,
321
- }) => {
322
- const timestamps = new Set<number>();
323
- for (let i = 0; i < 1999; i++) {
324
- const sample = await inputAtStart.seek(1, i);
325
- timestamps.add(sample!.timestamp!);
326
- }
327
- expect(Array.from(timestamps)).toEqual([
328
- 0, 0.04, 0.08, 0.12, 0.16, 0.2, 0.24, 0.28, 0.32, 0.36, 0.4, 0.44, 0.48,
329
- 0.52, 0.56, 0.6, 0.64, 0.68, 0.72, 0.76, 0.8, 0.84, 0.88, 0.92, 0.96, 1,
330
- 1.04, 1.08, 1.12, 1.16, 1.2, 1.24, 1.28, 1.32, 1.36, 1.4, 1.44, 1.48,
331
- 1.52, 1.56, 1.6, 1.64, 1.68, 1.72, 1.76, 1.8, 1.84, 1.88, 1.92, 1.96,
332
- ]);
333
- });
334
- });
335
-
336
- describe("seeking to exact end of last sample", () => {
337
- test("returns last sample when seeking to 10000ms in bars-n-tone.mp4", async ({
338
- expect,
339
- }) => {
340
- const response = await fetch("/bars-n-tone.mp4");
341
- const arrayBuffer = await response.arrayBuffer();
342
- const input = new BufferedSeekingInput(arrayBuffer, {
343
- videoBufferSize: 5,
344
- });
345
-
346
- const result = await input.seek(1, 10000);
347
- expect(result).toBeDefined();
348
- expect(result!.timestamp).toBe(9.966666666666667);
349
- });
350
- });
351
-
352
- describe("error handling", () => {
353
- test("throws error for non-existent track", async ({
354
- expect,
355
- inputAtStart,
356
- }) => {
357
- await expect(inputAtStart.seek(999, 0)).rejects.toThrow(
358
- "Track 999 not found",
359
- );
360
- });
361
- });
362
-
363
- describe("concurrency handling", () => {
364
- test("seeks are serialized", async ({ expect, inputAtStart }) => {
365
- const samples = await Promise.all([
366
- inputAtStart.seek(1, 0),
367
- inputAtStart.seek(1, 40),
368
- inputAtStart.seek(1, 80),
369
- ]);
370
-
371
- expect(samples.map((sample) => sample?.timestamp)).toEqual([
372
- 0, 0.04, 0.08,
373
- ]);
374
- });
375
- });
376
-
377
- describe("regression tests", () => {
378
- test("seeks to 7975ms in bars-n-tone.mp4", async ({
379
- expect,
380
- barsNtone,
381
- }) => {
382
- const sample = await barsNtone.seek(1, 7975);
383
- expect(sample?.timestamp).toBeCloseTo(7.966);
384
- });
385
- });
386
- });