MPC-HC and MadVR Setup Guide

Foreword

Current article is a 3rd draft.

I also have an mpv guide for those who love to tweak, and an SVP4 guide for those who want to explore interpolation options for watching videos.

Table of Contents

Introduction

MPC-HC (original outdated build || forked & maintained build) is a classic video player with solid functionality. Not the prettiest thing in 2021, but function over form right?

For users that love tweaking, or users with potato PCs, I recommend using mpv instead.

For casual users, I recommend using MPC. It is easy to configure, and really user friendly. Performance may not be as efficient as mpv, but its ease of use and forgoing command line / config files in favor for a proper UI makes it the better choice for casual users.

MPC-HC is also very flexible with external components. One of the reason it has maintained its relevance after 17+ years is relying on external components/filters, allowing to decode modern formats despite its age.

MadVR is a powerful DirectShow renderer to to replace the antiquated enhanced video renderer from the Windows XP days. It is crucial to use MadVR as it not just provides powerful scalers and filtering functionality, but also fixes some errors with the default renderer (e.g. 10-bit video has incorrect pixelated chroma with the default renderer).

FFDShow allows MPC to interface with SVP 4 if you plan to use it. FFDshow also allows running custom scripts and AVISynth, but that’s advanced stuff and even I don’t touch it.

Please consult Google for audio options if you have a surround sound home theater. I only have headphones and stereo studio monitors.

Installation

There are many ways to install MPC-HC, ranging from codec packs to installing each component yourself. While my favorite way to install MPC-HC is via the K-Lite Codec Pack (K-Lite comes with a neat icon pack), I recommend avoiding using codec packs unless you are familiar with each components and know how to configure them properly. They are convenient but are also easy to install duplicate components and break rather easily if you don’t know what you’re doing. However, since I’m a hypocrite I’m using a codec pack anyways.

If you plan to use SVP 4, it actually also gives you the option to install MPC-HC and the required components within the installer. I recommend installing all the components with the SVP 4 installer so you don’t need to setup the FFDShow scripts (you can technically do it manually, but it’s a HUGE pain).

TL;DR: Install components manually if possible. If you’re lazy, just remember not to install duplicate components.

Bonus: Here is a video of me setting up my laptop with K-Lite + MadVR. You can follow along, but don’t copy everything I do since your system is different to mine. Finish reading this guide first, as a skip through many details in the video!

MPC-HC

Skip this section if you plan to use SVP.

MPC-HC officially has ceased development. However, you can find the community maintained releases here. Scroll down and get the x64 installer for the latest release build (avoid the dev build).

An alternative MPC-BE is also available. There are some slight differences, but setup should be similar. Nothing a Google search can’t solve though.

MadVR

Skip this section if you plan to use SVP.

MadVR can be installed by simply extracting the zip file to a safe location and running install.bat with admin rights. MadVR does not copy the files as it installs in whatever directory you have the folder extracted in.

SVP 4

Preface: I highly recommend using SVP 4 with mpv instead to save you lots of trouble.

SVP 4 can be easily installed with the installer. I recommend installing the core SVP programs and mpv. mpv will be a pre-configured VPY-enabled build in the SVP 4 installation directory, I recommend creating a ~\portable_config\ directory inside the mpv folder so you can run a separate mpv.conf. See my mpv setup guide to learn more.

Components to install (marked [x] are required components for the 64-bit MPC-HC to function):

+ [x] SVP Manager (Pro)
  + [x] [DS_64] Core for DirectShow 64-bit
  + [ ] [VPS_64] Core for Vapoursynth 64-bit (install if you also want mpv, recommended)
+ [ ] SVP Extensions
  + [ ] SVPcode (SVP transcoding tool)
  + [ ] SVPtube 2 (youtube-dl tool, recommended)
+ [x] 3rd-party software
  + [x] [DS32/64] AviSynth Filter
  + [x] [DS_64] ffdshow filters 64-bit
+ [x] 3rd-party software (optional)
  + [x] [DS_64] MPC-HC 64-bit 
  + [x] [DS32/64] madVR video renderer
  + [ ] [DS32/64] LAV filter (MPC-HC provides built-in LAV, so no need to install unless you need it for specific purposes)
  + [ ] [VPS_64] mpv video player (install if you want mpv, recommended)

Read the guide on how to set it up.

Unfortunately some components installed are a bit older, you can try updating them by overwriting them and keeping the configs. It should work, although don’t quote me on this.

You can try installing components manually, but only do it if you’re confident you know how to set them up manually (need to manually link FFDShow Avisynth script to the SVP script as seen below). If you installed everything with SVP 4, this is all done automatically.

ffdshow avisynth

K-Lite Codec Pack

Ignore this section if you plan to use SVP.

There are lots of codec packs out there, but K-Lite is my favorite. Again, don’t touch codec packs unless you know what’s going on, or you’re very careful with them. They tend to “manage” things for you and sometimes break things.

