@editframe/elements 0.18.3-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.
- package/dist/elements/EFMedia/AssetMediaEngine.browsertest.d.ts +0 -0
- package/dist/elements/EFMedia/AssetMediaEngine.d.ts +2 -4
- package/dist/elements/EFMedia/AssetMediaEngine.js +22 -3
- package/dist/elements/EFMedia/BaseMediaEngine.js +20 -1
- package/dist/elements/EFMedia/BufferedSeekingInput.d.ts +5 -5
- package/dist/elements/EFMedia/BufferedSeekingInput.js +27 -7
- package/dist/elements/EFMedia/JitMediaEngine.d.ts +1 -1
- package/dist/elements/EFMedia/JitMediaEngine.js +22 -3
- package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.js +4 -1
- package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.js +11 -3
- package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.chunkboundary.regression.browsertest.d.ts +0 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js +10 -2
- package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.js +11 -1
- package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.js +3 -2
- package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js +4 -1
- package/dist/elements/EFMedia/shared/PrecisionUtils.d.ts +28 -0
- package/dist/elements/EFMedia/shared/PrecisionUtils.js +29 -0
- package/dist/elements/EFMedia/videoTasks/makeVideoSeekTask.js +11 -2
- package/dist/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.js +11 -1
- package/dist/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.js +3 -2
- package/dist/elements/EFMedia.d.ts +0 -12
- package/dist/elements/EFMedia.js +4 -30
- package/dist/elements/EFTimegroup.js +12 -17
- package/dist/elements/EFVideo.d.ts +0 -9
- package/dist/elements/EFVideo.js +0 -7
- package/dist/elements/SampleBuffer.js +6 -6
- package/dist/getRenderInfo.d.ts +2 -2
- package/dist/gui/ContextMixin.js +71 -17
- package/dist/gui/TWMixin.js +1 -1
- package/dist/style.css +1 -1
- package/dist/transcoding/types/index.d.ts +9 -9
- package/package.json +2 -3
- package/src/elements/EFAudio.browsertest.ts +7 -7
- package/src/elements/EFMedia/AssetMediaEngine.browsertest.ts +100 -0
- package/src/elements/EFMedia/AssetMediaEngine.ts +52 -7
- package/src/elements/EFMedia/BaseMediaEngine.ts +50 -1
- package/src/elements/EFMedia/BufferedSeekingInput.browsertest.ts +135 -54
- package/src/elements/EFMedia/BufferedSeekingInput.ts +74 -17
- package/src/elements/EFMedia/JitMediaEngine.ts +58 -2
- package/src/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.ts +10 -1
- package/src/elements/EFMedia/audioTasks/makeAudioInputTask.ts +16 -8
- package/src/elements/EFMedia/audioTasks/makeAudioSeekTask.chunkboundary.regression.browsertest.ts +199 -0
- package/src/elements/EFMedia/audioTasks/makeAudioSeekTask.ts +25 -3
- package/src/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.ts +12 -1
- package/src/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.ts +3 -2
- package/src/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.ts +10 -1
- package/src/elements/EFMedia/shared/PrecisionUtils.ts +46 -0
- package/src/elements/EFMedia/videoTasks/makeVideoSeekTask.ts +27 -3
- package/src/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.ts +12 -1
- package/src/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.ts +3 -2
- package/src/elements/EFMedia.browsertest.ts +73 -33
- package/src/elements/EFMedia.ts +11 -54
- package/src/elements/EFTimegroup.ts +21 -26
- package/src/elements/EFVideo.browsertest.ts +895 -162
- package/src/elements/EFVideo.ts +0 -16
- package/src/elements/SampleBuffer.ts +8 -10
- package/src/gui/ContextMixin.ts +104 -26
- package/src/transcoding/types/index.ts +10 -6
- package/test/EFVideo.framegen.browsertest.ts +1 -1
- package/test/__cache__/GET__api_v1_transcode_audio_1_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__32da3954ba60c96ad732020c65a08ebc/metadata.json +3 -3
- 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
- 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
- package/test/__cache__/GET__api_v1_transcode_audio_2_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__b0b2b07efcf607de8ee0f650328c32f7/metadata.json +3 -3
- 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
- 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
- package/test/__cache__/GET__api_v1_transcode_audio_3_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a75c2252b542e0c152c780e9a8d7b154/metadata.json +3 -3
- 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
- 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
- package/test/__cache__/GET__api_v1_transcode_audio_4_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a64ff1cfb1b52cae14df4b5dfa1e222b/metadata.json +3 -3
- package/test/__cache__/GET__api_v1_transcode_audio_init_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__e66d2c831d951e74ad0aeaa6489795d0/metadata.json +3 -3
- package/test/__cache__/GET__api_v1_transcode_high_1_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__26197f6f7c46cacb0a71134131c3f775/metadata.json +3 -3
- package/test/__cache__/GET__api_v1_transcode_high_2_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__4cb6774cd3650ccf59c8f8dc6678c0b9/metadata.json +3 -3
- 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
- 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
- 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
- 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
- package/test/__cache__/GET__api_v1_transcode_high_init_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__0798c479b44aaeef850609a430f6e613/metadata.json +3 -3
- package/test/__cache__/GET__api_v1_transcode_manifest_json_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__3be92a0437de726b431ed5af2369158a/data.bin +1 -1
- package/test/__cache__/GET__api_v1_transcode_manifest_json_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__3be92a0437de726b431ed5af2369158a/metadata.json +4 -4
- package/test/recordReplayProxyPlugin.js +50 -0
- package/types.json +1 -1
- package/dist/DecoderResetFrequency.test.d.ts +0 -1
- package/dist/DecoderResetRecovery.test.d.ts +0 -1
- package/dist/ScrubTrackManager.d.ts +0 -96
- package/dist/elements/EFMedia/services/AudioElementFactory.browsertest.d.ts +0 -1
- package/dist/elements/EFMedia/services/AudioElementFactory.d.ts +0 -22
- package/dist/elements/EFMedia/services/AudioElementFactory.js +0 -72
- package/dist/elements/EFMedia/services/MediaSourceService.browsertest.d.ts +0 -1
- package/dist/elements/EFMedia/services/MediaSourceService.d.ts +0 -47
- package/dist/elements/EFMedia/services/MediaSourceService.js +0 -73
- package/dist/gui/services/ElementConnectionManager.browsertest.d.ts +0 -1
- package/dist/gui/services/ElementConnectionManager.d.ts +0 -59
- package/dist/gui/services/ElementConnectionManager.js +0 -128
- package/dist/gui/services/PlaybackController.browsertest.d.ts +0 -1
- package/dist/gui/services/PlaybackController.d.ts +0 -103
- package/dist/gui/services/PlaybackController.js +0 -290
- package/dist/services/MediaSourceManager.d.ts +0 -62
- package/dist/services/MediaSourceManager.js +0 -211
- package/src/elements/EFMedia/services/AudioElementFactory.browsertest.ts +0 -325
- package/src/elements/EFMedia/services/AudioElementFactory.ts +0 -119
- package/src/elements/EFMedia/services/MediaSourceService.browsertest.ts +0 -257
- package/src/elements/EFMedia/services/MediaSourceService.ts +0 -102
- package/src/gui/services/ElementConnectionManager.browsertest.ts +0 -263
- package/src/gui/services/ElementConnectionManager.ts +0 -224
- package/src/gui/services/PlaybackController.browsertest.ts +0 -437
- package/src/gui/services/PlaybackController.ts +0 -521
- package/src/services/MediaSourceManager.ts +0 -333
package/src/elements/EFMedia.ts
CHANGED
|
@@ -3,7 +3,6 @@ import { property, state } from "lit/decorators.js";
|
|
|
3
3
|
|
|
4
4
|
import type { AudioSpan } from "../transcoding/types/index.ts";
|
|
5
5
|
import { UrlGenerator } from "../transcoding/utils/UrlGenerator.ts";
|
|
6
|
-
// Audio task imports
|
|
7
6
|
import { makeAudioBufferTask } from "./EFMedia/audioTasks/makeAudioBufferTask.ts";
|
|
8
7
|
import { makeAudioFrequencyAnalysisTask } from "./EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.ts";
|
|
9
8
|
import { makeAudioInitSegmentFetchTask } from "./EFMedia/audioTasks/makeAudioInitSegmentFetchTask.ts";
|
|
@@ -12,10 +11,7 @@ import { makeAudioSeekTask } from "./EFMedia/audioTasks/makeAudioSeekTask.ts";
|
|
|
12
11
|
import { makeAudioSegmentFetchTask } from "./EFMedia/audioTasks/makeAudioSegmentFetchTask.ts";
|
|
13
12
|
import { makeAudioSegmentIdTask } from "./EFMedia/audioTasks/makeAudioSegmentIdTask.ts";
|
|
14
13
|
import { makeAudioTimeDomainAnalysisTask } from "./EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.ts";
|
|
15
|
-
import {
|
|
16
|
-
// Import extracted services and utilities
|
|
17
|
-
import { MediaSourceService } from "./EFMedia/services/MediaSourceService.js";
|
|
18
|
-
// Common task imports
|
|
14
|
+
import { fetchAudioSpanningTime } from "./EFMedia/shared/AudioSpanUtils.ts";
|
|
19
15
|
import { makeMediaEngineTask } from "./EFMedia/tasks/makeMediaEngineTask.ts";
|
|
20
16
|
import { EFSourceMixin } from "./EFSourceMixin.js";
|
|
21
17
|
import { EFTemporal } from "./EFTemporal.js";
|
|
@@ -72,16 +68,6 @@ export class EFMedia extends EFTargetable(
|
|
|
72
68
|
];
|
|
73
69
|
}
|
|
74
70
|
|
|
75
|
-
// Services for media source and audio element management
|
|
76
|
-
private mediaSourceService = new MediaSourceService({
|
|
77
|
-
onError: (error) => {
|
|
78
|
-
console.error("🎵 [EFMedia] MediaSourceService error:", error);
|
|
79
|
-
},
|
|
80
|
-
onReady: () => {},
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
private audioElementFactory = new AudioElementFactory();
|
|
84
|
-
|
|
85
71
|
static styles = [
|
|
86
72
|
css`
|
|
87
73
|
:host {
|
|
@@ -220,6 +206,13 @@ export class EFMedia extends EFTargetable(
|
|
|
220
206
|
changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>,
|
|
221
207
|
): void {
|
|
222
208
|
super.updated(changedProperties);
|
|
209
|
+
|
|
210
|
+
// Check if our timeline position has actually changed, even if ownCurrentTimeMs isn't tracked as a property
|
|
211
|
+
const newCurrentSourceTimeMs = this.currentSourceTimeMs;
|
|
212
|
+
if (newCurrentSourceTimeMs !== this.desiredSeekTimeMs) {
|
|
213
|
+
this.executeSeek(newCurrentSourceTimeMs);
|
|
214
|
+
}
|
|
215
|
+
|
|
223
216
|
if (changedProperties.has("ownCurrentTimeMs")) {
|
|
224
217
|
this.executeSeek(this.currentSourceTimeMs);
|
|
225
218
|
}
|
|
@@ -249,6 +242,8 @@ export class EFMedia extends EFTargetable(
|
|
|
249
242
|
}
|
|
250
243
|
|
|
251
244
|
protected async executeSeek(seekToMs: number) {
|
|
245
|
+
// The seekToMs parameter should be the timeline-relative media time
|
|
246
|
+
// calculated from currentSourceTimeMs which includes timeline positioning
|
|
252
247
|
this.desiredSeekTimeMs = seekToMs;
|
|
253
248
|
}
|
|
254
249
|
|
|
@@ -261,22 +256,7 @@ export class EFMedia extends EFTargetable(
|
|
|
261
256
|
toMs: number,
|
|
262
257
|
signal: AbortSignal = new AbortController().signal,
|
|
263
258
|
): Promise<AudioSpan> {
|
|
264
|
-
|
|
265
|
-
await this.mediaSourceService.initialize();
|
|
266
|
-
|
|
267
|
-
// Use the clean, testable utility function
|
|
268
|
-
const { fetchAudioSpanningTime: fetchAudioSpan } = await import(
|
|
269
|
-
"./EFMedia/shared/AudioSpanUtils.ts"
|
|
270
|
-
);
|
|
271
|
-
|
|
272
|
-
return fetchAudioSpan(this, fromMs, toMs, signal);
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
/**
|
|
276
|
-
* Get the HTML audio element for ContextMixin integration
|
|
277
|
-
*/
|
|
278
|
-
get audioElement(): HTMLAudioElement | null {
|
|
279
|
-
return this.mediaSourceService.getAudioElement();
|
|
259
|
+
return fetchAudioSpanningTime(this, fromMs, toMs, signal);
|
|
280
260
|
}
|
|
281
261
|
|
|
282
262
|
/**
|
|
@@ -300,27 +280,4 @@ export class EFMedia extends EFTargetable(
|
|
|
300
280
|
segmentIds.filter((id) => bufferState.cachedSegments.has(id)),
|
|
301
281
|
);
|
|
302
282
|
}
|
|
303
|
-
|
|
304
|
-
/**
|
|
305
|
-
* Get MediaElementAudioSourceNode for ContextMixin integration
|
|
306
|
-
* Uses AudioElementFactory for proper caching and lifecycle management
|
|
307
|
-
*/
|
|
308
|
-
async getMediaElementSource(
|
|
309
|
-
audioContext: AudioContext,
|
|
310
|
-
): Promise<MediaElementAudioSourceNode> {
|
|
311
|
-
return this.audioElementFactory.createMediaElementSource(
|
|
312
|
-
audioContext,
|
|
313
|
-
this.mediaSourceService,
|
|
314
|
-
);
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
disconnectedCallback(): void {
|
|
318
|
-
super.disconnectedCallback?.();
|
|
319
|
-
|
|
320
|
-
// Clean up MediaSource service
|
|
321
|
-
this.mediaSourceService.cleanup();
|
|
322
|
-
|
|
323
|
-
// Clear audio element factory cache
|
|
324
|
-
this.audioElementFactory.clearCache();
|
|
325
|
-
}
|
|
326
283
|
}
|
|
@@ -503,32 +503,27 @@ export class EFTimegroup extends EFTemporal(LitElement) {
|
|
|
503
503
|
* Usage: timegroup.testPlayAudio(0, 5000) // Play first 5 seconds
|
|
504
504
|
*/
|
|
505
505
|
async testPlayAudio(fromMs: number, toMs: number) {
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
});
|
|
528
|
-
} catch (error) {
|
|
529
|
-
console.error("🎵 [TEST_PLAY_AUDIO] Error:", error);
|
|
530
|
-
throw error;
|
|
531
|
-
}
|
|
506
|
+
// Render the audio using the existing renderAudio method
|
|
507
|
+
const renderedBuffer = await this.renderAudio(fromMs, toMs);
|
|
508
|
+
|
|
509
|
+
// Create a regular AudioContext for playback
|
|
510
|
+
const playbackContext = new AudioContext();
|
|
511
|
+
|
|
512
|
+
// Create a buffer source and connect it
|
|
513
|
+
const bufferSource = playbackContext.createBufferSource();
|
|
514
|
+
bufferSource.buffer = renderedBuffer;
|
|
515
|
+
bufferSource.connect(playbackContext.destination);
|
|
516
|
+
|
|
517
|
+
// Start playback immediately
|
|
518
|
+
bufferSource.start(0);
|
|
519
|
+
|
|
520
|
+
// Return a promise that resolves when playback ends
|
|
521
|
+
return new Promise<void>((resolve) => {
|
|
522
|
+
bufferSource.onended = () => {
|
|
523
|
+
playbackContext.close();
|
|
524
|
+
resolve();
|
|
525
|
+
};
|
|
526
|
+
});
|
|
532
527
|
}
|
|
533
528
|
|
|
534
529
|
async loadMd5Sums() {
|