@omnimedia/omnitool 1.0.0 → 1.1.0-3

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 (177) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +120 -2
  3. package/package.json +56 -27
  4. package/s/_archive/types.ts +107 -0
  5. package/s/context.ts +7 -0
  6. package/s/demo/demo.bundle.ts +64 -0
  7. package/s/demo/demo.css +54 -0
  8. package/s/demo/routines/filmstrip-test.ts +68 -0
  9. package/s/demo/routines/load-video.ts +7 -0
  10. package/s/demo/routines/transcode-test.ts +44 -0
  11. package/s/demo/routines/waveform-test.ts +12 -0
  12. package/s/driver/driver.test.ts +15 -0
  13. package/s/driver/driver.ts +116 -0
  14. package/s/driver/driver.worker.bundle.ts +7 -0
  15. package/s/driver/fns/host.ts +12 -0
  16. package/s/driver/fns/schematic.ts +83 -0
  17. package/s/driver/fns/work.ts +237 -0
  18. package/s/driver/parts/constants.ts +17 -0
  19. package/s/driver/parts/machina.ts +27 -0
  20. package/s/driver/utils/load-decoder-source.ts +13 -0
  21. package/s/driver/utils/sleep.ts +3 -0
  22. package/s/index.html.ts +53 -0
  23. package/s/index.ts +2 -39
  24. package/s/tests.test.ts +8 -0
  25. package/s/timeline/index.ts +14 -0
  26. package/s/timeline/parts/basics.ts +17 -0
  27. package/s/timeline/parts/filmstrip.ts +159 -0
  28. package/s/timeline/parts/item.ts +58 -0
  29. package/s/timeline/parts/media.ts +14 -0
  30. package/s/timeline/parts/resource-pool.ts +27 -0
  31. package/s/timeline/parts/resource.ts +11 -0
  32. package/s/timeline/parts/waveform.ts +62 -0
  33. package/s/timeline/sugar/o.ts +60 -0
  34. package/s/timeline/sugar/omni-test.ts +38 -0
  35. package/s/timeline/sugar/omni.ts +30 -0
  36. package/s/timeline/utils/checksum.ts +19 -0
  37. package/s/timeline/utils/datafile.ts +21 -0
  38. package/s/timeline/utils/dummy-data.ts +7 -0
  39. package/x/context.d.ts +4 -0
  40. package/x/context.js +6 -0
  41. package/x/context.js.map +1 -0
  42. package/x/demo/demo.bundle.d.ts +1 -0
  43. package/x/demo/demo.bundle.js +51 -0
  44. package/x/demo/demo.bundle.js.map +1 -0
  45. package/x/demo/demo.bundle.min.js +118 -0
  46. package/x/demo/demo.bundle.min.js.map +7 -0
  47. package/x/demo/demo.css +54 -0
  48. package/x/demo/routines/filmstrip-test.d.ts +1 -0
  49. package/x/demo/routines/filmstrip-test.js +62 -0
  50. package/x/demo/routines/filmstrip-test.js.map +1 -0
  51. package/x/demo/routines/load-video.d.ts +1 -0
  52. package/x/demo/routines/load-video.js +6 -0
  53. package/x/demo/routines/load-video.js.map +1 -0
  54. package/x/demo/routines/transcode-test.d.ts +6 -0
  55. package/x/demo/routines/transcode-test.js +38 -0
  56. package/x/demo/routines/transcode-test.js.map +1 -0
  57. package/x/demo/routines/waveform-test.d.ts +1 -0
  58. package/x/demo/routines/waveform-test.js +11 -0
  59. package/x/demo/routines/waveform-test.js.map +1 -0
  60. package/x/driver/driver.d.ts +22 -0
  61. package/x/driver/driver.js +97 -0
  62. package/x/driver/driver.js.map +1 -0
  63. package/x/driver/driver.test.d.ts +5 -0
  64. package/x/driver/driver.test.js +12 -0
  65. package/x/driver/driver.test.js.map +1 -0
  66. package/x/driver/driver.worker.bundle.d.ts +1 -0
  67. package/x/driver/driver.worker.bundle.js +4 -0
  68. package/x/driver/driver.worker.bundle.js.map +1 -0
  69. package/x/driver/driver.worker.bundle.min.js +1148 -0
  70. package/x/driver/driver.worker.bundle.min.js.map +7 -0
  71. package/x/driver/fns/host.d.ts +18 -0
  72. package/x/driver/fns/host.js +7 -0
  73. package/x/driver/fns/host.js.map +1 -0
  74. package/x/driver/fns/schematic.d.ts +66 -0
  75. package/x/driver/fns/schematic.js +2 -0
  76. package/x/driver/fns/schematic.js.map +1 -0
  77. package/x/driver/fns/work.d.ts +19 -0
  78. package/x/driver/fns/work.js +192 -0
  79. package/x/driver/fns/work.js.map +1 -0
  80. package/x/driver/parts/constants.d.ts +2 -0
  81. package/x/driver/parts/constants.js +17 -0
  82. package/x/driver/parts/constants.js.map +1 -0
  83. package/x/driver/parts/machina.d.ts +23 -0
  84. package/x/driver/parts/machina.js +14 -0
  85. package/x/driver/parts/machina.js.map +1 -0
  86. package/x/driver/utils/load-decoder-source.d.ts +2 -0
  87. package/x/driver/utils/load-decoder-source.js +12 -0
  88. package/x/driver/utils/load-decoder-source.js.map +1 -0
  89. package/x/driver/utils/sleep.d.ts +1 -0
  90. package/x/driver/utils/sleep.js +4 -0
  91. package/x/driver/utils/sleep.js.map +1 -0
  92. package/x/index.d.ts +2 -9
  93. package/x/index.html +105 -0
  94. package/x/index.html.d.ts +2 -0
  95. package/x/index.html.js +47 -0
  96. package/x/index.html.js.map +1 -0
  97. package/x/index.js +2 -29
  98. package/x/index.js.map +1 -1
  99. package/x/tests.test.d.ts +1 -0
  100. package/x/tests.test.js +6 -0
  101. package/x/tests.test.js.map +1 -0
  102. package/x/timeline/index.d.ts +10 -0
  103. package/x/timeline/index.js +11 -0
  104. package/x/timeline/index.js.map +1 -0
  105. package/x/timeline/parts/basics.d.ts +12 -0
  106. package/x/timeline/parts/basics.js +2 -0
  107. package/x/timeline/parts/basics.js.map +1 -0
  108. package/x/timeline/parts/filmstrip.d.ts +39 -0
  109. package/x/timeline/parts/filmstrip.js +117 -0
  110. package/x/timeline/parts/filmstrip.js.map +1 -0
  111. package/x/timeline/parts/item.d.ts +42 -0
  112. package/x/timeline/parts/item.js +13 -0
  113. package/x/timeline/parts/item.js.map +1 -0
  114. package/x/timeline/parts/media.d.ts +7 -0
  115. package/x/timeline/parts/media.js +13 -0
  116. package/x/timeline/parts/media.js.map +1 -0
  117. package/x/timeline/parts/resource-pool.d.ts +7 -0
  118. package/x/timeline/parts/resource-pool.js +19 -0
  119. package/x/timeline/parts/resource-pool.js.map +1 -0
  120. package/x/timeline/parts/resource.d.ts +8 -0
  121. package/x/timeline/parts/resource.js +2 -0
  122. package/x/timeline/parts/resource.js.map +1 -0
  123. package/x/timeline/parts/waveform.d.ts +8 -0
  124. package/x/timeline/parts/waveform.js +51 -0
  125. package/x/timeline/parts/waveform.js.map +1 -0
  126. package/x/timeline/sugar/o.d.ts +14 -0
  127. package/x/timeline/sugar/o.js +48 -0
  128. package/x/timeline/sugar/o.js.map +1 -0
  129. package/x/timeline/sugar/omni-test.d.ts +1 -0
  130. package/x/timeline/sugar/omni-test.js +22 -0
  131. package/x/timeline/sugar/omni-test.js.map +1 -0
  132. package/x/timeline/sugar/omni.d.ts +11 -0
  133. package/x/timeline/sugar/omni.js +20 -0
  134. package/x/timeline/sugar/omni.js.map +1 -0
  135. package/x/timeline/utils/checksum.d.ts +8 -0
  136. package/x/timeline/utils/checksum.js +20 -0
  137. package/x/timeline/utils/checksum.js.map +1 -0
  138. package/x/timeline/utils/datafile.d.ts +9 -0
  139. package/x/timeline/utils/datafile.js +20 -0
  140. package/x/timeline/utils/datafile.js.map +1 -0
  141. package/x/timeline/utils/dummy-data.d.ts +2 -0
  142. package/x/timeline/utils/dummy-data.js +3 -0
  143. package/x/timeline/utils/dummy-data.js.map +1 -0
  144. package/s/parts/compositor.ts +0 -5
  145. package/s/parts/export.ts +0 -5
  146. package/s/parts/video-decoder.ts +0 -27
  147. package/s/parts/video-encoder.ts +0 -15
  148. package/s/tools/generate-id.ts +0 -7
  149. package/s/tools/mp4boxjs/LICENSE.md +0 -24
  150. package/s/tools/mp4boxjs/demuxer.ts +0 -106
  151. package/s/tools/mp4boxjs/mp4box.adapter.ts +0 -148
  152. package/s/tools/mp4boxjs/mp4box.js +0 -8206
  153. package/s/types.ts +0 -10
  154. package/x/parts/compositor.d.ts +0 -4
  155. package/x/parts/compositor.js +0 -5
  156. package/x/parts/compositor.js.map +0 -1
  157. package/x/parts/export.d.ts +0 -7
  158. package/x/parts/export.js +0 -5
  159. package/x/parts/export.js.map +0 -1
  160. package/x/parts/video-decoder.d.ts +0 -8
  161. package/x/parts/video-decoder.js +0 -20
  162. package/x/parts/video-decoder.js.map +0 -1
  163. package/x/parts/video-encoder.d.ts +0 -6
  164. package/x/parts/video-encoder.js +0 -12
  165. package/x/parts/video-encoder.js.map +0 -1
  166. package/x/tools/generate-id.d.ts +0 -1
  167. package/x/tools/generate-id.js +0 -8
  168. package/x/tools/generate-id.js.map +0 -1
  169. package/x/tools/mp4boxjs/demuxer.d.ts +0 -24
  170. package/x/tools/mp4boxjs/demuxer.js +0 -88
  171. package/x/tools/mp4boxjs/demuxer.js.map +0 -1
  172. package/x/tools/mp4boxjs/mp4box.adapter.d.ts +0 -128
  173. package/x/tools/mp4boxjs/mp4box.adapter.js +0 -11
  174. package/x/tools/mp4boxjs/mp4box.adapter.js.map +0 -1
  175. package/x/types.d.ts +0 -7
  176. package/x/types.js +0 -2
  177. package/x/types.js.map +0 -1
