Skip to content

Releases: mbroemme/vdi-stream-client

v0.5.0

19 Jun 22:53
227caaa

Choose a tag to compare

Highlights

  • Added VA-API HEVC 4:4:4 decoding support by detecting matching HEVC 4:4:4 profiles and YUV444 render target formats.
  • Support retained HEVC 4:4:4 VA-API frames through the libplacebo DRM PRIME zero-copy rendering path.
  • Fall back from HEVC 4:4:4 to HEVC 4:2:0, H.264 hardware decoding, or H.264 software decoding when compatible hardware support is unavailable.
  • Patch the Parsec SDK 6.0 negotiation gate for the injected FFmpeg decoder so HEVC 4:4:4 can be negotiated through the client-owned decoder path.
  • Require libva 1.8.0 for HEVC SCC Main444 10-bit support.
  • Replace --no-subsampling, --no-acceleration, and --no-hevc with a single --video-decoder option.
  • Add explicit hardware and software HEVC and H.264 decoder modes with defined codec, color, acceleration, and fallback policies.
  • Default to hw-hevc-444 with fallback through HEVC 4:2:0, H.264 hardware decoding, and H.264 software decoding.
  • Restructure CLI usage output, README documentation, and the man page so decoder modes are grouped under video options.
  • Avoid duplicate HEVC fallback warnings when unavailable HEVC hardware decoding has already selected H.264.
  • Restore README content regressions, fix USB redirect placeholders, and raise badge cache timing.
  • Extract source checks into a reusable CI script and add CI lint checks for standalone comment spacing and spacing between function definitions.
  • Add and normalize function-level and in-function source comments across the client modules.

Merged pull requests

  • #21 - Prepare v0.5.0 HEVC 4:4:4 and decoder mode support
    Merge commit: 227caaa

Commits

  • 3b7225b - chore(release): bump version
  • e133140 - ci(lint): enforce empty lines before comments
  • 29788da - ci: extract source checks into reusable script
  • 679f382 - ci(lint): enforce spacing between function definitions
  • 03abef8 - feat(video): add VAAPI HEVC 4:4:4 decoding
  • 6e6b1bd - feat(cli): consolidate video decoder options
  • 910aaa2 - refactor(cli): restructure usage help output
  • 0be0aa2 - fix(video): avoid duplicate HEVC fallback handling
  • 8b59765 - docs(readme): fix README regressions and badge cache
  • 4d1dd36 - docs(cli): group decoder modes under video options
  • d659fff - docs: add function-level source comments
  • 855068b - docs: normalize in-function comment style
  • 227caaa - Merge pull request #21 from mbroemme/next/v0.5.0

Contributors

v0.4.1

15 Jun 19:17
d359316

Choose a tag to compare

Highlights

  • Detect VA-API HEVC support before connecting and request H.264 from the host immediately when HEVC VLD decoding is unavailable.
  • Select the FFmpeg decoder from VA-API capabilities without processing test frames, preserving explicit software H.265 and H.264 decoding modes.
  • Fall back from hardware H.265 to hardware H.264, and then to software H.264 when required by the available VA-API profiles.
  • Prevent crashes caused by unsupported HEVC VA-API profiles leading FFmpeg into incompatible fallback hardware formats.
  • Continue client startup when no playback device is available instead of failing initialization completely.
  • Refactored startup into explicit video, audio, and input initialization phases before connecting to Parsec.
  • Defer audio and input worker thread startup until video setup has completed successfully.
  • Removed a redundant FFmpeg decoder log from the Parsec event loop.
  • Added libva as an explicit build, CI, and documentation dependency.
  • Updated README and man page documentation for VA-API capability selection, H.265/H.264 fallback behavior, and --no-acceleration.

Merged pull requests

  • #20 - Prepare v0.4.1 decoder and startup fixes
    Merge commit: d359316

Commits

  • 0a1fdc2 - chore(release): bump version
  • 9db0201 - fix(video): remove redundant FFmpeg decoder log
  • bca3b9a - fix(video): detect VA-API HEVC support before connecting
  • fa7e42e - fix(video): select decoder from VA-API capabilities
  • 46ac739 - fix(audio): continue when no playback device is available
  • e351895 - refactor(client): initialize subsystems before connecting
  • d359316 - Merge pull request #20 from mbroemme/next/v0.4.1

Contributors

v0.4.0

11 Jun 16:57
d7e3a7c

Choose a tag to compare

