Fix flaky FLAC metadata reading

This commit is contained in:
Vanilagy
2025-09-19 14:29:41 +02:00
parent 23181a9ff6
commit a46e9ee9ec
5 changed files with 28 additions and 17 deletions
+13 -9
View File
@@ -115,7 +115,8 @@ export class FlacDemuxer extends Demuxer {
this.reader.fileSize === null
|| currentPos < this.reader.fileSize
) {
const sizeSlice = await this.reader.requestSlice(currentPos, 4);
let sizeSlice = this.reader.requestSlice(currentPos, 4);
if (sizeSlice instanceof Promise) sizeSlice = await sizeSlice;
currentPos += 4;
if (sizeSlice === null) {
@@ -135,10 +136,12 @@ export class FlacDemuxer extends Demuxer {
case FlacBlockType.STREAMINFO: {
// Parse streaminfo block
// https://www.rfc-editor.org/rfc/rfc9639.html#section-8.2
const streamInfoBlock = await this.reader.requestSlice(
let streamInfoBlock = this.reader.requestSlice(
currentPos,
size,
);
if (streamInfoBlock instanceof Promise) streamInfoBlock = await streamInfoBlock;
assert(streamInfoBlock);
if (streamInfoBlock === null) {
throw new Error(
@@ -192,17 +195,16 @@ export class FlacDemuxer extends Demuxer {
case FlacBlockType.VORBIS_COMMENT: {
// Parse vorbis comment block
// https://www.rfc-editor.org/rfc/rfc9639.html#name-vorbis-comment
const vorbisCommentBlock = await this.reader.requestSlice(
let vorbisCommentBlock = this.reader.requestSlice(
currentPos,
size,
);
if (vorbisCommentBlock instanceof Promise) vorbisCommentBlock = await vorbisCommentBlock;
assert(vorbisCommentBlock);
readVorbisComments(
vorbisCommentBlock.bytes.subarray(
vorbisCommentBlock.start,
vorbisCommentBlock.end,
),
readBytes(vorbisCommentBlock, size),
this.metadataTags,
);
@@ -211,10 +213,11 @@ export class FlacDemuxer extends Demuxer {
case FlacBlockType.PICTURE: {
// Parse picture block
// https://www.rfc-editor.org/rfc/rfc9639.html#name-picture
const pictureBlock = await this.reader.requestSlice(
let pictureBlock = this.reader.requestSlice(
currentPos,
size,
);
if (pictureBlock instanceof Promise) pictureBlock = await pictureBlock;
assert(pictureBlock);
const pictureType = readU32Be(pictureBlock);
@@ -654,10 +657,11 @@ class FlacAudioTrackBacking implements InputAudioTrackBacking {
if (options.metadataOnly) {
data = PLACEHOLDER_DATA;
} else {
const slice = await this.demuxer.reader.requestSlice(
let slice = this.demuxer.reader.requestSlice(
rawSample.byteOffset,
rawSample.byteSize,
);
if (slice instanceof Promise) slice = await slice;
if (!slice) {
return null; // Data didn't fit into the rest of the file
+7
View File
@@ -80,13 +80,19 @@ export class Reader {
}
export class FileSlice {
/** The current position in the backing buffer. Do not modify directly, prefer `.skip()` instead. */
bufferPos: number;
constructor(
/** The underlying bytes backing this slice. Avoid using this directly and prefer reader functions instead. */
public readonly bytes: Uint8Array,
/** A view into the bytes backing this slice. Avoid using this directly and prefer reader functions instead. */
public readonly view: DataView,
/** The offset in "file bytes" at which `bytes` begins in the file. */
private readonly offset: number,
/** The offset in "file bytes" where this slice begins. */
public readonly start: number,
/** The offset in "file bytes" where this slice ends (exclusive). */
public readonly end: number,
) {
this.bufferPos = start - offset;
@@ -118,6 +124,7 @@ export class FileSlice {
this.bufferPos += byteCount;
}
/** Creates a new subslice of this slice whose byte range must be contained within this slice. */
slice(filePos: number, length = this.end - filePos) {
if (filePos < this.start || filePos + length > this.end) {
throw new RangeError('Slicing outside of original slice.');