Intel VAAPI howto with Krypton v17 based on Ubuntu 16.04 server

  Thread Rating:
  • 13 Vote(s) - 5 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Post Reply
fritsch Offline
Team-Kodi Developer
Posts: 14,728
Joined: Aug 2011
Reputation: 441
Location: Karlsruhe
Post: #1
Introduction
This is a new era for VAAPI. We worked together with the intel mesa people in order to get rid of the vaPutSurface method, that was the only way, besides some cpu intensive copying, to get the decoded surfaces via a texture from pixmap method to display. This always needed twice the amount of surfaces, as all the decoded surfaces needed to be copied and transfered to a texture again. Besides the additional gpu memory, this copy used too much performance and therefore high quality content like 3840x2160 with 60 frames (60p) were not really watchable even on highly performant hardware.

Besides the performance issue, this putSurface method always scaled the limited color range of the original files to FULL RGB. Introducing Banding or even worse it was scaled twice, e.g. back to limited, by the driver itself. All this won't happen anymore, cause the new zero copy approach allows us to directly render the decoded NV12 surface with our own shader. So all color conversions are in our hands now. You can savely use "Prefer VAAPI Render Method" set to on again and don't need to waste CPU cycles with bypassing this Method. All colors will be fine. If you have a Limited Range TV - you need to set "Use Limited Range" to On additionally. Also make sure that your GPU itself is running at full range, which this howto and also all OpenELEC images will do by default.

Furthermore we got implemented a feature called dithering, which will add random noise to the color scaled image when it is output on a FULL RGB monitor / lcd. So even perfect full range without any banding is now possible for VAAPI decoded material.

This thread is for guiding and testing this new approach, mainly implemented by - whom else - fernetmenta. The dithering algorithm realization in the shader was done by laurim. Wsnipex has done the packaging for the Ubuntu ppa for ease of use.

While we are trying to get this code tested and merged into kodi v17 - the daily builds and updates might get rough from time to time, whenever big changes appear in kodi. This code won't go into kodi v15 as development started right now. Also v16 does not have this code.

To use hevc-vaapi a Braswell or newer architecture is needed. Haswell and Broadwell and older arches will use the CPU for decoding.

So in short: Whatever is possible on linux nowadays on Intel hardware we have here in this build.

This thread is a follow up of: http://forum.kodi.tv/showthread.php?tid=165707

[Image: bild2.png]
Playing 3840x2160 60p with lanczos3 (down)scaling on a 1080p display at 60hz.

Installation
-1.) Hardware Requirements / Software Requirements
SNB, IVB, HSW, BSW, BDW Intel Hardware
This installation is based upon the server iso for Ubuntu 16.04 64 bit: http://cdimage.ubuntu.com/ubuntu-server/...-amd64.iso (Until 16.04 is released, this links to the daily server iso images).

0.) Basic Installation and script tuning
First install the server iso as you would normally do, don't select any additional packages besides perhaps ssh. Also make sure to not use "encrypted home directory" cause this render the simple systemd service unusable. After installation continue with the following steps:
Code:
sudo apt-get update
sudo apt-get install ssh python-software-properties software-properties-common xorg xserver-xorg-legacy alsa-utils mesa-utils git-core librtmp1 lirc libmad0 lm-sensors libmpeg2-4 avahi-daemon libnfs8 libva1 vainfo i965-va-driver linux-firmware dbus-x11 udisks2 openbox pastebinit
sudo apt-get dist-upgrade

Allow "everyone" to start the Xserver
Code:
sudo dpkg-reconfigure xserver-xorg-legacy

Now edit /etc/X11/Xwrapper.config and add the following into a new line at the end of the file:
Code:
needs_root_rights=yes

Create the kodi user and it add it the relevant groups. If you have created the kodi user during installation only do the usermod part.
Code:
sudo adduser kodi
sudo usermod -a -G cdrom,audio,video,plugdev,users,dialout,dip,input kodi

