Small monotonicity adjustments

This commit is contained in:
Vanilagy
2025-03-29 12:01:03 +01:00
parent 53e8ce5cac
commit a64ebab435
3 changed files with 18 additions and 9 deletions
+2
View File
@@ -55,6 +55,8 @@ export class OggMuxer extends Muxer {
this.format = format; this.format = format;
this.writer = output._writer; this.writer = output._writer;
this.writer.ensureMonotonicity = true; // Ogg is always monotonically written!
} }
async start() { async start() {
+2 -2
View File
@@ -83,8 +83,8 @@ export class StreamTarget extends Target {
if (options.chunked !== undefined && typeof options.chunked !== 'boolean') { if (options.chunked !== undefined && typeof options.chunked !== 'boolean') {
throw new TypeError('options.chunked, when provided, must be a boolean.'); throw new TypeError('options.chunked, when provided, must be a boolean.');
} }
if (options.chunkSize !== undefined && (!Number.isInteger(options.chunkSize) || options.chunkSize <= 0)) { if (options.chunkSize !== undefined && (!Number.isInteger(options.chunkSize) || options.chunkSize < 1024)) {
throw new TypeError('options.chunkSize, when provided, must be a positive integer.'); throw new TypeError('options.chunkSize, when provided, must be an integer and not smaller than 1024.');
} }
this._writable = writable; this._writable = writable;
+14 -7
View File
@@ -305,10 +305,6 @@ export class StreamTargetWriter extends Writer {
} }
} }
if (this.ensureMonotonicity && chunk.start !== this.lastFlushEnd) {
throw new Error('Internal error: Monotonicity violation.');
}
if (this.writer.desiredSize !== null && this.writer.desiredSize <= 0) { if (this.writer.desiredSize !== null && this.writer.desiredSize <= 0) {
await this.writer.ready; // Allow the writer to apply backpressure await this.writer.ready; // Allow the writer to apply backpressure
} }
@@ -318,15 +314,19 @@ export class StreamTargetWriter extends Writer {
this.writeDataIntoChunks(chunk.data, chunk.start); this.writeDataIntoChunks(chunk.data, chunk.start);
this.tryToFlushChunks(); this.tryToFlushChunks();
} else { } else {
if (this.ensureMonotonicity && chunk.start !== this.lastFlushEnd) {
throw new Error('Internal error: Monotonicity violation.');
}
// Write out the data immediately // Write out the data immediately
void this.writer.write({ void this.writer.write({
type: 'write', type: 'write',
data: chunk.data, data: chunk.data,
position: chunk.start, position: chunk.start,
}); });
}
this.lastFlushEnd = chunk.start + chunk.data.byteLength; this.lastFlushEnd = chunk.start + chunk.data.byteLength;
}
} }
this.sections.length = 0; this.sections.length = 0;
@@ -420,11 +420,18 @@ export class StreamTargetWriter extends Writer {
if (!chunk.shouldFlush && !force) continue; if (!chunk.shouldFlush && !force) continue;
for (const section of chunk.written) { for (const section of chunk.written) {
const position = chunk.start + section.start;
if (this.ensureMonotonicity && position !== this.lastFlushEnd) {
throw new Error('Internal error: Monotonicity violation.');
}
void this.writer.write({ void this.writer.write({
type: 'write', type: 'write',
data: chunk.data.subarray(section.start, section.end), data: chunk.data.subarray(section.start, section.end),
position: chunk.start + section.start, position,
}); });
this.lastFlushEnd = chunk.start + section.end;
} }
this.chunks.splice(i--, 1); this.chunks.splice(i--, 1);