Highlights

  • Added an injected FFmpeg decoder path and route H.265/HEVC through a vdi-stream-client owned decoder implementation.
  • Route both H.264/AVC and H.265/HEVC through FFmpeg, disabling the SDK-owned decoder entries and keeping fallback handling inside the FFmpeg path.
  • Respect the acceleration setting for FFmpeg decoding, using VA-API hardware decoding when enabled and falling back to FFmpeg software decoding when needed.
  • Added startup fallback handling so failed H.265 connection attempts reconnect through the FFmpeg H.264 path.
  • Avoided an extra FFmpeg frame staging copy by passing retained FFmpeg frame descriptors through the Parsec frame callback, while keeping the contiguous ParsecFrame copy path as fallback.
  • Added libplacebo-based VA-API zero-copy rendering through Vulkan with DMA-BUF / DRM PRIME import support.
  • Improved VA-API zero-copy compatibility for NVIDIA VA-API DRM PRIME mappings and legacy RADV devices without DRM modifier support.
  • Prefer the Vulkan SDL renderer for accelerated video paths, while falling back to the default SDL renderer when VA-API setup fails or software decoding is used.
  • Added video bandwidth reporting and detailed video pipeline stage timings for FFmpeg packet submission, frame receive, VA-API transfers, SDL upload, rendering, and presentation.
  • Moved SDL input handling into a dedicated thread with a synchronized command queue.
  • Kept the client window fixed to the active stream size and restored the stream size after resize or maximize events.
  • Added and documented the required FFmpeg, libplacebo, Vulkan, libavformat, and libdrm build dependencies.

Merged pull requests

  • #18 - Add FFmpeg H.265 decoder support
    Merge commit: dcb5ffe

  • #19 - Prepare v0.4.0 FFmpeg video pipeline
    Merge commit: d7e3a7c

Commits

  • 962ba3a - feat(video): add FFmpeg H.265 decoder
  • 2676f0b - feat(video): respect acceleration setting for FFmpeg decoder
  • 0d228e1 - fix(video): remove provisional decoder window size
  • ad244dd - ci: add FFmpeg development dependencies
  • 02bdece - docs(video): add FFmpeg header license exception notice
  • 82ffcc8 - docs(readme): document FFmpeg H.265 decoder dependencies
  • ca90394 - Merge branch 'main' into feat/ffmpeg-hevc-decoder
  • 9ffde18 - fix(video): log FFmpeg decoder mode only once
  • fc73c97 - chore(release): bump version
  • eb947bd - perf(video): avoid extra FFmpeg frame staging copy
  • dcb5ffe - Merge pull request #18 from mbroemme/feat/ffmpeg-hevc-decoder
  • 4e84ee8 - refactor: use SDL stdlib wrappers
  • 620e09c - feat(stats): report video stream bandwidth
  • eadf2ec - refactor(input): move input handling to dedicated thread
  • 3c28c35 - feat(video): require FFmpeg decoder for H.264 and H.265
  • b85b45f - feat(stats): add video pipeline stage timings
  • f20e09a - feat(video): require libplacebo for VA-API zero-copy rendering
  • 1805e56 - feat(video): prefer Vulkan SDL renderer
  • c3d6464 - fix(video): keep client window fixed to stream size
  • d0b8106 - fix(video): use SDL renderer after VA-API fallback
  • b08b46b - fix(video): support NVIDIA VA-API DRM PRIME zero-copy
  • 919b7ea - fix(video): support VA-API zero-copy on legacy RADV GPUs
  • 8223b58 - build: add explicit libdrm dependency
  • d7e3a7c - Merge pull request #19 from mbroemme/next/v0.4.0

Contributors

v0.3.1

28 May 22:09
7b27095

Choose a tag to compare

Highlights

  • Improved input handling, including passing Shift+F12 through to the client unless --no-grab is active, forwarding Ctrl+Alt correctly when grab is disabled, and avoiding cursor warp/flicker during hidden non-relative drag operations.
  • Fixed mouse dimension handling after reconnect so client dimensions are resent cleanly and mouse positioning remains correct after host reconnects or Windows host reboot scenarios.
  • Hardened Parsec startup, reconnect, DSO initialization, audio polling synchronization, decoder startup validation, and worker-thread cleanup.
  • Improved USB redirection robustness with explicit redirect counts, stricter redirect field validation, correct redirect port/address-family handling, descriptor-read error handling, and cleanup of partially opened redirect resources.
  • Fixed CLI parsing for required option values by using optarg directly and added stronger timeout overflow validation.
  • Applied the UPnP setting before Parsec SDK initialization so the network configuration is consumed correctly by the SDK.
  • Added reconnect failure logging to make connection retry failures visible in logs.
  • Refactored the Parsec event loop into focused helper functions for grab handling, SDL event processing, reconnect status handling, and overlay rendering.
  • Updated the release workflow to publish the release-signing public key as a release asset, allowing users to verify signed checksum files.
  • Normalized README badge metadata, improved badge cache behavior, and replaced the automatic license badge with a static GPL-3.0 + exception badge.

