From 5954a472fa0fd091f5bbaf3936760b7964585f4b Mon Sep 17 00:00:00 2001 From: Vanilagy <1696106+Vanilagy@users.noreply.github.com> Date: Fri, 4 Sep 2026 10:00:33 +0200 Subject: [PATCH 1/3] Remove console.log --- test/browser/flac-encoder-extension.test.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/browser/flac-encoder-extension.test.ts b/test/browser/flac-encoder-extension.test.ts index e89f5c4..519e5a8 100644 --- a/test/browser/flac-encoder-extension.test.ts +++ b/test/browser/flac-encoder-extension.test.ts @@ -30,8 +30,6 @@ test('FLAC encoder, 24-bit', async () => { expect(result.size).toBeGreaterThan(90_000); - console.log(result.size); - expect(sample.format).toBe('s32'); }); From 6c88763a5cc46f29fd3bfa3cc1ea4a0b76384764 Mon Sep 17 00:00:00 2001 From: "hi.jack2ee" <102357928+hijack2ee@users.noreply.github.com> Date: Fri, 4 Sep 2026 17:01:18 +0900 Subject: [PATCH 2/3] Terminate sample iterators before throwing so late-decoded samples are closed (#484) for await never calls return() on an iterator whose next() threw, so the error branches in mediaSamplesInRange / mediaSamplesAtTimestamps left the iteration un-terminated: the pump's decoder callback kept queueing decoded samples that no consumer or cleanup path could ever close, orphaning them until GC ("A VideoSample was garbage collected without first being closed"). Set terminated (and ended, where the pump gates on it) before throwing in both the InputDisposedError and out-of-band error branches of both sample generators - samples emitted after the throw are then closed on arrival by the existing checks in the decoder callbacks. Observed on iOS Safari when the hardware VideoDecoder dies mid-iteration ("Decoding task did not complete"): 3-14 samples orphaned per failing iterator; with this change, at most the single sample already in flight during the error microtask window. --- src/media-sink.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/media-sink.ts b/src/media-sink.ts index f34b761..7d70b62 100644 --- a/src/media-sink.ts +++ b/src/media-sink.ts @@ -601,11 +601,18 @@ export abstract class BaseMediaSampleSink< async next() { while (true) { if (track.input._disposed) { + // Once next() throws, the consumer will never call return(), so terminate the + // iteration here - otherwise, the pump keeps queueing decoded samples that + // nothing can ever close. + terminated = true; + ended = true; closeSamples(); throw new InputDisposedError(); } else if (terminated) { return { value: undefined, done: true }; } else if (hasOutOfBandError) { + terminated = true; + ended = true; closeSamples(); throw outOfBandError; } else if (sampleQueue.length > 0) { @@ -827,11 +834,16 @@ export abstract class BaseMediaSampleSink< async next() { while (true) { if (track.input._disposed) { + // Once next() throws, the consumer will never call return(), so terminate the + // iteration here - otherwise, the pump keeps queueing decoded samples that + // nothing can ever close. + terminated = true; closeSamples(); throw new InputDisposedError(); } else if (terminated) { return { value: undefined, done: true }; } else if (hasOutOfBandError) { + terminated = true; closeSamples(); throw outOfBandError; } else if (sampleQueue.length > 0) { From c67c5e4072cf834743498c45a5a5bdf058947aec Mon Sep 17 00:00:00 2001 From: Vanilagy <1696106+Vanilagy@users.noreply.github.com> Date: Fri, 4 Sep 2026 22:56:36 +0200 Subject: [PATCH 3/3] Bump patch --- package-lock.json | 20 ++++++++++---------- package.json | 2 +- packages/aac-encoder/package.json | 2 +- packages/ac3/package.json | 2 +- packages/dts/package.json | 2 +- packages/flac-encoder/package.json | 2 +- packages/mp3-encoder/package.json | 2 +- packages/prores/package.json | 2 +- packages/server/package.json | 4 ++-- 9 files changed, 19 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2585927..d96c064 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mediabunny", - "version": "1.55.6", + "version": "1.55.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mediabunny", - "version": "1.55.6", + "version": "1.55.7", "license": "MPL-2.0", "workspaces": [ ".", @@ -12958,7 +12958,7 @@ }, "packages/aac-encoder": { "name": "@mediabunny/aac-encoder", - "version": "1.55.6", + "version": "1.55.7", "license": "MPL-2.0", "devDependencies": { "@types/emscripten": "^1.40.1" @@ -12973,7 +12973,7 @@ }, "packages/ac3": { "name": "@mediabunny/ac3", - "version": "1.55.6", + "version": "1.55.7", "license": "MPL-2.0", "devDependencies": { "@types/emscripten": "^1.40.1" @@ -12988,7 +12988,7 @@ }, "packages/dts": { "name": "@mediabunny/dts", - "version": "1.55.6", + "version": "1.55.7", "license": "MPL-2.0", "devDependencies": { "@types/emscripten": "^1.40.1" @@ -13003,7 +13003,7 @@ }, "packages/flac-encoder": { "name": "@mediabunny/flac-encoder", - "version": "1.55.6", + "version": "1.55.7", "license": "MPL-2.0", "devDependencies": { "@types/emscripten": "^1.40.1" @@ -13018,7 +13018,7 @@ }, "packages/mp3-encoder": { "name": "@mediabunny/mp3-encoder", - "version": "1.55.6", + "version": "1.55.7", "license": "MPL-2.0", "devDependencies": { "@types/emscripten": "^1.40.1" @@ -13033,7 +13033,7 @@ }, "packages/prores": { "name": "@mediabunny/prores", - "version": "1.55.6", + "version": "1.55.7", "license": "MPL-2.0", "dependencies": { "turbores": "^1.2.2" @@ -13048,10 +13048,10 @@ }, "packages/server": { "name": "@mediabunny/server", - "version": "1.55.6", + "version": "1.55.7", "license": "MPL-2.0", "dependencies": { - "@mediabunny/prores": "^1.55.6", + "@mediabunny/prores": "^1.55.7", "node-av": "^6.0.0" }, "funding": { diff --git a/package.json b/package.json index bdd55f6..8612d0f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "mediabunny", "author": "Vanilagy", - "version": "1.55.6", + "version": "1.55.7", "description": "Pure TypeScript media toolkit for reading, writing, and converting media files, directly in the browser.", "type": "module", "workspaces": [ diff --git a/packages/aac-encoder/package.json b/packages/aac-encoder/package.json index 0351f6b..abda2f7 100644 --- a/packages/aac-encoder/package.json +++ b/packages/aac-encoder/package.json @@ -1,7 +1,7 @@ { "name": "@mediabunny/aac-encoder", "author": "Vanilagy", - "version": "1.55.6", + "version": "1.55.7", "description": "AAC encoder extension for Mediabunny, based on libavcodec.", "main": "./dist/bundles/mediabunny-aac-encoder.mjs", "module": "./dist/bundles/mediabunny-aac-encoder.mjs", diff --git a/packages/ac3/package.json b/packages/ac3/package.json index 8a793d3..e00f358 100644 --- a/packages/ac3/package.json +++ b/packages/ac3/package.json @@ -1,7 +1,7 @@ { "name": "@mediabunny/ac3", "author": "Vanilagy", - "version": "1.55.6", + "version": "1.55.7", "description": "AC-3 and E-AC-3 (Dolby Digital) decoder and encoder extension for Mediabunny, based on libavcodec.", "main": "./dist/bundles/mediabunny-ac3.mjs", "module": "./dist/bundles/mediabunny-ac3.mjs", diff --git a/packages/dts/package.json b/packages/dts/package.json index acce27d..15a10fb 100644 --- a/packages/dts/package.json +++ b/packages/dts/package.json @@ -1,7 +1,7 @@ { "name": "@mediabunny/dts", "author": "Vanilagy", - "version": "1.55.6", + "version": "1.55.7", "description": "DTS decoder and encoder extension for Mediabunny, based on libavcodec.", "main": "./dist/bundles/mediabunny-dts.mjs", "module": "./dist/bundles/mediabunny-dts.mjs", diff --git a/packages/flac-encoder/package.json b/packages/flac-encoder/package.json index 7b27b55..47cc4e5 100644 --- a/packages/flac-encoder/package.json +++ b/packages/flac-encoder/package.json @@ -1,7 +1,7 @@ { "name": "@mediabunny/flac-encoder", "author": "Vanilagy", - "version": "1.55.6", + "version": "1.55.7", "description": "FLAC encoder extension for Mediabunny, based on libFLAC.", "main": "./dist/bundles/mediabunny-flac-encoder.mjs", "module": "./dist/bundles/mediabunny-flac-encoder.mjs", diff --git a/packages/mp3-encoder/package.json b/packages/mp3-encoder/package.json index 5a60f5a..e343896 100644 --- a/packages/mp3-encoder/package.json +++ b/packages/mp3-encoder/package.json @@ -1,7 +1,7 @@ { "name": "@mediabunny/mp3-encoder", "author": "Vanilagy", - "version": "1.55.6", + "version": "1.55.7", "description": "MP3 encoder extension for Mediabunny, based on LAME.", "main": "./dist/bundles/mediabunny-mp3-encoder.mjs", "module": "./dist/bundles/mediabunny-mp3-encoder.mjs", diff --git a/packages/prores/package.json b/packages/prores/package.json index 57561b3..0b57b87 100644 --- a/packages/prores/package.json +++ b/packages/prores/package.json @@ -1,7 +1,7 @@ { "name": "@mediabunny/prores", "author": "Vanilagy", - "version": "1.55.6", + "version": "1.55.7", "description": "Apple ProRes decoder extension for Mediabunny, based on TurboRes.", "main": "./dist/bundles/mediabunny-prores.mjs", "module": "./dist/bundles/mediabunny-prores.mjs", diff --git a/packages/server/package.json b/packages/server/package.json index b7d7d04..ee6584e 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "name": "@mediabunny/server", "author": "Vanilagy", - "version": "1.55.6", + "version": "1.55.7", "description": "Adds full video and audio decoder and encoder support to Mediabunny for use in server-side environments (Node, Bun, Deno). Based on NodeAV.", "main": "./dist/bundles/mediabunny-server.cjs", "module": "./dist/bundles/mediabunny-server.mjs", @@ -35,7 +35,7 @@ }, "dependencies": { "node-av": "^6.0.0", - "@mediabunny/prores": "^1.55.6" + "@mediabunny/prores": "^1.55.7" }, "peerDependencies": { "mediabunny": "^1.45.0"