diff --git a/src/adts/adts-demuxer.ts b/src/adts/adts-demuxer.ts index cfcd077..e9ecaaf 100644 --- a/src/adts/adts-demuxer.ts +++ b/src/adts/adts-demuxer.ts @@ -151,15 +151,6 @@ export class AdtsDemuxer extends Demuxer { return this.tracks; } - async computeDuration() { - await this.readMetadata(); - - const track = this.tracks[0]; - assert(track); - - return track.computeDuration(); - } - async getMetadataTags() { const release = await this.readingMutex.acquire(); @@ -210,20 +201,11 @@ class AdtsAudioTrackBacking implements InputAudioTrackBacking { return 1; } - async getFirstTimestamp() { - return 0; - } - getTimeResolution() { const sampleRate = this.getSampleRate(); return sampleRate / SAMPLES_PER_AAC_FRAME; } - async computeDuration() { - const lastPacket = await this.getPacket(Infinity, { metadataOnly: true }); - return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0); - } - getName() { return null; } diff --git a/src/aggregate-demuxer.ts b/src/aggregate-demuxer.ts index b46c71d..0cfea5a 100644 --- a/src/aggregate-demuxer.ts +++ b/src/aggregate-demuxer.ts @@ -26,11 +26,6 @@ export class InputAggregateDemuxer extends Demuxer { this.subInputs = subInputs; } - async computeDuration() { - const durations = await Promise.all(this.subInputs.map(x => x.computeDuration())); - return Math.max(0, ...durations); - } - async getMetadataTags(): Promise { return {}; // todo? } @@ -112,14 +107,6 @@ class InputAggregateTrackBacking implements InputTrackBacking { return this.source.getVariant(); } - getFirstTimestamp() { - return this.source.getFirstTimestamp(); - } - - computeDuration() { - return this.source.computeDuration(); - } - getFirstPacket(options: PacketRetrievalOptions): Promise { return this.source.getFirstPacket(options); } diff --git a/src/demuxer.ts b/src/demuxer.ts index 054f628..9427420 100644 --- a/src/demuxer.ts +++ b/src/demuxer.ts @@ -17,7 +17,6 @@ export abstract class Demuxer { this.input = input; } - abstract computeDuration(): Promise; abstract getTracks(): Promise; abstract getMimeType(): Promise; abstract getMetadataTags(): Promise; diff --git a/src/flac/flac-demuxer.ts b/src/flac/flac-demuxer.ts index 40a650a..0ccb1cc 100644 --- a/src/flac/flac-demuxer.ts +++ b/src/flac/flac-demuxer.ts @@ -86,12 +86,6 @@ export class FlacDemuxer extends Demuxer { this.reader = input._reader; } - override async computeDuration(): Promise { - await this.readMetadata(); - assert(this.track); - return this.track.computeDuration(); - } - override async getMetadataTags(): Promise { await this.readMetadata(); return this.metadataTags; @@ -546,11 +540,6 @@ class FlacAudioTrackBacking implements InputAudioTrackBacking { return this.demuxer.audioInfo.numberOfChannels; } - async computeDuration() { - const lastPacket = await this.getPacket(Infinity, { metadataOnly: true }); - return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0); - } - getSampleRate() { assert(this.demuxer.audioInfo); return this.demuxer.audioInfo.sampleRate; @@ -579,10 +568,6 @@ class FlacAudioTrackBacking implements InputAudioTrackBacking { return null; } - async getFirstTimestamp() { - return 0; - } - async getDecoderConfig(): Promise { assert(this.demuxer.audioInfo); diff --git a/src/input-track.ts b/src/input-track.ts index 239a471..ee10a77 100644 --- a/src/input-track.ts +++ b/src/input-track.ts @@ -42,9 +42,6 @@ export interface InputTrackBacking { getDisposition(): TrackDisposition; getVariant(): ManifestInputVariant | null; - getFirstTimestamp(): Promise; - computeDuration(): Promise; - getFirstPacket(options: PacketRetrievalOptions): Promise; getPacket(timestamp: number, options: PacketRetrievalOptions): Promise; getNextPacket(packet: EncodedPacket, options: PacketRetrievalOptions): Promise; @@ -158,13 +155,15 @@ export abstract class InputTrack { * may be positive or even negative. A negative starting timestamp means the track's timing has been offset. Samples * with a negative timestamp should not be presented. */ - getFirstTimestamp() { - return this._backing.getFirstTimestamp(); + async getFirstTimestamp() { + const firstPacket = await this._backing.getFirstPacket({ metadataOnly: true }); + return firstPacket?.timestamp ?? 0; } /** Returns the end timestamp of the last packet of this track, in seconds. */ - computeDuration() { - return this._backing.computeDuration(); + async computeDuration() { + const lastPacket = await this._backing.getPacket(Infinity, { metadataOnly: true }); + return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0); } /** diff --git a/src/input.ts b/src/input.ts index b6ba44b..ca68cf9 100644 --- a/src/input.ts +++ b/src/input.ts @@ -114,8 +114,13 @@ export class Input implements Disposable { * all tracks. */ async computeDuration() { - const demuxer = await this._getDemuxer(); - return demuxer.computeDuration(); + const tracks = await this.getTracks(); + if (tracks.length === 0) { + return 0; + } + + const tracksDurations = await Promise.all(tracks.map(x => x.computeDuration())); + return Math.max(...tracksDurations); } /** diff --git a/src/isobmff/isobmff-demuxer.ts b/src/isobmff/isobmff-demuxer.ts index 910446c..22447c8 100644 --- a/src/isobmff/isobmff-demuxer.ts +++ b/src/isobmff/isobmff-demuxer.ts @@ -260,12 +260,6 @@ export class IsobmffDemuxer extends Demuxer { this.reader = input._reader; } - override async computeDuration() { - const tracks = await this.getTracks(); - const trackDurations = await Promise.all(tracks.map(x => x.computeDuration())); - return Math.max(0, ...trackDurations); - } - override async getTracks() { await this.readMetadata(); return this.tracks.map(track => track.inputTrack!); @@ -2382,16 +2376,6 @@ abstract class IsobmffTrackBacking implements InputTrackBacking { return null; } - async computeDuration() { - const lastPacket = await this.getPacket(Infinity, { metadataOnly: true }); - return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0); - } - - async getFirstTimestamp() { - const firstPacket = await this.getFirstPacket({ metadataOnly: true }); - return firstPacket?.timestamp ?? 0; - } - async getFirstPacket(options: PacketRetrievalOptions) { const regularPacket = await this.fetchPacketForSampleIndex(0, options); if (regularPacket || !this.internalTrack.demuxer.isFragmented) { diff --git a/src/manifest-input-variant.ts b/src/manifest-input-variant.ts index d2820b8..f7495bd 100644 --- a/src/manifest-input-variant.ts +++ b/src/manifest-input-variant.ts @@ -99,12 +99,6 @@ class ManifestInputVariantDemuxer extends Demuxer { this.variant = variant; } - async computeDuration(): Promise { - const tracks = await this.getTracks(); - const trackDurations = await Promise.all(tracks.map(x => x.computeDuration())); - return Math.max(0, ...trackDurations); - } - async getMetadataTags(): Promise { return {}; // todo? } @@ -257,16 +251,6 @@ class ManifestInputVariantInputTrackBacking implements InputTrackBacking { return this.demuxer.variant; } - async getFirstTimestamp(): Promise { - const firstPacket = await this.getFirstPacket({ metadataOnly: true }); - return firstPacket?.timestamp ?? 0; - } - - async computeDuration(): Promise { - const lastPacket = await this.getPacket(Infinity, { metadataOnly: true }); - return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0); - } - async createAdjustedPacket(packet: EncodedPacket, segment: ManifestInputSegment, track: InputTrack) { const mediaOffset = await this.demuxer.getMediaOffset(segment, track.input); diff --git a/src/matroska/matroska-demuxer.ts b/src/matroska/matroska-demuxer.ts index 749f0db..fb3eb74 100644 --- a/src/matroska/matroska-demuxer.ts +++ b/src/matroska/matroska-demuxer.ts @@ -266,12 +266,6 @@ export class MatroskaDemuxer extends Demuxer { this.reader = input._reader; } - override async computeDuration() { - const tracks = await this.getTracks(); - const trackDurations = await Promise.all(tracks.map(x => x.computeDuration())); - return Math.max(0, ...trackDurations); - } - async getTracks() { await this.readMetadata(); return this.segments.flatMap(segment => segment.tracks.map(track => track.inputTrack!)); @@ -1888,11 +1882,6 @@ abstract class MatroskaTrackBacking implements InputTrackBacking { return this.internalTrack.codecId; } - async computeDuration() { - const lastPacket = await this.getPacket(Infinity, { metadataOnly: true }); - return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0); - } - getName() { return this.internalTrack.name; } @@ -1901,11 +1890,6 @@ abstract class MatroskaTrackBacking implements InputTrackBacking { return this.internalTrack.languageCode; } - async getFirstTimestamp() { - const firstPacket = await this.getFirstPacket({ metadataOnly: true }); - return firstPacket?.timestamp ?? 0; - } - getVariant() { return null; } diff --git a/src/mp3/mp3-demuxer.ts b/src/mp3/mp3-demuxer.ts index cb9dd74..0f7f6ae 100644 --- a/src/mp3/mp3-demuxer.ts +++ b/src/mp3/mp3-demuxer.ts @@ -147,15 +147,6 @@ export class Mp3Demuxer extends Demuxer { return this.tracks; } - async computeDuration() { - await this.readMetadata(); - - const track = this.tracks[0]; - assert(track); - - return track.computeDuration(); - } - async getMetadataTags() { const release = await this.readingMutex.acquire(); @@ -221,20 +212,11 @@ class Mp3AudioTrackBacking implements InputAudioTrackBacking { return 1; } - async getFirstTimestamp() { - return 0; - } - getTimeResolution() { assert(this.demuxer.firstFrameHeader); return this.demuxer.firstFrameHeader.sampleRate / this.demuxer.firstFrameHeader.audioSamplesInFrame; } - async computeDuration() { - const lastPacket = await this.getPacket(Infinity, { metadataOnly: true }); - return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0); - } - getName() { return null; } diff --git a/src/mpeg-ts/mpeg-ts-demuxer.ts b/src/mpeg-ts/mpeg-ts-demuxer.ts index 63bbd50..dff51d8 100644 --- a/src/mpeg-ts/mpeg-ts-demuxer.ts +++ b/src/mpeg-ts/mpeg-ts-demuxer.ts @@ -485,12 +485,6 @@ export class MpegTsDemuxer extends Demuxer { return {}; // Nothing for now } - async computeDuration() { - const tracks = await this.getTracks(); - const trackDurations = await Promise.all(tracks.map(x => x.computeDuration())); - return Math.max(0, ...trackDurations); - } - async getMimeType(): Promise { await this.readMetadata(); @@ -846,16 +840,6 @@ export abstract class MpegTsTrackBacking implements InputTrackBacking { return null; } - async computeDuration(): Promise { - const lastPacket = await this.getPacket(Infinity, { metadataOnly: true }); - return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0); - } - - async getFirstTimestamp(): Promise { - const firstPacket = await this.getFirstPacket({ metadataOnly: true }); - return firstPacket?.timestamp ?? 0; - } - abstract allPacketsAreKeyPackets(): boolean; abstract getReorderSize(): number; diff --git a/src/ogg/ogg-demuxer.ts b/src/ogg/ogg-demuxer.ts index de2606d..6100a62 100644 --- a/src/ogg/ogg-demuxer.ts +++ b/src/ogg/ogg-demuxer.ts @@ -391,12 +391,6 @@ export class OggDemuxer extends Demuxer { return this.tracks; } - async computeDuration() { - const tracks = await this.getTracks(); - const trackDurations = await Promise.all(tracks.map(x => x.computeDuration())); - return Math.max(0, ...trackDurations); - } - async getMetadataTags() { await this.readMetadata(); return this.metadataTags; @@ -487,15 +481,6 @@ class OggAudioTrackBacking implements InputAudioTrackBacking { }; } - async getFirstTimestamp() { - return 0; - } - - async computeDuration() { - const lastPacket = await this.getPacket(Infinity, { metadataOnly: true }); - return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0); - } - granulePositionToTimestampInSamples(granulePosition: number) { if (this.bitstream.codecInfo.codec === 'opus') { assert(this.bitstream.codecInfo.opusInfo); diff --git a/src/wave/wave-demuxer.ts b/src/wave/wave-demuxer.ts index a88ddb0..45febf7 100644 --- a/src/wave/wave-demuxer.ts +++ b/src/wave/wave-demuxer.ts @@ -327,15 +327,6 @@ export class WaveDemuxer extends Demuxer { return 'audio/wav'; } - async computeDuration() { - await this.readMetadata(); - - const track = this.tracks[0]; - assert(track); - - return track.computeDuration(); - } - async getTracks() { await this.readMetadata(); return this.tracks; @@ -383,11 +374,6 @@ class WaveAudioTrackBacking implements InputAudioTrackBacking { }; } - async computeDuration() { - const lastPacket = await this.getPacket(Infinity, { metadataOnly: true }); - return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0); - } - getNumberOfChannels() { assert(this.demuxer.audioInfo); return this.demuxer.audioInfo.numberOfChannels; @@ -421,10 +407,6 @@ class WaveAudioTrackBacking implements InputAudioTrackBacking { }; } - async getFirstTimestamp() { - return 0; - } - private async getPacketAtIndex( packetIndex: number, options: PacketRetrievalOptions,