~mcf/oasis

a129a63f93b5f7d756e8a2082dc9db47d07c57cb — Michael Forney 11 months ago 8eba2dc
mpv: Update to 0.35.1
15 files changed, 83 insertions(+), 774 deletions(-)

M pkg/mpv/config.h
M pkg/mpv/gen.lua
M pkg/mpv/gensources.awk
M pkg/mpv/patch/0001-Add-generated-ebml-sources.patch
M pkg/mpv/patch/0002-Use-memset-to-initialize-large-structures.patch
M pkg/mpv/patch/0003-video-out-gpu-Prevent-empty-array-when-no-compilers-.patch
D pkg/mpv/patch/0004-ao_sndio-add-this-audio-output-again.patch
R pkg/mpv/patch/{0006-wayland-include-math.h-for-ceil.patch => 0004-wayland-include-math.h-for-ceil.patch}
D pkg/mpv/patch/0005-ao_sndio-bugfix-and-small-refactoring-for-8314.patch
D pkg/mpv/patch/0007-wayland-actually-handle-0x0-resizes-correctly.patch
D pkg/mpv/patch/0008-audio-replace-deprecated-av_mallocz_array.patch
D pkg/mpv/patch/0009-f_lavfi-replace-deprecated-avfilter_pad_count.patch
M pkg/mpv/sources.txt
M pkg/mpv/src
M pkg/mpv/ver
M pkg/mpv/config.h => pkg/mpv/config.h +12 -2
@@ 28,6 28,7 @@
#define HAVE_MINGW 0
#define HAVE_POSIX 1
#define HAVE_ANDROID 0
#define HAVE_ANDROID_MEDIA_NDK 0
#define HAVE_TVOS 0
#define HAVE_EGL_ANDROID 0
#define HAVE_POSIX_OR_MINGW 1


@@ 69,11 70,14 @@
#define HAVE_DVBIN 0
#define HAVE_SDL2 0
#define HAVE_SDL2_GAMEPAD 0
#define HAVE_JPEGXL 0
#define HAVE_RUBBERBAND_3 0
#define HAVE_FFMPEG 1
#define HAVE_AVCHANNEL_LAYOUT 1
#define HAVE_LIBAVDEVICE 1
#define HAVE_FFMPEG_AVIOCONTEXT_BYTES_READ 1
#define HAVE_SDL2_AUDIO 0
#define HAVE_OSS_AUDIO 0
#define HAVE_PIPEWIRE 0
#define HAVE_SNDIO 0
#define HAVE_PULSE 0
#define HAVE_JACK 0


@@ 89,6 93,7 @@
#define HAVE_GBM 0
#define HAVE_WAYLAND_SCANNER 1
#define HAVE_WAYLAND_PROTOCOLS 1
#define HAVE_WAYLAND_PROTOCOLS_1_24 1
#define HAVE_WAYLAND 1
#define HAVE_MEMFD_CREATE 1
#define HAVE_X11 0


@@ 110,6 115,7 @@
#define HAVE_VAAPI 0
#define HAVE_VAAPI_X11 0
#define HAVE_VAAPI_WAYLAND 0
#define HAVE_DMABUF_WAYLAND 0
#define HAVE_VAAPI_DRM 0
#define HAVE_VAAPI_X_EGL 0
#define HAVE_VAAPI_EGL 0


@@ 127,10 133,14 @@
#define HAVE_PLAIN_GL 0
#define HAVE_GL 0
#define HAVE_LIBPLACEBO 0
#define HAVE_LIBPLACEBO_NEXT 0
#define HAVE_VULKAN 0
#define HAVE_VAAPI_VULKAN 0
#define HAVE_VAAPI_LIBPLACEBO 0
#define HAVE_EGL_HELPERS 0
#define HAVE_SIXEL 0
#define HAVE_DMABUF_INTEROP_GL 0
#define HAVE_DMABUF_INTEROP_PL 0
#define HAVE_DRM_IS_KMS 1
#define HAVE_VIDEOTOOLBOX_HWACCEL 0
#define HAVE_VIDEOTOOLBOX_GL 0
#define HAVE_D3D_HWACCEL 0

M pkg/mpv/gen.lua => pkg/mpv/gen.lua +4 -0
@@ 38,7 38,9 @@ pkg.deps = {
}

build('copy', '$outdir/generated/wayland/idle-inhibit-unstable-v1.h', '$builddir/pkg/wayland-protocols/include/idle-inhibit-unstable-v1-client-protocol.h')
build('copy', '$outdir/generated/wayland/linux-dmabuf-unstable-v1.h', '$builddir/pkg/wayland-protocols/include/linux-dmabuf-unstable-v1-client-protocol.h')
build('copy', '$outdir/generated/wayland/presentation-time.h', '$builddir/pkg/wayland-protocols/include/presentation-time-client-protocol.h')
build('copy', '$outdir/generated/wayland/viewporter.h', '$builddir/pkg/wayland-protocols/include/viewporter-client-protocol.h')
build('copy', '$outdir/generated/wayland/xdg-decoration-unstable-v1.h', '$builddir/pkg/wayland-protocols/include/xdg-decoration-unstable-v1-client-protocol.h')
build('copy', '$outdir/generated/wayland/xdg-shell.h', '$builddir/pkg/wayland-protocols/include/xdg-shell-client-protocol.h')



