Skip to content

Declarative media player configs: VLC and MPC-HC

VLC and MPC-HC settings are both text files and registry entries, and the two players differ in how much of their config can live in git. This reference covers where each player stores state, what a commit-able config looks like, and the tuning for streaming, audio, and HDR playback on the desktop box: RTX 5090, MSI MPG271QX OLED (1440p, 360 Hz, HDR), SMSL D70 Pro SABRE DAC plus SSL 2 USB interface, wired LAN. The configs live in the media-player-config repo on git.erfi.io; the doc explains the decisions behind them.

Provenance: the VLC key names, defaults, and the MPC-HC registry layout were checked against the live machine on 2026-09-27 (a stock VLC 3.0.23 vlcrc and a stock MPC-HC 2.5.2 install; MPC-HC was upgraded to 2.8.2 and configured from source-verified values the same day - the evidence table tracks which rows are measured, source-verified, or documented). The tuning itself is documented, not lab-measured - each claim below links its source.

TL;DR:

  • VLC is fully declarable: one vlcrc text file, keys matched by name, missing keys fall back to defaults. Ship a delta of changed keys; the full file is disposable. The one streaming knob is network-caching (default 1000 ms; 2000 ms for public-internet streams, 1000-1500 ms for LAN).
  • MPC-HC splits its state: player settings can move to mpc-hc64.ini next to the exe (INI mode), while internal filter settings (LAV decoders, renderers) stay in the registry even in INI mode. The declarative form is one GUI pass, then a snapshot script that exports both surfaces into the repo.
  • Video: MPC Video Renderer (MPCVR) with LAV Video on D3D11, native device. MPCVR is the 2.7.4 default, consumes D3D11 textures directly, and passes HDR through to the OLED. madVR is a separate install with the same goal and a heavier chain.
  • Audio: WASAPI exclusive with bit-exact output into the USB DAC; bitstreaming stays off (it is a receiver feature; into a DAC it produces silence), no mixing, no dynamic range compression.

You are playingUseWhy
Local files, any platformmpvBest-quality video pipeline, config carries over in dotfiles
Network streams, IPTV, HLSVLCAdaptive/demux layer that recovers well; one caching knob to tune
Local files, best Windows qualityMPC-HCLAV + MPCVR + WASAPI exclusive chain, HDR passthrough

The three cover different cases: mpv and VLC share the dotfiles-style config story, and MPC-HC is the Windows-only quality chain. All three coexist on the same machine.


PlayerSurfaceLocationDeclarable?
VLCvlcrcLinux ~/.config/vlc/vlcrc; Windows %APPDATA%\vlc\vlcrcFully - one text file
VLCQt interface statevlc-qt-interface.iniPartly; mostly cosmetic
MPC-HCPlayer settingsHKCU\Software\MPC-HC\MPC-HC, or mpc-hc64.ini in INI modeYes in INI mode
MPC-HCInternal LAV + audio rendererprofile store (mpc-hc64.ini in INI mode, else the MPC-HC registry tree)Yes - follows INI mode
MPC-HCMPC Video RendererHKCU\Software\MPC-BE Filters\MPC Video RendererRegistry only, always

The VLC file is read line by line: every key=value is matched by name across the whole file, section headers are documentation for humans, and an absent key means default. A first GUI save rewrites the file in full with every default listed as a comment; the delta stays the source of truth and the expanded copy is disposable.

MPC-HC 2.x keeps one profile store - player settings, the internal LAV filters, and the MPC Audio Renderer section - plus one exception. INI mode moves the profile store to mpc-hc64.ini next to the exe1; MPC Video Renderer writes its own registry key regardless of INI mode2, so the setup checklist captures it with a snapshot script. The checkbox is greyed out when MPC-HC sits in C:\Program Files (the exe directory must be writable), so the install goes in a user directory first1.


The Linux and Windows deltas differ in one entry: the hardware decoding pin.

KeyLinux valueWindows valueDefaultWhy
avcodec-hwvaapileave at anyanyNVIDIA exposes NVDEC through VA-API only via the libva-nvidia-driver shim; on Windows, any selects the D3D11VA path already present
network-caching200020001000public-internet headroom; see table below
qt-privacy-ask00unsetsuppresses the first-run privacy dialog
metadata-network-access11unsetallows online metadata lookup, matching the pre-existing Windows install

Everything else stays at default on purpose: audio-resampler (auto), aout (auto - PulseAudio on Linux, MMDevice on Windows), audio-time-stretch (on), replay gain (off). Pinning module names VLC may rename between releases risks the pin breaking on a version jump, and the defaults work. On Windows, the Preferences UI’s “Hardware-accelerated decoding” switch is a UI-level setting rather than a vlcrc key in the delta - verify it once in the GUI.

