6.1.1. Release notes for v0.17

6.1.1.1. v0.17.0

New Features

New feature: Optional UTC timestamp embedding in recording filenames

Adds optional frame-accurate UTC timestamp embedding in recording filenames to enable precise synchronization of multiple recordings that start and stop at different times.

See Recording Synchronization for usage guide, implementation details, and the new synchronized-recording sample.

New feature: V4L2 virtual camera output

This release adds support for outputting video to V4L2 loopback devices, enabling virtual cameras that can be used by web browsers, video conferencing tools, or any V4L2-compatible application.

Requires the v4l2loopback kernel module (tested with v0.15.3 or later). See Video Outputs for usage and Included samples for the sample application.

New feature: Hardware-accelerated H.264 encoding with VAAPI

This release adds support for hardware-accelerated H.264 encoding using the Video Acceleration API (VAAPI), providing significant CPU usage reduction for video encoding workloads on Intel and AMD GPUs.

Key Features:

  • New H264VaapiEncoderComponent class providing VAAPI hardware encoding

  • Full integration with existing video feeds: WebRTC, UDP output, peer feeds, and file recording

  • Comprehensive property interface matching GStreamer’s vaapih264enc element (rate control, bitrate, keyframe period, B-frames, quality settings, etc.)

  • Defaults optimized for WebRTC real-time communication, matching X264 software encoder defaults

Performance Benefits:

  • 50-70% CPU reduction with JPEG/MJPEG camera sources

  • 70-90% CPU reduction with RAW/uncompressed camera sources

  • Video encoding offloaded to dedicated GPU video engine (doesn’t impact GPU compute/graphics)

Documentation & Tools:

  • New comprehensive VAAPI H.264 encoder guide: H.264 VAAPI Encoder

  • New file-recording sample for encoder testing and benchmarking

  • Complete demo enhanced with --h264-encoder option for encoder selection

See H.264 VAAPI Encoder for installation instructions, usage examples, and detailed performance benchmarks.

New experimental feature: Network quality monitor

This release introduces an experimental network quality monitor feature. Network monitoring is in an experimental stage and for illustration purposes only. See Network monitoring (experimental) for more information.

Proximie services new API: getOrganisation

The ProximieServices now includes an API getOrganisation() to obtain an organisation’s details by its ID.

Added mixer functionality to audio utility feeds and deprecated PeerSession::createRecordingFeed

UtilityAudioLocalFeed has been enhanced to allow applications to mix audio sources. It supports dynamically adding and removing inputs after the feed has been created. See Utility Feeds for more details.

The addition of this new feed means createRecordingFeed() is no longer needed as the same functionality can be expressed using a combination of UtilityAudioLocalFeed and AVOutputFeedFile. As a result, createRecordingFeed() has been deprecated and samples that use it have been updated to use UtilityAudioLocalFeed and AVOutputFeedFile.

Test signal audio input feed parameters added

The existing AudioInputFeedTestSignal class has been extended to allow applications to configure the wave type.

Breaking Changes

Breaking change: AVOutputFeedFileSettings changed from struct to class with setter methods

To follow SDK development guidelines and provide input validation, AVOutputFeedFileSettings has been changed from a struct with public members to a class with private members and setter/getter methods.

Old pattern (no longer works):

AVOutputFeedFile::AVOutputFeedFileSettings settings;
settings.destinationDirectory = "/recordings";
settings.destinationFilenamePattern = "video_%02d.mp4";

New pattern (required):

AVOutputFeedFile::AVOutputFeedFileSettings settings;
if (auto err = settings.destinationDirectory("/recordings")) {
    std::cerr << "Invalid directory: " << err.message() << std::endl;
    // Handle error
}
if (auto err = settings.destinationFilenamePattern("video_%02d.mp4")) {
    std::cerr << "Invalid pattern: " << err.message() << std::endl;
    // Handle error
}

Impact: This is a compile-time breaking change. Code using direct member assignment will fail to compile. The fix is straightforward: replace settings.member = value with settings.member(value).

Recommended: Check the std::error_code returned by all setters. Several setters now perform validation and can return errors: destinationFilenamePattern() validates printf specifiers and security constraints, maxFileSizeMB() and maxFileDurationS() validate against overflow when converting to bytes/nanoseconds. Checking all setters is good defensive programming and ensures your code handles validation errors gracefully.

Breaking change: H264 encoder properties changed to enable polymorphic encoder support

To enable support for multiple H264 encoder implementations (X264, VAAPI, etc.), the encoder properties in the following classes have changed from concrete X264EncoderFeedComponent to shared_not_null<H264VideoEncoderComponent>:

Impact: Code that directly accesses these properties must now use -> instead of . (e.g., props.encoder->bitrate() instead of props.encoder.bitrate()). This change is unlikely to affect most code as encoder configuration is typically done before passing to feed creation functions.

Backwards compatibility: The deprecated encoderProperties() and encodingProperties() methods provide backwards compatibility for X264-specific code.

Minor breaking change - EnumMapper now uses string_view instead of template string type

For simplicity and consistency with modern C++ practices, PxUtility::EnumMapper now always uses string_view (previously the string type could be chosen as a template parameter).

Minor breaking change - PxLogger::severityLabel now returns string_view

PxLogger::severityLabel now uses PxUtility::EnumMapper and the value returned has been changed from plain const char* to string_view for simplicity and consistency.

Minor breaking change - MediaServerOutgoingVideoFeed::FeedProperties label is now a string_view

Previously MediaServerOutgoingVideoFeed::FeedProperties took a std::string for a label, which is inconsistent with the other feed properties in the SDK. This now takes a string_view the same as other feed property values; since std::string can be implicitly passed as string_view values, existing code should not be affected by this change.

Minor breaking change - GetSessionResponse::session is now non-optional

Fix: the session member of the type GetSessionResponse (which is returned as a response to ProximieServices::getSession) is now non-optional, and will always contain session details if the API call was successful.

Other Changes

Dockerfiles and install scripts pin CMake version

To ensure consistent builds, package install scripts and Dockerfiles have been updated to pin the version of CMake to 3.26.4.

Vulnerability scanning enforcement

While Proximie SDK releases and their runtime dependencies have been regularly scanned for vulnerabilities for some time, our build and deployment system now blocks the release of any Proximie SDK version if any vulnerabilities remain after Proximie’s recommended Security and Hardening practices have been applied.

This ensures that any released version of the Proximie SDK, when hardened using Proximie’s recommended practices, will have no runtime dependencies with known vulnerabilities.

Note that customers should still follow the Security and Hardening practices, to address known vulnerabilities in Proximie SDK runtime dependencies.

Software Bill of Materials (SBOM) publication

A Software Bill of Materials (SBOM) is now published with each Proximie SDK release, providing a machine-readable inventory of all software components in the SDK. See Certification Artifacts for more details.

Planned certification artifacts added to documentation

A full list of planned certification artifacts has been added to the documentation, along with details of each artifact and its intended purpose. See Planned Artifacts for details.

Privacy video stage re-implemented

VideoStagePrivacy has been internally re-implemented to simplify the resulting feed pipelines, and solve issues arising from interactions with reusable inputs. The new method of obscuring/destroying video pixel data has been introduced as part of this re-implementation.

Known Issues

Known issue with GStreamer 1.24.2 causing audio visualization problems

While not introduced in this release, we have recently identified a known issue affecting audio visualization in GStreamer 1.24.2, the version of GStreamer available on Ubuntu 24.04. See AudioOutputFeedWavescope documentation for details.