I recommend installing the Standard pack, then manually installing MadVR. K-Lite Codec Pack provides some useful tools and a neat icon pack with it. It even registers the app with Windows Graphics settings by default, so if you’re on a laptop you can go to the settings and force it to use your dedicated GPU.

MPC-HC Basic Setup

To open the options, select View -> Options on the Menu bar. This guide will assuming SVP 4 is NOT installed. If it is, there will be some differences (FFDShow stuff and script setup).

GPU Selection

If you have a laptop, you need to select your dedicated graphics for MPC-HC if you wish to use shaders and MadVR filters. I don’t have a laptop by me right now, but the power saving option in the screenshot should be the iGPU while the high performance option should be the dedicated GPU. You can find this option in Windows settings -> System -> Display -> (scroll down) Graphics Settings.

If you don’t see the app, you need to add the executable to the list.

gpu

Player

Player options should be self explanatory. Take your time to configure it to your liking.

Formats, Keys, Logo, Web Interface

Pretty self explanatory. Formats might be a bit frustrating to register the app as the default app. You will need to click Run as Admin, select video/audio/both, click done and done again, and then you can register MPC as the default app in Windows settings (thanks Microsoft! /s).

Keys are for shortcut keys. Make sure there are no duplicates!

Playback

Self explanatory options.

Output

Once you’ve got MadVR installed, you can switch Direct Show Video (1st option) to MadVR renderer. Leave the rest as defaults.

Output

Shaders

Hover over the shader files to see where they are located. You can download my provided debanding shaders here. Extract the files to where all the other shaders are installed at.

You can create new presets and add shaders to both pre- and post-resize. Only add to pre-resize unless you know what you’re doing. Photo example is me creating a light deband preset and loading it to the pre-resize filter. Remember to click save to save the shader preset after configuring!

You can access preset shaders quickly via right clicking when watching a video. This should also allow you to see how effective the shader is (you can create a “blank” preset with no shaders, and toggle between profiles to see its effect).

Shaders

Fullscreen

This allows the monitor to quickly switch refresh rate in fullscreen mode to match the source. I recommend not touching this, and use MadVR’s function instead if you want to change refresh rate of your monitor.

Internal Filters

The bottom 3 buttons allows access to LAV filter options. Note that these are the built-in LAV filters. If you installed MPC-HC via other means (e.g. codec pack), it’s possible that an external LAV filter has been installed. They can usually be accessed via system icons if they have been installed.

LAV filter config will be discussed later.

Audio Switcher/Renderer

Audio options. Consult other guides if you require advanced audio settings. The only relevant option here is the normalize filter, which imo should be disabled since it doesn’t work very well anyways. For music file normalization, MPC-HC supports replaygain tags, but just use a proper music player like Foobar2K at that point.

External Filters

Skip if you don’t plan to use SVP 4

Read the guide on how to setup FFDShow for SVP. Or just use the MPC-HC installed via SVP4, it’s setup by default.

Subtitles

Sub settings. Self explanatory. If you have a weak system, you can consider lowering subtitle animation frame rate (some fancier OP/ED have trouble rendering on weaker systems).

Tweaks and Misc

Self explanatory. Fast seek (keyframe) allows faster seeking, but since it uses keyframes some videos will seek rather far away from preset time. Disable fast seek if you must seek exact time defined in your jump distances.

Advanced

Don’t touch this unless you have a reason to.

To set max network streaming resolution, set YDLMaxHeight to the vertical resolution (e.g. 1080 for 1080p).

LAV Filters

See Internal Filters on how to access it.

LAV V

Set Hardware Acceleration to DXVA2 copy-back if you plan to use external filters such as SVP 4. copy-back means the decode stream is copied into system memory.

LAV A

Read guides if you need to know more about audio setup. For those like me using stereo, the default option should suffice. You may want to enable DRC so downmixing surround sound streams won’t have abrupt loudness.

LAV S

1f0.de has explanations for advanced options. Explanation of my setup:

jpn:eng loads eng subs for jpn audio as top priority. (I technically don’t need this first line due to my 2nd line, but I’m too lazy to edit it).
*:eng loads eng subs for any audio as 2nd priority.
*:*|d loads anything, preferably anything marked as default as 3rd priority.
; is a separator.

MadVR

Ctrl+j allows you to monitor decode info for dropped frames. Remember to also monitor system usage, and try not to exceed ~70% CPU/GPU usage if possible. Note that AV1 decoding and HDR tone mapping uses a TON of resources.

Go to system tray and double click MadVR icon to open settings.

Devices

In device settings you can access monitor related settings. Adjust settings to your appropriate device (i.e. PC or TV color levels, HDR settings, etc.). You can also access monitor refresh rate settings here, though if you are not using SVP there really isn’t much reason to use this. If you aren’t sure, leave them as default.

Click on your device and set its device type from unknown to whatever it is (typically Digital Monitor/TV). Expand the menu and go to properties. If you have a computer monitor, make sure it’s on PC levels (0-255). If you have a TV, you might need to test it since lots of TVs have a PC mode these days. The Lagom black level test should let you know which mode your TV is running in. Set your TV to its brightest, and see if you can see the all the squares displayed. The correct mode should allow you to see all squares (1st row is very subtle so widen your eyes).