Caching, per source type (defaults from the live 3.0.23 file):

KeyDefaultSet toApplies to
network-caching1000 ms2000 (internet), 1000-1500 (LAN)HTTP, RTSP, IPTV, HLS
file-caching1000 msdefaultlocal files
live-caching300 msdefaultcapture devices

Bumping network-caching above ~3000 ms adds jitter tolerance at the cost of channel-switch latency; below ~500 ms on a public-internet source, stutter. The Linux delta needs libva-nvidia-driver installed (in the Arch extra repo; CachyOS mirrors it)3. If a stream fails to open with the pin in place, delete the avcodec-hw line: VLC then decodes in software instead of erroring per stream.


The live install is MPC-HC 2.8.2 (upgraded from 2.5.2 on 2026-09-27). Since 2.7.4, MPCVR is the default renderer on modern systems and a one-time GPU-detection pass rewrites decoder defaults, so configure on top of whatever that pass wrote4.

ChoiceWhat it isPick it when
MPC Video Renderer (MPCVR)2.8.x default on modern systems; D3D11-native, HDR passthrough4the default; this setup
madVRSeparate download, historically the reference-quality rendererwilling to manage a third-party component for upscale quality
EVR-CP / VMR9Windows built-in presenterstroubleshooting only

LAV Video decodes on D3D11 with the device set to Automatic (Native). Native works because MPCVR consumes D3D11 textures without a system-memory round trip; with EVR-CP or VMR9 as the renderer, LAV would need the GPU-by-name (copy-back) selection instead5. Verify after playing a 10-bit HEVC file: Internal Filters > Video Decoder > Status must read D3D11, with avcodec appearing only for codecs the hardware list omits. The 5090 covers AV1 and 10-bit HEVC in hardware, and D3D11 is LAV’s only hardware path for AV15.

HDR: Windows HDR on, MPCVR set to pass HDR content through to the display, 10-bit native bitdepth. On this box the driver-side 610.43 bug that feeds invalid HDR metadata to clients applies - a crash on HDR open is the driver, not the config.

SettingValueReason
Audio rendererMPC Audio Renderer, WASAPI exclusive, bit-exact outputbypasses the Windows shared-mode resampler and mixer entirely
DeviceSMSL D70 Prothe music/video DAC; the SSL 2 handles voice work
BitstreamingAll offbitstreaming exists to hand AC3/DTS/TrueHD to a receiver decoder; into a USB DAC it produces silence5
Mixing, DRCOffno downmix, no dynamic range compression in the player
Buffer50 ms (2.8.2 MPCAR default; 0 = device period, 1 = reserved, 100 ms alternatives)raise on underruns before touching anything else

With WASAPI exclusive mode engaged, the Control Panel’s shared-mode format (24-bit/48000 Hz) is bypassed for MPC-HC playback; keep it as the shared default for everything else on the machine.

StoreContentsDeclarative path
mpc-hc64.ini (INI mode)player settings, internal LAV filters, MPC Audio Renderer sectioncopy the file next to the exe
HKCU\Software\MPC-HC\... (INI mode off)the same profile contents in the registry.reg export of the whole tree
HKCU\Software\MPC-BE Filters\MPC Video RendererMPCVR settings.reg export; unaffected by INI mode

The profile store choice is global: WriteProfileInt from the LAV wrapper and the audio renderer lands in the ini or the registry depending on the INI-mode switch6. MPCVR bypasses the profile entirely and writes its own key2. The registry value enums (renderer IDs, WASAPI mode dwords) are not hand-authored anywhere in this setup: they are set once through the GUI, then captured. A wrong dword breaks playback without an error message, and the enums are not all documented7.

pwsh .\mpc-hc\capture-config.ps1 -RepoRoot C:\path\to\media-player-config

writes mpc-hc64.ini (found via the player’s ExePath registry value), mpc-hc-registry.reg (the whole HKCU\Software\MPC-HC tree) and mpcvr-registry.reg (the MPCVR key) into mpc-hc/windows-snapshot/, with the player closed. Reapply after a reinstall: import both .reg files, copy the ini, tick INI mode once - the ini then wins for the profile, and MPCVR keeps living in its own key. Commit the snapshot; that commit is the config’s state history.


  • A full vlcrc is version-coupled; a delta is not. The full file carries thousands of commented defaults that change shape between VLC releases. Commit the delta, keep the expanded copy disposable.
  • INI mode covers the profile store, and only it. The internal LAV filters and the audio renderer move with it; MPC Video Renderer keeps its own registry key either way - the capture script’s second export exists for exactly that2.
  • Install MPC-HC outside Program Files first. The INI-mode checkbox reads as permanently greyed out otherwise, and the reason (exe-directory write access) is documented nowhere in the UI1.
  • Bitstreaming into a DAC produces silence, not an error. The toggles exist for receiver decoders; the DAC gets a raw PCM stream instead5.
  • The stock state was nearly empty on this machine (VLC: two privacy flags; MPC-HC: interface language). Curation from sources beats trying to “export the tuned config” when nothing was ever tuned - the export would have captured the defaults.

