From d29f4f33b508a7a753562032fb90e57aef22bcc4 Mon Sep 17 00:00:00 2001 From: Alakh Chandarana <36898190+alakhpc@users.noreply.github.com> Date: Sun, 11 Jan 2026 04:05:55 -0500 Subject: [PATCH] implement fix --- src/matroska/matroska-demuxer.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/matroska/matroska-demuxer.ts b/src/matroska/matroska-demuxer.ts index db421b6..965ccf8 100644 --- a/src/matroska/matroska-demuxer.ts +++ b/src/matroska/matroska-demuxer.ts @@ -193,6 +193,7 @@ type InternalTrack = { codecId: string | null; codecPrivate: Uint8Array | null; defaultDuration: number | null; + defaultDurationNs: number | null; name: string | null; languageCode: string; decodingInstructions: DecodingInstruction[]; @@ -536,6 +537,13 @@ export class MatroskaDemuxer extends Demuxer { this.currentSegment.timestampFactor = 1e9 / 1e6; } + // Compute default duration for all tracks now that we have the timestamp factor + for (const track of this.currentSegment.tracks) { + if (track.defaultDurationNs !== null) { + track.defaultDuration = (this.currentSegment.timestampFactor * track.defaultDurationNs) / 1e9; + } + } + // Put default tracks first this.currentSegment.tracks.sort((a, b) => Number(b.disposition.default) - Number(a.disposition.default)); @@ -996,6 +1004,7 @@ export class MatroskaDemuxer extends Demuxer { codecId: null, codecPrivate: null, defaultDuration: null, + defaultDurationNs: null, name: null, languageCode: UNDETERMINED_LANGUAGE, decodingInstructions: [], @@ -1203,9 +1212,7 @@ export class MatroskaDemuxer extends Demuxer { case EBMLId.DefaultDuration: { if (!this.currentTrack) break; - - this.currentTrack.defaultDuration - = this.currentTrack.segment.timestampFactor * readUnsignedInt(slice, size) / 1e9; + this.currentTrack.defaultDurationNs = readUnsignedInt(slice, size); }; break; case EBMLId.Name: {