@@ -0,0 +1,54 @@
1
+
2
+ @layer vars, basics, page;
3
+
4
+ @layer vars {
5
+ :root {
6
+ --link: cyan;
7
+ --color: #fffa;
8
+ --background: #111;
9
+ }
10
+ }
11
+
12
+ @layer basics {
13
+ * {
14
+ margin: 0;
15
+ padding: 0;
16
+ box-sizing: border-box;
17
+ }
18
+ }
19
+
20
+ @layer page {
21
+ html {
22
+ font-size: 10px;
23
+ color: var(--color);
24
+ background: var(--background);
25
+ }
26
+
27
+ body {
28
+ padding: 2em;
29
+ }
30
+
31
+ .results {
32
+ margin-top: 1em;
33
+
34
+ display: flex;
35
+ flex-direction: column;
36
+ gap: 1em;
37
+
38
+ > div {
39
+ font-size: 1.5em;
40
+ border: 1px solid color-mix(in lch, transparent, var(--color) 20%);
41
+ padding: 1em;
42
+ }
43
+
44
+ canvas {
45
+ width: 20em;
46
+ }
47
+ }
48
+
49
+ #filmstrip {
50
+ display: flex;
51
+ overflow-x: scroll;
52
+ }
53
+ }
54
+
@@ -0,0 +1 @@
1
+ export declare function filmstripTest(fileHandle: FileSystemFileHandle): Promise<void>;
@@ -0,0 +1,62 @@
1
+ import { Filmstrip } from "../../timeline/parts/filmstrip.js";
2
+ export async function filmstripTest(fileHandle) {
3
+ const rangeSlider = document.querySelector(".range");
4
+ const rangeView = document.querySelector(".range-view");
5
+ const rangeSizeSlider = document.querySelector(".range-size");
6
+ const frequencySlider = document.querySelector(".frequency");
7
+ const frequencyView = document.querySelector(".frequency-view");
8
+ const container = document.querySelector("#filmstrip");
9
+ const FPS_10 = 1000 / 10 / 1000;
10
+ let rangeSize = 0.5;
11
+ const filmstrip = await Filmstrip.init(fileHandle, {
12
+ onChange(tiles) {
13
+ // Sort by time (optional, for clean ordering)
14
+ const sorted = tiles.sort((a, b) => a.time - b.time);
15
+ // Clear previous thumbnails
16
+ container.replaceChildren(...sorted.map(({ time, canvas }) => createLabeledCanvas(time, canvas.canvas)));
17
+ },
18
+ frequency: FPS_10,
19
+ canvasSinkOptions: {
20
+ width: 80,
21
+ height: 50,
22
+ fit: "fill"
23
+ }
24
+ });
25
+ rangeSizeSlider.addEventListener("change", () => {
26
+ rangeSize = +rangeSizeSlider.value;
27
+ const [start, end] = [+rangeSlider.value, +rangeSlider.value + rangeSize];
28
+ filmstrip.range = [start, end];
29
+ rangeView.textContent = `visible time range: [${start}, ${end}]`;
30
+ });
31
+ rangeSlider.addEventListener("change", () => {
32
+ const [start, end] = [+rangeSlider.value, +rangeSlider.value + rangeSize];
33
+ filmstrip.range = [start, end];
34
+ rangeView.textContent = `visible time range: [${start}, ${end}]`;
35
+ });
36
+ frequencySlider.addEventListener("change", () => {
37
+ filmstrip.frequency = 1000 / +frequencySlider.value / 1000;
38
+ frequencyView.textContent = `frame every ${filmstrip.frequency.toFixed(3)} second (${frequencySlider.value} frames per second)`;
39
+ });
40
+ filmstrip.range = [10, 10.5];
41
+ }
42
+ function createLabeledCanvas(time, canvas) {
43
+ const wrapper = document.createElement('div');
44
+ wrapper.style.position = 'relative';
45
+ wrapper.style.display = 'inline-block';
46
+ wrapper.style.marginRight = '4px';
47
+ wrapper.appendChild(canvas);
48
+ const label = document.createElement('div');
49
+ label.textContent = `${time.toFixed(2)}s`;
50
+ label.style.position = 'absolute';
51
+ label.style.top = '2px';
52
+ label.style.right = '4px';
53
+ label.style.fontSize = '10px';
54
+ label.style.color = 'white';
55
+ label.style.background = 'rgba(0,0,0,0.6)';
56
+ label.style.padding = '2px 4px';
57
+ label.style.borderRadius = '4px';
58
+ label.style.pointerEvents = 'none';
59
+ wrapper.appendChild(label);
60
+ return wrapper;
61
+ }
62
+ //# sourceMappingURL=filmstrip-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filmstrip-test.js","sourceRoot":"","sources":["../../../s/demo/routines/filmstrip-test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function loadVideo(url: string): Promise<ArrayBuffer>;
@@ -0,0 +1,6 @@
1
+ export async function loadVideo(url) {
2
+ return fetch(url)
3
+ .then(response => response.bytes())
4
+ .then(bytes => bytes.buffer);
5
+ }
6
+ //# sourceMappingURL=load-video.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-video.js","sourceRoot":"","sources":["../../../s/demo/routines/load-video.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW;IAC1C,OAAO,KAAK,CAAC,GAAG,CAAC;SACf,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;SAClC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;AAC9B,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Driver } from "../../driver/driver.js";
2
+ import { DecoderSource } from "../../driver/fns/schematic.js";
3
+ export declare function setupTranscodeTest(driver: Driver, source: DecoderSource): {
4
+ canvas: HTMLCanvasElement;
5
+ run: () => Promise<void>;
6
+ };
@@ -0,0 +1,38 @@
1
+ export function setupTranscodeTest(driver, source) {
2
+ const dimensions = { width: 1920, height: 1080 };
3
+ const canvas = document.createElement("canvas");
4
+ canvas.width = dimensions.width;
5
+ canvas.height = dimensions.height;
6
+ const ctx = canvas.getContext("2d");
7
+ async function run() {
8
+ const readables = driver.decode({
9
+ source,
10
+ async onFrame(frame) {
11
+ const composed = await driver.composite([
12
+ {
13
+ kind: "image",
14
+ frame
15
+ },
16
+ {
17
+ kind: "text",
18
+ content: "omnitool",
19
+ fontSize: 50,
20
+ color: "green"
21
+ }
22
+ ]);
23
+ frame.close();
24
+ ctx?.drawImage(composed, 0, 0);
25
+ return composed;
26
+ }
27
+ });
28
+ await driver.encode({
29
+ readables,
30
+ config: {
31
+ audio: { codec: "opus", bitrate: 128000 },
32
+ video: { codec: "vp9", bitrate: 1000000 }
33
+ }
34
+ });
35
+ }
36
+ return { canvas, run };
37
+ }
38
+ //# sourceMappingURL=transcode-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcode-test.js","sourceRoot":"","sources":["../../../s/demo/routines/transcode-test.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,MAAqB;IACvE,MAAM,UAAU,GAAG,EAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAC,CAAA;IAE9C,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;IAC/C,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAA;IAC/B,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAA;IACjC,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IAEnC,KAAK,UAAU,GAAG;QACjB,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;YAC/B,MAAM;YACN,KAAK,CAAC,OAAO,CAAC,KAAK;gBAClB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC;oBACvC;wBACC,IAAI,EAAE,OAAO;wBACb,KAAK;qBACL;oBACD;wBACC,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,UAAU;wBACnB,QAAQ,EAAE,EAAE;wBACZ,KAAK,EAAE,OAAO;qBACd;iBACD,CAAC,CAAA;gBACF,KAAK,CAAC,KAAK,EAAE,CAAA;gBACb,GAAG,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;gBAC9B,OAAO,QAAQ,CAAA;YAChB,CAAC;SACD,CAAC,CAAA;QAEF,MAAM,MAAM,CAAC,MAAM,CAAC;YACnB,SAAS;YACT,MAAM,EAAE;gBACP,KAAK,EAAE,EAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAC;gBACvC,KAAK,EAAE,EAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAC;aACvC;SACD,CAAC,CAAA;IACH,CAAC;IAED,OAAO,EAAC,MAAM,EAAE,GAAG,EAAC,CAAA;AACrB,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function waveformTest(): Promise<void>;
@@ -0,0 +1,11 @@
1
+ import { Waveform } from "../../timeline/parts/waveform.js";
2
+ export async function waveformTest() {
3
+ const container = document.querySelector(".waveform-demo");
4
+ const widthSlider = document.querySelector(".width");
5
+ const waveform = await Waveform.init("/assets/temp/gl.mp4", container);
6
+ widthSlider.addEventListener("change", () => {
7
+ const width = +widthSlider.value;
8
+ waveform.width = width;
9
+ });
10
+ }
11
+ //# sourceMappingURL=waveform-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waveform-test.js","sourceRoot":"","sources":["../../../s/demo/routines/waveform-test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,kCAAkC,CAAA;AAEzD,MAAM,CAAC,KAAK,UAAU,YAAY;IACjC,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,gBAAgB,CAAgB,CAAA;IACzE,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAqB,CAAA;IACxE,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAA;IAEtE,WAAW,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE;QAC3C,MAAM,KAAK,GAAG,CAAC,WAAW,CAAC,KAAK,CAAA;QAChC,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAA;IACvB,CAAC,CAAC,CAAA;AACH,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { Thread } from "@e280/comrade";
2
+ import { Machina } from "./parts/machina.js";
3
+ import { DecoderInput, DriverSchematic, Composition, EncoderInput, DecoderSource } from "./fns/schematic.js";
4
+ export type DriverOptions = {
5
+ workerUrl: URL | string;
6
+ };
7
+ export declare class Driver {
8
+ #private;
9
+ machina: Machina;
10
+ thread: Thread<DriverSchematic>;
11
+ static setup(options: DriverOptions): Promise<Driver>;
12
+ constructor(machina: Machina, thread: Thread<DriverSchematic>);
13
+ hello(): Promise<void>;
14
+ getAudioDuration(source: DecoderSource): Promise<any>;
15
+ getVideoDuration(source: DecoderSource): Promise<any>;
16
+ decode(input: DecoderInput): {
17
+ audio: ReadableStream<AudioData>;
18
+ video: ReadableStream<VideoFrame>;
19
+ };
20
+ encode({ readables, config }: EncoderInput): Promise<void>;
21
+ composite(composition: Composition): Promise<VideoFrame>;
22
+ }
@@ -0,0 +1,97 @@
1
+ import { Comrade, tune } from "@e280/comrade";
2
+ import { ALL_FORMATS, Input } from "mediabunny";
3
+ import { Machina } from "./parts/machina.js";
4
+ import { setupDriverHost } from "./fns/host.js";
5
+ import { loadDecoderSource } from "./utils/load-decoder-source.js";
6
+ export class Driver {
7
+ machina;
8
+ thread;
9
+ static async setup(options) {
10
+ const machina = new Machina();
11
+ const thread = await Comrade.thread({
12
+ label: "OmnitoolDriver",
13
+ workerUrl: options.workerUrl,
14
+ setupHost: setupDriverHost(machina),
15
+ });
16
+ return new this(machina, thread);
17
+ }
18
+ constructor(machina, thread) {
19
+ this.machina = machina;
20
+ this.thread = thread;
21
+ }
22
+ async hello() {
23
+ return this.thread.work.hello();
24
+ }
25
+ async getAudioDuration(source) {
26
+ const input = new Input({
27
+ source: await loadDecoderSource(source),
28
+ formats: ALL_FORMATS
29
+ });
30
+ const audioTrack = await input.getPrimaryAudioTrack();
31
+ return await audioTrack?.computeDuration();
32
+ }
33
+ async getVideoDuration(source) {
34
+ const input = new Input({
35
+ source: await loadDecoderSource(source),
36
+ formats: ALL_FORMATS
37
+ });
38
+ const videoTrack = await input.getPrimaryVideoTrack();
39
+ return await videoTrack?.computeDuration();
40
+ }
41
+ decode(input) {
42
+ let lastFrame = null;
43
+ const videoTransform = new TransformStream({
44
+ async transform(chunk, controller) {
45
+ const frame = await input.onFrame?.(chunk) ?? chunk;
46
+ // below code is to prevent mem leaks and hardware accelerated decoder stall
47
+ lastFrame?.close();
48
+ controller.enqueue(frame);
49
+ lastFrame = frame;
50
+ }
51
+ });
52
+ const audioTransform = new TransformStream();
53
+ this.thread.work.decode[tune]({ transfer: [videoTransform.writable, audioTransform.writable] })({
54
+ source: input.source,
55
+ video: videoTransform.writable,
56
+ audio: audioTransform.writable,
57
+ });
58
+ return {
59
+ audio: audioTransform.readable,
60
+ video: videoTransform.readable
61
+ };
62
+ }
63
+ async encode({ readables, config }) {
64
+ const handle = await window.showSaveFilePicker();
65
+ const writable = await handle.createWritable();
66
+ // making bridge because file picker writable is not transferable
67
+ const bridge = new WritableStream({
68
+ async write(chunk) {
69
+ await writable.write(chunk);
70
+ },
71
+ async close() {
72
+ await writable.close();
73
+ }
74
+ });
75
+ return await this.thread.work.encode[tune]({ transfer: [readables.audio, readables.video, bridge] })({ readables, config, bridge });
76
+ }
77
+ async composite(composition) {
78
+ const transfer = this.#collectTransferablesFromComposition(composition);
79
+ return await this.thread.work.composite[tune]({ transfer })(composition);
80
+ }
81
+ #collectTransferablesFromComposition(composition) {
82
+ const transferables = [];
83
+ const visit = (node) => {
84
+ if (Array.isArray(node)) {
85
+ for (const child of node)
86
+ visit(child);
87
+ }
88
+ else if (node && typeof node === 'object' && 'kind' in node) {
89
+ if (node.kind === 'image' && node.frame instanceof VideoFrame)
90
+ transferables.push(node.frame);
91
+ }
92
+ };
93
+ visit(composition);
94
+ return transferables;
95
+ }
96
+ }
97
+ //# sourceMappingURL=driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver.js","sourceRoot":"","sources":["../../s/driver/driver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Science } from "@e280/science";
2
+ declare const _default: {
3
+ "driver hello world": Science.Test;
4
+ };
5
+ export default _default;
@@ -0,0 +1,12 @@
1
+ import { Driver } from "./driver.js";
2
+ import { Science, test, expect } from "@e280/science";
3
+ const workerUrl = new URL("./driver.worker.bundle.js", import.meta.url);
4
+ export default Science.suite({
5
+ "driver hello world": test(async () => {
6
+ const driver = await Driver.setup({ workerUrl });
7
+ expect(driver.machina.count).is(0);
8
+ await driver.thread.work.hello();
9
+ expect(driver.machina.count).is(1);
10
+ }),
11
+ });
12
+ //# sourceMappingURL=driver.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver.test.js","sourceRoot":"","sources":["../../s/driver/driver.test.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAA;AAClC,OAAO,EAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAC,MAAM,eAAe,CAAA;AAEnD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,2BAA2B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAEvE,eAAe,OAAO,CAAC,KAAK,CAAC;IAC5B,oBAAoB,EAAE,IAAI,CAAC,KAAK,IAAG,EAAE;QACpC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,EAAC,SAAS,EAAC,CAAC,CAAA;QAC9C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAClC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;QAChC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACnC,CAAC,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ import { Comrade } from "@e280/comrade";
2
+ import { setupDriverWork } from "./fns/work.js";
3
+ await Comrade.worker(setupDriverWork);
4
+ //# sourceMappingURL=driver.worker.bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver.worker.bundle.js","sourceRoot":"","sources":["../../s/driver/driver.worker.bundle.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAA;AACrC,OAAO,EAAC,eAAe,EAAC,MAAM,eAAe,CAAA;AAG7C,MAAM,OAAO,CAAC,MAAM,CAAkB,eAAe,CAAC,CAAA"}