One important setting is the calibration of your monitor if you have a wide gamut display. Ideally you want to setup with custom 3DLut, but proper equipment is expensive. If you know your screen is close to DCI-P3, you can just set your calibration to assume a DCI-P3 monitor. This fixes oversaturation issues on BT.709 videos (which pretty much 99% of the videos out there are).

Note that if you apply gamut clamping/remap, screenshots will look unsaturated on sRGB devices as they are color clamped to display sRGB values on a wide-gamut color space. (i.e. red [255,0,0] on sRGB/BT.709 will be clamped to [233,54,40] in DCI-P3)

Display modes allows you to switch monitor supported refresh rates in certain conditions. Back when I used SVP with a 60Hz monitor, I had MadVR change to 48Hz (custom res setup in Nvidia Panel) in full screen. This section is irrelevant for people with high refresh monitors.

If you don’t have a true HDR display (such as the useless HDR 400), I recommend setting MadVR to tone map using pixel shaders instead of the default passthrough. HDR on HDR 400 displays look like crap.

Processing

Activate auto deinterlacing if you watch ancient DVD content. Otherwise, turn it off as Anime sometimes triggers false positives.

Artifact removal:

  • If you don’t plan on using my provided deband shader, feel free to use the MadVR one. I prefer the mpv ported one as imo it’s the best written deband shader out there.
  • Reduce compression artifacts can be use if you mainly stream your anime from Crunchyroll or other Web sources. Useful but GPU intensive!
  • Reduce random noise helps remove some dynamic grain and video noise. Useful but GPU intensive (especially if chroma filtering is selected)!

I prefer not using filters due to GPU usage (I watch videos while doing other stuff), though I found setting reduce random noise (no chroma, strength 1) to be rather pleasant at removing film camera noise and injected noise from anime BDs. I recommend enabling reduce random noise (str 1 no chroma) if you don’t multitask like I do and find film/injected grain to be unpleasant. If that’s too strong, simply enabling reduce compression artifacts str 1 is also nice as it only filters extreme cases.

Image enhancement setting here is global. I recommend using image enhancements in the upscale refinement tab (discussed later) for upscales only.

As for debanding, I recommend the Lite filter for my provided hlsl and only use Medium/Strong for WEB or older content. For MadVR deband, I recommend Medium strength + High Fade-In/Out for Anime. (ONLY choose one debanding filter to use, not both!)

Scaling Algorithms

Chroma Upscaling: Jinc should be sufficient for mid-ranged GPU. Only use NGU if you got a really high end GPU and require 2x resolution. Spline is a good quality fallback that uses much less resource usage compared to Jinc. Stick with Bilinear if you have a potato PC. Remember to activate anti-ringing filter when applicable.

Image Downscaling: SSIM for decent systems. Otherwise Lanczos or Spline are good fallbacks. Honestly even Bilinear is fine, as there aren’t many situations where you’ll downscale videos. The only scenario I can think of is stuffing the window in the corner background playback while doing other stuff, in which case quality isn’t important.

Image Upscaling: Most important, spend your GPU resource here first. Bilinear for potato PCs. Bicubic75 for iGPU systems if able. Spline for weak systems. Jinc for mid-end GPUs. NGU for higher-end systems that require resolution doubling (1080p -> 4K). Remember to activate anti-ringing filter when applicable.

Upscale Refinement: Post-upscale filtering. Some people like it, some don’t. Personally am not a fan. For anime, Adaptive Sharpen and Thin or Crispen edges should be the most relevant settings. Personally Adaptive sharpen (0.5) + Thin Edges (1.0) + both anti-bloat(100%)/ringing filter looks good on most slow-paced anime.

Deep Dive into Scaling Algorithms

Explaining each algorithm in detail is going to take too much time. Instead, let me redirect you to my mpv external-shaders guide for more info. Scroll down to the upscalers demo. I’ll explain the relevant ones:

ewa_lanczos is Jinc-functioned Jinc, a.k.a Jinc. mpv also has a sharp and soft tweaked variant but MadVR only has the default one. Jinc is probably as good as it gets without getting into more advanced NN scalers. Recommended to use in mid-ranged GPUs (GTX 1650 or better).

Next in line is spline. MadVR’s spline 3-tap should be spline36, and 4-tap should be spline64. Much lower system resource and close in quality to Jinc with a tad bit more ringing artifacts. Recommended to use in entry-level GPUs (~GTX 1050 tier).

MadVR has the ability to use various Bicubic upscalers. I like to use Bicubic75 for my iGPU laptops, but other sharper variants also exist. Bicubic is 1 step down from spline is suitable for laptops with iGPUs if spline is unable to run smoothly. Some older (e.g. 1st gen 4K laptops) might still struggle with Bicubic75.

Bilinear or DXVA2 can be used on potato PCs.

