From 9ac0519217d2fefe4f2f16c79e6adb76acb208d8 Mon Sep 17 00:00:00 2001 From: Vanilagy <1696106+Vanilagy@users.noreply.github.com> Date: Thu, 2 Jan 2025 20:01:30 +0100 Subject: [PATCH] Add onEncodedChunk callback --- src/media-source.ts | 19 +++++++++++++++---- todo.txt | 1 - 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/media-source.ts b/src/media-source.ts index 5e1a659..a502a49 100644 --- a/src/media-source.ts +++ b/src/media-source.ts @@ -122,7 +122,8 @@ export type VideoCodecConfig = { bitrate: number; latencyMode?: VideoEncoderConfig['latencyMode']; keyFrameInterval?: number; - onEncodingError?: (error: Error) => void; + onEncodedChunk?: (chunk: EncodedVideoChunk, meta: EncodedVideoChunkMetadata | undefined) => unknown; + onEncodingError?: (error: Error) => unknown; }; const validateVideoCodecConfig = (config: VideoCodecConfig) => { @@ -144,6 +145,9 @@ const validateVideoCodecConfig = (config: VideoCodecConfig) => { ) { throw new TypeError('config.keyFrameInterval, when provided, must be a non-negative number.'); } + if (config.onEncodedChunk !== undefined && typeof config.onEncodedChunk !== 'function') { + throw new TypeError('config.onEncodedChunk, when provided, must be a function.'); + } if (config.onEncodingError !== undefined && typeof config.onEncodingError !== 'function') { throw new TypeError('config.onEncodingError, when provided, must be a function.'); } @@ -206,7 +210,10 @@ class VideoEncoderWrapper { } this.encoder = new VideoEncoder({ - output: (chunk, meta) => void this.muxer!.addEncodedVideoChunk(this.source._connectedTrack!, chunk, meta), + output: (chunk, meta) => { + this.codecConfig.onEncodedChunk?.(chunk, meta); + void this.muxer!.addEncodedVideoChunk(this.source._connectedTrack!, chunk, meta); + }, error: this.codecConfig.onEncodingError ?? (error => console.error('VideoEncoder error:', error)), }); @@ -403,7 +410,8 @@ export class EncodedAudioChunkSource extends AudioSource { export type AudioCodecConfig = { codec: AudioCodec; bitrate: number; - onEncodingError?: (error: Error) => void; + onEncodedChunk?: (chunk: EncodedAudioChunk, meta: EncodedAudioChunkMetadata | undefined) => unknown; + onEncodingError?: (error: Error) => unknown; }; const validateAudioCodecConfig = (config: AudioCodecConfig) => { @@ -469,7 +477,10 @@ class AudioEncoderWrapper { } this.encoder = new AudioEncoder({ - output: (chunk, meta) => void this.muxer!.addEncodedAudioChunk(this.source._connectedTrack!, chunk, meta), + output: (chunk, meta) => { + this.codecConfig.onEncodedChunk?.(chunk, meta); + void this.muxer!.addEncodedAudioChunk(this.source._connectedTrack!, chunk, meta); + }, error: this.codecConfig.onEncodingError ?? (error => console.error('AudioEncoder error:', error)), }); diff --git a/todo.txt b/todo.txt index e59ea96..f5061a9 100644 --- a/todo.txt +++ b/todo.txt @@ -1,4 +1,3 @@ -- Progress reporting - Test tree shaking - Throw if edit list detected - Audio codec string regex validation