From 2d4df211d85674ad292e034b93d936a4db690998 Mon Sep 17 00:00:00 2001 From: Vanilagy <1696106+Vanilagy@users.noreply.github.com> Date: Sat, 11 Jan 2025 20:07:31 +0100 Subject: [PATCH] Support rotation metadata in Matroska muxer --- package.json | 4 ++-- src/matroska/ebml.ts | 1 + src/matroska/matroska-muxer.ts | 21 +++++++++++++++++++-- todo.txt | 6 +----- 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 542011f..0ead9c3 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,8 @@ "dist" ], "scripts": { - "build": "node build.mjs && tsc && api-extractor run && node append-namespace.mjs", - "build-local": "node build.mjs && tsc && api-extractor run --local --verbose && node append-namespace.mjs", + "build": "node build.mjs && npm run lint && tsc && api-extractor run && node append-namespace.mjs", + "build-local": "node build.mjs && npm run lint && tsc && api-extractor run --local --verbose && node append-namespace.mjs", "watch": "node build.mjs --watch", "lint": "eslint .", "check": "tsc --noEmit" diff --git a/src/matroska/ebml.ts b/src/matroska/ebml.ts index 325d769..b590071 100644 --- a/src/matroska/ebml.ts +++ b/src/matroska/ebml.ts @@ -99,6 +99,7 @@ export enum EBMLId { Primaries = 0x55bb, Range = 0x55b9, Projection = 0x7670, + ProjectionType = 0x7671, ProjectionPoseRoll = 0x7675, } diff --git a/src/matroska/matroska-muxer.ts b/src/matroska/matroska-muxer.ts index 63812f8..00b293a 100644 --- a/src/matroska/matroska-muxer.ts +++ b/src/matroska/matroska-muxer.ts @@ -230,6 +230,8 @@ export class MatroskaMuxer extends Muxer { } private videoSpecificTrackInfo(trackData: MatroskaVideoTrackData) { + const { frameRate, rotation } = trackData.track.metadata; + const elements: EBMLElement['data'] = [ (trackData.info.decoderConfig.description ? { @@ -237,10 +239,10 @@ export class MatroskaMuxer extends Muxer { data: toUint8Array(trackData.info.decoderConfig.description), } : null), - (trackData.track.metadata.frameRate + (frameRate ? { id: EBMLId.DefaultDuration, - data: 1e9 / trackData.track.metadata.frameRate, + data: 1e9 / frameRate, } : null), ]; @@ -272,6 +274,21 @@ export class MatroskaMuxer extends Muxer { ], } : null), + (typeof rotation === 'number' && rotation !== 0 + ? { + id: EBMLId.Projection, + data: [ + { + id: EBMLId.ProjectionType, + data: 0, // rectangular + }, + { + id: EBMLId.ProjectionPoseRoll, + data: (rotation + 180) % 360 - 180, // [0, 270] -> [-180, 90] + }, + ], + } + : null), ] }; elements.push(videoElement); diff --git a/todo.txt b/todo.txt index 8d00277..fcb946a 100644 --- a/todo.txt +++ b/todo.txt @@ -1,8 +1,4 @@ -- Test tree shaking - Throw if edit list detected -- Add the new audio codecs to muxers -- Mov muxer!!! Only mov can hold PCM audio, MP4 cannot - A stream source?? Or like a callback-driven source - onHeader, etc callbacks for Matroska -- https://github.com/Vanilagy/mp4-muxer/issues/83 tell him it's possible now -- Matroska projection for video rotation in muxer \ No newline at end of file +- https://github.com/Vanilagy/mp4-muxer/issues/83 tell him it's possible now \ No newline at end of file