NGU is a proprietary doubling (2x) scaler. The sharp variant is similar to FSRCNNX. AA variant is similar to NNEDI3. Standard is in the middle and my personal recommendation. I recommend NOT using NGU unless you can run it at high or very high quality without dropping frames.

Resource Prioritization

CPU/GPU resource is limited, and putting them where it impacts the most is the most important. Here is my flowchart:

Img Upscl Chroma Upscl. Img DwnScl. Img/Artifact Enhc.
Potato Bilinear Bilinear Bilinear None
iGPU Laptops Bicubic Bilinear Bilinear None
Modern Laptops ~ GTX 1030+ Tier Spline Bicubic Bilinear None
~ GTX 1650 Jinc Spline Bilinear Single/Simple Option
~ RTX 2060 Jinc Jinc Lanczos Moderate Options
~ RTX 2060 Alternate NGU Jinc SSIM Lightweight Options
Powerful Systems Sky Is The Limit

Rendering

General rendering options. Leave at default for the most part.

Leave Smooth Motion off, if you want interpolation get SVP.

Dither – I prefer Ordered Dithering.

Trade Quality for Performance – Not as a huge impact you might realize. It’s not gonna magically make your potato play 4K videos.

Conclusion

Thanks for reading!

Here’s a small tip for beginners: Simple is best. I find many beginners setting up a gazillion filters in their quest to improve “video quality”, only to make it worse. Here are my steps to setting up your video player:

  • Setup upscaling algorithms. If satisfied, stop. If not, move on to…
  • Deband. You’re most likely going to notice banding after setting up scaling to your liking. Either use MadVR’s built-in deband, or the provided hlsl deband filter ported from mpv. Next…
  • < Most poeple should stop here, as starting here we get to more destructive filters >
  • Denoise. Reduce random noise can remove annoying camera film grain or injected dynamic grain. If you feel that it is too strong, use reduce compression artifacts to do light denoising removing jpeg-like artifacts caused from compression. Lastly…
  • Use a reasonable amount of filtering. A light thin-edges + adaptive sharpen should be sufficient for most content. Please don’t be THAT guy with every filter enabled.

mpv Configuration Guide for Watching Videos

Forewords

I also have a guide for setting up MPC-HC and MadVR if you’re less into tweaking. Other then being slightly less resource efficient at the lower end, imo MPC paired with MadVR is just way more convenient to use.

Table of Contents

These are my recommended settings. Adjust the settings suitable to your system.

Get mpv at mpv.io or custom mpv build w/ vpy enabled configured by me. Just extract the archive to a desired directory. I recommend not using a directory that requires admin/superuser privileges. For Windows, an install script should be included but is not required, as all it does is register mpv for file association. For Mac, there’s also IINA which has a prettier UI although some advanced options may not work and may require more tweaking for power users.

The mpv.conf file can be found in %APPDATA%\mpv on Windows and ~/.config/mpv/ for Linux/Mac. Alternatively, \portable_config\ folder can be used in the mpv executable directory on Windows to make it portable, and will take highest priority over %APPDATA%\mpv.

Read the documentation for all available commands.

To illustrate how the config file works:

# This is a comment.
#inactive-config
active-config # This is a comment.
active-option-value=111
active-option-value=222 # active-option-value is now set to 222 instead of 111. 

Anything behind a # is disregarded by the program as a comment and is inactive. Anytime you write a new line that is present already, it overrides it. This means if you write scale=ewa_lanczossharp, then in the next line write profile=gpu-hq, the scale=spline36 from the gpu-hq profile will override the settings you set earlier.

If you are still using notepad to edit files, I recommend using VSCode, Notepad++ or similar software to edit config files to make your life easier.

GPU Selection

If you have a laptop, you need to select your dedicated graphics for mpv if you wish to use advanced filters/scalers. I don’t have a laptop by me right now, but the power saving option in the screenshot should be the iGPU while the high performance option should be the dedicated GPU.

You need to add the executable to the list if you don’t see it (mpv.exe).

gpu

General mpv Options

Enable this section if you use SVP 4, requires Vapoursynth mpv build.
I also have an SVP 4 guide if you’re interested.

#input-ipc-server=/tmp/mpvsocket # *nix only
input-ipc-server=mpvpipe # Windows only
hwdec=auto-copy
hwdec-codecs=all
hr-seek-framedrop=no
no-resume-playback

Built-in high quality profile. Enables better upscaling algorithm. Recommend GPU minimum of newer Intel Iris iGPU, AMD VEGA 8 iGPU, or NVidia MX150. Add this option at the beginning of the file to prevent overriding options!

profile=gpu-hq

(Optional) Enabled newer Vulkan API. Disable if compatibility/performance issue. May improve performance when running complex shaders. Default has been updated to use 3D311. Set to opengl if you’re having issues.

gpu-api=vulkan

