Highlights
- AV1 end-to-end. AV1 now works across the whole pipeline — ingest over WHIP and enhanced RTMP, playback over WebRTC and LL-HLS fMP4, software encode/decode via libaom, and MP4 recording.
- Runtime track configuration changes. LL-HLS and HLS signal discontinuity when a track's configuration changes mid-stream, OVT relays those changes to edges, and the transcoder preserves frames and keyframe cadence across the switch.
- DRM. Runtime key rotation for LL-HLS and HEVC (H.265) subsample encryption, with CENC key tag generation unified behind a single path.
- FFmpeg 7.1.5. Upgraded from the previous FFmpeg baseline, with the surrounding code updated accordingly.
- Thread Safety Analysis. Clang TSA mutex wrappers and annotations were introduced across the codebase, surfacing and fixing a substantial batch of latent data races.
- CMake-only build. The legacy make-based build system is gone; CMake is now the only supported path.
- Queue observability. Internal queues now report dwell-time percentiles and last-interval stats through alerts, the stats API, and logs.
Breaking changes & deprecations
- Hardware acceleration was restructured and deprecated (#2202). Codecs are now organized by backend.
- Intel QSV hardware acceleration was removed (#2209).
- The legacy make-based build system was removed (#2200). Use CMake.
- HEVC sample entry changed from
hev1tohvc1(#2258). Verify playback on your target players. - JSON naming for all-caps acronyms changed in configuration and API responses (#2110). API consumers parsing those field names need to be updated.
- The unused FILE provider was removed (#2056).
src/projects/*was flattened intosrc/*(#2248). This affects contributors, tooling, and any out-of-tree patches or release scripts that reference the old paths.
Added (43)
AV1 end-to-end support
- bitstream: Add AV1 OBU parser and codec configuration record (#2182) — @dimiden
- Add AV1 media type support (#2184) — @dimiden
- webrtc: Support AV1 ingest over WHIP (#2187) — @getroot
- webrtc: Support AV1 over WebRTC playback (#2196) — @getroot
- rtmp: Support AV1 ingest over enhanced RTMP (#2204) — @dimiden
- av1: Add support for libaom (AV1) installation (#2205) — @Keukhan
- llhls: Add AV1 codec support to LLHLS fMP4 packaging (#2206) — @dimiden
- av1: Add AV1 software codec support for decoder and encoder (#2241) — @Keukhan
- av1: Add AV1 recording to mp4 (#2242) — @Keukhan
Runtime track configuration changes
- llhls: Support runtime track configuration changes with discontinuity signaling (#2255) — @getroot
- hls: Support runtime track configuration changes with discontinuity signaling (#2256) — @getroot
- ovt: Relay runtime track configuration changes to edges (#2257) — @getroot
DRM
- llhls: Support runtime DRM key rotation (#2261) — @getroot
- drm: Add HEVC (H.265) subsample encryption (#2264) — @Keukhan
WebRTC / ICE
- Support per-RID Oven-Capabilities for simulcast streams (#2076) — @SangwonOh
- Add TCP ICE candidate support (RFC 6544) (#2085) — @getroot
- Rework WebRTC JitterBuffer with adaptive PTS-anchored pacing (#2097) — @getroot
- webrtc: Implement AP (Aggregation Packets) support for H.264/H.265 RTP packetizer (#2105) — @Keukhan
- Add receive-side NACK + RTX to WebRTC Provider (#2175) — @getroot
- Handle concurrent RTP/RTCP receive on ICE candidate switch (#2177) — @getroot
Codecs & packaging
- ffmpeg: Upgrade to FFmpeg 7.1.5 and related code (#2237) — @Keukhan
- hevc: Add H.265 slice header parser and switch sample entry to hvc1 (#2258) — @Keukhan
- thumbnail: Add AVIF thumbnail support (#2268) — @Keukhan
Ingest & relay
- Add multi-audio track metadata support to Multiplex provider (#2071) — @nums
- mpegts: Add MP2 audio ingest support (#2103) — @ysle
- publishers/ovt: Add
TrackSetfor selective track delivery (#2119) — @dimiden
Observability & operations
- logger: Add toggle to disable file output (#2154) — @naanlizard
- Warn when an unready track blocks stream preparation (#2197) — @getroot
- Log track info on stream creation (#2198) — @getroot
- Expose internal-queue dwell-time percentiles in alerts, stats, and logs (#2229) — @getroot
- Add last-interval dwell-time stats to internal queues (#2236) — @getroot
- Add OME_LATENCY_PROBE build option for serving-path latency instrumentation (#2243) — @getroot
- alert: Add server identification info (serverInfo) to alert notifications (#2263) — @choigilhoon
Speech-to-Text
API
Internals & infrastructure
- Add Transport field to SocketAddress (#2083) — @getroot
- Add ManagedQueue::InjectWakeup() to wake a blocked Dequeue() (#2150) — @getroot
- ovlibrary: Add Clang Thread Safety Analysis (TSA) mutex wrappers and build infrastructure (#2183) — @dimiden
- Enable jemalloc background purge by default, configurable via Server.xml (#2244) — @getroot
- tr: Add generic data plane interface for media frame backends (#2246) — @Keukhan
- modules: Add TaskPool for running short tasks on shared workers (#2265) — @getroot
Docs tooling
- Seed docs-site/ with the ovenmedialabs.com MDX manual (#2120) — @getroot
- Move docs source from docs-site/ to docs/ (#2133) — @getroot
Fixed (63)
Transcoder & encoding
- Frame duration is 0 in fps filter when skipFrames is disabled (#2055) — @Keukhan
- Protect _transcode_apps with shared_mutex in Transcoder (#2067) — @getroot
- Keep OutputTrack quality even when input stream is updated (#2078) — @Keukhan
- Fixed regression where framerate did not work during image encoding (#2145) — @Keukhan
- transcoder: Correct
OV_GUARDED_BYplacement on_input_stream(#2208) — @dimiden - trs: Improve output FPS determination order when no framerate is configured (#2217) — @Keukhan
- transcoder: Handle media property changes in filters correctly (#2272) — @getroot
- transcoder: Fix out of memory caused by unbounded frame buffering (#2278) — @Keukhan
- transcoder: Preserve frames and keyframe cadence across track changes (#2284) — @getroot
- transcoder: Rescale bypass timestamps with integers (#2286) — @Keukhan
- transcoder: Recover delayed frames and keep slot continuity at track changes (#2287) — @getroot
WebRTC / ICE
- Prevent IsSendable() warning spam and delayed ICE session cleanup on disconnect (#2072) — @getroot
- Correct playout-delay RTP header extension bit packing (#2090) — @getroot
- webrtc: Tighten ICE/STUN/DTLS authentication checks (#2107) — @getroot
- webrtc: Improve WebRTC ICE connectivity stability (#2144) — @getroot
- webrtc: Improve Pacer startup smoothness and per-track buffering (#2163) — @getroot
- webrtc: Cache certificates inserted before signalling/WHIP HTTPS servers exist (#2166) — @dimiden
- Suppress repeated incomplete-frame error logs in jitter buffer (#2167) — @getroot
- Distribute WebRTC UDP ICE across multiple ports (#2176) — @getroot
- Key RTP receiver jitter-buffer and track maps by track_id (#2178) — @getroot
Ingest & providers
- Stream name incorrectly generated when schedule filename contains multiple dots (#2053) — @getroot
- pull: Avoid false epoll delete errors for stopped pull streams (#2054) — @dimiden
- Resolve data races in provider stream (#2068) — @dimiden
- Support negative RTMP extended timestamp deltas (#2093) — @dimiden
- mpegts: Split AAC PES into per-frame access units for fMP4/LL-HLS (#2224) — @dimiden
- rtspc: Split aggregated AAC access units into per-frame samples for fMP4/LL-HLS (#2226) — @dimiden
- mpegts: Harden the demuxer against lossy and reordered UDP input (#2234) — @dimiden
- provider: Honor
PacketSilenceTimeoutMsduring the pre-publish window (#2262) — @dimiden - rtmp: Stop deleting a low frame rate input before its first media packet (#2275) — @dimiden
- provider: Apply only operator-set timeouts before a push channel publishes (#2290) — @dimiden
Publishers & packaging
- Create dynamic application for HTTP publishers with wildcard template (#2114) — @getroot
- publishers/ovt: Data race on shared
_description(#2165) — @dimiden - llhls: Block chunklist reload when _HLS_part is omitted (#2207) — @getroot
- file: Serialize file writer lifecycle to fix races during concurrent recording control (#2252) — @Keukhan
- thumbnail: LL-HLS playback fails with 404 after a thumbnail request on the same http/2 connection (#2254) — @choigilhoon
- http2: Fix HPACK stale indexes and header block interleaving (#2270) — @getroot
- thumbnail: A thumbnail request delays other sockets (#2281) — @Keukhan
Concurrency & thread safety
- Make socket and metrics timestamp fields atomic (#2181) — @getroot
- tsa: Resolve data races surfaced by thread-safety annotations across modules (#2195) — @dimiden
- Prevent crash in internal-queue stats API under concurrent queue updates (#2223) — @getroot
- stream: Keep runtime state shared between stream copies (#2267) — @getroot
- base: Guard
info::Stream::_playlistsagainst concurrent access (#2280) — @dimiden
Queue, alert & routing
- Prevent warning logs for queue exceed caused by buffering delay setting (#2095) — @Keukhan
- Distribute MediaRouter streams across all workers via round-robin (#2227) — @getroot
- Alert repeatedly sends codes=OK while internal queue congestion persists (#2233) — @choigilhoon
- queue: Suppress "Exceeded" warning log when exceed-and-wait is enabled (#2249) — @Keukhan
- multiplex: Fix tap queue overflow warning and unbounded growth (#2274) — @getroot
- alert: Send an alert when decoder recreation fails (#2285) — @Keukhan
Push, SRT & networking
- Resolve issue where one push session delay affects other push sessions (#2142) — @Keukhan
- Treat terminal SRT epoll errors as disconnects (#2160) — @dimiden
- push: Fill in error reason for failed packet writes (#2170) — @Keukhan
Speech-to-Text
- Prevent Whisper STT encoder crash on stream stop (#2194) — @getroot
- Preload Whisper model on the configured OME device, not the CUDA index (#2221) — @getroot
API
Build & packaging
- Added cudaGetDeviceProperties_v2 function to libcudart.12 stub library (#2063) — @Keukhan
- Fixed incorrect libdir in hiredis.pc caused by the LIBRARY_PATH env (#2082) — @Keukhan
- Fix nvcc_hdr library compilation error with CMake (#2084) — @Keukhan
- build: Add missing libraries for NVIDIA and Whisper dependencies (#2146) — @Keukhan
- build: Include stubs directory for NVIDIA libraries in Docker image (#2147) — @Keukhan
- Build jemalloc with 16 KiB page support (#2159) — @ViRb3
- build: Retry dependency downloads instead of aborting on transient server errors (#2273) — @choigilhoon
CI
- ci: Grant actions:write so CLA check updates after signing (#2192) — @choigilhoon
Docs tooling
Changed / Refactored (24)
Hardware acceleration restructuring
- trs: Hardware acceleration deprecated (#2202) — @Keukhan
- Remove Intel QSV hardware acceleration support (#2209) — @Keukhan
- tr: Added bitstream analyzer for codec info instead of bitstream framer (#2238) — @Keukhan
Track configuration & packaging
- Deliver track configuration changes as immutable track versions (#2251) — @getroot
- llhls: Unify CENC key tag generation and make DRMSystem a bit flag (#2253) — @dimiden
- llhls: Drive DRM key rotation through one path for every key source (#2266) — @getroot
- Harden marker handling in the packagers (#2282) — @getroot
Transcoder
- Add Instantiate() to probe encoder properties before full creation (#2058) — @getroot
- trs: AVFrame pixel format helpers in ffmpeg::compat (#2279) — @Keukhan
- transcoder: Restructure SkipFrames control and improve its accuracy (#2289) — @Keukhan
Concurrency & thread safety
- Use steady_clock for elapsed time and timeout tracking (#2113) — @getroot
- Use find()/iterator instead of map operator[] under shared_lock (#2179) — @getroot
- tsa: Adopt
ov::Mutexwrappers and thread-safety annotations across modules (#2186) — @dimiden
Core structure
- Improve pull stream error handling in Orchestrator (#2035) — @dimiden
- providers/api: Prepare stream delete flow for API intent and watcher handoff (#2100) — @dimiden
- Allow provider modules to register after
StartServer(#2149) — @dimiden - Split
Orchestrator::DeleteApplication()into wrapper and internal helper (#2155) — @dimiden - ovsocket: Return
tl::expectedfromSocket::Recv(#2201) — @dimiden - Flatten
src/projects/*intosrc/(#2248) — @dimiden
Cleanup
- Remove unused FILE provider (#2056) — @Keukhan
- rtmp: Remove unused audio sampleindex fields (#2057) — @dimiden
- Add expired flag to ICE state change callbacks (#2089) — @dimiden
- config: Fix JSON naming convention for all-caps acronyms (#2110) — @dimiden
- mq: Refactoring and stabilization (#2174) — @Keukhan
Performance (3)
- Optimize MPEG-2 TS packetizer performance (#2069) — @getroot
- Reduce Whisper STT GPU memory and utilization (#2158) — @getroot
- phyport: Add
SO_REUSEPORTsupport for UDP physical ports (#2214) — @dimiden
Build (15)
- Add
TartanLlama/expected1.3.1 third-party dependency (#2051) — @dimiden - Fix cmake prerequisite installation failures on Ubuntu 22 with cmake 4.x (#2075) — @getroot
- Update cmake build system and getting started guide (#2088) — @choigilhoon
- cmake: Fix stubs install and improve NVIDIA linking condition (#2099) — @Keukhan
- cmake: Fix ffnvcodec auto-install regression (#2104) — @getroot
- Push Docker images to both ovenmedialabs and airensoft registries (#2106) — @choigilhoon
- Auto-assign requested reviewer as assignee (#2115) — @getroot
- Fix permission for auto-assign workflow (#2118) — @getroot
- Improved to eliminate CUDA driver version dependency (#2135) — @Keukhan
- Validate NVIDIA toolchain and auto-select nvcc host compiler (#2148) — @getroot
- Fix jemalloc not enabled by default in Release builds (#2151) — @getroot
- Guard against libstdc++ without pthread_cond_clockwait (#2152) — @getroot
- stubs: Add required CUDA stub functions (#2153) — @Keukhan
- Fix NVIDIA link failure when OME_BUILD_TESTS=ON (#2161) — @getroot
- Say goodbye to the legacy make-based build system (#2200) — @dimiden
CI (6)
- Notify ovenmedialabs.com when docs-site/ changes (#2127) — @getroot
- Allow 'ci' prefix in PR title check (#2128) — @getroot
- Build the consuming site against PR docs to catch breakage (#2129) — @getroot
- Point check-docs-build at main now that the site has cut over (#2131) — @getroot
- Point at the renamed ovenmedialabs.com repo (#2132) — @getroot
- Add CLA Assistant GitHub Action workflow (#2188) — @choigilhoon
Documentation (24)
- Update all references from AirenSoft to OvenMediaLabs (#2108) — @choigilhoon
- Document option for WebRTC publisher (#2111) — @getroot
- Fix HLS dump example placed inside LLHLS block (#2116) — @getroot
- Flatten transparent diagram backgrounds (#2121) — @getroot
- Rewrite legacy GitBook URLs to ovenmedialabs.com /docs/ome paths (#2122) — @getroot
- Fix broken links in docs-site (#2123) — @getroot
- Fix remaining broken links in docs-site (#2124) — @getroot
- Sweep remaining broken links in docs-site (#2125) — @getroot
- Add local preview script and docs-site README (#2126) — @getroot
- Consolidate authoring guide into README.md (#2134) — @getroot
- Rename GitBook-exported image files to descriptive names (#2137) — @getroot
- Document how to target a specific release version (#2138) — @getroot
- Fix admonition title syntax for Docusaurus 3 (#2139) — @getroot
- Add SEO/AIO meta descriptions to docs frontmatter (#2140) — @getroot
- Update webrtc ice candidate port from range to single port (10000/udp + 10000/tcp) (#2141) — @choigilhoon
- Update quick-start README (#2172) — @SangwonOh
- Update supported codecs and hardware accelerators (#2173) — @lee-hammer99
- tsa: Add contributor guide for thread safety analysis (#2219) — @dimiden
- readme: Fix broken links and restructure sections (#2225) — @lee-hammer99
- Add v1 /version API spec and docs (#2239) — @IanMitchell77
- drm: Add PlayReady to LLHLS DRM guide and DrmInfo example (#2259) — @dimiden
- Correct DRM systems and codec support in feature lists (#2269) — @Keukhan
- thumbnail: Document AVIF thumbnail support (#2271) — @Keukhan
- Replace legacy ovenmedialabs.com references with ovenmedia.com (#2292) — @lee-hammer99
Tests (2)
- rtmp: Fix rtmp_test build after RTMP timestamp helper refactor (#2098) — @dimiden
- transcoder: Fix the failing transcoder unit test (#2283) — @Keukhan
Chore (1)
- license: Update LICENSE-3RD-PARTY with dependency versions and add missing libraries (#2260) — @Keukhan
New Contributors
- @SangwonOh made their first contribution in #2076
- @ysle made their first contribution in #2103
- @ViRb3 made their first contribution in #2159
- @lee-hammer99 made their first contribution in #2173
- @lee82762 made their first contribution in #2130
- @IanMitchell77 made their first contribution in #2239
Full Changelog: v0.20.5...v0.21.0