Now we give the permission to shutdown, suspend the computer, therefore create the file /etc/polkit-1/localauthority/50-local.d/custom-actions.pkla with the following content (don't introduce line breaks, especially the Action= line must be exactly one line (especially no linebreaks or auto ".." in freedesktop.login1.*), verify this):
Code:
[Actions for kodi user]
Identity=unix-user:kodi
Action=org.freedesktop.login1.*;org.freedesktop.udisks.*
ResultAny=yes
ResultInactive=yes
ResultActive=yes

[Untrusted Upgrade]
Identity=unix-user:kodi
Action=org.debian.apt.upgrade-packages;org.debian.apt.update-cache
ResultAny=yes
ResultInactive=yes
ResultActive=yes

We need a simple systemd service file (this one actively waits on network connection, see: network-online.target remove that if you don't need to wait)
Create the following file and put the listing into it: /etc/systemd/system/kodi.service
Code:
[Unit]
Description = kodi-standalone using xinit
After = systemd-user-sessions.service network.target sound.target network-online.target

[Service]
User = kodi
Group = kodi
Type = simple
PAMName=login
ExecStart = /usr/bin/xinit /usr/bin/dbus-launch --exit-with-session /usr/bin/openbox-session -- :0 -nolisten tcp vt7
Restart = on-abort

[Install]
WantedBy = multi-user.target

edit /etc/security/limits.conf and add before the end. remember kodi is the username, not the application. This will allow your user to get the audio thread a bit more priority.
Code:
kodi             -       nice            -1

Fake display-manager.service to not make plymouth or something else complain.
Code:
sudo ln -s /etc/systemd/system/kodi.service /etc/systemd/system/display-manager.service

1.) Now we install xbmc-nightly Krypton v17 version or alternatively fernetmenta's special ppa, if you want that for testing early fixes which will go into the nightly some days later. Remember, that you have to add the nightly ppa in both cases for installing pvr addons:
Code:
# if you don't want to help testing fernet's changes before they appear in kodi upstream
# ommit the following command and only add the nightly ppa
sudo apt-add-repository ppa:wsnipex/xbmc-fernetmenta-master

# the next one is needed for pvr addons and has to be added always
sudo apt-add-repository ppa:team-xbmc/xbmc-nightly

sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install kodi kodi-bin

As we use openbox as our display manager, we need to auto start kodi, therefore create:
Code:
sudo mkdir -p /home/kodi/.config/openbox
sudo touch /home/kodi/.config/openbox/autostart
sudo chown kodi:kodi /home/kodi/.config -R

now we write the following into the created /home/kodi/.config/openbox/autostart file, this will automatically switch your TV to full range (please copy the lines, don't try to type the '` and so on, this code only works for one (1) connected TV, if you have multiple devices extend it to a loop):
Code:
OUTPUT=`xrandr -display :0 -q | sed '/ connected/!d;s/ .*//;q'`
xrandr -display :0 --output $OUTPUT --set "Broadcast RGB" "Full"
/usr/bin/kodi --standalone
openbox --exit

Now, we can start kodi:
Code:
sudo systemctl start kodi

The usual kodi configuration is done as follows:

2.) KODI settings
System ->Video->Acceleration:
Enable HQ Scalers for scaling above: 20%
Allow hardware acceleration (VDPAU): off
Allow hardware acceleration (VAAPI): On
Use Mpeg-2 VAAPI: Yes
Use Mpeg-4 VAAPI: if you like
UseVC-1 VAAPI: on
Prefer VAAPI Render Method: on <- This version has the banding fixed, so enable that setting to save CPU cycles with 100% quality.
Adjust Refreshrate to match video: On

System -> Video -> Playback
Sync Playback to Display: On if you don't use passthrough and Off if passthrough enabled (* This makes no sense when you want to use passthrough, why? Read: http://forum.kodi.tv/showthread.php?tid=...d2107461). In current versions (Jarvis) passthrough is disabled by us if users wants to Sync Playback to Display to care for people that refuse to read.
Adjust display refresh rate to match video: On Start / Stop

While watching a SD(!) video, that is accelerated by VAAPI, e.g. mpeg-2 or h264, click the film role and choose: Deinterlace: Auto (Never set this to ON it will harm for everything that is not interlaced) Deinterlacing-Method: VAAPI-MCDI or VAAPI-MADI (Sandybridge) and VAAPI-BOB (BYT), Scaling Method: Lanczos3 Optimized and choose save for all files. Remember to do this only in combination with the above "scaling above" for 20%. This Lanczos3 Optimized filter is too heavy for BYTs, here you might - depending on the file - choose Bilinear.

It is obviously clear, that you won't see the VAAPI-MCDI settings when you play a video that is software accelerated only.

You might need to create and advancedsettings.xml file as follows if you have special needs:
Code:
<advancedsettings>
   <loglevel hide="false">0</loglevel>
  <cputempcommand>sensors|sed -ne "s/Core 0: \+[-+]\([0-9]\+\).*/\1 C/p"</cputempcommand>
  <gui>    
    <algorithmdirtyregions>3</algorithmdirtyregions>
    <nofliptimeout>0</nofliptimeout>
  </gui>    
<video>
  <latency>
    <delay>50</delay>
    <refresh>
      <min>23</min>
      <max>24</max>
      <delay>175</delay> <!-- set to zero or adjust if audio seems out of sync with 24p movies -->
     </refresh>
  </latency>
</video>
</advancedsettings>

3. Color Management
If your TV is limited range. Go to System -> Video Output and choose "Use Limited Range", disable Dithering.
If your TV is full range. Go to System -> Video Output and unselect "Use Limited Range" and enable Dithering with 8 bits.
If your projector is of low quality, use a dithering setting of 6 or 7 bits.

Remember the above settings only make sense, when you output in Full Range (or in the special Video Range 16:235, that I provide in my custom kernels). With the default xrandr setting of Limited 16:235 - those settings are totally counter productive.

4.) Reporting issues

It is mandatory to always provide a full Debug Log that shows the issue. You can restart kodi before hand, reproduce and then post the logfile, by using pastebinit (sudo apt-get install pastebinit) - the following commands need to be run as the user running kodi (kodi if you followed the howto):
Code:
dpkg -l |grep mesa | pastebinit
DISPLAY=:0 vainfo | pastebinit
cat ~/.kodi/temp/kodi.log | pastebinit
dmesg | pastebinit
id | pastebinit
amixer | pastebinit

Issue reports without those logfiles are ignored.

"Your most vocal users are not reflective of your userbase" J.M.
"Of course, they [XP Users and people with outdated hardware] need to tell the world about the kind of hero they are, and block innovation for everyone else because their decades old OS / hardware needs to work =p" nevcairiel (ffmpeg)
No Debug Log no issue.
(This post was last modified: 2016-05-06 16:27 by fritsch.)
find quote
fritsch Offline
Team-Kodi Developer
Posts: 14,728
Joined: Aug 2011
Reputation: 441
Location: Karlsruhe
Post: #2
Want to boot with AVR / TV powered off?
Have a look here: http://forum.kodi.tv/showthread.php?tid=...pid2148505 for Ubuntu and here: http://wiki.openelec.tv/index.php/Config...#tab=Intel for OpenELEC. This is considered an advanced task.

Upgrading from 15.10
Code:
sudo do-release-upgrade -d

after it is run through succesfully readd the ppas and now the crucial part:

Install the legacy xserver package and configure it to allow anybody to start the xserver

Code:
sudo apt-get install xserver-xorg-legacy
sudo dpkg-reconfigure xserver-xorg-legacy

Now edit: /etc/X11/Xwrapper.config
and append the line:
Code:
needs_root_rights=yes

After you updated / readded or enable the ppas (Only the kodi ppas are needed, vaapi not as 16.04 ships 1.7.0 already):
Code:
sudo apt-get update
sudo apt-get dist-upgrade

I want to use fritsch's home build kernel with the Video 16:235 mode and I understand what it does
Download the latest kernel / headers from here: http://fritsch.fruehberger.net/kernel/ and install these with sudo dpkg -i. Afterwards alter the autostart such that it ooks like (see the two xrandr commands, switching to full and then switching to fritsch's Video Range, which is not available on non patched kernels):
Code:
OUTPUT=`xrandr -display :0 -q | sed '/ connected/!d;s/ .*//;q'`
xrandr -display :0 --output $OUTPUT --set "Broadcast RGB" "Full"
xrandr -display :0 --output $OUTPUT --set "Broadcast RGB" "Video 16:235 pass-through"
/usr/bin/kodi --standalone
openbox --exit
Sources
FernetMenta's master: https://github.com/FernetMenta/xbmc/commits/master (ppa)

Known Issues
None known.

"Your most vocal users are not reflective of your userbase" J.M.
"Of course, they [XP Users and people with outdated hardware] need to tell the world about the kind of hero they are, and block innovation for everyone else because their decades old OS / hardware needs to work =p" nevcairiel (ffmpeg)
No Debug Log no issue.
(This post was last modified: 2016-04-16 16:44 by fritsch.)
find quote
john321 Offline
Junior Member
Posts: 12
Joined: Jul 2015
Reputation: 1
Post: #3
Wow, that was a quick :-). A new thread before I could even reply to the last one !

Yes very clear. !! Only Q. still in my mind is that on a j1900 VAAPI-MCDI is available and seems to work. Is it deprecated due to artifacts/skips rather than unsuported ?
(This post was last modified: 2015-07-12 21:53 by john321.)
find quote
Ney Offline
Junior Member
Posts: 39
Joined: Oct 2014
Reputation: 1
Post: #4
I am running Openelec testbuild on a Zbox CI-320 (baytrail).

full RGB output works wonders and colors are fantastic.
MAADI works great for 1080i50 content.

Lancoz 3, however seems to be too much (maybe someone with baytrails with dual-chan memory might have better luck), on anything but 720p25 content

4k30 decodes fine with billinear downscaling to 1080p, 4k60 has very few skips when the overlay is on, seems not to happen when the overlay is off, and the testsample at least is very watchable, but this seems to be the limit of the small baytrail.

@fritch, maybe add the autostart.sh fix for full RGB output for openelec to the second post?
find quote
fritsch Offline
Team-Kodi Developer
Posts: 14,728
Joined: Aug 2011
Reputation: 441
Location: Karlsruhe
Post: #5
(2015-07-12 21:45)john321 Wrote:  Wow, that was a quick :-). A new thread before I could even reply to the last one !

Yes very clear. !! Only Q. still in my mind is that on a j1900 VAAPI-MCDI is available and seems to work. Is it deprecated due to artifacts/skips rather than unsuported ?

It should work as it got fixed after the old howto, but it's obviously only useful for interlaced content. Gwenole, the intel dev, that has designed all those algorithms doubt that BYT would be fast enough for MCDI - therefore I suggest MADI on those platforms. Deinterlacing only makes sense for Interlaced content - so never set this to "On" but always use Auto.

Btw: As you see in Ney's reply: the scaling algorithm is very crucial on BYTs, so whenever something stutters, check Scaling Method first. You might need to set it to "Bilinear".

"Your most vocal users are not reflective of your userbase" J.M.
"Of course, they [XP Users and people with outdated hardware] need to tell the world about the kind of hero they are, and block innovation for everyone else because their decades old OS / hardware needs to work =p" nevcairiel (ffmpeg)
No Debug Log no issue.
(This post was last modified: 2015-07-12 23:06 by fritsch.)
find quote
fritsch Offline
Team-Kodi Developer
Posts: 14,728
Joined: Aug 2011
Reputation: 441
Location: Karlsruhe
Post: #6
(2015-07-12 21:49)Ney Wrote:  @fritsch, maybe add the autostart.sh fix for full RGB output for openelec to the second post?

Will add a note. Thanks for feedback.

"Your most vocal users are not reflective of your userbase" J.M.
"Of course, they [XP Users and people with outdated hardware] need to tell the world about the kind of hero they are, and block innovation for everyone else because their decades old OS / hardware needs to work =p" nevcairiel (ffmpeg)
No Debug Log no issue.
find quote
wsnipex Offline
Team-Kodi
Posts: 5,763
Joined: Jun 2011
Reputation: 136
Post: #7
DISPLAY=:0 xrandr --output HDMI1 --set "Broadcast RGB" "Full"
>> /usr/local/bin/kodi --standalone

should be /usr/bin/kodi --standalone

its also not needed to use sudo for the openbox stuff.
(This post was last modified: 2015-07-13 08:55 by wsnipex.)
find quote
fritsch Offline
Team-Kodi Developer
Posts: 14,728
Joined: Aug 2011
Reputation: 441
Location: Karlsruhe
Post: #8
The sudo was intended, when the installation user was not the kodi users - so that we get the permissions correct in any case. Will fix the first one.

"Your most vocal users are not reflective of your userbase" J.M.
"Of course, they [XP Users and people with outdated hardware] need to tell the world about the kind of hero they are, and block innovation for everyone else because their decades old OS / hardware needs to work =p" nevcairiel (ffmpeg)
No Debug Log no issue.
find quote
DaVu Offline
Posting Freak
Posts: 2,391
Joined: Jan 2011
Reputation: 38
Location: Germany
Post: #9
Great work...use it since yesterday and it looks very nice.

I'll follow this thread and will test as much as I can to give usefull feedback Wink

Cheers
find quote
masinad Offline
Member
Posts: 65
Joined: Sep 2013
Reputation: 2
Post: #10
Does in work also in latest kodibuntu?
find quote
fritsch Offline
Team-Kodi Developer
Posts: 14,728
Joined: Aug 2011
Reputation: 441
Location: Karlsruhe
Post: #11
Upgrading from a 14.04 LTS is not supported within this thread. It might work, though - but you are on your own.

"Your most vocal users are not reflective of your userbase" J.M.
"Of course, they [XP Users and people with outdated hardware] need to tell the world about the kind of hero they are, and block innovation for everyone else because their decades old OS / hardware needs to work =p" nevcairiel (ffmpeg)
No Debug Log no issue.
find quote
neox387 Offline
Junior Member
Posts: 26
Joined: Jun 2015
Reputation: 1
Post: #12
is it normal that w fps: jumps from & back to 23.41-24.39 and not at stable 23.976 ?
Adjust display refresh rate to match video: On Start / Stop is on.
tv reports 24p. Intel haswell nuc

allso confused about 0.175 audio delay this is normal i guess for 24p ?
(This post was last modified: 2015-07-13 18:52 by neox387.)
find quote
fritsch Offline
Team-Kodi Developer
Posts: 14,728
Joined: Aug 2011
Reputation: 441
Location: Karlsruhe
Post: #13
fps will be gone in the next rebuild :-) cause of exactly your question. This fps value never was anywhere accurate it is my shoesize + some nails + x. Therefore it will be removed in kodi v15 completely. Smoothness you can see at the skip / drop values.

The 175ms delay we measured some years ago while asking several 100 people about the delay AVRs add when processing 24p content, therefore we add this by default via advancedsettings.xml

"Your most vocal users are not reflective of your userbase" J.M.
"Of course, they [XP Users and people with outdated hardware] need to tell the world about the kind of hero they are, and block innovation for everyone else because their decades old OS / hardware needs to work =p" nevcairiel (ffmpeg)
No Debug Log no issue.
(This post was last modified: 2015-07-13 18:57 by fritsch.)
find quote
neox387 Offline
Junior Member
Posts: 26
Joined: Jun 2015
Reputation: 1
Post: #14
Ok, thanks for the quick reply Big Grin
find quote
rob77 Offline
Member
Posts: 78
Joined: Dec 2014
Reputation: 0
Post: #15
I have updated to your latest openelec build fritsch and it works perfect. Thanks so much for your hard work!

In a movie when I bring up the menu and audio settings mine says Audio Offset 0.000s and I haven't changed it. Is it meant to say 0.175s? By the way I have no sync issues with my Denon Amp.

Cheers
find quote
Post Reply