Setup proper color profile to prevent oversaturation on high-gamut monitors. Many IPS monitors these days can achieve near DCI-P3 performance and look oversaturated, especially with the reds/greens. (Oversaturation is pretty on nature videos, but makes human skin look odd and gets old real quick.) If you can calibrate the monitor to get an icc profile, use it. If not, you can set a target primary if you know your display color gamut. Only enable 1 option!

icc-profile="C:\Windows\System32\spool\drivers\color\Example.icc" # Use defined icc file
#icc-profile-auto # Use this if your system has a default icc profile setup already.
#target-prim=dci-p3 # Use this if you don't have a calibrated icc profile, but know your monitor's gamut

Override default language selection order:

alang = 'jpn,jp,eng,en'
slang = 'eng,en,enUS' # enUS for Crunchyroll.

Some other UI options:

keep-open=always # Prevents autoplay playlists. Set to 'yes' to autoload. Both "always" and "yes" prevents player from auto closing upon playback complete.
reset-on-next-file=pause # Resumes playback when skip to next file

window-scale=1 # Set video zoom factor. (High DPI screens want 1.5 or even 2)
autofit-larger=1920x1080 # Set max window size. Can also set something like "75%" to mean max window size is 75% of screen height/width
autofit-smaller=858x480 # Set min window size.

no-osd-bar # Hide OSD bar when seeking.
osd-duration=500 # Hide OSD text after x ms.
osd-font='Trebuchet MS'
#osd-font-size=24

If you have a custom osc.lua, enable this or you will be playing loading roulette with a different or broken OSD every time you open mpv.

osc=no # Disables default OSD. Use this option ONLY if you have a custom osc.lua

Configure network/youtube-dl options:

ytdl-format=bestvideo[height<=?1080]+bestaudio/best # Set max streaming quality as 1080p.
# Default demuxer is 150/75 MB, note that this uses RAM so set a reasonable amount.
demuxer-max-bytes=150000000 # 150MB, Max pre-load for network streams (1 MiB = 1048576 Bytes).
demuxer-max-back-bytes=75000000 # 75MB, Max loaded video kept after playback.
force-seekable=yes # Force stream to be seekable even if disabled.

Screenshot:

screenshot-format=png
screenshot-high-bit-depth=yes
screenshot-png-compression=7 # Setting too high may lag the PC on weaker systems. Recommend 3 (weak systems) or 7.
screenshot-directory="%USERPROFILE%\Pictures\mpv"

Video Config

Denoise filter. Recommend keeping it off unless watching CRT era stuff. (May not work, filter requires vo=vdpau or vo=gpu. See doc.)

#denoise=1

Deband filter. Always turn on for anime. Turned on by default if profile=gpu-hq is set.

deband=yes # Default values are 1:64:16:48

Deband parameters configuration. For Anime, 2:35:20:5 recommended for general use. Use 3:45:25:15 for older DVD, badly mastered BD or WEB streams. Use 4:60:30:30 for really, really bad streams.

deband-iterations=2 # Range 1-16. Higher = better quality but more GPU usage. >5 is redundant.
deband-threshold=35 # Range 0-4096. Deband strength.
deband-range=20 # Range 1-64. Range of deband. Too high may destroy details.
deband-grain=5 # Range 0-4096. Inject grain to cover up bad banding, higher value needed for poor sources.

Note: For older/weaker iGPUs, instead of increasing deband-iterations you may need to increase deband-threshold instead if you need a stronger effect. I recommend 1:60:25:30 if you absolutely must run 1 iteration (lower quality but much less GPU usage).


Dither:
Set to auto for Anime due to 8 and 10 bit encodes. Set to no if your monitor has built-in dither (just leave it at auto if you aren’t sure).

dither-depth=auto

Audio Config

volume=100 # Set volume to 100% on startup.
volume-max=100 # Set player max vol to 100%.

Subtitle Config

Enable if subs are broken or you need legacy ssa support.

demuxer-mkv-subtitle-preroll=yes
#sub-ass-vsfilter-blur-compat=yes
#sub-fix-timing=yes

Enable to modify PGS subs.

#sub-gauss=0.5 # Blur PGS subs.
#sub-gray=yes # Monochrome subs (makes yellow font grey).

Allow loading external subs that do not match file name perfectly.

sub-auto=fuzzy

Default subtitle font when none are specified.

sub-font='Trebuchet MS'
sub-bold=yes # Set the font to bold.
#sub-font-size=55 # Set default subtitle size if not specified.

Advanced Video Scaling Config

Internal Scalers

Note: Press shift + I in mpv to view frame drops. Then press 2 to view frame times and processing layers. Make sure your config does not drop frames and ideally frame times should be <25ms.

scale is the luma upscale method. Prioritize resource on this over cscale.
dscale luma downscale method.
cscale chroma upscale method. Human eyes aren’t as sensitive to chroma compared to luma.

If you enabled profile=gpu-hq earlier, these are the options set by it (no need to include these lines again):

#Scaling algorithm set by profile=gpu-hq
scale=spline36
dscale=mitchell
cscale=spline36

Default gpu-hq should be sufficient for most people, however, here are some suggestions for fine tuning:

