@editframe/elements 0.15.0-beta.9 → 0.16.0-beta.1

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 (52) hide show
  1. package/dist/EF_FRAMEGEN.d.ts +14 -10
  2. package/dist/EF_FRAMEGEN.js +17 -28
  3. package/dist/elements/EFCaptions.js +0 -7
  4. package/dist/elements/EFImage.js +0 -4
  5. package/dist/elements/EFMedia.d.ts +13 -8
  6. package/dist/elements/EFMedia.js +163 -146
  7. package/dist/elements/EFSourceMixin.js +2 -1
  8. package/dist/elements/EFTemporal.browsertest.d.ts +4 -3
  9. package/dist/elements/EFTemporal.d.ts +14 -11
  10. package/dist/elements/EFTemporal.js +63 -87
  11. package/dist/elements/EFTimegroup.d.ts +2 -4
  12. package/dist/elements/EFTimegroup.js +15 -103
  13. package/dist/elements/EFVideo.js +3 -1
  14. package/dist/elements/EFWaveform.d.ts +1 -1
  15. package/dist/elements/EFWaveform.js +11 -28
  16. package/dist/elements/durationConverter.d.ts +8 -8
  17. package/dist/elements/durationConverter.js +2 -2
  18. package/dist/elements/updateAnimations.d.ts +9 -0
  19. package/dist/elements/updateAnimations.js +62 -0
  20. package/dist/getRenderInfo.d.ts +51 -0
  21. package/dist/getRenderInfo.js +72 -0
  22. package/dist/gui/EFFilmstrip.js +7 -16
  23. package/dist/gui/EFFitScale.d.ts +27 -0
  24. package/dist/gui/EFFitScale.js +138 -0
  25. package/dist/gui/EFWorkbench.d.ts +2 -5
  26. package/dist/gui/EFWorkbench.js +11 -56
  27. package/dist/gui/TWMixin.css.js +1 -1
  28. package/dist/gui/TWMixin.js +14 -2
  29. package/dist/index.d.ts +2 -0
  30. package/dist/index.js +6 -1
  31. package/dist/style.css +3 -3
  32. package/package.json +4 -3
  33. package/src/elements/EFCaptions.browsertest.ts +2 -2
  34. package/src/elements/EFCaptions.ts +0 -7
  35. package/src/elements/EFImage.browsertest.ts +2 -2
  36. package/src/elements/EFImage.ts +0 -4
  37. package/src/elements/EFMedia.browsertest.ts +14 -14
  38. package/src/elements/EFMedia.ts +219 -182
  39. package/src/elements/EFSourceMixin.ts +4 -4
  40. package/src/elements/EFTemporal.browsertest.ts +64 -31
  41. package/src/elements/EFTemporal.ts +99 -119
  42. package/src/elements/EFTimegroup.ts +15 -133
  43. package/src/elements/EFVideo.ts +3 -1
  44. package/src/elements/EFWaveform.ts +10 -44
  45. package/src/elements/durationConverter.ts +9 -4
  46. package/src/elements/updateAnimations.ts +88 -0
  47. package/src/gui/ContextMixin.ts +0 -3
  48. package/src/gui/EFFilmstrip.ts +7 -16
  49. package/src/gui/EFFitScale.ts +152 -0
  50. package/src/gui/EFWorkbench.ts +16 -65
  51. package/src/gui/TWMixin.ts +19 -2
  52. package/types.json +1 -1
@@ -1,15 +1,19 @@
1
1
  import { VideoRenderOptions } from '../../assets/src/index.ts';
