[FFmpeg-devel] [PATCH v2 0/3] hwcontext_vaapi: dlopen libva-x11 and libva-drm

Emil Velikov emil.l.velikov at gmail.com
Wed Jul 27 22:51:23 EEST 2022


On Thu, 21 Jul 2022 at 21:47, Mark Thompson <sw at jkqxz.net> wrote:
>
> On 20/07/2022 17:41, Emil Velikov wrote:
> > On Tue, 19 Jul 2022 at 19:16, Nicolas George <george at nsup.org> wrote:
> >>
> >> Emil Velikov (12022-07-19):
> >>> As you may know the libva* set of libraries share an internal ABI
> >>> between them. In a resent libva commit, the va_fool API was removed.
> >>>
> >>> Thus if one is to mix different versions of libva.so and libva-x11.so
> >>> they will get an error, leading to a crash of the whole stack.
> >>>
> >>> The simple solution is
> >>
> >> ... a configure check.
> >>
> >> If the person who installs replaces a library with another, it is their
> >> responsibility to check they are compatible.
> >>
> >
> > While I wholeheartedly agree, it's not so easy to enforce compile time
> > decisions at runtime. In the past, I have debugged and reported issues
> > where Linux distributions do not enforce the above.
> >
> > We do have the typical Linux distribution model (where we have dozens
> > upon distros) and other distribution models. IMHO checking each
> > instance and combination doesn't scale. We could bring awareness to
> > the issue in say distribution/workflow X, which sadly may come as
> > finger-pointing and thus alienating.
> >
> > Hope that makes sense and the team is willing to consider the extra 90
> > lines worth of code.
>
> The argument "libfoo can be broken in some particular configuration, so lets use dlopen() to make errors happen later" seems like it applies to every library.  Why is this case so special?  Who are the users running into this specific problem and who are stuck with broken versions they can't update?
>
It's a long story, hope I don't bore you to death :-P

Even though I've been itching to hack on ffmpeg for a while, the bug
that allowed me to do that is
https://github.com/ValveSoftware/steam-for-linux/issues/8673

As a background, steam as well as some of the programs/games shipped
use libraries provided by ffmpeg. In addition, steam ships with a
steam runtime, which is effectively a partial chroot of an old Ubuntu.
For various compatibility reasons, one cannot simply update it, so the
startup scripting will try and promote a set of the host libraries (if
newer) so that they're used instead of the bundled Ubuntu ones.

What happens in the libva case is that distributions can provide only
libva.so and omit libva-x11.so. Which due to the internal ABI break
(removal of the va_fool API), means that steam and likely some games
will simply crash out.

Now let me try and draw an analogy to another set of libraries which
also share internal ABI - libdrm.so, libdrm_nouveau.so,
libdrm_amdgpu.so libdrm_intel.so, etc. To the best of my knowledge
there was no breakage in there be that internal or public ABI.

In addition, while distribution may allow you to install only some
(say libdrm.so without libdrm_intel.so), a pair of those is pulled by
the respective GL and Vulkan drivers. For example: the amdgpu GL
driver (amdgpu_dri.so) and radv Vulkand driver (libvulkan_radeon.so)
depend on libdrm_amdgpu.so and libdrm.so. Hence, in practical terms
users cannot hit a similar issue... unless they very very deliberately
try to do so.

So while one solution is to go around telling users and distributions
that they're "doing it wrong", IMHO a more pragmatic solution is to
include this brief workaround in ffmpeg. At least in the short to mid
term.
As mentioned in the cover letter (sorry again for sending the series
multiple times), I have some plans for a proper long term, which would
reside in libva. Alas as you have experienced yourself, the libva
maintainers can be rather busy, so we're looking at least a couple of
months until a new libva release is out and further X months, until it
ripples down to end-users.

> (Also, shouldn't lazy binding save people in this situation if they don't actually use the feature, as they presumably don't if barfing at runtime makes sense?)
>
I suspect you meant using RTLD_LAZY - I believe it should work. Will
test and re-spin for the next revision.

Hope the above makes sense. I tried to stay brief and on-point, but if
anyone likes further details I will be happy to provide.

Thanks
Emil


More information about the ffmpeg-devel mailing list