I have a Toaster (crappy PC) edition:

scale=bilinear # Set spline16 if possible.
dscale=mitchell
cscale=bilinear

I have an iGPU laptop edition:

scale=spline36
dscale=mitchell
cscale=mitchell

I have a decent GPU (GTX 1050+) edition:

scale=ewa_lanczossharp
dscale=mitchell
cscale=spline36 # alternatively ewa_lanczossoft depending on preference

External Shaders

For those who have really good GPUs (GTX 1060+, sometimes need even better GPU) and want to run external shaders:

Remember to download the shader files and put them in the mpv config folder! ~~/xxx.glsl refers to xxx.glsl file in the mpv config directory.

Always enable profile=gpu-hq before using shaders for fallback at the beginning of the file.

DO NOT COMBINE shaders of the same type mindlessly. Just choose one. You’ll bork the image if you run multiple filters, they’re not designed to work together.

Dynamic Scaler: SSSR
SSSR is a dynamic scaler that improves built-in scalers utilizing structure similarity. Upscale result varies widely depending on your scaler. You may freely choose your preferred one. Moderate to highly GPU intensive. This is my personal favorite due to its versatility.

For a sharper image:

glsl-shader="~~/SSimSuperRes.glsl" # Set B C parameter to Robidoux.
scale=ewa_lanczossharp
dscale=mitchell
cscale=spline64

Alternatively set to haasnsoft for a softer look (much better at artifact/aliasing supression). I found this combo to be very good for anime and performs close to NN based upscalers.

glsl-shader="~~/SSimSuperRes.glsl" # Set B C parameter to Mitchell.
scale=haasnsoft
dscale=mitchell
cscale=ewa_lanczossoft

If you really want to run SSSR on a lower-end GPU, the full power version of MX150 (1D10 25W) should be able to run it if you use the faster algorithms. Results will still be better than spline36. Use bilinear/spline16/spline36 (whichever your GPU can handle without dropping frames) for a sharper image. For anime, if you want a softer anti-aliasing look like haasnsoft, use bicubic.

glsl-shader="~~/SSimSuperRes.glsl" # Set B C parameter to Robidoux for sharper image, else use Mitchell (slightl sharper) or Catrom (default).
scale=bicubic # or bilinear or spline16/36
dscale=mitchell
cscale=mitchell

You can modify the SSSR shader’s cubic B and C parameters (on line 31 and 79) to your needs. Default is Catrom (0,1/2). Set to Mitchell (1/3,1/3) or even Robidoux (0.3782,0.3109) for a sharper image. See this graph.

2x Pre-Scaler: Neural Network Scalers
Some of these shaders require high-end GPUs to run smoothly. 2x pre-scaler means they scale a fixed 2x and should only be used if you have a 4K monitor (1080p x2 = 4K). For NN upscalers, more neurons = better quality but significantly more computational power.
Always remember to set profile=gpu-hq first (at beginning of file).

profile=gpu-hq

Choose 1 of the 2x pre-scalers:

  • FSRCNNX is very good for general use / real-life content, may amplify artifacts (due to it being true to its source). Requires good source material. MadVR equivalent would be NGU-Sharp. Very GPU intensive.
glsl-shader="~~/FSRCNNX_x2_8-0-4-1.glsl"
  • RAVU Lite is relatively lightweight and decent for anime due to the lite version being sharper. I would use SSSR over this due to SSSR being better imo. Moderately GPU intensive.
glsl-shader="~~/ravu-lite-r4.hook"
  • NNEDI3 is designed for anime use. Result is very close to MadVR’s NGU-AA. Very GPU intensive.
glsl-shader="~~/nnedi3-nns32-win8x6.hook"

Remaining:

dscale=mitchell
cscale=spline64 # or ewa_lanczossoft (or your choice, really)

Dynamic Scaler for Anime: Anime4K

Do NOT mix Anime4K with other shaders/scalers.

Anime4K is a unique upscaler + shader designed for Anime. It used to be very destructive, sharpens lines for a… unique “visual quality” look. It works extremely well in some anime and eh in others. Definitely isn’t for everyone. Version 0.9 had lots of flaws (mainly texture banding and line bloating). 1.0RC fixes a lot of the flaws (mainly bad banding) at the cost of doubling GPU consumption. 1.0RC2 optimized GPU usage (even more effecient than 0.9, 1080p > 4K should just barely run on a GTX 1030) and also introduced 2 more speed profiles for even weaker systems (supposedly the fastest profile can run on iGPUs at the cost of shader quality).

The latest 1.0RC2 tones down the “filtered look” even more and serves as an upscaler + filter of {line thinning + line smoothening + sharpening} + artifact/texture-denoiser (reduces jpeg-like edges) combo (note: filter only active when upscaling). One down side to Anime4K compared to other upscalers is that due to line thinning, anime with bad aliasing effects looks even worse (stares at badly made isekai anime magic circles).

Latest Anime4K have multiple glsl files that can be mixed and matched. See documentation for how to set it up for mpv.