@@ 167,7 169,9 @@ if options.HAVE_WAYLAND then
	})
	table.insert(pkg.deps, {
		'$outdir/generated/wayland/idle-inhibit-unstable-v1.h',
		'$outdir/generated/wayland/linux-dmabuf-unstable-v1.h',
		'$outdir/generated/wayland/presentation-time.h',
		'$outdir/generated/wayland/viewporter.h',
		'$outdir/generated/wayland/xdg-decoration-unstable-v1.h',
		'$outdir/generated/wayland/xdg-shell.h',
		'pkg/libxkbcommon/headers',

M pkg/mpv/gensources.awk => pkg/mpv/gensources.awk +2 -0
@@ 3,7 3,9 @@
BEGIN {
	FS = "\""
	external["generated/wayland/idle-inhibit-unstable-v1.c"] = "$builddir/pkg/wayland-protocols/idle-inhibit-unstable-v1-protocol.c.o"
	external["generated/wayland/linux-dmabuf-unstable-v1.c"] = "$builddir/pkg/wayland-protocols/linux-dmabuf-unstable-v1-protocol.c.o"
	external["generated/wayland/presentation-time.c"] = "$builddir/pkg/wayland-protocols/presentation-time-protocol.c.o"
	external["generated/wayland/viewporter.c"] = "$builddir/pkg/wayland-protocols/viewporter-protocol.c.o"
	external["generated/wayland/xdg-decoration-unstable-v1.c"] = "$builddir/pkg/wayland-protocols/xdg-decoration-unstable-v1-protocol.c.o"
	external["generated/wayland/xdg-shell.c"] = "$builddir/pkg/wayland-protocols/xdg-shell-protocol.c.o"
}

M pkg/mpv/patch/0001-Add-generated-ebml-sources.patch => pkg/mpv/patch/0001-Add-generated-ebml-sources.patch +12 -12
@@ 1,24 1,24 @@
From d1e11f91a28e4095ae11af36e9ed6d4bdadf6c3f Mon Sep 17 00:00:00 2001
From d17ae31bdd9b5fb7f3a12cca8561e6b6d3947d5d Mon Sep 17 00:00:00 2001
From: Michael Forney <mforney@mforney.org>
Date: Sat, 2 Jul 2016 17:32:27 -0700
Subject: [PATCH] Add generated ebml sources

These require python to generate.

$ python TOOLS/matroska.py --generate-header > demux/generated/ebml_types.h
$ python TOOLS/matroska.py --generate-definitions > demux/generated/ebml_defs.c
$ python TOOLS/matroska.py --generate-header > generated/ebml_types.h
$ python TOOLS/matroska.py --generate-definitions > generated/ebml_defs.inc
---
 demux/generated/ebml_defs.c  | 574 +++++++++++++++++++++++++++++++
 demux/generated/ebml_types.h | 637 +++++++++++++++++++++++++++++++++++
 generated/ebml_defs.inc | 574 ++++++++++++++++++++++++++++++++++++
 generated/ebml_types.h  | 637 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 1211 insertions(+)
 create mode 100644 demux/generated/ebml_defs.c
 create mode 100644 demux/generated/ebml_types.h
 create mode 100644 generated/ebml_defs.inc
 create mode 100644 generated/ebml_types.h

diff --git a/demux/generated/ebml_defs.c b/demux/generated/ebml_defs.c
diff --git a/generated/ebml_defs.inc b/generated/ebml_defs.inc
new file mode 100644
index 0000000000..db4eb9c2a7
--- /dev/null
+++ b/demux/generated/ebml_defs.c
+++ b/generated/ebml_defs.inc
@@ -0,0 +1,574 @@
+// Generated by TOOLS/matroska.py, do not edit manually
+


@@ 594,11 594,11 @@ index 0000000000..db4eb9c2a7
+F(EBML_ID_DOCTYPEREADVERSION, doc_type_read_version, 0)
+}};
+#undef N
diff --git a/demux/generated/ebml_types.h b/demux/generated/ebml_types.h
diff --git a/generated/ebml_types.h b/generated/ebml_types.h
new file mode 100644
index 0000000000..d32af2d6c1
--- /dev/null
+++ b/demux/generated/ebml_types.h
+++ b/generated/ebml_types.h
@@ -0,0 +1,637 @@
+// Generated by TOOLS/matroska.py, do not edit manually
+


@@ 1238,5 1238,5 @@ index 0000000000..d32af2d6c1
+
+#define MAX_EBML_SUBELEMENTS 23
-- 
2.35.1
2.37.3


M pkg/mpv/patch/0002-Use-memset-to-initialize-large-structures.patch => pkg/mpv/patch/0002-Use-memset-to-initialize-large-structures.patch +5 -5
@@ 1,4 1,4 @@
From 5c6190de25762e04b4ee2b265760fd5b8afd115e Mon Sep 17 00:00:00 2001
From 9be8fd92d4deed49d3c90a6d94c67c14980528fc Mon Sep 17 00:00:00 2001
From: Michael Forney <mforney@mforney.org>
Date: Tue, 2 Jul 2019 17:41:43 -0700
Subject: [PATCH] Use memset to initialize large structures


@@ 9,10 9,10 @@ These are over 256 KiB in size.
 1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/video/out/gpu/video.c b/video/out/gpu/video.c
index e4c4ee9290..0e15837d5e 100644
index 3b9e07963e..4ccbae16cb 100644
--- a/video/out/gpu/video.c
+++ b/video/out/gpu/video.c
@@ -3514,7 +3514,7 @@ static void frame_perf_data(struct pass_info pass[], struct mp_frame_perf *out)
@@ -3576,7 +3576,7 @@ static void frame_perf_data(struct pass_info pass[], struct mp_frame_perf *out)
 
 void gl_video_perfdata(struct gl_video *p, struct voctrl_performance_data *out)
 {


@@ 21,7 21,7 @@ index e4c4ee9290..0e15837d5e 100644
     frame_perf_data(p->pass_fresh,  &out->fresh);
     frame_perf_data(p->pass_redraw, &out->redraw);
 }
