From 241e56c25fb8f9bda48142d5f90805e499b87528 Mon Sep 17 00:00:00 2001 From: Todd Date: Tue, 12 Sep 2023 13:18:59 -0400 Subject: [PATCH 01/21] README.md update --- README.md | 33 ++++++--------------------------- 1 file changed, 6 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index af80f05e3ca..9818857f62d 100644 --- a/README.md +++ b/README.md @@ -1,34 +1,13 @@ + + +# Fork of [ffmpeg.wasm](https://github.com/ffmpegwasm/ffmpeg.wasm) + +Forked to test customization of ffmpeg-core including adding [WORKERFS](https://emscripten.org/docs/api_reference/Filesystem-API.html#filesystem-api-workerfs) to enable the use of large files. +

ffmpeg.wasm

-# ffmpeg.wasm - -ffmpeg.wasm is a pure Webassembly / Javascript port of FFmpeg. It enables video & audio record, convert and stream right inside browsers. - -[![stability-experimental](https://img.shields.io/badge/stability-experimental-orange.svg)](https://github.com/emersion/stability-badges#experimental) -[![Node Version](https://img.shields.io/node/v/@ffmpeg/ffmpeg.svg)](https://img.shields.io/node/v/@ffmpeg/ffmpeg.svg) -[![Actions Status](https://github.com/ffmpegwasm/ffmpeg.wasm/workflows/CI/badge.svg)](https://github.com/ffmpegwasm/ffmpeg.wasm/actions) -![npm (tag)](https://img.shields.io/npm/v/@ffmpeg/ffmpeg/latest) -[![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://github.com/ffmpegwasm/ffmpeg.wasm/graphs/commit-activity) -[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) -[![Downloads Total](https://img.shields.io/npm/dt/@ffmpeg/ffmpeg.svg)](https://www.npmjs.com/package/@ffmpeg/ffmpeg) -[![Downloads Month](https://img.shields.io/npm/dm/@ffmpeg/ffmpeg.svg)](https://www.npmjs.com/package/@ffmpeg/ffmpeg) -[![Netlify Status](https://api.netlify.com/api/v1/badges/1943b6d3-45ad-4b46-bfba-cb8d5716604c/deploy-status)](https://app.netlify.com/sites/ffmpegwasm/deploys) - -Join us on Discord! - -[![Discord](https://dcbadge.vercel.app/api/server/NjGMaqqfm5)](https://discord.gg/NjGMaqqfm5) - -## Documentation - -- [Introduction](https://ffmpegwasm.netlify.app/docs/overview) -- [Getting - Started](https://ffmpegwasm.netlify.app/docs/getting-started/installation) -- [API](https://ffmpegwasm.netlify.app/docs/api/ffmpeg/) -- [FAQ](https://ffmpegwasm.netlify.app/docs/faq) -- [Contribution](https://ffmpegwasm.netlify.app/docs/contribution/core) -Please sponsor ffmpeg.wasm to make it sustainable. :heart: From dfecc641418697771328ef088fd5c3d751a45d6a Mon Sep 17 00:00:00 2001 From: Todd Date: Tue, 12 Sep 2023 14:14:26 -0400 Subject: [PATCH 02/21] Workflow update --- .github/workflows/CI.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 5417a20ec33..a1f0efff9fc 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -32,6 +32,14 @@ jobs: with: name: ffmpeg-core path: packages/core/dist/* + - name: Deploy + uses: s0/git-publish-subdir-action@master + env: + REPO: self + BRANCH: latest-build + FOLDER: packages/core/dist/ + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TARGET_DIR: core build-core-mt: runs-on: ubuntu-latest steps: @@ -56,6 +64,14 @@ jobs: with: name: ffmpeg-core-mt path: packages/core-mt/dist/* + - name: Deploy + uses: s0/git-publish-subdir-action@master + env: + REPO: self + BRANCH: latest-build + FOLDER: packages/core-mt/dist/ + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TARGET_DIR: core-mt tests: runs-on: ubuntu-latest needs: From c5918675c004ba8898d9803875d078a965dfc406 Mon Sep 17 00:00:00 2001 From: Todd Date: Tue, 12 Sep 2023 14:25:04 -0400 Subject: [PATCH 03/21] Action update --- .github/workflows/CI.yml | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index a1f0efff9fc..9a789b2fce6 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -32,14 +32,6 @@ jobs: with: name: ffmpeg-core path: packages/core/dist/* - - name: Deploy - uses: s0/git-publish-subdir-action@master - env: - REPO: self - BRANCH: latest-build - FOLDER: packages/core/dist/ - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TARGET_DIR: core build-core-mt: runs-on: ubuntu-latest steps: @@ -64,14 +56,6 @@ jobs: with: name: ffmpeg-core-mt path: packages/core-mt/dist/* - - name: Deploy - uses: s0/git-publish-subdir-action@master - env: - REPO: self - BRANCH: latest-build - FOLDER: packages/core-mt/dist/ - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TARGET_DIR: core-mt tests: runs-on: ubuntu-latest needs: @@ -90,6 +74,25 @@ jobs: with: name: ffmpeg-core-mt path: packages/core-mt/dist + + - name: Deploy core + uses: s0/git-publish-subdir-action@master + env: + REPO: self + BRANCH: latest-build + FOLDER: packages/core/dist/ + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TARGET_DIR: packages/core/dist/ + + - name: Deploy core-mt + uses: s0/git-publish-subdir-action@master + env: + REPO: self + BRANCH: latest-build + FOLDER: packages/core-mt/dist/ + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TARGET_DIR: packages/core-mt/dist/ + - name: Use Node.js 18 uses: actions/setup-node@v3 with: From 1dc02cbb897f0a2d52da46361ef3822fea38299f Mon Sep 17 00:00:00 2001 From: Todd Date: Tue, 12 Sep 2023 14:33:01 -0400 Subject: [PATCH 04/21] Workflow update --- .github/workflows/CI.yml | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 9a789b2fce6..e95d4d8948a 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -75,24 +75,6 @@ jobs: name: ffmpeg-core-mt path: packages/core-mt/dist - - name: Deploy core - uses: s0/git-publish-subdir-action@master - env: - REPO: self - BRANCH: latest-build - FOLDER: packages/core/dist/ - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TARGET_DIR: packages/core/dist/ - - - name: Deploy core-mt - uses: s0/git-publish-subdir-action@master - env: - REPO: self - BRANCH: latest-build - FOLDER: packages/core-mt/dist/ - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TARGET_DIR: packages/core-mt/dist/ - - name: Use Node.js 18 uses: actions/setup-node@v3 with: From 88c27b00df8b04f8ff84821726a9fe369dff0f63 Mon Sep 17 00:00:00 2001 From: Todd Date: Tue, 12 Sep 2023 14:43:51 -0400 Subject: [PATCH 05/21] Workflow update --- .github/workflows/CI.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index e95d4d8948a..3628b4f9682 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -45,7 +45,6 @@ jobs: uses: actions/cache@v3 with: path: build-cache-mt - key: build-cache-mt-v1-${{ hashFiles('Dockerfile', 'Makefile', 'build/*') }} restore-keys: | build-cache-v1- @@ -74,7 +73,6 @@ jobs: with: name: ffmpeg-core-mt path: packages/core-mt/dist - - name: Use Node.js 18 uses: actions/setup-node@v3 with: @@ -84,11 +82,15 @@ jobs: uses: actions/cache@v3 with: path: node_modules - key: node-modules-${{ hashFiles('package-lock.json') }} restore-keys: | node-modules- - name: Install dependencies run: npm install + - name: Upload ffmpeg + uses: actions/upload-artifact@v3 + with: + name: ffmpeg + path: packages/ffmpeg/dist/* - name: Run tests run: npm test From faf13d1cc385f301c9f0ea6df627e381155410dc Mon Sep 17 00:00:00 2001 From: Todd Date: Tue, 12 Sep 2023 14:49:19 -0400 Subject: [PATCH 06/21] Added workerLoadURL to FFMessageLoadConfig --- packages/ffmpeg/src/classes.ts | 12 +++++++++--- packages/ffmpeg/src/types.ts | 6 ++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/ffmpeg/src/classes.ts b/packages/ffmpeg/src/classes.ts index bb366d9cba1..e5927bc2e1a 100644 --- a/packages/ffmpeg/src/classes.ts +++ b/packages/ffmpeg/src/classes.ts @@ -163,9 +163,15 @@ export class FFmpeg { */ public load = (config: FFMessageLoadConfig = {}): Promise => { if (!this.#worker) { - this.#worker = new Worker(new URL("./worker.js", import.meta.url), { - type: "module", - }); + if (!config.workerLoadURL) { + this.#worker = new Worker(new URL("./worker.js", import.meta.url), { + type: "module", + }); + } else { + this.#worker = new Worker(config.workerLoadURL, { + type: "module", + }); + } this.#registerHandlers(); } return this.#send({ diff --git a/packages/ffmpeg/src/types.ts b/packages/ffmpeg/src/types.ts index 411cf291886..c06c5f9d717 100644 --- a/packages/ffmpeg/src/types.ts +++ b/packages/ffmpeg/src/types.ts @@ -22,6 +22,12 @@ export interface FFMessageLoadConfig { * @defaultValue `https://unpkg.com/@ffmpeg/core-mt@${CORE_VERSION}/dist/umd/ffmpeg-core.worker.js`; */ workerURL?: string; + /** + * `worker.js` URL. + * + * @defaultValue `new URL('./worker.js')`; + */ + workerLoadURL?: string; } export interface FFMessageExecData { From 8d7246c7794fc248f41d6a563f246d953a4a71e6 Mon Sep 17 00:00:00 2001 From: Todd Date: Tue, 12 Sep 2023 17:05:49 -0400 Subject: [PATCH 07/21] Add WORKERFS support --- build/ffmpeg-wasm.sh | 1 + packages/ffmpeg/src/classes.ts | 37 +++++++++++++++++++++++++++- packages/ffmpeg/src/const.ts | 4 ++++ packages/ffmpeg/src/types.ts | 40 ++++++++++++++++++++++++------- packages/ffmpeg/src/worker.ts | 16 +++++++++++++ packages/types/types/index.d.ts | 3 +++ src/bind/ffmpeg/export-runtime.js | 3 +++ 7 files changed, 95 insertions(+), 9 deletions(-) diff --git a/build/ffmpeg-wasm.sh b/build/ffmpeg-wasm.sh index 7d4abd17d6a..0fe38f1c010 100755 --- a/build/ffmpeg-wasm.sh +++ b/build/ffmpeg-wasm.sh @@ -39,6 +39,7 @@ CONF_FLAGS=( -sEXPORT_NAME="$EXPORT_NAME" # required in browser env, so that user can access this module from window object -sEXPORTED_FUNCTIONS=$(node src/bind/ffmpeg/export.js) # exported functions -sEXPORTED_RUNTIME_METHODS=$(node src/bind/ffmpeg/export-runtime.js) # exported built-in functions + -lworkerfs.js --pre-js src/bind/ffmpeg/bind.js # extra bindings, contains most of the ffmpeg.wasm javascript code # ffmpeg source code src/fftools/cmdutils.c diff --git a/packages/ffmpeg/src/classes.ts b/packages/ffmpeg/src/classes.ts index e5927bc2e1a..75aaf2e693b 100644 --- a/packages/ffmpeg/src/classes.ts +++ b/packages/ffmpeg/src/classes.ts @@ -52,6 +52,8 @@ export class FFmpeg { this.loaded = true; this.#resolves[id](data); break; + case FFMessageType.MOUNT: + case FFMessageType.UNMOUNT: case FFMessageType.EXEC: case FFMessageType.WRITE_FILE: case FFMessageType.READ_FILE: @@ -171,7 +173,7 @@ export class FFmpeg { this.#worker = new Worker(config.workerLoadURL, { type: "module", }); - } + } this.#registerHandlers(); } return this.#send({ @@ -264,6 +266,39 @@ export class FFmpeg { ) as Promise; }; + public mount = (path: string, data: WorkerFSMountData): Promise => { + const trans: Transferable[] = []; + // TODO - handle transferables + if (data.blobs){ + for(let blob in data.blobs){ + trans.push(data.buffer); + } + } + if (data.files){ + for(let file in data.files){ + + } + } + return this.#send( + { + type: FFMessageType.MOUNT, + data: { path, data }, + }, + trans + ) as Promise; + }; + + public unmount = (path: string): Promise => { + const trans: Transferable[] = []; + return this.#send( + { + type: FFMessageType.UNMOUNT, + data: { path }, + }, + trans + ) as Promise; + }; + /** * Read data from ffmpeg.wasm. * diff --git a/packages/ffmpeg/src/const.ts b/packages/ffmpeg/src/const.ts index 119ad233259..67a5b7bc0e5 100644 --- a/packages/ffmpeg/src/const.ts +++ b/packages/ffmpeg/src/const.ts @@ -19,4 +19,8 @@ export enum FFMessageType { DOWNLOAD = "DOWNLOAD", PROGRESS = "PROGRESS", LOG = "LOG", + + MOUNT = "MOUNT", + UNMOUNT = "UNMOUNT", + FILESYSTEMS = "FILESYSTEMS", } diff --git a/packages/ffmpeg/src/types.ts b/packages/ffmpeg/src/types.ts index c06c5f9d717..91e65d4baea 100644 --- a/packages/ffmpeg/src/types.ts +++ b/packages/ffmpeg/src/types.ts @@ -22,12 +22,12 @@ export interface FFMessageLoadConfig { * @defaultValue `https://unpkg.com/@ffmpeg/core-mt@${CORE_VERSION}/dist/umd/ffmpeg-core.worker.js`; */ workerURL?: string; - /** - * `worker.js` URL. - * - * @defaultValue `new URL('./worker.js')`; - */ - workerLoadURL?: string; + /** + * `worker.js` URL. + * + * @defaultValue `new URL('./worker.js')`; + */ + workerLoadURL?: string; } export interface FFMessageExecData { @@ -70,6 +70,28 @@ export interface FFMessageDeleteDirData { path: FFFSPath; } +export type WorkerFSFileEntry = + | File; + +export interface WorkerFSBlobEntry { + name: string; + data: Blob; +} + +export interface WorkerFSMountData { + blobs?: WorkerFSBlobEntry[]; + files?: WorkerFSFileEntry[]; +} + +export interface FFMessageMountData { + path: FFFSPath; + data: WorkerFSMountData; +} + +export interface FFMessageUnmountData { + path: FFFSPath; +} + export type FFMessageData = | FFMessageLoadConfig | FFMessageExecData @@ -79,7 +101,9 @@ export type FFMessageData = | FFMessageRenameData | FFMessageCreateDirData | FFMessageListDirData - | FFMessageDeleteDirData; + | FFMessageDeleteDirData + | FFMessageMountData + | FFMessageUnmountData; export interface Message { type: string; @@ -140,4 +164,4 @@ export interface FFMessageEventCallback { type: string; data: CallbackData; }; -} +} \ No newline at end of file diff --git a/packages/ffmpeg/src/worker.ts b/packages/ffmpeg/src/worker.ts index 398bfa78cf5..572bd60b689 100644 --- a/packages/ffmpeg/src/worker.ts +++ b/packages/ffmpeg/src/worker.ts @@ -137,6 +137,16 @@ const deleteDir = ({ path }: FFMessageDeleteDirData): OK => { return true; }; +const mount = ({ path, data }: FFMessageMountData): OK => { + ffmpeg.FS.mount(ffmpeg.FS.WORKERFS, data, path); + return true; +}; + +const unmount = ({ path }: FFMessageUnmountData): OK => { + ffmpeg.FS.unmount(path); + return true; +}; + self.onmessage = async ({ data: { id, type, data: _data }, }: FFMessageEvent): Promise => { @@ -173,6 +183,12 @@ self.onmessage = async ({ case FFMessageType.DELETE_DIR: data = deleteDir(_data as FFMessageDeleteDirData); break; + case FFMessageType.MOUNT: + data = mount(_data as FFMessageMountData); + break; + case FFMessageType.UNMOUNT: + data = unmount(_data as FFMessageUnmountData); + break; default: throw ERROR_UNKNOWN_MESSAGE_TYPE; } diff --git a/packages/types/types/index.d.ts b/packages/types/types/index.d.ts index 368615fe3ef..f50b165c4cc 100644 --- a/packages/types/types/index.d.ts +++ b/packages/types/types/index.d.ts @@ -58,6 +58,9 @@ export interface FS { isFile: (mode: number) => boolean; /** mode is a numeric notation of permission, @see [Numeric Notation](https://en.wikipedia.org/wiki/File-system_permissions#Numeric_notation) */ isDir: (mode: number) => boolean; + mount: (fileSystemType: number, data: WorkerFSMountConfig, path: string) => void; + unmount: (path: string) => void; + WORKERFS: number; } /** diff --git a/src/bind/ffmpeg/export-runtime.js b/src/bind/ffmpeg/export-runtime.js index 7f74da369b6..56051cbc47f 100644 --- a/src/bind/ffmpeg/export-runtime.js +++ b/src/bind/ffmpeg/export-runtime.js @@ -1,5 +1,8 @@ const EXPORTED_RUNTIME_METHODS = [ "FS", + "FS_mount", + "FS_unmount", + "FS_filesystems", "setValue", "getValue", "UTF8ToString", From a484183f2a11fa1b3ca19345b7866505372bbe1c Mon Sep 17 00:00:00 2001 From: Todd Date: Tue, 12 Sep 2023 19:27:13 -0400 Subject: [PATCH 08/21] Imported WORKERFS types --- packages/ffmpeg/src/worker.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/ffmpeg/src/worker.ts b/packages/ffmpeg/src/worker.ts index 572bd60b689..cf2a9a97cf0 100644 --- a/packages/ffmpeg/src/worker.ts +++ b/packages/ffmpeg/src/worker.ts @@ -14,6 +14,8 @@ import type { FFMessageCreateDirData, FFMessageListDirData, FFMessageDeleteDirData, + FFMessageMountData, + FFMessageUnmountData, CallbackData, IsFirst, OK, From 9ac66da0239474e2ffff14d750aaf9b54ff82a5c Mon Sep 17 00:00:00 2001 From: Todd Date: Tue, 12 Sep 2023 19:31:34 -0400 Subject: [PATCH 09/21] Import WORKERFS types --- packages/ffmpeg/src/classes.ts | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/packages/ffmpeg/src/classes.ts b/packages/ffmpeg/src/classes.ts index 75aaf2e693b..14fe95d1f23 100644 --- a/packages/ffmpeg/src/classes.ts +++ b/packages/ffmpeg/src/classes.ts @@ -13,6 +13,7 @@ import { LogEventCallback, ProgressEventCallback, FileData, + WorkerFSMountData, } from "./types.js"; import { getMessageID } from "./utils.js"; import { ERROR_TERMINATED, ERROR_NOT_LOADED } from "./errors.js"; @@ -268,17 +269,6 @@ export class FFmpeg { public mount = (path: string, data: WorkerFSMountData): Promise => { const trans: Transferable[] = []; - // TODO - handle transferables - if (data.blobs){ - for(let blob in data.blobs){ - trans.push(data.buffer); - } - } - if (data.files){ - for(let file in data.files){ - - } - } return this.#send( { type: FFMessageType.MOUNT, From c106a6fe191e3f9f948886ad8093ec3b4c815112 Mon Sep 17 00:00:00 2001 From: Todd Date: Tue, 12 Sep 2023 20:11:37 -0400 Subject: [PATCH 10/21] Action update --- .github/workflows/CI.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 3628b4f9682..cb69b9584cb 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -91,6 +91,11 @@ jobs: uses: actions/upload-artifact@v3 with: name: ffmpeg - path: packages/ffmpeg/dist/* + path: packages/ffmpeg/dist/* + - name: Deploy packages 🚀 + uses: JamesIves/github-pages-deploy-action@v4 + with: + branch: latest-build # The branch the action should deploy to. + folder: packages # The folder the action should deploy. - name: Run tests run: npm test From 2bd0c29fb81ab6159c6814d4b80e42ed4d7fc47d Mon Sep 17 00:00:00 2001 From: Todd Date: Tue, 12 Sep 2023 21:04:05 -0400 Subject: [PATCH 11/21] Type updates --- .github/workflows/CI.yml | 7 +------ packages/ffmpeg/src/types.ts | 19 ++++++++++++++++++- packages/ffmpeg/src/worker.ts | 11 +++++++++-- packages/types/types/index.d.ts | 21 +++++++++++++++++++-- 4 files changed, 47 insertions(+), 11 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index cb69b9584cb..e8520fa8c55 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -91,11 +91,6 @@ jobs: uses: actions/upload-artifact@v3 with: name: ffmpeg - path: packages/ffmpeg/dist/* - - name: Deploy packages 🚀 - uses: JamesIves/github-pages-deploy-action@v4 - with: - branch: latest-build # The branch the action should deploy to. - folder: packages # The folder the action should deploy. + path: packages/ffmpeg/dist/* - name: Run tests run: npm test diff --git a/packages/ffmpeg/src/types.ts b/packages/ffmpeg/src/types.ts index 91e65d4baea..d3d316f8cb5 100644 --- a/packages/ffmpeg/src/types.ts +++ b/packages/ffmpeg/src/types.ts @@ -164,4 +164,21 @@ export interface FFMessageEventCallback { type: string; data: CallbackData; }; -} \ No newline at end of file +} + +// export type FSFilesystem = +// | FSFilesystemWORKERFS +// | FSFilesystemMEMFS; + +// export interface FSFilesystemWORKERFS { + +// } + +// export interface FSFilesystemMEMFS { + +// } + +// export interface FSFilesystems { +// WORKERFS?: FSFilesystemWORKERFS; +// MEMFS?: FSFilesystemMEMFS; +// } diff --git a/packages/ffmpeg/src/worker.ts b/packages/ffmpeg/src/worker.ts index cf2a9a97cf0..c1cda8d0b7a 100644 --- a/packages/ffmpeg/src/worker.ts +++ b/packages/ffmpeg/src/worker.ts @@ -2,7 +2,14 @@ /// /// -import type { FFmpegCoreModule, FFmpegCoreModuleFactory } from "@ffmpeg/types"; +import type { + FFmpegCoreModule, + FFmpegCoreModuleFactory, + FSFilesystem, + FSFilesystemWORKERFS, + FSFilesystemMEMFS, + FSFilesystems, +} from "@ffmpeg/types"; import type { FFMessageEvent, FFMessageLoadConfig, @@ -140,7 +147,7 @@ const deleteDir = ({ path }: FFMessageDeleteDirData): OK => { }; const mount = ({ path, data }: FFMessageMountData): OK => { - ffmpeg.FS.mount(ffmpeg.FS.WORKERFS, data, path); + ffmpeg.FS.mount(ffmpeg.FS.filesystems.WORKERFS, data, path); return true; }; diff --git a/packages/types/types/index.d.ts b/packages/types/types/index.d.ts index f50b165c4cc..00b0452de42 100644 --- a/packages/types/types/index.d.ts +++ b/packages/types/types/index.d.ts @@ -39,6 +39,23 @@ export interface Stat { blocks: number; } +export interface FSFilesystemWORKERFS { + +} + +export interface FSFilesystemMEMFS { + +} + +export interface FSFilesystems { + WORKERFS: FSFilesystemWORKERFS; + MEMFS: FSFilesystemMEMFS; +} + +export type FSFilesystem = +| FSFilesystemWORKERFS +| FSFilesystemMEMFS; + /** * Functions to interact with Emscripten FS library. * @@ -58,9 +75,9 @@ export interface FS { isFile: (mode: number) => boolean; /** mode is a numeric notation of permission, @see [Numeric Notation](https://en.wikipedia.org/wiki/File-system_permissions#Numeric_notation) */ isDir: (mode: number) => boolean; - mount: (fileSystemType: number, data: WorkerFSMountConfig, path: string) => void; + mount: (fileSystemType: FSFilesystemWORKERFS, data: WorkerFSMountConfig, path: string) => void; unmount: (path: string) => void; - WORKERFS: number; + filesystems: FSFilesystems; } /** From c7ab0f97356186af087e72c013b06c28dcf78ca3 Mon Sep 17 00:00:00 2001 From: Todd Date: Tue, 12 Sep 2023 21:49:04 -0400 Subject: [PATCH 12/21] Export update --- src/bind/ffmpeg/export-runtime.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/bind/ffmpeg/export-runtime.js b/src/bind/ffmpeg/export-runtime.js index 56051cbc47f..7f74da369b6 100644 --- a/src/bind/ffmpeg/export-runtime.js +++ b/src/bind/ffmpeg/export-runtime.js @@ -1,8 +1,5 @@ const EXPORTED_RUNTIME_METHODS = [ "FS", - "FS_mount", - "FS_unmount", - "FS_filesystems", "setValue", "getValue", "UTF8ToString", From 718816af01660c4101feb0db231366607ecf47a7 Mon Sep 17 00:00:00 2001 From: Todd Date: Tue, 12 Sep 2023 22:21:58 -0400 Subject: [PATCH 13/21] Updated classes --- packages/ffmpeg/src/classes.ts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/ffmpeg/src/classes.ts b/packages/ffmpeg/src/classes.ts index 14fe95d1f23..d845690b8f7 100644 --- a/packages/ffmpeg/src/classes.ts +++ b/packages/ffmpeg/src/classes.ts @@ -166,14 +166,10 @@ export class FFmpeg { */ public load = (config: FFMessageLoadConfig = {}): Promise => { if (!this.#worker) { - if (!config.workerLoadURL) { - this.#worker = new Worker(new URL("./worker.js", import.meta.url), { - type: "module", - }); + if (config.workerLoadURL) { + this.#worker = new Worker(config.workerLoadURL); } else { - this.#worker = new Worker(config.workerLoadURL, { - type: "module", - }); + this.#worker = new Worker(new URL("./worker.js", import.meta.url)); } this.#registerHandlers(); } From 69d6a3bf1a80ae6bbe7ea58b8589a6b795c65195 Mon Sep 17 00:00:00 2001 From: Todd Date: Tue, 12 Sep 2023 22:31:48 -0400 Subject: [PATCH 14/21] Package together workflow update --- .github/workflows/CI.yml | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index e8520fa8c55..29d529b9b81 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -91,6 +91,23 @@ jobs: uses: actions/upload-artifact@v3 with: name: ffmpeg - path: packages/ffmpeg/dist/* + path: packages/ffmpeg/dist/* + + - name: Unify ffmpeg-umd dist package + run: | + mkdir umd + mkdir umd/ffmpeg + mkdir umd/core + mkdir umd/core-mt + cp packages/ffmpeg/dist/umd/* umd/ffmpeg/ + cp packages/core/dist/umd/* umd/core/ + cp packages/core-mt/dist/umd/* umd/core-mt/ + + - name: Upload ffmpeg-umd + uses: actions/upload-artifact@v3 + with: + name: ffmpeg-umd + path: umd/* + - name: Run tests run: npm test From 71ac16f8c43fedcee8497df5322460a4efc158fe Mon Sep 17 00:00:00 2001 From: Todd Date: Tue, 12 Sep 2023 23:09:31 -0400 Subject: [PATCH 15/21] Cleanup --- packages/ffmpeg/src/const.ts | 1 - packages/ffmpeg/src/types.ts | 19 +------------------ packages/ffmpeg/src/worker.ts | 9 +-------- packages/types/types/index.d.ts | 2 +- 4 files changed, 3 insertions(+), 28 deletions(-) diff --git a/packages/ffmpeg/src/const.ts b/packages/ffmpeg/src/const.ts index 67a5b7bc0e5..a6ad49b0070 100644 --- a/packages/ffmpeg/src/const.ts +++ b/packages/ffmpeg/src/const.ts @@ -19,7 +19,6 @@ export enum FFMessageType { DOWNLOAD = "DOWNLOAD", PROGRESS = "PROGRESS", LOG = "LOG", - MOUNT = "MOUNT", UNMOUNT = "UNMOUNT", FILESYSTEMS = "FILESYSTEMS", diff --git a/packages/ffmpeg/src/types.ts b/packages/ffmpeg/src/types.ts index d3d316f8cb5..91e65d4baea 100644 --- a/packages/ffmpeg/src/types.ts +++ b/packages/ffmpeg/src/types.ts @@ -164,21 +164,4 @@ export interface FFMessageEventCallback { type: string; data: CallbackData; }; -} - -// export type FSFilesystem = -// | FSFilesystemWORKERFS -// | FSFilesystemMEMFS; - -// export interface FSFilesystemWORKERFS { - -// } - -// export interface FSFilesystemMEMFS { - -// } - -// export interface FSFilesystems { -// WORKERFS?: FSFilesystemWORKERFS; -// MEMFS?: FSFilesystemMEMFS; -// } +} \ No newline at end of file diff --git a/packages/ffmpeg/src/worker.ts b/packages/ffmpeg/src/worker.ts index c1cda8d0b7a..8a9584e9a52 100644 --- a/packages/ffmpeg/src/worker.ts +++ b/packages/ffmpeg/src/worker.ts @@ -2,14 +2,7 @@ /// /// -import type { - FFmpegCoreModule, - FFmpegCoreModuleFactory, - FSFilesystem, - FSFilesystemWORKERFS, - FSFilesystemMEMFS, - FSFilesystems, -} from "@ffmpeg/types"; +import type { FFmpegCoreModule, FFmpegCoreModuleFactory } from "@ffmpeg/types"; import type { FFMessageEvent, FFMessageLoadConfig, diff --git a/packages/types/types/index.d.ts b/packages/types/types/index.d.ts index 00b0452de42..d3cd4fbe8ac 100644 --- a/packages/types/types/index.d.ts +++ b/packages/types/types/index.d.ts @@ -75,7 +75,7 @@ export interface FS { isFile: (mode: number) => boolean; /** mode is a numeric notation of permission, @see [Numeric Notation](https://en.wikipedia.org/wiki/File-system_permissions#Numeric_notation) */ isDir: (mode: number) => boolean; - mount: (fileSystemType: FSFilesystemWORKERFS, data: WorkerFSMountConfig, path: string) => void; + mount: (fileSystemType: FSFilesystem, data: WorkerFSMountConfig, path: string) => void; unmount: (path: string) => void; filesystems: FSFilesystems; } From c9684ee25899805ea2612afbd9acea85ca33eeb5 Mon Sep 17 00:00:00 2001 From: Todd T <21184383+LostBeard@users.noreply.github.com> Date: Tue, 12 Sep 2023 23:23:24 -0400 Subject: [PATCH 16/21] Restore CI.yml to upstream --- .github/workflows/CI.yml | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 29d529b9b81..5417a20ec33 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -45,6 +45,7 @@ jobs: uses: actions/cache@v3 with: path: build-cache-mt + key: build-cache-mt-v1-${{ hashFiles('Dockerfile', 'Makefile', 'build/*') }} restore-keys: | build-cache-v1- @@ -82,32 +83,11 @@ jobs: uses: actions/cache@v3 with: path: node_modules + key: node-modules-${{ hashFiles('package-lock.json') }} restore-keys: | node-modules- - name: Install dependencies run: npm install - - name: Upload ffmpeg - uses: actions/upload-artifact@v3 - with: - name: ffmpeg - path: packages/ffmpeg/dist/* - - - name: Unify ffmpeg-umd dist package - run: | - mkdir umd - mkdir umd/ffmpeg - mkdir umd/core - mkdir umd/core-mt - cp packages/ffmpeg/dist/umd/* umd/ffmpeg/ - cp packages/core/dist/umd/* umd/core/ - cp packages/core-mt/dist/umd/* umd/core-mt/ - - - name: Upload ffmpeg-umd - uses: actions/upload-artifact@v3 - with: - name: ffmpeg-umd - path: umd/* - - name: Run tests run: npm test From 2d289cc7844001914bdb3b6cf736795238ffd915 Mon Sep 17 00:00:00 2001 From: Todd T <21184383+LostBeard@users.noreply.github.com> Date: Tue, 12 Sep 2023 23:24:00 -0400 Subject: [PATCH 17/21] Restore README.md to upstream --- README.md | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 9818857f62d..af80f05e3ca 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,34 @@ - - -# Fork of [ffmpeg.wasm](https://github.com/ffmpegwasm/ffmpeg.wasm) - -Forked to test customization of ffmpeg-core including adding [WORKERFS](https://emscripten.org/docs/api_reference/Filesystem-API.html#filesystem-api-workerfs) to enable the use of large files. -