# See Anime4K documentation, setup has changed a lot since the 1.0 days.
# Following is an example for v3.1 setup for 1080p scaling + post-processing
glsl-shaders="~~/shaders/Anime4K_Denoise_Bilateral_Mode.glsl;~~/shaders/Anime4K_DarkLines_HQ.glsl;~~/shaders/Anime4K_ThinLines_HQ.glsl;~~/shaders/Anime4K_Upscale_CNN_M_x2_Deblur.glsl"

For those interested in higher quality downscale:
SSIM downscaler is tuned to be used with mitchell. However, you shouldn’t be downscaling in the first place so just having dscale=mitchell fallback should be good enough.

glsl-shader="~~/SSimDownscaler.glsl" 
dscale=mitchell
linear-downscaling=no

For those inteested in higher quality chroma upscale:
Imo cscale=spline36 is already very good. Human eyes aren’t that sensitive to Chroma compared to Luma. I won’t be surprised if you can’t even tell the difference when simply using cscale=mitchell. However, if you just want the best of the best and have the extra processing power, KrigBilateral is a high quality Chroma upscaler.

glsl-shader="~~/KrigBilateral.glsl"

I always advise testing out settings yourself, “quality” is extremely subjective. For example, in anime, destructive filters (denoise/de-ring/sharpen) upscalers may “look better” visually but not necessarily be true to its source (lower SSIM/PSNR).

If we go purely by measurement, haasnsoft should be a terrible upscaler (and it kinda is with normal content). However, when paired properly with SSSR it looks great in anime. Similarly, NNEDI3 looks better with Anime (as it’s trained for such) despite FSRCNNX is the technically better (accurate) upscaler.

Anime “visual quality” greatly favors algorithms that de-aliases, denoises and sharpens lines to be defined. This is why Anime4K is such a controversial upscaler as it takes these concepts to an extreme.


In terms of algorithm quality (Note: better quality usually = more GPU usage):

abc = abc built-in shader
[xyz] = xyz external shader (requires downloading glsl/hook files)

For scale:
[NNEDI3] or [FRCNNX] > [SSimSuperRes + haasnsoft/ewa_lanczossharp] > ewa_lanczossharp > spline36 > spline16 > bilinear
                <------------------------[Anime4K] (personal preference)------------------------->

For dscale:
[SSimDownscaler] > Mitchell

For cscale:
[KrigBilateral] > spline64 / ewa_lanczossoft / spline36 > mitchell

Upscalers Demo:
Open in new tab to view full size.
2x upscale from 100×54 to 200×108 image (Source: DanMachi).
NNS = nearest neighbor (also interger upscale in this case, essentially original image). mpv default is bilinear. Anime4K shown is older 1.0RC ver.
upscalers

Personal mpv.conf file

Note: I’ve since upgraded my system, current sample file is tailored towards a mid-end desktop with a DCI-P3 monitor intended to be used with SVP. Please modify the file to your needs and not blindly copy-paste.

###--- Enable this section only if you use SVP 4, requires Vapoursynth mpv build ---###
#input-ipc-server=/tmp/mpvsocket # *nix only
input-ipc-server=mpvpipe # Windows only
hwdec=auto-copy
hwdec-codecs=all
hr-seek-framedrop=no
no-resume-playback
###--- End of SVP Section ---###

profile=gpu-hq

#gpu-api=vulkan #Default is now updated to use D3D11 which works better with my current setup.

target-prim=dci-p3 # Clamp video color to display correctly on my DCI-P3 monitor.

# UI/Behavior setup.
alang = 'jpn,jp,eng,en'
slang = 'eng,en,enUS'
keep-open=always
reset-on-next-file=pause
window-scale=1
autofit-larger=75% #Set Resolution (HorizontalxVertical or Screen%, i.e. 1280x720 or 50%)
autofit-smaller=858x480
no-osd-bar
osd-duration=500
osd-font='Trebuchet MS'
#osd-font-size=24

#osc=no # Hide OSC. Use this option ONLY if you have a custom osc.lua

# Configure network/youtube-dl options:
ytdl-format=bestvideo[height<=?1080]+bestaudio/best # Set max streaming quality as 1080p.
demuxer-max-bytes=150000000 # Max pre-load for network streams (1 MiB = 1048576 Bytes).
demuxer-max-back-bytes=75000000 # Max loaded video kept after playback.
force-seekable=yes

# Screenshot:
screenshot-format=png
screenshot-high-bit-depth=yes
screenshot-png-compression=3 # Setting too high may lag the PC.
screenshot-directory="%USERPROFILE%\Pictures\mpv"

# Deband filter. Always turn on for anime.
deband=yes # Default values are 1:64:16:48

# Deband parameters configuration.
deband-iterations=2 # Range 1-16.
deband-threshold=35 # Range 0-4096.
deband-range=20 # Range 1-64.
deband-grain=5 # Range 0-4096.

dither-depth=auto

volume=100
volume-max=100

