Releases: nilstate/icey
Releases · nilstate/icey
Release list
icey 2.5.0
Added
- Added
MediaCapture::setOpenTimeoutUsec()and interruptible FFmpeg network opens so blocking RTSP and other network sources can time out or stop cleanly instead of hanging shutdown. - Added default FFmpeg protocol allowlists and network-open timeout handling for
MediaCapture, while still allowing callers to override the underlying AVOptions. - Added
http::Server::setWebSocketOriginValidator()and Symple server origin policy options (enforceOrigin,allowSameOrigin,originScheme, andallowedOrigins) so browser WebSocket upgrades can be rejected before the101handshake. - Added a move-based TURN request path for parsed STUN messages, avoiding deep copies of inbound attributes and data payloads in server receive loops.
Changed
symple::Server::Options::maxConnectionsnow defaults to1024instead of unlimited, matching the hardened production defaults used by the server responder.- Logging macros now check a process-wide atomic level filter before constructing
LogStreamobjects or evaluating log arguments, making filtered log sites substantially cheaper and preventing side effects in disabled log arguments. - STUN transaction IDs are now generated lazily for outbound messages, avoiding unnecessary entropy work on inbound parse paths.
- TCP peer addresses are cached at connect time so repeated peer-address lookups do not call back into libuv for stable connection metadata.
- The pacm submodule was advanced to the latest hardened revision used by the control-surface defaults.
Fixed
- Hardened base lifetime primitives across signals, queues, packet streams, synchronizers, timers, handles, threads, runners, and
TaskRunnerso shutdown and task execution remain ownership-safe under concurrent teardown. - Hardened socket and HTTP handling, including address validation, adapter lifetime, SSL flush behavior, URL parsing, and WebSocket frame size checks.
- Fixed FFmpeg ownership and media-state consistency issues in audio resampling, video contexts, media capture, video conversion, and WebRTC media bridging.
- TURN clients and samples now verify message integrity by default and avoid logging credentials.
- WebRTC track receiver teardown is now safe against libdatachannel callbacks that are still in flight while the receiver is being destroyed.
- Hardened parsing and memory-safety checks across zip extraction, Base64, crypto, X.509 certificates, STUN attributes/messages, Symple command handling, WebRTC codec selection, remote media planning, and the pipeline C API.
- Stabilized the WebRTC session test harness after the teardown and callback lifetime hardening.
- Removed stale pluga references and fixed sample/package-manager rot found during the hardening pass.
icey 2.4.11
Added
- Added a
webrtc/samples/whip-receiversample that accepts WHIP publishers over HTTP or HTTPS, supports optional bearer-token auth and client ICEPATCH, records H.264/Opus sessions to MP4, and includes FFmpeg/OBS usage docs plus a local certificate helper. - Added the
icey-sysandiceyRust crates, including safe Rust wrappers for the initial RTSP-to-browser pipeline surface and a crate-level example. - Added the
icey::pipeline_capihost C API surface for creating, configuring, starting, stopping, and destroying an opaque WebRTC pipeline from foreign-language bindings. - Extended
graftwith host-surface ABI support, including thehostruntime kind, host manifest validation, and documented conventions for exported C function tables.
Fixed
- Windows shared-library builds now export the
icy::avmedia packet hierarchy andVideoConverterwithAV_API, fixing MSVC DLL link failures when downstreamvisioncode usesavtypes across module boundaries. This lets Conan Center consume a clean post-2.4.10 source release without its Windows shared-build patch. - Alpine packaging and its container validation helper now install
nlohmann-json, matching the system-dependency CMake package exported by icey. MultiplexEncodernow tracks audio and video PTS independently, preventing muxed audio/video output from dropping valid interleaved packets as duplicate or backward timestamps.AudioEncodernow advances its buffered output PTS when frames are submitted to delayed encoders such as AAC, avoiding duplicate DTS packets during MP4 recording.
Changed
- API docs and module guides were regenerated and expanded for the new graft host-surface and pipeline API work.
- The docs toolchain now uses the published Sourcey package and includes the Sourcey C++ quality gate used by CI.
- Package-manager publishing now targets the shared Homebrew tap configuration used by the install docs.
Removed
- Removed the unused
Base64PacketEncoderpacket-stream adapter and its public header. Use theicy::base64namespace helpers directly for Base64 encoding and decoding.
icey 2.4.10
Fixed
ICapture::start/::stop(which overridebasic::Startable) andMediaCapture::emit(which overridesPacketSource::emit) are now declared withoverride. clang-18 with-Werror -Winconsistent-missing-overridewas failing the bench build on these.[[nodiscard]]returns fromAudioEncoder::encode,VideoEncoder::encode,MultiplexEncoder::encode{Video,Audio}, andVideoEncoder::flushare now explicitly discarded with(void)at the seven call sites inaudiopacketencoder.cpp,multiplexpacketencoder.cpp,videoencoder.cpp, andvideopacketencoder.cpp. Emission happens through the encoder's emitter, not through the boolean return; the discard was always intentional.
Changed
- The CI benchmarks job now runs under clang-18 instead of gcc-14. The gcc-14 build of the bench binaries hit SIGILL on the GitHub-hosted ubuntu-24.04 runner under
-O3; the library itself builds and tests cleanly under gcc-14 in the regular Linux job and under all three sanitizer jobs. Tracked by nilstate/icey#325.icy_add_benchmarkcarries a-O2 -fno-tree-vectorizeGCC fallback as defence in depth for anyone building bench binaries with GCC outside CI. - Doc cross-links to the removed
docs/build/*pages now redirect to therecipes/http-serverrecipe, the README quick-start, anddocs/run/install.sourcey.config.ts,release-sync.sh, andrelease-check.shno longer iterate over the deleted files.
icey 2.4.9
Fixed
wrtc::codec_registry::hasEncodernow does a runtime probe (avcodec_alloc_context3+avcodec_open2), with results cached. The prior implementation only checkedavcodec_find_encoder_by_name, which on Linux distros that ship libavcodec with hardware-encoder wrappers built in (h264_nvenc, h264_vaapi, h264_qsv) returned true even when the runtime resources for those encoders (CUDA, VA-API drivers, etc.) were absent. The h264-on-macOS / videotoolbox path was unaffected; the fix prevents codec selection from picking a hardware encoder that exists at link time but cannot be opened at runtime, which surfaced as "Cannot open the video codec: Operation not permitted" in the icey-cli browser smoke on Linux CI.
icey 2.4.8
Fixed
http::Serverportability: replacedfile_clock::to_syswith the standard delta-calibration idiom (system_clock::now() + (fileTime - file_clock::now())). MSVC's_File_time_clockdoes not exposeto_sys, so the prior libc++-targeted fix from 2.4.6 broke the Windows build. The new form works on libstdc++, libc++, and MSVC, and tolerates the precision difference between libc++ and libstdc++ that the priortime_point_castwas meant to address.parseDeviceUrl: device-resolution path is now guarded byHAVE_FFMPEG_AVDEVICE. The 2.4.7 implementation calledavdevice_register_allunconditionally, breaking builds where libavdevice is not linked. Without it, hitting a recognised device URL throws an explicit "libavdevice is not linked" error rather than failing to build.
Changed
- Doc cleanup: cross-links to the removed
docs/build/*pages are redirected to therecipes/http-serverrecipe, the README quick-start, anddocs/run/install.sourcey.config.ts,release-sync.sh, andrelease-check.shno longer iterate over the deleted files.
icey 2.4.7
Added
icy::av::parseDeviceUrl(source)— single source of truth for libavdevice URL schemes (avfoundation:,v4l2:,dshow:). Returns the resolvedAVInputFormat*and the post-prefix filename. Throws if a recognised scheme has no matching backend on this build.MediaCapture::openFileroutes recognised device URLs through the existingopenStream(filename, iformat, opts)path, so callers can open the OS camera directly without an ffmpeg/relay subprocess.
Fixed
internal::init()now callsavdevice_register_all()underHAVE_FFMPEG_AVDEVICE. The prior comment was wrong: codec/format auto-registration arrived in FFmpeg 4.0+, but libavdevice still requires an explicit register call forav_find_input_format("avfoundation"|"v4l2"|"dshow")to resolve.parseDeviceUrlalso performs a one-shotstd::call_onceregistration so device URLs work even before anyMediaCaptureis constructed.MediaCapture::runno longer treatsAVERROR(EAGAIN)fromav_read_frameas fatal. Live demuxers (notably avfoundation) return it whenever their internal frame queue is momentarily empty; the prior code tore the capture down at the first hiccup, which surfaced as the capture pipeline emitting only the initial three buffered frames before going silent.
Changed
- Bumped the pinned
libdatachannelfromv0.24.1tov0.24.2.
icey 2.4.5
Fixed
- System-dependency builds no longer vendor and install
nlohmann/json.hpp, avoiding conflicts with downstream package managers that already providenlohmann-json - Exported CMake package configs now propagate the
nlohmann_jsondependency when system deps are enabled
icey 2.4.4
Added
- Realtime intelligence pipeline primitives in the
visionmodule, including frame normalization for detector-ready frames - WebRTC receive jitter buffer for smoother inbound media playback
- API reference docs for graft, speech, and vision modules
- Markdown sanitization script for generated API docs
- Permanent macOS system-deps + FFmpeg CI coverage matching downstream package-manager builds
Changed
- Doxygen config updated for new module coverage
- Docs now use latest sourcey toolchain
- Module guide updated with graft, speech, vision entries
Removed
- pluga module and docs (replaced by graft)
Fixed
- Apple AVFoundation source compatibility for package-manager builds on modern macOS SDKs
- Darwin shared-library symbols are preserved for downstream package-manager builds
icey 2.4.3
Fixed
- Downstream package-manager builds now resolve
libuvcorrectly when the system dependency is exported as a shared target instead of a static-only alias - RPM source-package staging now carries the downstream compatibility patch set and claims the installed umbrella and vendored JSON headers in the development package
- MacPorts builds now force the supported
ReleaseCMake build type instead of inheriting the unsupported default from the port group - The GitHub release workflow now validates the pre-finalize tag state, so tagged releases can publish before
make release-finalizepins the archive hashes onmain
2.4.2
Fixed
- Package-manager builds now accept the shared
libuv::uvtarget exported byvcpkgand other system package layouts. - Windows consumers no longer rely on backported export/linkage fixes for
Timeout,PacketFactory,Transaction, and the baseuvwrapper templates. - FFmpeg-backed builds now propagate discovered library search directories so Windows link steps can resolve
avcodec.liband related FFmpeg libraries.