diff --git a/dev/demux.html b/dev/demux.html index d381167..3657899 100644 --- a/dev/demux.html +++ b/dev/demux.html @@ -55,7 +55,7 @@ const audioTrack = await input.getPrimaryAudioTrack(); const videoTrack = await input.getPrimaryVideoTrack(); - const drain = new Metamuxer.EncodedAudioSampleDrain(audioTrack); + const sink = new Metamuxer.EncodedAudioSampleSink(audioTrack); const decoderConfig = await audioTrack.getDecoderConfig(); const sampleSource = new Metamuxer.EncodedAudioSampleSource(await audioTrack.getCodec()); @@ -72,7 +72,7 @@ /* - for await (const sample of drain.samples()) { + for await (const sample of sink.samples()) { //console.log(sample.timestamp); //sample.timestamp *= 2; //console.log(sample); @@ -80,13 +80,13 @@ await sampleSource.digest(sample, { decoderConfig }); } */ - for await (const { data, timestamp } of new Metamuxer.AudioDataDrain(audioTrack).data()) { + for await (const { data, timestamp } of new Metamuxer.AudioDataSink(audioTrack).data()) { //console.log("wow", data.timestamp); //console.log(sample) await audioDataSource.digest(data); } /* - for await (const sample of new Metamuxer.EncodedVideoSampleDrain(videoTrack).samples()) { + for await (const sample of new Metamuxer.EncodedVideoSampleSink(videoTrack).samples()) { //console.log(sample) await videoSampleSource.digest(sample, { decoderConfig: videoDecoderConfig }); } diff --git a/dev/player.html b/dev/player.html index 0420ecb..1e871f6 100644 --- a/dev/player.html +++ b/dev/player.html @@ -68,8 +68,8 @@ durationElement.textContent = formatSeconds(totalDuration); playerDiv.style.display = 'flex'; -const videoDrain = videoTrack && new Metamuxer.CanvasDrain(videoTrack); -const audioDrain = audioTrack && new Metamuxer.AudioBufferDrain(audioTrack); +const videoSink = videoTrack && new Metamuxer.CanvasSink(videoTrack); +const audioSink = audioTrack && new Metamuxer.AudioBufferSink(audioTrack); let startTime = null; let playing = false; @@ -92,7 +92,7 @@ function getPlaybackTime() { function play() { audioBufferIterator?.return(); - audioBufferIterator = audioDrain?.buffers(getPlaybackTime()); + audioBufferIterator = audioSink?.buffers(getPlaybackTime()); startTime = audioContext.currentTime; playing = true; runAudioIterator(); @@ -135,7 +135,7 @@ async function seek() { await videoFrameIterator?.return(); - videoFrameIterator = videoDrain.canvases(getPlaybackTime()); + videoFrameIterator = videoSink.canvases(getPlaybackTime()); const newCurrentFrame = (await videoFrameIterator.next()).value; const newNextFrame = (await videoFrameIterator.next()).value; diff --git a/src/index.ts b/src/index.ts index 3cfc1b4..ab13612 100644 --- a/src/index.ts +++ b/src/index.ts @@ -71,18 +71,18 @@ export { } from './sample'; export { SampleRetrievalOptions, - BaseSampleDrain, + BaseSampleSink, WrappedMediaFrame, - BaseMediaFrameDrain, - EncodedVideoSampleDrain, - VideoFrameDrain, - EncodedAudioSampleDrain, - CanvasDrain, + BaseMediaFrameSink, + EncodedVideoSampleSink, + VideoFrameSink, + EncodedAudioSampleSink, + CanvasSink, WrappedCanvas, - AudioDataDrain, + AudioDataSink, WrappedAudioData, - AudioBufferDrain, + AudioBufferSink, WrappedAudioBuffer, -} from './media-drain'; +} from './media-sink'; // 🐡🦔 diff --git a/src/input-track.ts b/src/input-track.ts index 157d492..be12bf6 100644 --- a/src/input-track.ts +++ b/src/input-track.ts @@ -1,5 +1,5 @@ import { AudioCodec, MediaCodec, VideoCodec } from './codec'; -import { EncodedAudioSampleDrain, EncodedVideoSampleDrain, SampleRetrievalOptions } from './media-drain'; +import { EncodedAudioSampleSink, EncodedVideoSampleSink, SampleRetrievalOptions } from './media-sink'; import { Rotation } from './misc'; import { EncodedAudioSample, EncodedVideoSample } from './sample'; @@ -116,7 +116,7 @@ export class InputVideoTrack extends InputTrack { } computeSampleStats() { - return computeSampleStats(new EncodedVideoSampleDrain(this)); + return computeSampleStats(new EncodedVideoSampleSink(this)); } } @@ -185,7 +185,7 @@ export class InputAudioTrack extends InputTrack { } computeSampleStats() { - return computeSampleStats(new EncodedAudioSampleDrain(this)); + return computeSampleStats(new EncodedAudioSampleSink(this)); } } @@ -196,13 +196,13 @@ export type SampleStats = { averageBitrate: number; }; -const computeSampleStats = async (drain: EncodedVideoSampleDrain | EncodedAudioSampleDrain): Promise => { +const computeSampleStats = async (sink: EncodedVideoSampleSink | EncodedAudioSampleSink): Promise => { let startTimestamp = Infinity; let endTimestamp = -Infinity; let sampleCount = 0; let totalSampleBytes = 0; - for await (const sample of drain.samples(undefined, undefined, { metadataOnly: true })) { + for await (const sample of sink.samples(undefined, undefined, { metadataOnly: true })) { startTimestamp = Math.min(startTimestamp, sample.timestamp); endTimestamp = Math.max(endTimestamp, sample.timestamp + sample.duration); diff --git a/src/isobmff/isobmff-demuxer.ts b/src/isobmff/isobmff-demuxer.ts index 4a9ac11..a1cebcd 100644 --- a/src/isobmff/isobmff-demuxer.ts +++ b/src/isobmff/isobmff-demuxer.ts @@ -20,7 +20,7 @@ import { InputVideoTrack, InputVideoTrackBacking, } from '../input-track'; -import { SampleRetrievalOptions } from '../media-drain'; +import { SampleRetrievalOptions } from '../media-sink'; import { assert, COLOR_PRIMARIES_MAP_INVERSE, diff --git a/src/media-drain.ts b/src/media-sink.ts similarity index 94% rename from src/media-drain.ts rename to src/media-sink.ts index 42242c1..f3b197f 100644 --- a/src/media-drain.ts +++ b/src/media-sink.ts @@ -35,7 +35,7 @@ const validateTimestamp = (timestamp: number) => { }; /** @public */ -export abstract class BaseSampleDrain { +export abstract class BaseSampleSink { abstract getFirstSample(options?: SampleRetrievalOptions): Promise; abstract getSample(timestamp: number, options?: SampleRetrievalOptions): Promise; abstract getNextSample(sample: Sample, options?: SampleRetrievalOptions): Promise; @@ -162,7 +162,7 @@ abstract class DecoderWrapper< } /** @public */ -export abstract class BaseMediaFrameDrain< +export abstract class BaseMediaFrameSink< Sample extends EncodedVideoSample | EncodedAudioSample, MediaFrame extends VideoFrame | AudioData, WrappedFrame extends WrappedMediaFrame = WrappedMediaFrame, @@ -173,7 +173,7 @@ export abstract class BaseMediaFrameDrain< onError: (error: DOMException) => unknown ): Promise>; /** @internal */ - abstract _createSampleDrain(): BaseSampleDrain; + abstract _createSampleSink(): BaseSampleSink; /** @internal */ private _duplicateFrame(frame: WrappedFrame) { @@ -248,8 +248,8 @@ export abstract class BaseMediaFrameDrain< } }); - const sampleDrain = this._createSampleDrain(); - const keySample = await sampleDrain.getKeySample(startTimestamp) ?? await sampleDrain.getFirstSample(); + const sampleSink = this._createSampleSink(); + const keySample = await sampleSink.getKeySample(startTimestamp) ?? await sampleSink.getFirstSample(); if (!keySample) { return; } @@ -262,19 +262,19 @@ export abstract class BaseMediaFrameDrain< // frames (B-frames). Instead, we'll need to keep decoding samples until we get a frame that exceeds // this end time. However, we can still put a bound on it: Since key frames are by definition never // out of order, we can stop at the first key frame after the end timestamp. - const endSample = await sampleDrain.getSample(endTimestamp); + const endSample = await sampleSink.getSample(endTimestamp); const endKeySample = !endSample ? null : endSample.type === 'key' && endSample.timestamp === endTimestamp ? endSample - : await sampleDrain.getNextKeySample(endSample); + : await sampleSink.getNextKeySample(endSample); if (endKeySample) { samplesEndTimestamp = endKeySample.timestamp; } } - const samples = sampleDrain.samples(keySample, samplesEndTimestamp); + const samples = sampleSink.samples(keySample, samplesEndTimestamp); await samples.next(); // Skip the start sample as we already have it while (currentSample && !ended) { @@ -409,7 +409,7 @@ export abstract class BaseMediaFrameDrain< } }); - const sampleDrain = this._createSampleDrain(); + const sampleSink = this._createSampleSink(); let lastKeySample: Sample | null = null; let lastSample: Sample | null = null; @@ -425,13 +425,13 @@ export abstract class BaseMediaFrameDrain< break; } - const targetSample = await sampleDrain.getSample(timestamp); + const targetSample = await sampleSink.getSample(timestamp); if (!targetSample) { pushToQueue(null); continue; } - const keySample = await sampleDrain.getKeySample(timestamp); + const keySample = await sampleSink.getKeySample(timestamp); if (!keySample) { pushToQueue(null); continue; @@ -461,7 +461,7 @@ export abstract class BaseMediaFrameDrain< } while (lastSample.timestamp !== targetSample.timestamp) { - const nextSample = await sampleDrain.getNextSample(lastSample); + const nextSample = await sampleSink.getNextSample(lastSample); assert(nextSample); lastSample = nextSample; @@ -523,7 +523,7 @@ export abstract class BaseMediaFrameDrain< } /** @public */ -export class EncodedVideoSampleDrain extends BaseSampleDrain { +export class EncodedVideoSampleSink extends BaseSampleSink { /** @internal */ _videoTrack: InputVideoTrack; @@ -620,7 +620,7 @@ class VideoDecoderWrapper extends DecoderWrapper } /** @public */ -export class VideoFrameDrain extends BaseMediaFrameDrain { +export class VideoFrameSink extends BaseMediaFrameSink { /** @internal */ _videoTrack: InputVideoTrack; @@ -653,8 +653,8 @@ export class VideoFrameDrain extends BaseMediaFrameDrain this._videoFrameToWrappedCanvas(frame), ); } canvasesAtTimestamps(timestamps: AnyIterable) { return mapAsyncGenerator( - this._videoFrameDrain.framesAtTimestamps(timestamps), + this._videoFrameSink.framesAtTimestamps(timestamps), async frame => frame && this._videoFrameToWrappedCanvas(frame), ); } } /** @public */ -export class EncodedAudioSampleDrain extends BaseSampleDrain { +export class EncodedAudioSampleSink extends BaseSampleSink { /** @internal */ _audioTrack: InputAudioTrack; @@ -1023,7 +1023,7 @@ export type WrappedAudioData = { }; /** @public */ -export class AudioDataDrain extends BaseMediaFrameDrain { +export class AudioDataSink extends BaseMediaFrameSink { /** @internal */ _audioTrack: InputAudioTrack; @@ -1069,8 +1069,8 @@ export class AudioDataDrain extends BaseMediaFrameDrain this._audioDataToWrappedArrayBuffer(data), ); } buffersAtTimestamps(timestamps: AnyIterable) { return mapAsyncGenerator( - this._audioDataDrain.dataAtTimestamps(timestamps), + this._audioDataSink.dataAtTimestamps(timestamps), async data => data && this._audioDataToWrappedArrayBuffer(data), ); } diff --git a/src/wave/wave-demuxer.ts b/src/wave/wave-demuxer.ts index 3c7033f..557085a 100644 --- a/src/wave/wave-demuxer.ts +++ b/src/wave/wave-demuxer.ts @@ -2,7 +2,7 @@ import { AudioCodec } from '../codec'; import { Demuxer } from '../demuxer'; import { Input } from '../input'; import { InputAudioTrack, InputAudioTrackBacking } from '../input-track'; -import { SampleRetrievalOptions } from '../media-drain'; +import { SampleRetrievalOptions } from '../media-sink'; import { assert } from '../misc'; import { Reader } from '../reader'; import { EncodedAudioSample, PLACEHOLDER_DATA } from '../sample';