[vlc-devel] [PATCH] linux: kernel mode setting (KMS) vout plugin
juhapekka.heikkila at gmail.com
Tue May 15 14:09:59 CEST 2018
I made vout plugin for Linux which uses kernel mode setting API. This plugin
mostly recreates what FB plugin does with following highlights:
* FB could only do RGB but with KMS plugin one get access to all kernel
enabled video modes. I have successfully ran through all packed and planar
YUV modes I found from my HW -- as well as all RGB modes.
* No tearing (I hope) I used two hw buffers and kernel plane handling
takes care of the flipping for me. Only way I see tearing could happen is
if VLC is decoding video frames faster than hardware video refresh rate.
* libFB to my knowledge is in maintenance mode, no more new features.
* My plugin can be run over ssh.
Then the other things:
* I am employee of Intel Corporation thus I have to have special disclaimer
on top of my plugin. I developed this plugin as part of my work when
playing with KMS, this can be used to test video modes where it doesn't
need to be totally boring all the time :)
* I have had access only to Intel hardware but I'm wishful my plugin works
equally on other manufacturer's hardware. I tried to use only simple
features to be able to maintain functionality on other platforms too.
* VLC and libdrm has some FourCC codes which are equal on both worlds but
then there are others which have different names while seemingly same
functionality. By default my plugin asks for XR24 type framebuffer from
DRM and at the same time tells VLC it is RV32. Then again things like YUYV
or NV12 are the same in both worlds. If VLC is run in verbose mode one
can see my plugin listing all modes which KMS advertises. I didn't go
write match making table for these.
a bit of howto:
I ran configure with this line where $BUILDOPT is just directory for all my
PKG_CONFIG_PATH=$BUILDOPT/lib/pkgconfig CFLAGS="$CFLAGS -L$BUILDOPT/lib -g -O0 -fPIC" CXXFLAGS="$CXXFLAGS -L$BUILDOPT/lib -g -O0 -fPIC" ./configure --prefix=$BUILDOPT --disable-lua --disable-a52 --disable-alsa --disable-chromecast --without-x --disable-xcb --disable-vdpau --disable-skins2 --disable-xvideo --disable-dbus --enable-run-as-root --disable-screen --disable-freetype
The box where this is run cannot have DRM master running, this mean no X
server or similar running. If there is already DRM master present there will
be error reported.
I run this over ssh like this:
DISPLAY=localhost sudo vlc rc -I "dummy" --verbose=2 --no-audio -V kms,none video.mp4
To try out other framebuffer formats:
DISPLAY=localhost sudo vlc rc -I "dummy" --verbose=2 --no-audio -V kms,none --kms-drm-chroma=YUYV --kms-vlc-chroma=YUYV video.mp4
kms-drm-chroma is those modes my plugin lists and find matching
kms-vlc-chroma from vlc_fourcc.h under title 'Chromas'
Juha-Pekka Heikkila (1):
linux: kernel mode setting (KMS) vout plugin
configure.ac | 5 +
modules/video_output/Makefile.am | 10 +
modules/video_output/kms.c | 794 +++++++++++++++++++++++++++++++++++++++
3 files changed, 809 insertions(+)
create mode 100644 modules/video_output/kms.c
More information about the vlc-devel