Which player andconfig surface?PlayerVLC hw decodeAudio outmpvdotfiles configlocal files,any OSVLCvlcrc deltanetwork streamsMPC-HCini + snapshotWindowsbest qualityavcodec-hw=vaapi+ libva-nvidia-driverLinux + NVIDIAleave avcodec-hw=anyWindows(D3D11VA auto)WASAPI exclusive,bit-exactUSB DAC,listening chainWASAPI shared(default)comms,applications

Text fallback:

  1. Player: mpv for local files anywhere, VLC for network streams, MPC-HC for best Windows playback quality.
  2. VLC hardware decode: pin avcodec-hw=vaapi on Linux with NVIDIA (needs libva-nvidia-driver); leave any on Windows, where D3D11VA is auto-selected.
  3. Audio output: WASAPI exclusive with bit-exact output for the USB DAC listening chain; shared mode for communications and everything else.

ClaimHow it was checkedStatus
VLC key names and defaults (network-caching 1000, avcodec-hw any, aout empty, resampler empty)read from the live %APPDATA%\vlc\vlcrc on the ERFI1 Windows host, 2026-09-27measured
MPC-HC registry tree (HKCU\Software\MPC-HC) and stock state (language only, morning of 2026-09-27)reg export HKCU\Software\MPC-HC on the same hostmeasured
MPC-HC 2.8.2: MPCVR default on modern systems, LAV 0.83, MPCVR 0.10.8release notes4documented
MPC-HC INI mode and the Program Files write-access caveatDoom9 thread1documented
Internal LAV + audio renderer follow the profile store (registry or ini)source: FGFilterLAV.cpp / MpcAudioRenderer.cpp6source-verified
MPCVR keeps its own key regardless of INI modesource: VideoRenderer.cpp line 362source-verified
MPCAR enums: DeviceMode 0=shared/1=exclusive, WasapiMethod 0=EVENT, BufferDuration 50 ms default, UseBitExactOutput default truesource: IMpcAudioRenderer.h, MpcAudioRenderer.cpp (2.8.2 tag)8source-verified
AudioRendererType values: empty = system default, “MPC Audio Renderer” = MPCAR, device string = MPCAR pinnedsource: AppSettings.h AUDRNDT_*, PPageOutput.cpp8source-verified
MPCVR HDR passthrough defaults true on Win10+, 1000 nitssource: IVideoRenderer.h2source-verified
libva-nvidia-driver in Arch extra (not the AUR)Arch package page3documented
D3D11-native vs copy-back, bitstreaming rulesLAV Filters guide5documented

The media-player-config repo holds the files this doc describes; its README and mpc-hc/SETUP.md carry the apply steps.



  1. clsid2, “MPC-HC settings storage and INI mode,” Doom9 Forum. https://forum.doom9.net/showthread.php?p=1995928 ↩ ↩2 ↩3 ↩4

  2. Aleksoid1978, “VideoRenderer source: Source/VideoRenderer.cpp,” GitHub. https://github.com/Aleksoid1978/VideoRenderer ↩ ↩2 ↩3 ↩4 ↩5

  3. Arch Linux, “libva-nvidia-driver 0.0.18-1,” Arch package registry. https://archlinux.org/packages/extra/x86_64/libva-nvidia-driver/ ↩ ↩2

  4. clsid2, “MPC-HC release 2.8.2,” GitHub. https://github.com/clsid2/mpc-hc/releases/tag/2.8.2 ↩ ↩2 ↩3

  5. Free-Codecs, “Transform your media player with LAV Filters,” LAV Filters guide. https://www.free-codecs.com/guides/transform-your-media-player-with-lav-filters.htm ↩ ↩2 ↩3 ↩4 ↩5

  6. clsid2, “mpc-hc source: FGFilterLAV.cpp, MpcAudioRenderer.cpp,” GitHub. https://github.com/clsid2/mpc-hc/blob/5ad34988/src/mpc-hc/FGFilterLAV.cpp ↩ ↩2

  7. DeepWiki, “clsid2/mpc-hc: settings and configuration.” https://deepwiki.com/clsid2/mpc-hc/2.4-settings-and-configuration ↩

  8. clsid2, “mpc-hc source at tag 2.8.2: AppSettings.h, PPageOutput.cpp, thirdparty/MpcAudioRenderer,” GitHub. https://github.com/clsid2/mpc-hc/tree/2.8.2/src ↩ ↩2