Metadata embedding (reworked)
- Replace the flaky auto-embed with a single, always-active
Update MKV button — your call when to inject
- New
HDR data toggle, alongside strip thumbnails and QA metrics
- Each embedded file now carries its own inclusion date, shown in the Metadata tab
- Side files are never auto-deleted anymore
Quality metrics
- Fix a Y-PSNR average that read too low (empty frame slots dragged the mean down) — old files self-correct on read
- Reject a 0-byte or corrupt output MKV before analysis instead of producing garbage scores
Strip thumbnails
- Generate both sets (normal + expanded) up front and cache them together — maximizing the window is now instant, no re-extraction
- Fix a nasty one: black-bar detection could read thumbnails mid-rewrite and apply a wrong crop to the encode
Status bar
- Codec / container tags pop a little more (saturation boost)
- Progress bar no longer eats the percentage with longer codec names like ProRes
Under the hood
- CPU monitoring and its helper process stay off the encoder’s cores
Overall, all parallel processing has been improved to ensure better GUI responsiveness and OS response while maintaining the same overall load in very heavy processes (VDP in particular).
Chromaster - Responsiveness & Accuracy Pass
A round focused on UI smoothness during heavy analysis, plus a critical metric bug fix.
HDR-VDP Responsiveness
- Fluid UI: The UI thread is now pinned to its own core so FFT workers can’t starve it.
- Tighter Priorities: Lowered worker thread priority so dragging sliders and switching tabs stays smooth mid-analysis.
VDP-2 Metric Fix (Important)
- GPU Fix: Fixed wrong VDP-2 scores in GPU mode; the FFT was silently skipped, computing the metric in the wrong domain.
- GPU and CPU modes now match perfectly. Existing GPU VDP-2 data will be recomputed on the next run.
UI Efficiency
- Smart Redraws: The interface now idles quietly instead of rendering every frame at rest (lower CPU/GPU power).
- Brush Reuse: Reuses colored-text brushes instead of recreating them every frame, lightening the load on the Settings tab.
Quality & Robustness
- Fixed a broken format string in the encoder tab (max-bitrate overshoot label).
- Hardened the colored-text engine against oversized tagged strings.
- Tightened a guard in the VDP trace renderer and cleaned up memory paths on allocation failure.
CPU Scheduling Overhaul
- Physical Cores : Pinned Quality Analysis workers to true physical cores (via ProcessorMask, bypassing SMT guesswork) to prevent load bleeding onto the GUI core. Scheduler allowed to use SMT.
- Ryzen Optimization: VDP runs on the best cores first (CCD0 priority), targeting the gold and silver cores as preferred. VMAF/PSNR/SSIM scale across all available cores once VDP completes.
Up to 90% load on 9950X + 25% load 4090, bottleneck is now VMAF, may try much later to compile a CUDA VMAF scoring
Best I can get out of 15/16 cores for QA (core 16 deidcated to UI + DWM)
Bugfixes
Encoder thread placement
- Fix VVenC (and all child encoders) inheriting the parent’s restricted affinity mask instead of the full worker mask — the process was resumed before the affinity was applied, so VVenC initialized its thread pool on a single CCD instead of both
- Now created suspended, affinity set, then resumed — consistent with VMAF and VDP decoders that already did it correctly
Resize algorithm not applied during encode
- Fix the selected scaling method being ignored in the encoding pipeline - the preview showed the correct algorithm but the actual encode sent the source at original resolution without any resize filter
- The algorithm chosen in the Resize tab (EWA Lanczos via libplacebo, Lanczos/Spline via zscale, etc.) now drives the encode, not just the preview
CPU widget L2 cache display
- Fix L2 cache showing “6x0MB” on CPUs with 512 KB per core — integer division of 512 KB / 1024 truncated to zero
- L2 now displayed in KB (the correct unit for per-core L2 sizes)
Y-PSNR live flush storm
- Fix repeated disk writes during H.266 encode when the Y-PSNR frame counter lands on a flush interval boundary — the B-pyramid fills frames out of order, leaving the counter stuck on a multiple of the flush interval while dozens of late frames each re-trigger the flush
- Flush now fires only when the counter actually advances past a new threshold, not on every late fill