From 8b39eb0d43e85fc6b378a905112d2c10802479d8 Mon Sep 17 00:00:00 2001 From: Vanilagy <1696106+Vanilagy@users.noreply.github.com> Date: Mon, 10 Nov 2025 21:14:43 +0100 Subject: [PATCH] Revert Matroska default duration flooring --- dev/demux.html | 4 +++- src/matroska/matroska-demuxer.ts | 7 +++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/dev/demux.html b/dev/demux.html index d53045c..1a864a3 100644 --- a/dev/demux.html +++ b/dev/demux.html @@ -14,11 +14,13 @@ source: new Mediabunny.BlobSource(file), }); - const videoTrack = await input.getPrimaryVideoTrack(); + const videoTrack = await input.getPrimaryAudioTrack(); const sink = new Mediabunny.EncodedPacketSink(videoTrack); for await (const packet of sink.packets()) { console.log(packet.timestamp, packet.duration, packet.timestamp + packet.duration); + + if (packet.timestamp > 10) break; } /* diff --git a/src/matroska/matroska-demuxer.ts b/src/matroska/matroska-demuxer.ts index 79c84f4..e964bef 100644 --- a/src/matroska/matroska-demuxer.ts +++ b/src/matroska/matroska-demuxer.ts @@ -844,13 +844,13 @@ export class MatroskaDemuxer extends Demuxer { blocks.splice(blockIndex, 1); // Remove the original block + const blockDuration = originalBlock.duration || frameCount * (track.defaultDuration ?? 0); + // Now, let's insert each frame as its own block for (let i = 0; i < frameCount; i++) { const frameSize = frameSizes[i]!; const frameData = readBytes(slice, frameSize); - const blockDuration = originalBlock.duration || (frameCount * (track.defaultDuration ?? 0)); - // Distribute timestamps evenly across the block duration const frameTimestamp = originalBlock.timestamp + (blockDuration * i / frameCount); const frameDuration = blockDuration / frameCount; @@ -1181,9 +1181,8 @@ export class MatroskaDemuxer extends Demuxer { case EBMLId.DefaultDuration: { if (!this.currentTrack) break; - // Floored to reduce chance of overlapping packets (https://github.com/Vanilagy/mediabunny/issues/170) this.currentTrack.defaultDuration - = Math.floor(this.currentTrack.segment.timestampFactor * readUnsignedInt(slice, size) / 1e9); + = this.currentTrack.segment.timestampFactor * readUnsignedInt(slice, size) / 1e9; }; break; case EBMLId.Name: {