2
+ interface Bridge {
3
+ onInitialize: (callback: (renderOptions: VideoRenderOptions) => void) => void;
4
+ initialized(): void;
5
+ onBeginFrame(callback: (frameNumber: number, isLast: boolean) => void): void;
6
+ onTriggerCanvas(callback: () => void): void;
7
+ frameReady(frameNumber: number, audioSamples: ArrayBuffer): void;
8
+ error(error: Error): void;
9
+ }
2
10
  declare global {
3
11
  interface Window {
4
- EF_FRAMEGEN?: EfFramegen;
5
- FRAMEGEN_BRIDGE?: {
6
- onInitialize: (callback: (renderOptions: VideoRenderOptions) => void) => void;
7
- initialized(): void;
8
- onBeginFrame(callback: (frameNumber: number, isLast: boolean) => void): void;
9
- onTriggerCanvas(callback: () => void): void;
10
- frameReady(frameNumber: number, audioSamples: ArrayBuffer): void;
11
- error(error: Error): void;
12
- };
12
+ EF_FRAMEGEN?: EFFramegen;
13
+ FRAMEGEN_BRIDGE?: Bridge;
14
+ FRAMEGEN_BINDING?: any;
15
+ FRAMEGEN_BINDING_error?: (error: Error) => void;
16
+ EF_RENDERING?: () => boolean;
13
17
  }
14
18
  }
15
19
  declare class TriggerCanvas {
@@ -18,7 +22,7 @@ declare class TriggerCanvas {
18
22
  constructor();
19
23
  trigger(): void;
20
24
  }
21
- export declare class EfFramegen {
25
+ export declare class EFFramegen {
22
26
  time: number;
23
27
  frameDurationMs: number;
24
28
  initialBusyTasks: Promise<unknown[]>;
@@ -14,18 +14,19 @@ class TriggerCanvas {
14
14
  height: "1px",
15
15
  zIndex: "100000"
16
16
  });
17
- document.body.prepend(this.canvas);
17
+ document.body.appendChild(this.canvas);
18
18
  const ctx = this.canvas.getContext("2d", { willReadFrequently: true });
19
19
  if (!ctx) throw new Error("Canvas 2d context not ready");
20
20
  this.ctx = ctx;
21
- this.ctx.fillStyle = "black";
21
+ this.ctx.fillStyle = "transparent";
22
22
  }
23
23
  trigger() {
24
24
  console.log("TRIGGERING CANVAS");
25
25
  this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
26
+ this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);
26
27
  }
27
28
  }
