Commit Graph
54 Commits
Author SHA1 Message Date
Vanilagy 9a1b8b2602 Add timestampBase option for live MediaStreamTrack sources 2026-04-27 19:38:45 +02:00
b05cdbe7e0 fix: two long-running HLS transcode issues (#355)
* fix: release targets from Output._targets on finalize

Long-running HLS transcodes leak memory. Every finalized BufferTarget
stays in _targets until the outer Output closes, pinning its buffer.
Writer.finalize() already does this cleanup for writer-based flows;
extend it to buffer-finalize paths via the public 'finalized' event.

* fix: ReadOrchestrator LRU eviction picks only drained workers

assert(pendingSlices.length === 0) fires under heavy concurrent reads
(e.g. multi-rendition HLS decode from BlobSource). LRU filter only
checked !running; workers with queued slices could be evicted.
Add pendingSlices.length === 0 to the filter.

* fix: export AppendOnlyStreamTarget from index

Missing from the re-export; public docs import it by name.

* fix: join HLS init segment path with root + playlist path

Init path went through _getTarget bare; segments got joined with rootPath + playlist.path. Playlist-relative URI then can't resolve when the playlist lives in a subdirectory.

* Fix targets not being cleaned up, fix paused workers with remaining pending slices, modify doc block, fixed isRoot not being changed on proxied requests

---------

Co-authored-by: Vanilagy <[email protected]>
2026-04-23 14:37:56 +02:00
Vanilagy 783cfa6fbe Add AppendOnlyStreamSource, adjust examples to use it 2026-04-21 14:58:33 +02:00
77e70f9090 Add BufferTarget.onFinalize, OutputOptions.onFinalize, ConcurrentRunner (#349)
* Add BufferTarget.onFinalize option for awaitable async action on finalize

The `finalized` event fires synchronously and its return value is ignored,
making it unsuitable for use cases where the muxer should wait (e.g.
uploading the buffer to S3, R2, or other object stores that require a
known Content-Length and therefore can't stream via StreamTarget).

Adds a new `BufferTargetOptions` type with an `onFinalize` callback that
the muxer awaits before resolving. Matches the existing callback pattern
used by `HlsOutputFormatOptions.onSegment`, `onMaster`, etc.

When used with PathedTarget, this provides proper backpressure: the next
segment won't start being produced until the previous one has finished
uploading, keeping memory bounded regardless of video length.

- Adds `BufferTargetOptions` type, exported from the package root
- `BufferTarget` constructor now accepts optional options (backward compatible)
- `_finalize()` awaits `onFinalize` before emitting the `finalized` event
- Adds runtime validation for non-function callbacks
- Updates "Upload to a server" docs in writing-hls.md with S3 pattern
- Documents `onFinalize` in writing-media-files.md BufferTarget section
- Adds tests for callback invocation, async awaiting, backward compat, and validation

* Add ConcurrentRunner, add OutputOptions.onFinalize, adjust docs accordingly, clean up tests

* give me more control baby

* forgot to tell about it

* polish guide and js docs

* vanilagy says remove this, docs will reveal it

---------

Co-authored-by: Vanilagy <[email protected]>
2026-04-17 18:42:09 +02:00
Vanilagy b85ecd3109 Code review fixes 2026-04-16 17:43:12 +02:00
Vanilagy 56b25fbdf8 Add onSegmentPopped, add more tests, improve validation, improve M3U8 grammar 2026-04-16 14:48:57 +02:00
Vanilagy 2d0aac3208 Fix HLS demuxer parsing bug, extract HLS mime type out, add TargetRequest.mimeType 2026-04-16 10:53:36 +02:00
Vanilagy aa810fc433 Fix SourceRef race conditions, fix "source" and "target" getter returning unused instances, add missing validation, make "getDurationFromMetadata" only exist on tracks, fix examples, expand media player to support live playback, change the signatures of some Input APIs 2026-04-10 13:38:14 +02:00
Vanilagy 0813bcab28 Add missing doc blocks for everything, add PathedTarget and PathedSource, few other changes & fixes 2026-04-09 15:22:45 +02:00
Vanilagy 340b5eede7 Add support for writing Unix epoch-relative tracks to HLS, add proper cleanup of all Targets obtained by an Output 2026-03-31 15:12:38 +02:00
Vanilagy b06e407d65 Add HLS live mode 2026-03-31 14:13:00 +02:00
Vanilagy 3bcbcc13f0 Add CMAF format and CMAF/init segment support to HLS muxer 2026-03-30 17:06:57 +02:00
Vanilagy 94678dd356 Add support for writing I-frame only tracks, fix track closing race conditions in other muxers 2026-03-27 18:48:27 +01:00
Vanilagy e2e8aaab78 Refactor Target and Writer, add single-file HLS writing mode 2026-03-27 18:07:26 +01:00
Vanilagy 17fac170c1 Add some HLS events, add configurable target duration, add public-API OutputTrack 2026-03-27 13:37:14 +01:00
Vanilagy 157582498f Remove InputTrack.groupId, hide pairing mask, change HLS track merging behavior 2026-03-24 21:54:00 +01:00
Vanilagy 3e87d747e6 Add HLS master playlist generation, add multi-playlistadd output track grouping, add multi-playlist HLS files, add configurable playlist and segment names, add TrackDisposition.primary 2026-03-24 15:53:21 +01:00
Vanilagy dd8621b6d5 Start work on HlsOutputFormat 2026-03-17 15:25:06 +01:00
Vanilagy 7e8f9fbbb1 It's 2026 2026-01-16 17:02:12 +01:00
Vanilagy 217b383f12 Add read/write support for track disposition information 2025-11-13 11:00:42 +01:00
Vanilagy f340e19baa Clarify docs 2025-09-18 10:11:27 +02:00
Vanilagy c5523516c7 Add fastStart: 'reserve' option (closes #119) 2025-09-17 12:26:24 +02:00
Vanilagy dcd99f8930 Add metadata tag support to Conversion API 2025-09-05 23:34:24 +02:00
Vanilagy c6cb8f7b43 Document metadata tags 2025-09-05 22:27:46 +02:00
Vanilagy b58476b1b0 Renaming 2025-09-05 18:59:13 +02:00
Vanilagy 034a7254d2 Merge branch 'main' into metadata 2025-09-03 21:12:16 +02:00
Vanilagy a2a30c3e92 Add API doc generator, improve documentation across the board 2025-09-03 18:11:43 +02:00
Vanilagy fb0c41aa09 Implement MP3 metadata (ID3v1/2) read & write 2025-08-25 17:43:40 +02:00
Vanilagy bb1b20afa7 Add track name support 2025-08-23 15:33:44 +02:00
Vanilagy ba0491de3a Circumvent flush() being called on sources when cancelling output, surface error before doing cleanup 2025-08-10 03:24:17 +02:00
Vanilagy d38ad22559 Big realtime playback refactor
- Added Worker- or AudioContext-based fallbacks in case MediaStreamTrackProcessor is not available
- Fixed fMP4-streamed files not playing in Safari
- Added better error handling for MediaStream sources
- Improved the live recording example to be more robust
2025-07-27 12:13:03 +02:00
Vanilagy 846fa0b183 Adjust legal comment 2025-06-27 13:22:19 +02:00
Vanilagy a3d73228e2 Add proper license 2025-06-27 13:14:11 +02:00
Vanilagy c7c57e2132 Add getMimeType to Output & other small adjustments 2025-06-07 22:51:57 +02:00
Vanilagy e527fe1484 Allow fractional frame rates in track metadata, document frameRate better, other small doc adjustments 2025-04-28 15:48:51 +02:00
David Payr 3863ffe4d8 Add documentation comments everywhere 2025-03-15 17:12:42 +01:00
Vanilagy 00975b456c Fix error when aborting conversion, expose Conversion class for more control, refactor Output state 2025-03-02 17:32:56 +01:00
Vanilagy 453f8b6884 Ensure rotation is always clockwise, make CanvasSink more powerful, disable rotation metadata for Matroska outputs, & other changes 2025-03-02 11:59:11 +01:00
Vanilagy 7988b6c2f8 Multiple miscellaneous fixes 2025-02-18 22:13:21 +01:00
Vanilagy b3cd4de1f6 Make conversion cancelable 2025-02-09 17:55:59 +01:00
Vanilagy 70b88332b2 Add media conversion utility function, fix fragment/cluster reading issues, expand color space logic, add qualitative bitrates, & many other fixes and improvements 2025-01-19 18:55:12 +01:00
Vanilagy d323c2be8e Add track count limit checking 2025-01-17 12:26:12 +01:00
Vanilagy 2bec661985 Add setting track language code, add proper AV1 CodecPrivate for Matroska muxer 2025-01-15 20:00:29 +01:00
Vanilagy 74369ee108 Explicitly model the supported codecs per output format 2025-01-02 21:03:17 +01:00
Vanilagy 141bed1b37 Add Output.cancel 2025-01-02 19:57:32 +01:00
Vanilagy ecfd193ae0 Start work on demuxing 2024-12-08 15:19:56 +01:00
Vanilagy 6730e41c07 Add ESLint and lint a bunch 2024-12-01 17:33:54 +01:00
Vanilagy 266fcd473e Use WritableStream for StreamTarget & integrate backpressure concepts 2024-11-28 22:06:49 +01:00
Vanilagy 78505bca82 Add api-extractor and add required exports 2024-11-25 21:18:44 +01:00
Vanilagy b51b2b1b45 Address a bunch of TODOs and add parameter validation everywhere 2024-11-24 21:17:00 +01:00