From 9be55666ac8495fc834df61fe1ba3504a3263aa3 Mon Sep 17 00:00:00 2001 From: Vanilagy <1696106+Vanilagy@users.noreply.github.com> Date: Sun, 11 May 2025 23:11:06 +0200 Subject: [PATCH] Fix missing byte lengths in metadata-only packets --- src/mp3/mp3-demuxer.ts | 1 + src/ogg/ogg-demuxer.ts | 1 + src/packet.ts | 24 +++++++++++++++++++----- src/wave/wave-demuxer.ts | 1 + 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/mp3/mp3-demuxer.ts b/src/mp3/mp3-demuxer.ts index ba9f16c..fbe7251 100644 --- a/src/mp3/mp3-demuxer.ts +++ b/src/mp3/mp3-demuxer.ts @@ -180,6 +180,7 @@ class Mp3AudioTrackBacking implements InputAudioTrackBacking { rawSample.timestamp, rawSample.duration, sampleIndex, + rawSample.dataSize, ); } diff --git a/src/ogg/ogg-demuxer.ts b/src/ogg/ogg-demuxer.ts index 3626400..768eb99 100644 --- a/src/ogg/ogg-demuxer.ts +++ b/src/ogg/ogg-demuxer.ts @@ -479,6 +479,7 @@ class OggAudioTrackBacking implements InputAudioTrackBacking { Math.max(0, additional.timestampInSamples) / this.internalSampleRate, durationInSamples / this.internalSampleRate, packet.endPage.headerStartPos + packet.endSegmentIndex, + packet.data.byteLength, ); this.encodedPacketToMetadata.set(encodedPacket, { diff --git a/src/packet.ts b/src/packet.ts index ce6b26d..b8186e0 100644 --- a/src/packet.ts +++ b/src/packet.ts @@ -15,6 +15,12 @@ export type PacketType = 'key' | 'delta'; * @public */ export class EncodedPacket { + /** + * The actual byte length of the data in this packet. This field is useful for metadata-only packets where the + * `data` field contains no bytes. + */ + readonly byteLength: number; + constructor( /** The encoded data of this packet. */ public readonly data: Uint8Array, @@ -34,12 +40,18 @@ export class EncodedPacket { * ordering. Negative sequence numbers mean the sequence number is undefined. */ public readonly sequenceNumber = -1, - /** - * The actual byte length of the data in this packet. This field is useful for metadata-only packets where the - * `data` field contains no bytes. - */ - public readonly byteLength = data.byteLength, + byteLength?: number, ) { + if (data === PLACEHOLDER_DATA && byteLength === undefined) { + throw new Error( + 'Internal error: byteLength must be explicitly provided when constructing metadata-only packets.', + ); + } + + if (byteLength === undefined) { + byteLength = data.byteLength; + } + if (!(data instanceof Uint8Array)) { throw new TypeError('data must be a Uint8Array.'); } @@ -58,6 +70,8 @@ export class EncodedPacket { if (!Number.isInteger(byteLength) || byteLength < 0) { throw new TypeError('byteLength must be a non-negative integer.'); } + + this.byteLength = byteLength; } /** If this packet is a metadata-only packet. Metadata-only packets don't contain their packet data. */ diff --git a/src/wave/wave-demuxer.ts b/src/wave/wave-demuxer.ts index 53ec8f0..8886c90 100644 --- a/src/wave/wave-demuxer.ts +++ b/src/wave/wave-demuxer.ts @@ -275,6 +275,7 @@ class WaveAudioTrackBacking implements InputAudioTrackBacking { timestamp, duration, packetIndex, + sizeInBytes, ); }