Add support for writing I-frame only tracks, fix track closing race conditions in other muxers

This commit is contained in:
Vanilagy
2026-03-27 18:48:27 +01:00
parent e2e8aaab78
commit 94678dd356
8 changed files with 200 additions and 30 deletions
+15 -3
View File
@@ -17,7 +17,8 @@ import {
} from '../misc';
import { Muxer } from '../muxer';
import { Output,
OutputAudioTrack } from '../output';
OutputAudioTrack,
OutputTrack } from '../output';
import { OggOutputFormat } from '../output-format';
import { EncodedPacket } from '../packet';
import { Writer } from '../writer';
@@ -48,6 +49,7 @@ type OggTrackData = {
currentPageSize: number;
currentPageStartsWithFreshPacket: boolean;
currentPageStartTimestampInSamples: number;
closed: boolean;
};
type Packet = {
@@ -136,6 +138,7 @@ export class OggMuxer extends Muxer {
currentPageSize: 27,
currentPageStartsWithFreshPacket: true,
currentPageStartTimestampInSamples: 0,
closed: false,
};
this.queueHeaderPackets(newTrackData, meta);
@@ -335,7 +338,7 @@ export class OggMuxer extends Muxer {
if (
!isFinalCall
&& trackData.packetQueue.length <= 1 // Limit is 1, not 0, for correct EOS flag logic
&& !trackData.track.source._closed
&& !trackData.closed
) {
break outer;
}
@@ -485,9 +488,14 @@ export class OggMuxer extends Muxer {
}
// eslint-disable-next-line @typescript-eslint/no-misused-promises
override async onTrackClose() {
override async onTrackClose(track: OutputTrack) {
const release = await this.mutex.acquire();
const trackData = this.trackDatas.find(x => x.track === track);
if (trackData) {
trackData.closed = true;
}
if (this.allTracksAreKnown()) {
this.allTracksKnown.resolve();
}
@@ -503,6 +511,10 @@ export class OggMuxer extends Muxer {
this.allTracksKnown.resolve();
for (const trackData of this.trackDatas) {
trackData.closed = true;
}
await this.interleavePages(true);
for (const trackData of this.trackDatas) {