Official mirror of libplacebo
libplacebo is, in a nutshell, the core rendering algorithms and ideas of
mpv rewritten as an independent library. As of today,
libplacebo contains a large assortment of video processing shaders, focusing
on both quality and performance. These include features such as the following:
Every attempt was made to provide these features at a high level of
abstraction, taking away all the messy details of GPU programming, color
spaces, obscure subsampling modes, image metadata manipulation, and so on.
Expert-level functionality is packed into easy-to-use functions like
pl_frame_from_avframe
and pl_render_image
.
libplacebo currently supports Vulkan (including MoltenVK), OpenGL, and
Direct3D 11. It currently has the following minimum hardware requirements:
For more documentation, including an introduction to the API, see the project
website.
This screenshot from the included plplay demo program
highlights just some of the features supported by the libplacebo rendering
code, all of which are adjustable dynamically during video playback.
This project grew out of an interest to accomplish the following goals:
libmpv
.It has since been adopted by VLC as their
optional Vulkan-based video output path, and is provided as a Vulkan-based
video filter in the FFmpeg project.
The public API of libplacebo is currently split up into the following
components, the header files (and documentation) for which are available
inside the src/include/libplacebo
directory. The
API is available in different “tiers”, representing levels of abstraction
inside libplacebo. The APIs in higher tiers depend on those in lower tiers.
Which tier is used by a user depends on how much power/control they want over
the actual rendering. The low-level tiers are more suitable for big projects
that need strong control over the entire rendering pipeline; whereas the
high-level tiers are more suitable for smaller or simpler projects that want
libplacebo to take care of everything.
cache.h
: Caching subsystem. Used to cache large or computationally heavycolorspace.h
: A collection of enums and structs for describing colorcommon.h
: A collection of miscellaneous utility types and macros that arelog.h
: Logging subsystem.config.h
: Macros defining information about the way libplacebo was built,dither.h
: Some helper functions for generating various noise and ditheringfilters.h
: A collection of reusable reconstruction filter kernels, whichtone_mapping.h
: A collection of tone mapping functions, used forgamut_mapping.h
: A collection of gamut mapping functions, used forThe API functions in this tier are either used throughout the program
(context, common etc.) or are low-level implementations of filter kernels,
color space conversion logic etc.; which are entirely independent of GLSL
and even the GPU in general.
gpu.h
: Exports the GPU abstraction API used by libplacebo internally.swapchain.h
: Exports an API for wrapping platform-specific swapchains andvulkan.h
: GPU API implementation based on Vulkan.opengl.h
: GPU API implementation based on OpenGL.d3d11.h
: GPU API implementation based on Direct3D 11.dummy.h
: Dummy GPI API (interfaces with CPU only, no shader support)As part of the public API, libplacebo exports a middle-level abstraction for
dealing with GPU objects and state. Basically, this is the API libplacebo uses
internally to wrap OpenGL, Vulkan, Direct3D etc. into a single unifying API
subset that abstracts away state, messy details, synchronization etc. into a
fairly high-level API suitable for libplacebo’s image processing tasks.
It’s made public both because it constitutes part of the public API of various
image processing functions, but also in the hopes that it will be useful for
other developers of GPU-accelerated image processing software.
shaders.h
: The low-level interface to shader generation. This can be usedgpu.h
, but can also be used independently from it.In addition to this low-level interface, there are several available shader
routines which libplacebo exports:
shaders/colorspace.h
: Shader routines for decoding and transformingshaders/custom.h
: Allows directly ingesting custom GLSL logic into thepl_shader
abstraction, either as bare GLSL or in mpv .hookshaders/deinterlacing.h
: GPU deinterlacing shader based on yadif.shaders/dithering.h
: Shader routine for various GPU dithering methods.shaders/film_grain.h
: Film grain synthesis shaders for AV1 and H.274.shaders/icc.h
: Shader for ICC profile based color management.shaders/lut.h
: Code for applying arbitrary 1D/3D LUTs.shaders/sampling.h
: Shader routines for various algorithms that sampledispatch.h
: A higher-level interface to the pl_shader
system, based ongpu.h
. This dispatch mechanism generates+executes complete GLSL shaders,This shader dispatch mechanism is designed to be combined with the shader
processing routines exported by shaders/*.h
, but takes care of the low-level
translation of the resulting pl_shader_res
objects into legal GLSL. It also
takes care of resource binding, shader input placement, as well as shader
caching and resource pooling; and makes sure all generated shaders have unique
identifiers (so they can be freely merged together).
options.h
: A high-level options framework which wraps all of the optionspl_render_params
into a memory-managed, serializable struct thatrenderer.h
: A high-level renderer which combines the shader primitivesutils/frame_queue.h
: A high-level frame queuing abstraction. This APIrenderer.h
, including any extrapl_frame_mix
).utils/upload.h
: A high-level helper for uploading generic data in somerenderer.h
.utils/dav1d.h
: High level helper for translating between Dav1dPicturepl_frame
. (Single header library)utils/libav.h
: High-level helpers for interoperation betweenThis is the “primary” interface to libplacebo, and the one most users will be
interested in. It takes care of internal details such as degrading to simpler
algorithms depending on the hardware’s capabilities, combining the correct
sequence of colorspace transformations and shader passes in order to get the
best overall image quality, and so forth.
libplacebo was founded and primarily developed by Niklas Haas
(@haasn), but it would not be possible without the
contributions of others, especially support for windows.
libplacebo is currently available under the terms of the LGPLv2.1 (or later)
license. However, it’s possible to release it under a more permissive license
(e.g. BSD2) if a use case emerges.
Please open an issue if you have a use case for a BSD2-licensed libplacebo.
When cloning libplacebo, make sure to provide the --recursive
flag:
$ git clone --recursive https://code.videolan.org/videolan/libplacebo
Alternatively (on an existing clone):
$ git submodule update --init
Doing either of these pulls in a handful of bundled 3rdparty dependencies.
Alternatively, they can be provided via the system.
libplacebo is built using the meson build system.
You can build the project using the following steps:
$ DIR=./build
$ meson $DIR
$ ninja -C$DIR
To rebuild the project on changes, re-run ninja -Cbuild
. If you wish to
install the build products to the configured prefix (typically /usr/local/
),
you can run ninja -Cbuild install
. Note that this is normally ill-advised
except for developers who know what they’re doing. Regular users should rely
on distro packages.
In principle, libplacebo has no mandatory dependencies - only optional ones.
However, to get a useful version of libplacebo. you most likely want to build
with support for either opengl
, vulkan
or d3d11
. libplacebo built without
these can still be used (e.g. to generate GLSL shaders such as the ones used in
VLC), but the usefulness is severely impacted since most components will be
missing, impaired or otherwise not functional.
A full list of optional dependencies each feature requires:
glslang
+ its related libraries (e.g. libSPIRV.so
)liblcms2
libdovi
glad2
(*)libshaderc
libvulkan
, python3-jinja2
(*)libxxhash
(*) This dependency is bundled automatically when doing a recursive clone.
Because the vulkan backend requires on code generation at compile time,
python3-Jinja2
is a hard dependency of the build system. In addition to this,
the path to the Vulkan registry (vk.xml
) must be locatable, ideally by
explicitly providing it via the -Dvulkan-registry=/path/to/vk.xml
option,
unless it can be found in one of the built-in hard-coded locations.
To get a list of configuration options supported by libplacebo, after running
meson $DIR
you can run meson configure $DIR
, e.g.:
$ meson $DIR
$ meson configure $DIR
If you want to disable a component, for example Vulkan support, you can
explicitly set it to false
, i.e.:
$ meson configure $DIR -Dvulkan=disabled -Dshaderc=disabled
$ ninja -C$DIR
To enable building and executing the tests, you need to build with
tests
enabled, i.e.:
$ meson configure $DIR -Dtests=true
$ ninja -C$DIR test
A naive benchmark suite is provided as an extra test case, disabled by default
(due to the high execution time required). To enable it, use the bench
option:
$ meson configure $DIR -Dbench=true
$ meson test -C$DIR benchmark --verbose
For a full documentation of the API, refer to the above API
Overview as well as the public header
files. You can find additional examples of how to use
the various components in the demo programs as well as in the unit
tests.