View Single Post
Old 15th April 2021, 01:15   #1  |  Link
FranceBB
Broadcast Encoder
 
FranceBB's Avatar
 
Join Date: Nov 2013
Location: Royal Borough of Kensington & Chelsea, UK
Posts: 2,904
NV12 and yuv420p10 in MPV hwdec

Hi there,
I'm the not-so-proud owner of a crappy GPU which doesn't have H.265 4:2:0 10bit support but does however have H.265 4:2:0 8bit support, in fact I was able to play H.265 yv12 60p videos just fine without dropping a single frame.
Now, the thing is that not being able to decode 10bit files annoys me A LOT 'cause each and every UHD-BD is indeed in 10bit, which makes both my GPU (NVIDIA GTX 950M and Intel HD Graphics 530) useless...
I've been digging a bit into what MPV does and it seems that it converts the video to NV12 which is pretty much like yv12, so 8bit and then feeds it to the GPU for decoding, in fact whenever I click "I" on the player it says that the pixel_format is indeed NV12. So... I'm wondering why my decoding is wrong. I mean, if I FORCE GPU decoding of 10bit H.265 contents, what I see on my screen is awful and full of artifacts 'cause the GPU is clearly trying to decode a 10bit video as if it was 8bit, hence producing glitches and any kind of issue.

Here is a simple screenshot:

Broken Hardware Acceleration ON (VAAPI)

Software Decoding (everything is fine)


What makes me wonder, though, is: if MPV is actually converting everything to NV12 as it's the only available color space for the GPU and NV12 is 8bit only, shouldn't I be able to see it correctly? Is there something I'm missing? At which stage is it converted to NV12? After getting it from the GPU? What I think it's happening here is that the GPU decodes the yuv420p10 and delivers a bad NV12. Is my hypothesis correct? Is there anything I can do to make software decoding less resource intensive?

This is my mpv.conf file:

Code:
#
#
# Warning:
#
# The commented example options usually do _not_ set the default values. Call
# mpv with --list-options to see the default values for most options. There is
# no builtin or example mpv.conf with all the defaults.
#
#
# Configuration files are read system-wide from /etc/mpv/mpv.conf
# and per-user from ~/.config/mpv/mpv.conf, where per-user settings override
# system-wide settings, all of which are overridden by the command line.
#
# Configuration file settings and the command line options use the same
# underlying mechanisms. Most options can be put into the configuration file
# by dropping the preceding '--'. See the man page for a complete list of
# options.
#
# Lines starting with '#' are comments and are ignored.
#
# See the CONFIGURATION FILES section in the man page
# for a detailed description of the syntax.
#
# Profiles should be placed at the bottom of the configuration file to ensure
# that settings wanted as defaults are not restricted to specific profiles.

##################
# video settings #
##################

# Start in fullscreen mode by default.
#fs=yes

# force starting with centered window
#geometry=50%:50%

# don't allow a new window to have a size larger than 90% of the screen size
#autofit-larger=90%x90%

# Do not close the window on exit.
#keep-open=yes

# Do not wait with showing the video window until it has loaded. (This will
# resize the window once video is loaded. Also always shows a window with
# audio.)
#force-window=immediate

# Disable the On Screen Controller (OSC).
#osc=no

# Keep the player window on top of all other windows.
#ontop=yes

# Specify high quality video rendering preset (for --vo=gpu only)
# Can cause performance problems with some drivers and GPUs.
#profile=gpu-hq

# Force video to lock on the display's refresh rate, and change video and audio
# speed to some degree to ensure synchronous playback - can cause problems
# with some drivers and desktop environments.
#video-sync=display-resample

# Enable hardware decoding if available. Often, this does not work with all
# video outputs, but should work well with default settings on most systems.
# If performance or energy usage is an issue, forcing the vdpau or vaapi VOs
# may or may not help.

#Here we enable hardware decoding for everything
hwdec=auto
hwdec-codecs=all

#This breaks 10bit H.265 on my Intel i7 6700HQ CPU (Intel® HD Graphics 530 GPU) :(
vd-lavc-check-hw-profile=no

#Here we fallback to software if there's no hardware decoding
vd-lavc-software-fallback=yes

#Here we set the Linear Interpolation + Blending
#interpolation
#interpolation-threshold=-1
#tscale=bicubic

#Here we set the video sync (useful with GNOME)
video-sync=display-resample-desync

#Here we set the Display Server to avoid dropping frames when hwdec is disabled (Linux Only)
gpu-context=x11vk

#Dithering down to 8bit with Fruit (no floyd steinberg 'cause too much power)
#dither-depth=8



##################
# audio settings #
##################

# Specify default audio device. You can list devices with: --audio-device=help
# The option takes the device string (the stuff between the '...').

#Here we use ALSA instead of pulse (Linux Fedora, please change if on Windows)
audio-device=alsa/default
ao=alsa


# Do not filter audio to keep pitch when changing playback speed.
#audio-pitch-correction=no

# Output 5.1 audio natively, and upmix/downmix audio with a different format.
#audio-channels=5.1
# Disable any automatic remix, _if_ the audio output accepts the audio format.
# of the currently played file. See caveats mentioned in the manpage.
# (The default is "auto-safe", see manpage.)
#audio-channels=auto

##################
# other settings #
##################

# Pretend to be a web browser. Might fix playback with some streaming sites,
# but also will break with shoutcast streams.
#user-agent="Mozilla/5.0"

# cache settings
#
# Use a large seekable RAM cache even for local input.
#cache=yes
#
# Use extra large RAM cache (needs cache=yes to make it useful).
#demuxer-max-bytes=500M
#demuxer-max-back-bytes=100M
#
# Disable the behavior that the player will pause if the cache goes below a
# certain fill size.
#cache-pause=no
#
# Store cache payload on the hard disk instead of in RAM. (This may negatively
# impact performance unless used for slow input such as network.)
#cache-dir=~/.cache/
#cache-on-disk=yes

# Display English subtitles if available.
#slang=en

# Play Finnish audio if available, fall back to English otherwise.
#alang=fi,en

# Change subtitle encoding. For Arabic subtitles use 'cp1256'.
# If the file seems to be valid UTF-8, prefer UTF-8.
# (You can add '+' in front of the codepage to force it.)
#sub-codepage=cp1256

# You can also include other configuration files.
#include=/path/to/the/file/you/want/to/include

############
# Profiles #
############

# The options declared as part of profiles override global default settings,
# but only take effect when the profile is active.

# The following profile can be enabled on the command line with: --profile=eye-cancer

#[eye-cancer]
#sharpen=5
FranceBB is offline   Reply With Quote