@omnimedia/omnitool 1.1.0-4 → 1.1.0-40

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 (183) hide show
  1. package/package.json +8 -4
  2. package/s/context.ts +0 -7
  3. package/s/demo/demo.bundle.ts +35 -5
  4. package/s/demo/demo.css +5 -0
  5. package/s/demo/routines/transcode-test.ts +8 -4
  6. package/s/demo/routines/transitions-test.ts +43 -0
  7. package/s/demo/routines/waveform-test.ts +3 -2
  8. package/s/driver/driver.ts +19 -11
  9. package/s/driver/fns/schematic.ts +46 -23
  10. package/s/driver/fns/work.ts +114 -102
  11. package/s/features/transition/parts/fragment.ts +24 -0
  12. package/s/features/transition/parts/types.ts +94 -0
  13. package/s/features/transition/parts/uniforms.ts +29 -0
  14. package/s/features/transition/parts/vertex.ts +31 -0
  15. package/s/features/transition/transition.ts +60 -0
  16. package/s/index.html.ts +6 -1
  17. package/s/timeline/index.ts +1 -0
  18. package/s/timeline/parts/basics.ts +1 -1
  19. package/s/timeline/parts/compositor/export.ts +77 -0
  20. package/s/timeline/parts/compositor/parts/html-tree.ts +37 -0
  21. package/s/timeline/parts/compositor/parts/schedulers.ts +95 -0
  22. package/s/timeline/parts/compositor/parts/tree-builder.ts +196 -0
  23. package/s/timeline/parts/compositor/parts/webcodecs-tree.ts +30 -0
  24. package/s/timeline/parts/compositor/playback.ts +94 -0
  25. package/s/timeline/parts/compositor/samplers/html.ts +115 -0
  26. package/s/timeline/parts/compositor/samplers/webcodecs.ts +61 -0
  27. package/s/timeline/parts/filmstrip.ts +42 -15
  28. package/s/timeline/parts/item.ts +48 -6
  29. package/s/timeline/parts/media.ts +21 -0
  30. package/s/timeline/parts/waveform.ts +3 -4
  31. package/s/timeline/sugar/builders.ts +102 -0
  32. package/s/timeline/sugar/o.ts +163 -38
  33. package/s/timeline/sugar/omni-test.ts +5 -3
  34. package/s/timeline/sugar/omni.ts +26 -11
  35. package/s/timeline/types.ts +29 -0
  36. package/s/timeline/utils/audio-stream.ts +15 -0
  37. package/s/timeline/utils/matrix.ts +33 -0
  38. package/s/timeline/utils/video-cursor.ts +40 -0
  39. package/x/context.d.ts +1 -4
  40. package/x/context.js +1 -5
  41. package/x/context.js.map +1 -1
  42. package/x/demo/demo.bundle.js +23 -6
  43. package/x/demo/demo.bundle.js.map +1 -1
  44. package/x/demo/demo.bundle.min.js +606 -36
  45. package/x/demo/demo.bundle.min.js.map +4 -4
  46. package/x/demo/demo.css +5 -0
  47. package/x/demo/routines/transcode-test.js +8 -4
  48. package/x/demo/routines/transcode-test.js.map +1 -1
  49. package/x/demo/routines/transitions-test.d.ts +5 -0
  50. package/x/demo/routines/transitions-test.js +35 -0
  51. package/x/demo/routines/transitions-test.js.map +1 -0
  52. package/x/demo/routines/waveform-test.d.ts +2 -1
  53. package/x/demo/routines/waveform-test.js +2 -2
  54. package/x/demo/routines/waveform-test.js.map +1 -1
  55. package/x/driver/driver.d.ts +4 -6
  56. package/x/driver/driver.js +17 -10
  57. package/x/driver/driver.js.map +1 -1
  58. package/x/driver/driver.worker.bundle.min.js +2537 -148
  59. package/x/driver/driver.worker.bundle.min.js.map +4 -4
  60. package/x/driver/fns/host.d.ts +9 -2
  61. package/x/driver/fns/schematic.d.ts +40 -22
  62. package/x/driver/fns/work.d.ts +11 -4
  63. package/x/driver/fns/work.js +107 -101
  64. package/x/driver/fns/work.js.map +1 -1
  65. package/x/features/speech/transcribe/worker.bundle.min.js +542 -542
  66. package/x/features/speech/transcribe/worker.bundle.min.js.map +4 -4
  67. package/x/features/transition/parts/fragment.d.ts +1 -0
  68. package/x/features/transition/parts/fragment.js +25 -0
  69. package/x/features/transition/parts/fragment.js.map +1 -0
  70. package/x/features/transition/parts/types.d.ts +23 -0
  71. package/x/features/transition/parts/types.js.map +1 -0
  72. package/x/features/transition/parts/uniforms.d.ts +31 -0
  73. package/x/features/transition/parts/uniforms.js +27 -0
  74. package/x/features/transition/parts/uniforms.js.map +1 -0
  75. package/x/features/transition/parts/vertex.d.ts +1 -0
  76. package/x/features/transition/parts/vertex.js +32 -0
  77. package/x/features/transition/parts/vertex.js.map +1 -0
  78. package/x/features/transition/transition.d.ts +5 -0
  79. package/x/features/transition/transition.js +50 -0
  80. package/x/features/transition/transition.js.map +1 -0
  81. package/x/index.html +13 -3
  82. package/x/index.html.js +6 -1
  83. package/x/index.html.js.map +1 -1
  84. package/x/timeline/index.d.ts +1 -0
  85. package/x/timeline/index.js +1 -0
  86. package/x/timeline/index.js.map +1 -1
  87. package/x/timeline/parts/basics.d.ts +1 -1
  88. package/x/timeline/parts/compositor/export.d.ts +11 -0
  89. package/x/timeline/parts/compositor/export.js +64 -0
  90. package/x/timeline/parts/compositor/export.js.map +1 -0
  91. package/x/timeline/parts/compositor/parts/html-tree.d.ts +3 -0
  92. package/x/timeline/parts/compositor/parts/html-tree.js +40 -0
  93. package/x/timeline/parts/compositor/parts/html-tree.js.map +1 -0
  94. package/x/timeline/parts/compositor/parts/schedulers.d.ts +15 -0
  95. package/x/timeline/parts/compositor/parts/schedulers.js +70 -0
  96. package/x/timeline/parts/compositor/parts/schedulers.js.map +1 -0
  97. package/x/timeline/parts/compositor/parts/tree-builder.d.ts +37 -0
  98. package/x/timeline/parts/compositor/parts/tree-builder.js +160 -0
  99. package/x/timeline/parts/compositor/parts/tree-builder.js.map +1 -0
  100. package/x/timeline/parts/compositor/parts/webcodecs-tree.d.ts +3 -0
  101. package/x/timeline/parts/compositor/parts/webcodecs-tree.js +28 -0
  102. package/x/timeline/parts/compositor/parts/webcodecs-tree.js.map +1 -0
  103. package/x/timeline/parts/compositor/playback.d.ts +26 -0
  104. package/x/timeline/parts/compositor/playback.js +79 -0
  105. package/x/timeline/parts/compositor/playback.js.map +1 -0
  106. package/x/timeline/parts/compositor/samplers/html.d.ts +3 -0
  107. package/x/timeline/parts/compositor/samplers/html.js +106 -0
  108. package/x/timeline/parts/compositor/samplers/html.js.map +1 -0
  109. package/x/timeline/parts/compositor/samplers/webcodecs.d.ts +3 -0
  110. package/x/timeline/parts/compositor/samplers/webcodecs.js +52 -0
  111. package/x/timeline/parts/compositor/samplers/webcodecs.js.map +1 -0
  112. package/x/timeline/parts/filmstrip.d.ts +2 -1
  113. package/x/timeline/parts/filmstrip.js +29 -10
  114. package/x/timeline/parts/filmstrip.js.map +1 -1
  115. package/x/timeline/parts/item.d.ts +42 -8
  116. package/x/timeline/parts/item.js +7 -3
  117. package/x/timeline/parts/item.js.map +1 -1
  118. package/x/timeline/parts/media.d.ts +3 -0
  119. package/x/timeline/parts/media.js +17 -0
  120. package/x/timeline/parts/media.js.map +1 -1
  121. package/x/timeline/parts/waveform.d.ts +2 -1
  122. package/x/timeline/parts/waveform.js +2 -4
  123. package/x/timeline/parts/waveform.js.map +1 -1
  124. package/x/timeline/sugar/builders.js +104 -0
  125. package/x/timeline/sugar/builders.js.map +1 -0
  126. package/x/timeline/sugar/o.d.ts +27 -5
  127. package/x/timeline/sugar/o.js +137 -38
  128. package/x/timeline/sugar/o.js.map +1 -1
  129. package/x/timeline/sugar/omni-test.js +4 -2
  130. package/x/timeline/sugar/omni-test.js.map +1 -1
  131. package/x/timeline/sugar/omni.d.ts +8 -2
  132. package/x/timeline/sugar/omni.js +22 -9
  133. package/x/timeline/sugar/omni.js.map +1 -1
  134. package/x/timeline/types.d.ts +24 -0
  135. package/x/timeline/types.js +2 -0
  136. package/x/timeline/types.js.map +1 -0
  137. package/x/timeline/utils/audio-stream.d.ts +6 -0
  138. package/x/timeline/utils/audio-stream.js +17 -0
  139. package/x/timeline/utils/audio-stream.js.map +1 -0
  140. package/x/timeline/utils/matrix.d.ts +8 -0
  141. package/x/timeline/utils/matrix.js +26 -0
  142. package/x/timeline/utils/matrix.js.map +1 -0
  143. package/x/timeline/utils/video-cursor.d.ts +10 -0
  144. package/x/timeline/utils/video-cursor.js +36 -0
  145. package/x/timeline/utils/video-cursor.js.map +1 -0
  146. package/s/tools/common/loader.ts +0 -26
  147. package/s/tools/common/transformer-pipeline.ts +0 -26
  148. package/s/tools/speech-recognition/common/model.ts +0 -26
  149. package/s/tools/speech-recognition/whisper/fns/host.ts +0 -25
  150. package/s/tools/speech-recognition/whisper/fns/schematic.ts +0 -23
  151. package/s/tools/speech-recognition/whisper/fns/work.ts +0 -91
  152. package/s/tools/speech-recognition/whisper/parts/types.ts +0 -38
  153. package/s/tools/speech-recognition/whisper/parts/worker.bundle.ts +0 -7
  154. package/s/tools/speech-recognition/whisper/tool.ts +0 -70
  155. package/x/tools/common/loader.d.ts +0 -19
  156. package/x/tools/common/loader.js +0 -18
  157. package/x/tools/common/loader.js.map +0 -1
  158. package/x/tools/common/transformer-pipeline.d.ts +0 -8
  159. package/x/tools/common/transformer-pipeline.js +0 -24
  160. package/x/tools/common/transformer-pipeline.js.map +0 -1
  161. package/x/tools/speech-recognition/common/model.d.ts +0 -14
  162. package/x/tools/speech-recognition/common/model.js +0 -16
  163. package/x/tools/speech-recognition/common/model.js.map +0 -1
  164. package/x/tools/speech-recognition/whisper/fns/host.d.ts +0 -13
  165. package/x/tools/speech-recognition/whisper/fns/host.js +0 -19
  166. package/x/tools/speech-recognition/whisper/fns/host.js.map +0 -1
  167. package/x/tools/speech-recognition/whisper/fns/schematic.d.ts +0 -19
  168. package/x/tools/speech-recognition/whisper/fns/schematic.js +0 -2
  169. package/x/tools/speech-recognition/whisper/fns/schematic.js.map +0 -1
  170. package/x/tools/speech-recognition/whisper/fns/work.d.ts +0 -12
  171. package/x/tools/speech-recognition/whisper/fns/work.js +0 -74
  172. package/x/tools/speech-recognition/whisper/fns/work.js.map +0 -1
  173. package/x/tools/speech-recognition/whisper/parts/types.d.ts +0 -31
  174. package/x/tools/speech-recognition/whisper/parts/types.js.map +0 -1
  175. package/x/tools/speech-recognition/whisper/parts/worker.bundle.js +0 -4
  176. package/x/tools/speech-recognition/whisper/parts/worker.bundle.js.map +0 -1
  177. package/x/tools/speech-recognition/whisper/parts/worker.bundle.min.js +0 -8
  178. package/x/tools/speech-recognition/whisper/parts/worker.bundle.min.js.map +0 -7
  179. package/x/tools/speech-recognition/whisper/tool.d.ts +0 -12
  180. package/x/tools/speech-recognition/whisper/tool.js +0 -63
  181. package/x/tools/speech-recognition/whisper/tool.js.map +0 -1
  182. /package/x/{tools/speech-recognition/whisper → features/transition}/parts/types.js +0 -0
  183. /package/x/{tools/speech-recognition/whisper/parts/worker.bundle.d.ts → timeline/sugar/builders.d.ts} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omnimedia/omnitool",
