Skip to content

v0.5.0

Choose a tag to compare

@github-actions github-actions released this 22 Sep 02:58
· 48 commits to main since this release

BC-250 Driver v0.5.0: Complete VA-API Encode/Decode, Multi-Slice, Tiles, WPP & WiVRn VR Suite (Hotfix Update)

The v0.5.0 release represents a comprehensive overhaul of video acceleration for the AMD BC-250 (Cyan Skillfish) APU on Linux. It brings 100% bit-exact hardware-conforming video decoding (VAEntrypointVLD), multi-slice HEVC encoding at 111+ FPS (3x speedup), WiVRn wireless VR streaming optimization with multi-core concurrency, 10-bit HEVC Main 10 decoding and encoding, hardware scaling/cropping (VAEntrypointVideoProc), and native Linux distribution packaging.


🌟 Key Highlights & Improvements

1. Rate Control Alignment & Intelligent Constant Quality (ICQ) Fix

  • Intelligent Constant Quality (VA_RC_ICQ): When FFmpeg or GStreamer encodes without an explicit bitrate target (-b:v), standard encoders select VA_RC_ICQ. The driver now supports VA_RC_ICQ, computing normative bitrate targets (~4.0 Mbps H.264 / ~2.2 Mbps HEVC at 1080p, matching Intel iGPU bitrate and file size) while maintaining dynamic per-frame rate control.
  • CQP Fallback & Compatibility: Restored VA_RC_CQP advertisement alongside VA_RC_CBR, VA_RC_VBR, and VA_RC_ICQ, resolving FFmpeg -22 (EINVAL: "Driver does not support any RC mode compatible with selected options") errors on unconstrained commands.
  • Dynamic Rate Control & Base QP Restoration:
    • Guarded pic_init_qp = 26 in VAEncPictureParameterBuffer from overwriting the rate controller's bitrate-derived base_qp during CBR/VBR encoding, allowing dynamic QP selection across the entire 12..51 range to match requested target bitrates.
    • Implemented HEVC CBR filler NAL support (maybe_append_filler_hevc), enabling exact target bitrate conformance in CBR mode and feeding accurate bit accounting to the leaky-bucket model.
    • Lowered CU skip threshold from overly aggressive 1024 down to 48..96 based on quality presets, eliminating texture smearing and preserving fine grain and high-frequency motion.
    • Tightened rate-control integral window from 150 frames to 30 frames for fast 1-second bitrate convergence.

2. HEVC Encoder Quality Reconstruction & Main 10 Encoding (PR #44, PR #45)

  • Planar Prediction Bottom-Left Sample Fix (PR #44): Fixed a reconstruction drift where Planar prediction incorrectly mirrored left[3] instead of reading the true reconstructed sample below the left column (p[-1][4]). Eliminates encoder/decoder divergence and delivers a massive +12 to +21 dB PSNR boost (1080p QP 30: 24.4 dB -> 45.4 dB; 1080p 8 Mbps: 22.3 dB -> 34.3 dB).
  • HEVC Main 10 Encoding (VAProfileHEVCMain10) (PR #45): Full 10-bit HEVC encoding from P010 surfaces with Qp' = QP + 12 scaling, proper transform shifts, and surface boundary clamping.

3. Full Bit-Exact VA-API Video Decoding (VAEntrypointVLD)

  • Direct VA-API Reference Picture Lists & MPV / FFmpeg Playback Fix:
    • In standard MP4/MKV containers, sequence reference tables are stored in container atoms (hvcC) rather than inside slice headers. The driver now extracts pre-resolved Reference Picture Lists (L0/L1) directly from VASliceParameterBufferHEVC.RefPicList[2][15], eliminating slice parsing desync.
    • Added container slice header scan fallback when sps->num_st_rps == 0, recovering byte alignment and WPP entry points so multi-threaded wavefront parallel processing executes without single-threaded fallbacks.
    • Replaced per-frame UV interleaving buffer allocations with persistent allocations and SSE2 SIMD vectorization.
    • Added DPB closest-POC concealment fallback to smoothly handle frame drops and player seeks.
    • Completely fixes frozen/ghosted title cards, block displacement, and audio/video desync in mpv --hwdec=vaapi and FFmpeg.
  • H.264 & HEVC/H.265 Decoding: Implemented complete VAProfileH264*, VAProfileHEVCMain, and VAProfileHEVCMain10 (10-bit on P010 surfaces) decoding entrypoints via threaded CPU wavefront execution.
  • Multi-Slice & Dependent Slice Segments (PR #29): Per-slice reference picture lists for temporal motion vector prediction. Resolves flickery and semi-garbled playback artifacts in multi-slice HEVC media (e.g. Big Buck Bunny, streaming captures).
  • HEVC Tile Decoding (PR #27): Full support for arbitrary multi-tile layouts with independent tile decoding boundaries, verified across all 13 ITU tile test streams.
  • Wavefront Parallel Processing / WPP (PR #31): Correct CABAC context state synchronization and quantization parameter prediction across CTU rows. All 12 ITU WPP conformance vectors pass bit-exact.

4. WiVRn & Game Streaming Optimization (Sunshine / Moonlight / WiVRn)

  • WiVRn Auto-Detection & 4-Core Concurrency: Automatically allocates 4 CPU worker threads and 4 slices for wivrn-server, slashing host VR encode latency from ~50ms to ~15ms.
  • Low-Latency HEVC Rate Control: Assigns a 2-frame low-latency buffer (RC_LOW_LATENCY) for WiVRn HEVC streaming, eliminating 1-second VBR buffer latency swings.
  • Extended Max Dimensions (4096×4096): Raised maximum picture width and height to 4096 to natively support Meta Quest 3 (2064×2208/2240) and high-res VR headsets without clamping.
  • High Bitrate Unlocked (BC250_QP_MIN): Configurable minimum QP floor (1..51, default 12). Setting BC250_QP_MIN=8 allows VR enthusiasts to push bitrates past 150 Mbps (up to 200–300+ Mbps).
  • SPS Frame-Cropping Window: Implemented normative H.264 SPS frame cropping. Resolves 1080p streams decoding as 1088p with bottom green line artifacts; restores frame PSNR from 13.7 dB to 44.3 dB.

5. Hardware Video Post-Processing (VAEntrypointVideoProc)

  • Compute Scaling & Cropping: Hardware-accelerated surface scaling via compute shaders supporting both NV12 and P010 formats (PR #26).

6. Native Packaging & Multi-Arch Distribution

  • Native Packages: Included packaging for Arch Linux / CachyOS (PKGBUILD), Fedora / Bazzite (bc250-vaapi.spec), and Debian / Ubuntu (packaging/debian/).
  • Steam Link & 32-Bit Support: Automatic CI builds for both 64-bit (x86_64) and companion 32-bit (i386) drivers (bc250-driver-linux-i386.tar.gz) for Steam Link and 32-bit Wine applications.

📦 Installation Quickstart

Pre-built Release Bundles:

tar -xzf bc250-driver-linux-x86_64.tar.gz
sudo ./install.sh

Arch Linux / CachyOS:

./tools/install_cachyos_arch.sh

SteamOS / HoloISO:

sudo ./tools/setup_steamos.sh