@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.
- package/package.json +8 -4
- package/s/context.ts +0 -7
- package/s/demo/demo.bundle.ts +35 -5
- package/s/demo/demo.css +5 -0
- package/s/demo/routines/transcode-test.ts +8 -4
- package/s/demo/routines/transitions-test.ts +43 -0
- package/s/demo/routines/waveform-test.ts +3 -2
- package/s/driver/driver.ts +19 -11
- package/s/driver/fns/schematic.ts +46 -23
- package/s/driver/fns/work.ts +114 -102
- package/s/features/transition/parts/fragment.ts +24 -0
- package/s/features/transition/parts/types.ts +94 -0
- package/s/features/transition/parts/uniforms.ts +29 -0
- package/s/features/transition/parts/vertex.ts +31 -0
- package/s/features/transition/transition.ts +60 -0
- package/s/index.html.ts +6 -1
- package/s/timeline/index.ts +1 -0
- package/s/timeline/parts/basics.ts +1 -1
- package/s/timeline/parts/compositor/export.ts +77 -0
- package/s/timeline/parts/compositor/parts/html-tree.ts +37 -0
- package/s/timeline/parts/compositor/parts/schedulers.ts +95 -0
- package/s/timeline/parts/compositor/parts/tree-builder.ts +196 -0
- package/s/timeline/parts/compositor/parts/webcodecs-tree.ts +30 -0
- package/s/timeline/parts/compositor/playback.ts +94 -0
- package/s/timeline/parts/compositor/samplers/html.ts +115 -0
- package/s/timeline/parts/compositor/samplers/webcodecs.ts +61 -0
- package/s/timeline/parts/filmstrip.ts +42 -15
- package/s/timeline/parts/item.ts +48 -6
- package/s/timeline/parts/media.ts +21 -0
- package/s/timeline/parts/waveform.ts +3 -4
- package/s/timeline/sugar/builders.ts +102 -0
- package/s/timeline/sugar/o.ts +163 -38
- package/s/timeline/sugar/omni-test.ts +5 -3
- package/s/timeline/sugar/omni.ts +26 -11
- package/s/timeline/types.ts +29 -0
- package/s/timeline/utils/audio-stream.ts +15 -0
- package/s/timeline/utils/matrix.ts +33 -0
- package/s/timeline/utils/video-cursor.ts +40 -0
- package/x/context.d.ts +1 -4
- package/x/context.js +1 -5
- package/x/context.js.map +1 -1
- package/x/demo/demo.bundle.js +23 -6
- package/x/demo/demo.bundle.js.map +1 -1
- package/x/demo/demo.bundle.min.js +606 -36
- package/x/demo/demo.bundle.min.js.map +4 -4
- package/x/demo/demo.css +5 -0
- package/x/demo/routines/transcode-test.js +8 -4
- package/x/demo/routines/transcode-test.js.map +1 -1
- package/x/demo/routines/transitions-test.d.ts +5 -0
- package/x/demo/routines/transitions-test.js +35 -0
- package/x/demo/routines/transitions-test.js.map +1 -0
- package/x/demo/routines/waveform-test.d.ts +2 -1
- package/x/demo/routines/waveform-test.js +2 -2
- package/x/demo/routines/waveform-test.js.map +1 -1
- package/x/driver/driver.d.ts +4 -6
- package/x/driver/driver.js +17 -10
- package/x/driver/driver.js.map +1 -1
- package/x/driver/driver.worker.bundle.min.js +2537 -148
- package/x/driver/driver.worker.bundle.min.js.map +4 -4
- package/x/driver/fns/host.d.ts +9 -2
- package/x/driver/fns/schematic.d.ts +40 -22
- package/x/driver/fns/work.d.ts +11 -4
- package/x/driver/fns/work.js +107 -101
- package/x/driver/fns/work.js.map +1 -1
- package/x/features/speech/transcribe/worker.bundle.min.js +542 -542
- package/x/features/speech/transcribe/worker.bundle.min.js.map +4 -4
- package/x/features/transition/parts/fragment.d.ts +1 -0
- package/x/features/transition/parts/fragment.js +25 -0
- package/x/features/transition/parts/fragment.js.map +1 -0
- package/x/features/transition/parts/types.d.ts +23 -0
- package/x/features/transition/parts/types.js.map +1 -0
- package/x/features/transition/parts/uniforms.d.ts +31 -0
- package/x/features/transition/parts/uniforms.js +27 -0
- package/x/features/transition/parts/uniforms.js.map +1 -0
- package/x/features/transition/parts/vertex.d.ts +1 -0
- package/x/features/transition/parts/vertex.js +32 -0
- package/x/features/transition/parts/vertex.js.map +1 -0
- package/x/features/transition/transition.d.ts +5 -0
- package/x/features/transition/transition.js +50 -0
- package/x/features/transition/transition.js.map +1 -0
- package/x/index.html +13 -3
- package/x/index.html.js +6 -1
- package/x/index.html.js.map +1 -1
- package/x/timeline/index.d.ts +1 -0
- package/x/timeline/index.js +1 -0
- package/x/timeline/index.js.map +1 -1
- package/x/timeline/parts/basics.d.ts +1 -1
- package/x/timeline/parts/compositor/export.d.ts +11 -0
- package/x/timeline/parts/compositor/export.js +64 -0
- package/x/timeline/parts/compositor/export.js.map +1 -0
- package/x/timeline/parts/compositor/parts/html-tree.d.ts +3 -0
- package/x/timeline/parts/compositor/parts/html-tree.js +40 -0
- package/x/timeline/parts/compositor/parts/html-tree.js.map +1 -0
- package/x/timeline/parts/compositor/parts/schedulers.d.ts +15 -0
- package/x/timeline/parts/compositor/parts/schedulers.js +70 -0
- package/x/timeline/parts/compositor/parts/schedulers.js.map +1 -0
- package/x/timeline/parts/compositor/parts/tree-builder.d.ts +37 -0
- package/x/timeline/parts/compositor/parts/tree-builder.js +160 -0
- package/x/timeline/parts/compositor/parts/tree-builder.js.map +1 -0
- package/x/timeline/parts/compositor/parts/webcodecs-tree.d.ts +3 -0
- package/x/timeline/parts/compositor/parts/webcodecs-tree.js +28 -0
- package/x/timeline/parts/compositor/parts/webcodecs-tree.js.map +1 -0
- package/x/timeline/parts/compositor/playback.d.ts +26 -0
- package/x/timeline/parts/compositor/playback.js +79 -0
- package/x/timeline/parts/compositor/playback.js.map +1 -0
- package/x/timeline/parts/compositor/samplers/html.d.ts +3 -0
- package/x/timeline/parts/compositor/samplers/html.js +106 -0
- package/x/timeline/parts/compositor/samplers/html.js.map +1 -0
- package/x/timeline/parts/compositor/samplers/webcodecs.d.ts +3 -0
- package/x/timeline/parts/compositor/samplers/webcodecs.js +52 -0
- package/x/timeline/parts/compositor/samplers/webcodecs.js.map +1 -0
- package/x/timeline/parts/filmstrip.d.ts +2 -1
- package/x/timeline/parts/filmstrip.js +29 -10
- package/x/timeline/parts/filmstrip.js.map +1 -1
- package/x/timeline/parts/item.d.ts +42 -8
- package/x/timeline/parts/item.js +7 -3
- package/x/timeline/parts/item.js.map +1 -1
- package/x/timeline/parts/media.d.ts +3 -0
- package/x/timeline/parts/media.js +17 -0
- package/x/timeline/parts/media.js.map +1 -1
- package/x/timeline/parts/waveform.d.ts +2 -1
- package/x/timeline/parts/waveform.js +2 -4
- package/x/timeline/parts/waveform.js.map +1 -1
- package/x/timeline/sugar/builders.js +104 -0
- package/x/timeline/sugar/builders.js.map +1 -0
- package/x/timeline/sugar/o.d.ts +27 -5
- package/x/timeline/sugar/o.js +137 -38
- package/x/timeline/sugar/o.js.map +1 -1
- package/x/timeline/sugar/omni-test.js +4 -2
- package/x/timeline/sugar/omni-test.js.map +1 -1
- package/x/timeline/sugar/omni.d.ts +8 -2
- package/x/timeline/sugar/omni.js +22 -9
- package/x/timeline/sugar/omni.js.map +1 -1
- package/x/timeline/types.d.ts +24 -0
- package/x/timeline/types.js +2 -0
- package/x/timeline/types.js.map +1 -0
- package/x/timeline/utils/audio-stream.d.ts +6 -0
- package/x/timeline/utils/audio-stream.js +17 -0
- package/x/timeline/utils/audio-stream.js.map +1 -0
- package/x/timeline/utils/matrix.d.ts +8 -0
- package/x/timeline/utils/matrix.js +26 -0
- package/x/timeline/utils/matrix.js.map +1 -0
- package/x/timeline/utils/video-cursor.d.ts +10 -0
- package/x/timeline/utils/video-cursor.js +36 -0
- package/x/timeline/utils/video-cursor.js.map +1 -0
- package/s/tools/common/loader.ts +0 -26
- package/s/tools/common/transformer-pipeline.ts +0 -26
- package/s/tools/speech-recognition/common/model.ts +0 -26
- package/s/tools/speech-recognition/whisper/fns/host.ts +0 -25
- package/s/tools/speech-recognition/whisper/fns/schematic.ts +0 -23
- package/s/tools/speech-recognition/whisper/fns/work.ts +0 -91
- package/s/tools/speech-recognition/whisper/parts/types.ts +0 -38
- package/s/tools/speech-recognition/whisper/parts/worker.bundle.ts +0 -7
- package/s/tools/speech-recognition/whisper/tool.ts +0 -70
- package/x/tools/common/loader.d.ts +0 -19
- package/x/tools/common/loader.js +0 -18
- package/x/tools/common/loader.js.map +0 -1
- package/x/tools/common/transformer-pipeline.d.ts +0 -8
- package/x/tools/common/transformer-pipeline.js +0 -24
- package/x/tools/common/transformer-pipeline.js.map +0 -1
- package/x/tools/speech-recognition/common/model.d.ts +0 -14
- package/x/tools/speech-recognition/common/model.js +0 -16
- package/x/tools/speech-recognition/common/model.js.map +0 -1
- package/x/tools/speech-recognition/whisper/fns/host.d.ts +0 -13
- package/x/tools/speech-recognition/whisper/fns/host.js +0 -19
- package/x/tools/speech-recognition/whisper/fns/host.js.map +0 -1
- package/x/tools/speech-recognition/whisper/fns/schematic.d.ts +0 -19
- package/x/tools/speech-recognition/whisper/fns/schematic.js +0 -2
- package/x/tools/speech-recognition/whisper/fns/schematic.js.map +0 -1
- package/x/tools/speech-recognition/whisper/fns/work.d.ts +0 -12
- package/x/tools/speech-recognition/whisper/fns/work.js +0 -74
- package/x/tools/speech-recognition/whisper/fns/work.js.map +0 -1
- package/x/tools/speech-recognition/whisper/parts/types.d.ts +0 -31
- package/x/tools/speech-recognition/whisper/parts/types.js.map +0 -1
- package/x/tools/speech-recognition/whisper/parts/worker.bundle.js +0 -4
- package/x/tools/speech-recognition/whisper/parts/worker.bundle.js.map +0 -1
- package/x/tools/speech-recognition/whisper/parts/worker.bundle.min.js +0 -8
- package/x/tools/speech-recognition/whisper/parts/worker.bundle.min.js.map +0 -7
- package/x/tools/speech-recognition/whisper/tool.d.ts +0 -12
- package/x/tools/speech-recognition/whisper/tool.js +0 -63
- package/x/tools/speech-recognition/whisper/tool.js.map +0 -1
- /package/x/{tools/speech-recognition/whisper → features/transition}/parts/types.js +0 -0
- /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-
|
|
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/
|
|
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
|
-
"
|
|
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
package/s/demo/demo.bundle.ts
CHANGED
|
@@ -1,21 +1,51 @@
|
|
|
1
1
|
|
|
2
|
-
import {
|
|
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
|
|
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
|
-
|
|
18
|
-
const
|
|
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
|
@@ -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
|
|
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
|
-
|
|
25
|
-
|
|
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
|
-
|
|
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
|
package/s/driver/driver.ts
CHANGED
|
@@ -11,11 +11,11 @@ export type DriverOptions = {
|
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
export class Driver {
|
|
14
|
-
static async setup(options
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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({
|
|
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: [
|
|
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
|
-
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
78
|
+
style?: TextStyleOptions
|
|
79
|
+
matrix?: Mat6
|
|
80
|
+
}
|
|
76
81
|
|
|
77
82
|
export type ImageLayer = {
|
|
78
83
|
kind: 'image'
|
|
79
84
|
frame: VideoFrame
|
|
80
|
-
|
|
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
|
|