3
- "version": "1.1.0-4",
3
+ "version": "1.1.0-40",
4
4
  "description": "open source video processing tools",
5
5
  "license": "MIT",
6
6
  "author": "Przemysław Gałęzki",
@@ -31,13 +31,17 @@
31
31
  "typescript": "^5.9.2"
32
32
  },
33
33
  "dependencies": {
34
- "@benev/slate": "^0.3.9",
35
34
  "@e280/comrade": "^0.0.0-23",
36
35
  "@e280/renraku": "^0.5.0-29",
37
- "@e280/stz": "^0.0.0-34",
36
+ "@e280/sly": "^0.2.0-32",
37
+ "@e280/strata": "^0.2.1",
38
+ "@e280/stz": "^0.2.13",
38
39
  "@huggingface/transformers": "^3.7.1",
39
40
  "comrade": "^0.0.3",
40
- "mediabunny": "^1.4.4",
41
+ "gl-transitions": "^1.43.0",
42
+ "gsap": "^3.13.0",
43
+ "lit": "^3.3.1",
44
+ "mediabunny": "^1.14.3",
41
45
  "mp4-muxer": "^5.2.1",
42
46
  "pixi.js": "^8.10.1",
43
47
  "wavesurfer.js": "^7.10.0",
package/s/context.ts CHANGED
@@ -1,7 +0,0 @@
1
- import {Driver} from "./driver/driver.js"
2
-
3
- const workerUrl = new URL("../driver/driver.worker.bundle.min.js", import.meta.url)
4
-
5
- export const context = {
6
- driver: Driver.setup({workerUrl})
7
- }
@@ -1,21 +1,51 @@
1
1
 
2
- import {context} from "../context.js"
2
+ import {Driver} from "../driver/driver.js"
3
3
  import {waveformTest} from "./routines/waveform-test.js"
4
4
  import {filmstripTest} from "./routines/filmstrip-test.js"
5
5
  import {transcriberTest} from "./routines/transcriber-test.js"
6
6
  import {setupTranscodeTest} from "./routines/transcode-test.js"
7
+ import {Datafile, Omni, VideoPlayer} from "../timeline/index.js"
7
8
 
8
- const driver = await context.driver
9
+ const driver = await Driver.setup({workerUrl: new URL("../driver/driver.worker.bundle.min.js", import.meta.url)})
9
10
  const results = document.querySelector(".results")!
10
11
 
11
12
  const fetchButton = document.querySelector(".fetch")
12
13
  const importButton = document.querySelector(".import") as HTMLButtonElement
13
14
 
15
+ const playButton = document.querySelector(".play") as HTMLButtonElement
16
+ const stopButton = document.querySelector(".stop") as HTMLButtonElement
17
+ const seekButton = document.querySelector(".seek") as HTMLButtonElement
18
+
14
19
  fetchButton?.addEventListener("click", startDemoFetch)
15
20
  importButton?.addEventListener("click", startDemoImport)
16
21
 
17
- waveformTest()
18
- const transcriber = await transcriberTest(driver)
22
+ const omni = new Omni(driver)
23
+ const file = await fetch("/assets/temp/gl.mp4")
24
+ const buffer = await file.arrayBuffer()
25
+ const uint = new Uint8Array(buffer)
26
+
27
+ const {videoA} = await omni.load({videoA: Datafile.make(uint)})
28
+ const timeline = omni.timeline(o =>
29
+ o.sequence(
30
+ o.stack(
31
+ o.video(videoA, {duration: 5000}),
32
+ o.audio(videoA, {duration: 8000})
33
+ ),
34
+ o.video(videoA, {duration: 7000})
35
+ ))
36
+
37
+ const player = await VideoPlayer.create(driver, timeline)
38
+ document.body.appendChild(player.canvas)
39
+
40
+ playButton.addEventListener("click", () => player.play())
41
+ stopButton.addEventListener("click", () => player.pause())
42
+ seekButton.addEventListener("change", async (e: Event) => {
43
+ const target = e.target as HTMLInputElement
44
+ await player.seek(+target.value)
45
+ })
46
+
47
+ waveformTest(driver)
48
+ // const transcriber = await transcriberTest(driver)
19
49
 
20
50
  // hello world test
21
51
  {
@@ -32,7 +62,7 @@ async function startDemoImport()
32
62
  const transcode = setupTranscodeTest(driver, file)
33
63
  await filmstripTest(file)
34
64
  run(transcode, fileHandle.name)
35
- await transcriber.transcribe(file)
65
+ // await transcriber.transcribe(file)
36
66
  }
37
67
 
38
68
  async function startDemoFetch()
package/s/demo/demo.css CHANGED
@@ -46,6 +46,11 @@
46
46
  }