demuxer-mkv-subtitle-preroll=yes
sub-auto=fuzzy


glsl-shader="~~/shader/SSimSuperResMitchell.glsl"
scale=ewa_lanczossharp
glsl-shader="~~/shaders/KrigBilateral.glsl" # High quality chroma upscaler.

input.conf Config

You may create an input.conf in the same directory as mpvconf to override default shortcuts. Here is a cheatsheet for the default shortcuts:

shortcuts

Keep in mind depending on your country keyboard, you may need to modify the file accordingly. For example, the key = has been ‘incorrectly’ mapped as + for default shortcuts (e.g. alt + = for zoom is mapped as alt + + which won’t work on the US keyboard). This is because in some countries the = key is the + key, and while on the US keyboard they are the same key the + is actually shift + =.

Basically when mapping, a means pressing a, but A means shift + a.

To fix the incorrect zoom shortcut:

Alt+- add video-zoom -0.1
Alt+= add video-zoom 0.1

To modify skip durations and add custom skip shortcuts:
Note that keyframe seeking is much faster (no render lag) but may not be exactly x seconds.

# Seek 5s exact, do not display OSD.
RIGHT no-osd seek  5 exact
LEFT  no-osd seek  -5 exact
# Seek 5s to the closest keyframe.
Ctrl+RIGHT  seek  5
Ctrl+LEFT   seek -5
# Seek 20s exact.
alt+RIGHT no-osd seek 20 exact
alt+LEFT no-osd seek -20 exact

Modify mouse wheel to control volume:

WHEEL_UP add volume 10 # In volume %.
WHEEL_DOWN add volume -10

Add audio delay hotkey:

ctrl+= add audio-delay 0.1 # In seconds.
ctrl+- add audio-delay -0.1

Add subtitle delay:

. add sub-delay +0.042 # 0.042s is 1 frame for a 24fps video
, add sub-delay -0.042

I came from MPC-HC so I remapped many shortcuts to the same keys.
Add full-screen shortcut like that in MPC-HC:

F11 cycle fullscreen

Add screenshot shortcut like that in MPC-HC:

F5 screenshot video # Video stream screenshot (extract video frame).
shift+F5 screenshot # File stream screenshot (video frame + render subtitles/signs)
ctrl+F5 screenshot window # Window screenshot (screenshot current player frame including OSD, shaders, upscale, etc.)

Cycle subtitle & audio like in MPC-HC:

s cycle sub
S cycle sub down # shift + s cycle backwards
a cycle audio

Cycle ASS subs style override:

u cycle-values sub-ass-override "yes" "force" "strip" "no"
ctrl+, add sub-scale -0.05 # Decrease sub size by 5%
ctrl+. add sub-scale 0.05 # Increase sub size by 5%

Cycle adaptive sharpen shader:
Note: Requires AdapSharp glsl in mpv conf directory. When AdapSharp is active sigmoid-upscaling needs to be no.

g change-list glsl-shaders toggle "~~/adaptive-sharpen.glsl"; cycle-values sigmoid-upscaling "no" "yes"; show-text "glsl-shaders='${glsl-shaders}'\nsigmoid-upscaling=${sigmoid-upscaling}"

Cycle deband on/off and weak/medium/strong:
Note: the ‘weak’ first set of deband values here needs to match the values set in mpv.conf or the value order will be messed up (in this specific case 2:35:20:5).

h cycle-values deband "yes" "no"
H cycle-values deband-iterations "2" "3" "4" ; cycle-values deband-threshold "35" "45" "60" ; cycle-values deband-range "20" "25" "30" ; cycle-values deband-grain "5" "15" "30" ; show-text "Deband: ${deband-iterations}:${deband-threshold}:${deband-range}:${deband-grain}" 1000

Visit the wiki or the default input.conf for more info.

mpv Custom Build

Here is a custom built mpv with Vapoursynth enabled (for Windows). Also includes a custom built FFmpeg in the folder. The folder is portable, and the settings are also in the portable folder. The OSC is also custom, delete osc lua and conf files if you want the default back.

Note: \portable_config\ folder takes priority over %APPDATA%\mpv folder. (i.e. \portable_config\mpv.conf will load instead of ~~\mpv.conf.)

Download the 7z or zip archive.

UPDATE: Newer mpv build 7z archive, includes newest Anime4K stuff. HOWEVER, the newer builds post v29 have an OSC bug where it fails to load my custom OSC half the time. If this annoys you, delete ~~\scripts\osc.lua and \script-opts\osc.conf and just use the default UI. I also included the older mpv.exe renamed as mpv.exe.old if you want the older stable executable back, though the newer version should offer better compatability with newer formats such as AV1 and HDR stuff. Important EDIT: Adding osc=no in the config file completely fixes this issue by forcing the original osc to be disabled, thus successfully loading the custom osc.lua. This line is not present in the current provided download so you will need to add it yourself.

Update 2: mpv build. Same as last update but with updated binary/ytdl from shinchiro and no-osc fix.