Skip to content

Commit c39143b

Browse files
authored
Add WORKERFS support (#581)
* README.md update * Workflow update * Action update * Workflow update * Workflow update * Added workerLoadURL to FFMessageLoadConfig * Add WORKERFS support * Imported WORKERFS types * Import WORKERFS types * Action update * Type updates * Export update * Updated classes * Package together workflow update * Cleanup * Restore CI.yml to upstream * Restore README.md to upstream * Restore classes.ts changes that are not related tp WORKERFS * Restore types.ts changes unrelated to WORERFS * Restore const.ts changes unrelated to WORKERFS * Updated mount to support any enabled filesystems. --------- Co-authored-by: Todd <[email protected]>
1 parent e8fa422 commit c39143b

File tree

6 files changed

+112
-3
lines changed

6 files changed

+112
-3
lines changed

build/ffmpeg-wasm.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ CONF_FLAGS=(
3939
-sEXPORT_NAME="$EXPORT_NAME" # required in browser env, so that user can access this module from window object
4040
-sEXPORTED_FUNCTIONS=$(node src/bind/ffmpeg/export.js) # exported functions
4141
-sEXPORTED_RUNTIME_METHODS=$(node src/bind/ffmpeg/export-runtime.js) # exported built-in functions
42+
-lworkerfs.js
4243
--pre-js src/bind/ffmpeg/bind.js # extra bindings, contains most of the ffmpeg.wasm javascript code
4344
# ffmpeg source code
4445
src/fftools/cmdutils.c

packages/ffmpeg/src/classes.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ import {
1313
LogEventCallback,
1414
ProgressEventCallback,
1515
FileData,
16+
WorkerFSMountData,
17+
FFFSType,
18+
FFFSMountOptions,
19+
FFFSPath,
1620
} from "./types.js";
1721
import { getMessageID } from "./utils.js";
1822
import { ERROR_TERMINATED, ERROR_NOT_LOADED } from "./errors.js";
@@ -56,6 +60,8 @@ export class FFmpeg {
5660
this.loaded = true;
5761
this.#resolves[id](data);
5862
break;
63+
case FFMessageType.MOUNT:
64+
case FFMessageType.UNMOUNT:
5965
case FFMessageType.EXEC:
6066
case FFMessageType.WRITE_FILE:
6167
case FFMessageType.READ_FILE:
@@ -292,6 +298,28 @@ export class FFmpeg {
292298
) as Promise<OK>;
293299
};
294300

301+
public mount = (fsType: FFFSType, options: FFFSMountOptions, mountPoint: FFFSPath, ): Promise<OK> => {
302+
const trans: Transferable[] = [];
303+
return this.#send(
304+
{
305+
type: FFMessageType.MOUNT,
306+
data: { fsType, options, mountPoint },
307+
},
308+
trans
309+
) as Promise<OK>;
310+
};
311+
312+
public unmount = (mountPoint: FFFSPath): Promise<OK> => {
313+
const trans: Transferable[] = [];
314+
return this.#send(
315+
{
316+
type: FFMessageType.UNMOUNT,
317+
data: { mountPoint },
318+
},
319+
trans
320+
) as Promise<OK>;
321+
};
322+
295323
/**
296324
* Read data from ffmpeg.wasm.
297325
*

packages/ffmpeg/src/const.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,6 @@ export enum FFMessageType {
1919
DOWNLOAD = "DOWNLOAD",
2020
PROGRESS = "PROGRESS",
2121
LOG = "LOG",
22-
}
22+
MOUNT = "MOUNT",
23+
UNMOUNT = "UNMOUNT",
24+
}

packages/ffmpeg/src/types.ts

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,41 @@ export interface FFMessageDeleteDirData {
6464
path: FFFSPath;
6565
}
6666

67+
export enum FFFSType {
68+
MEMFS = "MEMFS",
69+
NODEFS = "NODEFS",
70+
NODERAWFS = "NODERAWFS",
71+
IDBFS = "IDBFS",
72+
WORKERFS = "WORKERFS",
73+
PROXYFS = "PROXYFS",
74+
}
75+
76+
export type WorkerFSFileEntry =
77+
| File;
78+
79+
export interface WorkerFSBlobEntry {
80+
name: string;
81+
data: Blob;
82+
}
83+
84+
export interface WorkerFSMountData {
85+
blobs?: WorkerFSBlobEntry[];
86+
files?: WorkerFSFileEntry[];
87+
}
88+
89+
export type FFFSMountOptions =
90+
| WorkerFSMountData;
91+
92+
export interface FFMessageMountData {
93+
fsType: FFFSType;
94+
options: FFFSMountOptions;
95+
mountPoint: FFFSPath;
96+
}
97+
98+
export interface FFMessageUnmountData {
99+
mountPoint: FFFSPath;
100+
}
101+
67102
export type FFMessageData =
68103
| FFMessageLoadConfig
69104
| FFMessageExecData
@@ -73,7 +108,9 @@ export type FFMessageData =
73108
| FFMessageRenameData
74109
| FFMessageCreateDirData
75110
| FFMessageListDirData
76-
| FFMessageDeleteDirData;
111+
| FFMessageDeleteDirData
112+
| FFMessageMountData
113+
| FFMessageUnmountData;
77114

78115
export interface Message {
79116
type: string;
@@ -134,4 +171,4 @@ export interface FFMessageEventCallback {
134171
type: string;
135172
data: CallbackData;
136173
};
137-
}
174+
}

packages/ffmpeg/src/worker.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import type {
1414
FFMessageCreateDirData,
1515
FFMessageListDirData,
1616
FFMessageDeleteDirData,
17+
FFMessageMountData,
18+
FFMessageUnmountData,
1719
CallbackData,
1820
IsFirst,
1921
OK,
@@ -137,6 +139,19 @@ const deleteDir = ({ path }: FFMessageDeleteDirData): OK => {
137139
return true;
138140
};
139141

142+
const mount = ({ fsType, options, mountPoint }: FFMessageMountData): OK => {
143+
let str = fsType as keyof typeof ffmpeg.FS.filesystems;
144+
let fs = ffmpeg.FS.filesystems[str];
145+
if (!fs) return false;
146+
ffmpeg.FS.mount(fs, options, mountPoint);
147+
return true;
148+
};
149+
150+
const unmount = ({ mountPoint }: FFMessageUnmountData): OK => {
151+
ffmpeg.FS.unmount(mountPoint);
152+
return true;
153+
};
154+
140155
self.onmessage = async ({
141156
data: { id, type, data: _data },
142157
}: FFMessageEvent): Promise<void> => {
@@ -173,6 +188,12 @@ self.onmessage = async ({
173188
case FFMessageType.DELETE_DIR:
174189
data = deleteDir(_data as FFMessageDeleteDirData);
175190
break;
191+
case FFMessageType.MOUNT:
192+
data = mount(_data as FFMessageMountData);
193+
break;
194+
case FFMessageType.UNMOUNT:
195+
data = unmount(_data as FFMessageUnmountData);
196+
break;
176197
default:
177198
throw ERROR_UNKNOWN_MESSAGE_TYPE;
178199
}

packages/types/types/index.d.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,23 @@ export interface Stat {
3939
blocks: number;
4040
}
4141

42+
export interface FSFilesystemWORKERFS {
43+
44+
}
45+
46+
export interface FSFilesystemMEMFS {
47+
48+
}
49+
50+
export interface FSFilesystems {
51+
WORKERFS: FSFilesystemWORKERFS;
52+
MEMFS: FSFilesystemMEMFS;
53+
}
54+
55+
export type FSFilesystem =
56+
| FSFilesystemWORKERFS
57+
| FSFilesystemMEMFS;
58+
4259
/**
4360
* Functions to interact with Emscripten FS library.
4461
*
@@ -58,6 +75,9 @@ export interface FS {
5875
isFile: (mode: number) => boolean;
5976
/** mode is a numeric notation of permission, @see [Numeric Notation](https://en.wikipedia.org/wiki/File-system_permissions#Numeric_notation) */
6077
isDir: (mode: number) => boolean;
78+
mount: (fileSystemType: FSFilesystem, data: WorkerFSMountConfig, path: string) => void;
79+
unmount: (path: string) => void;
80+
filesystems: FSFilesystems;
6181
}
6282

6383
/**

0 commit comments

Comments
 (0)