Merged pull requests

  • #17 - Prepare v0.3.1 stability fixes
    Merge commit: f8fc2a3

Commits

  • 692a571 - chore(release): bump version
  • f839782 - ci: publish release signing key
  • b5a6a70 - fix(input): pass Shift+F12 through unless no-grab is active
  • e6b0c34 - fix(input): forward Ctrl+Alt when grab is disabled
  • 5637e3f - fix(input): avoid cursor warp and flicker during hidden drags
  • c89eafb - fix(usb): correct redirect port handling and bounds
  • 6aa52d2 - fix(runtime): harden decoder startup and thread cleanup
  • d5c7ddb - fix(usb): reject malformed redirect fields
  • 7163b08 - fix(usb): clean up redirect device errors
  • 00b5194 - fix(parsec): apply UPnP setting before SDK init
  • c4549b5 - fix(cli): parse required option values from optarg
  • 860aa08 - fix(usb): skip devices with unreadable descriptors
  • 6d42e38 - fix(parsec): validate DSO init context
  • 9617162 - fix(parsec): log reconnect failures
  • 5dd3be3 - fix(parsec): serialize reconnect with audio polling
  • b8797d5 - fix(cli): prevent timeout overflow
  • 6dc3f0e - refactor(parsec): split event loop responsibilities
  • 05b800c - fix(parsec): drop unused connection status result
  • 6fd8e26 - fix(tools): resolve curl and jq from PATH
  • a75c9c8 - fix(parsec): reset mouse dimensions on reconnect
  • f8fc2a3 - Merge pull request #17 from mbroemme/next/v0.3.1
  • 7b27095 - docs(readme): normalize badge metadata

Contributors

v0.3.0

20 May 16:27
5ed278d

Choose a tag to compare

Highlights

  • Added support for Parsec SDK 6.0, including updated cursor handling, improved mouse grab behavior, and a minimum SDK version check for system-wide installations. Fixes #5 via #8.
  • Ported the client from SDL2 to SDL3 and migrated audio, video, input, clipboard, font rendering, and build-system integration to SDL3/SDL3_ttf.
  • Replaced the OpenGL renderer with the SDL renderer, removed direct OpenGL renderer usage, and improved Wayland compatibility. Fixes #7 via #14.
  • Improved input handling, including keyboard grab support, cursor grab behavior, and reduced unintended mouse-motion events when leaving relative mode.
  • Improved runtime behavior with reduced render blocking, fewer redundant renders, safer shutdown ordering, better 4:4:4/no-subsampling handling, configurable render statistics, and stricter command-line validation.
  • Added a --no-decoration window option and support for --stats=<seconds>.
  • Replaced Travis CI with GitHub Actions and added branch-wide checks for build, clang-format, clang-tidy, and C17 compliance.
  • Added a release deployment workflow for v* tags, including release archives, checksums, and signing support.
  • Updated documentation, badges, build requirements, man-page text, performance notes, Wayland tips, Parsec host-resolution notes, and licensing documentation.
  • Added a GPLv3 linking exception for the proprietary Parsec SDK.

Fixed issues

  • Fixes #5 - Parsec SDK 6.0 build/support issue, fixed by #8.
  • Fixes #7 - Native Wayland support, fixed by #14.

Merged pull requests

  • #8 - Support Parsec SDK 6.0
    Merge commit: 9fc9a79
  • #13 - Fix keyboard grab, cursor grab, and mouse-motion handling
    Merge commit: ac76483
  • #14 - Port to SDL3 and replace OpenGL renderer with SDL renderer
    Merge commit: 9ad1fc8
  • #15 - Add clang-format, clang-tidy, branch checks, and C17 build checks
    Merge commit: ea97fff
  • #16 - Add release deployment workflow
    Merge commit: 5ed278d

