From e8162f483f02e0ad5c2a7fefdd79f217c2c35194 Mon Sep 17 00:00:00 2001
From: Vanilagy <1696106+Vanilagy@users.noreply.github.com>
Date: Sat, 15 Aug 2026 17:50:47 +0200
Subject: [PATCH] Add @mediabunny/dts extension package
---
.github/workflows/release.yml | 5 +
.gitignore | 1 +
docs/.vitepress/config.mts | 1 +
docs/api-config.json | 1 +
docs/codec-registry/dts.md | 2 +-
docs/guide/extensions/dts.md | 37 ++
docs/guide/supported-formats-and-codecs.md | 2 +-
examples/file-compression/file-compression.ts | 2 +
examples/hls-transcoding/hls-transcoding.ts | 2 +
examples/media-player/media-player.ts | 2 +
.../thumbnail-generation.ts | 2 +
package-lock.json | 19 +
package.json | 2 +-
packages/aac-encoder/package.json | 2 +-
packages/ac3/package.json | 2 +-
packages/dts/.gitattributes | 1 +
packages/dts/LICENSE | 373 ++++++++++++++++++
packages/dts/README.md | 106 +++++
packages/dts/api-extractor.json | 37 ++
packages/dts/build/dts.js | Bin 0 -> 927592 bytes
packages/dts/package.json | 59 +++
packages/dts/src/bridge.c | 321 +++++++++++++++
packages/dts/src/codec.worker.ts | 306 ++++++++++++++
packages/dts/src/decoder.ts | 80 ++++
packages/dts/src/encoder.ts | 197 +++++++++
packages/dts/src/index.ts | 23 ++
packages/dts/src/shared.ts | 100 +++++
packages/dts/src/worker-client.ts | 109 +++++
packages/dts/tsconfig.json | 24 ++
packages/dts/tsdoc.json | 4 +
packages/server/src/audio-encoder.ts | 23 +-
scripts/build.sh | 5 +
scripts/bundle.ts | 32 ++
scripts/check.sh | 3 +
scripts/ensure-license-headers.ts | 1 +
shared/dts-misc.ts | 33 ++
src/media-sink.ts | 14 +-
test/browser/mpeg-ts-muxing.test.ts | 2 +-
test/node/dts.test.ts | 236 +++++++++++
vite.config.ts | 2 +
40 files changed, 2142 insertions(+), 31 deletions(-)
create mode 100644 docs/guide/extensions/dts.md
create mode 100644 packages/dts/.gitattributes
create mode 100644 packages/dts/LICENSE
create mode 100644 packages/dts/README.md
create mode 100644 packages/dts/api-extractor.json
create mode 100644 packages/dts/build/dts.js
create mode 100644 packages/dts/package.json
create mode 100644 packages/dts/src/bridge.c
create mode 100644 packages/dts/src/codec.worker.ts
create mode 100644 packages/dts/src/decoder.ts
create mode 100644 packages/dts/src/encoder.ts
create mode 100644 packages/dts/src/index.ts
create mode 100644 packages/dts/src/shared.ts
create mode 100644 packages/dts/src/worker-client.ts
create mode 100644 packages/dts/tsconfig.json
create mode 100644 packages/dts/tsdoc.json
create mode 100644 shared/dts-misc.ts
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 744c4a1..550b77c 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -75,6 +75,11 @@ jobs:
packages/ac3/dist/bundles/mediabunny-ac3.mjs
packages/ac3/dist/bundles/mediabunny-ac3.min.mjs
packages/ac3/dist/mediabunny-ac3.d.ts
+ packages/dts/dist/bundles/mediabunny-dts.js
+ packages/dts/dist/bundles/mediabunny-dts.min.js
+ packages/dts/dist/bundles/mediabunny-dts.mjs
+ packages/dts/dist/bundles/mediabunny-dts.min.mjs
+ packages/dts/dist/mediabunny-dts.d.ts
packages/aac-encoder/dist/bundles/mediabunny-aac-encoder.js
packages/aac-encoder/dist/bundles/mediabunny-aac-encoder.min.js
packages/aac-encoder/dist/bundles/mediabunny-aac-encoder.mjs
diff --git a/.gitignore b/.gitignore
index 30c66a0..8546073 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,6 +8,7 @@ node_modules
packages/mp3-encoder/dist
packages/ac3/dist
+packages/dts/dist
packages/aac-encoder/dist
packages/flac-encoder/dist
packages/server/dist
diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts
index 9720265..24dbe67 100644
--- a/docs/.vitepress/config.mts
+++ b/docs/.vitepress/config.mts
@@ -125,6 +125,7 @@ export default withMermaid({
{ text: 'mp3-encoder', link: '/guide/extensions/mp3-encoder' },
{ text: 'aac-encoder', link: '/guide/extensions/aac-encoder' },
{ text: 'ac3', link: '/guide/extensions/ac3' },
+ { text: 'dts', link: '/guide/extensions/dts' },
{ text: 'flac-encoder', link: '/guide/extensions/flac-encoder' },
{ text: 'prores', link: '/guide/extensions/prores' },
],
diff --git a/docs/api-config.json b/docs/api-config.json
index b56656e..39b9878 100644
--- a/docs/api-config.json
+++ b/docs/api-config.json
@@ -25,6 +25,7 @@
"@mediabunny/server": "Adds full video/audio decoder and encoder support to Mediabunny running in server-side environments such as Node, Bun, or Deno.",
"@mediabunny/mp3-encoder": "Adds MP3 encoder support to Mediabunny.",
"@mediabunny/ac3": "Adds AC-3/E-AC-3 decoder and encoder support to Mediabunny.",
+ "@mediabunny/dts": "Adds DTS decoder and encoder support to Mediabunny.",
"@mediabunny/aac-encoder": "Polyfills AAC encoder support to Mediabunny.",
"@mediabunny/flac-encoder": "Adds FLAC encoder support to Mediabunny.",
"@mediabunny/prores": "Adds Apple ProRes decoder support to Mediabunny."
diff --git a/docs/codec-registry/dts.md b/docs/codec-registry/dts.md
index 3f0d5b6..88ef8b2 100644
--- a/docs/codec-registry/dts.md
+++ b/docs/codec-registry/dts.md
@@ -1,5 +1,5 @@
---
-description: DTS (DTS Coherent Acoustics) audio codec definition, defining legal codec strings, decoder configs, and packet data formats.
+description: DTS audio codec definition, defining legal codec strings, decoder configs, and packet data formats.
---
+
+```
+
+This will expose the global objects `Mediabunny` and `MediabunnyDts`. Use `mediabunny-dts.d.ts` to provide types for these globals. You can download the built distribution files from the [releases page](https://github.com/Vanilagy/mediabunny/releases).
+
+## Usage
+
+```ts
+import { registerDtsDecoder, registerDtsEncoder } from '@mediabunny/dts';
+
+registerDtsDecoder();
+registerDtsEncoder();
+```
+That's it - Mediabunny now uses the registered DTS decoder and encoder automatically.
diff --git a/docs/guide/supported-formats-and-codecs.md b/docs/guide/supported-formats-and-codecs.md
index 6158de2..bc4c537 100644
--- a/docs/guide/supported-formats-and-codecs.md
+++ b/docs/guide/supported-formats-and-codecs.md
@@ -114,7 +114,7 @@ For HLS, the supported codecs depend on the segment format chosen.
[^mp3]: MP3 encoding is not supported by WebCodecs. You can polyfill it with the [`@mediabunny/mp3-encoder`](./extensions/mp3-encoder) extension package.
[^flac]: FLAC encoding is not supported by WebCodecs. You can polyfill it with the [`@mediabunny/flac-encoder`](./extensions/flac-encoder) extension package.
[^ac3]: AC-3 and E-AC-3 are not natively supported by WebCodecs. To encode or decode these codecs, you can use the [`@mediabunny/ac3`](./extensions/ac3) extension package.
-[^dts]: DTS is not supported by WebCodecs. The [`@mediabunny/server`](./extensions/server) extension package provides both decoding and encoding support for server-side environments.
+[^dts]: DTS is not natively supported by WebCodecs. To encode or decode it, you can use the [`@mediabunny/dts`](./extensions/dts) extension package.
[^webm]: WebM only supports a small subset of the codecs supported by Matroska. However, this library can technically read all codecs from a WebM that are supported by Matroska.
[^webvtt]: WebVTT can only be written, not read.
diff --git a/examples/file-compression/file-compression.ts b/examples/file-compression/file-compression.ts
index 5f9370b..cba16e8 100644
--- a/examples/file-compression/file-compression.ts
+++ b/examples/file-compression/file-compression.ts
@@ -10,12 +10,14 @@ import {
UrlSource,
} from 'mediabunny';
import { registerAc3Decoder } from '@mediabunny/ac3';
+import { registerDtsDecoder } from '@mediabunny/dts';
import { registerProresDecoder } from '@mediabunny/prores';
import SampleFileUrl from '../../docs/assets/big-buck-bunny-trimmed.mp4';
// Enable codecs that aren't natively supported by WebCodecs.
registerAc3Decoder();
+registerDtsDecoder();
registerProresDecoder();
(document.querySelector('#sample-file-download') as HTMLAnchorElement).href = SampleFileUrl;
diff --git a/examples/hls-transcoding/hls-transcoding.ts b/examples/hls-transcoding/hls-transcoding.ts
index fc13c1d..a85fdde 100644
--- a/examples/hls-transcoding/hls-transcoding.ts
+++ b/examples/hls-transcoding/hls-transcoding.ts
@@ -12,12 +12,14 @@ import {
UrlSource,
} from 'mediabunny';
import { registerAc3Decoder } from '@mediabunny/ac3';
+import { registerDtsDecoder } from '@mediabunny/dts';
import { registerProresDecoder } from '@mediabunny/prores';
import SampleFileUrl from '../../docs/assets/big-buck-bunny-trimmed.mp4';
// Enable codecs that aren't natively supported by WebCodecs.
registerAc3Decoder();
+registerDtsDecoder();
registerProresDecoder();
(document.querySelector('#sample-file-download') as HTMLAnchorElement).href = SampleFileUrl;
diff --git a/examples/media-player/media-player.ts b/examples/media-player/media-player.ts
index 6d851e2..1572163 100644
--- a/examples/media-player/media-player.ts
+++ b/examples/media-player/media-player.ts
@@ -9,12 +9,14 @@ import {
WrappedCanvas,
} from 'mediabunny';
import { registerAc3Decoder } from '@mediabunny/ac3';
+import { registerDtsDecoder } from '@mediabunny/dts';
import { registerProresDecoder } from '@mediabunny/prores';
import SampleFileUrl from '../../docs/assets/big-buck-bunny-trimmed.mp4';
// Enable codecs that aren't natively supported by WebCodecs.
registerAc3Decoder();
+registerDtsDecoder();
registerProresDecoder();
(document.querySelector('#sample-file-download') as HTMLAnchorElement).href = SampleFileUrl;
diff --git a/examples/thumbnail-generation/thumbnail-generation.ts b/examples/thumbnail-generation/thumbnail-generation.ts
index 69a995a..7add9bc 100644
--- a/examples/thumbnail-generation/thumbnail-generation.ts
+++ b/examples/thumbnail-generation/thumbnail-generation.ts
@@ -1,11 +1,13 @@
import { Input, ALL_FORMATS, BlobSource, UrlSource, CanvasSink } from 'mediabunny';
import { registerAc3Decoder } from '@mediabunny/ac3';
+import { registerDtsDecoder } from '@mediabunny/dts';
import { registerProresDecoder } from '@mediabunny/prores';
import SampleFileUrl from '../../docs/assets/big-buck-bunny-trimmed.mp4';
// Enable codecs that aren't natively supported by WebCodecs.
registerAc3Decoder();
+registerDtsDecoder();
registerProresDecoder();
(document.querySelector('#sample-file-download') as HTMLAnchorElement).href = SampleFileUrl;
diff --git a/package-lock.json b/package-lock.json
index e8a6e4e..63832d0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1453,6 +1453,10 @@
"resolved": "packages/ac3",
"link": true
},
+ "node_modules/@mediabunny/dts": {
+ "resolved": "packages/dts",
+ "link": true
+ },
"node_modules/@mediabunny/flac-encoder": {
"resolved": "packages/flac-encoder",
"link": true
@@ -12982,6 +12986,21 @@
"mediabunny": "^1.0.0"
}
},
+ "packages/dts": {
+ "name": "@mediabunny/dts",
+ "version": "1.54.0",
+ "license": "MPL-2.0",
+ "devDependencies": {
+ "@types/emscripten": "^1.40.1"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://github.com/sponsors/Vanilagy"
+ },
+ "peerDependencies": {
+ "mediabunny": "^1.0.0"
+ }
+ },
"packages/flac-encoder": {
"name": "@mediabunny/flac-encoder",
"version": "1.54.0",
diff --git a/package.json b/package.json
index b3ea4ae..651137d 100644
--- a/package.json
+++ b/package.json
@@ -51,7 +51,7 @@
"docs:dev": "vitepress dev docs",
"docs:build": "npm run build && npm run docs:generate && vitepress build docs && npm run examples:build && cp dist/mediabunny.d.ts dist-docs/",
"docs:preview": "vitepress preview docs",
- "docs:generate": "tsx scripts/generate-api-docs.ts src/index.ts packages/mp3-encoder/src/index.ts packages/ac3/src/index.ts packages/aac-encoder/src/index.ts packages/flac-encoder/src/index.ts packages/prores/src/index.ts packages/server/src/index.ts docs/api-config.json",
+ "docs:generate": "tsx scripts/generate-api-docs.ts src/index.ts packages/mp3-encoder/src/index.ts packages/ac3/src/index.ts packages/dts/src/index.ts packages/aac-encoder/src/index.ts packages/flac-encoder/src/index.ts packages/prores/src/index.ts packages/server/src/index.ts docs/api-config.json",
"dev": "vite",
"examples:build": "vite build",
"fix-build-import-paths": "tsx scripts/add-import-extensions.ts",
diff --git a/packages/aac-encoder/package.json b/packages/aac-encoder/package.json
index 0efade3..4cf829a 100644
--- a/packages/aac-encoder/package.json
+++ b/packages/aac-encoder/package.json
@@ -2,7 +2,7 @@
"name": "@mediabunny/aac-encoder",
"author": "Vanilagy",
"version": "1.54.0",
- "description": "AAC encoder extension for Mediabunny, based on FFmpeg.",
+ "description": "AAC encoder extension for Mediabunny, based on libavcodec.",
"main": "./dist/bundles/mediabunny-aac-encoder.mjs",
"module": "./dist/bundles/mediabunny-aac-encoder.mjs",
"types": "./dist/modules/src/index.d.ts",
diff --git a/packages/ac3/package.json b/packages/ac3/package.json
index eb7be18..2b2fbe6 100644
--- a/packages/ac3/package.json
+++ b/packages/ac3/package.json
@@ -2,7 +2,7 @@
"name": "@mediabunny/ac3",
"author": "Vanilagy",
"version": "1.54.0",
- "description": "AC-3 and E-AC-3 (Dolby Digital) decoder and encoder extension for Mediabunny, based on FFmpeg.",
+ "description": "AC-3 and E-AC-3 (Dolby Digital) decoder and encoder extension for Mediabunny, based on libavcodec.",
"main": "./dist/bundles/mediabunny-ac3.mjs",
"module": "./dist/bundles/mediabunny-ac3.mjs",
"types": "./dist/modules/src/index.d.ts",
diff --git a/packages/dts/.gitattributes b/packages/dts/.gitattributes
new file mode 100644
index 0000000..72ef19a
--- /dev/null
+++ b/packages/dts/.gitattributes
@@ -0,0 +1 @@
+build/* linguist-generated
diff --git a/packages/dts/LICENSE b/packages/dts/LICENSE
new file mode 100644
index 0000000..d0a1fa1
--- /dev/null
+++ b/packages/dts/LICENSE
@@ -0,0 +1,373 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+ means each individual or legal entity that creates, contributes to
+ the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+ means the combination of the Contributions of others (if any) used
+ by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+ means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+ means Source Code Form to which the initial Contributor has attached
+ the notice in Exhibit A, the Executable Form of such Source Code
+ Form, and Modifications of such Source Code Form, in each case
+ including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+ means
+
+ (a) that the initial Contributor has attached the notice described
+ in Exhibit B to the Covered Software; or
+
+ (b) that the Covered Software was made available under the terms of
+ version 1.1 or earlier of the License, but not also under the
+ terms of a Secondary License.
+
+1.6. "Executable Form"
+ means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+ means a work that combines Covered Software with other material, in
+ a separate file or files, that is not Covered Software.
+
+1.8. "License"
+ means this document.
+
+1.9. "Licensable"
+ means having the right to grant, to the maximum extent possible,
+ whether at the time of the initial grant or subsequently, any and
+ all of the rights conveyed by this License.
+
+1.10. "Modifications"
+ means any of the following:
+
+ (a) any file in Source Code Form that results from an addition to,
+ deletion from, or modification of the contents of Covered
+ Software; or
+
+ (b) any new file in Source Code Form that contains any Covered
+ Software.
+
+1.11. "Patent Claims" of a Contributor
+ means any patent claim(s), including without limitation, method,
+ process, and apparatus claims, in any patent Licensable by such
+ Contributor that would be infringed, but for the grant of the
+ License, by the making, using, selling, offering for sale, having
+ made, import, or transfer of either its Contributions or its
+ Contributor Version.
+
+1.12. "Secondary License"
+ means either the GNU General Public License, Version 2.0, the GNU
+ Lesser General Public License, Version 2.1, the GNU Affero General
+ Public License, Version 3.0, or any later versions of those
+ licenses.
+
+1.13. "Source Code Form"
+ means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+ means an individual or a legal entity exercising rights under this
+ License. For legal entities, "You" includes any entity that
+ controls, is controlled by, or is under common control with You. For
+ purposes of this definition, "control" means (a) the power, direct
+ or indirect, to cause the direction or management of such entity,
+ whether by contract or otherwise, or (b) ownership of more than
+ fifty percent (50%) of the outstanding shares or beneficial
+ ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+ Licensable by such Contributor to use, reproduce, make available,
+ modify, display, perform, distribute, and otherwise exploit its
+ Contributions, either on an unmodified basis, with Modifications, or
+ as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+ for sale, have made, import, and otherwise transfer either its
+ Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+ or
+
+(b) for infringements caused by: (i) Your and any other third party's
+ modifications of Covered Software, or (ii) the combination of its
+ Contributions with other software (except as part of its Contributor
+ Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+ its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+ Form, as described in Section 3.1, and You must inform recipients of
+ the Executable Form how they can obtain a copy of such Source Code
+ Form by reasonable means in a timely manner, at a charge no more
+ than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+ License, or sublicense it under different terms, provided that the
+ license for the Executable Form does not attempt to limit or alter
+ the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+* *
+* 6. Disclaimer of Warranty *
+* ------------------------- *
+* *
+* Covered Software is provided under this License on an "as is" *
+* basis, without warranty of any kind, either expressed, implied, or *
+* statutory, including, without limitation, warranties that the *
+* Covered Software is free of defects, merchantable, fit for a *
+* particular purpose or non-infringing. The entire risk as to the *
+* quality and performance of the Covered Software is with You. *
+* Should any Covered Software prove defective in any respect, You *
+* (not any Contributor) assume the cost of any necessary servicing, *
+* repair, or correction. This disclaimer of warranty constitutes an *
+* essential part of this License. No use of any Covered Software is *
+* authorized under this License except under this disclaimer. *
+* *
+************************************************************************
+
+************************************************************************
+* *
+* 7. Limitation of Liability *
+* -------------------------- *
+* *
+* Under no circumstances and under no legal theory, whether tort *
+* (including negligence), contract, or otherwise, shall any *
+* Contributor, or anyone who distributes Covered Software as *
+* permitted above, be liable to You for any direct, indirect, *
+* special, incidental, or consequential damages of any character *
+* including, without limitation, damages for lost profits, loss of *
+* goodwill, work stoppage, computer failure or malfunction, or any *
+* and all other commercial damages or losses, even if such party *
+* shall have been informed of the possibility of such damages. This *
+* limitation of liability shall not apply to liability for death or *
+* personal injury resulting from such party's negligence to the *
+* extent applicable law prohibits such limitation. Some *
+* jurisdictions do not allow the exclusion or limitation of *
+* incidental or consequential damages, so this exclusion and *
+* limitation may not apply to You. *
+* *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+ This Source Code Form is subject to the terms of the Mozilla Public
+ License, v. 2.0. If a copy of the MPL was not distributed with this
+ file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+ This Source Code Form is "Incompatible With Secondary Licenses", as
+ defined by the Mozilla Public License, v. 2.0.
diff --git a/packages/dts/README.md b/packages/dts/README.md
new file mode 100644
index 0000000..7f74a3e
--- /dev/null
+++ b/packages/dts/README.md
@@ -0,0 +1,106 @@
+# @mediabunny/dts
+
+[](https://www.npmjs.com/package/@mediabunny/dts)
+[](https://bundlephobia.com/package/@mediabunny/dts)
+[](https://www.npmjs.com/package/@mediabunny/dts)
+[](https://discord.gg/hmpkyYuS4U)
+
+
+

+
+
+Browsers have no support for the DTS audio codec in their WebCodecs implementations. This extension package provides both a decoder and encoder for use with [Mediabunny](https://github.com/Vanilagy/mediabunny), allowing you to decode and encode this codec directly in the browser. It is implemented using Mediabunny's [custom coder API](https://mediabunny.dev/guide/supported-formats-and-codecs#custom-coders) and uses a fast, size-optimized WASM build of [FFmpeg](https://ffmpeg.org/)'s DTS coders under the hood.
+
+> This package, like the rest of Mediabunny, is enabled by its [sponsors](https://mediabunny.dev/#sponsors) and their donations. If you've derived value from this package, please consider [leaving a donation](https://github.com/sponsors/Vanilagy)! 💘
+
+## Installation
+
+This library peer-depends on Mediabunny. Install both using npm:
+```bash
+npm install mediabunny @mediabunny/dts
+```
+
+Alternatively, directly include them using a script tag:
+```html
+
+
+```
+
+This will expose the global objects `Mediabunny` and `MediabunnyDts`. Use `mediabunny-dts.d.ts` to provide types for these globals. You can download the built distribution files from the [releases page](https://github.com/Vanilagy/mediabunny/releases).
+
+## Usage
+
+```ts
+import { registerDtsDecoder, registerDtsEncoder } from '@mediabunny/dts';
+
+registerDtsDecoder();
+registerDtsEncoder();
+```
+That's it - Mediabunny now uses the registered DTS decoder and encoder automatically.
+
+## Building and development
+
+For simplicity, all built WASM artifacts are included in the repo, since these rarely change. However, here are the instructions for building them from scratch:
+
+[Install Emscripten](https://emscripten.org/docs/getting_started/downloads.html) and clone [FFmpeg](https://github.com/FFmpeg/FFmpeg). Then, from the Mediabunny root and with Emscripten sourced in:
+
+```bash
+export FFMPEG_PATH=/path/to/ffmpeg
+export MEDIABUNNY_ROOT=$PWD
+
+# Build FFmpeg
+cd $FFMPEG_PATH
+emmake make distclean
+emconfigure ./configure \
+ --target-os=none \
+ --arch=x86_32 \
+ --enable-cross-compile \
+ --disable-asm \
+ --disable-x86asm \
+ --disable-inline-asm \
+ --disable-programs \
+ --disable-doc \
+ --disable-debug \
+ --disable-all \
+ --disable-everything \
+ --disable-autodetect \
+ --disable-pthreads \
+ --disable-runtime-cpudetect \
+ --enable-avcodec \
+ --enable-decoder=dca \
+ --enable-encoder=dca \
+ --cc="emcc" \
+ --cxx=em++ \
+ --ar=emar \
+ --ranlib=emranlib \
+ --extra-cflags="-DNDEBUG -Oz -flto -msimd128" \
+ --extra-ldflags="-Oz -flto"
+emmake make
+
+# Compile the bridge between JavaScript and FFmpeg's API
+cd $MEDIABUNNY_ROOT/packages/dts
+emcc src/bridge.c \
+ $FFMPEG_PATH/libavcodec/libavcodec.a \
+ $FFMPEG_PATH/libavutil/libavutil.a \
+ -I$FFMPEG_PATH \
+ -s MODULARIZE=1 \
+ -s EXPORT_ES6=1 \
+ -s SINGLE_FILE=1 \
+ -s ALLOW_MEMORY_GROWTH=1 \
+ -s ENVIRONMENT=web,worker \
+ -s FILESYSTEM=0 \
+ -s MALLOC=emmalloc \
+ -s SUPPORT_LONGJMP=0 \
+ -s EXPORTED_RUNTIME_METHODS=cwrap,HEAPU8 \
+ -s EXPORTED_FUNCTIONS=_malloc,_free \
+ -msimd128 \
+ -flto \
+ -Oz \
+ -o build/dts.js
+```
+
+This generates `build/dts.js`, which contains both the JavaScript "glue code" as well as the compiled WASM inlined.
+
+### Building the package
+
+Then, the complete JavaScript package can be built alongside the rest of Mediabunny by running `npm run build` in Mediabunny's root.
diff --git a/packages/dts/api-extractor.json b/packages/dts/api-extractor.json
new file mode 100644
index 0000000..8cb42c0
--- /dev/null
+++ b/packages/dts/api-extractor.json
@@ -0,0 +1,37 @@
+{
+ "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json",
+ "mainEntryPointFilePath": "dist/modules/src/index.d.ts",
+ "bundledPackages": [],
+ "compiler": {},
+ "apiReport": {
+ "enabled": false
+ },
+ "docModel": {
+ "enabled": false
+ },
+ "dtsRollup": {
+ "enabled": true,
+ "untrimmedFilePath": "dist/mediabunny-dts.d.ts"
+ },
+ "tsdocMetadata": {
+ "enabled": false
+ },
+ "messages": {
+ "compilerMessageReporting": {
+ "default": {
+ "logLevel": "warning"
+ }
+ },
+ "extractorMessageReporting": {
+ "default": {
+ "logLevel": "warning"
+ }
+ },
+ "tsdocMessageReporting": {
+ "default": {
+ "logLevel": "warning"
+ }
+ }
+ },
+ "newlineKind": "lf"
+}
diff --git a/packages/dts/build/dts.js b/packages/dts/build/dts.js
new file mode 100644
index 0000000000000000000000000000000000000000..ee435075b92bc851bbdfe37e446649856d5f7eb9
GIT binary patch
literal 927592
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 |