diff --git a/dev/convert.html b/dev/convert.html
index a14d831..f85cc61 100644
--- a/dev/convert.html
+++ b/dev/convert.html
@@ -25,7 +25,7 @@
chunked: true,
chunkSize: 2**20
});
- const outputFormat = new Mediabunny.FlacOutputFormat();
+ const outputFormat = new Mediabunny.Mp4OutputFormat();
const p = document.createElement('p');
p.textContent = 'Capturing...';
@@ -96,6 +96,7 @@
input,
output,
audio: {
+ discard: true,
//forceTranscode: true,
//sampleFormat: 's16',
},
@@ -124,7 +125,7 @@
},
*/
video: {
- discard: true,
+ //discard: true,
},
tags: {} ?? {
title: 'Bigggy',
@@ -144,6 +145,7 @@
}
},
trim: {
+ end: 10,
//start: startTime,
//end: startTime + 2,
},
diff --git a/package-lock.json b/package-lock.json
index c80d407..849b007 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "mediabunny",
- "version": "1.43.0",
+ "version": "1.43.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "mediabunny",
- "version": "1.43.0",
+ "version": "1.43.1",
"license": "MPL-2.0",
"workspaces": [
"packages/*"
@@ -7751,9 +7751,9 @@
}
},
"node_modules/mediabunny": {
- "version": "1.42.0",
- "resolved": "https://registry.npmjs.org/mediabunny/-/mediabunny-1.42.0.tgz",
- "integrity": "sha512-s9ypTqLi6kbh95gC+YaJlG0PkLvMxu37Q/wO/pFZx0fUCA5Ym5mp+2dWoa83mKQ3Uo18aNlgev5iJ5ESZqWwgQ==",
+ "version": "1.43.0",
+ "resolved": "https://registry.npmjs.org/mediabunny/-/mediabunny-1.43.0.tgz",
+ "integrity": "sha512-QGj6PcXXQvhs+29Pl25z3THv17g31k18zHUrJ25UQc5KWVN0vMKbMbB8KuHXNcseALIhbs6nh+wskimaeH/EEw==",
"license": "MPL-2.0",
"peer": true,
"workspaces": [
@@ -12077,7 +12077,7 @@
},
"packages/aac-encoder": {
"name": "@mediabunny/aac-encoder",
- "version": "1.43.0",
+ "version": "1.43.1",
"license": "MPL-2.0",
"devDependencies": {
"@types/emscripten": "^1.40.1"
@@ -12092,7 +12092,7 @@
},
"packages/ac3": {
"name": "@mediabunny/ac3",
- "version": "1.43.0",
+ "version": "1.43.1",
"license": "MPL-2.0",
"devDependencies": {
"@types/emscripten": "^1.40.1"
@@ -12107,7 +12107,7 @@
},
"packages/flac-encoder": {
"name": "@mediabunny/flac-encoder",
- "version": "1.43.0",
+ "version": "1.43.1",
"license": "MPL-2.0",
"devDependencies": {
"@types/emscripten": "^1.40.1"
@@ -12122,7 +12122,7 @@
},
"packages/mp3-encoder": {
"name": "@mediabunny/mp3-encoder",
- "version": "1.43.0",
+ "version": "1.43.1",
"license": "MPL-2.0",
"devDependencies": {
"@types/emscripten": "^1.40.1"
diff --git a/package.json b/package.json
index 8ad8ada..9199a69 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "mediabunny",
"author": "Vanilagy",
- "version": "1.43.0",
+ "version": "1.43.1",
"description": "Pure TypeScript media toolkit for reading, writing, and converting media files, directly in the browser.",
"type": "module",
"workspaces": [
diff --git a/packages/aac-encoder/package.json b/packages/aac-encoder/package.json
index 6308263..40b21e5 100644
--- a/packages/aac-encoder/package.json
+++ b/packages/aac-encoder/package.json
@@ -1,7 +1,7 @@
{
"name": "@mediabunny/aac-encoder",
"author": "Vanilagy",
- "version": "1.43.0",
+ "version": "1.43.1",
"description": "AAC encoder extension for Mediabunny, based on FFmpeg.",
"main": "./dist/bundles/mediabunny-aac-encoder.mjs",
"module": "./dist/bundles/mediabunny-aac-encoder.mjs",
diff --git a/packages/ac3/package.json b/packages/ac3/package.json
index caa9463..1c483fe 100644
--- a/packages/ac3/package.json
+++ b/packages/ac3/package.json
@@ -1,7 +1,7 @@
{
"name": "@mediabunny/ac3",
"author": "Vanilagy",
- "version": "1.43.0",
+ "version": "1.43.1",
"description": "AC-3 and E-AC-3 (Dolby Digital) decoder and encoder extension for Mediabunny, based on FFmpeg.",
"main": "./dist/bundles/mediabunny-ac3.mjs",
"module": "./dist/bundles/mediabunny-ac3.mjs",
diff --git a/packages/flac-encoder/package.json b/packages/flac-encoder/package.json
index 05e3a1c..f0d2bd7 100644
--- a/packages/flac-encoder/package.json
+++ b/packages/flac-encoder/package.json
@@ -1,7 +1,7 @@
{
"name": "@mediabunny/flac-encoder",
"author": "Vanilagy",
- "version": "1.43.0",
+ "version": "1.43.1",
"description": "FLAC encoder extension for Mediabunny, based on libFLAC.",
"main": "./dist/bundles/mediabunny-flac-encoder.mjs",
"module": "./dist/bundles/mediabunny-flac-encoder.mjs",
diff --git a/packages/mp3-encoder/package.json b/packages/mp3-encoder/package.json
index a683d9b..619e2bd 100644
--- a/packages/mp3-encoder/package.json
+++ b/packages/mp3-encoder/package.json
@@ -1,7 +1,7 @@
{
"name": "@mediabunny/mp3-encoder",
"author": "Vanilagy",
- "version": "1.43.0",
+ "version": "1.43.1",
"description": "MP3 encoder extension for Mediabunny, based on LAME.",
"main": "./dist/bundles/mediabunny-mp3-encoder.mjs",
"module": "./dist/bundles/mediabunny-mp3-encoder.mjs",
diff --git a/src/codec.ts b/src/codec.ts
index 0c868b1..e763a98 100644
--- a/src/codec.ts
+++ b/src/codec.ts
@@ -784,6 +784,37 @@ export const validateVideoChunkMetadata = (metadata: EncodedVideoChunkMetadata |
'Video chunk metadata decoder configuration must specify a valid codedHeight (positive integer).',
);
}
+ if (
+ metadata.decoderConfig.displayAspectWidth !== undefined
+ && (
+ !Number.isInteger(metadata.decoderConfig.displayAspectWidth)
+ || metadata.decoderConfig.displayAspectWidth <= 0
+ )
+ ) {
+ throw new TypeError(
+ 'Video chunk metadata decoder configuration displayAspectWidth, when defined, must be a positive integer.',
+ );
+ }
+ if (
+ metadata.decoderConfig.displayAspectHeight !== undefined
+ && (
+ !Number.isInteger(metadata.decoderConfig.displayAspectHeight)
+ || metadata.decoderConfig.displayAspectHeight <= 0
+ )
+ ) {
+ throw new TypeError(
+ 'Video chunk metadata decoder configuration displayAspectHeight, when defined, must be a positive integer.',
+ );
+ }
+ if (
+ (metadata.decoderConfig.displayAspectWidth !== undefined)
+ !== (metadata.decoderConfig.displayAspectHeight !== undefined)
+ ) {
+ throw new TypeError(
+ 'Video chunk metadata decoder configuration must specify both displayAspectWidth and displayAspectHeight,'
+ + ' or neither.',
+ );
+ }
if (metadata.decoderConfig.description !== undefined) {
if (!isAllowSharedBufferSource(metadata.decoderConfig.description)) {
throw new TypeError(
diff --git a/src/isobmff/isobmff-demuxer.ts b/src/isobmff/isobmff-demuxer.ts
index 4d215a1..7e468f6 100644
--- a/src/isobmff/isobmff-demuxer.ts
+++ b/src/isobmff/isobmff-demuxer.ts
@@ -1475,10 +1475,13 @@ export class IsobmffDemuxer extends Demuxer {
const num = readU32Be(slice);
const den = readU32Be(slice);
- if (num > den) {
- track.info.squarePixelWidth = Math.round(track.info.width * num / den);
- } else {
- track.info.squarePixelHeight = Math.round(track.info.height * den / num);
+ // https://github.com/Vanilagy/mediabunny/issues/362
+ if (num > 0 && den > 0) {
+ if (num > den) {
+ track.info.squarePixelWidth = Math.round(track.info.width * num / den);
+ } else {
+ track.info.squarePixelHeight = Math.round(track.info.height * den / num);
+ }
}
}; break;
diff --git a/src/matroska/matroska-demuxer.ts b/src/matroska/matroska-demuxer.ts
index a88f077..87ebece 100644
--- a/src/matroska/matroska-demuxer.ts
+++ b/src/matroska/matroska-demuxer.ts
@@ -1051,14 +1051,16 @@ export class MatroskaDemuxer extends Demuxer {
const num = this.currentTrack.info.displayWidth * this.currentTrack.info.height;
const den = this.currentTrack.info.displayHeight * this.currentTrack.info.width;
- if (num > den) {
- this.currentTrack.info.squarePixelWidth = Math.round(
- this.currentTrack.info.width * num / den,
- );
- } else {
- this.currentTrack.info.squarePixelHeight = Math.round(
- this.currentTrack.info.height * den / num,
- );
+ if (num > 0 && den > 0) {
+ if (num > den) {
+ this.currentTrack.info.squarePixelWidth = Math.round(
+ this.currentTrack.info.width * num / den,
+ );
+ } else {
+ this.currentTrack.info.squarePixelHeight = Math.round(
+ this.currentTrack.info.height * den / num,
+ );
+ }
}
}
diff --git a/src/misc.ts b/src/misc.ts
index ee90e1c..129c58c 100644
--- a/src/misc.ts
+++ b/src/misc.ts
@@ -938,6 +938,8 @@ export type Rational = {
};
export const simplifyRational = (rational: Rational): Rational => {
+ assert(Number.isInteger(rational.num));
+ assert(Number.isInteger(rational.den));
assert(rational.den !== 0);
let a = Math.abs(rational.num);
diff --git a/src/mpeg-ts/mpeg-ts-demuxer.ts b/src/mpeg-ts/mpeg-ts-demuxer.ts
index 652c796..80b09e5 100644
--- a/src/mpeg-ts/mpeg-ts-demuxer.ts
+++ b/src/mpeg-ts/mpeg-ts-demuxer.ts
@@ -474,18 +474,22 @@ export class MpegTsDemuxer extends Demuxer {
elementaryStream.info.width = spsInfo.displayWidth;
elementaryStream.info.height = spsInfo.displayHeight;
- if (spsInfo.pixelAspectRatio.num > spsInfo.pixelAspectRatio.den) {
- elementaryStream.info.squarePixelWidth = Math.round(
- elementaryStream.info.width
- * spsInfo.pixelAspectRatio.num / spsInfo.pixelAspectRatio.den,
- );
- elementaryStream.info.squarePixelHeight = elementaryStream.info.height;
- } else {
- elementaryStream.info.squarePixelWidth = elementaryStream.info.width;
- elementaryStream.info.squarePixelHeight = Math.round(
- elementaryStream.info.height
- * spsInfo.pixelAspectRatio.den / spsInfo.pixelAspectRatio.num,
- );
+
+ const num = spsInfo.pixelAspectRatio.num;
+ const den = spsInfo.pixelAspectRatio.den;
+
+ if (num > 0 && den > 0) {
+ if (num > den) {
+ elementaryStream.info.squarePixelWidth = Math.round(
+ elementaryStream.info.width * num / den,
+ );
+ elementaryStream.info.squarePixelHeight = elementaryStream.info.height;
+ } else {
+ elementaryStream.info.squarePixelWidth = elementaryStream.info.width;
+ elementaryStream.info.squarePixelHeight = Math.round(
+ elementaryStream.info.height * den / num,
+ );
+ }
}
elementaryStream.info.colorSpace = {