Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package mpv for openSUSE:Factory checked in at 2022-12-24 14:52:11
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/mpv (Old)
and /work/SRC/openSUSE:Factory/.mpv.new.1563 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "mpv"
Sat Dec 24 14:52:11 2022 rev:114 rq:1045065 version:0.35+git.20221222.657fd280
Changes:
--------
--- /work/SRC/openSUSE:Factory/mpv/mpv.changes 2022-12-20 20:21:45.090294012 +0100
+++ /work/SRC/openSUSE:Factory/.mpv.new.1563/mpv.changes 2022-12-24 14:53:09.115932807 +0100
@@ -1,0 +2,10 @@
+Fri Dec 23 18:17:30 UTC 2022 - mia@0x0.st
+
+- Update to version 0.35+git.20221222.657fd280:
+ * audio: reset pull AO at end of file
+ * vo_kitty: Introduce modern sixel alternative
+ * external_files: set log level for potential files to trace
+ * hwdec/d3d11va: fix a possible memory leak
+ * filter_kernels: fix kaiser
+
+-------------------------------------------------------------------
Old:
----
mpv-0.35+git.20221220.d5c3b9d9.tar.xz
New:
----
mpv-0.35+git.20221222.657fd280.tar.xz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ mpv.spec ++++++
--- /var/tmp/diff_new_pack.C4pSqb/_old 2022-12-24 14:53:09.691936167 +0100
+++ /var/tmp/diff_new_pack.C4pSqb/_new 2022-12-24 14:53:09.695936191 +0100
@@ -22,7 +22,7 @@
%define _waf_ver 2.0.24
%define lname libmpv2
Name: mpv
-Version: 0.35+git.20221220.d5c3b9d9
+Version: 0.35+git.20221222.657fd280
Release: 0
Summary: Advanced general-purpose multimedia player
License: GPL-2.0-or-later
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.C4pSqb/_old 2022-12-24 14:53:09.743936471 +0100
+++ /var/tmp/diff_new_pack.C4pSqb/_new 2022-12-24 14:53:09.747936494 +0100
@@ -1,6 +1,6 @@
<servicedata>
<service name="tar_scm">
<param name="url">https://github.com/mpv-player/mpv.git</param>
- <param name="changesrevision">d5c3b9d9891c4907982c96913e495620237628e4</param></service></servicedata>
+ <param name="changesrevision">657fd2804c75fd4c838012ecbf5ce4536e4d487b</param></service></servicedata>
(No newline at EOF)
++++++ mpv-0.35+git.20221220.d5c3b9d9.tar.xz -> mpv-0.35+git.20221222.657fd280.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpv-0.35+git.20221220.d5c3b9d9/DOCS/interface-changes.rst new/mpv-0.35+git.20221222.657fd280/DOCS/interface-changes.rst
--- old/mpv-0.35+git.20221220.d5c3b9d9/DOCS/interface-changes.rst 2022-12-20 11:12:23.000000000 +0100
+++ new/mpv-0.35+git.20221222.657fd280/DOCS/interface-changes.rst 2022-12-23 00:14:08.000000000 +0100
@@ -27,6 +27,11 @@
::
--- mpv 0.36.0 ---
+ - add the `--vo=kitty` video output driver, as well as the options
+ `--vo-kitty-cols`, `--vo-kitty-rows`, `--vo-kitty-width`,
+ `--vo-kitty-height`, `--vo-kitty-left`, `--vo-kitty-top`,
+ `--vo-kitty-config-clear`, `--vo-kitty-alt-screen` and
+ `--vo-kitty-use-shm`
- add `--force-render`
- add `--vo-sixel-config-clear`, `--vo-sixel-alt-screen` and
`--vo-sixel-buffered`
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpv-0.35+git.20221220.d5c3b9d9/DOCS/man/vo.rst new/mpv-0.35+git.20221222.657fd280/DOCS/man/vo.rst
--- old/mpv-0.35+git.20221220.d5c3b9d9/DOCS/man/vo.rst 2022-12-20 11:12:23.000000000 +0100
+++ new/mpv-0.35+git.20221222.657fd280/DOCS/man/vo.rst 2022-12-23 00:14:08.000000000 +0100
@@ -383,6 +383,45 @@
``--vo-tct-256=`` (default: no)
Use 256 colors - for terminals which don't support true color.
+``kitty``
+ Graphical output for the terminal, using the kitty graphics protocol.
+ Tested with kitty and Konsole.
+
+ You may need to use ``--profile=sw-fast`` to get decent performance.
+
+ Kitty size and alignment options:
+
+ ``--vo-kitty-cols=<columns>``, ``--vo-kitty-rows=<rows>`` (default: 0)
+ Specify the terminal size in character cells, otherwise (0) read it
+ from the terminal, or fall back to 80x25.
+
+ ``--vo-kitty-width=<width>``, ``--vo-kitty-height=<height>`` (default: 0)
+ Specify the available size in pixels, otherwise (0) read it from the
+ terminal, or fall back to 320x240.
+
+ ``--vo-kitty-left=<col>``, ``--vo-kitty-top=<row>`` (default: 0)
+ Specify the position in character cells where the image starts (1 is
+ the first column or row). If 0 (default) then try to automatically
+ determine it according to the other values and the image aspect ratio
+ and zoom.
+
+ ``--vo-kitty-config-clear=`` (default: yes)
+ Whether or not to clear the terminal whenever the output is
+ reconfigured (e.g. when video size changes).
+
+ ``--vo-kitty-alt-screen=`` (default: yes)
+ Whether or not to use the alternate screen buffer and return the
+ terminal to its previous state on exit. When set to no, the last
+ kitty image stays on screen after quit, with the cursor following it.
+
+ ``--vo-kitty-use-shm=`` (default: no)
+ Use shared memory objects to transfer image data to the terminal.
+ This is much faster than sending the data as escape codes, but is not
+ supported by as many terminals. It also only works on the local machine
+ and not via e.g. SSH connections.
+
+ This option is not implemented on Windows.
+
``sixel``
Graphical output for the terminal, using sixels. Tested with ``mlterm`` and
``xterm``.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpv-0.35+git.20221220.d5c3b9d9/audio/out/buffer.c new/mpv-0.35+git.20221222.657fd280/audio/out/buffer.c
--- old/mpv-0.35+git.20221220.d5c3b9d9/audio/out/buffer.c 2022-12-20 11:12:23.000000000 +0100
+++ new/mpv-0.35+git.20221222.657fd280/audio/out/buffer.c 2022-12-23 00:14:08.000000000 +0100
@@ -357,7 +357,7 @@
pthread_mutex_lock(&p->lock);
- if (p->playing && !p->paused && paused) {
+ if ((p->playing || !ao->driver->write) && !p->paused && paused) {
if (p->streaming && !ao->stream_silence) {
if (ao->driver->write) {
if (!p->recover_pause)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpv-0.35+git.20221220.d5c3b9d9/meson.build new/mpv-0.35+git.20221222.657fd280/meson.build
--- old/mpv-0.35+git.20221220.d5c3b9d9/meson.build 2022-12-20 11:12:23.000000000 +0100
+++ new/mpv-0.35+git.20221222.657fd280/meson.build 2022-12-23 00:14:08.000000000 +0100
@@ -229,6 +229,7 @@
'video/out/vo_libmpv.c',
'video/out/vo_null.c',
'video/out/vo_tct.c',
+ 'video/out/vo_kitty.c',
'video/out/win_state.c',
'video/repack.c',
'video/sws_utils.c',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpv-0.35+git.20221220.d5c3b9d9/player/external_files.c new/mpv-0.35+git.20221222.657fd280/player/external_files.c
--- old/mpv-0.35+git.20221220.d5c3b9d9/player/external_files.c 2022-12-20 11:12:23.000000000 +0100
+++ new/mpv-0.35+git.20221222.657fd280/player/external_files.c 2022-12-23 00:14:08.000000000 +0100
@@ -254,7 +254,7 @@
if (!limit_fuzziness && fuzz >= 2)
prio |= 1;
- mp_dbg(log, "Potential external file: \"%s\" Priority: %d\n",
+ mp_trace(log, "Potential external file: \"%s\" Priority: %d\n",
de->d_name, prio);
if (prio) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpv-0.35+git.20221220.d5c3b9d9/video/out/d3d11/hwdec_d3d11va.c new/mpv-0.35+git.20221222.657fd280/video/out/d3d11/hwdec_d3d11va.c
--- old/mpv-0.35+git.20221220.d5c3b9d9/video/out/d3d11/hwdec_d3d11va.c 2022-12-20 11:12:23.000000000 +0100
+++ new/mpv-0.35+git.20221222.657fd280/video/out/d3d11/hwdec_d3d11va.c 2022-12-23 00:14:08.000000000 +0100
@@ -67,6 +67,7 @@
{
struct priv_owner *p = hw->priv;
hwdec_devices_remove(hw->devs, &p->hwctx);
+ av_buffer_unref(&p->hwctx.av_device_ref);
SAFE_RELEASE(p->device);
SAFE_RELEASE(p->device1);
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpv-0.35+git.20221220.d5c3b9d9/video/out/filter_kernels.c new/mpv-0.35+git.20221222.657fd280/video/out/filter_kernels.c
--- old/mpv-0.35+git.20221220.d5c3b9d9/video/out/filter_kernels.c 2022-12-20 11:12:23.000000000 +0100
+++ new/mpv-0.35+git.20221222.657fd280/video/out/filter_kernels.c 2022-12-23 00:14:08.000000000 +0100
@@ -240,7 +240,7 @@
{
if (x > 1)
return 0;
- double i0a = 1.0 / bessel_i0(p->params[1]);
+ double i0a = 1.0 / bessel_i0(p->params[0]);
return bessel_i0(p->params[0] * sqrt(1.0 - x * x)) * i0a;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpv-0.35+git.20221220.d5c3b9d9/video/out/vo.c new/mpv-0.35+git.20221222.657fd280/video/out/vo.c
--- old/mpv-0.35+git.20221220.d5c3b9d9/video/out/vo.c 2022-12-20 11:12:23.000000000 +0100
+++ new/mpv-0.35+git.20221222.657fd280/video/out/vo.c 2022-12-23 00:14:08.000000000 +0100
@@ -67,6 +67,7 @@
extern const struct vo_driver video_out_rpi;
extern const struct vo_driver video_out_tct;
extern const struct vo_driver video_out_sixel;
+extern const struct vo_driver video_out_kitty;
const struct vo_driver *const video_out_drivers[] =
{
@@ -118,6 +119,7 @@
#if HAVE_SIXEL
&video_out_sixel,
#endif
+ &video_out_kitty,
&video_out_lavc,
NULL
};
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpv-0.35+git.20221220.d5c3b9d9/video/out/vo_kitty.c new/mpv-0.35+git.20221222.657fd280/video/out/vo_kitty.c
--- old/mpv-0.35+git.20221220.d5c3b9d9/video/out/vo_kitty.c 1970-01-01 01:00:00.000000000 +0100
+++ new/mpv-0.35+git.20221222.657fd280/video/out/vo_kitty.c 2022-12-23 00:14:08.000000000 +0100
@@ -0,0 +1,432 @@
+/*
+ * Video output device using the kitty terminal graphics protocol
+ * See https://sw.kovidgoyal.net/kitty/graphics-protocol/
+ *
+ * This file is part of mpv.
+ *
+ * mpv is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * mpv is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with mpv. If not, see http://www.gnu.org/licenses/.
+ */
+
+#include
+#include
+#include
+
+#include
+
+#if HAVE_POSIX
+#include
+#include
+#include
+#include
+#endif
+
+#include
+#include
+
+#include "config.h"
+#include "options/m_config.h"
+#include "osdep/terminal.h"
+#include "sub/osd.h"
+#include "vo.h"
+#include "video/sws_utils.h"
+#include "video/mp_image.h"
+
+#define IMGFMT IMGFMT_RGB24
+#define BYTES_PER_PX 3
+#define DEFAULT_WIDTH_PX 320
+#define DEFAULT_HEIGHT_PX 240
+#define DEFAULT_WIDTH 80
+#define DEFAULT_HEIGHT 25
+
+static inline void write_str(const char *s)
+{
+ // On POSIX platforms, write() is the fastest method. It also is the only
+ // one that allows atomic writes so mpv���s output will not be interrupted
+ // by other processes or threads that write to stdout, which would cause
+ // screen corruption. POSIX does not guarantee atomicity for writes
+ // exceeding PIPE_BUF, but at least Linux does seem to implement it that
+ // way.
+#if HAVE_POSIX
+ int remain = strlen(s);
+ while (remain > 0) {
+ ssize_t written = write(STDOUT_FILENO, s, remain);
+ if (written < 0)
+ return;
+ remain -= written;
+ s += written;
+ }
+#else
+ printf("%s", s);
+ fflush(stdout);
+#endif
+}
+
+#define KITTY_ESC_IMG "\033_Ga=T,f=24,s=%d,v=%d,C=1,q=2,m=1;"
+#define KITTY_ESC_IMG_SHM "\033_Ga=T,t=s,f=24,s=%d,v=%d,C=1,q=2,m=1;%s\033\\"
+#define KITTY_ESC_CONTINUE "\033_Gm=%d;"
+#define KITTY_ESC_END "\033\\"
+#define KITTY_ESC_DELETE_ALL "\033_Ga=d;\033\\"
+
+struct vo_kitty_opts {
+ int width, height, top, left, rows, cols;
+ int config_clear, alt_screen;
+ int use_shm;
+};
+
+struct priv {
+ struct vo_kitty_opts opts;
+
+ uint8_t *buffer;
+ char *output;
+ char *shm_path, *shm_path_b64;
+ int buffer_size, output_size;
+ int shm_fd;
+
+ int left, top, width, height, cols, rows;
+
+ struct mp_rect src;
+ struct mp_rect dst;
+ struct mp_osd_res osd;
+ struct mp_image *frame;
+ struct mp_sws_context *sws;
+};
+
+#if HAVE_POSIX
+static struct sigaction saved_sigaction = {0};
+static bool resized;
+#endif
+
+static void close_shm(struct priv *p)
+{
+#if HAVE_POSIX
+ if (p->buffer != NULL) {
+ munmap(p->buffer, p->buffer_size);
+ p->buffer = NULL;
+ }
+ if (p->shm_fd != -1) {
+ close(p->shm_fd);
+ p->shm_fd = -1;
+ }
+#endif
+}
+
+static void free_bufs(struct vo* vo)
+{
+ struct priv* p = vo->priv;
+
+ talloc_free(p->frame);
+ talloc_free(p->output);
+
+ if (p->opts.use_shm) {
+ close_shm(p);
+ } else {
+ talloc_free(p->buffer);
+ }
+}
+
+static void get_win_size(struct vo *vo, int *out_rows, int *out_cols,
+ int *out_width, int *out_height)
+{
+ struct priv *p = vo->priv;
+ *out_rows = DEFAULT_HEIGHT;
+ *out_cols = DEFAULT_WIDTH;
+ *out_width = DEFAULT_WIDTH_PX;
+ *out_height = DEFAULT_HEIGHT_PX;
+
+ terminal_get_size2(out_rows, out_cols, out_width, out_height);
+
+ *out_rows = p->opts.rows > 0 ? p->opts.rows : *out_rows;
+ *out_cols = p->opts.cols > 0 ? p->opts.cols : *out_cols;
+ *out_width = p->opts.width > 0 ? p->opts.width : *out_width;
+ *out_height = p->opts.height > 0 ? p->opts.height : *out_height;
+}
+
+static void set_out_params(struct vo *vo)
+{
+ struct priv *p = vo->priv;
+
+ vo_get_src_dst_rects(vo, &p->src, &p->dst, &p->osd);
+
+ p->width = p->dst.x1 - p->dst.x0;
+ p->height = p->dst.y1 - p->dst.y0;
+ p->top = p->opts.top > 0 ?
+ p->opts.top : p->rows * p->dst.y0 / vo->dheight;
+ p->left = p->opts.left > 0 ?
+ p->opts.left : p->cols * p->dst.x0 / vo->dwidth;
+
+ p->buffer_size = 3 * p->width * p->height;
+ p->output_size = AV_BASE64_SIZE(p->buffer_size);
+}
+
+static int reconfig(struct vo *vo, struct mp_image_params *params)
+{
+ struct priv *p = vo->priv;
+
+ vo->want_redraw = true;
+ write_str(KITTY_ESC_DELETE_ALL);
+ if (p->opts.config_clear)
+ write_str(TERM_ESC_CLEAR_SCREEN);
+
+ get_win_size(vo, &p->rows, &p->cols, &vo->dwidth, &vo->dheight);
+ set_out_params(vo);
+ free_bufs(vo);
+
+ p->sws->src = *params;
+ p->sws->src.w = mp_rect_w(p->src);
+ p->sws->src.h = mp_rect_h(p->src);
+ p->sws->dst = (struct mp_image_params) {
+ .imgfmt = IMGFMT,
+ .w = p->width,
+ .h = p->height,
+ .p_w = 1,
+ .p_h = 1,
+ };
+
+ p->frame = mp_image_alloc(IMGFMT, p->width, p->height);
+ if (!p->frame)
+ return -1;
+
+ if (mp_sws_reinit(p->sws) < 0)
+ return -1;
+
+ if (!p->opts.use_shm) {
+ p->buffer = talloc_array(NULL, uint8_t, p->buffer_size);
+ p->output = talloc_array(NULL, char, p->output_size);
+ }
+
+ return 0;
+}
+
+static int create_shm(struct vo *vo)
+{
+#if HAVE_POSIX
+ struct priv *p = vo->priv;
+ p->shm_fd = shm_open(p->shm_path, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
+ if (p->shm_fd == -1) {
+ MP_ERR(vo, "Failed to create shared memory object");
+ return 0;
+ }
+
+ if (ftruncate(p->shm_fd, p->buffer_size) == -1) {
+ MP_ERR(vo, "Failed to truncate shared memory object");
+ shm_unlink(p->shm_path);
+ close(p->shm_fd);
+ return 0;
+ }
+
+ p->buffer = mmap(NULL, p->buffer_size,
+ PROT_READ | PROT_WRITE, MAP_SHARED, p->shm_fd, 0);
+
+ if (p->buffer == MAP_FAILED) {
+ MP_ERR(vo, "Failed to mmap shared memory object");
+ shm_unlink(p->shm_path);
+ close(p->shm_fd);
+ return 0;
+ }
+ return 1;
+#else
+ return 0;
+#endif
+}
+
+static void draw_frame(struct vo *vo, struct vo_frame *frame)
+{
+ struct priv *p = vo->priv;
+ mp_image_t *mpi = NULL;
+
+#if !HAVE_POSIX
+ int prev_height = vo->dheight;
+ int prev_width = vo->dwidth;
+ get_win_size(vo, &p->rows, &p->cols, &vo->dwidth, &vo->dheight);
+ bool resized = (prev_width != vo->dwidth || prev_height != vo->dheight);
+#endif
+
+ if (resized)
+ reconfig(vo, vo->params);
+
+ resized = false;
+
+ if (frame->current) {
+ mpi = mp_image_new_ref(frame->current);
+ struct mp_rect src_rc = p->src;
+ src_rc.x0 = MP_ALIGN_DOWN(src_rc.x0, mpi->fmt.align_x);
+ src_rc.y0 = MP_ALIGN_DOWN(src_rc.y0, mpi->fmt.align_y);
+ mp_image_crop_rc(mpi, src_rc);
+
+ mp_sws_scale(p->sws, p->frame, mpi);
+ } else {
+ mp_image_clear(p->frame, 0, 0, p->width, p->height);
+ }
+
+ struct mp_osd_res res = { .w = p->width, .h = p->height };
+ osd_draw_on_image(vo->osd, res, mpi ? mpi->pts : 0, 0, p->frame);
+
+
+ if (p->opts.use_shm && !create_shm(vo))
+ return;
+
+ memcpy_pic(p->buffer, p->frame->planes[0], p->width * BYTES_PER_PX,
+ p->height, p->width * BYTES_PER_PX, p->frame->stride[0]);
+
+ if (!p->opts.use_shm)
+ av_base64_encode(p->output, p->output_size, p->buffer, p->buffer_size);
+
+ talloc_free(mpi);
+}
+
+static void flip_page(struct vo *vo)
+{
+ struct priv* p = vo->priv;
+
+ if (p->buffer == NULL)
+ return;
+
+ char *cmd = talloc_asprintf(NULL, TERM_ESC_GOTO_YX, p->top, p->left);
+
+ if (p->opts.use_shm) {
+ cmd = talloc_asprintf_append(cmd, KITTY_ESC_IMG_SHM, p->width, p->height, p->shm_path_b64);
+ } else {
+ if (p->output == NULL) {
+ talloc_free(cmd);
+ return;
+ }
+
+ cmd = talloc_asprintf_append(cmd, KITTY_ESC_IMG, p->width, p->height);
+ for (int offset = 0, noffset;; offset += noffset) {
+ if (offset)
+ cmd = talloc_asprintf_append(cmd, KITTY_ESC_CONTINUE, offset < p->output_size);
+ noffset = MPMIN(4096, p->output_size - offset);
+ cmd = talloc_strndup_append(cmd, p->output + offset, noffset);
+ cmd = talloc_strdup_append(cmd, KITTY_ESC_END);
+
+ if (offset >= p->output_size)
+ break;
+ }
+ }
+
+ write_str(cmd);
+ talloc_free(cmd);
+
+#if HAVE_POSIX
+ if (p->opts.use_shm)
+ close_shm(p);
+#endif
+}
+
+#if HAVE_POSIX
+static void handle_winch(int sig) {
+ resized = true;
+ if (saved_sigaction.sa_handler)
+ saved_sigaction.sa_handler(sig);
+}
+#endif
+
+static int preinit(struct vo *vo)
+{
+ struct priv *p = vo->priv;
+
+ p->sws = mp_sws_alloc(vo);
+ p->sws->log = vo->log;
+ mp_sws_enable_cmdline_opts(p->sws, vo->global);
+
+#if HAVE_POSIX
+ struct sigaction sa;
+ sa.sa_handler = handle_winch;
+ sigaction(SIGWINCH, &sa, &saved_sigaction);
+
+ if (p->opts.use_shm) {
+ p->shm_path = talloc_asprintf(vo, "/mpv-kitty-%p", vo);
+ int p_size = strlen(p->shm_path) - 1;
+ int b64_size = AV_BASE64_SIZE(p_size);
+ p->shm_path_b64 = talloc_array(vo, char, b64_size);
+ av_base64_encode(p->shm_path_b64, b64_size, p->shm_path + 1, p_size);
+ }
+#else
+ if (p->opts.use_shm) {
+ MP_ERR(vo, "Shared memory support is not available on this platform.");
+ return -1;
+ }
+#endif
+
+ write_str(TERM_ESC_HIDE_CURSOR);
+ if (p->opts.alt_screen)
+ write_str(TERM_ESC_ALT_SCREEN);
+
+ return 0;
+}
+
+static int query_format(struct vo *vo, int format)
+{
+ return format == IMGFMT;
+}
+
+static int control(struct vo *vo, uint32_t request, void *data)
+{
+ if (request == VOCTRL_SET_PANSCAN)
+ return (vo->config_ok && !reconfig(vo, vo->params)) ? VO_TRUE : VO_FALSE;
+ return VO_NOTIMPL;
+}
+
+static void uninit(struct vo *vo)
+{
+ struct priv *p = vo->priv;
+
+#if HAVE_POSIX
+ sigaction(SIGWINCH, &saved_sigaction, NULL);
+#endif
+
+ write_str(TERM_ESC_RESTORE_CURSOR);
+
+ if (p->opts.alt_screen) {
+ write_str(TERM_ESC_NORMAL_SCREEN);
+ } else {
+ char *cmd = talloc_asprintf(vo, TERM_ESC_GOTO_YX, p->cols, 0);
+ write_str(cmd);
+ }
+
+ free_bufs(vo);
+}
+
+#define OPT_BASE_STRUCT struct priv
+
+const struct vo_driver video_out_kitty = {
+ .name = "kitty",
+ .description = "Kitty terminal graphics protocol",
+ .preinit = preinit,
+ .query_format = query_format,
+ .reconfig = reconfig,
+ .control = control,
+ .draw_frame = draw_frame,
+ .flip_page = flip_page,
+ .uninit = uninit,
+ .priv_size = sizeof(struct priv),
+ .priv_defaults = &(const struct priv) {
+ .shm_fd = -1,
+ .opts.config_clear = 1,
+ .opts.alt_screen = 1,
+ },
+ .options = (const m_option_t[]) {
+ {"width", OPT_INT(opts.width)},
+ {"height", OPT_INT(opts.height)},
+ {"top", OPT_INT(opts.top)},
+ {"left", OPT_INT(opts.left)},
+ {"rows", OPT_INT(opts.rows)},
+ {"cols", OPT_INT(opts.cols)},
+ {"config-clear", OPT_FLAG(opts.config_clear), },
+ {"alt-screen", OPT_FLAG(opts.alt_screen), },
+ {"use-shm", OPT_FLAG(opts.use_shm), },
+ {0}
+ },
+ .options_prefix = "vo-kitty",
+};
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mpv-0.35+git.20221220.d5c3b9d9/wscript_build.py new/mpv-0.35+git.20221222.657fd280/wscript_build.py
--- old/mpv-0.35+git.20221220.d5c3b9d9/wscript_build.py 2022-12-20 11:12:23.000000000 +0100
+++ new/mpv-0.35+git.20221222.657fd280/wscript_build.py 2022-12-23 00:14:08.000000000 +0100
@@ -539,6 +539,7 @@
( "video/out/vo_rpi.c", "rpi-mmal" ),
( "video/out/vo_sdl.c", "sdl2-video" ),
( "video/out/vo_sixel.c", "sixel" ),
+ ( "video/out/vo_kitty.c" ),
( "video/out/vo_tct.c" ),
( "video/out/vo_vaapi.c", "vaapi-x11 && gpl" ),
( "video/out/vo_dmabuf_wayland.c", "dmabuf-wayland" ),