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 = {