47
47
  }
48
48
 
49
+ canvas {
50
+ width: 500px;
51
+ height: 300px;
52
+ }
53
+
49
54
  #filmstrip {
50
55
  display: flex;
51
56
  overflow-x: scroll;
@@ -10,7 +10,7 @@ export function setupTranscodeTest(driver: Driver, source: DecoderSource) {
10
10
  const ctx = canvas.getContext("2d")
11
11
 
12
12
  async function run() {
13
- const readables = driver.decode({
13
+ const video = driver.decodeVideo({
14
14
  source,
15
15
  async onFrame(frame) {
16
16
  const composed = await driver.composite([
@@ -21,8 +21,10 @@ export function setupTranscodeTest(driver: Driver, source: DecoderSource) {
21
21
  {
22
22
  kind: "text",
23
23
  content: "omnitool",
24
- fontSize: 50,
25
- color: "green"
24
+ style: {
25
+ fontSize: 50,
26
+ fill: "green"
27
+ }
26
28
  }
27
29
  ])
28
30
  frame.close()
@@ -30,9 +32,11 @@ export function setupTranscodeTest(driver: Driver, source: DecoderSource) {
30
32
  return composed
31
33
  }
32
34
  })
35
+ const audio = driver.decodeAudio({source})
33
36
 
34
37
  await driver.encode({
35
- readables,
38
+ video,
39
+ audio,
36
40
  config: {
37
41
  audio: {codec: "opus", bitrate: 128000},
38
42
  video: {codec: "vp9", bitrate: 1000000}
@@ -0,0 +1,43 @@
1
+ import {Application, Sprite} from "pixi.js"
2
+
3
+ import {Driver} from "../../driver/driver.js"
4
+ import {DecoderSource} from "../../driver/fns/schematic.js"
5
+ import {makeTransition} from "../../features/transition/transition.js"
6
+
7
+ export async function setupTransitionsTest(driver: Driver, source: DecoderSource) {
8
+ const app = new Application()
9
+ await app.init({width: 300, height: 300, preference: "webgl"})
10
+ const sprite = new Sprite({width: 300, height: 300})
11
+
12
+ app.stage.addChild(sprite)
13
+
14
+ document.body.appendChild(app.canvas)
15
+ const transition = makeTransition({name: "circle", renderer: app.renderer})
16
+
17
+ async function run() {
18
+ const video = driver.decodeVideo({
19
+ source,
20
+ async onFrame(frame) {
21
+ const texture = transition.render({
22
+ from: frame,
23
+ to: frame,
24
+ progress: 0.7,
25
+ width: app.canvas.width,
26
+ height: app.canvas.height
27
+ })
28
+ sprite.texture = texture
29
+ return frame
30
+ }
31
+ })
32
+
33
+ await driver.encode({
34
+ video,
35
+ config: {
36
+ audio: {codec: "opus", bitrate: 128000},
37
+ video: {codec: "vp9", bitrate: 1000000}
38
+ }
39
+ })
40
+ }
41
+
42
+ return {run}
43
+ }
@@ -1,9 +1,10 @@
1
+ import {Driver} from "../../driver/driver.js"
1
2
  import {Waveform} from "../../timeline/parts/waveform.js"
2
3
 
3
- export async function waveformTest() {
4
+ export async function waveformTest(driver: Driver) {
4
5
  const container = document.querySelector(".waveform-demo") as HTMLElement
5
6
  const widthSlider = document.querySelector(".width") as HTMLInputElement
6
- const waveform = await Waveform.init("/assets/temp/gl.mp4", container)
7
+ const waveform = await Waveform.init(driver, "/assets/temp/gl.mp4", container)
7
8
 
8
9
  widthSlider.addEventListener("change", () => {
9
10
  const width = +widthSlider.value
@@ -11,11 +11,11 @@ export type DriverOptions = {
11
11
  }
12
12
 
13
13
  export class Driver {
14
- static async setup(options: DriverOptions) {
14
+ static async setup(options?: DriverOptions) {
15
15
  const machina = new Machina()
16
16
  const thread = await Comrade.thread<DriverSchematic>({
17
17
  label: "OmnitoolDriver",
18
- workerUrl: options.workerUrl,
18
+ workerUrl: options?.workerUrl ?? "/node_modules/@omnimedia/omnitool/x/driver/driver.worker.bundle.min.js",
19
19
  setupHost: setupDriverHost(machina),
20
20
  })
21
21
  return new this(machina, thread)
@@ -50,7 +50,7 @@ export class Driver {
50
50
  return await videoTrack?.computeDuration()
51
51
  }
52
52
 
53
- decode(input: DecoderInput) {
53
+ decodeVideo(input: DecoderInput) {
54
54
  let lastFrame: VideoFrame | null = null
55
55
  const videoTransform = new TransformStream<VideoFrame, VideoFrame>({
56
56
  async transform(chunk, controller) {
@@ -61,19 +61,27 @@ export class Driver {
61
61
  lastFrame = frame
62
62
  }
63
63
  })
64
- const audioTransform = new TransformStream<AudioData, AudioData>()
65
- this.thread.work.decode[tune]({transfer: [videoTransform.writable, audioTransform.writable]})({
64
+ this.thread.work.decodeVideo[tune]({transfer: [videoTransform.writable]})({
66
65
  source: input.source,
67
66
  video: videoTransform.writable,
67
+ start: input.start,
68
+ end: input.end
69
+ })
70
+ return videoTransform.readable
71
+ }
72
+
73
+ decodeAudio(input: DecoderInput) {
74
+ const audioTransform = new TransformStream<AudioData, AudioData>()
75
+ this.thread.work.decodeAudio[tune]({transfer: [audioTransform.writable]})({
76
+ source: input.source,
68
77
  audio: audioTransform.writable,
78
+ start: input.start,
79
+ end: input.end
69
80
  })
70
- return {
71
- audio: audioTransform.readable,
72
- video: videoTransform.readable
73
- }
81
+ return audioTransform.readable
74
82
  }
75
83
 
76
- async encode({readables, config}: EncoderInput) {
84
+ async encode({video, audio, config}: EncoderInput) {
77
85
  const handle = await window.showSaveFilePicker()
78
86
  const writable = await handle.createWritable()
79
87
  // making bridge because file picker writable is not transferable
@@ -85,7 +93,7 @@ export class Driver {
85
93
  await writable.close()
86
94
  }
87
95
  })
88
- return await this.thread.work.encode[tune]({transfer: [readables.audio, readables.video, bridge]})({readables, config, bridge})
96
+ return await this.thread.work.encode[tune]({transfer: [audio ?? [], video ?? [], bridge]})({video, audio, config, bridge})
89
97
  }
90
98
 
91
99
  async composite(
@@ -1,17 +1,28 @@
1
1
 
2
+ import {TextStyleOptions} from "pixi.js"
2
3
  import {AsSchematic} from "@e280/comrade"
3
4
  import type {AudioEncodingConfig, StreamTargetChunk, VideoEncodingConfig} from "mediabunny"
4
5
 
6
+ import {Mat6} from "../../timeline/utils/matrix.js"
7
+
5
8
  export type DriverSchematic = AsSchematic<{
6
9
 
7
10
  // happens on the web worker
8
11
  work: {
9
12
  hello(): Promise<void>
10
13
 
11
- decode(input: {
14
+ decodeAudio(input: {
12
15
  source: DecoderSource
13
- video: WritableStream<VideoFrame>
14
16
  audio: WritableStream<AudioData>
17
+ start?: number
18
+ end?: number
19
+ }): Promise<void>
20
+
21
+ decodeVideo(input: {
22
+ source: DecoderSource
23
+ video: WritableStream<VideoFrame>
24
+ start?: number
25
+ end?: number
15
26
  }): Promise<void>
16
27
 
17
28
  encode(input: EncoderInput & {bridge: WritableStream<StreamTargetChunk>}): Promise<void>
@@ -26,20 +37,22 @@ export type DriverSchematic = AsSchematic<{
26
37
  }>
27
38
 
28
39
  export interface EncoderInput {
29
- readables: {
30
- video: ReadableStream<VideoFrame>
31
- audio: ReadableStream<AudioData>
32
- },
33
- config: {
34
- video: VideoEncodingConfig
35
- audio: AudioEncodingConfig
36
- }
40
+ video?: ReadableStream<VideoFrame>
41
+ audio?: ReadableStream<AudioData>
42
+ config: RenderConfig
43
+ }
44
+
45
+ export interface RenderConfig {
46
+ video: VideoEncodingConfig
47
+ audio: AudioEncodingConfig
37
48
  }
38
49
 
39
50
  export type DecoderSource = Blob | string | URL
40
51
 
41
52
  export interface DecoderInput {
42
53
  source: DecoderSource
54
+ start?: number
55
+ end?: number
43
56
  onFrame?: (frame: VideoFrame) => Promise<VideoFrame>
44
57
  }
45
58
 
@@ -59,25 +72,35 @@ export interface MuxOpts {
59
72
 
60
73
  export type Composition = Layer | (Layer | Composition)[]
61
74
 
62
- export type Transform = {
63
- x?: number
64
- y?: number
65
- scale?: number
66
- opacity?: number
67
- anchor?: number
68
- }
69
-
70
75
  export type TextLayer = {
71
76
  kind: 'text'
72
77
  content: string
73
- fontSize?: number
74
- color?: string
75
- } & Transform
78
+ style?: TextStyleOptions
79
+ matrix?: Mat6
80
+ }
76
81
 
77
82
  export type ImageLayer = {
78
83
  kind: 'image'
79
84
  frame: VideoFrame
80
- } & Transform
85
+ matrix?: Mat6
86
+ }
87
+
88
+ export type TransitionLayer = {
89
+ kind: 'transition'
90
+ name: string
91
+ progress: number
92
+ from: VideoFrame
93
+ to: VideoFrame
94
+ }
95
+
96
+ export type GapLayer = {
97
+ kind: 'gap'
98
+ }
99
+
100
+ export type Audio = {
101
+ kind: "audio"
102
+ data: AudioData
103
+ }
81
104
 
82
- export type Layer = TextLayer | ImageLayer
105
+ export type Layer = TextLayer | ImageLayer | TransitionLayer | GapLayer
83
106