mirror of
https://github.com/mpv-player/mpv
synced 2025-01-05 22:49:58 +00:00
eab3842d8b
Defining MPV_CPLUGIN_DYNAMIC_SYM during plugin compilation will replace mpv_* functions with function pointers. Those pointer will be initialized when loading the plugin. It is recommended to use this symbol table when targeting Windows. The loader does not have notion of global symbols. Loading cplugin into mpv process will not allow this plugin to call any of the symbols that may be available in other modules. Instead cplugin has to link explicitly to specific PE binary, libmpv-2.dll/mpv.exe or any other binary that may have linked mpv statically. This limits portability of cplugin as it would need to be compiled separately for each of target PE binary that includes mpv's symbols. Which in practice is unrealictis, as we want one cplugin to be loaded without those restrictions. Instead of linking to any PE binary, we create function pointer for all mpv's exported symbols. For convinience names of entrypoints are redefined to those pointer so no changes are required in cplugin source code, except defining MPV_CPLUGIN_DYNAMIC_SYM. Those function pointer are exported to make them available for mpv to init with correct values during runtime, before calling `mpv_open_cplugin`. Note that those pointer are decorated with `selectany` attribute, so no need to worry about multiple definitions, linker will keep only single instance. This fixes cplugin usability on Windows. Without any API changes, only recompilation with -DMPV_CPLUGIN_DYNAMIC_SYM is needed.
80 lines
2.8 KiB
ReStructuredText
80 lines
2.8 KiB
ReStructuredText
EMBEDDING INTO OTHER PROGRAMS (LIBMPV)
|
|
======================================
|
|
|
|
mpv can be embedded into other programs as video/audio playback backend. The
|
|
recommended way to do so is using libmpv. See ``libmpv/client.h`` in the mpv
|
|
source code repository. This provides a C API. Bindings for other languages
|
|
might be available (see wiki).
|
|
|
|
Since libmpv merely allows access to underlying mechanisms that can control
|
|
mpv, further documentation is spread over a few places:
|
|
|
|
- https://github.com/mpv-player/mpv/blob/master/libmpv/client.h
|
|
- https://mpv.io/manual/master/#options
|
|
- https://mpv.io/manual/master/#list-of-input-commands
|
|
- https://mpv.io/manual/master/#properties
|
|
- https://github.com/mpv-player/mpv-examples/tree/master/libmpv
|
|
|
|
C PLUGINS
|
|
=========
|
|
|
|
You can write C plugins for mpv. These use the libmpv API, although they do not
|
|
use the libmpv library itself.
|
|
|
|
They are enabled by default if compiler supports linking with the ``-rdynamic``
|
|
flag on Linux/BSD platforms. On Windows the are always enabled.
|
|
|
|
C plugins location
|
|
------------------
|
|
|
|
C plugins are put into the mpv scripts directory in its config directory
|
|
(see the `FILES`_ section for details). They must have a ``.so`` or ``.dll``
|
|
file extension. They can also be explicitly loaded with the ``--script`` option.
|
|
|
|
API
|
|
---
|
|
|
|
A C plugin must export the following function::
|
|
|
|
int mpv_open_cplugin(mpv_handle *handle)
|
|
|
|
The plugin function will be called on loading time. This function does not
|
|
return as long as your plugin is loaded (it runs in its own thread). The
|
|
``handle`` will be deallocated as soon as the plugin function returns.
|
|
|
|
The return value is interpreted as error status. A value of ``0`` is
|
|
interpreted as success, while ``-1`` signals an error. In the latter case,
|
|
the player prints an uninformative error message that loading failed.
|
|
|
|
Return values other than ``0`` and ``-1`` are reserved, and trigger undefined
|
|
behavior.
|
|
|
|
Within the plugin function, you can call libmpv API functions. The ``handle``
|
|
is created by ``mpv_create_client()`` (or actually an internal equivalent),
|
|
and belongs to you. You can call ``mpv_wait_event()`` to wait for things
|
|
happening, and so on.
|
|
|
|
Note that the player might block until your plugin calls ``mpv_wait_event()``
|
|
for the first time. This gives you a chance to install initial hooks etc.
|
|
before playback begins.
|
|
|
|
The details are quite similar to Lua scripts.
|
|
|
|
Linkage to libmpv
|
|
-----------------
|
|
|
|
The current implementation requires that your plugins are **not** linked against
|
|
libmpv. What your plugins use are not symbols from a libmpv binary, but
|
|
symbols from the mpv host binary.
|
|
|
|
On Windows to make symbols from the host binary available, you have to define
|
|
MPV_CPLUGIN_DYNAMIC_SYM when compiling cplugin. This will load symbols
|
|
dynamically, before calling ``mpv_open_cplugin()``.
|
|
|
|
Examples
|
|
--------
|
|
|
|
See:
|
|
|
|
- https://github.com/mpv-player/mpv-examples/tree/master/cplugins
|