Commits

  • 93cccc6 - Version increase for 0.3.0
  • 970ac1e - Updated cursor event handler to support 6.0 SDK
  • e92dff6 - Improved mouse grab handler for better support of 6.0 SDK
  • 19ee86b - Check for minimum Parsec SDK version in system-wide library path
  • 2f9a0b1 - Updated README.md and added thank-you section
  • 9fc9a79 - Merge pull request #8
  • fe0b022 - Added support for SDL_SetWindowKeyboardGrab()
  • f6f369a - Only grab cursor if necessary, especially in relative mode
  • 8b7c013 - Do not generate mouse motion event when leaving relative mode
  • ac76483 - Merge pull request #13
  • 9d65a8c - Port client from SDL2 to SDL3
  • 6d7e45b - Keep SDL/OpenGL rendering on main thread
  • 6bc2776 - Reduce main-thread render blocking and throttle overlays
  • 163be8a - Remove unused socket option variable
  • 61cbc0f - Destroy Parsec GL resources before ParsecDestroy
  • 3d9b557 - Drop X11 linkage and generalize screensaver man-page text
  • cacb345 - Replace Travis CI with GitHub Actions
  • 61a852b - Correct decoder444 handling for no-subsampling
  • 5921c78 - Replace OpenGL renderer with SDL renderer
  • 8ab21ae - Replace long option magic values with enum constants
  • ce44ae1 - Add configurable render stats logging
  • 3cad659 - Reject invalid numeric option values
  • 4c36559 - Normalize man-page option indentation
  • 73c9064 - Update copyright years to 2026
  • 828f0d4 - Avoid redundant renders in Parsec event loop
  • 5093a98 - Add Parsec idle FPS performance tips
  • 6fa50ef - Allow --stats=<seconds> and validate display dimensions
  • 2c32452 - Add Wayland keyboard shortcut tips
  • 979c670 - Remove obsolete decoder initialization workarounds
  • 8b02b11 - Add no-decoration window option
  • 507a22d - Add Parsec host resolution tips
  • f5d3c5b - Add GPLv3 linking exception for Parsec SDK
  • 9ad1fc8 - Merge pull request #14
  • f13f273 - Show selected video driver, decoder, and codec
  • 63a7cbb - Update README badges and streaming comparison
  • 6871508 - Add clang linting and branch-wide workflow checks
  • 0418e72 - Format C source and header files
  • bd3b2ff - Make Parsec header independent of include order
  • e7b8605 - Clean up client configuration comments
  • d18da25 - Run clang-tidy on public headers
  • 56ecb29 - Parenthesize client error macros
  • 2473fb7 - Make generated font header self-contained
  • 4fe9c81 - Address clang-tidy analyzer findings
  • f6af7a7 - Use SDL logging and portable zero initialization
  • 8c94486 - Consolidate usage and version logging
  • a93b3e4 - Mark workspace as safe Git directory
  • 8501303 - Update checkout action for Node.js 24
  • e783294 - Require C17 consistently
  • ea97fff - Merge pull request #15
  • 03657e3 - Update Parsec SDK repository link
  • 34e3a08 - Add release deployment workflow
  • 5ed278d - Merge pull request #16

Contributors

v0.2.0

21 Apr 15:12
64bd3bc

Choose a tag to compare

New Features

  • When closing the application it is showing "Closing..." screen now. It is necessary because closing can take some time until all threads (audio, video and network) are closed, especially if you are redirecting multiple USB devices.
  • A forced grab will disable client screen saver support and leave it to the host. When forcing a mouse grab with "Shift+F12", the client screen saver on the Linux machine will be disabled. It will be enabled again, once the force grab is released. This doesn't apply to a normal mouse grab, which is released with "Ctrl+Alt".
  • Removed confusing --no-relative option, grab works as follows. With enabled exclusive mouse grab, mouse is grabbed into window with first click. It will be indicated in the window title that mouse is grabbed and can be released via "Ctrl+Alt". If an application requests relative mouse mode, mouse is grabbed into window regardless if exclusive grab is enabled or disabled. It is necessary because some applications (mostly DirectX games) request relative pointer movements. In relative mouse grab the mouse cursor is hidden and it will be indicated in the window title that mouse is grabbed and can be released via "Ctrl+Alt". As soon as application releases relative grab, the previous mouse state is restored, either released or put back into exclusive grab mode.

Bug Fixes

  • Fixed unrecognized option (null) check
  • Fixed non-working USB redirection due to broken parameter check
  • Fixed compiler warning: too many arguments for format [-Wformat-extra-args]
  • Fixed #1 and it is possible to leave the window now regardless of mouse grab state

Credits

@mbroemme

v0.1.0

18 Mar 16:12
022bf7d

Choose a tag to compare

Description

Initial version of VDI Stream Client. It is an alternative version to the Parsec Linux client focusing entirely on VDI scenario running GPU accelerated Windows environment on a remote host or Virtual Machine.

Features

  • Fully CLI based customization
  • Desktop in window support with XGrabKeyboard and XUngrabKeyboard
  • SDL window is created without SDL_WINDOW_RESIZABLE and always uses native host resolution
  • Host to client resolution sync with automatic window resize
  • Specify client window size via CLI
  • Configurable mouse wheel sensitivity
  • Screen saver and screen locker support
  • Built-in USB redirection with automatic reconnect support using usbredir protocol

Credits

@mbroemme