@@ -3955,14 +3955,13 @@ struct gl_video *gl_video_init(struct ra *ra, struct mp_log *log,
@@ -4011,14 +4011,13 @@ struct gl_video *gl_video_init(struct ra *ra, struct mp_log *log,
                                struct mpv_global *g)
 {
     struct gl_video *p = talloc_ptrtype(NULL, p);


@@ 44,5 44,5 @@ index e4c4ee9290..0e15837d5e 100644
     p->pass = p->pass_fresh;
     struct gl_video_opts *opts = p->opts_cache->opts;
-- 
2.35.1
2.37.3


M pkg/mpv/patch/0003-video-out-gpu-Prevent-empty-array-when-no-compilers-.patch => pkg/mpv/patch/0003-video-out-gpu-Prevent-empty-array-when-no-compilers-.patch +26 -26
@@ 1,4 1,4 @@
From 25a7c939446a456b258e889013a1f3136199f09b Mon Sep 17 00:00:00 2001
From 153cf9738ea8b6e108ead1707a7a9193f57f3685 Mon Sep 17 00:00:00 2001
From: Michael Forney <mforney@mforney.org>
Date: Wed, 3 Jul 2019 02:21:16 -0700
Subject: [PATCH] video/out/gpu: Prevent empty array when no compilers or


@@ 10,62 10,62 @@ Subject: [PATCH] video/out/gpu: Prevent empty array when no compilers or
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/video/out/gpu/context.c b/video/out/gpu/context.c
index 6e58cce485..0e68c45b91 100644
index 2203b5cad9..2836d72513 100644
--- a/video/out/gpu/context.c
+++ b/video/out/gpu/context.c
@@ -110,6 +110,7 @@ static const struct ra_ctx_fns *contexts[] = {
     &ra_ctx_vulkan_display,
 
@@ -117,6 +117,7 @@ static const struct ra_ctx_fns *contexts[] = {
 #if HAVE_DMABUF_WAYLAND
     &ra_ctx_wldmabuf,
 #endif
+    NULL
 };
 
 int ra_ctx_api_help(struct mp_log *log, const struct m_option *opt,
@@ -117,7 +118,7 @@ int ra_ctx_api_help(struct mp_log *log, const struct m_option *opt,
 static int ra_ctx_api_help(struct mp_log *log, const struct m_option *opt,
@@ -124,7 +125,7 @@ static int ra_ctx_api_help(struct mp_log *log, const struct m_option *opt,
 {
     mp_info(log, "GPU APIs (contexts):\n");
     mp_info(log, "    auto (autodetect)\n");
-    for (int n = 0; n < MP_ARRAY_SIZE(contexts); n++)
+    for (int n = 0; n < MP_ARRAY_SIZE(contexts) - 1; n++)
         mp_info(log, "    %s (%s)\n", contexts[n]->type, contexts[n]->name);
     return M_OPT_EXIT;
 }
@@ -128,7 +129,7 @@ int ra_ctx_validate_api(struct mp_log *log, const struct m_option *opt,
-    for (int n = 0; n < MP_ARRAY_SIZE(contexts); n++) {
+    for (int n = 0; n < MP_ARRAY_SIZE(contexts) - 1; n++) {
         if (!contexts[n]->hidden)
             mp_info(log, "    %s (%s)\n", contexts[n]->type, contexts[n]->name);
     }
@@ -137,7 +138,7 @@ static int ra_ctx_validate_api(struct mp_log *log, const struct m_option *opt,
     struct bstr param = bstr0(*value);
     if (bstr_equals0(param, "auto"))
         return 1;
-    for (int i = 0; i < MP_ARRAY_SIZE(contexts); i++) {
+    for (int i = 0; i < MP_ARRAY_SIZE(contexts) - 1; i++) {
         if (bstr_equals0(param, contexts[i]->type))
         if (bstr_equals0(param, contexts[i]->type) && !contexts[i]->hidden)
             return 1;
     }
@@ -140,7 +141,7 @@ int ra_ctx_context_help(struct mp_log *log, const struct m_option *opt,
@@ -149,7 +150,7 @@ static int ra_ctx_context_help(struct mp_log *log, const struct m_option *opt,
 {
     mp_info(log, "GPU contexts (APIs):\n");
     mp_info(log, "    auto (autodetect)\n");
-    for (int n = 0; n < MP_ARRAY_SIZE(contexts); n++)
+    for (int n = 0; n < MP_ARRAY_SIZE(contexts) - 1; n++)
         mp_info(log, "    %s (%s)\n", contexts[n]->name, contexts[n]->type);
     return M_OPT_EXIT;
 }
@@ -151,7 +152,7 @@ int ra_ctx_validate_context(struct mp_log *log, const struct m_option *opt,
-    for (int n = 0; n < MP_ARRAY_SIZE(contexts); n++) {
+    for (int n = 0; n < MP_ARRAY_SIZE(contexts) - 1; n++) {
         if (!contexts[n]->hidden)
             mp_info(log, "    %s (%s)\n", contexts[n]->name, contexts[n]->type);
     }
@@ -162,7 +163,7 @@ static int ra_ctx_validate_context(struct mp_log *log, const struct m_option *op
     struct bstr param = bstr0(*value);
     if (bstr_equals0(param, "auto"))
         return 1;
-    for (int i = 0; i < MP_ARRAY_SIZE(contexts); i++) {
+    for (int i = 0; i < MP_ARRAY_SIZE(contexts) - 1; i++) {
         if (bstr_equals0(param, contexts[i]->name))
         if (bstr_equals0(param, contexts[i]->name) && !contexts[i]->hidden)
             return 1;
     }
@@ -176,7 +177,7 @@ struct ra_ctx *ra_ctx_create(struct vo *vo, const char *context_type,
@@ -186,7 +187,7 @@ struct ra_ctx *ra_ctx_create(struct vo *vo, struct ra_ctx_opts opts)
     bool old_probing = vo->probing;
     vo->probing = opts.probing;
 
-    for (int i = 0; i < MP_ARRAY_SIZE(contexts); i++) {
+    for (int i = 0; i < MP_ARRAY_SIZE(contexts) - 1; i++) {
         if (!opts.probing && strcmp(contexts[i]->name, context_name) != 0)
         if (contexts[i]->hidden)
             continue;
         if (!api_auto && strcmp(contexts[i]->type, context_type) != 0)
         if (!opts.probing && strcmp(contexts[i]->name, opts.context_name) != 0)
diff --git a/video/out/gpu/spirv.c b/video/out/gpu/spirv.c
index 67088bc7df..69100497eb 100644
--- a/video/out/gpu/spirv.c


@@ 79,5 79,5 @@ index 67088bc7df..69100497eb 100644
 
 static const struct m_opt_choice_alternatives compiler_choices[] = {
-- 
2.35.1
2.37.3


D pkg/mpv/patch/0004-ao_sndio-add-this-audio-output-again.patch => pkg/mpv/patch/0004-ao_sndio-add-this-audio-output-again.patch +0 -413
@@ 1,413 0,0 @@
From eb7c5d6fc8de657776c736458f426beb274b5523 Mon Sep 17 00:00:00 2001
From: rim <rozhuk.im@gmail.com>
Date: Wed, 25 Nov 2020 06:10:19 +0300
Subject: [PATCH] ao_sndio: add this audio output again

Changes:
- rewrite to use new internal MPV API;
- code refactoring;
- fix buffers size calculations;
- buffer set to auto;
- reset() - clean/reinit device only after errors;
---
 DOCS/man/ao.rst      |   6 +
 audio/out/ao.c       |   4 +
 audio/out/ao_sndio.c | 317 +++++++++++++++++++++++++++++++++++++++++++
 wscript              |   6 +
 wscript_build.py     |   1 +
 5 files changed, 334 insertions(+)
 create mode 100644 audio/out/ao_sndio.c

diff --git a/DOCS/man/ao.rst b/DOCS/man/ao.rst
index 1c0b9e146b..97c213a5dd 100644
--- a/DOCS/man/ao.rst
+++ b/DOCS/man/ao.rst
@@ -219,5 +219,11 @@ Available audio output drivers are:
         ``no-waveheader`` option - with ``waveheader`` it's broken, because
         it will write a WAVE header every time the file is opened.
 
+``sndio``
+    Audio output to the OpenBSD sndio sound system
+
+    (Note: only supports mono, stereo, 4.0, 5.1 and 7.1 channel
+    layouts.)
+
 ``wasapi``
     Audio output to the Windows Audio Session API.
diff --git a/audio/out/ao.c b/audio/out/ao.c
index 7c347cb138..950f935c81 100644
--- a/audio/out/ao.c
+++ b/audio/out/ao.c
@@ -41,6 +41,7 @@ extern const struct ao_driver audio_out_audiounit;
 extern const struct ao_driver audio_out_coreaudio;
 extern const struct ao_driver audio_out_coreaudio_exclusive;
 extern const struct ao_driver audio_out_rsound;
+extern const struct ao_driver audio_out_sndio;
 extern const struct ao_driver audio_out_pulse;
 extern const struct ao_driver audio_out_jack;
 extern const struct ao_driver audio_out_openal;
@@ -87,6 +88,9 @@ static const struct ao_driver * const audio_out_drivers[] = {
 #endif
 #if HAVE_SDL2_AUDIO
     &audio_out_sdl,
+#endif
+#if HAVE_SNDIO
+    &audio_out_sndio,
 #endif
     &audio_out_null,
 #if HAVE_COREAUDIO
diff --git a/audio/out/ao_sndio.c b/audio/out/ao_sndio.c
new file mode 100644
index 0000000000..4a6f49ee58
--- /dev/null
+++ b/audio/out/ao_sndio.c
@@ -0,0 +1,317 @@
+/*
+ * Copyright (c) 2008 Alexandre Ratchov <alex@caoua.org>
+ * Copyright (c) 2013 Christian Neukirchen <chneukirchen@gmail.com>
+ * Copyright (c) 2020 Rozhuk Ivan <rozhuk.im@gmail.com>
+ * 
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "config.h"
+
+#include <sys/types.h>
+#include <poll.h>
+#include <errno.h>
+#include <sndio.h>
+
+#include "options/m_option.h"
+#include "common/msg.h"
+
+#include "audio/format.h"
+#include "ao.h"
+#include "internal.h"
+
+struct priv {
+    struct sio_hdl *hdl;
+    struct sio_par par;
+    int delay;
+    bool playing;
+    int vol;
+    int havevol;
+    struct pollfd *pfd;
+};
+
+
+static const struct mp_chmap sndio_layouts[MP_NUM_CHANNELS + 1] = {
+    {0},                                        /* empty */
+    {1, {MP_SPEAKER_ID_FL}},                    /* mono */
+    MP_CHMAP2(FL, FR),                          /* stereo */
+    {0},                                        /* 2.1 */
+    MP_CHMAP4(FL, FR, BL, BR),                  /* 4.0 */
+    {0},                                        /* 5.0 */
+    MP_CHMAP6(FL, FR, BL, BR, FC, LFE),         /* 5.1 */
+    {0},                                        /* 6.1 */
+    MP_CHMAP8(FL, FR, BL, BR, FC, LFE, SL, SR), /* 7.1 */
+    /* Above is the fixed channel assignment for sndio, since we need to
+     * fill all channels and cannot insert silence, not all layouts are
+     * supported.
+     * NOTE: MP_SPEAKER_ID_NA could be used to add padding channels. */
+};
+
+static void uninit(struct ao *ao);
+
+
+/* Make libsndio call movecb(). */
+static void process_events(struct ao *ao)
+{
+    struct priv *p = ao->priv;
+    
+    if (!p->playing)
+        return;
+    int n = sio_pollfd(p->hdl, p->pfd, POLLOUT);
+    while (poll(p->pfd, n, 0) < 0 && errno == EINTR) {}
+
+    sio_revents(p->hdl, p->pfd);
+}
+
+/* Call-back invoked to notify of the hardware position. */
+static void movecb(void *addr, int delta)
+{
+    struct ao *ao = addr;
+    struct priv *p = ao->priv;
+
+    p->delay -= delta;
+}
+
+/* Call-back invoked to notify about volume changes. */
+static void volcb(void *addr, unsigned newvol)
+{
+    struct ao *ao = addr;
+    struct priv *p = ao->priv;
+
+    p->vol = newvol;
+}
+
+static int init(struct ao *ao)
+{
+    struct priv *p = ao->priv;
+    struct mp_chmap_sel sel = {0};
+    size_t i;
+    struct af_to_par {
+        int format, bits, sig;
+    };
+    static const struct af_to_par af_to_par[] = {
+        {AF_FORMAT_U8,   8, 0},
+        {AF_FORMAT_S16, 16, 1},
+        {AF_FORMAT_S32, 32, 1},
+    };
+    const struct af_to_par *ap;
+    const char *device = ((ao->device) ? ao->device : SIO_DEVANY);
+
+    /* Opening device. */
+    MP_VERBOSE(ao, "Using '%s' audio device.\n", device);
+    p->hdl = sio_open(device, SIO_PLAY, 0);
+    if (p->hdl == NULL) {
+        MP_ERR(ao, "Can't open audio device %s.\n", device);
+        goto err_out;
+    }
+
+    sio_initpar(&p->par);
+
+    /* Selecting sound format. */
+    ao->format = af_fmt_from_planar(ao->format);
+    for (i = 0, ap = af_to_par;; i++, ap++) {
+        if (i == MP_ARRAY_SIZE(af_to_par)) {
+            MP_VERBOSE(ao, "unsupported format\n");
+            p->par.bits = 16;
+            p->par.sig = 1;
+            p->par.le = SIO_LE_NATIVE;
+            break;
+        }
+        if (ap->format == ao->format) {
+            p->par.bits = ap->bits;
+            p->par.sig = ap->sig;
+            if (ap->bits > 8)
+                p->par.le = SIO_LE_NATIVE;
+            if (ap->bits != SIO_BPS(ap->bits))
+                p->par.bps = ap->bits / 8;
+            break;
+        }
+    }
+
+    p->par.rate = ao->samplerate;
+
+    /* Channels count. */
+    for (i = 0; i < MP_ARRAY_SIZE(sndio_layouts); i++) {
+        mp_chmap_sel_add_map(&sel, &sndio_layouts[i]);
+    }
+    if (!ao_chmap_sel_adjust(ao, &sel, &ao->channels))
+        goto err_out;
+
+    p->par.pchan = ao->channels.num;
+#ifdef __FreeBSD__
+    /* OSS wrapper have bad defaults, overwrite it. */
+    p->par.appbufsz = ((p->par.rate * 25) / 1000); /* 25 ms. */
+#endif
+    if (!sio_setpar(p->hdl, &p->par)) {
+        MP_ERR(ao, "couldn't set params\n");
+        goto err_out;
+    }
+
+    /* Get current sound params. */
+    if (!sio_getpar(p->hdl, &p->par)) {
+        MP_ERR(ao, "couldn't get params\n");
+        goto err_out;
+    }
+    if (p->par.bps > 1 && p->par.le != SIO_LE_NATIVE) {
+        MP_ERR(ao, "swapped endian output not supported\n");
+        goto err_out;
+    }
+
+    /* Update sound params. */
+    if (p->par.bits == 8 && p->par.bps == 1 && !p->par.sig) {
+        ao->format = AF_FORMAT_U8;
+    } else if (p->par.bits == 16 && p->par.bps == 2 && p->par.sig) {
+        ao->format = AF_FORMAT_S16;
+    } else if ((p->par.bits == 32 || p->par.msb) && p->par.bps == 4 && p->par.sig) {
+        ao->format = AF_FORMAT_S32;
+    } else {
+        MP_ERR(ao, "couldn't set format\n");
+        goto err_out;
+    }
+
+    p->havevol = sio_onvol(p->hdl, volcb, ao);
+    sio_onmove(p->hdl, movecb, ao);
+
+    p->pfd = calloc(sio_nfds(p->hdl), sizeof(struct pollfd));
+    if (!p->pfd)
+        goto err_out;
+
+    ao->device_buffer = p->par.bufsz;
+    MP_VERBOSE(ao, "bufsz = %i, appbufsz = %i, round = %i\n",
+        p->par.bufsz, p->par.appbufsz, p->par.round);
+
+    p->delay = 0;
+    p->playing = false;
+    if (!sio_start(p->hdl)) {
+        MP_ERR(ao, "start: sio_start() fail.\n");
+        goto err_out;
+    }
+
+    return 0;
+
+err_out:
+    uninit(ao);
+    return -1;
+}
+
+static void uninit(struct ao *ao)
+{
+    struct priv *p = ao->priv;
+
+    if (p->hdl) {
+        sio_close(p->hdl);
+        p->hdl = NULL;
+    }
+    free(p->pfd);
+    p->pfd = NULL;
+    p->playing = false;
+}
+
+static int control(struct ao *ao, enum aocontrol cmd, void *arg)
+{
+    struct priv *p = ao->priv;
+    ao_control_vol_t *vol = arg;
+
+    switch (cmd) {
+    case AOCONTROL_GET_VOLUME:
+        if (!p->havevol)
+            return CONTROL_FALSE;
+        vol->left = vol->right = p->vol * 100 / SIO_MAXVOL;
+        break;
+    case AOCONTROL_SET_VOLUME:
+        if (!p->havevol)
+            return CONTROL_FALSE;
+        sio_setvol(p->hdl, vol->left * SIO_MAXVOL / 100);
+        break;
+    default:
+        return CONTROL_UNKNOWN;
+    }
+    return CONTROL_OK;
+}
+
+static void reset(struct ao *ao)
+{
+    struct priv *p = ao->priv;
+
+    process_events(ao);
+    p->delay = 0;
+    p->playing = false;
+
+    /* XXX: some times may block here then sndiod used. */
+    if (!sio_stop(p->hdl)) {
+        MP_ERR(ao, "reset: couldn't sio_stop()\n");
+reinit:
+        /* Without this device will never work again. */
+        MP_WARN(ao, "Force reinitialize audio device.\n");
+        uninit(ao);
+        init(ao);
+        return;
+    }
+    if (!sio_start(p->hdl)) {
+        MP_ERR(ao, "reset: sio_start() fail.\n");
+        goto reinit;
+    }
+}
+
+static void start(struct ao *ao)
+{
+    struct priv *p = ao->priv;
+
+    p->playing = true;
+    process_events(ao);
+}
+
+static bool audio_write(struct ao *ao, void **data, int samples)
+{
+    struct priv *p = ao->priv;
+    const size_t size = (samples * ao->sstride);
+    size_t rc;
+
+    rc = sio_write(p->hdl, data[0], size);
+    if (rc != size) {
+        MP_WARN(ao, "audio_write: unexpected partial write: required: %zu, written: %zu.\n",
+            size, rc);
+        reset(ao);
+        p->playing = false;
+        return false;
+    }
+    p->delay += samples;
+    process_events(ao);
+
+    return true;
+}
+
+static void get_state(struct ao *ao, struct mp_pcm_state *state)
+{
+    struct priv *p = ao->priv;
+
+    process_events(ao);
+
+    state->free_samples = (ao->device_buffer - p->delay);
+    state->queued_samples = p->delay;
+    state->delay = (p->delay / (double)p->par.rate);
+    state->playing = p->playing;
+}
+
+const struct ao_driver audio_out_sndio = {
+    .name      = "sndio",
+    .description = "sndio audio output",
+    .init      = init,
+    .uninit    = uninit,
+    .control   = control,
+    .reset     = reset,
+    .start     = start,
+    .write     = audio_write,
+    .get_state = get_state,
+    .priv_size = sizeof(struct priv),
+};
diff --git a/wscript b/wscript
index b44adc2ad4..eeb38f127f 100644
--- a/wscript
+++ b/wscript
@@ -434,6 +434,12 @@ audio_output_features = [
         'desc': 'OSSv4 audio output',
         'func': check_statement(['sys/soundcard.h'], 'int x = SNDCTL_DSP_SETPLAYVOL'),
         'deps': 'posix && gpl',
+    }, {
+        'name': '--sndio',
+        'desc': 'sndio audio input/output',
+        'func': check_statement('sndio.h',
+            'struct sio_par par; sio_initpar(&par); const char *s = SIO_DEVANY', lib='sndio'),
+        'default': 'disable'
     }, {
         'name': '--pulse',
         'desc': 'PulseAudio audio output',
diff --git a/wscript_build.py b/wscript_build.py
index 384bb50d2e..8244dbe3d3 100644
--- a/wscript_build.py
+++ b/wscript_build.py
@@ -248,6 +248,7 @@ def build(ctx):
         ( "audio/out/ao_pcm.c" ),
         ( "audio/out/ao_pulse.c",                "pulse" ),
         ( "audio/out/ao_sdl.c",                  "sdl2-audio" ),
+        ( "audio/out/ao_sndio.c",                "sndio" ),
         ( "audio/out/ao_wasapi.c",               "wasapi" ),
         ( "audio/out/ao_wasapi_changenotify.c",  "wasapi" ),
         ( "audio/out/ao_wasapi_utils.c",         "wasapi" ),
-- 
2.35.1


R pkg/mpv/patch/0006-wayland-include-math.h-for-ceil.patch => pkg/mpv/patch/0004-wayland-include-math.h-for-ceil.patch +0 -0
D pkg/mpv/patch/0005-ao_sndio-bugfix-and-small-refactoring-for-8314.patch => pkg/mpv/patch/0005-ao_sndio-bugfix-and-small-refactoring-for-8314.patch +0 -199
@@ 1,199 0,0 @@
From d3e06b98678b5cde1330476b92def52df31ed344 Mon Sep 17 00:00:00 2001
From: Andrew Krasavin <noiseless-ak@yandex.ru>
Date: Tue, 11 Jan 2022 19:23:52 +0300
Subject: [PATCH] ao_sndio: bugfix and small refactoring for #8314

Changes:
  * fixed hangups in the loop function and in some other cases
  * refactoring according to @michaelforney's recommendations in #8314
  * a few minor and/or cosmetic changes
  * ability to build ao_sndio using meson
---
 audio/out/ao_sndio.c | 87 ++++++++++++++++++++++----------------------
 wscript              |  3 +-
 2 files changed, 45 insertions(+), 45 deletions(-)

diff --git a/audio/out/ao_sndio.c b/audio/out/ao_sndio.c
index 4a6f49ee58..6dc1d5ca9e 100644
--- a/audio/out/ao_sndio.c
+++ b/audio/out/ao_sndio.c
@@ -2,6 +2,7 @@
  * Copyright (c) 2008 Alexandre Ratchov <alex@caoua.org>
  * Copyright (c) 2013 Christian Neukirchen <chneukirchen@gmail.com>
  * Copyright (c) 2020 Rozhuk Ivan <rozhuk.im@gmail.com>
+ * Copyright (c) 2021 Andrew Krasavin <noiseless-ak@yandex.ru>
  * 
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -41,7 +42,7 @@ struct priv {
 };
 
 
-static const struct mp_chmap sndio_layouts[MP_NUM_CHANNELS + 1] = {
+static const struct mp_chmap sndio_layouts[] = {
     {0},                                        /* empty */
     {1, {MP_SPEAKER_ID_FL}},                    /* mono */
     MP_CHMAP2(FL, FR),                          /* stereo */
@@ -64,11 +65,9 @@ static void uninit(struct ao *ao);
 static void process_events(struct ao *ao)
 {
     struct priv *p = ao->priv;
-    
-    if (!p->playing)
-        return;
+
     int n = sio_pollfd(p->hdl, p->pfd, POLLOUT);
-    while (poll(p->pfd, n, 0) < 0 && errno == EINTR) {}
+    while (poll(p->pfd, n, 0) < 0 && errno == EINTR);
 
     sio_revents(p->hdl, p->pfd);
 }
@@ -119,21 +118,15 @@ static int init(struct ao *ao)
 
     /* Selecting sound format. */
     ao->format = af_fmt_from_planar(ao->format);
-    for (i = 0, ap = af_to_par;; i++, ap++) {
-        if (i == MP_ARRAY_SIZE(af_to_par)) {
-            MP_VERBOSE(ao, "unsupported format\n");
-            p->par.bits = 16;
-            p->par.sig = 1;
-            p->par.le = SIO_LE_NATIVE;
-            break;
-        }
+
+    p->par.bits = 16;
+    p->par.sig = 1;
+    p->par.le = SIO_LE_NATIVE;
+    for (i = 0; i < MP_ARRAY_SIZE(af_to_par); i++) {
+        ap = &af_to_par[i];
         if (ap->format == ao->format) {
             p->par.bits = ap->bits;
             p->par.sig = ap->sig;
-            if (ap->bits > 8)
-                p->par.le = SIO_LE_NATIVE;
-            if (ap->bits != SIO_BPS(ap->bits))
-                p->par.bps = ap->bits / 8;
             break;
         }
     }
@@ -148,10 +141,9 @@ static int init(struct ao *ao)
         goto err_out;
 
     p->par.pchan = ao->channels.num;
-#ifdef __FreeBSD__
-    /* OSS wrapper have bad defaults, overwrite it. */
-    p->par.appbufsz = ((p->par.rate * 25) / 1000); /* 25 ms. */
-#endif
+    p->par.appbufsz = p->par.rate * 250 / 1000;    /* 250ms buffer */
+    p->par.round = p->par.rate * 10 / 1000;    /*  10ms block size */
+
     if (!sio_setpar(p->hdl, &p->par)) {
         MP_ERR(ao, "couldn't set params\n");
         goto err_out;
@@ -182,7 +174,7 @@ static int init(struct ao *ao)
     p->havevol = sio_onvol(p->hdl, volcb, ao);
     sio_onmove(p->hdl, movecb, ao);
 
-    p->pfd = calloc(sio_nfds(p->hdl), sizeof(struct pollfd));
+    p->pfd = talloc_array_ptrtype(p, p->pfd, sio_nfds(p->hdl));
     if (!p->pfd)
         goto err_out;
 
@@ -212,7 +204,6 @@ static void uninit(struct ao *ao)
         sio_close(p->hdl);
         p->hdl = NULL;
     }
-    free(p->pfd);
     p->pfd = NULL;
     p->playing = false;
 }
@@ -243,23 +234,16 @@ static void reset(struct ao *ao)
 {
     struct priv *p = ao->priv;
 
-    process_events(ao);
-    p->delay = 0;
-    p->playing = false;
+    if (p->playing) {
+        p->playing = false;
 
-    /* XXX: some times may block here then sndiod used. */
-    if (!sio_stop(p->hdl)) {
-        MP_ERR(ao, "reset: couldn't sio_stop()\n");
-reinit:
-        /* Without this device will never work again. */
-        MP_WARN(ao, "Force reinitialize audio device.\n");
-        uninit(ao);
-        init(ao);
-        return;
-    }
-    if (!sio_start(p->hdl)) {
-        MP_ERR(ao, "reset: sio_start() fail.\n");
-        goto reinit;
+        if (!sio_stop(p->hdl)) {
+            MP_ERR(ao, "reset: couldn't sio_stop()\n");
+        }
+        p->delay = 0;
+        if (!sio_start(p->hdl)) {
+            MP_ERR(ao, "reset: sio_start() fail.\n");
+        }
     }
 }
 
@@ -286,7 +270,6 @@ static bool audio_write(struct ao *ao, void **data, int samples)
         return false;
     }
     p->delay += samples;
-    process_events(ao);
 
     return true;
 }
@@ -297,10 +280,28 @@ static void get_state(struct ao *ao, struct mp_pcm_state *state)
 
     process_events(ao);
 
-    state->free_samples = (ao->device_buffer - p->delay);
+    /* how many samples we can play without blocking */
+    state->free_samples = ao->device_buffer - p->delay;
+    state->free_samples = state->free_samples / p->par.round * p->par.round;
+    /* how many samples are already in the buffer to be played */
     state->queued_samples = p->delay;
-    state->delay = (p->delay / (double)p->par.rate);
-    state->playing = p->playing;
+    /* delay in seconds between first and last sample in buffer */
+    state->delay = p->delay / (double)p->par.rate;
+
+    /* report unexpected EOF / underrun */
+    if (state->queued_samples && state->queued_samples &&
+        state->queued_samples < state->free_samples &&
+        p->playing || sio_eof(p->hdl))
+    {
+        MP_VERBOSE(ao, "get_state: EOF/underrun detected.\n");
+        MP_VERBOSE(ao, "get_state: free: %d, queued: %d, delay: %lf\n", \
+                state->free_samples, state->queued_samples, state->delay);
+        p->playing = false;
+        state->playing = p->playing;
+        ao_wakeup_playthread(ao);
+    } else {
+        state->playing = p->playing;
+    }
 }
 
 const struct ao_driver audio_out_sndio = {
diff --git a/wscript b/wscript
index eeb38f127f..1651187b34 100644
--- a/wscript
+++ b/wscript
@@ -437,8 +437,7 @@ audio_output_features = [
     }, {
         'name': '--sndio',
         'desc': 'sndio audio input/output',
-        'func': check_statement('sndio.h',
-            'struct sio_par par; sio_initpar(&par); const char *s = SIO_DEVANY', lib='sndio'),
+        'func': check_pkg_config('sndio'),
         'default': 'disable'
     }, {
         'name': '--pulse',
-- 
2.35.1


D pkg/mpv/patch/0007-wayland-actually-handle-0x0-resizes-correctly.patch => pkg/mpv/patch/0007-wayland-actually-handle-0x0-resizes-correctly.patch +0 -39
@@ 1,39 0,0 @@
From 386d92e1ac1c22dbed0d2ab0e77ba1038baba966 Mon Sep 17 00:00:00 2001
From: Dudemanguy <random342@airmail.cc>
Date: Tue, 25 Jan 2022 11:56:37 -0600
Subject: [PATCH] wayland: actually handle 0x0 resizes correctly

According to the xdg-shell protocol spec, a 0x0 size from the compositor
means that "the client should decide its own window dimension". We were
not doing this correctly. What should happen is that mpv should simply
reuse the old window size if it is not maximized or fullscreened. This
should work on all (reasonably recent) versions of mutter and an
compositor that follows the spec.

https://gitlab.freedesktop.org/wayland/wayland-protocols/-/blob/main/stable/xdg-shell/xdg-shell.xml#L1050
---
 video/out/wayland_common.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/video/out/wayland_common.c b/video/out/wayland_common.c
index 4ec5c148e7..61964c46e5 100644
--- a/video/out/wayland_common.c
+++ b/video/out/wayland_common.c
@@ -856,6 +856,14 @@ static void handle_toplevel_config(void *data, struct xdg_toplevel *toplevel,
         }
     }
 
+    /* Reuse old size if either of these are 0. */
+    if (width == 0 || height == 0) {
+        if (!is_fullscreen && !is_maximized) {
+            wl->geometry = wl->window_size;
+        }
+        goto resize;
+    }
+
     if (old_toplevel_width == wl->toplevel_width &&
         old_toplevel_height == wl->toplevel_height)
         return;
-- 
2.35.1


D pkg/mpv/patch/0008-audio-replace-deprecated-av_mallocz_array.patch => pkg/mpv/patch/0008-audio-replace-deprecated-av_mallocz_array.patch +0 -25
@@ 1,25 0,0 @@
From 7c2361dbc8ceabc1b3edf9e585ccd4e80dd83ea8 Mon Sep 17 00:00:00 2001
From: sfan5 <sfan5@live.de>
Date: Sat, 30 Oct 2021 17:11:46 +0200
Subject: [PATCH] audio: replace deprecated av_mallocz_array

---
 audio/aframe.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/audio/aframe.c b/audio/aframe.c
index c2c0df7c9b..46264b692e 100644
--- a/audio/aframe.c
+++ b/audio/aframe.c
@@ -637,7 +637,7 @@ int mp_aframe_pool_allocate(struct mp_aframe_pool *pool, struct mp_aframe *frame
         av_freep(&av_frame->extended_data); // sigh
     if (planes > AV_NUM_DATA_POINTERS) {
         av_frame->extended_data =
-            av_mallocz_array(planes, sizeof(av_frame->extended_data[0]));
+            av_calloc(planes, sizeof(av_frame->extended_data[0]));
         if (!av_frame->extended_data)
             abort();
     } else {
-- 
2.37.3


D pkg/mpv/patch/0009-f_lavfi-replace-deprecated-avfilter_pad_count.patch => pkg/mpv/patch/0009-f_lavfi-replace-deprecated-avfilter_pad_count.patch +0 -46
@@ 1,46 0,0 @@
From ea1a98299479f1678d649585723f6a446e9760b1 Mon Sep 17 00:00:00 2001
From: sfan5 <sfan5@live.de>
Date: Sat, 30 Oct 2021 17:12:29 +0200
Subject: [PATCH] f_lavfi: replace deprecated avfilter_pad_count

---
 filters/f_lavfi.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/filters/f_lavfi.c b/filters/f_lavfi.c
index 9e64215f39..f9d581fed8 100644
--- a/filters/f_lavfi.c
+++ b/filters/f_lavfi.c
@@ -944,19 +944,19 @@ static struct mp_filter *lavfi_create(struct mp_filter *parent, void *options)
     return l ? l->f : NULL;
 }
 
-static bool is_single_media_only(const AVFilterPad *pads, int media_type)
-{
-    int count = avfilter_pad_count(pads);
-    if (count != 1)
-        return false;
-    return avfilter_pad_get_type(pads, 0) == media_type;
-}
-
 // Does it have exactly one video input and one video output?
 static bool is_usable(const AVFilter *filter, int media_type)
 {
-    return is_single_media_only(filter->inputs, media_type) &&
-           is_single_media_only(filter->outputs, media_type);
+#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(8, 3, 0)
+    int nb_inputs  = avfilter_filter_pad_count(filter, 0),
+        nb_outputs = avfilter_filter_pad_count(filter, 1);
+#else
+    int nb_inputs  = avfilter_pad_count(filter->inputs),
+        nb_outputs = avfilter_pad_count(filter->outputs);
+#endif
+    return nb_inputs == 1 && nb_outputs == 1 &&
+           avfilter_pad_get_type(filter->inputs, 0) == media_type &&
+           avfilter_pad_get_type(filter->outputs, 0) == media_type;
 }
 
 bool mp_lavfi_is_usable(const char *name, int media_type)
-- 
2.37.3


M pkg/mpv/sources.txt => pkg/mpv/sources.txt +20 -5
@@ 1,5 1,6 @@
audio/aframe.c
audio/chmap.c
audio/chmap_avchannel.c av-channel-layout
audio/chmap_sel.c
audio/decode/ad_lavc.c
audio/decode/ad_spdif.c


@@ 28,6 29,7 @@ audio/out/ao_openal.c openal
audio/out/ao_opensles.c opensles
audio/out/ao_oss.c oss-audio
audio/out/ao_pcm.c
audio/out/ao_pipewire.c pipewire
audio/out/ao_pulse.c pulse
audio/out/ao_sdl.c sdl2-audio
audio/out/ao_sndio.c sndio


@@ 93,6 95,7 @@ misc/json.c
misc/natural_sort.c
misc/node.c
misc/rendezvous.c
misc/random.c
misc/thread_pool.c
misc/thread_tools.c
options/m_config_core.c


@@ 163,6 166,7 @@ test/tests.c tests
video/csputils.c
video/cuda.c cuda-hwaccel
video/d3d.c d3d-hwaccel
video/drmprime.c drm
video/decode/vd_lavc.c
video/filter/refqueue.c
video/filter/vf_d3d11vpp.c d3d-hwaccel


@@ 212,12 216,17 @@ video/out/gpu/user_shaders.c
video/out/gpu/utils.c
video/out/gpu/video.c
video/out/gpu/video_shaders.c
video/out/gpu_next/context.c libplacebo-next
video/out/hwdec/hwdec_aimagereader.c android-media-ndk
video/out/hwdec/hwdec_cuda.c cuda-interop
video/out/hwdec/hwdec_cuda_gl.c cuda-interop && gl
video/out/hwdec/hwdec_cuda_vk.c cuda-interop && vulkan
video/out/hwdec/hwdec_vaapi.c vaapi-egl || vaapi-vulkan
video/out/hwdec/hwdec_vaapi_gl.c vaapi-egl
video/out/hwdec/hwdec_vaapi_vk.c vaapi-vulkan
video/out/hwdec/hwdec_drmprime.c drm
video/out/hwdec/hwdec_drmprime_overlay.c drm
video/out/hwdec/hwdec_vaapi.c vaapi-egl || vaapi-libplacebo
video/out/hwdec/dmabuf_interop_gl.c dmabuf-interop-gl
video/out/hwdec/dmabuf_interop_pl.c dmabuf-interop-pl
video/out/hwdec/dmabuf_interop_wl.c dmabuf-wayland
video/out/libmpv_sw.c
video/out/placebo/ra_pl.c libplacebo
video/out/placebo/utils.c libplacebo


@@ 237,7 246,6 @@ video/out/opengl/context_x11egl.c egl-x11
video/out/opengl/egl_helpers.c egl-helpers
video/out/opengl/formats.c gl
video/out/opengl/hwdec_d3d11egl.c d3d-hwaccel && egl-angle
video/out/opengl/hwdec_drmprime_drm.c drm
video/out/opengl/hwdec_dxva2egl.c d3d9-hwaccel && egl-angle
video/out/opengl/hwdec_dxva2gldx.c gl-dxinterop-d3d9
video/out/opengl/hwdec_ios.m ios-gl


@@ 245,14 253,18 @@ video/out/opengl/hwdec_osx.c videotoolbox-gl
video/out/opengl/hwdec_rpi.c rpi-mmal
video/out/opengl/hwdec_vdpau.c vdpau-gl-x11
video/out/opengl/libmpv_gl.c gl
video/out/opengl/oml_sync.c egl-x11 || gl-x11
video/out/opengl/ra_gl.c gl
video/out/opengl/utils.c gl
video/out/present_sync.c wayland || x11
video/out/wldmabuf/context_wldmabuf.c dmabuf-wayland
video/out/wldmabuf/ra_wldmabuf.c dmabuf-wayland
video/out/wlbuf_pool.c dmabuf-wayland
video/out/vo.c
video/out/vo_caca.c caca
video/out/vo_direct3d.c direct3d
video/out/vo_drm.c drm
video/out/vo_gpu.c
video/out/vo_gpu_next.c libplacebo-next
video/out/vo_image.c
video/out/vo_lavc.c
video/out/vo_libmpv.c


@@ 263,6 275,7 @@ video/out/vo_sdl.c sdl2-video
video/out/vo_sixel.c sixel
video/out/vo_tct.c
video/out/vo_vaapi.c vaapi-x11 && gpl
video/out/vo_dmabuf_wayland.c dmabuf-wayland
video/out/vo_vdpau.c vdpau
video/out/vo_wlshm.c wayland && memfd_create
video/out/vo_x11.c x11


@@ 279,6 292,8 @@ $builddir/pkg/wayland-protocols/idle-inhibit-unstable-v1-protocol.c.o wayland
$builddir/pkg/wayland-protocols/presentation-time-protocol.c.o wayland
$builddir/pkg/wayland-protocols/xdg-decoration-unstable-v1-protocol.c.o wayland
$builddir/pkg/wayland-protocols/xdg-shell-protocol.c.o wayland
$builddir/pkg/wayland-protocols/linux-dmabuf-unstable-v1-protocol.c.o wayland
$builddir/pkg/wayland-protocols/viewporter-protocol.c.o wayland
video/out/wayland_common.c wayland
video/out/win32/displayconfig.c win32-desktop
video/out/win32/droptarget.c win32-desktop

M pkg/mpv/src => pkg/mpv/src +1 -1
@@ 1,1 1,1 @@
Subproject commit 349e437466163cb52f7d0aa227d4606edd9db501
Subproject commit 140ec21c89d671d392877a7f3b91d67e7d7b9239

M pkg/mpv/ver => pkg/mpv/ver +1 -1
@@ 1,1 1,1 @@
0.34.1 r1
0.35.1 r0