[MPlayer-dev-eng] VAAPI/X11 video output driver
Roberto Togni
rxt at rtogni.it
Wed Nov 25 00:04:19 CET 2015
On Sun, 22 Nov 2015 17:04:17 +0000
Mark Thompson <sw at jkqxz.net> wrote:
>
> Hi,
>
> See patch attached: apply to current trunk mplayer, configure, make
> mplayer, run with -vo vaapi on anything using recent Intel graphics (or
> something else with VAAPI, maybe).
>
> This is very much in a "works for me" state. If it's useful to anyone
> else then they can use it as-is, and if it or some derivative is
> sensible to integrate into mplayer then that would be nice. There are
> probably lots of edge cases I haven't considered which crash it. It's
> also quite possible that I have broken other things with these changes
> (especially VDPAU and XvMC in the libavcodec driver).
>
>
> Features:
> * Plays H.264, H.265, WMV3, VC1 and MPEG2 streams on Intel Quick Sync.
> * Fully accelerated, with no extra redundant memcpy of image data
> (looking at you, VLC).
> * No ffmpeg changes required - uses the hwaccel interface.
> * Interface controls all work normally (keyboard input, resize,
> fullscreen).
>
>
> Deficiencies:
> * It can only output to an X11 window (maybe it should be called
> vaapi_x11). OpenGL output probably wouldn't be hard to add to the
> existing code; alternatively there could separately be a filter which
> comes after a decoder to convert frames to a format usable in other places.
> * Tearing is visible. There is probably some nice X11 way to fix this
> by drawing to multiple drawables and swapping.
> * Choosing video formats can do strange things. If you try to play an
> MPEG4 stream on Intel (not supported by Quick Sync), it gets stuck.
> * It can't play in non-accelerated mode (software-decoded planes).
> This could straightforwardly be rectified (just memcpy data into a
> surface), but it doesn't have any obvious value because other outputs
> already do this properly.
> * No OSD support. Unclear how to do it nicely (map the surface and
> draw directly on it; do something clever with transparency?).
> * No deinterlacing or other filter features.
> * Cleanup on errors is incomplete (will leak memory and possibly do
> other nasty things).
>
>
> Tested configurations (on Debian Stretch, libva 0.38):
> * 7th generation Intel graphics (Haswell 4500U): H.264, WMV3, VC1.
> * 8th generation Intel graphics (Braswell N3700): as 7th, plus H.265
> (using the GPU hybrid decode, which works completely transparently).
>
> I have no reason to believe that 9th generation (Skylake) will not work;
> similarly older versions (with correspondingly less capability). I
> don't know about other (non-Quick Sync) VAAPI drivers.
>
> I tried resolutions up to 4K. The Haswell was perfectly happy playing
> eight simultaneous 30Mbps 4K25 H.264 streams with downscale to 720p,
> needing about 20% CPU to do it.
>
> VP8 and VP9 (present in 8th and 9th generation Intel graphics
> respectively) are not supported because they are not yet implemented in
> ffmpeg. If they were and matched the existing drivers, I imagine they
> would just work after updating a few lists.
>
>
> Some questions:
> * How is the video format choice meant to work? I feel like I am
> rejecting everything offered which isn't VAAPI hwaccel from libavcodec,
> but nasty things still happen if you try to play an unsupported stream
> (it doesn't give up).
> * How is information meant be passed back from libavcodec to the vo
> driver? This patch makes a nasty global to release frames allocated by
> the output once they are finished with (no longer needed for
> referencing). Also it would be nice to know the number of reference
> frames the stream requires so that we don't waste so much memory.
> * Same question in the other direction. There is another nasty global
> for passing the hwaccel context into libavcodec.
> * What libvo controls (VOCTRL_*) and related support are regarded as
> required for a new VO driver?
>
Thanks for the patch, I will look into it in the next days.
I posted a patch some time ago, that ports the VAAPI support from the
mplayer-vaapi fork. It supports OSD, GL, filters, and some other
things. If you want to look at it you can find it here
http://lists.mplayerhq.hu/pipermail/mplayer-dev-eng/2015-October/073163.html
It also uses globals to pass the hwaccel context, but only because I
was lazy; the original code used a VOCTRL for it.
It's tested only on vaapi 0.36 (version in debian stable) on a
sandybridge; I don't have any newer processor.
Ciao,
Roberto
More information about the MPlayer-dev-eng
mailing list