Add support for unsized sources, add ReadableStreamSource, fix WAVE packet lookup

This commit is contained in:
Vanilagy
2025-09-02 16:39:38 +02:00
parent 4b3fb34a95
commit ef95960e13
14 changed files with 792 additions and 172 deletions
+5 -2
View File
@@ -47,7 +47,7 @@ export class Mp3Demuxer extends Demuxer {
async readMetadata() {
return this.metadataPromise ??= (async () => {
// Keep loading until we find the first frame header
while (!this.firstFrameHeader && this.lastLoadedPos < this.reader.fileSize) {
while (!this.firstFrameHeader && !this.lastSampleLoaded) {
await this.advanceReader();
}
@@ -211,7 +211,10 @@ class Mp3AudioTrackBacking implements InputAudioTrackBacking {
} else {
let slice = this.demuxer.reader.requestSlice(rawSample.dataStart, rawSample.dataSize);
if (slice instanceof Promise) slice = await slice;
assert(slice);
if (!slice) {
return null; // Data didn't fit into the rest of the file
}
data = readBytes(slice, rawSample.dataSize);
}
+3 -3
View File
@@ -22,20 +22,20 @@ export const readId3 = (slice: FileSlice) => {
return { size };
};
export const readNextFrameHeader = async (reader: Reader, startPos: number, until: number): Promise<{
export const readNextFrameHeader = async (reader: Reader, startPos: number, until: number | null): Promise<{
header: FrameHeader;
startPos: number;
} | null> => {
let currentPos = startPos;
while (currentPos < until) {
while (until === null || currentPos < until) {
let slice = reader.requestSlice(currentPos, FRAME_HEADER_SIZE);
if (slice instanceof Promise) slice = await slice;
if (!slice) break;
const word = readU32Be(slice);
const result = readFrameHeader(word, reader.fileSize - currentPos);
const result = readFrameHeader(word, reader.fileSize !== null ? reader.fileSize - currentPos : null);
if (result.header) {
return { header: result.header, startPos: currentPos };
}