From 94fe57856dd8f42b62c5c28715a817196c22926d Mon Sep 17 00:00:00 2001 From: Alexander Preisinger Date: Wed, 10 Sep 2014 18:42:04 +0200 Subject: vo_wayland: pixel perfect buffers 1. Separate buffer and temporary file handling from the vo to make maintenance and reading code easier 2. Skip resizing as much as possible if back buffer is still busy. 3. Detach and mark osd buffers for deletion if we want to redraw them and they are still busy. This could be a possible case for the video buffers as well. Maybe better than double buffering. All the above steps made it possible to have resizing without any artifacts even for subtitles. Also fixes dozen of bugs only I knew, like broken subtitles for rgb565 buffers. I can now sleep at night again. --- video/out/wayland/memfile.c | 105 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 video/out/wayland/memfile.c (limited to 'video/out/wayland/memfile.c') diff --git a/video/out/wayland/memfile.c b/video/out/wayland/memfile.c new file mode 100644 index 0000000000..179abe8755 --- /dev/null +++ b/video/out/wayland/memfile.c @@ -0,0 +1,105 @@ +/* + * This file is part of mpv video player. + * Copyright © 2014 Alexander Preisinger + * + * mpv is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with mpv. If not, see . + */ + +#include +#include +#include +#include +#include + +#include "video/out/wayland/memfile.h" + +/* copied from weston clients */ +static int set_cloexec_or_close(int fd) +{ + long flags; + + if (fd == -1) + return -1; + + if ((flags = fcntl(fd, F_GETFD)) == -1) + goto err; + + if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) + goto err; + + return fd; + +err: + close(fd); + return -1; +} + +static int create_tmpfile_cloexec(char *tmpname) +{ + int fd; + +#ifdef HAVE_MKOSTEMP + fd = mkostemp(tmpname, O_CLOEXEC); + if (fd >= 0) + unlink(tmpname); +#else + fd = mkstemp(tmpname); + if (fd >= 0) { + fd = set_cloexec_or_close(fd); + unlink(tmpname); + } +#endif + + return fd; +} + +static int os_create_anonymous_file(off_t size) +{ + static const char template[] = "/mpv-temp-XXXXXX"; + const char *path; + char *name; + int fd; + + path = getenv("XDG_RUNTIME_DIR"); + if (!path) { + errno = ENOENT; + return -1; + } + + name = malloc(strlen(path) + sizeof(template)); + if (!name) + return -1; + + strcpy(name, path); + strcat(name, template); + + fd = create_tmpfile_cloexec(name); + + free(name); + + if (fd < 0) + return -1; + + if (ftruncate(fd, size) < 0) { + close(fd); + return -1; + } + + return fd; +} + +int memfile_create(off_t size) +{ + return os_create_anonymous_file(size); +} -- cgit v1.2.3