ffmpeg.wasm

+# ffmpeg.wasm + +ffmpeg.wasm is a pure Webassembly / Javascript port of FFmpeg. It enables video & audio record, convert and stream right inside browsers. + +[![stability-experimental](https://img.shields.io/badge/stability-experimental-orange.svg)](https://github.com/emersion/stability-badges#experimental) +[![Node Version](https://img.shields.io/node/v/@ffmpeg/ffmpeg.svg)](https://img.shields.io/node/v/@ffmpeg/ffmpeg.svg) +[![Actions Status](https://github.com/ffmpegwasm/ffmpeg.wasm/workflows/CI/badge.svg)](https://github.com/ffmpegwasm/ffmpeg.wasm/actions) +![npm (tag)](https://img.shields.io/npm/v/@ffmpeg/ffmpeg/latest) +[![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://github.com/ffmpegwasm/ffmpeg.wasm/graphs/commit-activity) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) +[![Downloads Total](https://img.shields.io/npm/dt/@ffmpeg/ffmpeg.svg)](https://www.npmjs.com/package/@ffmpeg/ffmpeg) +[![Downloads Month](https://img.shields.io/npm/dm/@ffmpeg/ffmpeg.svg)](https://www.npmjs.com/package/@ffmpeg/ffmpeg) +[![Netlify Status](https://api.netlify.com/api/v1/badges/1943b6d3-45ad-4b46-bfba-cb8d5716604c/deploy-status)](https://app.netlify.com/sites/ffmpegwasm/deploys) + +Join us on Discord! + +[![Discord](https://dcbadge.vercel.app/api/server/NjGMaqqfm5)](https://discord.gg/NjGMaqqfm5) + +## Documentation + +- [Introduction](https://ffmpegwasm.netlify.app/docs/overview) +- [Getting + Started](https://ffmpegwasm.netlify.app/docs/getting-started/installation) +- [API](https://ffmpegwasm.netlify.app/docs/api/ffmpeg/) +- [FAQ](https://ffmpegwasm.netlify.app/docs/faq) +- [Contribution](https://ffmpegwasm.netlify.app/docs/contribution/core) +Please sponsor ffmpeg.wasm to make it sustainable. :heart: From ebe336b310c9919dac84d59be427f5e0621107a9 Mon Sep 17 00:00:00 2001 From: Todd T <21184383+LostBeard@users.noreply.github.com> Date: Tue, 12 Sep 2023 23:40:27 -0400 Subject: [PATCH 18/21] Restore classes.ts changes that are not related tp WORKERFS --- packages/ffmpeg/src/classes.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/ffmpeg/src/classes.ts b/packages/ffmpeg/src/classes.ts index d845690b8f7..75899a46a00 100644 --- a/packages/ffmpeg/src/classes.ts +++ b/packages/ffmpeg/src/classes.ts @@ -166,11 +166,9 @@ export class FFmpeg { */ public load = (config: FFMessageLoadConfig = {}): Promise => { if (!this.#worker) { - if (config.workerLoadURL) { - this.#worker = new Worker(config.workerLoadURL); - } else { - this.#worker = new Worker(new URL("./worker.js", import.meta.url)); - } + this.#worker = new Worker(new URL("./worker.js", import.meta.url), { + type: "module", + }); this.#registerHandlers(); } return this.#send({ From 707f6455816e7497e91708b6c0dfc7e394a72f85 Mon Sep 17 00:00:00 2001 From: Todd T <21184383+LostBeard@users.noreply.github.com> Date: Tue, 12 Sep 2023 23:52:47 -0400 Subject: [PATCH 19/21] Restore types.ts changes unrelated to WORERFS --- packages/ffmpeg/src/types.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/packages/ffmpeg/src/types.ts b/packages/ffmpeg/src/types.ts index 91e65d4baea..7b4e3eb7ea9 100644 --- a/packages/ffmpeg/src/types.ts +++ b/packages/ffmpeg/src/types.ts @@ -22,12 +22,6 @@ export interface FFMessageLoadConfig { * @defaultValue `https://unpkg.com/@ffmpeg/core-mt@${CORE_VERSION}/dist/umd/ffmpeg-core.worker.js`; */ workerURL?: string; - /** - * `worker.js` URL. - * - * @defaultValue `new URL('./worker.js')`; - */ - workerLoadURL?: string; } export interface FFMessageExecData { @@ -164,4 +158,4 @@ export interface FFMessageEventCallback { type: string; data: CallbackData; }; -} \ No newline at end of file +} From c95f308ccb16f4e1b0469204e692f2cdfc9f0a76 Mon Sep 17 00:00:00 2001 From: Todd T <21184383+LostBeard@users.noreply.github.com> Date: Tue, 12 Sep 2023 23:54:29 -0400 Subject: [PATCH 20/21] Restore const.ts changes unrelated to WORKERFS --- packages/ffmpeg/src/const.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/ffmpeg/src/const.ts b/packages/ffmpeg/src/const.ts index a6ad49b0070..2811ae22d6d 100644 --- a/packages/ffmpeg/src/const.ts +++ b/packages/ffmpeg/src/const.ts @@ -21,5 +21,4 @@ export enum FFMessageType { LOG = "LOG", MOUNT = "MOUNT", UNMOUNT = "UNMOUNT", - FILESYSTEMS = "FILESYSTEMS", } From 0a03d39fa7251b840df89aa2f0f8747fab2f5a61 Mon Sep 17 00:00:00 2001 From: Todd Date: Wed, 13 Sep 2023 10:38:35 -0400 Subject: [PATCH 21/21] Updated mount to support any enabled filesystems. --- packages/ffmpeg/src/classes.ts | 11 +++++++---- packages/ffmpeg/src/const.ts | 2 +- packages/ffmpeg/src/types.ts | 21 +++++++++++++++++---- packages/ffmpeg/src/worker.ts | 11 +++++++---- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/packages/ffmpeg/src/classes.ts b/packages/ffmpeg/src/classes.ts index 75899a46a00..bdb7130ce70 100644 --- a/packages/ffmpeg/src/classes.ts +++ b/packages/ffmpeg/src/classes.ts @@ -14,6 +14,9 @@ import { ProgressEventCallback, FileData, WorkerFSMountData, + FFFSType, + FFFSMountOptions, + FFFSPath, } from "./types.js"; import { getMessageID } from "./utils.js"; import { ERROR_TERMINATED, ERROR_NOT_LOADED } from "./errors.js"; @@ -261,23 +264,23 @@ export class FFmpeg { ) as Promise; }; - public mount = (path: string, data: WorkerFSMountData): Promise => { + public mount = (fsType: FFFSType, options: FFFSMountOptions, mountPoint: FFFSPath, ): Promise => { const trans: Transferable[] = []; return this.#send( { type: FFMessageType.MOUNT, - data: { path, data }, + data: { fsType, options, mountPoint }, }, trans ) as Promise; }; - public unmount = (path: string): Promise => { + public unmount = (mountPoint: FFFSPath): Promise => { const trans: Transferable[] = []; return this.#send( { type: FFMessageType.UNMOUNT, - data: { path }, + data: { mountPoint }, }, trans ) as Promise; diff --git a/packages/ffmpeg/src/const.ts b/packages/ffmpeg/src/const.ts index 2811ae22d6d..65b03a8fd7d 100644 --- a/packages/ffmpeg/src/const.ts +++ b/packages/ffmpeg/src/const.ts @@ -21,4 +21,4 @@ export enum FFMessageType { LOG = "LOG", MOUNT = "MOUNT", UNMOUNT = "UNMOUNT", -} +} \ No newline at end of file diff --git a/packages/ffmpeg/src/types.ts b/packages/ffmpeg/src/types.ts index 7b4e3eb7ea9..45aef3fee3f 100644 --- a/packages/ffmpeg/src/types.ts +++ b/packages/ffmpeg/src/types.ts @@ -64,6 +64,15 @@ export interface FFMessageDeleteDirData { path: FFFSPath; } +export enum FFFSType { + MEMFS = "MEMFS", + NODEFS = "NODEFS", + NODERAWFS = "NODERAWFS", + IDBFS = "IDBFS", + WORKERFS = "WORKERFS", + PROXYFS = "PROXYFS", +} + export type WorkerFSFileEntry = | File; @@ -77,13 +86,17 @@ export interface WorkerFSMountData { files?: WorkerFSFileEntry[]; } +export type FFFSMountOptions = + | WorkerFSMountData; + export interface FFMessageMountData { - path: FFFSPath; - data: WorkerFSMountData; + fsType: FFFSType; + options: FFFSMountOptions; + mountPoint: FFFSPath; } export interface FFMessageUnmountData { - path: FFFSPath; + mountPoint: FFFSPath; } export type FFMessageData = @@ -158,4 +171,4 @@ export interface FFMessageEventCallback { type: string; data: CallbackData; }; -} +} \ No newline at end of file diff --git a/packages/ffmpeg/src/worker.ts b/packages/ffmpeg/src/worker.ts index 8a9584e9a52..446e866d11b 100644 --- a/packages/ffmpeg/src/worker.ts +++ b/packages/ffmpeg/src/worker.ts @@ -139,13 +139,16 @@ const deleteDir = ({ path }: FFMessageDeleteDirData): OK => { return true; }; -const mount = ({ path, data }: FFMessageMountData): OK => { - ffmpeg.FS.mount(ffmpeg.FS.filesystems.WORKERFS, data, path); +const mount = ({ fsType, options, mountPoint }: FFMessageMountData): OK => { + let str = fsType as keyof typeof ffmpeg.FS.filesystems; + let fs = ffmpeg.FS.filesystems[str]; + if (!fs) return false; + ffmpeg.FS.mount(fs, options, mountPoint); return true; }; -const unmount = ({ path }: FFMessageUnmountData): OK => { - ffmpeg.FS.unmount(path); +const unmount = ({ mountPoint }: FFMessageUnmountData): OK => { + ffmpeg.FS.unmount(mountPoint); return true; };