mirror of
https://github.com/arcodange-org/mediabunny.git
synced 2026-10-02 13:23:51 +02:00
Add support for writing I-frame only tracks, fix track closing race conditions in other muxers
This commit is contained in:
+15
-3
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user