28
- class EfFramegen {
29
+ class EFFramegen {
29
30
  constructor() {
30
31
  this.time = 0;
31
32
  this.frameDurationMs = 0;
@@ -34,7 +35,7 @@ class EfFramegen {
34
35
  this.triggerCanvas = new TriggerCanvas();
35
36
  this.BRIDGE = window.FRAMEGEN_BRIDGE;
36
37
  if (this.BRIDGE) {
37
- console.log("BRIDGE.constructor (connecting to bridge)");
38
+ console.log("trace: BRIDGE.constructor (connecting to bridge)");
38
39
  this.connectToBridge();
39
40
  }
40
41
  }
@@ -46,30 +47,18 @@ class EfFramegen {
46
47
  if (!BRIDGE) {
47
48
  throw new Error("No BRIDGE when attempting to connect to bridge");
48
49
  }
49
- console.log("BRIDGE.connectToBridge");
50
+ console.log("trace: BRIDGE.connectToBridge");
50
51
  BRIDGE.onInitialize(async (renderOptions) => {
51
- console.log("BRIDGE.onInitialize", renderOptions);
52
+ console.log("trace: BRIDGE.onInitialize", renderOptions);
52
53
  await this.initialize(renderOptions);
53
54
  BRIDGE.initialized();
54
55
  });
55
56
  BRIDGE.onBeginFrame((frameNumber, isLast) => {
56
- console.log("BRIDGE.onBeginFrame", frameNumber, isLast);
57
+ console.log("trace: BRIDGE.onBeginFrame", frameNumber, isLast);
57
58
  this.beginFrame(frameNumber, isLast);
58
59
  });
59
60
  }
60
61
  async initialize(renderOptions) {
61
- addEventListener("unhandledrejection", (event) => {
62
- this.trace("Unhandled rejection:", event.reason);
63
- if (this.BRIDGE) {
64
- this.BRIDGE.error(event.reason);
65
- }
66
- });
67
- addEventListener("error", (event) => {
68
- this.trace("Uncaught error", event.error);
69
- if (this.BRIDGE) {
70
- this.BRIDGE.error(event.error);
71
- }
72
- });
73
62
  this.renderOptions = renderOptions;
74
63
  const workbench = document.querySelector("ef-workbench");
75
64
  if (!workbench) {
@@ -105,7 +94,7 @@ class EfFramegen {
105
94
  renderOptions.encoderOptions.alignedFromUs / 1e3,
106
95
  renderOptions.encoderOptions.alignedToUs / 1e3
107
96
  );
108
- console.log("Initialized");
97
+ console.log("trace: Initialized");
109
98
  }
110
99
  async beginFrame(frameNumber, isLast) {
111
100
  if (this.renderOptions === void 0) {
@@ -130,20 +119,22 @@ class EfFramegen {
130
119
  }
131
120
  this.time = this.renderOptions.encoderOptions.fromMs + frameNumber * this.frameDurationMs;
132
121
  firstGroup.currentTimeMs = this.time;
133
- console.log("Awaiting initialBusyTasks");
122
+ console.log("trace: Awaiting initialBusyTasks");
134
123
  await this.initialBusyTasks;
135
- console.log("Awaiting microtask");
124
+ console.log("trace: Awaiting microtask");
136
125
  await new Promise(queueMicrotask);
137
- console.log("Awaiting frame tasks");
126
+ console.log("trace: Awaiting frame tasks");
138
127
  const now = performance.now();
128
+ console.log("trace: HTML", document.body.innerHTML);
139
129
  await Promise.all(
140
130
  temporals.filter((temporal) => temporal.frameTask.status < TaskStatus.COMPLETE).map((temporal) => {
141
131
  return temporal.frameTask;
142
132
  }).map((task) => task.taskComplete)
143
133
  );
144
134
  console.log(
145
- `frame:${frameNumber} All tasks complete ${performance.now() - now}ms`
135
+ `trace: frame:${frameNumber} All tasks complete ${performance.now() - now}ms`
146
136
  );
137
+ this.triggerCanvas.trigger();
147
138
  if (isLast && this.audioBufferPromise) {
148
139
  const renderedAudio = await this.audioBufferPromise;
149
140
  const channelCount = renderedAudio.numberOfChannels;
@@ -159,7 +150,6 @@ class EfFramegen {
159
150
  }
160
151
  }
161
152
  if (this.BRIDGE) {
162
- this.triggerCanvas.trigger();
163
153
  this.BRIDGE.frameReady(frameNumber, interleavedSamples.buffer);
164
154
  } else {
165
155
  const fileReader = new FileReader();
@@ -172,7 +162,6 @@ class EfFramegen {
172
162
  }
173
163
  } else {
174
164
  if (this.BRIDGE) {
175
- this.triggerCanvas.trigger();
176
165
  this.BRIDGE.frameReady(frameNumber, new ArrayBuffer(0));
177
166
  } else {
178
167
  const fileReader = new FileReader();
@@ -187,8 +176,8 @@ class EfFramegen {
187
176
  }
188
177
  }
189
178
  if (typeof window !== "undefined") {
190
- window.EF_FRAMEGEN = new EfFramegen();
179
+ window.EF_FRAMEGEN = new EFFramegen();
191
180
  }
192
181
  export {
193
- EfFramegen
182
+ EFFramegen
194
183
  };
@@ -2,7 +2,6 @@ import { Task } from "@lit/task";
2
2
  import { html, css, LitElement } from "lit";
3
3
  import { property, customElement } from "lit/decorators.js";
4
4
  import { EF_INTERACTIVE } from "../EF_INTERACTIVE.js";
5
- import { EF_RENDERING } from "../EF_RENDERING.js";
6
5
  import { CrossUpdateController } from "./CrossUpdateController.js";
7
6
  import { EFAudio } from "./EFAudio.js";
8
7
  import { EFSourceMixin } from "./EFSourceMixin.js";
@@ -301,18 +300,12 @@ let EFCaptions = class extends EFSourceMixin(
301
300
  }
302
301
  transcriptionsPath() {
303
302
  if (this.targetElement.assetId) {
304
- if (EF_RENDERING()) {
305
- return `editframe://api/v1/isobmff_files/${this.targetElement.assetId}/transcription`;
306
- }
307
303
  return `${this.apiHost}/api/v1/isobmff_files/${this.targetElement.assetId}/transcription`;
308
304
  }
309
305
  return null;
310
306
  }
311
307
  captionsPath() {
312
308
  if (this.targetElement.assetId) {
313
- if (EF_RENDERING()) {
314
- return `editframe://api/v1/caption_files/${this.targetElement.assetId}`;
315
- }
316
309
  return `${this.apiHost}/api/v1/caption_files/${this.targetElement.assetId}`;
317
310
  }
318
311
  const targetSrc = this.targetElement.src;
@@ -3,7 +3,6 @@ import { html, css, LitElement } from "lit";
3
3
  import { property, customElement } from "lit/decorators.js";
4
4
  import { createRef, ref } from "lit/directives/ref.js";
5
5
  import { EF_INTERACTIVE } from "../EF_INTERACTIVE.js";
6
- import { EF_RENDERING } from "../EF_RENDERING.js";
7
6
  import { EFSourceMixin } from "./EFSourceMixin.js";
8
7
  import { EFTemporal } from "./EFTemporal.js";
9
8
  import { FetchMixin } from "./FetchMixin.js";
@@ -72,9 +71,6 @@ let EFImage = class extends EFTemporal(
72
71
  }
73
72
  assetPath() {
74
73
  if (this.assetId) {
75
- if (EF_RENDERING()) {
76
- return `editframe://api/v1/image_files/${this.assetId}`;
77
- }
78
74
  return `${this.apiHost}/api/v1/image_files/${this.assetId}`;
79
75
  }
80
76
  return `/@ef-image/${this.src}`;
@@ -19,7 +19,7 @@ export declare class EFMedia extends EFMedia_base {
19
19
  get assetId(): string | null;
20
20
  fragmentIndexPath(): string;
21
21
  fragmentTrackPath(trackId: string): string;
22
- trackFragmentIndexLoader: Task<readonly [string, typeof fetch], Record<number, TrackFragmentIndex>>;
22
+ trackFragmentIndexLoader: Task<readonly [string, typeof fetch], Record<number, TrackFragmentIndex> | undefined>;
23
23
  initSegmentsLoader: Task<readonly [Record<number, TrackFragmentIndex> | undefined, string, typeof fetch], {
24
24
  trackId: string;
25
25
  buffer: MP4Box.MP4ArrayBuffer;
@@ -50,7 +50,7 @@ export declare class EFMedia extends EFMedia_base {
50
50
  protected executeSeek(seekToMs: number): Promise<void>;
51
51
  protected updated(changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void;
52
52
  get hasOwnDuration(): boolean;
53
- get durationMs(): number;
53
+ get intrinsicDurationMs(): number;
54
54
  audioBufferTask: Task<readonly [Record<string, File> | undefined, Record<string, {
55
55
  segment: TrackSegment;
56
56
  track: MP4Box.TrackInfo;
@@ -64,13 +64,18 @@ export declare class EFMedia extends EFMedia_base {
64
64
  startMs: number;
65
65
  endMs: number;
66
66
  } | undefined>;
67
- fftSize: number;
68
- fftDecay: number;
69
- private static readonly MIN_DB;
70
- private static readonly MAX_DB;
67
+ set fftSize(value: number);
68
+ set fftDecay(value: number);
69
+ get fftSize(): number;
70
+ get fftDecay(): number;
71
+ set interpolateFrequencies(value: boolean);
72
+ get interpolateFrequencies(): boolean;
73
+ get shouldInterpolateFrequencies(): boolean;
71
74
  private static readonly DECAY_WEIGHT;
72
75
  get FREQ_WEIGHTS(): Float32Array;
73
- byteTimeDomainTask: Task<readonly [import('@lit/task').TaskStatus, number, number, number], Uint8Array | null>;
74
- frequencyDataTask: Task<readonly [import('@lit/task').TaskStatus, number, number, number], Uint8Array | null>;
76
+ byteTimeDomainTask: Task<readonly [import('@lit/task').TaskStatus, number, number, number, number, boolean], Uint8Array | null>;
77
+ frequencyDataTask: Task<readonly [import('@lit/task').TaskStatus, number, number, number, number, boolean], Uint8Array | null>;
78
+ set fftGain(value: number);
79
+ get fftGain(): number;
75
80
  }
76
81
  export {};